Documentação · API v1

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.

1

Crie sua chave

Logado na sua conta, gere uma chave em Minhas chaves. Ela aparece uma única vez: guarde em local seguro.

2

Chame a API

Todas as rotas vivem em /api/v1 e recebem a chave no header Authorization.

3

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.

EscopoPermite
agenda:lerListar compromissos
agenda:escreverCriar, editar e cancelar compromissos
cobranca:lerListar e consultar cobranças
cobranca:escreverCriar, enviar, quitar, cancelar e excluir cobranças
webhooks:gerenciarCadastrar, testar e remover webhooks
*Acesso total (todos os escopos acima)
A chave sk_live_ é secreta. Use apenas no seu servidor (Node, PHP, Python...). Nunca a coloque no JavaScript do navegador nem no app distribuído: qualquer pessoa consegue ler o código-fonte e usar a sua conta.

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

GET/v1/agendaescopo agenda:ler
ParâmetroTipoDescrição
statusopcionalstringfuturo (padrão), passado ou cancelado
limitopcionalnúmeroMáximo por página (padrão 50, teto 200)
offsetopcionalnúmeroQuantos 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

POST/v1/agendaescopo agenda:escrever
CampoTipoDescrição
tituloobrigatóriostringEx.: "Limpeza de pele · Maria"
data_horaobrigatóriostringISO 8601 com fuso, ex.: 2026-07-22T14:00:00-03:00
nome_contatoopcionalstringNome do cliente final
telefone_contatoopcionalstringWhatsApp do cliente (DDD + número). Com nome + telefone, a confirmação é enviada na hora
lembrar_antesopcionalnúmeroMinutos de antecedência do lembrete (padrão 30)
localopcionalstringEndereço ou sala
notasopcionalstringObservaçõ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);
Resposta 201 com o compromisso criado. Sem nome_contato e telefone_contato, apenas grava na agenda, sem enviar mensagem.

Editar compromisso

PUT/v1/agenda/:idescopo agenda:escrever

Envie só o que quer mudar: titulo, data_hora, lembrar_antes, local, notas. O lembrete é reagendado e o Google Calendar re-sincronizado.

Cancelar compromisso

DELETE/v1/agenda/:idescopo agenda:escrever

Marca 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

GET/v1/cobrancasescopo cobranca:ler
ParâmetroTipoDescrição
statusopcionalstringpendente (padrão), recebido, cancelado ou todas
limit / offsetopcionalnúmeroPaginação (padrão 50, teto 200)

Buscar uma cobrança

GET/v1/cobrancas/:idescopo cobranca:ler

Aceita o id longo (UUID) ou o id curto do link de pagamento (ex.: AB3K9).

Criar cobrança

POST/v1/cobrancasescopo cobranca:escrever
CampoTipoDescrição
devedorobrigatóriostringNome de quem vai pagar
valorobrigatórionúmeroEm reais, ex.: 150.00
descricaoopcionalstringEx.: "Mensalidade de julho"
data_vencimentoopcionalstringYYYY-MM-DD
telefone_devedoropcionalstringWhatsApp de quem paga (DDD + número)
enviar_whatsappopcionalbooleanSe 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

POST/v1/cobrancas/:id/cobrarescopo cobranca:escrever

Dispara 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

POST/v1/cobrancas/:id/quitarescopo cobranca:escrever

Marca 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

POST/v1/cobrancas/:id/cancelarescopo cobranca:escrever

Excluir

DELETE/v1/cobrancas/:idescopo cobranca:escrever

Apaga 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:

EventoQuando dispara
cobranca.pagaUma cobrança sua foi recebida: pelo link Pix, pelo bot, pela API ou marcada no dashboard
agendamento.criadoEntrou 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"
  }
}
Responda rápido com status 2xx. Após 25 falhas seguidas o webhook é pausado automaticamente. Sua URL precisa ser 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

GET/v1/webhooksescopo webhooks:gerenciar
POST/v1/webhooksescopo webhooks:gerenciar
curl -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 }
POST/v1/webhooks/:id/testardispara um evento teste agora
DELETE/v1/webhooks/:idremove o webhook

Limite 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ódigoSignificado
400Corpo ou parâmetros inválidos (a mensagem diz o campo)
401Chave ausente, inválida ou revogada
403A chave existe mas não tem o escopo necessário
404Recurso não encontrado (ou não pertence à sua conta)
429Limite de requisições atingido
500Erro 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.