Skip to content

Move Campaign Leads

Move leads from a campaign that is not active into another campaign.

POST/api/v1/campaigns/{campaign_id}/leads/move

Requires an API key with the write scope.

Moves up to 5,000 leads from this campaign into another campaign in your workspace. The leads leave this campaign (their pending sends are cancelled and their progress here is dropped) and start the other campaign's sequence from its first step; if that campaign is active, it starts emailing them on its schedule. A lead that is already in the other campaign stays there and leaves this one. A lead whose address or domain is on the block list is not added and stays here. Ids that are not in this campaign are ignored. The Python and TypeScript samples need the next SDK release: the published packages (PyPI foxreach 0.6.0, npm foxreach 0.5.0) do not have move_leads yet. This campaign must not be active: pause it first. The move runs in one transaction inside the call; send larger lists in batches. Each move is recorded in the audit log as audit.campaign.leads_removed on this campaign, with detail moved.

Path Parameters#

campaign_idstringpathrequired
The campaign the leads are in now.

Request Body#

toCampaignIdstringbodyrequired
The campaign to move the leads to. Must be another campaign in the same workspace.
leadIdsstring[]bodyrequired
1 to 5,000 lead ids.

Response#

dataobject
Show Result
movedinteger
Leads added to the other campaign and taken out of this one.
alreadyInTargetinteger
Leads that were already in the other campaign; they were taken out of this one.
blockedinteger
Leads on the block list; they stay in this campaign.
notInSourceinteger
Ids that were not in this campaign; nothing was done for them.

Errors#

StatusDescription
401Missing, invalid, revoked or expired API key
403API key does not have the required scope: write
400This campaign is active
404This campaign or the target campaign is not in this workspace
422Empty list, more than 5,000 ids, or toCampaignId is this campaign

Rate Limit#

  • 100 requests per minute, shared by every bulk call in your workspace. Fixed 60-second window.
  • Every response includes X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset (unix epoch seconds) and X-RateLimit-Bucket (bulk).
  • A 429 response includes a Retry-After header (seconds until the bucket resets).

For client-side patterns (Retry-After, exponential backoff, monitoring X-RateLimit-Remaining), see Rate Limiting.

Was this page helpful?
View as MarkdownLast updated November 10, 2026