Skip to main content
POST
Import contacts from CSV

Authorizations

X-API-Key
string
header
required

API key with format cs_live_xxx

Body

multipart/form-data
file
file
required

CSV file containing contacts

mapping
string
required

JSON object mapping lead field names to CSV column headers, e.g. {"email": "email_address", "custom_city": "City"}

list_id
string<uuid> | null

Add imported contacts to this static list

filename
string | null

Origin name to record as source_name

Response

Import completed

Outcome of a directory-level CSV import.

contacts_created and contacts_matched split the imported rows into new people and people the team already had, which is the distinction decision 10 turns on: a team-wide upsert means re-importing the same file enriches the directory instead of duplicating it.

Blocked addresses are reported, not withheld. Nothing created here can send; the blocklist is enforced at the point a campaign membership is created. Surfacing the count lets the UI warn that part of a freshly imported list will not be mailable.

batch_id
string<uuid>
required
total_rows
integer
required

Data rows found in the file

imported_rows
integer
required

Rows with a usable address

skipped_rows
integer
required

Rows dropped as unusable (missing or invalid email)

contacts_created
integer
required
contacts_matched
integer
required

Rows that updated a contact the team already had

added_to_list
integer
default:0
list_id
string<uuid> | null
blocked_count
integer
default:0
blocked_entries
Blocked Entries · object[]