Import contacts

Most lists start life somewhere else — a CRM export, a spreadsheet, a phone’s address book. The importer takes the three shapes those produce, shows you exactly what it’s about to create before it creates anything, and never silently duplicates a number you already have.

Formats

A header row with these column names; only name and primary_phone are required.

contacts.csv
name,primary_phone,email,company,tags,notes,timezone,language
Ada Lovelace,+442071234567,ada@example.com,Analytical Engines,vip|renewal-q4,Prefers mornings,Europe/London,en
Grace Hopper,+12025550143,grace@example.com,,lead,,America/New_York,en
ColumnRequiredNotes
nameyes
primary_phoneyesE.164, or a local number with defaultCountryCode set
secondary_phonespipe-separated |
email, company, occupation
notesup to 5,000 characters
tags, interestspipe-separated |
timezoneIANA; derived from the phone number if omitted
languagedefault en

Phone numbers

Numbers are validated as E.164 and stored that way. A file with local numbers (020 7123 4567) imports cleanly if you set a default country code (44); numbers that already start with + are left alone. A number that can’t be parsed is reported as an error for that row; the rest of the file still imports.

Duplicates

A contact whose primary phone already exists in your account is a duplicate and is skipped — the existing record is untouched. The same check runs within the file, so a list with the same number on two rows creates one contact. The summary tells you how many were skipped and which.

Preview, then import

1

Upload the file

Call Center → Contacts → Import, choose the file. The format is detected from the extension; set the default country code if the numbers are local.

2

Read the preview

The importer parses everything and shows what would happen — rows to create, rows skipped as duplicates, rows with errors and why — without writing anything. Fix the file and re-upload if the numbers look wrong.

3

Confirm

The import runs and the summary reports contacts created, skipped and errored.

From the API the same two-step shape: POST /contacts/import with the file base64-encoded, confirmed: false for the preview, then confirmed: true to run it.

POST
/api/v1/contacts/import
curl -X POST https://api.talkif.ai/api/v1/contacts/import \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"fileContent": "Sm9obiBEb2UsKzE1NTUxMjM0NTY3",
"format": "vcf"
}'

Tag on the way in. A tags column with the campaign name (renewal-q4) means the list is ready to add to a campaign by filter the moment the import finishes — no second pass.

Next