API REST

Bases de l'API

API v115 août 2026·7 min de lecture

URL de base, authentification, environnements, dates, codes de réponse, enveloppe d'erreur, pagination, et GET /api/v1/user.

URL de base

Chaque endpoint de cette documentation est relatif à :

Code
https://app.doclift.io/api/v1

Envoyez vos requêtes directement depuis votre serveur, jamais depuis le navigateur d'un utilisateur. Votre clé d'API serait sinon exposée à quiconque inspecte la page.


Authentification

Chaque requête porte un en-tête X-Api-Key. La clé identifie une application externe, qui appartient à une organisation. Chaque lecture et écriture de cette API est restreinte à cette organisation, pas à un utilisateur ou à une clé en particulier.

cURL
curl https://app.doclift.io/api/v1/templates \
  -H "X-Api-Key: <your-api-key>"

Une clé appartenant à une application externe désactivée répond exactement comme une clé inconnue : 403 Forbidden. Voir Codes de réponse pour les corps exacts.


Verbes HTTP

VerbeUtilisé pour
GETLire une ressource, ou en lister plusieurs.
POSTCréer une ressource, ou déclencher une action (génération, publication).
PUT/PATCHMettre à jour une ressource. Les deux sont acceptés partout où un endpoint documente une mise à jour.
DELETESupprimer une ressource : un archivage doux sur certaines ressources, une suppression définitive sur d'autres ; chaque page d'endpoint précise laquelle.

Envoyez des corps JSON ; chaque réponse est en JSON.


Environnements

Chaque application externe (clé d'API) est créée dans l'un des deux environnements. Les deux partagent les mêmes modèles et les mêmes données : un environnement est une propriété de la clé, pas de la ressource sur laquelle elle agit.

SandboxProduction
Disponible dès la création du compteouiuniquement si votre organisation est autorisée pour le mode production
Filigranechaque document généré porte un filigranepas de filigrane
Priorité de génération par défautforcée à low (voir priorité)ce que vous envoyez (par défaut critical)
Quotas (taille maximale de document, nombre de tentatives de webhook)identiques à la production (définis par organisation, pas par environnement)identiques à la sandbox

La création d'une clé de production requiert que votre organisation soit autorisée pour le mode production ; cette vérification n'a lieu qu'à la création de la clé, donc une clé de production déjà émise continue de fonctionner même si l'autorisation est révoquée par la suite. Il n'existe pas de restriction équivalente sur les clés sandbox.

Il n'y a aucune limitation de débit dans cette API. Aucun plafond de requêtes par minute n'existe à atteindre, dans aucun des deux environnements.


Format de date

Tous les horodatages (created_at, updated_at, generated_at, timestamp et champs similaires) sont rendus au format ISO-8601, par exemple 2024-01-15T10:30:00+01:00. Le champ timestamp envoyé dans chaque payload de webhook est calculé au moment de la réponse plutôt que lu depuis une colonne stockée, mais utilise le même format ISO-8601 que tout autre champ de date de cette API.


Langue des réponses

Les messages d'erreur sont rendus en français par défaut. Pour les recevoir en anglais, envoyez l'en-tête Accept-Language :

cURL
curl https://app.doclift.io/api/v1/document_requests \
  --request POST \
  --header "X-Api-Key: <your-api-key>" \
  --header "Accept-Language: en" \
  --header "Content-Type: application/json" \
  --data '{ "document_request": { "type": "synchrone" } }'

fr et en sont les deux seules langues servies. Un en-tête portant autre chose, ou absent, laisse le français. Un en-tête pondéré est lu dans son ordre de préférence.

Seuls les messages changent : les codes de statut, les clés JSON et les valeurs machine comme code ou generation_status sont identiques dans les deux langues, et ce sont elles qu'il faut tester dans votre code.

deux messages ne suivent pas encore ce réglage, ceux des réponses 502 et 504, servis en français quelle que soit la langue demandée. Leur champ code reste, lui, stable.


Codes de réponse

CodeSignification
200 La requête a réussi.
201 Une ressource a été créée.
204 La requête a réussi ; il n'y a pas de corps de réponse.
400 Le corps n'est pas du JSON valide, ou il manque sa clé racine requise (template, variable, document_request, …).
403 L'en-tête X-Api-Key est absent, inconnu, ou appartient à une application externe désactivée.
404 La ressource n'existe pas, n'appartient pas à votre organisation, est archivée, ou n'est pas la catégorie que cet endpoint traite.
409 Une écriture sur un workflow est refusée car le constructeur du dashboard détient actuellement le verrou d'édition dessus (endpoints d'édition de workflow uniquement) ; les modèles, variables et demandes de document ne répondent jamais 409.
422 La requête était bien formée mais a échoué à une validation ou une règle métier.
429 Votre organisation a déjà trop de demandes synchrones en attente de traitement. Un en-tête Retry-After porte le délai avant de rejouer. Ne concerne pas la génération asynchrone.
502 L'issue de la demande n'a pas pu être confirmée : elle a peut-être abouti. Le corps porte code: "outcome_unknown" et votre tag. Vérifiez avant de rejouer, sous peine de créer un second document.
504 La génération se poursuit au-delà du délai d'attente. Le corps porte code: "generation_pending", l'id de la demande et l'adresse où la relire. Rien n'est perdu.

Erreurs

Il n'existe pas d'enveloppe d'erreur unique partagée par toute l'API. La forme dépend de ce qui a échoué :

SituationStatutCorps
Clé d'API absente, invalide ou désactivée403 {"error": "<message>"}
Corps JSON mal formé400 {"error": "Le body de la requête semble mal formé."}
Clé racine requise absente400 {"error": "<names the missing param>"}
Échec de validation du modèle à la création/mise à jour422 {"errors": ["<message>", ...]}
Échec d'une règle métier (ex. création d'une demande de document)422 {"error": "<message>"}, plus invalid_variables pour une violation d'allowed_values sur un formulaire PDF
Ressource introuvable404 {"error": "Template not found"} / {"error": "Variable not found"} / {"error": "Record not found"}

Le nom de la clé (error contre errors) et la formulation du message d'introuvable varient tous deux selon l'endpoint. Fiez-vous au code de statut, pas à une forme de corps figée, si vous distinguez les échecs de façon automatisée.


Pagination

Deux endpoints de liste sont paginés : GET /api/v1/templates et GET /api/v1/document_requests. La taille de page est fixée à 30 et ne peut pas être modifiée ; ajoutez ?page= pour parcourir les résultats. Une page au-delà de la dernière répond toujours 200 avec un tableau vide, jamais un 404.

Chaque réponse paginée porte ces en-têtes :

En-têteSignification
resultsNombre total d'enregistrements, toutes pages confondues.
results_per_pageEnregistrements par page (30).
current_pageLa page renvoyée par cette réponse.
pages_countNombre total de pages.

La seule exception : GET /api/v1/document_requests saute entièrement la pagination lorsque votre organisation n'a strictement aucune demande de document, en répondant 200 [] sans aucun de ces en-têtes. Il n'y a rien à parcourir. GET /api/v1/templates les définit toujours, même pour un résultat vide.

GET /api/v1/templates/:template_id/variables n'est pas paginé. Il renvoie toujours toutes les variables du modèle dans un seul tableau.


Informations utilisateur

GET/api/v1/user

Renvoie le profil de l'utilisateur auquel votre clé correspond (le créateur de l'application externe, ou le propriétaire de l'organisation si ce créateur a été désactivé), ainsi que les limites de compte de votre organisation et les informations publiques propres à la clé appelante. Aucun paramètre.

cURL
curl https://app.doclift.io/api/v1/user \
  -H "X-Api-Key: <your-api-key>"
200 OK · application/json
{
  "id": 100001,
  "firstname": "John",
  "lastname": "Doe",
  "email": "[email protected]",
  "created_at": "2021-02-15T10:30:00+01:00",
  "updated_at": "2021-06-20T14:00:00+01:00",
  "document_max_length_allowed": 800000,
  "webhooks_replays_count": 3,
  "allowed_to_use_production_mode": false,
  "current_external_application": {
    "name": "My App",
    "environment": "sandbox",
    "active": true,
    "webhook_url": "https://myapp.com/webhooks/doclift",
    "revealable_secret_key": "•••...abc12345"
  }
}

document_max_length_allowed, webhooks_replays_count et allowed_to_use_production_mode sont les réglages de votre organisation, pas des réglages personnels. Chaque clé de la même organisation renvoie les mêmes valeurs. current_external_application n'inclut jamais le secret_key brut, seulement le revealable_secret_key masqué.

Codes de statut : 200 en cas de succès, 403 selon les règles d'authentification ci-dessus. Il n'y a pas d'autre mode d'échec pour cet endpoint.