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://docs.up2data.ai/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

Schedule a signal

Save a batch request and have Up2Data re-submit it on a schedule.

POSThttps://api.up2data.ai/v1/signals
Freeeach run bills as a batch job at run timesynchronous

Creating a signal is free. On every tick Up2Data submits request as a POST /v1/batch job on your behalf, bills it at the normal batch rates from your balance at that moment, and sends batch.completed to request.webhook_url when the job finishes. request is the exact batch body you would send yourself, so every item shape and flag that batch accepts works here; only items (1 to 1,000 objects) and webhook_url (https) are checked when you create the signal, everything else is validated when a run submits it. schedule.interval_ms is required and must be at least 60000 (one minute). schedule.start_at defaults to now; schedule.ends_at and schedule.max_runs are optional, omit both for a signal that runs until you pause or delete it. After downtime a missed tick runs once and the schedule realigns; there is no catch-up burst.

Warning

A run that fails with 402 insufficient_credits pauses the signal with pause_reason insufficient_credits. Top up, then resume it; the skipped step runs on the next tick. A run rejected with 400 pauses it with invalid_request, since the same body would fail every time; fix request with PATCH and resume.

Info

Every run submits the batch with an Idempotency-Key derived from the signal and run number, so a retried submission can never create a second job for the same tick.

#Request

FieldTypeNotes
namestringOptional label, at most 200 characters.
schedulerequiredobjectWhen and how often to run.
schedule.interval_msrequiredintegerMilliseconds between runs. At least 60000.
schedule.start_atstringISO 8601. When the first run fires. Defaults to now.
schedule.ends_atstringISO 8601. No run is scheduled after this instant. Must be after start_at.
schedule.max_runsintegerTotal number of runs, at least 1. The signal completes once run_count reaches it.
requestrequiredobjectA POST /batch body: items plus optional webhook_url. Submitted byte for byte on every run.
request.itemsrequiredobject[]1 to 1,000 batch items, the same shapes POST /batch accepts.
request.webhook_urlstringhttps URL that receives batch.completed for each run's job.

#Call it

cURL
curl -X POST "https://api.up2data.ai/v1/signals" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Watch key accounts",
  "schedule": {
    "interval_ms": 86400000,
    "start_at": "2026-11-01T08:00:00Z",
    "max_runs": 30
  },
  "request": {
    "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"
  }
}'

#Response

201
{
  "data": {
    "signal_id": "9d1f4c2e-7b3a-4e8f-a1c5-2f6b8d9e0a11",
    "name": "Watch key accounts",
    "status": "active",
    "active": true,
    "pause_reason": null,
    "schedule": { "interval_ms": 86400000, "start_at": "2026-11-01T08:00:00Z", "ends_at": null, "max_runs": 30 },
    "run_count": 0,
    "next_run_at": "2026-11-01T08:00:00Z",
    "last_run_at": null,
    "last_job_id": null,
    "last_error": null,
    "completed_at": null,
    "request": {
      "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"
    },
    "created_at": "2026-10-30T12:00:00Z",
    "updated_at": "2026-10-30T12:00:00Z"
  },
  "meta": { "creditsUsed": 0, "creditsRemaining": 98413, "billed": false, "reason": "signal_created", "requestId": "req_t4sk0001" }
}

#Errors

StatusTypeWhenBilled
400invalid_requestMalformed body, schedule.interval_ms missing or below 60000, ends_at not after start_at, max_runs below 1, request.items empty or over 1,000, or webhook_url not https.No
401invalid_api_keyMissing, malformed, or revoked key.No
429rate_limitedOver the 5,000 requests/min limit. Honor Retry-After.No
500internal_errorSomething broke on the server side.No
503upstream_errorThe scheduling service is unreachable. Safe to retry.No

See the Errors guide for every error type this version can return.