Angebote, Rechnungen und Zahlungen aus Ihrem eigenen Code.

Die REST-API von Cord erstellt und liest Angebote, Kunden, Produkte und Rechnungen mit einem Bearer-Schlüssel und führt dieselben Aktionen aus wie die App: senden, bestätigen, ausstellen oder eine Zahlung erfassen. Vorhersehbare JSON-Antworten, eine OpenAPI-Spezifikation und Testschlüssel, die in einer von Ihren echten Daten getrennten Umgebung arbeiten.

In allen Tarifen. Der kostenlose Tarif enthält 2 Schlüssel und 100 Aufrufe pro Monat; Testschlüssel zählen nicht zu Ihrem Kontingent.

POST /api/v1/cotizaciones200 OK
$ curl https://cordhq.app/api/v1/cotizaciones \
  -H "Authorization: Bearer sk_live_8f2a…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-7781" \
  -d '{"cliente_id": "9b41c2e0-3d7a-4f12-8c55-6e0b1a2d4f90", "vigencia_dias": 15,
       "items": [{"descripcion": "Portlandzement 94 lb",
                  "cantidad": 240, "precio_unitario": 16.4}]}'
{
  "data": {
    "id": "c2f9a1d4-7b3e-4c1a-9e55-01a6c3d8f2b7",
    "token": "q8Fz2LkP",
    "folio": "COT-0149",
    "link_publico": "https://cordhq.app/q/q8Fz2LkP",
    "needs_approval": false,
    "motivo": null
  }
}
97 ms · v1600 Anfragen/Min. pro geheimem Schlüssel

IDEMPOTENZ

Wiederholen ohne Angst vor Duplikaten.

Ein instabiles Netz sollte keine zwei Angebote erzeugen. Senden Sie bei jedem POST, PATCH oder DELETE einen Idempotency-Key: Wird die Anfrage mit demselben Schlüssel und demselben Body wiederholt, gibt Cord die ursprüngliche Antwort zurück, markiert mit Idempotent-Replayed, statt sie zweimal auszuführen. Hat sich der Body geändert, antwortet Cord mit einem eindeutigen Fehler.

  • Funktioniert bei allen schreibenden Aufrufen unter /api/v1
  • Die wiederholte Antwort ist identisch, Byte für Byte
  • Gleicher Schlüssel, anderer Body: ein Fehler, nie ein stilles Duplikat
Wiederholung mit demselben Idempotency-Key/api/v1
# 1. Versuch: Das Angebot wird erstellt
POST /api/v1/cotizaciones
Idempotency-Key: pedido-7781
← 200  { "data": { "folio": "COT-0150", … } }

# 2. Versuch (Netz unterbrochen): gleicher Schlüssel, gleicher Body
POST /api/v1/cotizaciones
Idempotency-Key: pedido-7781
← 200  Idempotent-Replayed: true
      { "data": { "folio": "COT-0150", … } }
      # dieselbe Antwort, Byte für Byte

# gleicher Schlüssel, anderer Body
← 422  { "error": "Esta clave de idempotencia ya se usó con otra petición.",
        "code": "idempotency_key_reused" }

# die erste Anfrage läuft noch
← 409  { "code": "idempotency_in_progress" }

RESSOURCEN

Was Sie in der App sehen, auch per API.

Das ist keine reine Lese-API. Erstellen Sie ein Angebot und senden Sie es, bestätigen Sie es oder markieren Sie es als bezahlt. Legen Sie eine Rechnung als Entwurf an und stellen Sie sie aus, versenden Sie sie, erfassen Sie eine Zahlung oder eine Gutschrift. Alles mit denselben Berechtigungen, Prüfungen und Summen wie in der App.

  • Angebote, Rechnungen, Kunden, Produkte, Aufgaben und Forderungsmanagement
  • Aktionen per POST { "action": "send" | "approve" | "finalize" | … }
  • Paginierung mit limit und offset oder per Cursor bei Ereignissen und Rechnungen
ÜbersichtProtokolleFehlerEreignisseWebhooksShellSchlüsselZustand

API-Referenz

34 Operationen. Basis-URL https://cordhq.app/api/v1 mit Authorization: Bearer und Ihrem Schlüssel.

OpenAPI-Spezifikation ↗llms.txt (Doku für KI) ↗
Beispiel
curl https://cordhq.app/api/v1/me \
  -H "Authorization: Bearer $CORD_SECRET_KEY"
Konto
GET/meOrganisation und SchlüsselumfangTesten
Angebote
GET/cotizacionesAngebote auflistenTesten
POST/cotizacionesAngebot erstellenTesten
GET/cotizaciones/{id}AngebotsdetailsTesten
POST/cotizaciones/{id}Senden, erneut senden, bestätigen, ablehnen oder als bezahlt markierenTesten
DELETE/cotizaciones/{id}Entwurf löschenTesten
POST/cotizaciones/iaPositionen aus dem Text einer Bestellung vorschlagenTesten
Kunden
GET/clientesKunden auflistenTesten
POST/clientesKunden anlegenTesten
GET/clientes/{id}KundendetailsTesten
PATCH/clientes/{id}Kontaktdaten aktualisierenTesten
Produkte
GET/productosProdukte auflistenTesten
POST/productosProdukt anlegenTesten
Rechnungen
GET/facturasRechnungen auflistenTesten
POST/facturasRechnungsentwurf erstellenTesten
GET/facturas/{id}RechnungsdetailsTesten
POST/facturas/{id}Ausstellen, senden, stornieren, Zahlung oder Gutschrift erfassenTesten
Forderungsmanagement
GET/cobranzaOffene ForderungenTesten
Ereignisse
GET/eventsEreignisverlaufTesten
Aufgaben
POST/tareasAufgabe erstellenTesten
Workflows
POST/workflows/{id}/invokeEinen Workflow „Sie starten ihn“ für Angebote oder Rechnungen ausführenTesten
Webhooks
GET/webhooksVon diesem Schlüssel erstellte Endpoints
POST/webhooksEndpoint erstellen (das Secret wird nur einmal zurückgegeben)
DELETE/webhooks/{id}Endpoint löschen
Elements
GET/elements/configKonfiguration, die Cord Elements darstelltTesten
POST/elements/ai-draftKI-Positionen per Streaming (text/event-stream)
Testmodus
POST/test_helpers/fiscalErgebnis der nächsten Ausstellung erzwingenTesten
POST/test_helpers/cotizaciones/{id}Öffnen oder Ablauf simulierenTesten
POST/test_helpers/webhooksWebhook auslösenTesten
POST/test_helpers/listenSitzung für cord listen öffnen
GET/test_helpers/listen/{id}Ereignisse der Sitzung abrufen
DELETE/test_helpers/listen/{id}Sitzung für cord listen schließen
Einrichtung
POST/setup/plansKontoeinrichtung vorschlagen (eine Person gibt sie unter review_url frei)Testen
GET/setup/plans/{id}Status eines EinrichtungsvorschlagsTesten

EREIGNISSE

Synchronisieren, ohne etwas zu verpassen.

GET /api/v1/events liefert den Verlauf Ihres Unternehmens, die neuesten Einträge zuerst: gesendete, angesehene, bestätigte oder bezahlte Angebote, ausgestellte Rechnungen, neue Kunden. Filtern Sie nach Typ oder Objekt und blättern Sie mit next_cursor weiter. Der Endpoint ergänzt die Webhooks, um jeden Zustand zu rekonstruieren.

  • Filter ?type=quote.approved und ?object_id=
  • Bis zu 200 Ereignisse pro Seite mit stabilem Cursor
  • Dieselben Typen, die Ihre Webhooks empfangen
GET /api/v1/events?type=quote.approved&limit=1200 OK
{
  "data": [
    {
      "id": "5e0b9d42-6a1f-4c87-b3e2-9d4f1a7c0e65",
      "type": "quote.approved",
      "object": "quote",
      "object_id": "c2f9a1d4-7b3e-4c1a-9e55-01a6c3d8f2b7",
      "data": { "id": "c2f9a1d4-7b3e-4c1a-9e55-01a6c3d8f2b7", "folio": "COT-0149",
                "status": "approved", "moneda": "USD", "total": 4123.4,
                "cliente": "Ridgeline Builders LLC", "cliente_id": "9b41c2e0-3d7a-4f12-8c55-6e0b1a2d4f90",
                "link_publico": "https://cordhq.app/q/q8Fz2LkP" },
      "actor": "client",
      "created_at": "2026-09-30T22:31:08.000Z"
    }
  ],
  "meta": {
    "next_cursor": "MjAyNi0wOS0zMFQyMjozMTowOC4wMDAwMDBafDVlMGI5ZDQyLTZhMWYtNGM4Ny1iM2UyLTlkNGYxYTdjMGU2NQ"
  }
}

TOOLS

Ihr Backend und Ihr Terminal, bereit für Cord.

Zwei offizielle npm-Pakete, damit Integrieren nicht heißt, Anfragen von Hand zu schreiben: ein typisiertes SDK für Ihren Server und eine CLI, um Webhooks vor dem Deployment auf Ihrem Rechner zu testen.

SERVER-SDK

Die API, fertig typisiert für Ihr Backend.

@flouviahq/node kapselt die gesamte API: Es erstellt Angebote und Rechnungen, durchläuft vollständige Listen und prüft Webhooks anhand von Signatur und Alter. Es sendet bei jedem erneuten Versuch denselben Idempotency-Key und fixiert die API-Version, damit ein Cord-Update nie verändert, was Sie lesen.

  • npm install @flouviahq/node, ohne Abhängigkeiten
  • Läuft auf Node, Bun, Deno, Cloudflare Workers und Vercel
  • Fehler mit code, request_id und Link zur Erklärung
src / server.ts@flouviahq/node
  1. import { Cord, constructEvent } from '@flouviahq/node';
  2. const cord = new Cord(process.env.CORD_SECRET_KEY!, { apiVersion: '2026-10-01' });
  3. // Fällt das Netz aus, nutzt der erneute Versuch denselben Idempotency-Key
  4. const quote = await cord.quotes.create({
  5. cliente: { empresa: 'Ridgeline Builders LLC' },
  6. items: [{ descripcion: 'Portlandzement 94 lb', cantidad: 240, precio_unitario: 16.4 }],
  7. });
  8. // Durchläuft alle Seiten; das SDK verwaltet den Cursor
  9. for await (const invoice of cord.invoices.listAll({ estado: 'open' })) {
  10. await erp.updateBalance(invoice.numero, invoice.saldo);
  11. }
  12. // Prüft X-Cord-Signature-V1, lehnt Signaturen über 5 Minuten ab
  13. export async function POST(req: Request) {
  14. const event = await constructEvent(await req.text(), req.headers,
  15. process.env.CORD_WEBHOOK_SECRET!);
  16. if (event.event === 'invoice.paid') {
  17. await erp.reconcile(event.data.numero, event.data.saldo);
  18. }
  19. return new Response(null, { status: 200 });
  20. }

CLI

Testen Sie Ihre Webhooks ohne Deployment.

cord listen leitet die Webhooks Ihrer Testumgebung an Ihren Rechner weiter, genauso signiert wie in der Produktion. cord trigger löst jedes beliebige Ereignis aus, und cord simulate stellt nach, was in der Produktion ein Dritter verursacht, etwa einen Dienst für die steuerliche Übermittlung, der nicht antwortet, oder ein Angebot, das abläuft.

  • npx @flouviahq/cli öffnet den Assistenten: Sie melden sich im Browser an, kopieren keine Schlüssel, und Ihr Projekt ist integriert
  • Akzeptiert nur Testschlüssel: Ihre echten Daten bleiben unberührt
  • cord events tail zeigt Ereignisse an, sobald sie eintreten
erp-materiales— zshsk_test_…9c2a

$ cord listen --forward-to http://localhost:3000/api/webhooks/cord

16:41:52quote.viewedevt_2a91f0c7d34b4e8fa15c6b0d9e7f3a21→ 200 38 ms

16:42:07quote.approvedevt_8d4c2b1e07a94f63b5e1c9a0f2d7b4e8→ 200 41 ms

16:42:58payment.partialevt_c35e9a7104bd4c2e8f6a1b0d3e9c5f72→ 200 52 ms

16:43:21invoice.finalizedevt_4be07a2d4e61b3f8a05c7d92e1aa9c1f→ 500 17 ms

16:44:05quote.expiredevt_f0a6d3b9c18e4a57b2d40e6c9a1f8b35→ 200 33 ms

16:44:12invoice.paidevt_9c1f4be07a2d4e61b3f8a05c7d92e1aa→ 200 36 ms

$ cord trigger quote.approved

$ cord simulate fiscal pac_caido

$ cord simulate quote 7e3b0c91-4d2a-4f6e-b8a5-2c9d1f0e6a47 vencer

$ cord events tail --type invoice.paid

16:44:12invoice.paidf3a8d1c4-2b6e-4d90-a1c7-5e8f0b3d2a61

HÄUFIGE FRAGEN

REST-API: Was Entwickler wissen wollen.

Eine REST-API unter https://cordhq.app/api/v1, die programmatischen Zugriff auf Angebote, Rechnungen, Kunden, Produkte, Aufgaben, Forderungsmanagement und Ereignisse Ihres Unternehmens bietet. Sie authentifiziert sich mit einem Bearer-Schlüssel und antwortet in JSON im Format { data, meta } oder { error, code }.

Nein. Die API ist in allen Tarifen verfügbar, auch im kostenlosen Tarif, mit 2 Schlüsseln und 100 Aufrufen pro Monat. Starter enthält 1.000 Aufrufe, Professional 5.000, Scale 10.000 und Developer 50.000. Testschlüssel verbrauchen kein Kontingent.

Mit einem sk_test_-Schlüssel. Er arbeitet in einer von Ihrem Konto getrennten Testumgebung, sodass Sie Angebote erstellen und löschen können, ohne Ihre Kunden oder Berichte zu beeinflussen.

Senden Sie den Header Idempotency-Key mit der Anfrage. Wiederholen Sie sie mit demselben Schlüssel und demselben Body, gibt Cord die ursprüngliche Antwort zurück, ohne sie erneut auszuführen.

Ja: @flouviahq/node für Node, Bun, Deno, Cloudflare Workers und Vercel sowie @flouviahq/cli, um Webhooks auf Ihrem Rechner zu testen. Beide sind auf npm verfügbar.

Nein. Jeder Schlüssel und jeder Webhook speichert die API-Version, mit der er erstellt wurde, und Sie können pro Anfrage mit dem Header Cord-Version eine andere festlegen. Cord passt die Antwort an diese Version an.

Ja. Ein eingeschränkter Schlüssel (rk_) hat Lese- oder Schreibberechtigung pro Ressource, und jeder geheime Schlüssel lässt sich auf bestimmte IP-Adressen beschränken, mit einem Ablaufdatum versehen und mit einer Übergangsfrist rotieren.

Ja, unter https://cordhq.app/openapi.yaml, dazu eine Zusammenfassung für KI-Assistenten unter https://cordhq.app/llms.txt. Beide sind in der Workbench verlinkt.

Entdecken Sie den Rest der Entwicklerplattform.

Machen Sie noch heute Ihren ersten Aufruf.

Erstellen Sie Ihr Konto, generieren Sie einen Testschlüssel und rufen Sie /api/v1/me auf.

Sie sehen, was Sie zahlen

Veröffentlichte Preise, bei denen die Gebühr für jede Zahlung klar ausgewiesen ist.

Mehr zu den Preisen →

Legen Sie los

Starten Sie im kostenlosen Tarif und versenden Sie Ihre Angebote.

Integrationsoptionen →