API Quickstart: Authentication, Sandbox, and Errors
Create an API key, make your first calls, and handle rate limits and the error envelope.
The Acquired Data API lets you run everything the dashboard can do — skip tracing, DNC scrubbing, property pulls, and buyer searches — from your own code. All endpoints live under a single base URL:
https://data.acquiredcrm.com/api/v1Create an API key
Go to Dashboard → Webhooks → API Keys and create a key. Keys look like ad_live_... and are shown once, at creation time — copy it into your secrets manager immediately. If you lose a key, revoke it and create a new one. Every request authenticates with a standard bearer header:
Authorization: Bearer ad_live_XXXXAPI usage bills against the same credit balance as the dashboard, at your account's per-operation rates.
Your first two calls
Start with GET /me — it verifies your key and returns your credit balances plus the environment your account is running in:
curl https://data.acquiredcrm.com/api/v1/me \
-H "Authorization: Bearer ad_live_XXXX"{
"email": "you@company.com",
"credits_balance": 52689,
"monthly_credits": 30000,
"purchased_credits": 22689,
"environment": "production"
}Then fetch GET /pricing. Pricing is per account — custom rates override the platform defaults — so always read your own numbers instead of hardcoding them:
curl https://data.acquiredcrm.com/api/v1/pricing \
-H "Authorization: Bearer ad_live_XXXX"{
"currency": "credits",
"per_record": {
"base_trace": 1,
"single_trace": 2,
"llc_trust_trace": 6,
"property_pull": 11,
"buyer_profile": 70,
"cached_buyer_profile": 10
},
"add_ons": {
"dnc": 0.5,
"phone_verification": 0.5,
"litigator": 0.5,
"deceased": 0,
"tested_emails": 0.1,
"data_verification": 0.9,
"family_contacts": 1,
"property_valuation": 17,
"property_liens": 14
},
"notes": "Costs are per record, in credits. LLC/Trust-owned records bill at llc_trust_trace instead of base_trace; add-ons are charged per record on top."
}Sandbox vs. production
The environment field on /me (and on every job response) tells you which mode your account is in. In sandbox, requests return realistic sample data and never bill credits — ideal for wiring up your integration end to end. In production, every operation runs against live data and charges credits. Contact support to switch your account between environments.
Rate limiting
Each key is limited to 60 requests per minute. Exceeding it returns 429 rate_limited with a Retry-After header (seconds until the window resets). Bulk operations also allow only one active job of each kind per account at a time; a concurrent submission returns 429 job_in_progress — wait for the running job to resolve, or honor Retry-After.
Error envelope
Every error response uses one consistent envelope:
{
"error": {
"code": "insufficient_credits",
"message": "Not enough credits for this job."
}
}| Status | Code | When |
|---|---|---|
| 401 | unauthorized | Missing, malformed, or revoked API key |
| 402 | insufficient_credits | Not enough credits — top up in Billing |
| 403 | lockdown | Platform temporarily locked by an administrator |
| 404 | not_found | Resource doesn't exist or belongs to another account |
| 409 | job_not_complete | Results or a webhook retry requested before the job resolved |
| 422 | validation_error | Bad request body — the message lists the offending fields |
| 429 | job_in_progress | Another job is running on this account — retry after Retry-After |
| 429 | rate_limited | Over 60 requests/minute on this key — retry after Retry-After |
| 500 | internal_error | Unexpected failure — safe to retry |
Next steps
- Single skip traces — synchronous one-off lookups with
POST /trace. - Bulk jobs — up to 10,000 rows per job as JSON or CSV.
- DNC scrubbing — compliance-scrub lists you already own.
- Property pulls and enrichment — build lists and fill data gaps.
- Buyer search — find likely buyers around any address.
- Webhooks — signed completion callbacks for async jobs.