CRM pack

Leads CSV import API

Import sales leads from CSV. Email-validated, source/status enum-bounded, multilingual headers handled.

low riskleads_v1
30-second curl
curl -X POST https://api.adaptivmapr.com/v1/uploads \
  -H "Authorization: Bearer $ADAPTIVMAPR_API_KEY" \
  -F "template=leads_v1" \
  -F "file=@your_data.csv"
→ 9 canonical fields · 2 validated · low risk

Canonical columns

The whole schema, printed as it ships.

Every canonical column, the type each row carries, whether it is required, the field-level validators that fire on commit, and the multilingual header hints the cascade resolves against. This is the shipped definition, not a summary of it.

leads_v1
fields
9
required
2
validated
2
hints
33
Canonical columnTypeRequiredValidatorsHeader hints the cascade matches
idstringyesmatched on the column name
emailemailyesemaile-mailmailcorreocourriel
first_namestringvornameprenomprénomnombregiven name
last_namestringnachnamenomcognomeapellidosurname
companystringunternehmenfirmasociétéaziendaempresa
phonephonephonetelefontéléphonetelefonophonemobile
sourceenumorganicpaidreferraleventcold_outreachotherquellesourcefonteorigenorigine
statusenumnewcontactedqualifiedunqualifiedconvertedstatusstatutstatoestado
created_atdatematched on the column name

Read the same definition as JSON at GET /v1/templates/leads_v1. A hint match resolves on layer 2 — no LLM call, no token spend, just the flat per-map fee. Hover a validator id to see what it checks.

  • 9 canonical fields
  • 2 required
  • 2 validated
  • 33 header hints, 5 languages

Why it exists

Written for the file you actually receive.

The Leads template is the schema for the top of the funnel: contacts who have signalled interest but are not yet attached to a sales process. Each row carries an id, a validated email, optional first and last name, an optional company, an optional phone, a source enum (organic / paid / referral / event / cold_outreach / other), a status enum that walks the lead through new → contacted → qualified → unqualified → converted, and a created_at timestamp. Sales-ops teams use this template for monthly enrichment imports, for migrating between marketing-automation tools, and for backfilling a fresh CRM with a year of dormant leads. The status enum is intentionally narrow — anything more nuanced belongs in opportunities, not leads. The cascade resolves multilingual "Quelle / source / fuente / origen" without an LLM call.

Email is required because lead deduplication universally happens on email. Phone is validated as a phone shape but not E.164-normalised — that's a downstream concern. Source defaults to "other" if blank in the source file; status defaults to "new". The created_at field tolerates ISO, US, and EU formats.

Migration scenarios & the foreign headers they ship

Migration scenarios for the Leads template: monthly enrichment imports from Clearbit / ZoomInfo / Apollo, marketing-automation migrations (Pardot → HubSpot, Mailchimp → Customer.io), backfilling a fresh CRM with a year of dormant leads from a spreadsheet, post-tradeshow imports from a badge-scan CSV, and re-engagement uploads from a paused outbound list. Foreign headers we see weekly: "Email / E-Mail / Correo / Courriel / Mail / Vorname / Prénom / Nombre / Nachname / Nom / Apellido / Unternehmen / Société / Empresa / Azienda / Quelle / Source / Origine / Origen / Status / Statut / Stato / Estado / Erstellt / Created / Fecha". The status enum walks the funnel in a way that maps cleanly to Salesforce, HubSpot, and Pipedrive defaults — cross-CRM migrations land with minimal manual reconciliation.

The cascade

Five layers, and the cheapest one wins.

Layers run in order and stop the moment a column resolves. That is the single biggest cost lever in the system: a column caught on layer 2 never reaches the metered layer 5.

  1. L1Statisticsno LLM

    Auto-accepts a header that past confirmations already resolved the same way, at {minN:100, minRatio:0.95} or {minN:20, minRatio:1.00}.

  2. L2Heuristicno LLM

    Normalises accents, punctuation and whitespace, then compares against the column name, the label, and every registered hint (DE / FR / IT / EN / ES).

  3. L3Fuzzyno LLM

    Token-set ratio plus Levenshtein over the normalised strings. Auto-accepts at 0.80 — it absorbs typos and reordered words.

  4. L4Semanticcheap, cached

    Embedding cosine between the header and the field’s label + hints. Catches the long tail of paraphrases.

  5. L5LLMmetered

    Everything still unresolved goes up in ONE batched, collision-aware call, constrained to this template’s column set so it cannot invent a field.

Try it

One template id, two ways in.

REST for your import pipeline, MCP for your editor. Both run the same cascade and both honour the same schema-only clamp.

REST · POST /v1/uploads

Name the template; the cascade picks up the rest. The canonical definition is read-only at GET /v1/templates/leads_v1.

bash
curl -X POST https://api.adaptivmapr.com/v1/uploads \
  -H "Authorization: Bearer $ADAPTIVMAPR_API_KEY" \
  -F "template=leads_v1" \
  -F "file=@your_data.csv"
→ upload created · mappings ready · confirm before commit

MCP · Cursor / Claude Desktop

Drop AdaptivMapr into your editor and call the same cascade as a tool. Schema-only calls leave only column names and up to three clamped sample rows.

mcp
// In Cursor or Claude Desktop with the AdaptivMapr MCP server installed:
adaptivmapr.match_headers({
  template_id: "leads_v1",
  headers: ["id", "email", "first_name", "last_name"]
})
schema-only · headers and ≤3 rows, 80 chars each
MCP install instructions

Questions

Leads CSV import — FAQ

Fork and replace the enum. The canonical set is deliberately narrow so cross-system reconciliation works without translation tables.
No — email is required because every downstream system upserts on email. Phone-only leads belong in a separate table or need a synthetic email placeholder.
Add `utm_source`, `utm_medium`, `utm_campaign` via a fork. The canonical template stays narrow; UTM tracking is per-team.
No — enrichment is a separate step that runs after import (ZoomInfo, Apollo, Clearbit, or your in-house enrichment service). The Leads template just guarantees the row is clean enough for an enrichment pipeline to consume.

Ready when you are

Map leads in production — without shipping raw records.

Schema-only mode leaves only headers and a handful of clamped samples. Add full-data when you need row-level AI, routed in-region under a BAA.

No free tier · $10 prepaid wallet to start · every map draws a small flat fee, deterministic ones included