Import Contacts

Adds contacts to an ICP. Contacts already in the ICP are not added again, so re-sending the same list is safe; the response reports how many were genuinely new. Re-sending does update their details and their per-contact copy (emails).

If the ICP has a PER_CONTACT sequence step, every new contact must include emails copy for it, or the whole import is rejected with a 400. A contact already in the ICP only needs copy it has not been given before. See Per-contact copy.

Imports of more than 100 contacts finish asynchronously, and the response comes back with isBackgroundProcessing: true and the remainder land over the following minutes.

Emails are built for you after an import. TEMPLATE and PER_CONTACT steps are built for every imported contact. An AI step is written for every contact on an import of up to 100 valid, deduplicated contacts; on a larger import only the first 10 are written, so you can review the copy before spending AI credits on the rest.

Follow the response's nextActions. For a background import, poll List Imports for uploadSummary.id until its status is COMPLETED; FAILED is not completion. Then review the preview using List Prospects In An ICP and Get Email, and call Process Step Emails with mode: MISSING for each step whose emailGeneration.steps[].requiresExplicitRun is true and which still has missing emails. It fills gaps across the ICP, including older imports, while preserving successful copy. Each AI email generated costs 1 AI credit. Poll Get Step Email Status every 10 seconds to track generation. Import completion only means contacts have landed, not that validation or email generation has finished.

Prospects without a built email are not sent to. Use mode: FAILED on Process Step Emails to retry generation failures after fixing their cause. A full Rebuild Step Emails rewrites existing unsent copy too; use that after a configuration change.

Email validation is charged against the workspace's validation credits at import: 1 credit for every contact that is new to the workspace or not yet verified, including contacts already in this ICP that are still unverified. If the balance does not cover the whole list, nothing is imported and the request fails with a 400. Call Preview Import Deduplication first to see the cost and which rows to drop to fit the balance. Sending credits are charged per email at send time, not here.

Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…
Path Params
string
required

Get this from Settings > Workspaces. Starts with "account_"

string
required

Get this from Settings > Workspaces > Workspace ID column of the workspace you want.

Body Params
string
required

ICP to add the contact to. You can get the ICP ID from the ICPs page in the Sender Pools Dashboard

contacts
array of objects
required
contacts*
tags
array of strings
tags
string

Some context to describe this uploaded list of contacts.

string
Defaults to America/Chicago

ie "America/Los_Angeles". Any of the timezone names listed here are valid: https://github.com/vvo/tzdb/blob/main/raw-time-zones.json

string
enum
Defaults to BRANDED

GENERIC: Only send from generic mailboxes. BRANDED: Only send from branded mailboxes. SPLIT: 50% generic, 50% branded

Allowed:
boolean
Defaults to false

Send on weekends?

Responses

400

Invalid input, missing per-contact copy, or not enough validation credits for the whole list (nothing is imported).

Language
Credentials
Bearer
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json