Skip to main content
POST
Launch Outbound
CLI:

Overview

The call is synchronous about validation (returns 400 if the draft is not ready) but asynchronous about sending: once it returns 200, a Trigger.dev task owns the work. Poll GET /api/campaigns/:id for progress. The status transitions atomically via compare-and-swap: draft -> launching, then inside the background task launching -> active. Only one launch can run at a time; a second concurrent call returns 409.

Error reference

AI agent notes

Before calling this endpoint, verify the draft is ready:
  1. GET /api/campaigns/:id -> status must be "draft"
  2. GET /api/campaigns/:id/leads?status=pending -> total must be greater than zero; review the actual recipients, not only an aggregate on the Outbound row
  3. At least one sender account is attached
  4. Every sendable sequence node has non-empty content and no unresolved personalization placeholder
  5. For email: senders are active and have a configured sending inbox
  6. For LinkedIn: the connected account resolves through the sending backend
  7. Present the channel, sender identity, pending recipient count, and final sequence to the human and obtain explicit launch approval
Read GET /api/campaigns/{id} first when you need to inspect the draft before launch; this endpoint still performs final readiness checks and returns a specific blocker when launch is not allowed.
After a successful launch:
  • Status is "launching" immediately; do not re-launch.
  • Within about 2 minutes the background task transitions to "active" and begins staggered sends.
  • Poll GET /api/campaigns/:id every 30 seconds until status is "active", then at 1-5 minute cadence for progress.
  • stats.total is set at launch; counters such as sent, replied, and bounced increment as contacts execute.
If launch returns 400, do not retry the same request. Surface the blocker, correct the draft, repeat the readiness checks, and ask for confirmation again if the recipient set, sender, or sequence changed. On 409, fetch the Outbound before deciding whether another launch is needed. On 500, the server restores draft; verify that state before one retry. Idempotency: retrying the same call is safe. The background task is keyed by campaignId + updated_at, and on any failure the server rolls back writes. Stopping: use POST /api/campaigns/:id/pause to halt mid-flight; POST /api/campaigns/:id/resume to continue.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Path Parameters

id
string
required

Campaign UUID

Response

Launch dispatched. Background task is running.

success
enum<boolean>
required
Available options:
true
message
string
required

Always "Campaign launch started" on success

runId
string
required

Trigger.dev run identifier.

prospectsToProcess
integer
required
Required range: 0 <= x <= 9007199254740991
warning
string
warnings
string[]
linkedinSenderSafety
object
skippedProspects
object[]
skippedCount
integer
Required range: 0 <= x <= 9007199254740991