L'adresse à laquelle votre programme envoie
Votre programme envoie la description d'un document à une adresse, sous la clé de son compte, et le PDF fini revient dans la réponse.
L'appel
Une adresse répond, elle répond à un POST, et le corps est la description du document voulu. La clé de votre compte voyage dans l'en-tête habituel.
Ce qu'une description peut contenir — la page, les éléments dessinés dessus, les polices, la norme à laquelle elle est écrite — c'est toute la section API, et rien n'en est répété ici.
| L'appel qui dessine un document | POST https://hqf-pdf.com/api/v1/render |
|---|---|
| La forme dans laquelle le corps est envoyé | application/json |
| Ce que porte le corps | la description d'un document, et rien d'autre |
| Comment la clé voyage | Authorization: Bearer <key> |
| Ce que porte un succès | 200 application/pdf |
| Le nom sous lequel le fichier est proposé | Content-Disposition: attachment; filename="document.pdf" |
| Ce que porte un refus | application/json {"error": "…"} |
Ce qui voyage, et ce qui ne voyage pas
Cette adresse porte la description seule. Aucun fichier ne voyage à côté : un document dessiné ici dessine avec les polices que détient le service, et avec rien de ce qui serait envoyé avec l'appel.
Un serveur PDF qui tourne sur une machine à vous prend des fichiers à côté de la description, chacun sous la forme d'une partie nommée du corps. C'est un autre appel, écrit sur la page d'accueil de la section.
Le même appel, deux fois
Depuis un terminal
Le corps est la description elle-même. La réponse est le PDF : écrivez-la directement dans un fichier.
curl -X POST https://hqf-pdf.com/api/v1/render \
-H "Authorization: Bearer $HQF_PDF_KEY" \
-H "Content-Type: application/json" \
--data-binary @invoice.json \
-o invoice.pdf
Depuis Python
Un refus arrive en JSON, portant une phrase, et le code dit si la demande vaut d'être renvoyée.
import json
import pathlib
import requests
description = {
"standard_fonts": [{"name": "sans", "face": "helvetica"}],
"items": [
{
"type": "text",
"rect": {"llx": 56, "lly": 700, "urx": "{page_width} - 56", "ury": 780},
"content": ["Invoice 2026-014"],
"font": "sans",
"font_size": 24,
}
],
}
answer = requests.post(
"https://hqf-pdf.com/api/v1/render",
headers={"Authorization": f"Bearer {KEY}"},
json=description,
timeout=120,
)
if answer.status_code != 200:
raise SystemExit(answer.json()["error"])
pathlib.Path("invoice.pdf").write_bytes(answer.content)
Toutes les réponses, et quoi faire de chacune
Un refus est du JSON portant une phrase. C'est le code qui dit à un programme si la demande vaut d'être renvoyée : une seule le vaut, celle qui dit que le serveur de rendu n'a jamais été joint.
| Réponse | Ce que cela veut dire | Quoi faire |
|---|---|---|
200 |
Le PDF est le corps, remis au fur et à mesure qu'il est dessiné, sous le nom de fichier que nomme l'en-tête ci-dessus. | Rien à faire. |
400 |
Soit ce qui a été envoyé n'est pas du JSON du tout, soit le serveur de rendu a lu la description et l'a refusée. La phrase dit lequel des deux, et ce qu'il a trouvé. | Corrigez la description. La même envoyée deux fois donne la même réponse. |
401 |
L'appel ne portait pas de clé, ou une clé que plus personne ne détient. | Présentez une clé vivante du compte. |
402 |
Soit les documents du mois sont tous consommés, soit le dessin demandait quelque chose que couvre une clé de licence et le compte n'en a pas. La phrase dit lequel des deux. | Attendez le changement de mois, ou passez à une offre supérieure. |
405 |
L'adresse a été demandée autrement que par un POST. | Envoyez la description. La même adresse ouverte dans un navigateur montre une page. |
413 |
Le corps de la demande, ou le document demandé, dépasse un plafond. La phrase nomme la taille ou le plafond. | Demandez moins en un seul appel. |
500 |
L'écriture du PDF n'a pas abouti, du côté du serveur de rendu. | Vaut un appel de plus. Dites-le-nous si cela se répète. |
503 |
Le serveur de rendu n'a pas pu être joint du tout, ou ce site ne sait pas où il se trouve. Rien n'a été lu de la description. | La seule réponse pour laquelle il vaut la peine de renvoyer la même demande. |
Ce que coûte un appel
- Un document est retiré du mois avant que la description ne soit transmise.
- Un rendu qui n'arrive jamais rend son document : un appel auquel il est répondu 503 ne coûte rien.
- Un appel refusé avant tout transfert — pas de clé, un corps qui n'est pas du JSON, un mois qui n'a plus rien — ne coûte rien non plus.
- Les pages inscrites sont celles qu'annonce le serveur de rendu, et rien ici n'ouvre le document pour les compter une seconde fois.
L'essayer à la main
La même adresse ouverte dans un navigateur montre une zone de saisie : collez-y une description et le document revient sur-le-champ. Elle dessine pour qui est connecté, sur la session plutôt que sur une clé, et elle ne compte rien.
C'est la même adresse, la même description et le même serveur de rendu : ce que vous essayez à la main est ce que votre programme enverra.
Où aller ensuite
Le format d'une description Vos clés et ce qui reste de votre mois Ce que devient un document que vous envoyez