Pular para o conteúdo

Eventos

O que aconteceu no seu negócio, com o mesmo catálogo que os webhooks entregam e um histórico para conciliar o que o seu servidor não chegou a receber.

Cada alteração relevante no Cord produz um evento: um registro com tipo, objeto, dados e quem o originou. Os mesmos eventos são entregues aos seus webhooks, disparam o Cord Workflows e ficam em um histórico que você consulta com GET /api/v1/events, haja ou não endpoints inscritos.

Catálogo de eventos

Há 41 tipos. A coluna Objeto é o valor de object no histórico e define o formato de data (veja a próxima seção).

Evento Objeto É emitido quando…
quote.created quote Um orçamento é criado pelo app, pela API, pelo MCP ou pelo Cord Elements.
quote.sent quote O orçamento é enviado ao cliente.
quote.viewed quote O cliente abre o link público pela primeira vez. As visualizações do próprio vendedor não contam.
quote.updated quote O vendedor o altera e o reenvia.
quote.approved quote O cliente o aprova (total ou parcialmente), ou ele é marcado como aprovado pela API.
quote.rejected quote O cliente o recusa, ou ele é marcado como recusado pela API.
quote.expired quote A validade passa sem decisão (ele estava enviado ou visualizado).
quote.deleted quote Um rascunho que nunca foi enviado é excluído.
quote.paid quote O pagamento total é recebido, ou a última cobrança pendente de um plano de entrada ou de parcelas.
quote.approval_requested quote Um orçamento fica pendente de aprovação interna por desconto, valor ou margem.
quote.approval_decided quote A gerência aprova ou recusa essa solicitação.
quote.comment_added quote O cliente ou o vendedor escreve na conversa do orçamento.
payment.partial quote Chega um pagamento parcial (entrada, saldo ou parcela) que não completa o total.
payment.failed quote Falha uma cobrança recorrente de uma mensalidade.
invoice.stamped quote O CFDI de um orçamento é timbrado (México).
invoice.issued quote A fatura comercial de um orçamento é emitida fora do México.
invoice.finalized invoice Uma fatura do Cord Invoicing é emitida.
invoice.sent invoice Essa fatura é enviada ao cliente.
invoice.paid invoice A fatura fica totalmente paga.
invoice.payment_failed invoice Falha uma cobrança contra a fatura.
invoice.voided invoice A fatura é cancelada.
invoice.marked_uncollectible invoice A fatura é marcada como incobrável.
invoice.overdue invoice A data de vencimento passa sem que ela seja quitada.
client.created client Um cliente é criado.
client.updated client Os dados de um cliente são editados.
client.deleted client Um cliente é excluído.
product.created product Um produto é criado.
product.updated product Um produto é editado.
product.deleted product Um produto é excluído.
task.created task Uma tarefa é criada pelo app, pela API, pelo MCP ou por um workflow, ou o próprio Cord a cria (contestação, reembolso SPEI). Traz cotizacion_id e factura_id (ou null).
task.completed task Uma tarefa é marcada como concluída.
promise.created promise Uma promessa de pagamento é registrada.
promise.kept promise A promessa é cumprida.
promise.broken promise A promessa é descumprida.
dispute.created dispute Um cliente abre uma contestação sobre uma cobrança do Cord Payments.
dispute.closed dispute A contestação é encerrada com o seu resultado.
refund.succeeded refund Um reembolso é concluído.
refund.failed refund Um reembolso falha.
payout.paid payout Um repasse chega à sua conta bancária.
payout.failed payout Um repasse falha.
account.updated account Muda o que a sua conta de recebimentos pode fazer. Só é emitido quando algum campo muda.

ping não é um evento do catálogo: é a entrega de teste do botão Testar do Workbench e nunca aparece no histórico.

Tipos internos no histórico

Além dos 41 tipos, o histórico pode mostrar quote.expiring, invoice.due_soon, invoice.past_due e schedule.tick. São sinais internos que o Cord Workflows usa para agir antes de um prazo; eles não são entregues por webhook e não fazem parte do catálogo. Se você percorrer o histórico completo, ignore os tipos que não conhece.

Formato de data por objeto

Todo valor viaja com a sua moeda em moneda. Os nomes dos campos são os do servidor, em espanhol.

Objeto Campos de data
quote id, folio, status, moneda, total, cliente, cliente_id, link_publico
invoice id, object, numero, folio_fiscal, estado, estado_fiscal, pais, tipo, moneda, total, pagado, saldo, vence, cliente, cotizacion_id, link_publico
client id, object, empresa, contacto, email, telefono, rfc, terminos, country_code
product id, object, sku, nombre, unidad, precio_lista, activo (nunca o custo nem a margem)
task id, object, titulo, due_date, done, cotizacion_id (não inclui responsável, prioridade nem observações)
promise id, object, cotizacion_id, fecha_promesa, monto, moneda, estado
dispute id, object, monto, moneda, motivo, estado, fecha_limite, referencia, cotizacion_id, folio, cliente
refund object, monto, moneda, motivo, motivo_falla, referencia, cotizacion_id, folio, cliente
payout id, object, monto, moneda, llegada, metodo, motivo_falla, referencia
account object, puede_cobrar, puede_depositar, motivo_bloqueo, pendientes

Campos extras por evento:

Evento Acrescenta
payment.partial tipo (anticipo, saldo ou cuota), monto (deste pagamento), numero_cuota, saldo_pendiente, payment_method
quote.approval_requested motivo
quote.approval_decided decision (approved ou rejected)
quote.comment_added autor (cliente ou vendedor), mensaje, item_id se for sobre um item; uma contraproposta do cliente traz tipo: "contraoferta" e propuesta
client.updated empresa_anterior, email_anterior, terminos_anterior quando mudaram
product.updated precio_lista_anterior, activo_anterior quando mudaram
client.deleted Somente id, object e empresa
product.deleted Somente id, object e nombre

Em uma fatura, estado é o ciclo de vida dela (draft, open, paid, void ou uncollectible) e estado_fiscal é o registro dela perante o provedor fiscal (pending, issued, cancelled ou error). Em um orçamento, status é draft, sent, viewed, approved, rejected, expired, invoiced ou paid.

O data que o histórico guarda é o mesmo do webhook sem link_publico: o link é uma credencial do cliente e não é armazenado.

Quem originou o evento: actor

Valor Significado
user:<uuid> Uma pessoa da sua equipe, com sessão no app.
api:<id da chave> Uma requisição à API com essa chave (ou uma conexão OAuth).
mcp:<id da chave> Uma ferramenta do servidor MCP.
client O seu cliente, a partir do link público do orçamento ou da fatura.
workflow:<uuid> Uma ação do Cord Workflows.
integration:<provedor>:<id> Uma integração sincronizando dados para o Cord, por exemplo o HubSpot.
slack, slack:<e-mail>, shopify Uma ação a partir dessas integrações.
system, system:cron O próprio Cord: um vencimento, uma cobrança do processador de pagamentos ou uma tarefa programada.

Trate actor como texto com um prefixo: decida pelo que vem antes dos dois-pontos e não presuma que a lista não vai crescer.

Histórico: GET /api/v1/events

Devolve os eventos da sua organização, do mais recente ao mais antigo. Se o seu servidor ficou fora do ar por mais tempo do que as novas tentativas cobrem, é aqui que você recupera o que perdeu.

Parâmetro O que faz
type Um tipo de evento, por exemplo quote.approved. Um tipo desconhecido responde 400.
object_id O UUID do objeto: o histórico completo de um orçamento, de uma fatura ou de um cliente.
limit De 1 a 200; por padrão, 50.
cursor O next_cursor da página anterior.
curl "https://cordhq.app/api/v1/events?object_id=8b0c6f0e-2d55-4c1e-9a43-6a2f1c7d9e10&limit=10" \
  -H "Authorization: Bearer sk_test_..."
{
  "data": [
    {
      "id": "e81c5a3f-7d2b-4e9a-b6c1-0f4d8a2e5c71",
      "type": "quote.approved",
      "object": "quote",
      "object_id": "8b0c6f0e-2d55-4c1e-9a43-6a2f1c7d9e10",
      "data": {
        "id": "8b0c6f0e-2d55-4c1e-9a43-6a2f1c7d9e10",
        "folio": "COT-0001",
        "status": "approved",
        "moneda": "MXN",
        "total": 13920,
        "cliente": "Ferretería La Prueba",
        "cliente_id": "0e6f2b8a-91c4-4d7e-b3a5-6c2d8f1e4a90"
      },
      "actor": "client",
      "created_at": "2026-10-07T17:31:44.208Z"
    },
    {
      "id": "3a7f1c9e-2b4d-4a6e-8c0f-5d9b3e7a1c24",
      "type": "quote.sent",
      "object": "quote",
      "object_id": "8b0c6f0e-2d55-4c1e-9a43-6a2f1c7d9e10",
      "data": {
        "id": "8b0c6f0e-2d55-4c1e-9a43-6a2f1c7d9e10",
        "folio": "COT-0001",
        "status": "sent",
        "moneda": "MXN",
        "total": 13920,
        "cliente": "Ferretería La Prueba",
        "cliente_id": "0e6f2b8a-91c4-4d7e-b3a5-6c2d8f1e4a90"
      },
      "actor": "api:2c6e0a9d-4f1b-4c3e-8a7d-9b5f1e3c7a20",
      "created_at": "2026-10-07T17:04:12.318Z"
    }
  ],
  "meta": { "next_cursor": null }
}
  • O id do histórico é um UUID próprio do registro. Ele não é o evt_… da entrega do webhook: para fazer a deduplicação entre os dois, use object_id mais type mais created_at.
  • object_id chega como null nos eventos sem um objeto com UUID, como account.updated.
  • A paginação é por cursor e estável: um evento novo não desloca a página que você está lendo. Veja Paginação.
  • Um object_id que não é UUID ou um cursor inválido respondem 400 com code: "invalid_request".

Retenção

O histórico é somente de anexação: um evento não é editado depois de escrito. Ele é mantido por 90 dias e depois um processo diário o exclui; o evento que iniciou uma execução de um workflow é mantido enquanto essa execução existir, e uma execução é excluída um ano depois de terminar. O log de entregas de webhooks tem seu próprio prazo (30 dias; 90 para as que falharam). Tudo é excluído junto com a organização.

Verificar uma chave: GET /api/v1/me

É a chamada mais simples da API: confirma que a chave é válida e diz a qual organização ela pertence, a sua permissão e o seu modo. Responde a qualquer chave secreta, chave restrita ou conexão OAuth, independentemente das permissões por recurso.

curl https://cordhq.app/api/v1/me \
  -H "Authorization: Bearer sk_test_..."
{
  "data": {
    "org": { "id": "5b1f7d9e-3c2a-4e8b-9f61-0a7c4d2e8b13", "nombre": "Aceros del Norte", "plan": "pro" },
    "scope": "write",
    "mode": "test"
  }
}
Campo Conteúdo
org.id O id da organização sobre a qual a chave opera. Com uma chave de teste, é o do seu ambiente de teste, diferente do da conta real.
org.nombre Nome da organização.
org.plan Plano vigente: free, starter, pro, scale ou developer.
scope read ou write. Em uma chave restrita, as permissões por recurso prevalecem sobre este valor.
mode test ou live.

Use-a para testar uma credencial antes de guardá-la na sua integração.