Accounts CSV import API
accounts_v1
Import this template via API. Import account (company-level) CRM records from CSV. URL-validated, ARR-banded, multilingual industry hints.
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"
At a glance
- Pack
- CRM
- FHIR resource
- —
- Risk level
- low
- Fields
- 7 (2 required, 1 validated)
Why this template?
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 & common foreign headers
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.
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.
| Column | Type | Required | Validators | Hints |
|---|---|---|---|---|
| id | string | yes | — | — |
| name | string | yes | — | firma · unternehmen · société · azienda · empresa |
| domain | string | — | url | website · web · sitio web · url |
| industry | string | — | — | branche · industrie · industria · sector |
| employee_count | number | — | — | mitarbeiter · employés · dipendenti · empleados · staff |
| country | string | — | — | land · pays · paese · país |
| arr_band | enum | — | — | — |
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=accounts_v1" \ -F "file=@your_data.csv"
The canonical template definition is read-only at GET /v1/templates/accounts_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: "accounts_v1",
headers: ["id", "name", "domain", "industry"]
})MCP install instructions →FAQ — Accounts CSV import
Why is industry not an enum?
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.
How do I handle parent / subsidiary relationships?
Add a `parent_account_id` via a fork. The canonical row is flat; hierarchies are CRM-specific.
What about multi-headquarter companies?
One row per legal entity. If your CRM models global parents, denormalise downstream — the canonical row stays one-company-one-row.
Can I import accounts without a domain?
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.