Skip to content
WbizTool

API v2 (beta)

Reminders

A reminder sends the same message to one recipient again and again on a schedule: rent every month, a class every Monday, a report every evening. The schedule is a 5-part cron expression in a time zone you choose. Reminders made with the API are the same as those on the Reminders page of the dashboard.

OperationEndpointScope
Create a reminderPOST /api/v2/remindersreminders
List remindersGET /api/v2/remindersreminders
Get a reminderGET /api/v2/reminders/{id}reminders
Change, pause or resumePATCH /api/v2/reminders/{id}reminders
Delete a reminderDELETE /api/v2/reminders/{id}reminders

Creating and changing reminders needs a plan that includes reminders; otherwise it answers 403 plan_required. Listing, reading, pausing and deleting work on any plan. For a message that goes out once at a set time, use send_at in Send a message instead.

Create a reminder#

POSThttps://wbiztool.com/api/v2/reminders

Body: JSON (application/json)

curl -X POST https://wbiztool.com/api/v2/reminders \
  -H "Authorization: Bearer $WBIZTOOL_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: rent-flat-4b" \
  -d '{
    "name": "Weekly rent",
    "from": 101,
    "to": { "phone": "+919876543210" },
    "text": "Hi, a reminder that the rent is due on Friday.",
    "schedule": { "cron": "0 9 * * 1", "timezone": "Asia/Kolkata" }
  }'

Answer (201):

{
  "id": 812,
  "name": "Weekly rent",
  "active": true,
  "to": { "phone": "+919876543210" },
  "from": 101,
  "text": "Hi, a reminder that the rent is due on Friday.",
  "media": null,
  "schedule": { "cron": "0 9 * * 1", "timezone": "Asia/Kolkata" },
  "next_run_at": "2026-10-19T09:00:00+05:30",
  "created_at": "2026-10-18T10:20:11.004Z"
}

Body

namestringrequired

A name for the reminder, up to 100 characters, as shown on the Reminders page.

toobjectrequired

Exactly one of phone (international format with +), group (a WhatsApp group's exact name), contact_id or username (Telegram), as in Messages → Recipients.

frominteger or nullRequired for a key limited to some numbers

The id of the number that sends it. It must be connected when you set it. Left out or null: any connected number of the workspace sends it.

textstringrequired

The message, up to 3,000 characters. It's also the caption when media is sent.

mediaobject or nulloptional

An image or file to send each time: url or media_id, and optionally type, as in Messages → Media.

scheduleobjectrequired

cron (required) and timezone. See Schedule.

activebooleanoptional

true (default) runs it; false creates it paused.

Schedule#

schedule.cron has five parts separated by spaces: minute, hour, day of the month, month, day of the week. * means "every". It must be a schedule that runs at some point (not 31 February).

cronRuns
0 9 * * 1Mondays at 09:00
30 18 * * *Every day at 18:30
0 10 1 * *The 1st of every month at 10:00
0 9 * * 1-5Weekdays at 09:00
0 8,20 * * *Every day at 08:00 and 20:00
0 9 15 1 *15 January at 09:00, every year

schedule.timezone is an IANA time zone name, such as Asia/Kolkata, Europe/London or America/New_York (default UTC). The cron times are in that zone, and next_run_at is given in it too, with its offset. See the time zone reference.

Each run sends a message like any other: it needs messages left on the plan and shows up in List messages.

Errors when creating#

HTTPCodeWhen
400validation_failedA required field is missing or empty, a field is unknown or too long (name, to.group), or media isn't valid
400text_requiredtext is empty
400text_too_longtext is over 3,000 characters
400invalid_cronschedule.cron isn't 5 parts, or never runs
400invalid_timezoneschedule.timezone isn't an IANA time zone
403plan_requiredThe plan doesn't include reminders
403number_not_allowedThe key is limited to some numbers and from isn't one of them, or is missing
422invalid_phoneto.phone isn't a valid number in international format with +
422invalid_usernameto.username isn't a Telegram username, link or tg: id
422username_needs_telegramA Telegram username, but from isn't a Telegram account (or, without from, no Telegram account is connected)
422contact_not_foundNo contact with that to.contact_id
422media_not_foundNo file with that media.media_id
422invalid_media_urlmedia.url isn't a public http(s) link
422number_not_connectedfrom isn't a connected number of this workspace

List reminders#

GEThttps://wbiztool.com/api/v2/reminders

The workspace's reminders, newest first, in pages (limit 1 to 100, default 25, and cursor). Paused ones are included, with "active": false. A key limited to some numbers sees only the reminders that send from them.

curl "https://wbiztool.com/api/v2/reminders?limit=50" \
  -H "Authorization: Bearer $WBIZTOOL_API_KEY"

The answer is {"data": [Reminder, …], "next_cursor": "…" or null}.

Get a reminder#

GEThttps://wbiztool.com/api/v2/reminders/{id}
curl https://wbiztool.com/api/v2/reminders/812 \
  -H "Authorization: Bearer $WBIZTOOL_API_KEY"

A reminder that doesn't exist, was deleted, or sends from a number the key may not use answers 404 reminder_not_found.

Change, pause or resume a reminder#

PATCHhttps://wbiztool.com/api/v2/reminders/{id}

Body: JSON (application/json)

Send only the fields that change; the others keep their values. The fields are those of Create a reminder. The answer is 200 with the reminder as it is now.

  • Pause: {"active": false}. It stops running and next_run_at becomes null. Pausing works on any plan.
  • Resume: {"active": true}. It runs again from its next time. Resuming needs a plan with reminders.
  • schedule is replaced as a whole: send cron with it. Without timezone, the reminder keeps its current one.
# Pause
curl -X PATCH https://wbiztool.com/api/v2/reminders/812 \
  -H "Authorization: Bearer $WBIZTOOL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"active": false}'

# Move it to Fridays at 10:00 and change the text
curl -X PATCH https://wbiztool.com/api/v2/reminders/812 \
  -H "Authorization: Bearer $WBIZTOOL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"schedule": {"cron": "0 10 * * 5"}, "text": "Hi, the rent is due today."}'

A change answers with the same errors as creating, and 404 reminder_not_found. If one field is wrong, nothing is changed.

Delete a reminder#

DELETEhttps://wbiztool.com/api/v2/reminders/{id}

Deletes the reminder: it never runs again. Messages it already sent stay in the history. To stop it for a while instead, pause it.

curl -X DELETE https://wbiztool.com/api/v2/reminders/812 \
  -H "Authorization: Bearer $WBIZTOOL_API_KEY"
{ "id": 812, "deleted": true }

The Reminder object#

FieldTypeDescription
idintegerThe reminder's id.
namestringIts name.
activebooleantrue while it runs, false while it's paused.
toobjectThe recipient: phone (with +), group or username. A reminder made with contact_id shows the contact's number or group.
frominteger or nullThe sending number's id, or null for any connected number.
textstringThe message.
mediaobject or nulltype (image or file), url and file_name.
scheduleobjectcron and timezone.
next_run_atstring or nullWhen it runs next, in its time zone with the offset, such as 2026-10-19T09:00:00+05:30. null while it's paused.
created_atstringWhen it was made (UTC).