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

Errors

Every error shape and status code the API returns, and which ones are billed.

Every error shape returned by legacy API endpoints, in one place: what triggered it and whether it was billed.

#Authentication

Status Body When
401 {"error": "Not authorized"} The API key sent to POST /api-auth/authenticate does not match a valid key

#Bulk enqueue endpoints

profiles-bulk, companies-bulk, activity, posts, comments, reactions and latest-post all return the same shape when nothing survives normalization (companies-bulk says "companies" instead of "profiles"):

json
{
  "message": "No valid profiles to enqueue: of 4 submitted, 1 were invalid and 3 were duplicates."
}

post-by-url returns the equivalent for post URLs:

json
{
  "message": "No valid post urls to enqueue: of 4 submitted, 1 were invalid and 3 were duplicates."
}

Any endpoint that accepts webhookTags rejects a tag that matches no webhook:

json
{
  "message": "No webhook matches webhookTags: stage. Available tags: dev, prod, staging."
}

None of these create a queue, and none of them are billed.

#Live enrichment endpoints

profile and company return the enriched document directly, so their errors and billing follow a different rule:

Status Body / meaning Billed
200 The enriched document Yes
404 {"message": "Profile not found on LinkedIn"} or {"message": "Company not found on LinkedIn"} Yes
400 Input is not a matching LinkedIn URL or slug (linkedin.com/in/ for profiles, linkedin.com/company/ for companies), or the team's daily or monthly spending cap has been reached No
403 Not enough credits on the team No
429 Rate limited No
503 No worker became available within 10 seconds, or the crawl could not be completed; retry later No
Warning

Both endpoints share a limit of 10 requests per 10 seconds per team. Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds until the window clears) headers, and a 429 also carries Retry-After so you know how long to wait before retrying.

See the Credits guide for how these statuses interact with billing across every endpoint.