Negócios
O funil do CRM. Um negócio pertence a um contato, mora numa etapa de um funil e está em aberto, ganho ou perdido. O valor é sempre em centavos de real.
Funis e etapas
/api/v1/pipelinesLista os funis da conta, cada um com as etapas na ordem do quadro. Não é paginada. Comece por aqui: é daqui que sai o stageId que criar e mover negócio pedem.
curl https://linkzap.orion.moe/api/v1/pipelines \
-H "Authorization: Bearer lz_SUA_CHAVE"{
"data": [
{
"id": "ppl_10aa...",
"name": "Vendas",
"isDefault": true,
"stages": [
{ "id": "stg_1a01...", "name": "Novo", "position": 0 },
{ "id": "stg_77b0...", "name": "Proposta", "position": 1 }
]
}
]
}isDefault marca o funil que recebe o negócio criado sem stageId. Os nomes das etapas são da equipe e mudam; guarde o id.
Listar negócios
/api/v1/dealsLista os negócios, do mexido mais recentemente para o mais antigo. Paginada. Uma chave de canal vê todos os negócios da conta — negócio, como contato, não pertence a canal.
Parâmetros da URL
statustextoUm de
open,wonoulost. Qualquer outro valor responde 422.pipelineIdtextoOs negócios de um funil.
stageIdtextoOs negócios de uma etapa.
contactIdtextoOs negócios de um contato.
pageinteiroA partir de 1.
limitinteiroDe 1 a 200. Padrão 50.
curl "https://linkzap.orion.moe/api/v1/deals?status=open&limit=20" \
-H "Authorization: Bearer lz_SUA_CHAVE"{
"data": [
{
"id": "dea_81c2...",
"title": "Plano anual",
"valueCents": 299000,
"status": "open",
"pipelineId": "ppl_10aa...",
"stageId": "stg_77b0...",
"contact": { "id": "ctt_3c81...", "phone": "5592999990000", "name": "Maria Souza" },
"ownerId": "usr_44e1...",
"expectedCloseOn": "2026-10-31",
"lostReason": null,
"conversationId": null,
"closedAt": null,
"createdAt": "2026-10-06T13:00:00.000Z",
"updatedAt": "2026-10-06T13:00:00.000Z"
}
],
"page": 1,
"limit": 20,
"total": 1
}valueCents: 299000 é R$ 2.990,00. Zero quer dizer que o negócio não tem valor informado.
Criar um negócio
/api/v1/dealsCria um negócio para um contato que já existe (crie o contato antes, com POST /contacts). Responde 201 com o negócio.
Corpo (JSON)
contactIdtextoO contato do negócio. Use este ou
phone— um dos dois, nunca os dois.phonetextoO telefone do contato. 404 se não houver contato com ele.
titletextoobrigatórioO que está sendo negociado. Até 120 caracteres; acima disso, 422.
valueCentsinteiroO valor em centavos: R$ 1.250,00 é
125000.stageIdtextoA etapa de entrada. Sem ela, o negócio entra na primeira etapa do funil padrão. Etapa que não existe responde 404.
ownerIdtextoO id de uma pessoa da equipe, como responsável. 422 se não for da equipe.
expectedCloseOndataA previsão de fechamento,
AAAA-MM-DD. Dia que não existe no calendário (30 de fevereiro) responde 422.conversationIdtextoA conversa de onde o negócio nasceu. Só é guardada se for daquele contato; de outro, é ignorada.
curl -X POST https://linkzap.orion.moe/api/v1/deals \
-H "Authorization: Bearer lz_SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{
"phone": "5592999990000",
"title": "Plano anual",
"valueCents": 299000,
"expectedCloseOn": "2026-10-31"
}'{
"data": {
"id": "dea_81c2...",
"title": "Plano anual",
"valueCents": 299000,
"status": "open",
"pipelineId": "ppl_10aa...",
"stageId": "stg_77b0...",
"contact": { "id": "ctt_3c81...", "phone": "5592999990000", "name": "Maria Souza" },
"ownerId": "usr_44e1...",
"expectedCloseOn": "2026-10-31",
"lostReason": null,
"conversationId": null,
"closedAt": null,
"createdAt": "2026-10-06T13:00:00.000Z",
"updatedAt": "2026-10-06T13:00:00.000Z"
}
}Não é idempotente
GET /deals?contactId=…&status=open.Mover, ganhar, perder e editar
/api/v1/deals/{id}Muda um negócio. Mande só o que quer mudar; tudo ou nada — se um dos campos é recusado, nenhum é gravado. Responde 200 com o negócio como ficou.
Corpo (JSON)
stageIdtextoMove para esta etapa (o negócio entra no topo dela). Só com o negócio em aberto: mover um fechado responde 409. A etapa em que ele já está não é um movimento: o negócio fica onde estava.
statustextowonoulostfecha o negócio;openreabre um fechado. Fechar o que já está fechado responde 409.lostReasontextoPor que se perdeu, até 80 caracteres. Obrigatório com
status: lost— é o dado que diz por que a conta perde venda. Semstatus: lostno mesmo pedido, responde 422.titletextoNovo título.
valueCentsinteiroNovo valor, em centavos.
ownerIdtexto ou nuloNovo responsável;
nulltira.expectedCloseOndata ou nuloNova previsão;
nulltira.
curl -X POST https://linkzap.orion.moe/api/v1/deals/dea_81c2... \
-H "Authorization: Bearer lz_SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{ "status": "won" }'{
"data": {
"id": "dea_81c2...",
"title": "Plano anual",
"valueCents": 299000,
"status": "won",
"pipelineId": "ppl_10aa...",
"stageId": "stg_77b0...",
"contact": { "id": "ctt_3c81...", "phone": "5592999990000", "name": "Maria Souza" },
"ownerId": "usr_44e1...",
"expectedCloseOn": "2026-10-31",
"lostReason": null,
"conversationId": null,
"closedAt": "2026-10-07T14:10:00.000Z",
"createdAt": "2026-10-06T13:00:00.000Z",
"updatedAt": "2026-10-07T14:10:00.000Z"
}
}Criar dispara o webhook deal.created; mudar de etapa, deal.stage_changed; fechar, deal.won ou deal.lost. Os mesmos eventos saem quando a mudança é feita por uma pessoa no painel, por um fluxo ou pela Aura — então, se o seu sistema escuta e escreve, lembre que a sua própria chamada os provoca.