API v2 (Beta)
Erinnerungen
Eine Erinnerung sendet dieselbe Nachricht immer wieder nach einem Zeitplan an einen Empfänger: die Miete jeden Monat, ein Kurs jeden Montag, ein Bericht jeden Abend. Der Zeitplan ist ein 5-teiliger Cron-Ausdruck in einer Zeitzone Ihrer Wahl. Erinnerungen, die mit der API erstellt werden, sind dieselben wie auf der Seite Erinnerungen im Dashboard.
| Vorgang | Endpoint | Scope |
|---|---|---|
| Erinnerung erstellen | POST /api/v2/reminders | reminders |
| Erinnerungen auflisten | GET /api/v2/reminders | reminders |
| Eine Erinnerung abrufen | GET /api/v2/reminders/{id} | reminders |
| Ändern, pausieren oder fortsetzen | PATCH /api/v2/reminders/{id} | reminders |
| Erinnerung löschen | DELETE /api/v2/reminders/{id} | reminders |
Zum Erstellen und Ändern von Erinnerungen ist ein Plan nötig, der Erinnerungen enthält; sonst lautet die Antwort 403 plan_required. Auflisten, Lesen, Pausieren und Löschen funktionieren in jedem Plan. Für eine Nachricht, die einmal zu einer festen Zeit rausgeht, verwenden Sie stattdessen send_at unter Nachricht senden.
Erinnerung erstellen#
https://wbiztool.com/api/v2/remindersBody: 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" }
}'import os
import requests
response = requests.post(
"https://wbiztool.com/api/v2/reminders",
headers={
"Authorization": f"Bearer {os.environ['WBIZTOOL_API_KEY']}",
"Idempotency-Key": "rent-flat-4b",
},
json={
"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"},
},
timeout=30,
)
reminder = response.json()
print(response.status_code, reminder.get("id"), reminder.get("next_run_at"))// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v2/reminders", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.WBIZTOOL_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "rent-flat-4b",
},
body: JSON.stringify({
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" },
}),
});
const reminder = await response.json();
console.log(response.status, reminder.id, reminder.next_run_at);<?php
$ch = curl_init('https://wbiztool.com/api/v2/reminders');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('WBIZTOOL_API_KEY'),
'Content-Type: application/json',
'Idempotency-Key: rent-flat-4b',
],
CURLOPT_POSTFIELDS => json_encode([
'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'],
]),
CURLOPT_RETURNTRANSFER => true,
]);
$reminder = json_decode(curl_exec($ch), true);
curl_close($ch);
echo $reminder['id'] . ' next: ' . $reminder['next_run_at'];Antwort (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
namestringerforderlichEin Name für die Erinnerung, bis zu 100 Zeichen, wie er auf der Seite Erinnerungen angezeigt wird.
toobjecterforderlichGenau eines von
phone(internationales Format mit+),group(der genaue Name einer WhatsApp-Gruppe),contact_idoderusername(Telegram), wie unter Nachrichten → Empfänger.frominteger or nullErforderlich bei einem auf einige Nummern beschränkten SchlüsselDie
idder Nummer, die sie sendet. Sie muss verbunden sein, wenn Sie sie festlegen. Weggelassen odernull: Eine beliebige verbundene Nummer des Arbeitsbereichs sendet sie.textstringerforderlichDie Nachricht, bis zu 3.000 Zeichen. Sie ist auch die Bildunterschrift, wenn
mediagesendet wird.mediaobject or nulloptionalEin Bild oder eine Datei, die jedes Mal gesendet wird:
urlodermedia_idund optionaltype, wie unter Nachrichten → Medien.scheduleobjecterforderlichcron(erforderlich) undtimezone. Siehe Zeitplan.activebooleanoptionaltrue(Standard) führt sie aus;falseerstellt sie pausiert.
Zeitplan#
schedule.cron hat fünf durch Leerzeichen getrennte Teile: Minute, Stunde, Tag des Monats, Monat, Wochentag. * bedeutet „jeder“. Es muss ein Zeitplan sein, der irgendwann ausgeführt wird (nicht der 31. Februar).
cron | Wird ausgeführt |
|---|---|
0 9 * * 1 | Montags um 09:00 |
30 18 * * * | Jeden Tag um 18:30 |
0 10 1 * * | Am 1. jedes Monats um 10:00 |
0 9 * * 1-5 | Werktags um 09:00 |
0 8,20 * * * | Jeden Tag um 08:00 und 20:00 |
0 9 15 1 * | Am 15. Januar um 09:00, jedes Jahr |
schedule.timezone ist ein IANA-Zeitzonenname wie Asia/Kolkata, Europe/London oder America/New_York (Standard UTC). Die Cron-Zeiten gelten in dieser Zone, und auch next_run_at wird darin angegeben, mit ihrem Offset. Siehe die Zeitzonen-Referenz.
Jede Ausführung sendet eine Nachricht wie jede andere: Dafür müssen im Plan noch Nachrichten übrig sein, und sie erscheint unter Nachrichten auflisten.
Fehler beim Erstellen#
| HTTP | Code | Wann |
|---|---|---|
400 | validation_failed | Ein Pflichtfeld fehlt oder ist leer, ein Feld ist unbekannt oder zu lang (name, to.group), oder media ist ungültig |
400 | text_required | text ist leer |
400 | text_too_long | text hat mehr als 3.000 Zeichen |
400 | invalid_cron | schedule.cron hat nicht 5 Teile oder wird nie ausgeführt |
400 | invalid_timezone | schedule.timezone ist keine IANA-Zeitzone |
403 | plan_required | Der Plan enthält keine Erinnerungen |
403 | number_not_allowed | Der Schlüssel ist auf einige Nummern beschränkt, und from gehört nicht dazu oder fehlt |
422 | invalid_phone | to.phone ist keine gültige Nummer im internationalen Format mit + |
422 | invalid_username | to.username ist kein Telegram-Benutzername, kein Link und keine tg:-ID |
422 | username_needs_telegram | Ein Telegram-Benutzername, aber from ist kein Telegram-Konto (oder, ohne from, ist kein Telegram-Konto verbunden) |
422 | contact_not_found | Kein Kontakt mit dieser to.contact_id |
422 | media_not_found | Keine Datei mit dieser media.media_id |
422 | invalid_media_url | media.url ist kein öffentlicher http(s)-Link |
422 | number_not_connected | from ist keine verbundene Nummer dieses Arbeitsbereichs |
Erinnerungen auflisten#
https://wbiztool.com/api/v2/remindersDie Erinnerungen des Arbeitsbereichs, die neueste zuerst, in Seiten (limit 1 bis 100, Standard 25, und cursor). Pausierte sind enthalten, mit "active": false. Ein auf einige Nummern beschränkter Schlüssel sieht nur die Erinnerungen, die von diesen Nummern senden.
curl "https://wbiztool.com/api/v2/reminders?limit=50" \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
Die Antwort ist {"data": [Reminder, …], "next_cursor": "…" or null}.
Eine Erinnerung abrufen#
https://wbiztool.com/api/v2/reminders/{id}curl https://wbiztool.com/api/v2/reminders/812 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
Eine Erinnerung, die nicht existiert, gelöscht wurde oder von einer Nummer sendet, die der Schlüssel nicht nutzen darf, antwortet mit 404 reminder_not_found.
Erinnerung ändern, pausieren oder fortsetzen#
https://wbiztool.com/api/v2/reminders/{id}Body: JSON (application/json)
Senden Sie nur die Felder, die sich ändern; die anderen behalten ihre Werte. Die Felder sind die von Erinnerung erstellen. Die Antwort ist 200 mit der Erinnerung in ihrem aktuellen Zustand.
- Pausieren:
{"active": false}. Sie wird nicht mehr ausgeführt, undnext_run_atwirdnull. Pausieren funktioniert in jedem Plan. - Fortsetzen:
{"active": true}. Sie läuft ab ihrem nächsten Termin wieder. Zum Fortsetzen ist ein Plan mit Erinnerungen nötig. schedulewird als Ganzes ersetzt: Senden Siecronmit. Ohnetimezonebehält die Erinnerung ihre aktuelle Zeitzone.
# 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."}'import os
import requests
headers = {"Authorization": f"Bearer {os.environ['WBIZTOOL_API_KEY']}"}
url = "https://wbiztool.com/api/v2/reminders/812"
paused = requests.patch(url, headers=headers, json={"active": False}, timeout=30).json()
print(paused["active"], paused["next_run_at"]) # False None
resumed = requests.patch(url, headers=headers, json={"active": True}, timeout=30).json()
print(resumed["active"], resumed["next_run_at"])// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v2/reminders/812", {
method: "PATCH",
headers: { Authorization: `Bearer ${process.env.WBIZTOOL_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ active: false }),
});
const reminder = await response.json();
console.log(reminder.active, reminder.next_run_at); // false null<?php
$ch = curl_init('https://wbiztool.com/api/v2/reminders/812');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'PATCH',
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('WBIZTOOL_API_KEY'), 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['active' => false]),
CURLOPT_RETURNTRANSFER => true,
]);
$reminder = json_decode(curl_exec($ch), true);
curl_close($ch);
var_dump($reminder['active']);Eine Änderung antwortet mit denselben Fehlern wie das Erstellen sowie mit 404 reminder_not_found. Ist ein Feld falsch, wird nichts geändert.
Erinnerung löschen#
https://wbiztool.com/api/v2/reminders/{id}Löscht die Erinnerung: Sie wird nie wieder ausgeführt. Bereits gesendete Nachrichten bleiben im Verlauf. Um sie stattdessen eine Zeit lang anzuhalten, pausieren Sie sie.
curl -X DELETE https://wbiztool.com/api/v2/reminders/812 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
{ "id": 812, "deleted": true }
Das Reminder-Objekt#
| Feld | Typ | Beschreibung |
|---|---|---|
id | integer | Die ID der Erinnerung. |
name | string | Ihr Name. |
active | boolean | true, solange sie läuft, false, solange sie pausiert ist. |
to | object | Der Empfänger: phone (mit +), group oder username. Eine mit contact_id erstellte Erinnerung zeigt die Nummer oder Gruppe des Kontakts. |
from | integer or null | Die id der sendenden Nummer oder null für eine beliebige verbundene Nummer. |
text | string | Die Nachricht. |
media | object or null | type (image oder file), url und file_name. |
schedule | object | cron und timezone. |
next_run_at | string or null | Wann sie als Nächstes ausgeführt wird, in ihrer Zeitzone mit Offset, zum Beispiel 2026-10-19T09:00:00+05:30. null, solange sie pausiert ist. |
created_at | string | Wann sie erstellt wurde (UTC). |
Verwandte Themen#
- Erinnerungen im Dashboard
- Zeitzonen-Referenz
- Nachrichten: eine Nachricht zu einer festen Zeit mit
send_at - Fehler
