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.
# 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.
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.
Aucune authentification necessaire. Utile pour monitorer la disponibilite.
curl https://docx.layerone.fr/__health
{
"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).
Consultez combien de requetes vous avez utilisees ce mois-ci et votre limite.
curl https://docx.layerone.fr/usage-stats \ -H "X-API-Key: VOTRE_CLE"
{
"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.
Enregistrez un template pour ne pas le renvoyer a chaque requete.
Vous recevez un template_id a reutiliser.
curl -X POST https://docx.layerone.fr/client/templates \ -H "X-API-Key: VOTRE_CLE" \ -F "template=@mon_template.docx"
{
"template_id": "abc123",
"name": "mon_template.docx",
"message": "Template enregistre avec succes"
}
Remplace le fichier d'un template existant par une nouvelle version.
curl -X PUT https://docx.layerone.fr/client/templates/abc123 \ -H "X-API-Key: VOTRE_CLE" \ -F "template=@nouveau_template.docx"
Telecharge le fichier Word d'un template enregistre.
curl https://docx.layerone.fr/client/templates/abc123 \ -H "X-API-Key: VOTRE_CLE" \ -o template.docx
Supprime definitivement un template enregistre.
curl -X DELETE https://docx.layerone.fr/client/templates/abc123 \ -H "X-API-Key: VOTRE_CLE"
Retourne la liste de tous vos templates enregistres.
curl https://docx.layerone.fr/client/templates \ -H "X-API-Key: VOTRE_CLE"
Envoyez un template Word + des donnees JSON. L'API remplace les variables et retourne le document.
| 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.
|
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.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();
En cas de succes (200), le corps de la reponse contient directement le fichier PDF ou DOCX.
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.
Parametres identiques a /render-document (template +
json_data). Le XML Factur-X est genere automatiquement.
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.
Un template est un fichier Word (.docx) classique avec des variables entre doubles accolades. L'API les remplace par vos donnees.
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"
}
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" } } }
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.
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.
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.
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"
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 |
Par defaut, les photos s'empilent verticalement :
# Dans le template Word {% for p in photos %} {{ p.image | photo(120) }} {% endfor %}
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"}]
]
}
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 %}
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"}'
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 |
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."}