Referência da API
Todas as rotas
Gerada do OpenAPI 3.1 desta instalação — que por sua vez sai das mesmas validações que as rotas usam. Para a explicação em prosa de cada uma, veja a documentação.
/api/v1/meConfere a chave
Diz de qual organização é a chave e se ela alcança a conta inteira (`scope: account`) ou um número só (`scope: channel`). É a primeira chamada a fazer com uma chave nova.
Respostas
200Os dados da chave e da organização.
401422429500
/api/v1/channelsLista os números conectados
Traz o `channelId` que quase toda escrita pede, em ordem alfabética pelo rótulo. **Não é paginada.** `ready: false` vem com `reason` — o MESMO motivo que um envio recusaria com 409, o que permite checar antes em vez de tentar e tratar o erro. Uma chave de canal vê só o próprio.
Respostas
200Os canais da organização.
401422429500
/api/v1/contactsLista e busca contatos
Do mais recentemente atualizado para o mais antigo. **Uma chave de canal vê todos os contatos da conta** — contato pertence à organização, não ao canal.
Parâmetros
querystringBusca por nome, telefone ou e-mail.
phonestringAcha o contato exato. Aceita qualquer formatação; 422 se não for um telefone válido.
pageintegerA partir de 1.
limitintegerDe 1 a 200.
Respostas
200A página de contatos.
401422429500
/api/v1/contactsCria ou atualiza um contato
Idempotente pelo telefone: chamar duas vezes atualiza, não duplica. O campo `created` da resposta diz qual dos dois aconteceu — e é o mesmo corpo nos dois status.
Corpo (JSON)
phonestringobrigatórioTelefone com DDI + DDD + número, só dígitos (ex.: 5592999990000). Aceita +, espaço, parêntese e traço, e normaliza.
namestringNome do contato.
emailtextoE-mail válido, ou string vazia para limpar o que estava lá.
fieldsobjectCampos próprios seus. Mesclam com os que já existem — mandar um campo não apaga os outros.
tagsarrayNomes de etiqueta. As que não existem são criadas, e aplicar uma etiqueta pode disparar um fluxo que a esteja esperando.
optInbooleantrue registra o opt-in (origem `api`); false registra o opt-out. Ausente não mexe no que já estava.
Respostas
200O contato já existia e foi atualizado.
201O contato foi criado.
400401422429500
/api/v1/conversationsLista conversas
Da que teve mensagem mais recente para a mais antiga. Uma chave de canal vê só as do próprio canal.
Parâmetros
statusstring (open | in_flow | resolved)Filtra pelo estado de atendimento.
channelIdstringFiltra por número. Uma chave de canal que pedir outro recebe 403.
contactIdstringTodas as conversas de um contato.
pageintegerA partir de 1.
limitintegerDe 1 a 200.
Respostas
200A página de conversas.
401403422429500
/api/v1/messagesLê o histórico de uma conversa
Da mais recente para a mais antiga. O envelope traz também o `conversationId` pedido.
Parâmetros
conversationIdstringobrigatórioObrigatório. Ache o id em `GET /api/v1/conversations`.
pageintegerA partir de 1.
limitintegerDe 1 a 200.
includeNotesbooleanInclui as notas internas da equipe. Padrão `false`.
Respostas
200As mensagens da conversa.
401403404422429500
/api/v1/messagesEnvia uma mensagem
Manda texto ou mídia pelo número conectado. Se o telefone ainda não é contato, o contato e a conversa nascem aqui. **Não é idempotente**: cada chamada envia uma mensagem. Regras que o schema não expressa: - Informe `phone` ou `conversationId`. - Informe `text`, `mediaUrl` ou `mediaId`.
Corpo (JSON)
channelIdstringPor qual número falar. Obrigatório com a chave da conta; com uma chave de canal pode ser omitido, porque o escopo preenche.
phonestringTelefone com DDI + DDD + número, só dígitos (ex.: 5592999990000). Aceita +, espaço, parêntese e traço, e normaliza.
conversationIdstringResponder numa conversa que já existe. Precisa ser do mesmo canal.
textstringO texto da mensagem. Com mídia junto, vira a legenda se não houver `caption`.
mediaUrlstringUm 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.
mediaIdstringUm arquivo do Drive do LinkZap — mais confiável que URL para o que você reenvia sempre.
captionstringLegenda da mídia.
Respostas
201A mensagem foi aceita e enfileirada para envio.
400401403404409422429500
/api/v1/flowsLista os fluxos
Em ordem alfabética pelo nome. **Não é paginada.** `channelId: null` significa que o fluxo atende qualquer número — por isso uma chave de canal enxerga os daquele número e os sem número.
Parâmetros
enabledboolean`true` traz só os ligados — os únicos que dá para iniciar.
Respostas
200Os fluxos da organização.
401422429500
/api/v1/flows/{id}/startInicia um fluxo para um telefone
Coloca a conversa daquele telefone dentro do fluxo. Um fluxo já em andamento não é interrompido.
Parâmetros
idno caminho · stringobrigatórioO id do fluxo (`GET /api/v1/flows`).
Corpo (JSON)
channelIdstringPor qual número. Obrigatório com a chave da conta; com uma chave de canal o escopo preenche.
phonestringobrigatórioTelefone com DDI + DDD + número, só dígitos (ex.: 5592999990000). Aceita +, espaço, parêntese e traço, e normaliza.
Respostas
201O fluxo começou (`result: started`).
400401403404409A conversa não aceita automação agora (`result: skipped`) — mesmo corpo do 201, sem `error`.
422429500
/api/v1/pipelinesLista os funis e as etapas
Traz o `stageId` que criar e mover negócio pedem. **Não é paginada.** As etapas vêm na ordem do quadro. O funil padrão nasce na primeira leitura, se a conta ainda não tem nenhum.
Respostas
200Os funis da organização.
401422429500
/api/v1/dealsLista negócios
Do mexido mais recentemente para o mais antigo. **Uma chave de canal vê todos os negócios da conta** — negócio pertence à organização, como o contato.
Parâmetros
statusstring (open | won | lost)Filtra pelo estado.
pipelineIdstringOs negócios de um funil.
stageIdstringOs negócios de uma etapa.
contactIdstringOs negócios de um contato.
pageintegerA partir de 1.
limitintegerDe 1 a 200.
Respostas
200A página de negócios.
401422429500
/api/v1/dealsCria um negócio
Para um contato que já existe. **Não é idempotente**: cada chamada cria um negócio — se o seu sistema pode repetir a chamada, confira antes com `GET /deals?contactId=&status=open`. Dispara o webhook `deal.created`. Regras que o schema não expressa: - Informe `contactId` OU `phone` — um dos dois, nunca os dois.
Corpo (JSON)
contactIdstringO contato do negócio. Use este OU `phone`.
phonestringO telefone de um contato que JÁ existe (crie antes com `POST /contacts`). Use este OU `contactId`.
titlestringobrigatórioO que está sendo negociado.
valueCentsintegerO valor em CENTAVOS de real: R$ 1.250,00 é `125000`. Ausente = sem valor.
stageIdstringA etapa de entrada (`GET /pipelines`). Ausente = a primeira etapa do funil padrão.
ownerIdstringO id de uma pessoa da equipe, como responsável pelo negócio.
expectedCloseOnstringA previsão de fechamento, um dia (`AAAA-MM-DD`).
conversationIdstringA conversa de onde o negócio nasceu. Só é guardada se for daquele contato.
Respostas
201O negócio foi criado.
400401404422429500
/api/v1/deals/{id}Muda um negócio: dados, etapa ou estado
Tudo ou nada: se um dos passos é recusado, nenhum é gravado. Mover dispara `deal.stage_changed`; fechar dispara `deal.won` ou `deal.lost`. Regras que o schema não expressa: - Envie ao menos um campo. - `status: lost` exige `lostReason`, e `lostReason` só vale com `status: lost`.
Parâmetros
idno caminho · stringobrigatórioO id do negócio.
Corpo (JSON)
titlestringNovo título.
valueCentsintegerNovo valor, em centavos de real.
ownerIdtextoNovo responsável; `null` tira.
expectedCloseOnstringnullNova previsão de fechamento; `null` tira.
stageIdstringMove o negócio para esta etapa (ele entra no topo dela). Só com o negócio em aberto.
statusstring`won` ou `lost` fecha o negócio; `open` reabre um fechado.
lostReasonstringPor que se perdeu. Obrigatório com `status: lost`, e só vale com ele.
Respostas
200O negócio como ficou.
400401404409422429500
/api/v1/tasksLista tarefas
Da criada mais recentemente para a mais antiga. A chave de API vê as tarefas de toda a equipe.
Parâmetros
statusstring (open | done)`open` = em aberto; `done` = concluídas.
contactIdstringAs tarefas de um contato.
dealIdstringAs tarefas de um negócio.
assigneeIdstringAs tarefas de uma pessoa da equipe.
pageintegerA partir de 1.
limitintegerDe 1 a 200.
Respostas
200A página de tarefas.
401422429500
/api/v1/tasksCria uma tarefa
Com ou sem contato. **Não é idempotente.** O prazo é um dia (e, se quiser, uma hora) no fuso da organização; quem recebe a tarefa é lembrado por e-mail. Dispara o webhook `task.created`. Regras que o schema não expressa: - `contactId` e `phone` não vão juntos. - `dueTime` só vale com `dueOn`.
Corpo (JSON)
titlestringobrigatórioO que tem de ser feito.
notesstringDetalhes, para quem vai fazer.
contactIdstringO contato da tarefa. Opcional: tarefa pode não ser de ninguém.
phonestringEm vez de `contactId`: o telefone de um contato que já existe.
dealIdstringO negócio da tarefa. Com ele, o contato é o do negócio.
assigneeIdstringO id de quem vai fazer. É quem recebe o lembrete por e-mail.
dueOnstringO dia do prazo (`AAAA-MM-DD`), no fuso da organização.
dueTimestringA hora do prazo (`HH:MM`). Sem ela, a tarefa vale o dia inteiro.
Respostas
201A tarefa foi criada.
400401404422429500
/api/v1/tasks/{id}Conclui, reabre ou edita uma tarefa
Concluir a que já está concluída não muda nada e responde 200. Concluir dispara o webhook `task.completed`. Regras que o schema não expressa: - Envie ao menos um campo.
Parâmetros
idno caminho · stringobrigatórioO id da tarefa.
Corpo (JSON)
doneboolean`true` conclui a tarefa; `false` reabre.
titlestringNovo título.
notestextoNovos detalhes; `null` apaga.
assigneeIdtextoNovo responsável; `null` tira.
dueOnstringnullNovo dia do prazo; `null` tira o prazo.
dueTimetextoNova hora do prazo; `null` volta a valer o dia inteiro.
Respostas
200A tarefa como ficou.
400401404422429500
/api/webhooks/channel/{id}O contrato do webhook de entrada
Abrir a URL no navegador devolve o formato esperado, com o schema derivado da mesma validação que o POST usa. **Não exige autenticação** — é um dump do contrato, não dos dados.
Parâmetros
idno caminho · stringobrigatórioO `channelId` do número.
Respostas
200O contrato em JSON.
401422429500
/api/webhooks/channel/{id}Webhook de entrada: contato, mensagem ou fluxo num POST
O atalho sem código: um formulário de site, Zapier, Make, n8n ou o gatilho do seu CRM viram contato e conversa. Prefira a **chave do canal** (Canais → Copiar chave de API); a chave da conta também vale, a de outro canal não. Regras que o schema não expressa: - Envie `message` OU `flowId`, nunca os dois.
Parâmetros
idno caminho · stringobrigatórioO `channelId` do número.
Corpo (JSON)
phonestringobrigatórioTelefone com DDI + DDD + número, só dígitos (ex.: 5592999990000). Aceita +, espaço, parêntese e traço, e normaliza.
namestringNome do contato.
emailtextoE-mail válido.
messagestringTexto enviado ao contato pelo canal, como automação. Use este OU `flowId`.
flowIdstringEm vez de texto: inicia este fluxo na conversa do contato.
tagsarrayNomes de etiquetas; as que não existem são criadas.
fieldsobjectCampos próprios seus.
optInbooleantrue registra opt-in com origem `webhook`; false registra opt-out.
Respostas
200O contato já existia e foi atualizado, sem mensagem nem fluxo pedidos.
201Criou o contato, ou enviou a mensagem, ou iniciou o fluxo.
400401403404409422429500503
Consumir por máquina
# baixar a especificação
curl https://linkzap.orion.moe/openapi.json -o linkzap.json
# gerar um cliente (exemplo com o openapi-generator)
npx @openapitools/openapi-generator-cli generate \
-i linkzap.json -g typescript-fetch -o ./linkzap-client