Developer reference & live console

The PersistData API

One key, one call, clean JSON. Every endpoint is server-side, metered per success, and rate-limited per plan. A not-found never costs a credit. Paste your key below and try it without leaving the page.

Quickstart

Three steps from key to clean JSON. No SDK, no setup.

1

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.

2

Set the header

Send your key on every request in the X-API-Key header. No tokens to refresh, no OAuth dance.

3

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.

persistdata · console no key yet

Your API key

Enter a key to check your plan and balance.

Endpoint

LinkedIn URL

POST

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.

OperationEndpointCredits
Profile enrich/v1/person/enrich2
Email finder (with enrich)/v1/person/enrich with_email+5
Email finder (standalone)/v1/email/find5
People search/v1/searchFree
Company lookup/v1/companyFree

Enrich a person

POST/v1/person/enrich2 credits / found

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

POST/v1/email/find5 credits / found

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 }
POST/v1/searchfree

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

POST/v1/companyfree

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

GET/v1/accountfree

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

StatusCodeMeaning
401invalid_api_keyMissing or unrecognized key
402insufficient_creditsBalance below the cost of the call
429rate_limitedToo many requests this minute
400missing_urlNo target URL or identifier provided
503source_not_configuredData 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.

Request an API key