DocX API

Generez des documents PDF et DOCX a partir de templates Word. Envoyez un fichier Word avec des variables, ajoutez vos donnees en JSON, recevez le document final.

URL https://docx.layerone.fr
Auth Cle API dans le header
Format multipart/form-data

En 3 etapes

  1. Creez un compte gratuitInscrivez-vous sur dev.layerone.fr — 20 requetes/mois incluses.
  2. Recuperez votre cle APIDans la console, cliquez "Nouvelle cle" et choisissez DocX.
  3. Generez votre premier PDFCopiez la commande ci-dessous et lancez-la dans votre terminal.
# Remplacez VOTRE_CLE par la cle obtenue a l'etape 2
curl -X POST https://docx.layerone.fr/render-document \
  -H "X-API-Key: VOTRE_CLE" \
  -F "template=@mon_template.docx" \
  -F 'json_data={"client": "Acme Corp", "montant": "1 500 EUR"}' \
  -o resultat.pdf

Si tout fonctionne, vous obtenez un fichier resultat.pdf avec vos donnees injectees.

Authentification

Ajoutez votre cle API dans le header X-API-Key de chaque requete :

X-API-Key: votre_cle_api

Ne partagez jamais votre cle. Ne la mettez pas dans du code frontend (site web, app mobile). Utilisez-la uniquement depuis votre serveur.

Endpoints

GET /__health Verifier que le service fonctionne

Aucune authentification necessaire. Utile pour monitorer la disponibilite.

GEThttps://docx.layerone.fr/__health
Exemple complet
curl https://docx.layerone.fr/__health
Reponse
{
  "status": "ok",
  "time": "2026-04-13T12:00:00Z",
  "storage": { "templates_writable": true },
  "libreoffice": { "binary_found": true }
}

Ajoutez ?deep=true pour un diagnostic complet (base de donnees, espace disque).

GET /usage-stats Voir votre quota

Consultez combien de requetes vous avez utilisees ce mois-ci et votre limite.

GEThttps://docx.layerone.fr/usage-stats
X-API-Key: VOTRE_CLE
Exemple complet
curl https://docx.layerone.fr/usage-stats \
  -H "X-API-Key: VOTRE_CLE"
Reponse
{
  "requests_today": 12,
  "requests_this_month": 247,
  "quota_limit": 1000,
  "active_keys": 2
}

Le quota se reinitialise le 1er de chaque mois. Quand vous atteignez la limite, les requetes retournent une erreur 403.

POST /client/templates Enregistrer un template

Enregistrez un template pour ne pas le renvoyer a chaque requete. Vous recevez un template_id a reutiliser.

POSThttps://docx.layerone.fr/client/templates
X-API-Key: VOTRE_CLE
Exemple complet
curl -X POST https://docx.layerone.fr/client/templates \
  -H "X-API-Key: VOTRE_CLE" \
  -F "template=@mon_template.docx"
Reponse
{
  "template_id": "abc123",
  "name": "mon_template.docx",
  "message": "Template enregistre avec succes"
}
PUT /client/templates/{id} Remplacer un template

Remplace le fichier d'un template existant par une nouvelle version.

PUThttps://docx.layerone.fr/client/templates/{id}
X-API-Key: VOTRE_CLE
Exemple complet
curl -X PUT https://docx.layerone.fr/client/templates/abc123 \
  -H "X-API-Key: VOTRE_CLE" \
  -F "template=@nouveau_template.docx"
GET /client/templates/{id} Telecharger un template

Telecharge le fichier Word d'un template enregistre.

GEThttps://docx.layerone.fr/client/templates/{id}
X-API-Key: VOTRE_CLE
Exemple complet
curl https://docx.layerone.fr/client/templates/abc123 \
  -H "X-API-Key: VOTRE_CLE" \
  -o template.docx
DELETE /client/templates/{id} Supprimer un template

Supprime definitivement un template enregistre.

DELETEhttps://docx.layerone.fr/client/templates/{id}
X-API-Key: VOTRE_CLE
Exemple complet
curl -X DELETE https://docx.layerone.fr/client/templates/abc123 \
  -H "X-API-Key: VOTRE_CLE"
GET /client/templates Lister vos templates

Retourne la liste de tous vos templates enregistres.

GEThttps://docx.layerone.fr/client/templates
X-API-Key: VOTRE_CLE
Exemple complet
curl https://docx.layerone.fr/client/templates \
  -H "X-API-Key: VOTRE_CLE"
POST /render-document Generer un PDF ou DOCX

Envoyez un template Word + des donnees JSON. L'API remplace les variables et retourne le document.

POSThttps://docx.layerone.fr/render-document
X-API-Key: VOTRE_CLE

Parametres

Nom Type Description
template * fichier Votre fichier Word (.docx) avec des variables {{...}}
template_id opt. texte Ou bien l'ID d'un template deja enregistre (remplace template)
json_data * JSON Les donnees a injecter. Ex: {"client": "Acme"}
output_format opt. texte pdf (par defaut) ou docx
output_filename opt. texte Nom du fichier retourne. Ex: devis_001.pdf
json_data_base64 opt. texte Alternative a json_data — transmettez vos donnees JSON encodees en base64. Utile lorsque le JSON contient des caracteres speciaux.
document_type opt. texte Type de document pour filtrer le template.
detect_yousign opt. booleen Si true, detecte les champs de signature YouSign dans le PDF genere. Par defaut : false.
return_signature_fields opt. booleen Si true, retourne les positions des champs de signature detectes dans la reponse. Par defaut : false.
Format de reponse dual :
• Si detect_yousign ou return_signature_fields est true ET que des champs sont trouves : retourne un JSON contenant pdf_base64 et yousign_fields ou signature_fields.
• Sinon : retourne directement le fichier binaire PDF ou DOCX.
Exemple complet
cURL
Python
JavaScript
curl -X POST https://docx.layerone.fr/render-document \
  -H "X-API-Key: VOTRE_CLE" \
  -F "template=@devis_template.docx" \
  -F 'json_data={
    "client": "Acme Corp",
    "adresse": "12 rue de Paris, 75001",
    "lignes": [
      {"description": "Prestation A", "prix": "500 EUR"},
      {"description": "Prestation B", "prix": "1 000 EUR"}
    ],
    "total": "1 500 EUR"
  }' \
  -o devis.pdf
import requests, json

response = requests.post(
    "https://docx.layerone.fr/render-document",
    headers={"X-API-Key": "VOTRE_CLE"},
    files={"template": open("devis_template.docx", "rb")},
    data={"json_data": json.dumps({
        "client": "Acme Corp",
        "total": "1 500 EUR"
    })}
)

with open("devis.pdf", "wb") as f:
    f.write(response.content)
const form = new FormData();
form.append("template", fichierWord);
form.append("json_data", JSON.stringify({
  client: "Acme Corp",
  total: "1 500 EUR"
}));

const res = await fetch("https://docx.layerone.fr/render-document", {
  method: "POST",
  headers: { "X-API-Key": "VOTRE_CLE" },
  body: form
});

const pdf = await res.blob();
Reponse

En cas de succes (200), le corps de la reponse contient directement le fichier PDF ou DOCX.

POST /render-facturx Generer une facture Factur-X

Comme /render-document, mais produit un PDF conforme a la norme Factur-X (PDF/A-3 + XML). Obligatoire pour la facturation electronique B2B en France.

POSThttps://docx.layerone.fr/render-facturx
X-API-Key: VOTRE_CLE

Parametres identiques a /render-document (template + json_data). Le XML Factur-X est genere automatiquement.

Exemple complet
curl -X POST https://docx.layerone.fr/render-facturx \
  -H "X-API-Key: VOTRE_CLE" \
  -F "template=@facture_template.docx" \
  -F 'json_data={
    "numero_facture": "FA-2024-001",
    "date_facture": "2024-03-15",
    "client": "Acme Corp",
    "siret_client": "12345678901234",
    "montant_ht": "1250.00",
    "tva": "250.00",
    "montant_ttc": "1500.00"
  }' \
  -o facture.pdf

Le PDF est valide VeraPDF (PDF/A-3) et accepte par les plateformes comme Chorus Pro.

Comment creer un template

Un template est un fichier Word (.docx) classique avec des variables entre doubles accolades. L'API les remplace par vos donnees.

Exemple simple

Dans votre fichier Word, ecrivez :

Bonjour {{client}},

Veuillez trouver ci-joint votre devis d'un montant de {{total}}.

Date : {{date}}
Reference : {{reference}}

Et envoyez ce JSON :

{
  "client": "Acme Corp",
  "total": "1 500 EUR",
  "date": "15/03/2024",
  "reference": "DEV-2024-001"
}

Variables imbriquees

Vous pouvez utiliser la notation a points pour acceder a des sous-objets :

# Dans le Word
Client : {{client.nom}}
Ville : {{client.adresse.ville}}

# Dans le JSON
{
  "client": {
    "nom": "Acme Corp",
    "adresse": { "ville": "Paris" }
  }
}

Tableaux (lignes repetees)

Pour generer plusieurs lignes (ex: lignes de devis), mettez les variables dans un tableau Word :

# Ligne du tableau Word
{{lignes.description}}  |  {{lignes.prix}}

# JSON
{
  "lignes": [
    {"description": "Prestation A", "prix": "500 EUR"},
    {"description": "Prestation B", "prix": "1 000 EUR"}
  ]
}

L'API dupliquera automatiquement la ligne pour chaque element du tableau.

Enregistrer un template

Plutot que de renvoyer le fichier Word a chaque fois, enregistrez-le une fois avec POST /client/templates et reutilisez son template_id dans vos appels.

Images et photos

Vous pouvez inserer des images dynamiques dans vos templates grace au filtre photo(). Les images sont envoyees en fichiers joints (multipart) et inserees a la taille souhaitee.

Envoyer des images

Ajoutez vos images comme fichiers multipart dans la requete, avec des noms comme photo_0, photo_1, etc. Dans le JSON, referencez-les par leur nom :

curl -X POST https://docx.layerone.fr/render-document \
  -H "X-API-Key: votre_cle" \
  -F "template_id=abc123" \
  -F 'json_data={"photos": [{"image": "photo_0"}, {"image": "photo_1"}]}' \
  -F "photo_0=@photo1.jpg" \
  -F "photo_1=@photo2.jpg" \
  -F "output_format=pdf"

Le filtre photo()

Dans votre template Word, utilisez le filtre photo() pour inserer et redimensionner les images :

Dans le template Resultat
{{ image | photo(120) }} Image a 120 mm de large (hauteur auto)
{{ image | photo(80, 60) }} Image a 80 × 60 mm (largeur × hauteur)
{{ image | photo }} Taille par defaut (80 mm de large)
{{ image | photo(160) }} Pleine largeur A4 (~160 mm)
{{ image | photo(40) }} Miniature 40 mm

Mise en page : photos empilees

Par defaut, les photos s'empilent verticalement :

# Dans le template Word
{% for p in photos %}
{{ p.image | photo(120) }}
{% endfor %}

Mise en page : grille 2 colonnes

Pour afficher les photos cote a cote, inserez un tableau Word a 2 colonnes dans votre template et placez les tags dans les cellules :

# Tableau Word avec 2 cellules par ligne
| {{ row.0.image | photo(75) }} | {{ row.1.image | photo(75) }} |

Envoyez les photos regroupees par lignes de 2 dans le JSON :

{
  "rows": [
    [{"image": "photo_0"}, {"image": "photo_1"}],
    [{"image": "photo_2"}, {"image": "photo_3"}]
  ]
}

Tailles differentes par type

Vous pouvez utiliser des tailles differentes pour chaque image. Exemple : photo panoramique large + photos detail petites :

# Photo panoramique
{{ panorama.image | photo(160) }}

# Photos detail
{% for p in details %}
{{ p.image | photo(60) }}
{% endfor %}

Signatures

Les signatures fonctionnent de la meme maniere. Envoyez-les comme fichiers multipart et utilisez le filtre photo() :

# Dans le template
Signature : {{ signature | photo(50) }}

# curl
-F "signature=@signature.png"
-F 'json_data={"signature": "signature"}'

Filtres disponibles

Les filtres transforment vos donnees dans le template. Syntaxe : {{ valeur | filtre }}

Filtre Usage Resultat
photo(l) / photo(l, h) {{ img | photo(80) }} Insere une image (l mm × h mm)
maj {{ nom | maj }} MAJUSCULES
min {{ nom | min }} minuscules
cap {{ nom | cap }} Premiere lettre en majuscule
titre {{ nom | titre }} Chaque Mot En Majuscule
euro {{ montant | euro }} 1 500,00 €
suffix("...") {{ val | suffix(" kg") }} Ajoute un suffixe
prefix("...") {{ val | prefix("N° ") }} Ajoute un prefixe

Codes d'erreur

En cas d'erreur, la reponse contient un champ detail qui explique le probleme.

Code Signification Que faire ?
200 Tout va bien Vous recevez le fichier.
400 Requete invalide Verifiez les parametres envoyes.
401 Cle API manquante ou invalide Verifiez le header X-API-Key.
403 Acces refuse ou quota depasse Verifiez votre quota avec /usage-stats.
404 Endpoint ou ressource introuvable Verifiez l'URL.
422 Donnees invalides JSON mal forme ou fichier manquant.
429 Trop de requetes Attendez quelques secondes.
500 Erreur serveur Reessayez. Si ca persiste, contactez le support.
# Exemple d'erreur
{"detail": "Quota mensuel depasse. Passez au plan superieur."}