Документация

PDF одним POST-запросом

Полный референс на английском — /docs/, спецификация — OpenAPI 3.1. Ниже — короткая версия на русском.

Быстрый старт

Создайте бесплатный аккаунт, подтвердите email — ключ появится в кабинете. Затем:

curl -X POST https://pdfgeny.com/api/v1/render \
  -H "Authorization: Bearer $PDFGENY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"html":"<h1>Счёт № 14</h1>"}' --output invoice.pdf

POST /api/v1/render

Ровно одно из полей: html (до 2 МБ), url (публичный http(s)) или template + data. Ответ — сам PDF, либо JSON со ссылкой при "response":"json".

ПолеПо умолчаниюОписание
formatA4A3, A4, A5, Letter, Legal, Tabloid
landscapefalseальбомная ориентация
margin12mmодно значение или объект top/right/bottom/left
header_html, footer_htmlколонтитулы; и подставляются
wait_forCSS-селектор или миллисекунды (до 15000) — для графиков
enginechromiumweasy — WeasyPrint для табличных документов
pdfafalseконвертация в PDF/A-2b
store, responsefalse, binaryсохранить на 7 дней и вернуть JSON с подписанной ссылкой

Асинхронно и пакетами

POST /api/v1/jobs — то же тело плюс webhook_url; ответ 202 с id, статус — GET /api/v1/jobs/{id}. POST /api/v1/batch — до 100 документов за раз, прогресс — GET /api/v1/batch/{id}. Вебхук подписан заголовком X-PDFGeny-Signature: sha256=HMAC(secret, body); секрет — в кабинете.

Python

import requests
r = requests.post("https://pdfgeny.com/api/v1/render",
    headers={"Authorization": f"Bearer {KEY}"},
    json={"template": "invoice", "data": {"client": "ООО Ромашка", "total": "12 400"}}, timeout=60)
open("invoice.pdf", "wb").write(r.content)

Ошибки и лимиты

Единый формат {"error":{"code":"…","message":"…"}}. Коды: missing_api_key, invalid_api_key, invalid_input, payload_too_large, quota_exceeded, rate_limited, too_many_concurrent, render_failed. Лимиты: Free 1 запрос/с и 1 параллельный рендер; Starter 5 и 3; Growth 10 и 5; Scale 20 и 10.