Reminders API
List reminders API
Get the reminders in your workspace, 50 at a time, newest first. Use it to find reminder IDs, audit your automations or back them up.
https://wbiztool.com/api/v1/reminder/list/Body: JSON or form fields
This endpoint only accepts POST. A GET request, even with a query string, returns HTTP 400 with Invalid JSON format: Expecting value….
The list includes active and paused reminders from the whole workspace, whether they were created through the API or on the Reminders page. Cancelled reminders are not included.
Quick example#
curl -X POST https://wbiztool.com/api/v1/reminder/list/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"page": 1
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/reminder/list/",
json={"client_id": 12345, "api_key": "YOUR_API_KEY", "page": 1},
timeout=60,
)
try:
result = response.json() # read the body even when the HTTP code is 400
except ValueError:
raise SystemExit(f"HTTP {response.status_code}: not JSON. Check that your api_key exists.")
if result["status"] == 1:
print(f"{result['total']} reminders in total")
for reminder in result["reminders"]:
print(reminder["id"], reminder["name"], reminder["cron_expression"], reminder["is_active"])
else:
print("Failed:", result["message"])// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/reminder/list/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ client_id: 12345, api_key: "YOUR_API_KEY", page: 1 }),
});
// Read the body even when the HTTP code is 400. A non-JSON reply means the api_key wasn't found.
const text = await response.text();
let result;
try {
result = JSON.parse(text);
} catch {
throw new Error(`HTTP ${response.status}: not JSON. Check that your api_key exists.`);
}
if (result.status === 1) {
console.log(`${result.total} reminders in total`);
for (const reminder of result.reminders) {
console.log(reminder.id, reminder.name, reminder.cron_expression, reminder.is_active);
}
} else {
console.error("Failed:", result.message);
}<?php
$ch = curl_init('https://wbiztool.com/api/v1/reminder/list/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'page' => 1,
]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$result = json_decode(curl_exec($ch), true);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($result === null) {
echo "HTTP $httpCode: not JSON. Check that your api_key exists.";
} elseif ($result['status'] === 1) {
foreach ($result['reminders'] as $reminder) {
echo $reminder['id'] . ' ' . $reminder['name'] . ' ' . $reminder['cron_expression'] . "\n";
}
} else {
echo 'Failed: ' . $result['message'];
}Replace 12345 and YOUR_API_KEY with your own values. See Authentication for where to find them.
Request parameters#
client_idintegerrequiredYour API Client ID from Settings → API keys.
api_keystringrequiredYour API key from the same page.
pageintegeroptionalPage number, starting at
1(default). Each page holds 50 reminders, and the page size can't be changed. A value that isn't a whole number of 1 or more is treated as1.
Response#
A successful request returns HTTP 200:
{
"reminders": [
{
"id": 3187,
"name": "Monthly rent reminder",
"to_number": "919876543210",
"message_template": "Hi Aman, a reminder that your rent is due on {current_date_formatted}.",
"msg_type": 0,
"msg_type_display": "Text",
"img_url": "",
"file_name": "",
"cron_expression": "0 10 1 * *",
"next_run": "2026-10-01 10:00:00 UTC",
"is_active": true,
"whatsapp_client_id": 678,
"created_at": "2026-09-16 04:45:12"
}
],
"total": 1,
"page": 1,
"page_size": 50,
"message": "Success",
"status": 1
}
| Field | Type | Description |
|---|---|---|
status | integer | 1 on success, 0 if the request failed. |
message | string | Success, otherwise the error. |
reminders | array | The reminders on this page, newest first. Empty if the page is past the end. |
total | integer | Reminders in the workspace, across all pages. |
page | integer | The page returned. |
page_size | integer | Always 50. |
Reminder fields#
| Field | Type | Description |
|---|---|---|
id | integer | The reminder ID. Use it with Cancel reminder. |
name | string | The reminder name, or Unnamed Reminder if it has none. |
to_number | string | Phone number or group name the reminder is sent to. |
message_template | string | The message, with template variables not yet filled in. |
msg_type | integer | 0 text, 1 image, 2 file. |
msg_type_display | string | Text, Image or File. |
img_url | string or null | Image URL for image reminders, or the file URL for file reminders created through the API. Can be empty or null otherwise. |
file_name | string or null | For file reminders: the file URL (reminders created in the dashboard) or the file name (reminders created through the API, whose URL is in img_url). Can be empty or null otherwise. |
cron_expression | string | The schedule. See Cron expressions. |
next_run | string | Next time the schedule matches, as YYYY-MM-DD HH:MM:SS UTC, or Invalid cron if the expression can't be read. See the warning below. |
is_active | boolean | true if the reminder is running, false if it's paused. |
whatsapp_client_id | integer or null | The WhatsApp number it sends from, or null if it uses the first connected number. |
created_at | string | When the reminder was created, in UTC, as YYYY-MM-DD HH:MM:SS. |
Errors#
Errors return HTTP 400 with status set to 0, unless noted:
{ "status": 0, "message": "Upgrade your plan to use reminders feature" }
| Message | How to fix it |
|---|---|
Invalid JSON format: … | The JSON body isn't valid. You also get this for a GET request or a form request without client_id. |
Auth Error - Please send correct API key and Client id | Send both client_id and api_key. |
Invalid client id | Send client_id as a number. |
Auth Error: invalid api key | The key belongs to a different client_id. |
Auth Error: please check client id | The key isn't linked to a workspace. Create a new key in the workspace you want to use. |
Demo Account cannot access APIs | Use a regular account. |
Upgrade your plan to use reminders feature | Your plan doesn't include reminders. Upgrade your plan. Existing reminders keep running and using credits after a downgrade, and can't be listed, cancelled or paused until you upgrade. |
Error fetching reminders: … (HTTP 500) | Something went wrong on our side. Try again. |
If the api_key doesn't exist or has been deleted, the response is an HTML error page with HTTP 500 instead of JSON. Test your key with Check credentials.
Reading every page#
Keep requesting the next page until a page has fewer than 50 reminders.
import requests
reminders, page = [], 1
while True:
response = requests.post(
"https://wbiztool.com/api/v1/reminder/list/",
json={"client_id": 12345, "api_key": "YOUR_API_KEY", "page": page},
timeout=60,
)
try:
result = response.json()
except ValueError:
raise SystemExit(f"HTTP {response.status_code}: not JSON. Check that your api_key exists.")
if result["status"] != 1:
raise RuntimeError(result["message"])
reminders += result["reminders"]
if len(result["reminders"]) < result["page_size"]:
break
page += 1
print(len(reminders), "reminders")// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const reminders = [];
let page = 1;
while (true) {
const response = await fetch("https://wbiztool.com/api/v1/reminder/list/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ client_id: 12345, api_key: "YOUR_API_KEY", page }),
});
const text = await response.text();
let result;
try {
result = JSON.parse(text);
} catch {
throw new Error(`HTTP ${response.status}: not JSON. Check that your api_key exists.`);
}
if (result.status !== 1) throw new Error(result.message);
reminders.push(...result.reminders);
if (result.reminders.length < result.page_size) break;
page += 1;
}
console.log(reminders.length, "reminders");Tips#
- Store your own copy of each reminder's
timezonewhen you create it, since this endpoint doesn't return it. - Find paused reminders by filtering on
is_activebeingfalse. Resume them on the Reminders page. - Clean up old automations: first collect the IDs you want to cancel across every page, then call Cancel reminder for each one. Cancelling while you page shifts later reminders onto earlier pages, so some get skipped.
