CRM pack

Accounts CSV import API

Import account (company-level) CRM records from CSV. URL-validated, ARR-banded, multilingual industry hints.

low riskaccounts_v1
30-second curl
curl -X POST https://api.adaptivmapr.com/v1/uploads \
  -H "Authorization: Bearer $ADAPTIVMAPR_API_KEY" \
  -F "template=accounts_v1" \
  -F "file=@your_data.csv"
→ 7 canonical fields · 1 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.

accounts_v1
fields
7
required
2
validated
1
hints
22
Canonical columnTypeRequiredValidatorsHeader hints the cascade matches
idstringyesmatched on the column name
namestringyesfirmaunternehmensociétéaziendaempresa
domainstringurlwebsitewebsitio weburl
industrystringbrancheindustrieindustriasector
employee_countnumbermitarbeiteremployésdipendentiempleadosstaff
countrystringlandpayspaesepaís
arr_bandenumunder_100k100k_1m1m_10m10m_100mover_100mmatched on the column name

Read the same definition as JSON at GET /v1/templates/accounts_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.

  • 7 canonical fields
  • 2 required
  • 1 validated
  • 22 header hints, 5 languages

Why it exists

Written for the file you actually receive.

The Accounts template is the company-level CRM row — the parent of contacts and opportunities. Each row carries an id, the company name, a domain (validated as a URL), an industry string, an employee_count number, a country, and an ARR band (under_100k / 100k_1m / 1m_10m / 10m_100m / over_100m). The ARR band is a banded enum rather than a raw number because most sources do not have precise ARR — they have a range from a data provider. Sales-ops teams use the Accounts template to import enriched data from Clearbit, ZoomInfo, or LinkedIn Sales Navigator; to seed a fresh CRM with a target-account list; and to refresh segmentation before a campaign. The domain validator catches missing scheme, missing TLD, and typos like "https//example.com" before they pollute downstream lookups.

employee_count is a number, not a band, because employee count is usually known precisely from public sources. ARR is a band because revenue estimates are noisy; pretending to precision invites misranking accounts. Country is a free string; ISO-3166 normalisation happens downstream.

Migration scenarios & the foreign headers they ship

Migration scenarios for the Accounts template: ABM target-account list uploads from a freshly-defined ICP, quarterly Clearbit / ZoomInfo refreshes of the existing book, CRM platform migrations where the account hierarchy must survive intact, and post-acquisition reconciliation when two go-to-market motions need to merge into one account model. Foreign headers we see routinely: "Account / Konto / Firma / Société / Empresa / Azienda / Domain / Website / URL / Sitio Web / Branche / Industrie / Industria / Sector / Mitarbeiter / Employés / Empleados / Dipendenti / Land / Pays / País / Paese / ARR / Annual Revenue / Umsatz". The URL validator catches typos in domain columns (missing scheme, missing TLD, "www" only) before they pollute the downstream enrichment pipeline.

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/accounts_v1.

bash
curl -X POST https://api.adaptivmapr.com/v1/uploads \
  -H "Authorization: Bearer $ADAPTIVMAPR_API_KEY" \
  -F "template=accounts_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: "accounts_v1",
  headers: ["id", "name", "domain", "industry"]
})
schema-only · headers and ≤3 rows, 80 chars each
MCP install instructions

Questions

Accounts CSV import — FAQ

No industry taxonomy is universal. NAICS, SIC, GICS, and Clearbit's own taxonomy all disagree. The canonical row stays free-text; teams normalise downstream against the taxonomy they care about.
Add a `parent_account_id` via a fork. The canonical row is flat; hierarchies are CRM-specific.
One row per legal entity. If your CRM models global parents, denormalise downstream — the canonical row stays one-company-one-row.
Yes — domain is optional. Long-tail accounts (private companies, sole traders, regulated industries without a public web presence) often arrive without one. The URL validator only runs when a value is present.

Ready when you are

Map accounts 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
Accounts CSV import API — AdaptivMapr — AdaptivMapr