zinn-campaigns
POST /v1/email-marketing/sms/campaigns/{campaign_id}/send
Start sending an SMS to everyone on its list who agreed to SMS — or resume one paused for credit.
Authentication
Send an API key as a bearer token. The key must carry the email_marketing.manage permission; a key without it is refused with 403, not 404.
Where your organisation id goes
This endpoint takes org_id as a query parameter. Leave it out and the call covers your whole tenancy subtree; send it to narrow the call to one organisation.
Your organisation id is on the API keys screen in your dashboard, beside the key itself. It is the same id in every call you make.
Try it
Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.
curl -X POST https://api.zinndigital.com/v1/email-marketing/sms/campaigns/{campaign_id}/send \
-H "Authorization: Bearer zdk_live_…"Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console
Details
Gated on email_marketing.manage. The gate runs first, in order: the line is open, SMS is open to the account, the account is in good standing, the campaign is complete and within the length limit, SMS is not paused, someone on the list may be texted (a member, subscribed, with a number, an SMS consent and no STOP), and staff have reviewed a send above the review size. Each refusal is its own 409 code (CAMPAIGNS_SMS_<CODE>). On 202 a durable workflow sends in batches; each message is priced and paid from the account's credit before it leaves. When the credit runs out the campaign pauses (no_credit) and this call resumes it after a top-up. STOP replies or carrier rejections over the line pause the account's SMS; staff resume it.
Parameters
| Name | Type | Required | What it is |
|---|---|---|---|
org_id (query) | Uuid | No | The organization this call acts on. Optional for a caller with exactly one direct membership; required for anyone with more than one — which is every reseller and every agency… |
campaign_id (path) | string | Yes | — |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
id | string | Yes | — |
name | string | Yes | — |
list_id | string | Yes | — |
text | string | Yes | — |
status | string<draft, sending, paused, sent, refused> | Yes | — |
refusal_code | string<not_open, channel_off, account_on_hold, incomplete, too_long, paused, empty, review, no_credit, not_configured> | Yes | — |
refusal_message | string | Yes | — |
customer_can_resume | boolean | Yes | Paused for credit; send resumes it after a top-up. |
recipients_total | integer | Yes | — |
started_at | string | Yes | — |
finished_at | string | Yes | — |
created_at | string | Yes | — |
updated_at | string | Yes | — |
Errors this endpoint can return
401 · 402 · 403 · 404 · 409