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_..."import { Cord } from '@flouviahq/node';
const cord = new Cord(process.env.CORD_API_KEY);
const page = await cord.events.list({ object_id: '8b0c6f0e-2d55-4c1e-9a43-6a2f1c7d9e10', limit: 10 });
for (const event of page.data) console.log(event.created_at, event.type, event.actor);{
"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
iddo histórico é um UUID próprio do registro. Ele não é oevt_…da entrega do webhook: para fazer a deduplicação entre os dois, useobject_idmaistypemaiscreated_at. object_idchega comonullnos eventos sem um objeto com UUID, comoaccount.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_idque não é UUID ou umcursorinválido respondem400comcode: "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_..."import { Cord } from '@flouviahq/node';
const cord = new Cord(process.env.CORD_API_KEY);
const me = await cord.me();
console.log(me.org.nombre, me.scope, me.mode);{
"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.