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/v1/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

Quickstart

Make your first enrich call, then submit a batch, in under five minutes.

#Get an API key

Every request needs an X-API-Key header. Keys are created and rotated at https://app.up2data.ai - keep them out of client-side code, public repositories, and URLs.

Info

Multiple keys can be active on the same account at once, so you can rotate without downtime: create a new key, deploy it, then revoke the old one. Revocation takes effect within 60 seconds - keys are cached briefly.

#Enrich one profile

The base URL for every /v1 call is https://api.up2data.ai/v1. Start with a single synchronous call:

bash
curl -X POST https://api.up2data.ai/v1/profiles/enrich \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://linkedin.com/in/satyanadella"}'

A successful response looks like this:

json
{
  "data": {
    "url": "https://www.linkedin.com/in/satyanadella",
    "full_name": "Satya Nadella",
    "headline": "Chairman and CEO at Microsoft"
  },
  "meta": {
    "creditsUsed": 1,
    "creditsRemaining": 98420,
    "billed": true,
    "reason": "profile_found",
    "requestId": "req_8f2ka91x"
  }
}

meta rides along on every successful response, so you always know what a call cost without a separate balance check; an error response skips meta and returns just {"error": {"type", "message", "requestId"}} instead, but the requestId is there either way. Companies and posts work the same way: one URL in, one record back, typically in 2 to 8 seconds.

#Scale up with batch

Sync calls are fine for one-off lookups, but past a few hundred records use POST /v1/batch instead of looping over the sync endpoints. Every /v1 capability is batchable, not just enrich - see Batch jobs for the full operations table. Submit profiles, companies, and posts together in a single job:

bash
curl -X POST https://api.up2data.ai/v1/batch \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      { "type": "profile", "url": "https://linkedin.com/in/a" },
      { "type": "company", "url": "https://linkedin.com/company/acme" }
    ],
    "webhook_url": "https://your-server.com/hooks/up2data"
  }'

The job is accepted right away and billed for its items at submission:

json
{
  "data": { "job_id": "job_7hd92kfa", "status": "processing", "total": 2, "estimated_completion": "2026-07-07T14:03:00Z" },
  "meta": { "creditsUsed": 2, "billed": true, "reason": "job_accepted" }
}

The whole job was just charged at submission: 1 credit per profile, company or post item, plus a max_results-sized reservation for any Sales Navigator search item. Pick up the results with the batch.completed webhook or by polling GET /v1/batch/{job_id} - see Batch jobs.

#Next steps

  • Authentication for key management and the 401/402 error shapes.
  • Credits for the full rate table and the billing rule.
  • Errors for every status code you can get back.