Resource
SDR Campaigns
Outbound voice SDR. Create campaigns from the API, attach prospect lists, set the calling window, and let the dialer cron work the queue.
Agency-only resource
SDR campaigns live at the agency (org) level — there is no per-client scoping. Client-bound keys (
cl_live_…) are rejected with 403. Use a gc_live_… agency key. The campaign reuses the org's shared inbound SDR agent + phone, so you must have SDR provisioned in the agency portal first.Feature gate
SDR outbound is gated on
organizations.ai_sdr_outbound_enabled per agency. POST returns 403 feature_disabled until that flag is on. Reach out to your account contact when you're ready to flip it.List campaigns#
List SDR campaigns
GET
/v1/sdr/campaignsQuery parameters
statusstringFilter —
draft, scheduled, active, paused, completed, cancelled, archived.limitintegerdefault: 50page_tokenstringCreate a campaign#
Create an outbound voice campaign
POST
/v1/sdr/campaignsDefaults are pulled from the agency's inbound SDR config (voice, business name, from-number) when omitted. Optionally attach
prospect_ids to queue dialing.Body parameters
namestringRequired. ≤200 chars.
descriptionstringOptional, ≤4000 chars.
opening_messagestringWhat the agent says when the prospect picks up.
voicemail_messagestringPre-recorded VM drop content if no answer.
system_promptstringOverride the SDR agent prompt for this campaign.
voice_idstringElevenLabs voice override.
voice_namestringDisplay name for the voice.
from_numberstringE.164. Defaults to org SDR phone.
prospect_idsuuid[]Existing prospect rows to enqueue (status flips to queued).
max_concurrent_callsinteger1–10. How many lines the dialer can run in parallel.
calling_window_startHH:mmDefault 09:00.
calling_window_endHH:mmDefault 20:00.
calling_daysinteger[]ISO weekdays 1=Mon … 7=Sun. Default [1,2,3,4,5].
respect_timezonebooleanWhen true, window is per-prospect TZ (default true).
max_attemptsinteger1–10. Default 3.
retry_interval_hoursintegerHours between attempts (default 24).
ring_timeout_secondsinteger15–120. Default 60.
max_duration_secondsinteger30–1800. Default 300.
scheduled_start_atiso datetimeWhen omitted, campaign is created in draft state. When set, status=scheduled.
voicemail_enabledbooleanDefault true.
cal_com_booking_urlstringFor agents that book on cal.com.
post_call_emailstringEmail summary destination after each completed call.
Request
curl -X POST \
https://agency.gary.club/api/public/v1/sdr/campaigns \
-H "Authorization: Bearer gc_live_EXAMPLE_AbCdEfGhIj0123456789" \
-H "Content-Type: application/json" \
-d '{
"name": "Q2 reactivation — lapsed customers",
"description": "Win-back dial to customers who haven't booked in 90+ days",
"opening_message": "Hi this is Sarah from {{business_name}} — quick check-in on your service plan, do you have a sec?",
"voicemail_message": "Hi, this is Sarah from {{business_name}}. Wanted to check in about your service plan. Give us a ring back when you have a moment, thanks!",
"calling_window_start": "10:00",
"calling_window_end": "18:00",
"calling_days": [1, 2, 3, 4, 5],
"respect_timezone": true,
"max_attempts": 3,
"retry_interval_hours": 48,
"max_concurrent_calls": 2,
"scheduled_start_at": "2026-04-29T15:00:00.000Z",
"prospect_ids": ["pro_EXAMPLE_aaaa", "pro_EXAMPLE_bbbb"]
}'Response
{
"campaign": {
"id": "sdrc_EXAMPLE_aaaa",
"name": "Q2 reactivation — lapsed customers",
"status": "scheduled",
"scheduled_start_at": "2026-04-29T15:00:00.000Z",
"calling_window_start": "10:00",
"calling_window_end": "18:00",
"calling_days": [1, 2, 3, 4, 5],
"respect_timezone": true,
"max_attempts": 3,
"max_concurrent_calls": 2,
"total_prospects": 2,
"from_number": "+15124204121",
"elevenlabs_agent_id": "el_agent_xyz",
"voicemail_enabled": true,
"created_at": "2026-04-28T01:18:53.000Z"
}
}Read one#
Single campaign with stats
GET
/v1/sdr/campaigns/{id}Path parameters
iduuidrequiredUpdate / pause / resume#
Update mutable fields or change status
PATCH
/v1/sdr/campaigns/{id}Status transitions:
draft → scheduled → active → paused → active → completed. Setting status=paused halts dialing on the next tick; status=active resumes.Path parameters
iduuidrequiredBody parameters
statusstringdraft | scheduled | active | paused | completed | cancelled | archived.
namestringdescriptionstringscheduled_start_atiso datetime | nullcalling_window_startHH:mmcalling_window_endHH:mmcalling_daysinteger[]max_concurrent_callsintegermax_attemptsintegerretry_interval_hoursintegerring_timeout_secondsintegermax_duration_secondsintegerArchive#
Soft-archive (status=archived)
DELETE
/v1/sdr/campaigns/{id}Does NOT cancel in-flight dials. Pause first if you want them stopped.
Path parameters
iduuidrequiredWebhooks for SDR campaigns#
sdr.campaign.started— first dial fired.sdr.campaign.completed— queue drained.sdr.call.connected— prospect picked up.sdr.call.voicemail— VM drop completed.sdr.call.booked— call ended with a booking outcome.

