API REST

API Demandes de document

API v115 août 2026·7 min de lecture

Référence complète de l'API Demandes de document de Doclift : génération asynchrone, le payload, les statuts, les erreurs de validation et les limites.

L'objet demande de document

  • id : identifiant unique
  • tag : chaîne libre que vous envoyez, renvoyée telle quelle
  • type : asynchrone (orthographié tel quel, pas le terme anglais « asynchronous ») ; la valeur à envoyer à la création
  • sandbox_mode : défini une fois pour toutes à la création, d'après l'environnement de la clé appelante
  • status : in_progress, success, ou error (le résultat global de la requête)
  • documents_generations : présent sur l'endpoint de liste et sur l'endpoint de détail ; absent de la réponse de création, puisque rien n'a encore été rendu au moment où elle répond ; chaque entrée a id, tag, generated_at, created_at, generation_status (created, in_progress, success, ou error), et file (filename, url, size)

template_id accepte un modèle custom, fillable_form, ou workflow, du moment qu'il est publié. La forme du payload est identique pour les trois. Les modèles workflow portent un contrat supplémentaire par-dessus tout ce qui suit. Voir Modèles workflow.


Génération asynchrone

type: "asynchrone" accepte une ou plusieurs entrées dans document_generations et répond immédiatement avec id, tag, type, sandbox_mode, et status: "in_progress" : aucune clé documents_generations du tout, puisque rien n'a encore été rendu. Les documents terminés arrivent plus tard sous forme de webhook. Voir Webhooks. La génération nécessite une URL de webhook configurée sur l'application externe appelante ; sans elle, la requête est refusée avant même que quoi que ce soit soit créé :

422 Unprocessable Content · application/json
{
  "error": "Please add a webhook URL to this external application to use asynchronous generation. You can add one from your Doclift.io account."
}

La sandbox force la priorité à low

priority (critical, default, ou low, défaut critical) définit le rang de cette demande parmi les autres en attente de génération. En mode sandbox, elle est toujours forcée à low, quelle que soit la valeur envoyée.


Créer une demande de document

POST/api/v1/document_requests
cURL
curl https://app.doclift.io/api/v1/document_requests \
  --request POST \
  --header "X-Api-Key: <your-api-key>" \
  --header "Content-Type: application/json" \
  --data '{
    "document_request": {
      "type": "asynchrone",
      "document_generations": [
        {
          "template_id": 100013,
          "tag": "Invoice#42",
          "variables": {
            "client_name": "John Doe"
          }
        }
      ],
      "tag": "Batch#1"
    }
  }'
200 OK · application/json
{
  "id": 100004,
  "tag": "Batch#1",
  "type": "asynchrone",
  "sandbox_mode": false,
  "status": "in_progress"
}
ChampTypeRequisNotes
typestringouienvoyez asynchrone
prioritystringnoncritical, default, ou low ; forcé à low en sandbox
tagstringnondéfaut ""
document_generationsarrayouiune ou plusieurs entrées
document_generations[].template_idintegerouidoit être publié
document_generations[].tagstringnondéfaut ""
document_generations[].variablesobject ou nullnonobjet plat clé/valeur (voir Types de modèles)

Il n'y a pas de clé d'idempotence : envoyer deux fois le même corps crée deux demandes de document indépendantes, chacune avec son propre statut.


Erreurs de validation

Chacun des cas suivants est vérifié dans l'ordre ; le premier échec court-circuite le reste et répond avant qu'aucun document ne soit généré.

ÉchecStatutNotes
type422 "The requested generation type is invalid. Accepted values: synchrone / asynchrone"
priority422 {"error": "..."}, nomme les valeurs acceptées
webhook_url422 voir Génération asynchrone
document_generations422 "The following required parameters are missing: document_generations"
template_id422 "The following required parameters are missing: template_id"
template_id422 nomme l'identifiant ; un mauvais identifiant et celui de quelqu'un d'autre répondent à l'identique
content422
Le contenu rendu dépasse la limite de taille de l'organisation422 voir Limites
variables422
document_request400 {"error": "..."}, nomme le paramètre manquant le cas échéant

Une clé d'API absente, invalide, ou désactivée répond 403 dans tous les cas, comme partout ailleurs dans l'API. Voir Codes de réponse.

Erreurs de validation des variables

Sur un modèle fillable_form uniquement, chaque valeur fournie est vérifiée par rapport aux allowed_values auto-détectées de sa variable (voir Formulaires PDF). Une valeur hors de la liste autorisée répond 422 en nommant chaque champ fautif :

422 Unprocessable Content · application/json
{
  "error": "Les valeurs fournies pour certaines variables ne sont pas valides (status: 'bad_value' (valeurs autorisées : approved, rejected)).",
  "invalid_variables": [
    { "field": "status", "value": "bad_value", "allowed_values": ["approved", "rejected"] }
  ]
}

Les modèles custom et workflow ne sont pas vérifiés par rapport à allowed_values au moment de la génération par cette étape.

Si la génération échoue pour toute autre raison une fois le payload par ailleurs valide, vous l'observez via generation_status/generation_error de GET /api/v1/document_requests/:id, ou via generation_status: "error" du payload du webhook.


Modèles workflow

Les modèles workflow sont générés via ce même endpoint. Il n'y a pas de route de génération workflow séparée. Les workflows sont en bêta privée, disponibles sur demande en écrivant à [email protected] ; voir Workflows pour la vue d'ensemble.

En plus de tout ce qui précède, le payload variables d'un workflow porte un contrat de variable requise qu'aucune autre catégorie n'impose :

Workflow document_generations entry
{
  "template_id": 100050,
  "variables": {
    "investor_type": "natural",
    "country": "FR",
    "investments": [{ "product": "SCPI", "amount": "10 000 €" }]
  },
  "tag": ""
}
ÉchecDéclencheur
Variable requise manquanteune variable déclarée required n'a aucune clé du tout dans le payload
Collection malforméela valeur d'une variable de type collection n'est pas un tableau d'objets plats
Valeur non scalaireune variable non-collection a reçu un tableau ou un objet
Collection surdimensionnéeune collection porte plus de 200 lignes
Champ de ligne requis manquantun champ requis d'une ligne de collection n'a aucune clé dans cette ligne
Exclut toutes les sectionsles conditions du payload ne laissent rien à afficher
N'imprime rienles sections survivent aux conditions mais s'assemblent en contenu vide

Une clé présente avec une chaîne vide ou null compte comme répondue. Seule l'absence de la clé déclenche la vérification de variable manquante. Tous les échecs applicables sur le lot entier sont rapportés ensemble dans un seul 422 {"error": "..."}, nommant chaque modèle et variable concernés à la fois (utile lorsqu'un lot mélange plusieurs générations de workflow). allowed_values n'est pas vérifié pour les variables de workflow au moment de la génération.


Lister les demandes de document

GET/api/v1/document_requests
cURL
curl https://app.doclift.io/api/v1/document_requests \
  --header "X-Api-Key: <your-api-key>"
200 OK · application/json
[
  {
    "id": 100004,
    "tag": "Batch#1",
    "type": "asynchrone",
    "external_application": {
      "id": 100000,
      "name": "Production key",
      "environment": "sandbox",
      "active": true
    },
    "documents_generations": [
      {
        "id": 100230,
        "tag": "Invoice#42",
        "generated_at": "2024-01-15T10:35:02+01:00",
        "created_at": "2024-01-15T10:35:00+01:00",
        "generation_status": "success",
        "file": {
          "filename": "Invoice-1615737313.pdf",
          "url": "https://doclift.s3.eu-west-1.amazonaws.com/d207f8fe.pdf?[...]",
          "size": 40290
        }
      }
    ]
  }
]

Liste les demandes de document de votre organisation, les plus récentes en premier. Cela découle de l'association au niveau de l'organisation, donc les demandes créées via d'autres applications externes de la même organisation apparaissent aussi, pas seulement celles de la clé appelante. Paginé à 30 par page ; voir Pagination.

StatutCorpsQuand
200 tableautoujours, y compris pour un compte vide
403 {"error": "..."}clé d'API absente, inconnue, ou désactivée

Consulter une demande de document

GET/api/v1/document_requests/:id
cURL
curl https://app.doclift.io/api/v1/document_requests/100004 \
  --header "X-Api-Key: <your-api-key>"
200 OK · application/json
{
  "id": 100004,
  "tag": "Batch#1",
  "type": "asynchrone",
  "external_application": {
    "id": 100000,
    "name": "Production key",
    "environment": "sandbox",
    "active": true
  },
  "documents_generations": [
    {
      "id": 100230,
      "tag": "Invoice#42",
      "generated_at": "2024-01-15T10:35:02+01:00",
      "created_at": "2024-01-15T10:35:00+01:00",
      "generation_status": "success",
      "generation_duration": 1721,
      "generation_error": null,
      "sent_payload": { "client_name": "John Doe" },
      "file": {
        "filename": "Invoice-1615737313.pdf",
        "url": "https://doclift.s3.eu-west-1.amazonaws.com/d207f8fe.pdf?[...]",
        "size": 40290
      },
      "template": {
        "id": 100013,
        "title": "Invoice",
        "description": "A template for invoices"
      }
    }
  ]
}

C'est la vue la plus riche : sent_payload (exactement ce que vous avez envoyé), generation_duration, generation_error, et le template source ne sont présents qu'ici, jamais dans la liste ni dans la réponse de création. Les URLs de fichier sont valables 20 heures dans cette vue, contre 2 heures partout ailleurs.

StatutCorpsQuand
200 demande de document, vue détailléeappartient à votre organisation
404 {"error": "Record not found"}identifiant inconnu ou d'une autre organisation
403 {"error": "..."}clé d'API absente, inconnue, ou désactivée

Limites

LimiteValeurPortée
Taille du contenu rendu800 000 caractères par défaut, configurable par organisationmodèles custom et workflow ; fillable_form n'est jamais mesuré
Lignes de collection (workflow)200 par variable de collection, par génération
Nouvelles tentatives de livraison de webhookconfigurable par organisationvoir Webhooks

Il n'y a aucune limitation de débit sur cette API. Voir Environnements.