Bulk Skip Tracing
Bulk Skip Tracing — Batch CSV Processing, Pay Per Match
Bulk skip tracing runs a whole CSV through one job instead of one search at a time. Upload a file of names and addresses — up to 250,000 records — map its columns, and download it back with phones and emails appended. Ava Data charges 1 credit (2¢) per match and nothing for rows that return no match.
What is Bulk Skip Tracing?
Bulk skip tracing — sometimes called batch skip tracing — is the practice of running an entire list of people through a skip trace engine in one job rather than querying records one at a time. Real estate investors, property managers, lenders, and sales operations teams use bulk skip tracing to enrich large lead lists before handing them off to dialers or outbound email sequences.
The key quality difference between bulk providers is when and how they charge. Most legacy vendors charge per row — meaning you pay full price for disconnected numbers, wrong addresses, and records the system simply could not match. Ava Data charges per match. If a row in your CSV doesn't return a verified phone or email, you owe nothing for that row.
Internal links: Skip Tracing API · Skip Tracing for Real Estate Investors · Contact Enrichment API · Bulk Skip Tracing glossary · Driving for Dollars · How often teams buy data · Skip tracing cost calculator
How Ava Data's Bulk Processing Works
The bulk workflow is asynchronous — upload, wait, download:
- Step 1 — Upload your CSV. Map columns to fields (first name, last name, address, city, state) through the dashboard's column-mapping UI, or POST the file to
/api/v1/bulk/uploadasmultipart/form-datawith afilepart and adataTypespart (a JSON array string such as ["phone","email"]). The API has no mapping step: it reads the header names listed below. A file can hold up to 250,000 rows and 100 MB, and there is no minimum batch size. - Step 2 — Processing. Each row is run through the same identity graph used by the single-record API, which refreshes every 24 hours. The job runs asynchronously; you receive a
jobIdand pollGET /api/v1/bulk/{jobId}/statusfor progress. - Step 3 — Download enriched results. When the job completes, download the results from
GET /api/v1/bulk/{jobId}/download?layout=standard— JSON by default, or add&format=csvfor a CSV file. In the standard layout each row keeps your uploaded columns, in their original order, followed by Match Found, Phone 1–6 with Line Type 1–6, Mobile 1–3, Landline 1–3, and Email 1 onward when email was requested. Withoutlayout=standard, a bulk upload's results come back in their original format, usually the whole results file as one CSV string, so use the standard layout for new integrations. The job totals come back asnumRecords,numMatches, andcreditsCharged. Rows with no match come back with Match Found set to No and are never charged; rows skipped at upload are not in the results, so keep an ID column of your own in the file to join results back.
There is no minimum batch size and no usage minimum on bulk runs. You can upload a list of 10 records or 100,000 records — the per-match pricing is identical either way.
What your CSV needs to contain
A bulk skip tracing file needs a header row, and every row needs one of three combinations to be searchable: first and last name plus ZIP, first and last name plus city and state, or street address plus city, state and ZIP. A single full-name column counts as first and last name, except for company names (LLC, Inc. and the like), which need the full street address, city, state and ZIP. An address column on its own is not enough. Rows that meet none of the three combinations are skipped and never charged, and the upload response counts them in skippedCount.
In the dashboard, the upload step parses the file, previews the first rows, and lets you map your column names onto these fields, so the headers in your export do not have to match ours. The API has no mapping step: it matches the header names below, ignoring case, and ignores every other column for matching, so a column named zip_code or address1 is not read.
| Field | Header names the API reads (any case) | What it does |
|---|---|---|
| First and last name | first name, firstname, first · last name, lastname, last | Separates your owner from everyone else at or near that address. A surname without a first name does not count as a name. |
| Full name | name, full name, fullname, owner name, owner | Used when the file has no first-name or no last-name column, and split into first and last name before the search. |
| Street address | address, street, street address | The street the search anchors on. With city, state and ZIP it is enough on its own, with no name. |
| City, state, ZIP | city · state, st · zip, zipcode, zip code, postal code | Complete the location: a name needs a ZIP or a city and state; a street needs all three. |
Alongside the file you send a dataTypes value — a JSON array string, ["phone"], ["email"], or ["phone","email"], each type listed once — which sets both what is appended and what a row costs: 1 credit for each requested type that comes back for that row.
How to prepare a skip tracing file that processes cleanly
Most failed or disappointing bulk runs trace back to the file rather than the data. Five checks before you upload:
- Start from the template. The dashboard offers a downloadable CSV template — it is the fastest way to a known-good header row if your source export is unusual.
- Split combined address fields. A single column holding "902 Birchwood Dr, Tampa, FL 33604" anchors worse than separate
address,city,stateandzipcolumns. - Split full names. One
ownerNamecolumn containing "COLEMAN DENISE M" is how county exports arrive;firstNameandlastNameis what matches. - Resolve entity owners first. Rows whose owner of record is an LLC or a trust have no person to match. Pull those out and find the officers separately — a skip trace runs against a human, not an entity.
- Deduplicate before you upload, not after. Two rows for the same owner are two matches and two charges. List stacking inside Ava Data collapses duplicates across source lists before the trace runs.
In the dashboard, Ava Data validates the file on upload and warns you if you are re-running a file you have already processed, which is the other common way a batch costs more than it should. The API does not warn on a re-run, so check your own records before you resubmit a file.
How to track a bulk job while it runs
A bulk job reports its own progress rather than leaving you to guess. GET /api/v1/bulk/{jobId}/status returns a status that moves through uploading, queued, processing, and then either completed or failed, alongside progress as a percentage, numRecords, numMatches once they are known, and an errorMessage when a job fails. The dashboard shows the same states for uploads made through the UI, and finished jobs stay in your history to re-download. Each status poll counts toward the key's 60 requests per minute.
Credits are reserved when the job starts and reconciled when it ends. The upload response reports recordCount (the rows that will be searched), creditsPerMatch and, when rows were skipped, skippedCount and skippedReason; an estimate is held against your balance, and when the job finishes the hold is cut to the credits actually used, 1 for each requested data type returned per row; creditsCharged on the JSON download is the final figure. Unmatched rows release their reserved credits rather than being charged and refunded. GET /api/v1/credits shows the reserved balance separately from the available one while a job is in flight.
Bulk skip tracing vs the synchronous API
Both paths query the same identity graph at the same per-match price. The difference is the request budget and the shape of the answer.
| Bulk CSV | Synchronous Skip Tracing API | |
|---|---|---|
| What you send | One file, up to 250,000 records | One JSON body per record |
| Rate limit | Applies to the upload and polling calls, not to each row | 60 requests per minute |
| How you get results | Poll for status, then download with ?layout=standard, as JSON or CSV | In the response to the call |
| Deep Search | Not available — bulk runs Standard Search | Yes, 10 credits per match |
| Best for | Lists, backfills, periodic refresh of an existing database | One record at a time, at the moment it enters your system |
The two modes draw on the same balance at the same per-match rates — the one difference is that a single search charges every requested type on a match, while a bulk row is charged only for the types that come back — so a team commonly uses both: the bulk path for the list it bought or built this week, the synchronous path for each new lead as it arrives. Bulk processing runs Standard Search only — there is no bulk Deep Search, so related-persons work is done record by record on the leads that justify it.
What does bulk skip tracing cost for a large list?
Bulk skip tracing on Ava Data costs at most 2¢ per row for phones and 4¢ per row for phones and emails, because only matched rows are charged. A 100,000-record list traced for phones costs at most $2,000, and one file holds up to 250,000 records:
| Records in the file | Phones, at most | Phones + emails, at most |
|---|---|---|
| 10,000 | $200 | $400 |
| 50,000 | $1,000 | $2,000 |
| 100,000 | $2,000 | $4,000 |
| 250,000 | $5,000 | $10,000 |
Ceilings assume every row matches; rows with no match cost nothing, so the bill is usually lower. The balance must cover the ceiling when a file is submitted, and credits for unmatched rows are released after the job. Add the $9/month plan, which includes 100 credits. One bulk file holds up to 250,000 records.
Lists larger than 250,000 records run as several files at the same per-match price. Your balance — plan credits plus any wallet credits — has to cover the full ceiling when a file is submitted; the credits reserved for rows that return no match are released when the job completes. If the list itself comes from List Builder, the pull adds 1 credit (2¢) per record.
Pricing
| Lookup type | Credits | Price per match | Returns |
|---|---|---|---|
| Standard — Phone Only | 1 | $0.02 | The phone numbers on file, mobile first, each with a line type when known |
| Standard — Phone + Email | 2 | $0.04 | The same phones plus the email addresses on file (2 credits on any match) |
| 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 →
Bulk processing uses the Standard pricing tier: 1 credit when phones come back and 1 when an email does, so at most 2 credits per row for phone + email. Deep Search (10 credits) is available on single-record lookups for cases where you need the related-persons graph on specific high-priority leads.
Why Per-Match Billing Beats Flat-Rate Lists
A real estate investor working an absentee-owner or tax-delinquent list will always find that some share of records returns no usable phone number at all — the person moved, the number was never in any database, or the data provider is serving five-year-old records that predate a disconnection.
Under per-row billing, you pay for all of those misses: every row that comes back empty still costs you the full per-record price. Under Ava Data's per-match model those rows cost zero. Your effective cost per usable phone number is lower — often dramatically so — even if the nominal per-credit price looks similar to a competitor's per-row price.
The daily refresh cycle compounds this advantage. If you're running the same list through a legacy provider every 90 days hoping for updated data, you're paying per-row three or four times a year for records that never improve. With Ava Data, each run queries the current state of the identity graph — if a number connected in the last 24 hours, you get it.
Who Uses Bulk Skip Tracing?
- Real estate investors running driving-for-dollars lists, absentee-owner lists, pre-foreclosure or tax-delinquent lead files. See Skip Tracing for Real Estate Investors →
- Property managers and landlords trying to locate tenants or previous occupants for collections or forwarding mail.
- B2B sales teams enriching CRM exports with direct-dial numbers before a campaign. See Contact Enrichment API →
- Lenders and servicers locating borrowers for loan modification or default outreach.
- Roofing and solar contractors tracing homeowner lists before a calling or texting campaign.
- Skip trace resellers building per-match pricing into their own products via the API.
Frequently asked questions
What format does a bulk skip tracing CSV need to be in?
A CSV with a header row and at least one data row, where each row has one of three combinations: first and last name plus ZIP, first and last name plus city and state, or street address plus city, state and ZIP. Rows that meet none are skipped and never charged. In the dashboard you map your own column names onto the fields; the API has no mapping step and reads fixed header names such as first name, last name, address, city, state and zip.
How many records can one bulk skip tracing file contain?
Up to 250,000 records and 100 MB per bulk file, and there is no minimum — a 10-row file and a 250,000-row file are priced the same per match. Larger jobs are split across multiple uploads.
How much does bulk skip tracing cost per record?
1 credit (2¢) when a row returns phones and 1 credit when it returns an email, so a row that returns both costs 2 credits (4¢) and a row that returns only phones costs 1 — charged per match, not per row. Rows that return no match cost nothing. The $9/month plan includes 100 credits.
What does a 100,000-row bulk file cost?
At most $2,000 for phones on Ava Data — 100,000 rows × 1 credit (2¢) per match — or at most $4,000 for phones and emails at 2 credits (4¢). Rows with no match are not charged, so the bill is usually lower. Your balance must cover the ceiling when the file is submitted; unmatched credits are released when the job completes.
What's the cheapest way to skip trace a list of 500 properties?
On Ava Data, the lowest-cost way to skip trace a list of 500 properties is one bulk CSV upload, phone only, after removing duplicate owners. Each match costs 1 credit (2¢), so the file costs at most 500 credits ($10), and rows with no match cost nothing. The $9/month plan includes 100 of those credits.
How do I know when a bulk job has finished?
Poll GET /api/v1/bulk/{jobId}/status. It returns a status of uploading, queued, processing, completed or failed, a progress percentage, numRecords, numMatches, and an errorMessage if the job failed. The dashboard shows the same states for uploads made through the UI.
Can I run a Deep Search in bulk?
No. Bulk processing runs Standard Search only, which returns phones and emails. Deep Search — the 10-credit lookup that adds the related-persons graph — runs on single records through the dashboard or the synchronous API.
What happens to credits for rows that do not match?
Credits are reserved against your balance when the job is submitted and cut to the credits actually used when it completes (1 for each requested data type returned per row), so unmatched rows release their reserved credits instead of being charged. GET /api/v1/credits reports the reserved balance separately while a job is in flight.