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.
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. |
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.