open, won, lost).
Mapa mental
cards:read (leitura) ou cards:write (criar/mover) e enxergam a conta inteira — como um admin vendo o kanban completo, não só os cards do usuário do token.
Caso guiado: dashboard de marketing
Você quer montar um painel externo com: cards do mês por etapa, por origem (sourceId — de onde veio o lead, ex. Instagram Ads, indicação) e motivos de perda. Nenhum endpoint devolve isso pronto — você monta agregando as respostas.
1
Monte o funil com os pipelines
GET /v1/pipelines devolve os pipelines da sua conta com as etapas já ordenadas (stages[].order). Use isso para saber quais stageId existem e montar as colunas do funil antes de buscar os cards.2
Busque os cards do período, paginando
GET /v1/cards filtra por pipelineId, createdAtAfter/createdAtBefore (offset de fuso obrigatório — veja Paginação e filtros). Pagine até hasMore: false:totalValue — soma de value de todos os cards que casam o filtro, não só da página atual. Útil pra um card de “valor total do funil” sem somar manualmente.3
Agrupe por etapa e por origem
Cada card na resposta já vem com
stage: { id, name } e source: { id, name } embutidos — não precisa de outra chamada pra resolver os nomes:4
Resolva os motivos de perda
Pra um card com
status: "lost", o objeto já traz lostReason: { id, name }. Se quiser a lista completa de motivos configurados (pra montar um filtro no seu painel, por exemplo), use GET /v1/lost-reasons:5
Agende a atualização respeitando o rate limit
Rode a coleta a cada 15 minutos (ou o intervalo que fizer sentido pro seu painel). Com paginação de 100 cards por página, um pipeline com 500 cards no mês gasta 5 requisições — bem abaixo do limite de 120/min por token. Se você tem vários pipelines ou várias companies, distribua as chamadas em vez de disparar tudo no mesmo segundo:
Criar card por webhook de formulário
Quando um lead preenche um formulário externo, crie o card direto pelo número — sem precisar buscar ocontactId antes. POST /v1/cards aceita phone como alternativa a contactId; o contato é criado/reaproveitado automaticamente:
contactId e phone — os dois juntos (ou nenhum) resultam em 400 ERR_CONTACT_IDENTIFIER_REQUIRED.
Se o pipeline tiver uma etapa que exige origem (
sourceRequired) e você não enviar sourceId, a API responde 400 ERR_SOURCE_REQUIRED_FOR_STAGE — só quando stageId também é enviado no POST. Confira as etapas em GET /v1/pipelines antes de montar a integração.Preenchendo campos personalizados
customFields aceita os campos personalizados do pipeline informado (ou globais da sua conta) — a chave é o name técnico do campo, o valor já no formato do tipo (select/multiselect precisam bater com as options cadastradas):
Campo inexistente, de outro pipeline/conta ou com valor inválido é ignorado — nunca falha a criação do card — e reportado em
ignoredCustomFields ([{ name, reason }]) na resposta, presente só quando algum campo foi ignorado.Mover card de etapa
PATCH /v1/cards/{cardId}/stage move exatamente como um arrastar-e-soltar no kanban: dispara as mesmas automações da etapa e atualiza em tempo real pra quem estiver com o kanban aberto.
Erros comuns
Veja o catálogo completo de erros.