Skip Tracing API
Skip Tracing API — PI-Grade Data, Pay Per Match, No Order Minimum
One POST to the Ava Data skip trace API: send a last name plus an address, and get verified phones, emails, and — on Deep Search — the related-persons graph back as JSON. Credits are charged only when a match is returned; misses cost nothing.
What is the Ava Data Skip Tracing API?
The Ava Data skip tracing API is a REST endpoint that takes a person's name plus a known address (or city/state) and returns the most current verified contact information on file: phone numbers, email addresses, and — on the Deep Search tier — a relational graph of spouses, siblings, parents, and known associates.
Ava Data's underlying identity graph updates every 24 hours, so the number a lookup returns reflects the most recent state of the record rather than a snapshot taken months ago. That lag — between when a phone goes out of service and when the data behind it catches up — is where wrong-number complaints come from. Refresh cadence is the variable worth asking any skip trace API vendor about, ours included: ask what it is before you ask what it costs.
Authentication is a single bearer token passed in the Authorization header — no OAuth flow, no SDK required. Any HTTP client that can send a POST request can call the API.
Internal links: Contact Enrichment API · Bulk Skip Tracing · Phone Number Lookup API · What is skip tracing? · Relational Mapping
Skip Trace API Quickstart — Your First Request
Two things before the first call: an API key, generated from Settings → API Access once an administrator has enabled API access on the account, and the base URL https://app.avadata.ai/api/v1. The synchronous endpoints are rate limited to 60 requests per minute per key. There is no sandbox — the request below runs against production data, but credits are charged only when a match comes back, so a first call that misses costs nothing. Copy it, swap in your key, and run it.
curl -X POST https://app.avadata.ai/api/v1/standard-search -H "Authorization: Bearer sk_live_your_api_key_here" -H "Content-Type: application/json" -d '{"firstName":"John","lastName":"Smith","address":"123 Main St","city":"Austin","state":"TX","zip":"78701","dataTypes":["phone","email"]}'
{
"success": true,
"data": {
"matchFound": true,
"creditsCharged": 2,
"name": "John Smith",
"phones": [{ "number": "5125551234", "type": "mobile" }],
"emails": [{ "address": "john.smith@example.com" }],
"addresses": [{ "street": "123 Main St", "city": "Austin", "state": "TX", "zip": "78701" }]
}
}
Only two fields are required: lastName and dataTypes. Everything else — firstName, address, city, state, zip — is optional and exists to narrow the match. Because a last name is required, a lookup is keyed on a person, not on an address by itself; the address fields are there to disambiguate which John Smith you mean. If all you have is a property address, resolve the owner name first — that is what finding the owner of a property is for — then trace the name.
dataTypes also sets the price: ["phone"] is 1 credit, ["email"] is 1 credit, ["phone","email"] is 2 — one credit per data type, charged only when a match comes back. The response also carries a nullable matchType string. Every field, along with the 400, 401, 402, 403, 429 and 500 error responses, is listed in the API reference, generated from the OpenAPI spec.
What the API Returns
- Standard Lookup — Phone Only (1 credit / $0.02): The single best current phone number verified for the subject. Ideal for dialers and outbound call campaigns where you need one clean number per record.
- Standard Lookup — Phone + Email (2 credits / $0.04): Best phone plus the best email address on file. Useful for multi-touch sequences that combine calls and email.
- Deep Search (10 credits / $0.20): Everything in Standard plus the related-persons graph. Each associated person (spouse, sibling, parent, associate) is returned with their own verified phones and emails. This is the lookup designed for hard-to-reach individuals where the primary phone and email are unreachable — you can often reach decision-makers through a confirmed family member or known associate.
Every response is wrapped as { "success": true, "data": { ... } }. The data object includes a matchFound boolean and a creditsCharged field. If matchFound is false, creditsCharged is 0.
On Deep Search the subject object carries more than contact points: aliases, age, dob, and nullable deceased and bankruptcy booleans, alongside the phones, emails, and addresses arrays. Entries in relatedPeople are a narrower object — firstName, lastName, age, deceased, bankruptcy, their own phones, emails, and addresses, plus a relationship label such as Spouse — with no aliases or dob on that object, so don't code against those two outside subject. The deceased flag is the one worth branching on: it is what separates a skip trace that dead-ends from one that routes the record to an heir conversation instead of another unanswered dial.
One limit, stated plainly: Ava Data is not a consumer reporting agency and this data is not a consumer report under the Fair Credit Reporting Act. These fields exist to locate and contact a person. They may not be used to establish anyone's eligibility for credit, insurance, employment, or housing — those are FCRA-regulated purposes, and section 3 of our Terms of Service bars that use.
Pricing — Pay Only for Matches
| Lookup type | Credits | Price per match | Returns |
|---|---|---|---|
| Standard — Phone Only | 1 | $0.02 | Best verified phone number |
| Standard — Phone + Email | 2 | $0.04 | Phone + email address |
| Deep Search | 10 | $0.20 | Phones, emails, related persons (spouses, siblings, associates) |
Credits are only charged when a match is returned. No match = no charge. See full plan details →
Credits come with the $9/month plan (100 credits included); wallet credit packs are separate one-time purchases used after subscription credits. There is no usage minimum on API calls — if you run zero lookups in a month, you are billed $9 for the plan and nothing else.
How the Skip Tracing API Works
Looking for the reference rather than the overview? The full endpoint documentation — parameters, response fields and error codes for every endpoint — is at the API reference, generated from our OpenAPI spec.
Standard Search is the 1–2 credit lookup described above. Deep Search is the same skip trace request shape against POST /api/v1/deep-search, with two differences: it takes no dataTypes parameter because it always returns everything, and lastName is its only required field. It costs 10 credits ($0.20) per match, charged only when a match is found.
curl -X POST https://app.avadata.ai/api/v1/deep-search -H "Authorization: Bearer sk_live_your_api_key_here" -H "Content-Type: application/json" -d '{"firstName":"John","lastName":"Smith","address":"123 Main St","city":"Austin","state":"TX","zip":"78701"}'
{
"success": true,
"data": {
"matchFound": true,
"creditsCharged": 10,
"subject": {
"firstName": "John",
"lastName": "Smith",
"age": 54,
"deceased": false,
"phones": [{ "number": "5125551234", "type": "mobile" }],
"emails": [{ "address": "john.smith@example.com" }],
"addresses": [{ "street": "123 Main St", "city": "Austin", "state": "TX", "zip": "78701" }]
},
"relatedPeople": [
{
"firstName": "Mary",
"lastName": "Smith",
"relationship": "Spouse",
"phones": [{ "number": "5125550147", "type": "mobile" }],
"emails": []
}
]
}
}
{
"firstName": "Jane",
"lastName": "Doe",
"address": "742 Evergreen Terrace",
"city": "Springfield",
"state": "IL",
"dataTypes": ["phone", "email"]
}
{
"success": true,
"data": {
"matchFound": true,
"creditsCharged": 2,
"phones": [{ "number": "5555550142", "type": "mobile" }],
"emails": [{ "address": "jdoe@example.com" }],
"name": "Jane Doe",
"addresses": [{ "street": "742 Evergreen Terrace", "city": "Springfield", "state": "IL" }]
}
}
For Deep Search, use POST /api/v1/deep-search with the same identity fields — Deep Search takes no dataTypes parameter and always returns everything. Its data object carries a subject object plus a relatedPeople array, each element containing the related person's first and last name, relationship, and their own phones and emails.
Bulk processing works through a separate async endpoint: upload a CSV, receive a job ID, poll for status, and download the enriched file when complete. See the Bulk Skip Tracing page for details.
Full interactive API documentation is available inside the app at app.avadata.ai after account creation. To request API access, email support@avadata.ai.
Skip Trace API Errors, Rate Limits, and What a Miss Costs
A miss is not an error. When no record matches, the skip trace API still returns 200, with matchFound: false and creditsCharged: 0 inside the data object — handle it as a normal outcome, not an exception. Real errors share one body shape, success: false plus a descriptive error string, and the status code carries the meaning.
| Status | What it means | How to handle it |
|---|---|---|
| 400 | Invalid or missing request parameters. | On Standard Search, almost always a missing lastName or dataTypes; Deep Search requires only lastName. Validate before sending. |
| 401 | Missing, invalid, or inactive API key, or API access not enabled. | Check the Authorization header, then check that an administrator has enabled API access. |
| 402 | Insufficient credits for the requested operation. | Pause the run and top up. Check your balance before a large batch. |
| 403 | Account suspended, or access denied to the requested resource. | Not retryable. Contact support. |
| 404 | The requested resource does not exist. | Check the jobId you are polling. Not retryable. |
| 429 | Too many requests — exceeds 60 requests per minute per API key. | Back off and retry. Do not open more connections — the limit is per key, not per connection. |
| 500 | Internal server error. Any charged credits are refunded for search endpoints. | Safe to retry. You are not billed for a failed search. |
Not every code reaches every endpoint. 402 appears only where credits are spent — the two search endpoints and the bulk and audience uploads — and 404 only on GET /api/v1/credits and the job status and download endpoints.
The two worth writing handling for before you go to production are 402 and 429. A 402 stops the run mid-file unless you check your balance first, so call GET /api/v1/credits at the head of a batch and compare data.availableCredits against your worst case — every record matching, at 1, 2, or 10 credits each. A 429 means you are over 60 requests per minute on that key; that is the ceiling for synchronous calls, and past it the bulk endpoints are the intended path rather than a faster loop.
Frequently Asked Questions
What data does the API return?
A Standard Lookup returns the best current phone number on file and, for the 2-credit tier, the best email address. A Deep Search adds the full related-persons graph — spouses, siblings, parents, and known associates — each with their own verified contact information.
What match rate should I expect from the skip trace API?
We do not publish a match-rate figure, and you should be skeptical of any provider that quotes one without showing you the input list behind it — match rate is driven largely by what you send in. Both search endpoints require a last name, and results improve when you pair it with a current mailing address; a scraped file of initials and PO boxes will match at a lower rate than a clean owner file, against any database. What the spec does document is the billing rule: creditsCharged is 0 whenever matchFound is false, and any charged credits are refunded if a search endpoint returns a 500. So the question that actually decides your cost is not what share of records match — it is what a match costs (2¢, 4¢, or 20¢ depending on tier) and what a miss costs (nothing). You are not buying a match rate. You are buying only the matches.
Is there a free tier or trial?
The $9/month plan includes 100 credits — enough for 100 Standard phone-only lookups or 10 Deep Searches. There is no free skip tracing tier or sandbox, but because you only pay for matches, your risk on a first batch is bounded by the number of records that actually return data. Contact support@avadata.ai for API enablement.
How does this compare to buying a bulk list?
Two different comparisons, and they are worth keeping separate. Against a pre-built list file, the billing model is the whole argument: you pay for every row in the file, including the records with a disconnected number or an owner who moved two years ago, and you find out which is which only after you dial. The API inverts that — records go in, and credits are charged only for the records that come back with data, so a miss costs nothing instead of costing the same as a match. Against a dedicated skip trace vendor — most of the ones in our skip tracing cost guide also bill per hit — the billing model is a wash and the comparison is simply price per match: the Ava Data skip tracing API is 2¢ for a phone, 4¢ for phone plus email, 20¢ for a Deep Search, with no minimum order. That guide puts every published rate in one table, with the date we pulled those prices from each vendor's pricing page, so you can run the arithmetic against your own list.
How is this different from BatchData or other skip tracing APIs?
The difference is packaging, not just price. BatchData is the developer-facing API in the Batch product family, sold as its own product with its own signup and its own pricing plan — a subscription to a sibling product like BatchLeads does not include API access. Ava Data's API is not a second product: it is the same account, the same login, and the same credit balance the web app uses, billed at the same published per-match rates — 2¢ for a matched phone, 4¢ for phone plus email, 20¢ for a Deep Search — on the same $9/month plan, with no usage minimum on calls. A single lookup is a valid month. Keys are generated from Settings → API Access once API access is enabled on your account; email support@avadata.ai to have it turned on. We will not characterize anyone else's data quality here — for published prices and the date they were sourced, see our skip tracing cost guide, and our BatchLeads comparison for the Batch family's plan tiers.
What is the rate limit on the skip trace API?
60 requests per minute per API key, counted across every endpoint rather than per endpoint. Past that the call returns 429 with the standard error body — { "success": false, "error": "..." } — so back off and retry instead of opening more connections, since the limit follows the key.
To move more volume than 60 synchronous calls a minute can carry, the asynchronous bulk CSV path is the intended route for Standard Search work: POST /api/v1/bulk/upload as multipart/form-data with a file (CSV, header row required) and a dataTypes field such as ["phone","email"], then poll GET /api/v1/bulk/{jobId}/status and pull the results from GET /api/v1/bulk/{jobId}/download — add ?format=csv for a CSV instead of the default JSON. Deep Search has no bulk equivalent, so high-volume Deep Search runs pace themselves against the same 60-per-minute limit. See Bulk Skip Tracing for the full flow and the API reference for every error code.
Where the API fits in an investor workflow
The API is the data layer under whatever acquisition strategy you run. Building a subject-to pipeline means skip tracing pre-foreclosure lists before the auction date. Gator lenders use single Deep Searches to verify the parties on a contract before funding an EMD. Driving-for-dollars routes produce address lists that become call lists only after you find the owner of each property and run a trace. Whatever the method, the workflow is the same: list in, verified phones out, dial.