curl --request POST \
--url https://api.verbose.cx/v1/campaigns \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "June promo",
"message": "Hi {{first_name}}, 20% off. Reply STOP to opt out.",
"list_id": "8f3c",
"number_id": "1a2b",
"follow_ups": [
{
"message": "Last day!",
"delay_minutes": 1440
}
]
}
'{
"ok": true,
"campaign": {
"id": "478e4a29-4d45-4b69-a721-52405e75d85f",
"name": "September promo",
"campaign_type": "broadcast",
"status": "active",
"created_at": "2026-09-01T14:12:00Z"
}
}{
"ok": false,
"error": "list_id is required"
}{
"ok": false,
"error": "Invalid or missing API key"
}{
"ok": false,
"error": "This API key cannot create and edit.",
"required_scope": "write"
}Create a campaign
Built, not started — call /campaigns/{id}/start. SMS by default; set type: "voice" for a voice campaign.
curl --request POST \
--url https://api.verbose.cx/v1/campaigns \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "June promo",
"message": "Hi {{first_name}}, 20% off. Reply STOP to opt out.",
"list_id": "8f3c",
"number_id": "1a2b",
"follow_ups": [
{
"message": "Last day!",
"delay_minutes": 1440
}
]
}
'{
"ok": true,
"campaign": {
"id": "478e4a29-4d45-4b69-a721-52405e75d85f",
"name": "September promo",
"campaign_type": "broadcast",
"status": "active",
"created_at": "2026-09-01T14:12:00Z"
}
}{
"ok": false,
"error": "list_id is required"
}{
"ok": false,
"error": "Invalid or missing API key"
}{
"ok": false,
"error": "This API key cannot create and edit.",
"required_scope": "write"
}Authorizations
Your API key (as_live_…), created under Settings → API keys.
Body
- Option 1
- Option 2
An SMS campaign to create. It is built, not sent — start it with POST /v1/campaigns/{id}/start. Target a list_id or a segment_id.
Campaign name (internal).
"September promo"
The SMS body. Personalize with {first_name}/{link}/{token}; vary with spin syntax {Hi|Hey}.
"Hi {first_name}! {Check out|See} our September offer: {link} Reply STOP to opt out."
Audience lead list. Provide this or segment_id.
"8f3c2b10-4d5e-4a6b-9c7d-1e2f3a4b5c6d"
Sending number (or pool_id).
Send from a number pool (rotates across its numbers). Use instead of number_id for larger sends.
"7a1b..."
Send rate in messages per second.
1 <= x <= 510
Link domain used to shorten {link}. Set together with destination_url (or use an offer).
"go.yourbrand.com"
Where {link} points when not using an offer.
"https://yourbrand.com/lp"
Optional drip steps sent after the first message.
3Show child attributes
Show child attributes
Suppression lists to screen recipients against.
Campaign type.
broadcast, reply_based, click_based, realtime "broadcast"
Audience segment (snapshotted to a list at creation). Provide this or list_id.
"3c9a1f22-..."
Offer to attribute clicks/conversions to; shortens {link} on its URL.
"b7e2..."
For reply_based/click_based: what triggers the response — any_reply, keyword, or code.
"keyword"
The keyword or code to match when trigger_type isn't any_reply.
"YES"
Instant reply (reply_based) / click response (click_based), sent the moment the trigger fires.
"Great — here's your link: {link}"
Destination for {link} in the response message.
Link domain for the response message's {link}.
Skip contacts already sent this offer.
true
Skip contacts who already replied to this offer.
true
Skip contacts who already clicked this offer.
true
Skip anyone who replied in this campaign.
true
Only contacts who replied to ANY campaign.
true
Only contacts who clicked in ANY campaign.
true
UTC ISO time to start automatically; omit to start manually.
"2026-09-20T15:00:00Z"
Was this page helpful?