Skip to main content
All campaign endpoints require an API key with the appropriate scope. Campaigns are scoped to the tenant bound to your API key.

Create a campaign

Request body

max_concurrent and your channel allocation

Your account is allocated a number of concurrent channels on the carrier trunk (what Yotel calls the channel allocation; ask your account manager for the figure, or read channels_allocated from GET /api/telephony/channels/usage). A campaign with max_concurrent null keeps as many calls up as that allocation allows, counting every call your account has up — other campaigns, inbound calls and agent dials included — so the allocation is used completely without any campaign overrunning it. Two things to know:
  • It is a ceiling that follows the allocation, not a fixed number. Raise the allocation and every null campaign dials more; nothing on the campaign needs to change.
  • Enforcement requires an active trunk. If Yotel has no active trunk declared for your carrier, there is no allocation to follow and a null campaign falls back to 10 concurrent calls per API process (the previous default). GET /api/telephony/channels/usage reports whether the allocation is enforced under ceilings.channels.enforced.
  • Two campaigns sharing one allocation are first-come-first-served. The allocation is a ceiling, not a share. If both must make progress at once, set an explicit max_concurrent on each so their sum fits.
A numeric max_concurrent behaves as it always has: a per-campaign ceiling, still bounded by the allocation when one is enforced. If your account also uses a voice agent, that agent’s own max_concurrent applies too — the tightest of the three is what you get. If your organisation set a default in the dashboard (Settings → General → Max Concurrent), a request that omits the field inherits it; an explicit null does not. Scope: campaigns:write  |  Status: 201 Created

Response

Returns a CampaignResponse object with id, name, dial_mode, status ("draft"), timestamps, and all configured fields.

List campaigns

Returns all campaigns for the tenant bound to your API key.
Scope: campaigns:read  |  Status: 200 OK

Get a campaign

Scope: campaigns:read  |  Status: 200 OK Returns 404 if the campaign does not exist or belongs to a different tenant.

Update a campaign

PATCH semantics — only include the fields you want to change.
Scope: campaigns:write  |  Status: 200 OK

Clearing a field

An omitted field and an explicit null are different requests. Omit a field to leave it alone; send null to clear it. Only caller_id, flow_id, voice_agent_id, description, script, notes, and max_concurrent may be cleared — a null on any other field returns 422.
Clearing caller_id makes the campaign rotate through the tenant’s own numbers again. Clearing max_concurrent puts the campaign back onto your channel allocation (see max_concurrent and your channel allocation).

Editing a running campaign

PATCH on a running campaign returns 409. The dialer reads its configuration once at start; pause the campaign, edit it, then resume — the resumed dialer picks up the new values.

Delete a campaign

Scope: campaigns:write  |  Status: 204 No Content Returns 409 Conflict if the campaign is in a state that cannot be deleted (e.g., currently running).

Errors