Move Contacts in Bulk
Move many contacts out of one list and into another in a single call.
POST /move_contacts_bulk
Moves many contacts out of listname and into destination_listname in one call. Same matching and the same merge behaviour as Move a Contact.
Headers
Content-Type
application/json
Body
api_key
string
Required. Your API key.
listname
string
Required. The list the contacts are in now.
destination_listname
string
Required. The list to move them to.
create_destination
boolean
Default true. Creates the destination list when it does not exist.
dry_run
boolean
Default false. When true, reports what would move and moves nothing.
contacts
array of objects
The precise shape. Each entry carries one contact's own identifiers.
emails
array of strings
Email addresses to move.
person_linkedin_urls
array of strings
LinkedIn profile URLs to move.
person_names
array of strings
Full names to move. A name shared by two people moves both.
organization_names
array of strings
Company names. Moves every row at that company, which is the point of the field.
domains
array of strings
Company domains to move.
company_linkedin_urls
array of strings
Company LinkedIn page URLs to move.
Pass at least one contact, in contacts or in one of the arrays. Passing none returns 422. The two shapes can be mixed in one call.
Which shape to use
Use the flat arrays when you hold a list of one kind of value — a column of emails, a column of LinkedIn URLs. Each value becomes a contact of its own.
Use contacts when a name needs its company beside it, so the two travel together rather than being paired up by position across two arrays. Each entry accepts email, person_linkedin_url, person_name, organization_name, domain, company_linkedin_url and place_id.
Limits
Up to 5,000 contacts and 10,000 matching rows in one call. Past either, the call is refused rather than quietly truncated — move them in batches.
Response
The same fields as Move a Contact, totalled across the whole call.
status
success, or not_found when nothing in the source list matched.
data.list_name
The list the contacts came from.
data.destination_list_name
The list they went to.
data.destination_created
true when the destination did not exist and was made.
data.rows_matched
How many contacts matched.
data.rows_moved
How many moved. 0 on a dry run.
data.rows_merged
How many were folded into contacts the destination already had. Part of rows_moved.
data.matched_on
Which identifier fields were used across the call.
data.dry_run
Whether this was a dry run.
credits_used
Always 0.
Example
The two shapes are mixed here: one contact identified by email, one by name plus company. matched_on lists both fields that were used.
Moving contacts back
A move back is just another move, with the two list names swapped. Send create_destination: false so a typo in the list name fails loudly instead of creating a new list.
No match
A call that matches nothing answers status: not_found with rows_matched: 0 and the message No contacts in this list matched. Nothing moved and nothing was charged.