Leads CSV import API

leads_v1

low9 fields · 2 required · 2 validatedPack · CRM

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

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"

At a glance

Pack
CRM
FHIR resource
Risk level
low
Fields
9 (2 required, 2 validated)

Why this template?

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 & common foreign headers

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.

Schema

The canonical column set, with 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.

ColumnTypeRequiredValidatorsHints
idstringyes
emailemailyesemaile-mail · mail · correo · courriel
first_namestringvorname · prenom · prénom · nombre · given name
last_namestringnachname · nom · cognome · apellido · surname
companystringunternehmen · firma · société · azienda · empresa
phonephonephonetelefon · téléphone · telefono · phone · mobile
sourceenumquelle · source · fonte · origen · origine
statusenumstatus · statut · stato · estado
created_atdate

How AdaptivMapr maps your headers to this template

Five layers run in order, cheapest first. Layer 1 (Statistics) auto-accepts headers that have been mapped the same way across past uploads. Layer 2 (Heuristic) compares your header to the column name, the optional label, and every registered hint (DE / FR / IT / EN / ES) after a Unicode-and-punctuation-normalising pass. Layer 3 (Fuzzy) catches typos and reordered words. Layer 4 (Semantic) uses cached embeddings to catch the long tail of paraphrases. Layer 5 (LLM) only fires on genuinely ambiguous columns, constrained to the template’s allowed column set so it cannot invent a field. When a layer auto-accepts, the lower-cost layers below it never run — that is the cost lever.

REST · POST /v1/uploads

Pass the template_id; the cascade picks up the rest.

curl -X POST https://api.adaptivmapr.com/v1/uploads \
  -H "Authorization: Bearer $ADAPTIVMAPR_API_KEY" \
  -F "template=leads_v1" \
  -F "file=@your_data.csv"

The canonical template definition is read-only at GET /v1/templates/leads_v1.

MCP · Cursor / Claude Desktop

Drop AdaptivMapr into your IDE. Schema-only calls are free and unlimited.

// In Cursor or Claude Desktop with the AdaptivMapr MCP server installed:
adaptivmapr.match_headers({
  template: "leads_v1",
  headers: ["id", "email", "first_name", "last_name"]
})
MCP install instructions →

FAQ — Leads CSV import

How do I extend source for paid channels (Google Ads, LinkedIn, etc.)?

Fork and replace the enum. The canonical set is deliberately narrow so cross-system reconciliation works without translation tables.

Can I import leads without an email?

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.

What about UTM parameters?

Add `utm_source`, `utm_medium`, `utm_campaign` via a fork. The canonical template stays narrow; UTM tracking is per-team.

Does AdaptivMapr enrich the leads automatically?

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.

Keep exploring

Browse other templates in the CRM pack