Devis, factures et paiements, depuis votre propre code.

L’API REST de Cord crée et consulte des devis, des clients, des produits et des factures avec une clé Bearer, et exécute les mêmes actions que l’application : envoyer, approuver, émettre ou enregistrer un paiement. Des réponses JSON prévisibles, une spécification OpenAPI et des clés de test qui fonctionnent dans un environnement isolé de vos données réelles.

Dans toutes les offres. L’offre Gratuite inclut 2 clés et 100 appels par mois ; les clés de test ne consomment pas votre quota.

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": "Ciment Portland 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 requêtes/min par clé secrète

IDEMPOTENCE

Relancez sans craindre les doublons.

Un réseau instable ne devrait pas créer deux devis. Envoyez une Idempotency-Key avec n’importe quel POST, PATCH ou DELETE : si la requête est répétée avec la même clé et le même corps, Cord renvoie la réponse d’origine, marquée Idempotent-Replayed, au lieu de l’exécuter deux fois. Si le corps a changé, la réponse est une erreur explicite.

  • Fonctionne sur toutes les mutations de /api/v1
  • La réponse rejouée est identique, octet par octet
  • Même clé, autre corps : une erreur, jamais un doublon silencieux
Nouvelle tentative avec la même Idempotency-Key/api/v1
# 1re tentative : le devis est créé
POST /api/v1/cotizaciones
Idempotency-Key: pedido-7781
← 200  { "data": { "folio": "COT-0150", … } }

# 2e tentative (coupure réseau) : même clé, même corps
POST /api/v1/cotizaciones
Idempotency-Key: pedido-7781
← 200  Idempotent-Replayed: true
      { "data": { "folio": "COT-0150", … } }
      # la même réponse, octet par octet

# même clé, autre corps
← 422  { "error": "Esta clave de idempotencia ya se usó con otra petición.",
        "code": "idempotency_key_reused" }

# la première requête est toujours en cours
← 409  { "code": "idempotency_in_progress" }

RESSOURCES

Ce que vous voyez dans l’application, aussi via l’API.

Ce n’est pas une API en lecture seule. Créez un devis et envoyez-le, approuvez-le ou marquez-le comme payé. Créez une facture en brouillon et émettez-la, envoyez-la, enregistrez-y un paiement ou un avoir. Le tout avec les mêmes droits, validations et totaux que l’application.

  • Devis, factures, clients, produits, tâches et recouvrement
  • Actions avec POST { "action": "send" | "approve" | "finalize" | … }
  • Pagination avec limit et offset, ou par curseur pour les événements et les factures
Vue d’ensembleJournauxErreursÉvénementsWebhooksShellClés APISanté

Référence de l’API

34 opérations. Base https://cordhq.app/api/v1 avec Authorization: Bearer et votre clé.

Spécification OpenAPI ↗llms.txt (docs pour l’IA) ↗
Exemple
curl https://cordhq.app/api/v1/me \
  -H "Authorization: Bearer $CORD_SECRET_KEY"
Compte
GET/meOrganisation et portée de la cléEssayer
Devis
GET/cotizacionesLister les devisEssayer
POST/cotizacionesCréer un devisEssayer
GET/cotizaciones/{id}Détail du devisEssayer
POST/cotizaciones/{id}Envoyer, renvoyer, approuver, refuser ou marquer comme payéEssayer
DELETE/cotizaciones/{id}Supprimer un brouillonEssayer
POST/cotizaciones/iaProposer des lignes à partir du texte d’une commandeEssayer
Clients
GET/clientesLister les clientsEssayer
POST/clientesCréer un clientEssayer
GET/clientes/{id}Détail du clientEssayer
PATCH/clientes/{id}Mettre à jour les coordonnéesEssayer
Produits
GET/productosLister les produitsEssayer
POST/productosCréer un produitEssayer
Factures
GET/facturasLister les facturesEssayer
POST/facturasCréer une facture brouillonEssayer
GET/facturas/{id}Détail de la factureEssayer
POST/facturas/{id}Émettre, envoyer, annuler, enregistrer un paiement ou un avoirEssayer
Recouvrement
GET/cobranzaCréancesEssayer
Événements
GET/eventsHistorique des événementsEssayer
Tâches
POST/tareasCréer une tâcheEssayer
Workflows
POST/workflows/{id}/invokeLancer un workflow « Vous le lancez » sur des devis ou des facturesEssayer
Webhooks
GET/webhooksEndpoints créés par cette clé
POST/webhooksCréer un endpoint (le secret n’est renvoyé qu’une fois)
DELETE/webhooks/{id}Supprimer l’endpoint
Elements
GET/elements/configConfiguration affichée par Cord ElementsEssayer
POST/elements/ai-draftLignes générées par IA, en streaming (text/event-stream)
Mode test
POST/test_helpers/fiscalForcer le résultat de la prochaine émissionEssayer
POST/test_helpers/cotizaciones/{id}Simuler une consultation ou une expirationEssayer
POST/test_helpers/webhooksDéclencher un webhookEssayer
POST/test_helpers/listenOuvrir une session cord listen
GET/test_helpers/listen/{id}Récupérer les événements de la session
DELETE/test_helpers/listen/{id}Fermer une session cord listen
Configuration
POST/setup/plansProposer une configuration du compte (une personne la valide sur review_url)Essayer
GET/setup/plans/{id}Statut d’une proposition de configurationEssayer

ÉVÉNEMENTS

Synchronisez sans rien manquer.

GET /api/v1/events renvoie l’historique de votre entreprise, du plus récent au plus ancien : devis envoyés, consultés, approuvés ou payés, factures émises, nouveaux clients. Filtrez par type ou par objet et avancez avec next_cursor. C’est le complément des webhooks pour reconstruire n’importe quel état.

  • Filtres ?type=quote.approved et ?object_id=
  • Jusqu’à 200 événements par page avec un curseur stable
  • Les mêmes types que reçoivent vos webhooks
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"
  }
}

OUTILS

Votre backend et votre terminal, prêts pour Cord.

Deux paquets officiels sur npm, pour qu’intégrer ne revienne pas à écrire des requêtes à la main : un SDK typé pour votre serveur et une CLI pour tester les webhooks sur votre machine avant de déployer.

SDK SERVEUR

L’API, déjà typée pour votre backend.

@flouviahq/node encapsule toute l’API : il crée des devis et des factures, parcourt des listes complètes et vérifie les webhooks par leur signature et leur ancienneté. Il envoie la même Idempotency-Key à chaque nouvelle tentative et fixe la version de l’API, pour qu’une mise à jour de Cord ne change jamais ce que vous lisez.

  • npm install @flouviahq/node, sans dépendances
  • Fonctionne sur Node, Bun, Deno, Cloudflare Workers et Vercel
  • Des erreurs avec code, request_id et un lien vers leur explication
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. // Si le réseau tombe, la nouvelle tentative réutilise la même Idempotency-Key
  4. const quote = await cord.quotes.create({
  5. cliente: { empresa: 'Ridgeline Builders LLC' },
  6. items: [{ descripcion: 'Ciment Portland 94 lb', cantidad: 240, precio_unitario: 16.4 }],
  7. });
  8. // Parcourt toutes les pages ; le SDK gère le curseur
  9. for await (const invoice of cord.invoices.listAll({ estado: 'open' })) {
  10. await erp.updateBalance(invoice.numero, invoice.saldo);
  11. }
  12. // Vérifie X-Cord-Signature-V1 et rejette les signatures de plus de 5 minutes
  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

Testez vos webhooks sans déployer.

cord listen transmet à votre machine les webhooks de votre environnement de test, signés exactement comme en production. cord trigger déclenche n’importe quel événement, et cord simulate reproduit ce qu’un tiers provoque en production, comme un service d’émission fiscale qui ne répond plus ou un devis qui expire.

  • npx @flouviahq/cli lance l’assistant : vous vous connectez depuis le navigateur, sans copier de clé, et votre projet est intégré
  • N’accepte que des clés de test : rien ne touche à vos données réelles
  • cord events tail affiche les événements au fur et à mesure
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

QUESTIONS FRÉQUENTES

API REST : les questions des développeurs.

C’est une API REST sur https://cordhq.app/api/v1 qui donne un accès programmatique aux devis, factures, clients, produits, tâches, recouvrement et événements de votre entreprise. Elle s’authentifie avec une clé Bearer et répond en JSON sous la forme { data, meta } ou { error, code }.

Non. L’API est disponible dans toutes les offres, y compris l’offre Gratuite, avec 2 clés et 100 appels par mois. Starter inclut 1 000 appels, Professionnel 5 000, Scale 10 000 et Developer 50 000. Les clés de test ne consomment pas de quota.

Avec une clé sk_test_. Elle opère sur un environnement de test séparé de votre compte : vous pouvez créer et supprimer des devis sans affecter vos clients ni vos rapports.

Envoyez l’en-tête Idempotency-Key avec la requête. Si vous la répétez avec la même clé et le même corps, Cord renvoie la réponse d’origine sans l’exécuter à nouveau.

Oui : @flouviahq/node pour Node, Bun, Deno, Cloudflare Workers et Vercel, et @flouviahq/cli pour tester les webhooks sur votre machine. Les deux sont disponibles sur npm.

Non. Chaque clé et chaque webhook conservent la version de l’API avec laquelle ils ont été créés, et vous pouvez en fixer une autre par requête avec l’en-tête Cord-Version. Cord adapte la réponse à cette version.

Oui. Une clé restreinte (rk_) dispose d’un droit de lecture ou d’écriture par ressource, et toute clé secrète peut être limitée à certaines adresses IP, recevoir une date d’expiration et être renouvelée avec une période de grâce.

Oui, sur https://cordhq.app/openapi.yaml, ainsi qu’un résumé pour les assistants IA sur https://cordhq.app/llms.txt. Les deux sont accessibles depuis le Workbench.

Découvrez le reste de la plateforme pour développeurs.

Passez votre premier appel aujourd’hui.

Créez votre compte, générez une clé de test et appelez /api/v1/me.

Sachez ce que vous paierez

Des tarifs publiés, avec les frais de chaque encaissement bien visibles.

En savoir plus sur les tarifs →

Lancez-vous

Commencez à travailler et à envoyer des devis avec le plan Gratuit.

Options d’intégration →