API

REST API for B2B contact data.

Search, enrich, unlock, and export 19.3M verified B2B contacts programmatically. Pay per contact unlocked, just like the UI.

API access included at the Growth tier ($100 credit pack) and above.

Quick start

Authenticate with a bearer token in the Authorization header. All requests use HTTPS, JSON request and response bodies, and standard HTTP status codes.

curl https://api.cheapb2bdata.com/v1/search \
  -H "Authorization: Bearer $CHEAPB2B_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "filters": {
      "title": ["VP of Engineering", "CTO"],
      "company_size": "100-1000",
      "tech_stack": ["AWS", "Kubernetes"],
      "funding_stage": ["series_b", "series_c"]
    },
    "limit": 100
  }'

Search is free. You only burn credits when you call /v1/unlock on a result.

Endpoints

POST
/v1/search

Filter contacts by title, seniority, industry, tech stack, funding stage, and 270+ other filters.

POST
/v1/unlock

Unlock one or more contact records. Returns full Basic or Premium payload, deducts credits.

POST
/v1/enrich

Pass a partial record (email or LinkedIn URL); receive the full enriched record.

GET
/v1/lists

List, create, and manage saved searches.

POST
/v1/lists/:id/export

Export a saved list as CSV or JSON. Optional signed-URL bulk download for 100K+.

POST
/v1/webhooks

Subscribe to job-change, role-change, and intent events on saved-list contacts.

GET
/v1/credits/balance

Current credit balance, recent usage, refunds.

Code examples

Node.js

import { CheapB2B } from '@cheapb2b/sdk'

const cb = new CheapB2B(process.env.CHEAPB2B_API_KEY)

const { results } = await cb.search({
  filters: { title: ['CMO'], company_size: '50-500' },
  limit: 50
})

const unlocked = await cb.unlock(results.map(r => r.id))
console.log(unlocked[0].email)

Python

from cheapb2b import CheapB2B

cb = CheapB2B(api_key=os.environ["CHEAPB2B_API_KEY"])

results = cb.search(
    filters={"title": ["CMO"], "company_size": "50-500"},
    limit=50
)

unlocked = cb.unlock([r["id"] for r in results])
print(unlocked[0]["email"])

What you should know

Search is free

You only burn credits when you call /unlock. Search results return enough metadata to decide which records are worth unlocking.

Rate limits

Default: 100 req/min on search, 60 req/min on unlock. Bulk export endpoints don’t count against these. Need higher? Email support.

Webhooks for job changes

Subscribe a webhook URL; we’ll POST when a contact on your saved list changes job, role, or company.

Refunds on miss

Same as the UI: bounce, wrong number, wrong title, file via /v1/credits/refund. First 100 auto-approved.

Get an API key.

Available at the Growth tier ($100 credit pack) and above. Generate the key in your dashboard.