API REST
Bases de l'API
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 à :
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 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
| Verbe | Utilisé pour |
|---|---|
| GET | Lire une ressource, ou en lister plusieurs. |
| POST | Créer une ressource, ou déclencher une action (génération, publication). |
| PUT/PATCH | Mettre à jour une ressource. Les deux sont acceptés partout où un endpoint documente une mise à jour. |
| DELETE | Supprimer 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.
| Sandbox | Production | |
|---|---|---|
| Disponible dès la création du compte | oui | uniquement si votre organisation est autorisée pour le mode production |
| Filigrane | chaque document généré porte un filigrane | pas de filigrane |
| Priorité de génération par défaut | forcé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 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
| Code | Signification |
|---|---|
| 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é :
| Situation | Statut | Corps |
|---|---|---|
| Clé d'API absente, invalide ou désactivée | 403 | {"error": "<message>"} |
| Corps JSON mal formé | 400 | {"error": "Le body de la requête semble mal formé."} |
| Clé racine requise absente | 400 | {"error": "<names the missing param>"} |
| Échec de validation du modèle à la création/mise à jour | 422 | {"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 introuvable | 404 | {"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ête | Signification |
|---|---|
| results | Nombre total d'enregistrements, toutes pages confondues. |
| results_per_page | Enregistrements par page (30). |
| current_page | La page renvoyée par cette réponse. |
| pages_count | Nombre 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
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 https://app.doclift.io/api/v1/user \
-H "X-Api-Key: <your-api-key>"
{
"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.