Send to Many People
Surge has two mechanisms for sending to multiple recipients: Blasts for one-time sends and Audiences for reusable contact lists. The choice between them depends on whether the same group of people will receive messages more than once.
Blasts vs Audiences
Use a Blast when you have a list of recipients you're assembling specifically for this send. You pass the recipient list at send time and don't need to maintain it afterward — weekly flash sales, event announcements, one-time notifications.
Use an Audience when the same group of people receives messages regularly. You maintain the audience over time (adding and removing contacts), then blast the whole audience. Think weekly newsletters, customer cohorts, or geographic segments.
Both send the same underlying message; the difference is how you manage the recipient list.
Blasts
Send to a list of phone numbers
The simplest case: pass E.164 phone numbers directly in the to array.
curl -X POST https://api.surge.app/accounts/YOUR_ACCOUNT_ID/blasts \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "pn_01jrzhe8d9enptypyx360pcmxm",
"body": "Flash sale: 30% off everything this weekend. Shop at acme.com/sale",
"to": ["+18015551234", "+18025551234", "+18035551234"]
}'Send to contacts
Pass contact IDs (with ctc_ prefix) instead of phone numbers. This links the blast to your contact records for tracking and opt-out management.
curl -X POST https://api.surge.app/accounts/YOUR_ACCOUNT_ID/blasts \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "pn_01jrzhe8d9enptypyx360pcmxm",
"body": "Your subscription renews tomorrow. Manage it at acme.com/account",
"to": [
"ctc_01jrzhe8d9enptypyx360pcmxa",
"ctc_01jrzhe8d9enptypyx360pcmxb",
"ctc_01jrzhe8d9enptypyx360pcmxc"
]
}'Schedule a blast
Add send_at to queue the blast for a future time:
curl -X POST https://api.surge.app/accounts/YOUR_ACCOUNT_ID/blasts \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "April sale launch",
"from": "pn_01jrzhe8d9enptypyx360pcmxm",
"body": "Acme Corp: Our biggest sale of the year starts now. Shop: acme.com/spring",
"to": ["aud_01jrzhe8d9enptypyx360pcmxz"],
"send_at": "2026-06-01T09:00:00Z"
}'Audiences
Create an audience
An audience is a named contact list. Create it first, then populate it.
curl -X POST https://api.surge.app/accounts/YOUR_ACCOUNT_ID/audiences \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Premium subscribers"
}'{
"id": "aud_01jrzhe8d9enptypyx360pcmxz",
"name": "Premium subscribers"
}Add contacts to the audience
curl -X POST https://api.surge.app/audiences/aud_01jrzhe8d9enptypyx360pcmxz/contacts \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"id": "ctc_01jrzhe8d9enptypyx360pcmxa"
}'Repeat for each contact, or build this into the workflow that creates or updates contacts.
Blast the audience
Pass the audience ID in the to array. Surge expands the audience at send time, applying opt-out status so messages only go to contactable recipients.
curl -X POST https://api.surge.app/accounts/YOUR_ACCOUNT_ID/blasts \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "pn_01jrzhe8d9enptypyx360pcmxm",
"body": "Your monthly update from Acme Corp: acme.com/newsletter/april",
"to": ["aud_01jrzhe8d9enptypyx360pcmxz"]
}'You can mix audience IDs, contact IDs, and raw phone numbers in the same to array.
Volume caps
Campaign volume limits apply to all sends, including blasts:
| Campaign volume | T-Mobile limit |
|---|---|
low | 2,000 SMS segments per day |
high | Up to 200,000 segments per day (subject to TCR trust score) |
Surge queues messages within your daily cap and delivers them in order. If you regularly approach the low cap, request a volume increase through support after your campaign is approved.
Tracking a blast
Blast-level delivery metrics (deliverability rate, opt-out rate) are available in the dashboard under the Blasts section. Per-message delivery status comes through the message.delivered and message.failed webhook events.