Mensagens
Enviar pelo número conectado e ler o histórico de uma conversa.
Enviar
/api/v1/messagesManda texto ou mídia. Se o telefone ainda não é contato, o contato e a conversa nascem aqui.
Corpo (JSON)
channelIdtextocom chave de contaPor qual número falar. Com uma chave de canal pode ser omitido — o escopo preenche. Com a chave da conta é obrigatório: faltando, a resposta é 422
Informe channelId.phonetextoPara quem. Informe
phoneouconversationId.conversationIdtextoResponder numa conversa que já existe. Precisa ser do mesmo canal, senão 422.
texttextoAté 4096 caracteres. Sem mídia, é a mensagem; com mídia, vira a legenda se não houver
caption.mediaUrlURLUm arquivo numa URL pública, que nós baixamos e enviamos. O endereço precisa ser público de verdade: se ele aponta para rede interna (ou redireciona para lá), ou se redireciona mais de três vezes, a resposta é 422 e nada é enviado.
mediaIdtextoUm arquivo do Drive do LinkZap — mais confiável que URL para o que você reenvia sempre.
captiontextoLegenda da mídia, até 1024 caracteres.
curl -X POST https://linkzap.orion.moe/api/v1/messages \
-H "Authorization: Bearer lz_SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{
"channelId": "chn_9f2a...",
"phone": "5592999990000",
"text": "Sua consulta está confirmada para quinta, 9h."
}'{
"data": {
"messageId": "msg_7bd0...",
"conversationId": "cnv_5ad2...",
"channelId": "chn_9f2a..."
}
}É preciso um de text, mediaUrl ou mediaId, e um de phone ou conversationId — faltando, a resposta é 422 dizendo qual.
409 é a recusa honesta
409 com o motivo real em palavras, e nada foi enviado. Isso é diferente de um erro: dá para mostrar o motivo para a sua equipe e tentar de novo depois. GET /channels antecipa o mesmo motivo.A mensagem aparece na caixa creditada como API, e não pausa a Aura — quem pausa a automação é uma pessoa respondendo pelo painel ou pelo celular. Se você está montando um chatbot próprio, leia a receita correspondente antes.
Ler o histórico
/api/v1/messagesAs mensagens de uma conversa, da mais recente para a mais antiga.
Parâmetros da URL
conversationIdtextoobrigatórioObrigatório. Ache o id em
GET /conversations.pageinteiroA partir de 1.
limitinteiroDe 1 a 200. Padrão 50.
includeNotesbooleanoPor padrão as notas internas da equipe não vêm.
trueas inclui.
curl "https://linkzap.orion.moe/api/v1/messages?conversationId=cnv_5ad2...&limit=20" \
-H "Authorization: Bearer lz_SUA_CHAVE"{
"conversationId": "cnv_5ad2...",
"data": [
{
"id": "msg_7bd0...",
"direction": "out",
"kind": "text",
"text": "Sua consulta está confirmada para quinta, 9h.",
"media": null,
"author": { "kind": "automation", "label": "Fluxo · Confirmação" },
"status": "read",
"receipts": {
"sent": "2026-09-21T14:02:59.000Z",
"delivered": "2026-09-21T14:03:04.000Z",
"read": "2026-09-21T14:05:22.000Z"
},
"externalId": "3EB0...",
"replyToId": null,
"transcript": null,
"createdAt": "2026-09-21T14:02:59.000Z"
}
],
"page": 1,
"limit": 20,
"total": 48
}directionéin(o contato),out(saiu daqui) ounote(nota interna, só comincludeNotes=true).authordiz quem escreveu:contact,team(com o nome da pessoa) ouautomation(com a origem —Aura,Fluxo · X,Campanha…). Mensagens antigas, de antes de existir esse carimbo, vêm comoAutomação.media.urlsó existe depois que o arquivo foi baixado para cá; enquantomedia.pendingfortrue, a URL énull— preferimos isso a entregar um link que não abre.transcripttraz a transcrição de uma nota de voz, quando a Aura já transcreveu.
Notas internas são internas
includeNotes=true.