Ereignisse
Was in Ihrem Unternehmen passiert ist – mit demselben Katalog, den die Webhooks zustellen, und einem Verlauf, um abzugleichen, was Ihr Server nicht empfangen hat.
Jede relevante Änderung in Cord erzeugt ein Ereignis: einen Datensatz mit Typ, Objekt, Daten und dem Auslöser. Dieselben Ereignisse werden an Ihre Webhooks zugestellt, lösen Cord Workflows aus und bleiben in einem Verlauf erhalten, den Sie mit GET /api/v1/events abfragen – unabhängig davon, ob Endpoints abonniert sind.
Ereigniskatalog
Es gibt 41 Typen. Die Spalte Objekt ist der Wert von object im Verlauf und bestimmt die Form von data (siehe nächster Abschnitt).
| Ereignis | Objekt | Wird ausgelöst, wenn … |
|---|---|---|
quote.created |
quote |
Ein Angebot in der App, über die API, über MCP oder über Cord Elements erstellt wird. |
quote.sent |
quote |
Das Angebot an den Kunden gesendet wird. |
quote.viewed |
quote |
Der Kunde den öffentlichen Link zum ersten Mal öffnet. Aufrufe des Vertriebsmitarbeiters selbst zählen nicht. |
quote.updated |
quote |
Der Vertriebsmitarbeiter es ändert und erneut sendet. |
quote.approved |
quote |
Der Kunde es (ganz oder teilweise) bestätigt oder es über die API als bestätigt markiert wird. |
quote.rejected |
quote |
Der Kunde es ablehnt oder es über die API als abgelehnt markiert wird. |
quote.expired |
quote |
Seine Gültigkeit ohne Entscheidung abläuft (es war gesendet oder angesehen). |
quote.deleted |
quote |
Ein nie gesendeter Entwurf gelöscht wird. |
quote.paid |
quote |
Die vollständige Zahlung eingeht oder die letzte ausstehende Zahlung eines Anzahlungs- oder Ratenplans. |
quote.approval_requested |
quote |
Ein Angebot wegen Rabatt, Betrag oder Marge auf eine interne Freigabe wartet. |
quote.approval_decided |
quote |
Die Geschäftsleitung diese Anfrage freigibt oder ablehnt. |
quote.comment_added |
quote |
Der Kunde oder der Vertriebsmitarbeiter in der Unterhaltung des Angebots schreibt. |
payment.partial |
quote |
Eine Teilzahlung (Anzahlung, Restzahlung oder Rate) eingeht, die den Gesamtbetrag nicht erreicht. |
payment.failed |
quote |
Eine wiederkehrende Zahlung einer Monatspauschale fehlschlägt. |
invoice.stamped |
quote |
Der CFDI eines Angebots gestempelt wird (Mexiko). |
invoice.issued |
quote |
Die Rechnung eines Angebots außerhalb Mexikos ausgestellt wird. |
invoice.finalized |
invoice |
Eine Rechnung aus Cord Invoicing ausgestellt wird. |
invoice.sent |
invoice |
Diese Rechnung an den Kunden gesendet wird. |
invoice.paid |
invoice |
Die Rechnung vollständig bezahlt ist. |
invoice.payment_failed |
invoice |
Eine Zahlung auf die Rechnung fehlschlägt. |
invoice.voided |
invoice |
Die Rechnung storniert wird. |
invoice.marked_uncollectible |
invoice |
Die Rechnung als uneinbringlich markiert wird. |
invoice.overdue |
invoice |
Ihr Fälligkeitsdatum verstreicht, ohne dass sie beglichen ist. |
client.created |
client |
Ein Kunde angelegt wird. |
client.updated |
client |
Die Daten eines Kunden bearbeitet werden. |
client.deleted |
client |
Ein Kunde gelöscht wird. |
product.created |
product |
Ein Produkt angelegt wird. |
product.updated |
product |
Ein Produkt bearbeitet wird. |
product.deleted |
product |
Ein Produkt gelöscht wird. |
task.created |
task |
Eine Aufgabe in der App, über die API, über MCP oder durch einen Workflow erstellt wird oder Cord sie selbst anlegt (Rückbuchung, SPEI-Rückerstattung). Enthält cotizacion_id und factura_id (oder null). |
task.completed |
task |
Eine Aufgabe als erledigt markiert wird. |
promise.created |
promise |
Eine Zahlungszusage erfasst wird. |
promise.kept |
promise |
Die Zahlungszusage eingehalten wird. |
promise.broken |
promise |
Die Zahlungszusage nicht eingehalten wird. |
dispute.created |
dispute |
Ein Kunde eine Rückbuchung für eine Zahlung über Cord Payments einleitet. |
dispute.closed |
dispute |
Die Rückbuchung mit ihrem Ergebnis abgeschlossen wird. |
refund.succeeded |
refund |
Eine Rückerstattung abgeschlossen wird. |
refund.failed |
refund |
Eine Rückerstattung fehlschlägt. |
payout.paid |
payout |
Eine Auszahlung auf Ihrem Bankkonto eingeht. |
payout.failed |
payout |
Eine Auszahlung fehlschlägt. |
account.updated |
account |
Sich ändert, was Ihr Zahlungskonto tun kann. Wird nur ausgelöst, wenn sich ein Feld ändert. |
ping ist kein Ereignis des Katalogs: Es ist die Testzustellung der Schaltfläche Testen in der Workbench und erscheint nie im Verlauf.
Interne Typen im Verlauf
Neben den 41 Typen kann der Verlauf quote.expiring, invoice.due_soon, invoice.past_due und schedule.tick anzeigen. Das sind interne Signale, mit denen Cord Workflows vor einer Frist handeln; sie werden nicht per Webhook zugestellt und gehören nicht zum Katalog. Wenn Sie den gesamten Verlauf durchlaufen, ignorieren Sie Typen, die Sie nicht kennen.
Form von data pro Objekt
Jeder Betrag wird mit seiner Währung in moneda übertragen. Die Feldnamen sind die des Servers, auf Spanisch.
| Objekt | Felder von 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 (nie Kosten oder Marge) |
task |
id, object, titulo, due_date, done, cotizacion_id (ohne zuständige Person, Priorität oder Notizen) |
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 |
Zusätzliche Felder pro Ereignis:
| Ereignis | Ergänzt |
|---|---|
payment.partial |
tipo (anticipo, saldo oder cuota), monto (dieser Zahlung), numero_cuota, saldo_pendiente, payment_method |
quote.approval_requested |
motivo |
quote.approval_decided |
decision (approved oder rejected) |
quote.comment_added |
autor (cliente oder vendedor), mensaje, item_id, wenn es um eine Position geht; ein Gegenangebot des Kunden enthält tipo: "contraoferta" und propuesta |
client.updated |
empresa_anterior, email_anterior, terminos_anterior, wenn sie sich geändert haben |
product.updated |
precio_lista_anterior, activo_anterior, wenn sie sich geändert haben |
client.deleted |
Nur id, object und empresa |
product.deleted |
Nur id, object und nombre |
Bei einer Rechnung ist estado ihr Lebenszyklus (draft, open, paid, void oder uncollectible) und estado_fiscal ihre Registrierung beim Steueranbieter (pending, issued, cancelled oder error). Bei einem Angebot ist status einer der Werte draft, sent, viewed, approved, rejected, expired, invoiced oder paid.
Das im Verlauf gespeicherte data entspricht dem des Webhooks, jedoch ohne link_publico: Der Link ist eine Zugangsberechtigung des Kunden und wird nicht gespeichert.
Wer das Ereignis ausgelöst hat: actor
| Wert | Bedeutung |
|---|---|
user:<uuid> |
Eine Person aus Ihrem Team, mit Sitzung in der App. |
api:<Schlüssel-ID> |
Eine API-Anfrage mit diesem Schlüssel (oder eine OAuth-Verbindung). |
mcp:<Schlüssel-ID> |
Ein Tool des MCP-Servers. |
client |
Ihr Kunde, über den öffentlichen Link des Angebots oder der Rechnung. |
workflow:<uuid> |
Eine Aktion von Cord Workflows. |
integration:<Anbieter>:<id> |
Eine Integration, die Daten zu Cord synchronisiert, zum Beispiel HubSpot. |
slack, slack:<E-Mail>, shopify |
Eine Aktion aus diesen Integrationen. |
system, system:cron |
Cord selbst: ein Ablauf, eine Zahlung des Zahlungsdienstleisters oder eine geplante Aufgabe. |
Behandeln Sie actor als Text mit Präfix: Entscheiden Sie anhand dessen, was vor dem Doppelpunkt steht, und gehen Sie nicht davon aus, dass die Liste nicht wächst.
Verlauf: GET /api/v1/events
Gibt die Ereignisse Ihrer Organisation zurück, das neueste zuerst. War Ihr Server länger ausgefallen, als die Wiederholungsversuche abdecken, holen Sie hier nach, was Sie verpasst haben.
| Parameter | Funktion |
|---|---|
type |
Ein Ereignistyp, zum Beispiel quote.approved. Ein unbekannter Typ antwortet mit 400. |
object_id |
Die UUID des Objekts: der vollständige Verlauf eines Angebots, einer Rechnung oder eines Kunden. |
limit |
Von 1 bis 200; Standard 50. |
cursor |
Der next_cursor der vorherigen Seite. |
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 }
}
- Die
iddes Verlaufs ist eine eigene UUID des Datensatzes. Sie ist nicht dieevt_…der Webhook-Zustellung: Um zwischen beiden zu deduplizieren, verwenden Sieobject_idplustypepluscreated_at. object_idkommt bei Ereignissen ohne Objekt mit UUID alsnull, etwa beiaccount.updated.- Die Paginierung erfolgt per Cursor und ist stabil: Ein neues Ereignis verschiebt die Seite, die Sie gerade lesen, nicht. Siehe Paginierung.
- Eine
object_id, die keine UUID ist, oder ein ungültigercursorantworten mit400undcode: "invalid_request".
Aufbewahrung
Der Verlauf ist nur erweiterbar: Ein Ereignis wird nach dem Schreiben nicht bearbeitet. Es wird 90 Tage aufbewahrt und danach von einem täglichen Prozess gelöscht; ein Ereignis, das eine Workflow-Ausführung gestartet hat, bleibt so lange erhalten wie diese Ausführung, und eine Ausführung wird ein Jahr nach ihrem Ende gelöscht. Das Zustellprotokoll der Webhooks hat eine eigene Frist (30 Tage; 90 für fehlgeschlagene). Alles wird zusammen mit der Organisation gelöscht.
Einen Schlüssel prüfen: GET /api/v1/me
Das ist der einfachste Aufruf der API: Er bestätigt, dass der Schlüssel gültig ist, und gibt an, zu welcher Organisation er gehört, welche Berechtigung und welchen Modus er hat. Er antwortet auf jeden geheimen Schlüssel, eingeschränkten Schlüssel oder jede OAuth-Verbindung, unabhängig von den Berechtigungen pro Ressource.
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"
}
}
| Feld | Inhalt |
|---|---|
org.id |
Die ID der Organisation, mit der der Schlüssel arbeitet. Bei einem Testschlüssel ist es die ID Ihrer Testumgebung, die sich von der des echten Kontos unterscheidet. |
org.nombre |
Name der Organisation. |
org.plan |
Aktueller Tarif: free, starter, pro, scale oder developer. |
scope |
read oder write. Bei einem eingeschränkten Schlüssel haben die Berechtigungen pro Ressource Vorrang vor diesem Wert. |
mode |
test oder live. |
Verwenden Sie den Aufruf, um Zugangsdaten zu prüfen, bevor Sie sie in Ihrer Integration speichern.