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 matched phone 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 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 file can contain any number of rows; there is no minimum batch size. - Step 2 — Processing. Each row is run through the same identity graph used by the single-record API — daily-refreshed, PI-grade data. 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— JSON by default, or add?format=csvfor a CSV file. Each record mirrors your uploaded columns plus the appended phone and email data, and the job totals come back asnumRecords,numMatches, andcreditsCharged. Rows with no match come back without appended contact data and are never charged.
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 one column the engine can anchor on: address is the only required field. Everything else narrows the match rather than enabling it. Ava Data's 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.
| Column | Required | What it does |
|---|---|---|
address | Yes | The street address the identity graph anchors the search on. |
firstName / lastName | No | Separates your owner from everyone else at or near that address. A common surname without a first name is the most frequent cause of an ambiguous row. |
city, state, zip | No | Disambiguate duplicate street names across a metro area. |
Alongside the file you send a dataTypes value — a JSON array string, ["phone"], ["email"], or ["phone","email"] — which sets both what is appended and what each match costs: 1 credit per data type per matched record.
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.
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.
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.
Credits are reserved when the job starts and reconciled when it ends. The upload response reports recordCount and creditsPerMatch, an estimate is held against your balance, and the hold is adjusted down to the actual numMatches on completion — so 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 JSON or ?format=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 bill identically and draw on the same balance, 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.
Pricing
| 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 →
Bulk processing uses the Standard pricing tier: 1 credit per match for phone only, 2 credits per match 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.
- 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. The only required column is address; firstName, lastName, city, state and zip are optional and narrow the match. Your headers do not have to match Ava Data's — the upload step previews the file and lets you map your own column names onto the fields.
How many records can one bulk skip tracing file contain?
Up to 250,000 records 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¢) per matched phone, or 2 credits (4¢) for phone plus email — charged per match, not per row. Rows that return no match cost nothing. The $9/month plan includes 100 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 adjusted down to the actual number of matches when it completes, 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.