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.

De quoi un appel et sa réponse sont faits
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": "…"}

Toutes les clés qu'une description peut porter

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.

Toutes les réponses de cette adresse, par leur numéro
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

Voir les prix Voir les exemples