API do Seu Secretário
Conecte seu site, aplicativo ou sistema ao Seu Secretário e use a nossa estrutura pronta: agenda com confirmação e lembrete no WhatsApp, cobranças com link de pagamento Pix e avisos automáticos (webhooks) quando algo acontece na sua conta.
Crie sua chave
Logado na sua conta, gere uma chave em Minhas chaves. Ela aparece uma única vez: guarde em local seguro.
Chame a API
Todas as rotas vivem em /api/v1 e recebem a chave no header Authorization.
Receba avisos
Cadastre um webhook e seu sistema é avisado quando uma cobrança é paga ou um horário é agendado.
URL base
https://www.seusecretario.com.br/api/v1
Teste em 10 segundos
curl https://www.seusecretario.com.br/api/v1/ping \
-H "Authorization: Bearer SUA_CHAVE"
# → {"ok":true,"usuario_id":"...","escopos":["*"]}
Autenticação #
Toda requisição leva a sua chave secreta no header:
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Cada chave pertence a uma conta e carrega escopos (permissões). Crie chaves diferentes para integrações diferentes: se uma vazar, você revoga só ela.
| Escopo | Permite |
|---|---|
| agenda:ler | Listar compromissos |
| agenda:escrever | Criar, editar e cancelar compromissos |
| cobranca:ler | Listar e consultar cobranças |
| cobranca:escrever | Criar, enviar, quitar, cancelar e excluir cobranças |
| webhooks:gerenciar | Cadastrar, testar e remover webhooks |
| * | Acesso total (todos os escopos acima) |
Minhas chaves #
Para gerenciar suas chaves, entre na sua conta e volte a esta página.
Agenda #
Os compromissos da sua conta: os mesmos que aparecem no dashboard e que o bot do WhatsApp cria e
lembra. Ao criar com nome_contato e telefone_contato, o seu cliente recebe a
confirmação no WhatsApp na hora, e o lembrete automático perto do horário fica por nossa conta. Contas
com Google Calendar conectado sincronizam também.
Listar compromissos
agenda:ler| Parâmetro | Tipo | Descrição |
|---|---|---|
| statusopcional | string | futuro (padrão), passado ou cancelado |
| limitopcional | número | Máximo por página (padrão 50, teto 200) |
| offsetopcional | número | Quantos pular (paginação) |
curl "https://www.seusecretario.com.br/api/v1/agenda?status=futuro&limit=10" \
-H "Authorization: Bearer SUA_CHAVE"
# Resposta 200
{
"compromissos": [
{ "id": "dc1671c2-...", "titulo": "Corte · Lucas", "data_hora": "2026-07-17T13:00:00.000Z",
"nome_contato": "Lucas", "telefone_contato": "5531999999999", "origem": "whatsapp-oficial" }
],
"total": 1, "limit": 10, "offset": 0
}
Criar compromisso
agenda:escrever| Campo | Tipo | Descrição |
|---|---|---|
| tituloobrigatório | string | Ex.: "Limpeza de pele · Maria" |
| data_horaobrigatório | string | ISO 8601 com fuso, ex.: 2026-07-22T14:00:00-03:00 |
| nome_contatoopcional | string | Nome do cliente final |
| telefone_contatoopcional | string | WhatsApp do cliente (DDD + número). Com nome + telefone, a confirmação é enviada na hora |
| lembrar_antesopcional | número | Minutos de antecedência do lembrete (padrão 30) |
| localopcional | string | Endereço ou sala |
| notasopcional | string | Observações internas |
curl -X POST https://www.seusecretario.com.br/api/v1/agenda \
-H "Authorization: Bearer SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{
"titulo": "Limpeza de pele · Maria",
"data_hora": "2026-07-22T14:00:00-03:00",
"nome_contato": "Maria",
"telefone_contato": "31999998888"
}'
const resposta = await fetch('https://www.seusecretario.com.br/api/v1/agenda', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + process.env.SS_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
titulo: 'Limpeza de pele · Maria',
data_hora: '2026-07-22T14:00:00-03:00',
nome_contato: 'Maria',
telefone_contato: '31999998888',
}),
});
const compromisso = await resposta.json();
$ch = curl_init('https://www.seusecretario.com.br/api/v1/agenda');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('SS_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'titulo' => 'Limpeza de pele · Maria',
'data_hora' => '2026-07-22T14:00:00-03:00',
'nome_contato' => 'Maria',
'telefone_contato' => '31999998888',
]),
]);
$compromisso = json_decode(curl_exec($ch), true);
201 com o compromisso criado. Sem nome_contato e
telefone_contato, apenas grava na agenda, sem enviar mensagem.Editar compromisso
agenda:escreverEnvie só o que quer mudar: titulo, data_hora, lembrar_antes,
local, notas. O lembrete é reagendado e o Google Calendar re-sincronizado.
Cancelar compromisso
agenda:escreverMarca como cancelado (não apaga o histórico) e remove do Google Calendar, se sincronizado.
Cobranças #
Crie uma cobrança e receba de volta o link_pagamento: uma página pronta onde o seu cliente
gera o Pix na hora, pelo banco ativo na sua conta (Asaas, Inter ou Mercado Pago). Com
enviar_whatsapp: true, nós mesmos mandamos a cobrança no WhatsApp dele.
Listar cobranças
cobranca:ler| Parâmetro | Tipo | Descrição |
|---|---|---|
| statusopcional | string | pendente (padrão), recebido, cancelado ou todas |
| limit / offsetopcional | número | Paginação (padrão 50, teto 200) |
Buscar uma cobrança
cobranca:lerAceita o id longo (UUID) ou o id curto do link de pagamento (ex.: AB3K9).
Criar cobrança
cobranca:escrever| Campo | Tipo | Descrição |
|---|---|---|
| devedorobrigatório | string | Nome de quem vai pagar |
| valorobrigatório | número | Em reais, ex.: 150.00 |
| descricaoopcional | string | Ex.: "Mensalidade de julho" |
| data_vencimentoopcional | string | YYYY-MM-DD |
| telefone_devedoropcional | string | WhatsApp de quem paga (DDD + número) |
| enviar_whatsappopcional | boolean | Se true, envia a cobrança no WhatsApp na hora (exige telefone) |
curl -X POST https://www.seusecretario.com.br/api/v1/cobrancas \
-H "Authorization: Bearer SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{
"devedor": "João Silva",
"valor": 150.00,
"descricao": "Mensalidade de julho",
"data_vencimento": "2026-07-25",
"telefone_devedor": "31988887777",
"enviar_whatsapp": true
}'
# Resposta 201
{
"id_curto": "AB3K9",
"status": "pendente",
"valor": 150,
"link_pagamento": "https://www.seusecretario.com.br/cobrar/AB3K9"
}
const resposta = await fetch('https://www.seusecretario.com.br/api/v1/cobrancas', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + process.env.SS_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
devedor: 'João Silva',
valor: 150.00,
descricao: 'Mensalidade de julho',
telefone_devedor: '31988887777',
enviar_whatsapp: true,
}),
});
const cobranca = await resposta.json();
console.log(cobranca.link_pagamento); // página onde o cliente gera o Pix
Enviar (ou reenviar) por WhatsApp
cobranca:escreverDispara a mensagem de cobrança para o telefone_devedor salvo (ou o enviado no corpo:
{ "telefone_devedor": "31988887777" }). Útil para lembrar quem ainda não pagou.
Quitar
cobranca:escreverMarca como recebida (ex.: o cliente pagou em dinheiro). O valor vira receita nas suas finanças, igual ao dashboard. Pagamentos pelo link Pix são baixados sozinhos, sem precisar desta rota.
Cancelar
cobranca:escreverExcluir
cobranca:escreverApaga de vez. Para manter histórico, prefira cancelar.
Webhooks #
Em vez de ficar perguntando "já pagou?", cadastre uma URL do seu sistema e nós avisamos em até 30 segundos quando acontecer:
| Evento | Quando dispara |
|---|---|
| cobranca.paga | Uma cobrança sua foi recebida: pelo link Pix, pelo bot, pela API ou marcada no dashboard |
| agendamento.criado | Entrou horário novo na agenda: pelo site, pelo bot do WhatsApp, pelo dashboard ou pela API |
O que chega no seu servidor:
POST https://seu-sistema.com.br/webhook
X-SS-Evento: cobranca.paga
X-SS-Webhook-Id: 0e5d48e7-...
X-SS-Assinatura: sha256=3f1a9c...
{
"evento": "cobranca.paga",
"criado_em": "2026-07-17T10:32:00.000Z",
"dados": {
"id_curto": "AB3K9",
"devedor": "João Silva",
"valor": 150,
"status": "recebido",
"link_pagamento": "https://www.seusecretario.com.br/cobrar/AB3K9"
}
}
https:// e pública.Validar a assinatura
Cada entrega vem assinada com HMAC SHA-256 do corpo, usando o secret devolvido no
cadastro do webhook. Valide antes de confiar no conteúdo:
const crypto = require('crypto');
app.post('/webhook', express.json(), (req, res) => {
const esperado = 'sha256=' + crypto
.createHmac('sha256', process.env.SS_WEBHOOK_SECRET)
.update(JSON.stringify(req.body))
.digest('hex');
if (req.headers['x-ss-assinatura'] !== esperado)
return res.status(401).end();
// tudo certo: reaja ao evento
console.log(req.body.evento, req.body.dados);
res.json({ ok: true });
});
$corpo = file_get_contents('php://input');
$esperado = 'sha256=' . hash_hmac('sha256', $corpo, getenv('SS_WEBHOOK_SECRET'));
if (!hash_equals($esperado, $_SERVER['HTTP_X_SS_ASSINATURA'] ?? '')) {
http_response_code(401);
exit;
}
$evento = json_decode($corpo, true);
// reaja ao evento
Gerenciar webhooks
webhooks:gerenciarwebhooks:gerenciarcurl -X POST https://www.seusecretario.com.br/api/v1/webhooks \
-H "Authorization: Bearer SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{ "url": "https://seu-sistema.com.br/webhook", "eventos": ["cobranca.paga"] }'
# Resposta 201: guarde o secret para validar as entregas
{ "id": "0e5d48e7-...", "secret": "whsec_...", "eventos": ["cobranca.paga"], "ativo": true }
teste agoraLimite de 5 webhooks ativos por conta. Use "eventos": ["*"] para escutar tudo.
Erros e limites #
Toda resposta de erro vem em JSON com o campo erro explicando o problema em português.
| Código | Significado |
|---|---|
| 400 | Corpo ou parâmetros inválidos (a mensagem diz o campo) |
| 401 | Chave ausente, inválida ou revogada |
| 403 | A chave existe mas não tem o escopo necessário |
| 404 | Recurso não encontrado (ou não pertence à sua conta) |
| 429 | Limite de requisições atingido |
| 500 | Erro interno nosso: tente de novo e, se persistir, fale com o suporte |
Rate limit
Cada chave pode fazer 120 requisições por minuto. Acompanhe pelos headers de toda resposta:
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 117
Retry-After: 42 # só quando você recebe 429
Suporte #
Dúvida na integração? Chame o suporte no WhatsApp: wa.me/5531973065781. Mande o trecho da requisição (sem a chave!) e a resposta que recebeu.