Batch enrichment — parallel API, not a batch upload

Use when the user asks for a batch API, bulk enrichment, CSV upload, or enriching hundreds of leads overnight.

What exists today

Yes — there is a full REST + MCP API at https://411data.io/api/v1/* (see api_integrations, /developers, /openapi.json).

CSV upload — yes: managed batch at POST /api/v1/batch/enrich/upload and /batch. Recipe: batch_csv_enrich.

Headless parallel REST — yes: no file required; queue rows in your app (below).

Yes — there is an async job queue for long-running enrich work:

Endpoint Role
POST /api/v1/enrich/jobs Submit enrich/websearch or enrich/lead-session; returns 202 + poll_bearer
GET /api/v1/enrich/jobs/{job_id} Poll status/result (free)

Recipe: async_enrich_jobs. Default spending ceiling $1.50; override bill_up_to_usd up to $50.

Sync enrich routes (phone, person, websearch, lead-session) return full JSON on one HTTP connection. Lead-session sync calls often run 30–180 s — use the queue when you do not want to hold the connection open.

Route Shape Typical latency
POST /api/v1/enrich/lead-session (sync) One CRM lead object 30–180 s
POST /api/v1/enrich/jobs (async) Same payloads, fire-and-poll worker-bound
POST /api/v1/enrich/phone / /person One phone or person query ~1–3 s
POST /api/v1/enrich/websearch (sync) One business-name hunt ~5–30 s
  1. CSV file — use batch_csv_enrich (/batch or enrich-agent paperclip).
  2. Queue in your app — read rows from your CRM export; parallel sync or async jobs (below).
  3. Long rows — submit via POST /api/v1/enrich/jobs + poll (or callback_url + enrich.job_completed).
  4. Short rows — worker pool of sync calls (start with 5–10 concurrent; back off on 429).
  5. Balance checkGET /api/v1/agents/balance before large runs; prepay_deposits if headless.
  6. Idempotency — dedupe by contact_id / email / phone in your queue; reuse agent_cache warm-seed when the same lead was hunted recently.
  7. Push on completion — subscribe to event_callbacks (enrich.job_completed, lead.session_completed, enrich.completed) so workers advance the queue from webhooks instead of blocking on poll.
  8. Usage keys — issue scoped 411k_ keys for automation at /connect?action=usagekeys.

Building a list (not enriching yet)

Use leads_search with tight filters + limit ≤ 25 on the first probe, then paginate with cursor. See leads_search_filters.

What to tell the user