API de lembretes
API para criar lembretes
Crie uma mensagem de WhatsApp recorrente que é enviada automaticamente de acordo com um agendamento. Use-a para lembretes de pagamento, check-ins semanais, follow-ups diários e outras mensagens que se repetem.
https://wbiztool.com/api/v1/reminder/create/Corpo: JSON ou campos de formulário
Você descreve o agendamento com uma expressão cron e um fuso horário. Sempre que o agendamento corresponder, o Wbiztool coloca na fila uma mensagem para o número de telefone ou grupo, igual a uma mensagem enviada com Enviar mensagem. Os lembretes criados aqui também aparecem na página Lembretes do seu painel, onde você pode pausá-los ou editá-los.
Exemplo rápido#
curl -X POST https://wbiztool.com/api/v1/reminder/create/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"reminder_name": "Monthly rent reminder",
"phone": "919876543210",
"message": "Hi Aman, a reminder that your rent is due on {current_date_formatted}.",
"cron_expression": "0 10 1 * *",
"timezone": "Asia/Kolkata"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/reminder/create/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"reminder_name": "Monthly rent reminder",
"phone": "919876543210",
"message": "Hi Aman, a reminder that your rent is due on {current_date_formatted}.",
"cron_expression": "0 10 1 * *",
"timezone": "Asia/Kolkata",
},
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("Reminder created with reminder_id", result["reminder_id"])
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/create/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
whatsapp_client: 678,
reminder_name: "Monthly rent reminder",
phone: "919876543210",
message: "Hi Aman, a reminder that your rent is due on {current_date_formatted}.",
cron_expression: "0 10 1 * *",
timezone: "Asia/Kolkata",
}),
});
// 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("Reminder created with reminder_id", result.reminder_id);
} else {
console.error("Failed:", result.message);
}<?php
$payload = [
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'whatsapp_client' => 678,
'reminder_name' => 'Monthly rent reminder',
'phone' => '919876543210',
'message' => 'Hi Aman, a reminder that your rent is due on {current_date_formatted}.',
'cron_expression' => '0 10 1 * *',
'timezone' => 'Asia/Kolkata',
];
$ch = curl_init('https://wbiztool.com/api/v1/reminder/create/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
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) {
echo 'Reminder created with reminder_id ' . $result['reminder_id'];
} else {
echo 'Failed: ' . $result['message'];
}Este lembrete é enviado às 10:00, horário da Índia, no dia 1º de cada mês. Substitua 12345, YOUR_API_KEY e 678 pelos seus próprios valores. Veja em Autenticação onde encontrá-los.
Parâmetros da requisição#
Envie os parâmetros como corpo JSON ou como campos de formulário. Em JSON, envie todos os valores de texto (api_key, reminder_name, phone, message, cron_expression, timezone, img_url, file_name) como string.
Autenticação
client_idintegerobrigatórioSeu ID do Cliente da API, em Configurações → Chaves API.
api_keystringobrigatórioSua chave de API, na mesma página.
Remetente
whatsapp_clientintegeropcionalID do número de WhatsApp a partir do qual enviar, nas configurações do WhatsApp. Se você não enviar, ou se o ID não estiver no seu espaço de trabalho, cada lembrete é enviado do primeiro número conectado do seu espaço de trabalho no momento da execução.
Lembrete
reminder_namestringobrigatórioUm nome para o lembrete, exibido na página Lembretes e disponível na mensagem como
{reminder_name}.phonestringobrigatórioO número de WhatsApp do destinatário com o código do país, por exemplo
919876543210. Não há um parâmetrocountry_codeseparado. Espaços,+,-,.e parênteses são removidos, assim como um0inicial (até dois zeros iniciais em um corpo JSON). Um valor que não seja composto só de dígitos é tratado como nome de grupo de WhatsApp.messagestringobrigatórioO texto da mensagem. Pode incluir variáveis de modelo, que são preenchidas a cada execução do lembrete. A formatação do WhatsApp funciona:
*bold*,_italic_,~strikethrough~.cron_expressionstringobrigatórioQuando enviar, como uma expressão cron de cinco campos, por exemplo
0 9 * * 1-5. Veja Expressões cron.timezonestringopcionalO fuso horário em que a expressão cron é executada, como nome de fuso horário IANA, por exemplo
Asia/Kolkata,America/New_YorkouEurope/London. Se você não enviar, é usadoUTC. Uma string vazia retornaInvalid timezone. Veja a lista completa na Referência de fusos horários.
Imagens e arquivos
msg_typeintegeropcional0texto (padrão),1imagem ou2arquivo, commessagecomo legenda. Qualquer outro valor é tratado como0.img_urlstringObrigatório quando msg_type é 1 ou 2URL pública
httpouhttpsda imagem, ou do arquivo paramsg_type2, com até 1.000 caracteres. Ela é baixada a cada execução do lembrete, então mantenha o link funcionando. Você pode hospedar arquivos com a API de upload de mídia.file_namestringObrigatório quando msg_type é 2Para
msg_type2, o nome do arquivo com a extensão, com até 100 caracteres, por exemploinvoice.pdf. Ignorado nos outros tipos de mensagem.
Expressões cron#
Uma expressão cron tem cinco valores separados por espaços. O lembrete é executado sempre que o horário atual em timezone corresponde aos cinco:
┌───────── minute (0-59)
│ ┌─────── hour (0-23)
│ │ ┌───── day of month (1-31)
│ │ │ ┌─── month (1-12)
│ │ │ │ ┌─ day of week (0-7, where 0 and 7 are Sunday)
│ │ │ │ │
0 9 * * 1-5
| Símbolo | Significado | Exemplo |
|---|---|---|
* | Todos os valores | * no campo de hora significa a cada hora. |
, | Uma lista de valores | 9,18 no campo de hora significa 9:00 e 18:00. |
- | Um intervalo | 1-5 no campo de dia da semana significa de segunda a sexta. |
/ | Um passo | */6 no campo de hora significa a cada 6 horas. |
Exemplos comuns#
| Expressão | Executa |
|---|---|
0 9 * * * | Todos os dias às 9:00 |
0 9 * * 1-5 | De segunda a sexta às 9:00 |
0 9 * * 1 | Toda segunda-feira às 9:00 |
30 18 * * 0 | Todo domingo às 18:30 |
0 9,18 * * * | Todos os dias às 9:00 e às 18:00 |
0 */6 * * * | A cada 6 horas, em hora cheia |
*/30 9-17 * * 1-5 | A cada 30 minutos, das 9:00 às 17:30, de segunda a sexta |
0 9 1 * * | Dia 1º de cada mês às 9:00 |
0 10 15 * * | Dia 15 de cada mês às 10:00 |
0 8 1 1 * | Todo 1º de janeiro às 8:00 |
Os horários estão no timezone do lembrete. Use somente cinco campos: não adicione um campo de segundos nem atalhos como @daily.
Variáveis de modelo#
Estes marcadores em message são substituídos a cada execução do lembrete. Datas e horários estão no timezone do lembrete.
| Variável | Substituída por | Exemplo |
|---|---|---|
{current_date} | Data | 2026-10-01 |
{current_date_formatted} | Data por extenso, com o dia completado com zero | October 01, 2026 |
{current_time} | Horário no formato 24 horas | 09:00:00 |
{current_time_12h} | Horário no formato 12 horas | 09:00 AM |
{current_datetime} | Data e hora | 2026-10-01 09:00:00 |
{timezone} | O valor de timezone | Asia/Kolkata |
{timezone_short} | Abreviação do fuso horário | IST |
{reminder_name} | O valor de reminder_name | Monthly rent reminder |
{to_number} | O valor salvo de phone | 919876543210 |
{client_name} | Nome do proprietário do espaço de trabalho | |
{organisation_name} | Nome do seu espaço de trabalho |
Lembrete com imagem#
curl -X POST https://wbiztool.com/api/v1/reminder/create/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"reminder_name": "Weekly class timetable",
"phone": "919876543210",
"msg_type": 1,
"img_url": "https://example.com/timetable.png",
"message": "Here is this week'\''s timetable.",
"cron_expression": "0 8 * * 1",
"timezone": "Asia/Kolkata"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/reminder/create/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"reminder_name": "Weekly class timetable",
"phone": "919876543210",
"msg_type": 1,
"img_url": "https://example.com/timetable.png",
"message": "Here is this week's timetable.",
"cron_expression": "0 8 * * 1",
"timezone": "Asia/Kolkata",
},
timeout=60,
)
print(response.status_code, response.text)// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/reminder/create/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
whatsapp_client: 678,
reminder_name: "Weekly class timetable",
phone: "919876543210",
msg_type: 1,
img_url: "https://example.com/timetable.png",
message: "Here is this week's timetable.",
cron_expression: "0 8 * * 1",
timezone: "Asia/Kolkata",
}),
});
console.log(response.status, await response.text());<?php
$ch = curl_init('https://wbiztool.com/api/v1/reminder/create/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query([
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'whatsapp_client' => 678,
'reminder_name' => 'Weekly class timetable',
'phone' => '919876543210',
'msg_type' => 1,
'img_url' => 'https://example.com/timetable.png',
'message' => "Here is this week's timetable.",
'cron_expression' => '0 8 * * 1',
'timezone' => 'Asia/Kolkata',
]),
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
curl_close($ch);O exemplo em PHP envia campos de formulário em vez de JSON. Os dois funcionam.
Resposta#
Uma requisição bem-sucedida retorna HTTP 200:
{
"reminder_id": 3187,
"message": "Reminder created successfully",
"status": 1
}
| Campo | Tipo | Descrição |
|---|---|---|
status | integer | 1 se o lembrete foi criado, 0 se a requisição falhou. |
message | string | Reminder created successfully; caso contrário, o erro. |
reminder_id | integer | ID do novo lembrete. Guarde-o para cancelar o lembrete depois. Presente apenas em caso de sucesso. |
Novos lembretes ficam ativos imediatamente.
Erros#
Os erros retornam HTTP 400 com status igual a 0, salvo indicação em contrário:
{ "status": 0, "message": "Invalid timezone" }
| Mensagem | Como corrigir |
|---|---|
Invalid JSON format: … | O corpo JSON não é válido, geralmente por causa de uma vírgula sobrando no final ou de uma quebra de linha sem escape em message. Use \n para novas linhas. Você também recebe esta mensagem em uma requisição de formulário sem client_id ou em qualquer requisição GET. |
Invalid client id. | Envie client_id como número. |
Reminder name cannot be null | Adicione reminder_name. |
Phone number cannot be null | Adicione phone. |
Message template cannot be null | Adicione message. |
Cron expression cannot be null | Adicione cron_expression. |
Auth Error - Please send correct API key and Client id | Envie uma api_key não vazia. |
Invalid cron expression | Verifique se a expressão tem cinco campos válidos. Veja Expressões cron. |
Invalid timezone | Use um nome IANA como Asia/Kolkata, não uma abreviação como IST. |
Image URL cannot be null for image messages | Para msg_type 1, envie img_url. |
File URL cannot be null for file messages | Para msg_type 2, envie file_name. |
Auth Error: invalid api key | A chave pertence a outro client_id. |
Auth Error: please check client id | A chave não está vinculada a um espaço de trabalho. Crie uma nova chave no espaço de trabalho que você quer usar. |
Demo Account cannot access APIs | Use uma conta normal. |
Not enough credits | Seu plano não tem mais mensagens disponíveis. |
Upgrade your plan to use reminders feature | Seu plano não inclui lembretes. Faça upgrade do seu plano. |
WhatsApp Logged Out. Please Reconnect!! | O número de whatsapp_client está desconectado. Reconecte-o nas configurações do WhatsApp. |
Invalid WhatsApp client id | Envie whatsapp_client como número. |
Error creating reminder: … (HTTP 500) | Não foi possível salvar o lembrete. Verifique os valores enviados, por exemplo se img_url tem 1.000 caracteres ou menos e file_name tem 100 ou menos. |
Como os lembretes são executados#
- O agendamento é verificado no
timezonedo lembrete, e a mensagem entra na fila quando o horário atual corresponde à expressão cron. - Cada execução cria uma mensagem normal, enviada do seu número de WhatsApp, então o número precisa continuar conectado.
- Uma execução é ignorada se o seu espaço de trabalho não tiver mais créditos, ou se nenhum
whatsapp_clientfoi definido e nenhum número do seu espaço de trabalho estiver conectado naquele momento. - Se
whatsapp_clientestiver definido, cada execução é colocada na fila desse número, mesmo que ele tenha sido desconectado desde então, e fica aguardando ali. Não há troca para outro número. - Os lembretes são verificados periodicamente, não ao segundo, e a mensagem então aguarda na fila de envio como qualquer outra. Não conte com um horário exato. Se uma verificação atrasar, a execução ainda é enviada com até 10 minutos de atraso (até 1 minuto na primeira execução de um lembrete); depois disso, ela é ignorada. A mesma execução nunca é enviada duas vezes.
Dicas#
- Liste e organize: obtenha seus lembretes e os IDs deles com Listar lembretes, e interrompa um lembrete com Cancelar lembrete.
- Pausar e editar não está disponível pela API. Use a página Lembretes do seu painel.
- Muitos lembretes de uma vez: a página Lembretes também pode importar lembretes de um arquivo CSV.
- Novas linhas em JSON: escreva-as como
\ndentro demessage. Uma quebra de linha literal deixa o JSON inválido.
