Clés d'API
Une clé d'API appartient à une organisation : elle ne voit que les templates de cette organisation, sans en-tête supplémentaire. Les clés sont gérées par les propriétaires et les administrateurs, dans Clés d'API.

Créer une clé
- Cliquez sur Nouvelle clé.
- Donnez un Nom qui identifie l'application (par exemple « ERP production »).
- Choisissez l'Accès :
- Rendu : lire les contrats et rendre des documents. C'est le bon choix pour une application.
- Publication : en plus, créer des templates, enregistrer des brouillons et publier, pour publier des templates depuis un dépôt de code (« templates as code »).
- Choisissez la Portée : la clé ne voit que les templates de ce dossier et de ses sous-dossiers ; Racine donne accès à toute l'organisation.
- Facultatif : Expire dans (jours) (vide : pas d'expiration).
- Facultatif, sous Limites : un débit propre (Requêtes au plus par fenêtre de (secondes)) et un Crédit de requêtes, éventuellement rechargé (Recharge de … tous les (jours)).
- Cliquez sur Créer.
Le secret de la clé (Votre clé d'API) s'affiche une seule fois : copiez-le aussitôt dans le coffre de secrets de votre application. Il ne sera plus jamais affiché ; en cas de perte, faites une rotation.
Rotation et révocation
- Rotation : une nouvelle clé est créée avec les mêmes réglages et l'ancienne cesse de fonctionner immédiatement. Mettez à jour l'application aussitôt.
- Révoquer : les applications qui utilisent la clé sont refusées immédiatement. C'est définitif.
La liste indique pour chaque clé sa Dernière utilisation et son Expiration.
Appeler l'API
- URL de base :
https://sculdoc.com/v1. - Authentification : en-tête
x-api-keyavec le secret de la clé. - Contrat complet de l'API (toutes les opérations, paramètres, réponses et erreurs) :
https://sculdoc.com/v1/openapi.json.
Rendre un document
curl https://sculdoc.com/v1/renders \
-H "x-api-key: $SCULDOC_API_KEY" \
-H 'content-type: application/json' \
-d '{"template":"facture-client","version":3,"data":{"customer":{"name":"Client Démo SARL"}}}' \
-o facture.pdf
| Champ | Rôle |
|---|---|
template |
Identifiant du template (par exemple facture-client). |
version |
Numéro de version à rendre ; latest désigne la version courante (voir ci-dessous). |
data |
Les données, vérifiées contre le contrat de la version. |
sample |
À la place de data : le nom d'un jeu d'exemple de la version, pour un essai. |
profile |
Facultatif : standard, archive ou accessible, à la place du profil du template. |
La réponse est le PDF. Avec l'en-tête Accept: application/json, elle décrit le rendu (identifiant, pages, manifeste) et donne un lien de téléchargement du document.
Le rendu synchrone est limité aux documents légers (10 secondes, 50 pages). Au-delà, ou pour de nombreux documents, utilisez les lots.
Lire le contrat d'une version
La documentation de chaque version, dans l'application, montre son contrat, ses jeux d'exemple et des exemples d'appels (onglets Contrat, Jeux d'exemple, Appels, Polices). Le JSON Schema est dans l'onglet Contrat de données de la page de la version.
SDK et CLI
Des clients existent pour TypeScript, Java, C# et Python. En TypeScript :
pnpm add @supscale/sculdoc-client
import { SculdocClient } from '@supscale/sculdoc-client';
const client = new SculdocClient({ baseUrl: 'https://sculdoc.com', apiKey: process.env.SCULDOC_API_KEY ?? '' });
const pdf = await client.render({ template: 'facture-client', version: 3, data });
Pour la production, générez plutôt le SDK d'une version avec la CLI sculdoc : il contient les types du contrat de la version épinglée et une fonction de rendu qui fixe template et version. Des données hors contrat deviennent alors une erreur de compilation.
sculdoc login --url https://sculdoc.com --key sk_…
sculdoc sdk generate --template facture-client@3 --lang ts --out sdk/ # ou java, csharp, python
La CLI sait aussi vérifier et publier des templates depuis un dépôt de code (« templates as code »), avec une clé d'accès Publication portée au dossier des templates ; une action GitHub (Supscale/sculdoc-publish-template) le fait sur chaque pull request et sur la branche principale.
Versions épinglées ou latest
Une version publiée ne change jamais : même numéro et mêmes données donnent le même document. latest désigne la plus haute version publiée et change à chaque publication.
- En production, indiquez toujours un numéro. Un appel par clé d'API qui demande
latest, ou n'indique pas de version, reçoit l'avertissementversion.latest(en-têtesx-sculdoc-warningetx-sculdoc-version-resolved). Une organisation peut interdire ces appels (erreur422 version.unpinned). - Monter de version : lisez le changelog et la comparaison des versions, en particulier les changements cassants du contrat, puis changez le numéro (et régénérez le SDK).
- Une version dépréciée reste rendable par son numéro ; une version archivée répond
410.
Lots et rendus asynchrones
Pour des documents lourds ou nombreux : POST /v1/jobs, avec 1 à 1 000 documents d'un même template (dans la limite fixée pour votre organisation). Chaque document est validé contre le contrat dès la soumission.
- Sortie : une archive ZIP (
zip), un PDF fusionné (merged) ou des documents séparés (separate). - Suivi : interrogez
GET /v1/jobs/{id}, ou indiquez uncallbackUrlpour être notifié à la fin (voir Webhooks). - Les jobs apparaissent dans Rendus, onglet Jobs, avec leur progression et leurs documents.
Idempotence
Ajoutez un en-tête Idempotency-Key (une valeur unique par opération) aux rendus et aux jobs. Pendant 24 heures, un nouvel envoi avec la même clé renvoie la première réponse au lieu de rendre à nouveau : vous pouvez réessayer sans risque après une coupure réseau. La même clé avec un autre contenu est refusée (409 idempotency.mismatch).
Erreurs
Toutes les erreurs ont la même forme : un code stable, un message, la liste des champs en cause (chemins JSON) et un identifiant de requête à citer au support.
{
"error": {
"code": "data.invalid",
"message": "data does not match the contract of facture-client v3",
"issues": [{ "path": "$.customer.name", "message": "required" }]
},
"requestId": "01JD…"
}
| Statut | Signification | Que faire |
|---|---|---|
| 400 | Requête mal formée | Corriger l'appel. |
| 401 | Clé absente, invalide ou révoquée | Vérifier la clé. |
| 403 | Action non permise à cette clé (clé de rendu qui publie, template hors de la portée de la clé) | Utiliser une clé adaptée. |
| 404 | Template, version, rendu ou job inconnu dans l'organisation de la clé | Vérifier l'identifiant et la portée. |
| 409 | Clé d'idempotence réutilisée avec un autre contenu, ou opération encore en cours | Changer de clé, ou réessayer plus tard. |
| 410 | Version archivée, ou document supprimé par la rétention | Appeler une autre version. |
| 422 | Données hors contrat (data.invalid) ou version non épinglée refusée |
Corriger les champs listés dans issues. |
| 429 | Limite de débit de la clé ou quota de l'organisation atteint | Attendre retryAfter secondes, puis réessayer. |
Réessayez après un 429, une erreur réseau ou une erreur 5xx, avec la même clé d'idempotence. Ne réessayez pas tel quel après un 400, 403, 404, 410 ou 422.