Aller au contenu
EN
Sur cette page

Référence API

Base : https://dokkraft.blocsland.com/api/v1 — authentification Authorization: Bearer dfk_… sur tous les endpoints. Les réponses sont JSON (Content-Type: application/json), sauf les PDF en flux.

Les identifiants utilisés dans les URLs sont les public_id (template, dossier), pas les identifiants internes.

Idempotence des créations

Les quatre POST de création (documents unitaires et lots) acceptent un en-tête Idempotency-Key — une valeur unique par intention, par exemple un UUID généré chez vous. Si un timeout réseau fait rejouer le POST avec la même clé et le même payload, vous recevez la réponse du premier appel (Idempotent-Replayed: true) au lieu d'un doublon numéroté — la mémoire vit 24 h. Avec download=true, le replay re-sert le PDF du document créé par le premier appel.

Réponse Signification
Réponse du 1er appel + Idempotent-Replayed: true Intentions identiques — aucun doublon créé
422 idempotency_key_reused Même clé avec un payload différent — une clé porte une seule intention, générez-en une nouvelle
409 idempotency_in_progress Un appel avec cette clé est encore en cours — réessayez dans un instant

POST /templates/{public_id}/pdf

Génère un PDF sans rien enregistrer : le corps du template est rendu avec les variables passées.

Paramètre Type Description
data object Valeurs des variables ({"client.nom": "ACME"})
references object Fiches liées par identifiant ({"client": "42"}) — résolues comme en mode document
tableData array Lignes des tableaux
download boolean true → pièce jointe, sinon flux inline

Réponse : PDF (application/pdf).

POST /templates/{public_id}/documents

Crée un document numéroté et archivé (racine « Non classés », ou dossier folder), avec son PDF.

Paramètre Type Description
name string Nom du document (défaut Document API)
date string Date d'émission (Y-m-d)
folder string public_id du dossier d'archivage
data, references, tableData object / array Variables, registres, lignes de tableaux
download boolean Renvoie le PDF au lieu du JSON
async boolean true → le PDF part sur la file d'attente : la réponse 201 arrive dès la numérotation (pdfStatus: "queued"), sondez GET /documents/{id} puis récupérez le PDF — ou déclarez un webhook pour être prévenu. Sans async, le rendu est synchrone (~2 s en médian, la requête attend le PDF)

Réponse 201 : fiche du document (contrat intégrateur, id = public_id — enchaînable avec GET /documents/{id}/pdf).

{
  "id": "01HXXXX-public-id",
  "name": "Facture ACME",
  "numero": "FAC-2026-0042",
  "status": "emis",
  "templateId": "tmpl_01HYYYY",
  "folderId": null,
  "date": "2026-09-22",
  "amount": 1250.0,
  "pdfStatus": "ready",
  "pdfUrl": "/api/v1/documents/01HXXXX-public-id/pdf",
  "emittedAt": "2026-09-22T10:15:00+00:00"
}

Idempotence : en-tête Idempotency-Key accepté — voir la section dédiée en tête de page.

Erreurs : 422 async combiné à download (incompatibles — l'un répond sans le PDF, l'autre attend le rendu synchrone), 422 champs obligatoires manquants (format {message, errors} — voir Erreurs), 503 pdf_busy quand le pool de rendu synchrone est saturé (en-tête Retry-After: 5 — relancez ou passez en async=true, qui n'occupe pas de créneau).

Champs obligatoires du template : les variables et suivis marqués required dans le schéma doivent être résolus non vides, sinon 422 — mais une cascade dossier/espace, un défaut du schéma, une formule ou la date dédiée satisfont l'exigence : data n'est nécessaire que pour ce qui n'est pas pré-rempli (clés d'erreur détaillées dans Erreurs). Cette règle vaut pour les POST unitaires et pour chaque item de lot.

POST /folders/{public_id}/documents

Identique à l'endpoint précédent, mais le dossier est le point d'entrée : son template (lié localement ou hérité d'un ancêtre), sa cascade de registres et ses variables s'appliquent automatiquement.

Paramètre Type Description
name, date string Comme ci-dessus
data, references, tableData object / array Surcharges de la cascade
download boolean Renvoie le PDF au lieu du JSON
async boolean Comme ci-dessus

Erreurs : 404 dossier inconnu (ou hors de l'espace de la clé), 422 aucun template lié ou async combiné à download, 422 champs obligatoires manquants et 503 pdf_busy — mêmes contrats que l'endpoint précédent (la cascade du dossier peut à elle seule satisfaire les champs required).

POST /templates/{public_id}/documents/batch

Génération en lot (asynchrone). Crée plusieurs documents d'un coup et répond 202 immédiatement : les documents sont émis hors requête, leur PDF rendu par la file d'attente. L'avancement se suit par GET /batches/{batch_id} — c'est la voie à privilégier dès qu'il s'agit de créer plus de quelques documents.

Paramètre Type Description
items array (1–50) Un objet par document : name, date, folder, data, references, tableData — les mêmes champs que l'endpoint unitaire
folder string public_id du dossier d'archivage par défaut (chaque item peut le surcharger)

Réponse 202 : la ressource batch.

{
  "id": "4e7c9a52-…",
  "status": "pending",
  "total": 2,
  "counts": { "queued": 2, "emitted": 0, "failed": 0 },
  "items": [
    { "position": 0, "status": "queued", "document": null }
  ]
}

Limites : 50 items par lot, 2 lots actifs (pending/processing) par espace de travail, 10 lots/minute. Le quota mensuel documents est décompté par document réellement émis — le refus rapide 429 quota_exceeded indique remaining et required quand il reste moins de documents que d'items demandés.

Erreurs : 422 validation (items mal formés, dossier inconnu), 429 batch_limit_reached (trop de lots actifs) ou quota_exceeded (pré-vol du quota documents).

POST /folders/{public_id}/documents/batch

Identique au précédent, mais le dossier est le point d'entrée : son template (lié localement ou hérité d'un ancêtre) et sa cascade s'appliquent à tous les items.

GET /batches/{batch_id}

État d'un lot (polling de l'intégrateur). Chaque appel compte dans le quota api_calls — un sondage toutes les 2-3 s est largement suffisant. Un lot actif sans mise à jour depuis 15 min (job perdu côté serveur) est automatiquement repris : continuez simplement de sonder. Le webhook batch.completed vous évite ce sondage — voir Webhooks.

Réponse 200 : la ressource batch complète. status vaut pending → processing → completed (tout est émis), partial (au moins un échec) ou failed. Chaque item porte son document (numéro, pdfStatus, pdfUrl) dès qu'il est émis ; l'échec d'un item ne bloque jamais les autres — son error explique pourquoi.

GET /documents/{public_id}

Fiche d'un document créé par l'API — le même format que la réponse du POST unitaire (id, numero, pdfStatus, pdfUrl, …). 404 si le document est étranger à l'espace de la clé.

GET /documents/{public_id}/pdf

Le PDF du document, en flux (?download=true pour une pièce jointe). Complément du mode batch : le fichier n'existe qu'après le rendu en file.

Réponse Signification
200 Le PDF (flux application/pdf)
202 + Retry-After: 5 Rendu en cours — sondez à nouveau (ou recevez un webhook dès qu'il est prêt)
409 pdf_draft / pdf_failed / pdf_missing Brouillon (pas de PDF), rendu échoué ou fichier indisponible
410 pdf_expired PDF purgé par la rétention du plan (régénération possible depuis l'application)

POST /embed/sessions

Crée une session de studio en iframe : échange la clé API contre une URL signée à charger dans votre produit.

Paramètre Type Description
template_id string public_id du template à éditer
allowed_domains array Origines autorisées (1 à 10) — https://app.exemple.com
ttl_minutes integer Durée de vie (5 à 1440, défaut 120)
permissions object variables (frozen|editable), ai, save, export_pdf

Réponse 201 : { "url", "token", "expires_at", "permissions" }.

DELETE /embed/sessions/{token}

Révoque une session d'embed : l'iframe cesse de fonctionner immédiatement (clé fugée, fin de contrat…). Répond 200 {"revoked": true} même pour un jeton inconnu ou déjà révoqué — même réponse dans tous les cas, pas d'énumération possible.

GET /templates/{public_id}/schema

Sans authentification. Schéma de variables du template (champs de génération, registres référencés) — pratique pour construire un formulaire dynamique côté intégrateur.