Quickstart
Three steps from key to clean JSON. No SDK, no setup.
Get your key
Your secret key looks like sk_live_…. It is issued from your dashboard once access is granted, and it is the only credential you need.
Set the header
Send your key on every request in the X-API-Key header. No tokens to refresh, no OAuth dance.
Call an endpoint
POST a LinkedIn URL to /v1/person/enrich or /v1/email/find. You are charged only when we find a record.
Try it with your key
Paste your key, pick an endpoint, and run a real request against the live API. Your key is stored only in this browser and sent straight to PersistData, never to anyone else.
Your API key
Endpoint
LinkedIn URL
Paste any real LinkedIn profile URL. Sales Navigator links are normalized automatically. A not-found returns found:false and costs zero credits.
Copy this exact request
Authentication
Pass your secret key in the X-API-Key header on every request. Keys are issued from your dashboard once access is granted.
# every request carries your key curl https://api.persistdata.com/v1/account \ -H "X-API-Key: sk_live_..."
Base URL
https://api.persistdata.com/v1
Credits & billing
Credits are deducted only when a record is found. Not-founds, errors, and cache misses cost zero. Identical lookups within five minutes are served from cache and never re-charged.
| Operation | Endpoint | Credits |
|---|---|---|
| Profile enrich | /v1/person/enrich | 2 |
| Email finder (with enrich) | /v1/person/enrich with_email | +5 |
| Email finder (standalone) | /v1/email/find | 5 |
| People search | /v1/search | Free |
| Company lookup | /v1/company | Free |
Enrich a person
Resolve a LinkedIn URL or identifier into a structured profile: name, headline, photo and banner, every current role with company headcount, full work history, education, skills, and the firmographics of their company. Sales Navigator URLs are normalized automatically.
curl https://api.persistdata.com/v1/person/enrich \ -H "X-API-Key: sk_live_..." \ -H "Content-Type: application/json" \ -d '{"url":"linkedin.com/in/janedoe"}' # 200 OK { "found": true, "credits_charged": 2, "person": { "name": "Jane Doe", "headline": "VP Sales at Northwind", "location": "Austin, TX", "currentRoles": [ { "title": "VP Sales", "company": "Northwind" } ], "company": { "name": "Northwind", "employees": 210, "industry": "B2B SaaS" }, "experience": [ /* ... */ ], "education": [ /* ... */ ], "skills": [ "Enterprise Sales", "Forecasting" ] }, "balance": 4998 }
Find an email
Return one deliverable, verified business email for a person. You are charged only when we return a confident match.
curl https://api.persistdata.com/v1/email/find \ -H "X-API-Key: sk_live_..." \ -H "Content-Type: application/json" \ -d '{"url":"linkedin.com/in/janedoe"}' # 200 OK (not found -> {"found":false,"credits_charged":0}) { "found": true, "email": "jane@northwind.com", "credits_charged": 5 }
Search for people
A Sales-Navigator-style structured search. Returns up to 25 un-enriched leads per page, free; you only pay to enrich the ones you want. Filter by title, company (a LinkedIn company URL or universal name returns its actual employees), location, keywords, industry, seniority, headcount, func, yearsExp, yearsCompany, language, pastTitle, firstName, lastName, and the booleans recentlyChangedJobs / postedOnLinkedin. Array filters take ID arrays; page is 1-20.
curl https://api.persistdata.com/v1/search \ -H "X-API-Key: sk_live_..." \ -H "Content-Type: application/json" \ -d '{"title":"VP of Sales","location":"United States","headcount":["D","E"]}' # 200 OK { "results": [ { "name": "Jane Doe", "title": "VP of Sales", "company": "Northwind", "location": "Austin, TX", "linkedin_url": "https://www.linkedin.com/in/janedoe" } ], "page": 1, "total_pages": 20, "total": 18653 }
Look up a company
Firmographics for a company by universalName (the slug in its LinkedIn URL), url, or companyId: industry, employee count and size range, HQ, founded year, follower count, website, and specialties.
curl https://api.persistdata.com/v1/company \ -H "X-API-Key: sk_live_..." \ -H "Content-Type: application/json" \ -d '{"universalName":"stripe"}' # 200 OK { "company": { "name": "Stripe", "industry": "Technology, Information and Internet", "employees": 16031, "range": "5001-10000", "founded": 2010, "hq": "South San Francisco, CA", "website": "https://stripe.com", "specialties": [ "payments", "APIs" ] } }
Account
Check your plan and remaining credit balance. The console above calls this the moment you paste a key.
{ "account": "acme", "plan": "growth", "balance": 4998 }Errors
| Status | Code | Meaning |
|---|---|---|
| 401 | invalid_api_key | Missing or unrecognized key |
| 402 | insufficient_credits | Balance below the cost of the call |
| 429 | rate_limited | Too many requests this minute |
| 400 | missing_url | No target URL or identifier provided |
| 503 | source_not_configured | Data source not yet live on this deployment (pre-launch) |
Rate limits
Requests are limited per key, by plan. A 429 includes a retry_after_seconds field. Burst beyond your limit is rejected rather than queued, so your spend stays predictable.