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.
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:
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:
{
"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:
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:
{
"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.