Zum Inhalt springen

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_..."
{
  "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 id des Verlaufs ist eine eigene UUID des Datensatzes. Sie ist nicht die evt_… der Webhook-Zustellung: Um zwischen beiden zu deduplizieren, verwenden Sie object_id plus type plus created_at.
  • object_id kommt bei Ereignissen ohne Objekt mit UUID als null, etwa bei account.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ültiger cursor antworten mit 400 und code: "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_..."
{
  "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.