Scheduled messages

Pass scheduled_at (ISO timestamp or epoch ms, up to 30 days out) to POST /v1/messages and the message is queued instead of sent:

bash
curl -X POST https://api.joinsimplesms.com/v1/messages   -H "Authorization: Bearer $SIMPLESMS_API_KEY"   -H "Content-Type: application/json"   -d '{"to":"+14155550132","from":"+15005550110","body":"Reminder!","scheduled_at":"2026-09-01T15:00:00Z"}'

The response is a scheduled_message with a job_ id. Delivery happens on the next queue flush after the timestamp (within a minute).

The schedule reserves nothing

Opt-out and quota are re-checked at send time, not at scheduling. A recipient who opts out between scheduling and sending is skipped; a schedule does not hold quota.

Listing and canceling

GET /v1/scheduled_messages lists pending messages; DELETE /v1/scheduled_messages/job_... cancels one that has not sent yet. Cancellation races are settled atomically; a job mid-send cannot be canceled. To send one message to many people later, schedule a batch instead.