Install the Up2Data skill

Teach Claude Code to integrate the Up2Data API. Installs once, then loads automatically whenever you ask it about Up2Data.

  1. Run this in your terminal
    bash
    mkdir -p ~/.claude/skills/up2data-api && curl -fsSL https://up2data.ai/docs/legacy/skill.md -o ~/.claude/skills/up2data-api/SKILL.md
  2. Restart Claude CodeSo it picks up the new skill.
  3. Try it"Enrich these LinkedIn profiles with Up2Data and send results to my webhook"

Requires Claude Code. macOS, Linux, or WSL.

Prefer to read it first? View the skill file

Activity

One document per profile from profiles-activity, holding the posts it published, the comments it left and the posts it reacted to. A repost is not a separate list - it is a post with isRepost set and the original in repostedPost.

#Fields

FieldTypeNotes
_idstring
profileProfileThe full enriched profile object in queues-list responses; carried under result with type "Activity" in a webhook callback.
linkedinObjectIdnumber
profileUrnstring
slugstringLinkedIn slug.
profileUrlstring
scrapedAtstringISO 8601.
partial{ posts: boolean, comments: boolean, reactions: boolean }A list flagged true was not refreshed on the most recent scrape.
postsobject[]Posts the profile published.
posts[].urlstring
posts[].urnstring
posts[].shareUrnstringNullable.
posts[].author{ name: string, url: string, headline: string, avatarUrl: string }headline and avatarUrl are nullable.
posts[].textstring
posts[].postedAtstringAs LinkedIn reports it - do not parse as ISO or match against a fixed set of values.
posts[].reactionsCountnumber
posts[].commentsCountnumber
posts[].repostsCountnumber
posts[].reactionsByType{ type: string, count: number }[]
posts[].contentTypestring"unknown" when it could not be determined.
posts[].mediaobject[]
posts[].media[].typestring"image" | "video" | "document".
posts[].media[].urlstring
posts[].media[].thumbnailUrlstringNullable.
posts[].media[].titlestringNullable.
posts[].media[].durationMsnumberNullable.
posts[].article{ title: string, subtitle: string, url: string, thumbnailUrl: string }null when the post links to no article; subtitle and thumbnailUrl are nullable.
posts[].isRepostboolean
posts[].repostedPostTargetPostNullable. { url, urn, textSnippet, author: { name, url, headline }, reactionsCount, commentsCount, repostsCount } - the post a repost, comment or reaction points at.
posts[].isEditedboolean
posts[].mentionsobject[]
posts[].mentions[].namestring
posts[].mentions[].publicIdentifierstringNullable.
posts[].mentions[].urlstringNullable.
posts[].mentions[].urnstringNullable.
posts[].companyMentionsMention[]Same shape as mentions.
posts[].hashtagsstring[]
commentsobject[]Comments the profile left.
comments[].urnstring
comments[].urlstring
comments[].textstring
comments[].postedAtstringAs LinkedIn reports it.
comments[].repliesCountnumber
comments[].targetPostTargetPostThe post the comment is on.
reactionsobject[]Posts the profile reacted to.
reactions[].reactionTypestring
reactions[].reactedAtstringAs LinkedIn reports it.
reactions[].targetPostTargetPostThe post the reaction is on.
createdAtstringISO 8601.
updatedAtstringISO 8601.

#Sample

json
{
  "_id": "string",
  "profile": "Profile (the full enriched profile object)",
  "linkedinObjectId": "number",
  "profileUrn": "string",
  "slug": "string (LinkedIn slug)",
  "profileUrl": "string",
  "scrapedAt": "string (ISO 8601)",
  "partial": {
    "posts": "boolean",
    "comments": "boolean",
    "reactions": "boolean"
  },
  "posts": [
    {
      "url": "string",
      "urn": "string",
      "shareUrn": "string (nullable)",
      "author": {
        "name": "string",
        "url": "string",
        "headline": "string (nullable)",
        "avatarUrl": "string (nullable)"
      },
      "text": "string",
      "postedAt": "string (as LinkedIn reports it)",
      "reactionsCount": "number",
      "commentsCount": "number",
      "repostsCount": "number",
      "reactionsByType": [{ "type": "string", "count": "number" }],
      "contentType": "string (\"unknown\" when it could not be determined)",
      "media": [
        {
          "type": "string (\"image\" | \"video\" | \"document\")",
          "url": "string",
          "thumbnailUrl": "string (nullable)",
          "title": "string (nullable)",
          "durationMs": "number (nullable)"
        }
      ],
      "article": {
        "title": "string",
        "subtitle": "string (nullable)",
        "url": "string",
        "thumbnailUrl": "string (nullable)"
      },
      "isRepost": "boolean",
      "repostedPost": "TargetPost (nullable, see below)",
      "isEdited": "boolean",
      "mentions": [
        {
          "name": "string",
          "publicIdentifier": "string (nullable)",
          "url": "string (nullable)",
          "urn": "string (nullable)"
        }
      ],
      "companyMentions": ["Mention (same shape as mentions)"],
      "hashtags": ["string"]
    }
  ],
  "comments": [
    {
      "urn": "string",
      "url": "string",
      "text": "string",
      "postedAt": "string (as LinkedIn reports it)",
      "repliesCount": "number",
      "targetPost": "TargetPost (see below)"
    }
  ],
  "reactions": [
    {
      "reactionType": "string",
      "reactedAt": "string (as LinkedIn reports it)",
      "targetPost": "TargetPost (see below)"
    }
  ],
  "createdAt": "string (ISO 8601)",
  "updatedAt": "string (ISO 8601)"
}

TargetPost is the post a comment, reaction or repost points at:
{
  "url": "string",
  "urn": "string",
  "textSnippet": "string",
  "author": { "name": "string", "url": "string", "headline": "string (nullable)" },
  "reactionsCount": "number",
  "commentsCount": "number",
  "repostsCount": "number"
}