Skip to main content

Scheduled sending

Any send accepts a scheduled_at field (RFC3339). bZapper holds the message and fires it at the exact time — no cron on your server, no process to keep alive.

How it works

Add scheduled_at to any send endpoint (/messages/text, /messages/image, etc.). The rest of the payload is the same as a normal send.

curl -X POST https://api.bzapper.com.br/messages/text \
-H "Authorization: Bearer $BZ_KEY" -H "X-Project-Id: $PROJECT" \
-H "Content-Type: application/json" \
-d '{
"to": "+5511999990000",
"body": "Good morning! ☀️",
"scheduled_at": "2026-07-01T09:00:00Z"
}'

202 response:

{ "scheduled_id": "...", "status": "scheduled", "scheduled_at": "2026-07-01T09:00:00Z" }
The number is chosen at send time

Number selection (affinity/rotation) happens at promotion, not at scheduling — so the message never lands on a number that went offline afterwards.

Scheduling window by plan

PlanMaximum lead time
Free24 hours
Pro30 days
Pro + "Extended scheduling" add-on1 year

Exceeding the limit returns 400 scheduled_too_far. OTP cannot be scheduled (short-lived codes).

List and cancel

# list the project's scheduled sends
curl https://api.bzapper.com.br/messages/scheduled \
-H "Authorization: Bearer $BZ_KEY" -H "X-Project-Id: $PROJECT"

# cancel a pending scheduled send
curl -X DELETE https://api.bzapper.com.br/messages/scheduled/$SCHEDULED_ID \
-H "Authorization: Bearer $BZ_KEY" -H "X-Project-Id: $PROJECT"

Endpoints

MethodPathWhat it does
POST/messages/* with scheduled_atSchedule the send (202 scheduled)
GET/messages/scheduledList scheduled sends
DELETE/messages/scheduled/{id}Cancel a pending scheduled send