REST API · render sincroni · batch in background
L'API di compilazione PDF per chi va in produzione.
Carichi un PDF esistente, definisci una volta i campi compilabili, poi lo compili in modo programmatico. Un render singolo torna già pronto nella stessa richiesta; i batch da migliaia di righe girano in background e ti avvisano con un webhook firmato. Oltre la quota paghi solo i PDF in più. Dalla prova alla produzione in un pomeriggio.
API incluse da Pro in su: dopo la registrazione le provi per 15 giorni senza carta da Impostazioni → Piano, con una filigrana sui PDF e la quota del piano come limite fisso.
// Invia valori per un template esistente
POST /api/v1/compilations/
Authorization: Bearer pdf_•••
Content-Type: application/json
{
"template": "3f0e4b2a-21c2-4d34-9c8d-9b0a5d6b3f11",
"values": {
"full_name": "Giulia Rossi",
"effective_date": "2026-06-01",
"agrees_to_terms": true
}
} // Risposta — 201 Created, PDF pronto
HTTP/1.1 201 Created
{
"id": "c2a1...e9",
"status": "done",
"download_url": "https://…"
} - Una chiamata, un PDF
Il PDF è pronto quando arriva la risposta.
`POST /compilations/` renderizza dentro la richiesta e restituisce `status: done` con un `download_url` firmato. Nessuna coda da interrogare per un singolo documento. I valori che non si possono stampare nel loro campo vengono rifiutati con un `400` che indica il campo, senza consumare quota.
- Batch in background
5.000 righe in una chiamata.
Un batch gira in background: la chiamata risponde subito `202` con l'ID del batch. `succeeded`, `failed` ed `expected_total` sull'oggetto batch mostrano l'avanzamento reale, e `batch.completed` arriva al tuo webhook con il link al `result.zip`.
- Prezzo a consumo
Prezzo per PDF, senza crediti.
Ogni PDF renderizzato oltre la quota inclusa viene contato uno a uno e addebitato con il rinnovo successivo. Niente sistema proprietario a crediti: consumi e costo stimato del periodo sono in Impostazioni → Piano.
- Più cresci, meno paghi
L'overage per PDF cala a ogni tier.
Starter €0,03 / Pro €0,02 / Business €0,01 per PDF oltre quota. Curva trasparente scritta in listino. REST API, API key e webhook sono inclusi da Pro in su.
- Allegati
I documenti del cliente, nello stesso evento.
Gli eventi di completamento portano un array `attachments` con titolo, firmatario, nome del file, tipo, dimensione e SHA-256. Scarichi ogni file con la tua API key, oppure tutta la pratica con `GET /compilations/{id}/package/`: uno ZIP con il PDF e gli allegati.
- Consensi
Ogni consenso, con la prova.
Gli stessi eventi portano un array `consents`: testo mostrato, esito, data e ora, IP, browser e SHA-256 del documento collegato. `GET /consents/?compilation=` li elenca, `GET /compilations/{id}/package/` include anche i documenti collegati.
Renderizza un singolo PDF
curl -X POST 'https://api.datapdfengine.com/api/v1/compilations/' \
-H 'Authorization: Bearer pdf_...' \
-H 'Content-Type: application/json' \
-d '{
"template": "3f0e4b2a-21c2-4d34-9c8d-9b0a5d6b3f11",
"name": "NDA — Acme S.r.l.",
"values": {
"nome_completo": "Giulia Rossi",
"data_efficacia": "2026-06-01",
"accetta_condizioni": true,
"compenso_annuo": 12000
}
}' Invia un batch fino a 5.000 righe
curl -X POST 'https://api.datapdfengine.com/api/v1/batches/json/' \
-H 'Authorization: Bearer pdf_...' \
-H 'Content-Type: application/json' \
-d '{
"template": "3f0e4b2a-21c2-4d34-9c8d-9b0a5d6b3f11",
"rows": [
{ "nome_completo": "Giulia Rossi", "data_assunzione": "2025-09-01" },
{ "nome_completo": "Marco Bianchi", "data_assunzione": "2025-10-14" }
],
"completion_webhook_endpoint": "e9d8...c1"
}' Verifica la firma HMAC-SHA256
import crypto from "node:crypto";
// header: "t=<unix>,v1=<hex>"
export function verify(rawBody, header, secret, toleranceSec = 300) {
const parts = Object.fromEntries(
(header ?? "").split(",").map((part) => part.split("=", 2))
);
const t = Number(parts.t);
if (!parts.v1 || !Number.isInteger(t)) return false;
if (Math.abs(Date.now() / 1000 - t) > toleranceSec) return false;
const expected = crypto
.createHmac("sha256", secret)
.update(`${t}.`)
.update(rawBody)
.digest("hex");
const a = Buffer.from(parts.v1, "hex");
const b = Buffer.from(expected, "hex");
return a.length === b.length && crypto.timingSafeEqual(a, b);
} Vuoi ogni endpoint, payload e codice di errore?
La reference API completa vive su una pagina dedicata. Tienila aperta accanto all'editor.