WhatsAble
API v1Scheduled messages

Schedule a message

posthttps://api.whatsable.app/v1/scheduled-messages
Build a request to copy

This page never sends a request. Fill in the fields, then copy the request and run it from your server.

Request
curl -X POST 'https://api.whatsable.app/v1/scheduled-messages' \
  -H 'Content-Type: application/json' \
  -d '{
  "to": "+5491155550000",
  "from": "cm2v8a1b20002qz8h9i0j1k2l",
  "type": "template",
  "template": {
    "id": "cm2v8t1a00001qz8habcd1234",
    "variables": {
      "1": "Ana",
      "2": "#1042"
    }
  },
  "send_at": "2026-10-22T09:00:00-03:00",
  "time_zone": "America/Argentina/Buenos_Aires"
}'

Schedules a message to send at send_at. The body is the body of POST /v1/messages, plus send_at.

The 24-hour window is checked when the message fires, not now. If the window is closed at that time, a session message ends suppressed. So you can schedule a session message to a person who has not written yet.

All the other checks of a send run now.

Authorization

bearerAuth
headerAuthorizationBearer <nfy_live_<32 characters>>

An API key from Settings > API keys, sent as Authorization: Bearer <key>.

Header Parameters

Idempotency-Key?string

Any string up to 255 characters. A repeat with the same key and body answers the stored response; with another body, 409 idempotency_key_reused.

Lengthlength <= 255

Request Body

application/json
  1. body

A message to send later: the body of POST /v1/messages plus send_at. An uploaded file is stored now, so send_at can be after its 30 days.

to?string

An E.164 phone (+, spaces, dashes optional), a Business-Scoped User ID or a WhatsApp @username. A new phone or ID creates a contact; a username must be known.

Length1 <= length <= 256
conversation_id?string

Send into this existing conversation, from its number. Exactly one of to and conversation_id.

Length1 <= length <= 64
from?string

The number to send from, by id or E.164 phone. Absent, the key's default number sends. Never another fallback.

Length1 <= length <= 64
type*string
text*
send_at*string

A future RFC 3339 instant with its offset, such as 2026-10-22T09:00:00-03:00. A time without an offset is refused.

Formatdate-time
time_zone?string

An IANA time zone name, kept for display only. send_at is never read in it.

Length1 <= length <= 64

Response Body

The message is scheduled: pending until send_at.

application/json
  1. response

A message that fires at send_at. Every scheduled message on the key's numbers is listed, whoever created it.

object*string
id*string
Length1 <= length <= 64
status*string

pending until it fires, also while it sends. Then sent, suppressed or failed. cancelled after a cancel. missed: imported too late, so it never fires.

Value in"pending""sent""suppressed""failed""cancelled""missed"
send_at*string

When it fires.

Formatdate-time
time_zone*|

The IANA time zone the creator gave, kept for display. send_at is the instant; it is never read in this zone.

conversation_id*string
Length1 <= length <= 64
contact_id*string
Length1 <= length <= 64
number_id*string

The business number it is sent from.

Length1 <= length <= 64
type*|

The send type. other for a message an older integration scheduled as a WhatsApp object v1 does not send.

text*|

The text of a text message, or the body of a buttons message. Null otherwise: a caption is media.caption.

template*|

The template of a template message. Null otherwise.

media*|

The file of a media message. Null otherwise.

message_id*|

The Message it produced: set once sent, and on a failed message created through this API, whose Message carries the failure. Null otherwise.

suppressed_reason*|

window_closed (the 24-hour window was closed), a failed send check, or a dashboard or integration condition (reply_window, label_condition, reply_gate).

error*|

Why a failed message failed, as on a Message. Null unless status is failed.

created_by*string

api (this API), dashboard (a person in the inbox), keep_alive (office hours' keep-alive), or integration (the legacy-compatible API or a Monday workflow).

Value in"api""dashboard""keep_alive""integration"
created_at*string
Formatdate-time
updated_at*string
Formatdate-time
Example Request
curl -X POST 'https://api.whatsable.app/v1/scheduled-messages' \  -H 'Content-Type: application/json' \  -d '{  "to": "+5491155550000",  "from": "cm2v8a1b20002qz8h9i0j1k2l",  "type": "template",  "template": {    "id": "cm2v8t1a00001qz8habcd1234",    "variables": {      "1": "Ana",      "2": "#1042"    }  },  "send_at": "2026-10-22T09:00:00-03:00",  "time_zone": "America/Argentina/Buenos_Aires"}'
Example Response
{  "object": "scheduled_message",  "id": "cm2v8s1a00001qz8h6f7g8h9i",  "status": "pending",  "send_at": "2026-10-22T12:00:00Z",  "time_zone": "America/Argentina/Buenos_Aires",  "conversation_id": "cm2v8c1a00001qz8h4t5u6v7w",  "contact_id": "cm2v8k1a00001qz8h8x9y0z1a",  "number_id": "cm2v8a1b20002qz8h9i0j1k2l",  "type": "template",  "text": null,  "template": {    "id": "cm2v8t1a00001qz8habcd1234",    "name": "order_shipped",    "language": "en_US"  },  "media": null,  "message_id": null,  "suppressed_reason": null,  "error": null,  "created_by": "api",  "created_at": "2026-10-20T19:51:21Z",  "updated_at": "2026-10-20T19:51:21Z"}