Lembretes WhatsApp

Agendamento e envio de mensagens WhatsApp Business para clientes da Alcance. Suporta texto puro e mídia (imagem, vídeo, áudio, voz e documento) com envio imediato ou agendado.

Base path

Todos os endpoints abaixo são montados sob o prefixo:

/api/v1/lembretes

A URL completa em produção é https://api.contabilidadealcance.com.br/api/v1/lembretes.

Escopos

A API Key utilizada precisa conter pelo menos um dos escopos abaixo, conforme a operação:

EscopoOperações permitidas
lembretes:readGET /, GET /usuario/{usuario_id}, GET /cliente/{id_cliente}, GET /{id}
lembretes:writePOST /, PUT /{id}, POST /{id}/cancelar, DELETE /{id}

API Keys emitidas para o MCP devem ser restritas - nunca globais.

Endpoints

POST /lembretes/

Cria um lembrete WhatsApp vinculado ao usuário autenticado (usuario_id). Aceita texto puro ou mídia codificada em base64. Quando data_hora_envio é informado, o envio é agendado; se omitido, a mensagem é enviada imediatamente.

Parâmetros

Este endpoint não recebe parâmetros de rota ou query - os dados vão no corpo da requisição (LembreteCreate): contato e mensagem (obrigatórios), id_cliente, observacao, data_hora_envio, tipo_midia, arquivo_base64 e nome_arquivo (opcionais). Quando arquivo_base64 é informado, tipo_midia e nome_arquivo passam a ser obrigatórios.

Request

{
  "id_cliente": 1234,
  "contato": "5511988887777",
  "mensagem": "Olá! Lembrete: vence hoje o boleto do DAS de abril/2026.",
  "observacao": "Disparo automático - fluxo DAS mensal.",
  "data_hora_envio": "2026-05-20T10:00:00-03:00"
}

Response 201 Created

{
  "success": true,
  "message": "Lembrete criado com sucesso",
  "data": {
    "id": 1,
    "usuario_id": 42,
    "id_cliente": 1234,
    "contato": "5511988887777",
    "mensagem": "Olá! Lembrete: vence hoje o boleto do DAS de abril/2026.",
    "observacao": "Disparo automático - fluxo DAS mensal.",
    "data_hora_envio": "2026-05-20T10:00:00-03:00",
    "status": "agendado",
    "data_hora_criacao": "2026-07-03T09:15:00-03:00",
    "tipo_midia": null,
    "nome_arquivo": null
  }
}

Datetime naïve em data_hora_envio (sem offset ou Z) e demais validações de negócio retornam 422 Unprocessable Entity. Escopo: lembretes:write

GET /lembretes/

Lista todos os lembretes do tenant. Sem paginação no endpoint - recomenda-se filtrar pelos endpoints específicos abaixo quando o volume cresce. Lista vazia é um estado válido: retorna 200 OK com data: [] e a mensagem "Nenhum lembrete encontrado.".

Parâmetros

Este endpoint não recebe parâmetros de rota ou query. Retorna um array de LembreteRead.

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Lembretes recuperados com sucesso",
  "data": [
    {
      "id": 1,
      "usuario_id": 42,
      "id_cliente": 1234,
      "contato": "5511988887777",
      "mensagem": "Olá! Lembrete: vence hoje o boleto do DAS de abril/2026.",
      "observacao": "Disparo automático - fluxo DAS mensal.",
      "data_hora_envio": "2026-05-20T10:00:00-03:00",
      "status": "agendado",
      "data_hora_criacao": "2026-07-03T09:15:00-03:00",
      "tipo_midia": null,
      "nome_arquivo": null
    }
  ]
}

Escopo: lembretes:read

GET /lembretes/usuario/{usuario_id}

Lista lembretes criados pelo usuário responsável informado (operador interno da contabilidade). Sem resultados, retorna 200 OK com data: [] e a mensagem "Nenhum lembrete encontrado.".

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
usuario_idintpathsimID do usuário responsável (operador).

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Lembretes recuperados com sucesso",
  "data": [
    {
      "id": 1,
      "usuario_id": 42,
      "id_cliente": 1234,
      "contato": "5511988887777",
      "mensagem": "Olá! Lembrete: vence hoje o boleto do DAS de abril/2026.",
      "observacao": "Disparo automático - fluxo DAS mensal.",
      "data_hora_envio": "2026-05-20T10:00:00-03:00",
      "status": "agendado",
      "data_hora_criacao": "2026-07-03T09:15:00-03:00",
      "tipo_midia": null,
      "nome_arquivo": null
    }
  ]
}

Escopo: lembretes:read

GET /lembretes/cliente/{id_cliente}

Lista lembretes vinculados a um cliente específico - útil para timeline de comunicação WhatsApp por cliente. Sem resultados, retorna 200 OK com data: [] e a mensagem "Nenhum lembrete encontrado.".

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
id_clienteintpathsimID do cliente vinculado ao lembrete.

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Lembretes recuperados com sucesso",
  "data": [
    {
      "id": 1,
      "usuario_id": 42,
      "id_cliente": 1234,
      "contato": "5511988887777",
      "mensagem": "Olá! Lembrete: vence hoje o boleto do DAS de abril/2026.",
      "observacao": "Disparo automático - fluxo DAS mensal.",
      "data_hora_envio": "2026-05-20T10:00:00-03:00",
      "status": "agendado",
      "data_hora_criacao": "2026-07-03T09:15:00-03:00",
      "tipo_midia": null,
      "nome_arquivo": null
    }
  ]
}

Escopo: lembretes:read

GET /lembretes/{lembrete_id}

Retorna um único lembrete pelo ID. Quando não encontrado (ou pertencente a outro usuário), retorna 404 Not Found.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
lembrete_idintpathsimID interno do lembrete.

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Lembrete encontrado com sucesso",
  "data": {
    "id": 1,
    "usuario_id": 42,
    "id_cliente": 1234,
    "contato": "5511988887777",
    "mensagem": "Olá! Lembrete: vence hoje o boleto do DAS de abril/2026.",
    "observacao": "Disparo automático - fluxo DAS mensal.",
    "data_hora_envio": "2026-05-20T10:00:00-03:00",
    "status": "agendado",
    "data_hora_criacao": "2026-07-03T09:15:00-03:00",
    "tipo_midia": null,
    "nome_arquivo": null
  }
}

Escopo: lembretes:read

PUT /lembretes/{lembrete_id}

Atualiza mensagem, observacao e/ou data_hora_envio de um lembrete ainda não enviado. O body é um LembreteUpdate com campos parciais - somente o que vier preenchido é alterado. A regra de timezone explícito vale também para o PUT.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
lembrete_idintpathsimID do lembrete.

Request (LembreteUpdate - todos os campos opcionais)

{
  "mensagem": "Olá! Lembrete atualizado: o boleto do DAS vence amanhã.",
  "data_hora_envio": "2026-05-21T09:00:00-03:00"
}

Response 200 OK

{
  "success": true,
  "message": "Lembrete atualizado com sucesso",
  "data": {
    "id": 1,
    "usuario_id": 42,
    "id_cliente": 1234,
    "contato": "5511988887777",
    "mensagem": "Olá! Lembrete atualizado: o boleto do DAS vence amanhã.",
    "observacao": "Disparo automático - fluxo DAS mensal.",
    "data_hora_envio": "2026-05-21T09:00:00-03:00",
    "status": "agendado",
    "data_hora_criacao": "2026-07-03T09:15:00-03:00",
    "tipo_midia": null,
    "nome_arquivo": null
  }
}

Lembrete inexistente retorna 404 Not Found; datetime naïve e demais regras de negócio retornam 422 Unprocessable Entity. Escopo: lembretes:write

POST /lembretes/{lembrete_id}/cancelar

Cancela um lembrete agendado. Não funciona em lembretes já enviados ou com status final. Operação idempotente do ponto de vista do scheduler.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
lembrete_idintpathsimID do lembrete agendado a cancelar.

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Lembrete cancelado com sucesso",
  "data": {
    "id": 1,
    "usuario_id": 42,
    "id_cliente": 1234,
    "contato": "5511988887777",
    "mensagem": "Olá! Lembrete: vence hoje o boleto do DAS de abril/2026.",
    "observacao": "Disparo automático - fluxo DAS mensal.",
    "data_hora_envio": "2026-05-20T10:00:00-03:00",
    "status": "cancelado",
    "data_hora_criacao": "2026-07-03T09:15:00-03:00",
    "tipo_midia": null,
    "nome_arquivo": null
  }
}

Lembrete inexistente retorna 404 Not Found; lembrete que não pode ser cancelado retorna 422 Unprocessable Entity. Escopo: lembretes:write

DELETE /lembretes/{lembrete_id}

Remove permanentemente o registro do lembrete da base.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
lembrete_idintpathsimID do lembrete.

Request

Sem corpo de requisição.

Response 204 No Content

Sem corpo de resposta.

Lembrete inexistente retorna 404 Not Found. Escopo: lembretes:write

O MCP não expõe o endpoint DELETE. Exclusão segue restrita a chamadas diretas autenticadas com escopo lembretes:write e fora do alcance de clientes IA.

Schemas

LembreteCreate

CampoTipoObrigatórioObservações
id_clienteint | nullnãoVincula o lembrete a um cliente. Quando null, fica como envio avulso.
contatostrsimTelefone destino no padrão WhatsApp (ex: 5511988887777).
mensagemstrsimTexto da mensagem WhatsApp. Aceita emojis e quebras de linha.
observacaostr | nullnãoAnotação interna - não vai para o WhatsApp.
data_hora_enviodatetime | nullnãoCom timezone obrigatório (validador rejeita naïve). Omitir = envio imediato.
tipo_midiastr | nullcondicionalUm de image, video, audio, voice, document. Obrigatório quando arquivo_base64 é informado.
arquivo_base64str | nullnãoConteúdo da mídia em base64.
nome_arquivostr | nullcondicionalNome com extensão (ex: boleto.pdf). Obrigatório quando arquivo_base64 é informado.

LembreteRead

CampoTipoNotas
idintIdentificador do lembrete.
usuario_idintOperador que criou o registro.
id_clienteint | nullCliente vinculado, se houver.
contatostrTelefone destino.
mensagemstrConteúdo enviado.
observacaostr | nullAnotação interna.
data_hora_enviodatetimeSempre normalizado para America/Sao_Paulo na resposta.
statusstrCiclo de vida: agendado, enviado, cancelado, falha, etc.
data_hora_criacaodatetimeTimestamp de criação (TZ Brasília).
tipo_midiastr | nullTipo da mídia, quando aplicável.
nome_arquivostr | nullNome do arquivo enviado, quando aplicável.

Exemplo POST

Lembrete agendado para 20/05/2026 às 10h (horário de Brasília), vinculado ao cliente 1234:

{
  "id_cliente": 1234,
  "contato": "5511988887777",
  "mensagem": "Olá! Lembrete: vence hoje o boleto do DAS de abril/2026. Qualquer dúvida, estamos à disposição.",
  "observacao": "Disparo automático - fluxo DAS mensal.",
  "data_hora_envio": "2026-05-20T10:00:00-03:00"
}

Para envio imediato basta omitir data_hora_envio. Para anexar boleto PDF, incluir tipo_midia: "document", arquivo_base64 e nome_arquivo: "das-abr-2026.pdf".

Notas

Timezone obrigatório

data_hora_envio exige timezone explícito (ex: 2026-05-20T10:00:00-03:00). Datetime naïve - sem offset nem Z - é rejeitado pelo validador com erro 422 antes mesmo de chegar no scheduler.

Envio com mídia

Para anexar arquivo, os três campos tipo_midia, arquivo_base64 e nome_arquivo precisam estar presentes juntos. Valores aceitos de tipo_midia: image, video, audio, voice, document.