curl --request POST \
--url https://api.tryfuse.ai/api/v1/business/imports \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"importId": "<string>",
"listId": "<string>",
"listName": "<string>",
"mapping": {}
}
'import requests
url = "https://api.tryfuse.ai/api/v1/business/imports"
payload = {
"importId": "<string>",
"listId": "<string>",
"listName": "<string>",
"mapping": {}
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({importId: '<string>', listId: '<string>', listName: '<string>', mapping: {}})
};
fetch('https://api.tryfuse.ai/api/v1/business/imports', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"import": {
"importId": "dXBsb2Fkcy82ODU0MGY4YmI1NWU5OTYyODE3MGM3NTcvZmU2NWZmZmEtNDllYi00ODk1LWE2YTgtOTBiNWI0N2I4YzhiLmNzdg",
"filename": "leads.csv",
"rowCount": 1240,
"headers": [
"First Name",
"Last Name",
"Email",
"Company",
"Tel",
"Deal stage"
],
"sampleRows": [
{
"First Name": "Sam",
"Last Name": "Rivera",
"Email": "sam@brightpay.com",
"Company": "Brightpay",
"Tel": "+13015023231",
"Deal stage": "Discovery"
},
{
"First Name": "Ada",
"Last Name": "Nwosu",
"Email": "ada@brightpay.com",
"Company": "Brightpay",
"Tel": "+13015023232",
"Deal stage": "Proposal"
}
],
"suggestedMapping": {
"First Name": "First Name",
"Last Name": "Last Name",
"Email": "Email",
"Company": "Company",
"Tel": "Phone",
"Deal stage": null
}
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}Start an import (parse + suggested mapping)
Starts an import from a spreadsheet. Two intake shapes: a multipart request carrying the file (CSV/XLS/XLSX, ≤10MB — larger files go through POST /business/imports/presign first) or a JSON body naming a presigned upload’s importId. Without a destination the call parses the file and answers 200 with the mapping-confirmation payload — rowCount, the detected headers, up to five sampleRows, and suggestedMapping (source header → standard field label such as First Name, Email, Company; null when nothing was suggested) — to confirm via POST /business/imports/{importId}/commit. With listId or listName (plus optional mapping and enrich) the import commits in the same call and answers 202 { import: { importId, listId, jobId } }. Parsing spends no credits; enrichment chosen with enrich bills as POST /business/lists/{listId}/enrich does.
Errors:
400IMPORT_FILE_MISSING— Neither a multipart file part nor an importId was sent.404IMPORT_NOT_FOUND— importId does not decode to an upload of the token owner, or the uploaded object is gone.404LIST_NOT_FOUND— One-call flow: the destination listId is unknown or not owned.409LIST_NAME_AMBIGUOUS— One-call flow: more than one list carries listName — reference the destination by id.422IMPORT_FILE_UNSUPPORTED— The multipart Content-Type is not CSV/XLS/XLSX, or the file could not be parsed.422IMPORT_FILE_TOO_LARGE— Multipart file over 10MB, or a presigned object over 50MB.422IMPORT_FILE_EMPTY— The file has no data rows.422LIST_NAME_RESERVED— One-call flow: listName is a system/dynamic list title and cannot be a destination.422VALIDATION_FAILED— Both listId and listName sent, an unknown body key, or an invalid enrich mode.429RATE_LIMITED— The lists rate bucket (120 requests/minute, 10,000/day per token owner) is exhausted.
Requires one of the following token scopes: lists.
curl --request POST \
--url https://api.tryfuse.ai/api/v1/business/imports \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"importId": "<string>",
"listId": "<string>",
"listName": "<string>",
"mapping": {}
}
'import requests
url = "https://api.tryfuse.ai/api/v1/business/imports"
payload = {
"importId": "<string>",
"listId": "<string>",
"listName": "<string>",
"mapping": {}
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({importId: '<string>', listId: '<string>', listName: '<string>', mapping: {}})
};
fetch('https://api.tryfuse.ai/api/v1/business/imports', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"import": {
"importId": "dXBsb2Fkcy82ODU0MGY4YmI1NWU5OTYyODE3MGM3NTcvZmU2NWZmZmEtNDllYi00ODk1LWE2YTgtOTBiNWI0N2I4YzhiLmNzdg",
"filename": "leads.csv",
"rowCount": 1240,
"headers": [
"First Name",
"Last Name",
"Email",
"Company",
"Tel",
"Deal stage"
],
"sampleRows": [
{
"First Name": "Sam",
"Last Name": "Rivera",
"Email": "sam@brightpay.com",
"Company": "Brightpay",
"Tel": "+13015023231",
"Deal stage": "Discovery"
},
{
"First Name": "Ada",
"Last Name": "Nwosu",
"Email": "ada@brightpay.com",
"Company": "Brightpay",
"Tel": "+13015023232",
"Deal stage": "Proposal"
}
],
"suggestedMapping": {
"First Name": "First Name",
"Last Name": "Last Name",
"Email": "Email",
"Company": "Company",
"Tel": "Phone",
"Deal stage": null
}
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}Authorizations
Your API token (af_…) as the Basic-auth username, with an empty password.
Body
The importId returned by POST /business/imports/presign, once the file has been PUT to its uploadUrl; omit when the file is sent as a multipart part of this request.
8 - 80024-character hex id of an existing contact list to append the rows to; mutually exclusive with listName, and an unknown or non-owned id answers 404 LIST_NOT_FOUND.
Name of the destination contact list (1-255 characters): an existing list with this exact name (case-insensitive) is reused, otherwise it is created; mutually exclusive with listId. Two lists sharing the name answer 409 LIST_NAME_AMBIGUOUS and reserved system titles answer 422 LIST_NAME_RESERVED.
1 - 255Column mapping from source column header to target field, e.g. {"fname": "First Name"} (up to 200 entries). Each key is a column header spelled exactly as it appears in the file (the headers of the import preview). Each value is one of exactly these 21 target labels, spelled and cased exactly like this: Full Name, First Name, Last Name, LinkedIn URL, Company, Company Domain, Job Title, Job Level, Department, Industry, Country, State, City, Email, Phone — plus six aliases, each read only when the label it follows is missing or empty: Company Name (after Company), Mobile Phone (after Phone), Seniority then Level (after Job Level), and linkedinUrl then linkedin (after LinkedIn URL). Map to the primary label where you can. A label outside those 21 is ACCEPTED and then silently drops that column — no error, no custom column. Headers that already match a label case-insensitively (email, first_name, title, domain) need no entry, a header with no target carries null and is ignored — so the suggestedMapping from POST /business/imports can be sent back unchanged — and when two headers name the same target only the last one is used.
Enrichment to run on the imported rows: none (default, rows saved exactly as uploaded), email, phone or phone_and_email (the enrichment waterfall, billed per contact processed) or demographics (resolve rows to canonical contacts, 2 credits per resolved contact).
none, email, phone, phone_and_email, demographics Response
Success
Show child attributes
Show child attributes