ProspectChief API
Read and manage your ProspectChief account programmatically: projects, businesses saved from Bing Maps and Google Maps, Extractor contacts, imports and email verification. Live map capture happens in the browser extensions and is not offered as a server-side scraping API.
Account & authentication
Authenticate every request with a Bearer API key:
Authorization: Bearer YOUR_API_KEY
Create keys in Settings → API keys. Each key carries the permissions you grant when creating it:
| Permission (scope) | Grants |
|---|---|
account | Account data: projects, saved businesses, contacts, imports, exports, verification previews and job status. |
email_validate | Operations that can spend verification credits: POST /validate, POST /validate/batch, and creating project verification jobs (which also needs account). |
Security: Keep API keys server-side. Never embed them in browser JavaScript, a mobile app, or a browser extension bundle. Keys can be revoked at any time from Settings. Resources belonging to other accounts return 404, never their data.
GET /account
Returns the plan, products, timezone, verification credit balance, entitlements and connected devices. Credits: none.
cURL
curl -sS -H "Authorization: Bearer YOUR_API_KEY" \ "https://app.prospectchief.com/api/v1/account"
JavaScript (server-side)
const res = await fetch("https://app.prospectchief.com/api/v1/account", {
headers: { Authorization: "Bearer YOUR_API_KEY" }
});
const data = await res.json();
Python
import requests
r = requests.get(
"https://app.prospectchief.com/api/v1/account",
headers={"Authorization": "Bearer YOUR_API_KEY"},
)
print(r.json())
| Field | Type | Description |
|---|---|---|
plan | string | Account plan identifier |
products | object | Per-product entitlement flags (fee, prospectchief). Subscriptions are separate per product; verification credits are shared. |
verification.available_credits | integer | Credits ready to spend |
verification.reserved_credits | integer | Credits held for in-flight jobs |
verification.service_enabled | boolean | Whether mailbox verification is currently available |
entitlements.projects_max | integer | Extractor project quota for this plan |
Projects
Projects group leads. purpose is leads (Extractor contacts) or maps (Maps businesses). GET /projects defaults to purpose=leads; pass purpose=maps or purpose=all.
Each purpose has its own quota on Free plans (Maps: 3 projects on Free, 100 on Maps Pro by default; Extractor: see entitlements.projects_max). When the quota is reached, POST /projects returns 403 with error: project_limit_reached, limit, used and, for Free accounts, an upgrade_url.
curl -sS -X POST "https://app.prospectchief.com/api/v1/projects" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Plumbers — Austin","purpose":"maps"}'
GET /projects?purpose=maps&page=1&per_page=50— listGET /projects/{id}·PATCH(name, autosave) ·DELETEGET /projects/{id}/export?format=csv|xlsx— download contacts (CSV has a UTF-8 BOM; cells starting with= + - @are neutralised)
Maps businesses & enrichment
Businesses are captured in the browser by the Bing Maps and Google Maps Lead Finder extensions and saved to Maps projects. The API lets you list, filter, save and enrich saved businesses. Extension-only: live capture from the map, the collect handshake and the Maps Free email reveal. There is no server-side Google/Bing scraping endpoint.
GET /businesses
Paginated list of all saved businesses with filters: project_id, platform (bing_maps|google_maps), has_email, enrichment_status, q (name, website domain or locality), updated_since, page, per_page (≤100).
curl -sS -H "Authorization: Bearer YOUR_API_KEY" \ "https://app.prospectchief.com/api/v1/businesses?platform=bing_maps&has_email=1&per_page=100"
Each record carries coherent source fields regardless of platform:
| Field | Description |
|---|---|
source.platform | bing_maps or google_maps |
source.place_id | Stable platform id: ypid:… (Bing), cid:… or place:… (Google) |
source.listing_url | Public listing link derived from the stable id; null when unknown (never guessed) |
source.search_url | Search results URL the business was captured from, when the extension observed one |
emails[] / emails_hidden_count | Visible emails with source URL and mailbox status; on Maps Free, locked emails are counted and returned as opaque contact_id handles only |
enrichment.status / enrichment.error | Website scan state and the last error (e.g. HTTP 403), preserved as provenance |
GET /businesses/{id}— detailGET /projects/{id}/businesses— businesses on one Maps project (extension-compatible shape)POST /projects/{id}/businesses— save up to 200 businesses (name,source_platform,source_place_id,website_url, address, phone, coordinates,rating,review_count,emails[]). Businesses with a website are queued for website enrichment within plan limits.POST /projects/{id}/businesses/enrich·POST …/{business}/enrich·POST …/{business}/enrich/cancel
Python — page through businesses with an email
import requests
page = 1
while True:
r = requests.get("https://app.prospectchief.com/api/v1/businesses",
params={"has_email": 1, "page": page, "per_page": 100},
headers={"Authorization": "Bearer YOUR_API_KEY"})
r.raise_for_status()
body = r.json()
for b in body["data"]:
print(b["name"], b["source"]["platform"], [e["email"] for e in b["emails"]])
if page >= body["meta"]["last_page"]:
break
page += 1
Extractor contacts & imports
GET /contacts?q=&project_id=&page=&per_page=— listPOST /contacts— save up to 1000 contacts (email,name,company_name,source_url,source_type); optionalproject_id/project_idsPATCH /contacts/{id}·DELETE /contacts/{id}GET /projects/{id}/contacts·POST·DELETE …/contacts/{contact}GET /contacts/mail-summary?project_id=— Domain Mail Ready aggregates- Imports:
POST /imports→POST /imports/{job}/batches(idempotent bybatch_index) →POST /imports/{job}/complete;GET /imports/{job}for progress
curl -sS -X POST "https://app.prospectchief.com/api/v1/contacts" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"project_id":12,"contacts":[{"email":"[email protected]","name":"Jane Doe","source_url":"https://example.com/team"}]}'
Exclusions
Rules from Settings → Exclusions are applied server-side to every save path — POST /contacts, POST /projects/{id}/contacts, imports and Maps website enrichment. Matching addresses are skipped, counted under rejected_by_reason.user_exclusion, and are never charged by verification. Existing saved records are not deleted when a rule is added.
Email verification
Two layers: Mail Intelligence (domain routing / classification, free) and metered mailbox verification. Requires a key with the email_validate permission.
POST /validate
| Parameter | Type | Required | Description |
|---|---|---|---|
email | string | yes | Address to analyze (max 320) |
mailbox_verification | boolean | no | Default false. When true, runs metered mailbox verification when the service is enabled |
cURL
curl -sS -X POST "https://app.prospectchief.com/api/v1/validate" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","mailbox_verification":true}'
JavaScript (server-side)
await fetch("https://app.prospectchief.com/api/v1/validate", {
method: "POST",
headers: { Authorization: "Bearer YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({ email: "[email protected]", mailbox_verification: true })
});
Python
import requests
requests.post(
"https://app.prospectchief.com/api/v1/validate",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"email": "[email protected]", "mailbox_verification": True},
)
Mailbox dispositions: valid, invalid, catch_all, unknown. Domain Mail Ready (Mail Intelligence) means the domain has a usable mail route; it is not mailbox verification and does not prove the local part exists.
POST /validate/batch
Up to 200 emails[] per request; same mailbox_verification semantics.
Project verification
Verify the mailboxes of a whole project (Extractor contacts or Maps business emails) with the same planner, exclusions and credit ledger as the web workspace.
GET /projects/{id}/verification/preview?force_reverify=0— cost preview:total,already_verified_fresh,needs_verification,eligible,estimated_credits,reverify_estimated_credits,available_credits,excluded_*,up_to_date,insufficient_credits. Nothing is created or charged.POST /projects/{id}/verificationwith anIdempotency-Keyheader (required) and optionalforce_reverify,start(defaulttrue). Returns201with the job; replaying the same key returns the existing job with200and never creates or charges twice.402 insufficient_verification_balancewhen credits are short,409 up_to_datewhen every contact is fresh,422 nothing_to_verify,503when the service is paused.GET /verification/jobs/{public_id}— poll status (status,percent,counts,credits_reserved,credits_charged,queue_position);GET /verification/jobslists jobs.
curl -sS -X POST "https://app.prospectchief.com/api/v1/projects/12/verification" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Idempotency-Key: crm-sync-2026-10-12-run-1" \
-H "Content-Type: application/json" \
-d '{"force_reverify":false}'
Credits
- Verification credits are one shared balance for the whole account (Extractor and Maps). Subscriptions (FEE Pro, Maps Pro) are separate products and are not merged; an active Pro subscription of either product gives the same single credit-pack discount — it never stacks.
- Mailbox verification is metered. Mail Intelligence alone is never charged.
- Fresh results (checked within the freshness window) are reused without a new provider operation and are never charged again. Only new or stale addresses consume credits; Verify all / Reverify must be requested explicitly (
force_reverify). - Credits are reserved when a job starts (
credits_reserved) and settled per chargeable result (credits_charged); operational provider failures do not invent aninvaliddisposition and are not charged. - Insufficient credits reject the operation with
402andbalance.available/balance.required— there is no silent free verification. - When the customer service gate is disabled, mailbox verification requests return
503withmailbox_verification_unavailable.
Errors & rate limits
| HTTP | Meaning |
|---|---|
401 | not_authenticated — missing, revoked or expired API key |
402 | insufficient_verification_balance |
403 | insufficient_scope, project_limit_reached, or a product gate |
404 | Not found — also for resources owned by another account |
409 | State conflict (e.g. up_to_date, import_closed) |
422 | Validation error (message + errors), idempotency_key_required, maps_project_required |
429 | Rate limited — honour Retry-After and back off exponentially |
503 | Mailbox verification temporarily unavailable |
{
"error": "insufficient_verification_balance",
"message": "Not enough mailbox verification credits for this job.",
"balance": { "available": 0, "required": 25 }
}
Rate limits: account endpoints allow 180 requests per minute per API key; validation endpoints use a separate per-key limiter. Batch where possible (per_page=100, /validate/batch, imports).
Webhooks are not offered in v1 — poll GET /verification/jobs/{id} and GET /imports/{job}.
This documentation page is public. API execution always requires authentication. CORS is not enabled for API keys: call the API from your server, not from a web page.
All endpoints
Generated from the same contract as openapi.json.
Account
| Method | Path | Summary | Scope |
|---|---|---|---|
GET | /account | Account, plan, credits, entitlements and devices · credits: none | account |
GET | /devices | Connected extension devices | account |
DELETE | /devices/{device} | Disconnect a device | account |
GET | /entitlements | Alias of GET /account | account |
Maps businesses
| Method | Path | Summary | Scope |
|---|---|---|---|
GET | /businesses | List saved businesses (paginated, filterable) | account |
GET | /businesses/{business} | Business detail | account |
GET | /projects/{project}/businesses | Businesses saved on a Maps project (extension shape) | account |
POST | /projects/{project}/businesses | Save businesses to a Maps project | account |
POST | /projects/{project}/businesses/enrich | Queue website enrichment for businesses on a project | account |
POST | /projects/{project}/businesses/{business}/enrich | Queue website enrichment for one business | account |
POST | /projects/{project}/businesses/{business}/enrich/cancel | Cancel pending enrichment | account |
Extractor contacts
| Method | Path | Summary | Scope |
|---|---|---|---|
GET | /contacts | List contacts | account |
POST | /contacts | Save contacts (≤1000 per request) | account |
GET | /contacts/mail-summary | Domain Mail Ready aggregates | account |
PATCH | /contacts/{contact} | Update a contact | account |
DELETE | /contacts/{contact} | Delete a contact | account |
GET | /projects/{project}/contacts | Contacts on a project | account |
POST | /projects/{project}/contacts | Save contacts to a project | account |
DELETE | /projects/{project}/contacts/{contact} | Detach a contact from a project | account |
Imports
| Method | Path | Summary | Scope |
|---|---|---|---|
POST | /imports | Open an async import | account |
GET | /imports/{job} | Import status | account |
POST | /imports/{job}/batches | Append a batch (idempotent by batch_index) | account |
POST | /imports/{job}/complete | Close the import | account |
Projects
| Method | Path | Summary | Scope |
|---|---|---|---|
GET | /projects | List projects | account |
POST | /projects | Create a project | account |
GET | /projects/{project} | Project detail | account |
PATCH | /projects/{project} | Rename / toggle autosave | account |
DELETE | /projects/{project} | Delete (archive) a project | account |
GET | /projects/{project}/export | Export project contacts (CSV or XLSX) | account |
Email verification
| Method | Path | Summary | Scope |
|---|---|---|---|
POST | /projects/{project}/verification | Create (and start) a project verification job · credits: eligible contacts are reserved at start and settled per result; fresh results are reused free | account + email_validate |
GET | /projects/{project}/verification/preview | Cost preview for verifying a project (nothing is created or charged) · credits: none | account |
POST | /validate | Analyze one email (Mail Intelligence; optional metered mailbox verification) · credits: 1 per new/stale mailbox check when mailbox_verification=true | email_validate |
POST | /validate/batch | Analyze up to 200 emails · credits: 1 per new/stale mailbox check when mailbox_verification=true | email_validate |
GET | /verification/jobs | List verification jobs | account |
GET | /verification/jobs/{publicId} | Verification job status | account |
Extension-only (not a general API): POST /auth/extension/exchange, POST /extension/events, POST /businesses/collect, POST /businesses/{id}/emails/reveal, GET /contacts/activity; website-only: /public/*, /mx/*, /checkout/intents, /admission-policy.