Avvio rapido
Tre passi alla tua prima chiamata API.
- Crea una chiave API da Account › Chiavi API
- Invia un POST multipart/form-data a uno degli endpoint v1 con un'intestazione Authorization: Bearer.
- Ispeziona la risposta JSON — le chiamate riuscite restituiscono un URL di download firmato valido per 15 minuti.
URL di base
Autenticazione
Ogni richiesta deve includere un'intestazione Authorization con la tua chiave API come token Bearer.
Authorization: Bearer pdn_live_a1b2c3d4e5f6...Formati delle chiavi
pdn_live_<32 hex>— Chiave di produzione. Conta nel limite di velocità del tuo piano.pdn_test_<32 hex>— Chiave di test. Stesso limite di velocità; utile per distinguere gli ambienti nei log.
Limiti di velocità
I limiti di velocità sono calcolati per utente, in una finestra mobile di 1 ora. Ogni risposta include intestazioni X-RateLimit-* per pianificare i tuoi tentativi.
| Piano | Richieste / ora |
|---|---|
| Free | 10 |
| Premium | 1,000 |
| Business | 5,000 |
| Enterprise | Illimitato |
Intestazioni di risposta
X-RateLimit-Limit— Il limite orario del tuo piano.X-RateLimit-Remaining— Chiamate rimanenti nella finestra attuale.X-RateLimit-Reset— Timestamp Unix quando la finestra si reimposta.Retry-After— Secondi di attesa, inviato solo nelle risposte 429.
Errori
Tutti gli errori sono restituiti come JSON con un codice stabile e un messaggio leggibile.
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded for your plan (free: 10/hour)."
},
"meta": { "request_id": "8f9a2b3c1d4e5f6a" }
}Codici di errore
| Code | HTTP | Significato |
|---|---|---|
unauthorized | 401 | Chiave API mancante, malformata o revocata. |
rate_limited | 429 | Limite di velocità orario superato per il tuo piano. |
invalid_input | 400 | Il corpo della richiesta o i parametri non hanno superato la validazione. |
payload_too_large | 413 | Il file o il carico combinato supera il limite di dimensione del tuo piano. |
internal_error | 500 | Errore imprevisto del server. È sicuro riprovare con backoff. |
POST /compress
Comprime un PDF usando Ghostscript quando disponibile, con FPDI come fallback. Restituisce un URL di download firmato.
Parametri (multipart/form-data)
| Nome | Tipo | Descrizione |
|---|---|---|
| file * | file | File PDF da comprimere. |
| level | string | Preset di compressione. low, medium, high |
Esempi di codice
curl -X POST https://whatapdf.com/api/v1/compress \
-H "Authorization: Bearer pdn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-F "[email protected]" \
-F "level=medium"const form = new FormData();
form.append('file', fileInput.files[0]);
form.append('level', 'medium');
const res = await fetch('https://whatapdf.com/api/v1/compress', {
method: 'POST',
headers: { 'Authorization': 'Bearer pdn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' },
body: form,
});
const json = await res.json();
console.log(json.data.download.url);import requests
with open('input.pdf', 'rb') as f:
r = requests.post(
'https://whatapdf.com/api/v1/compress',
headers={'Authorization': 'Bearer pdn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'},
files={'file': f},
data={'level': 'medium'},
)
print(r.json())<?php
$ch = curl_init('https://whatapdf.com/api/v1/compress');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer pdn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'],
CURLOPT_POSTFIELDS => [
'file' => new CURLFile('input.pdf', 'application/pdf'),
'level' => 'medium',
],
]);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($res);Esempio di risposta
{
"data": {
"filename": "report_compressed.pdf",
"original_size": 5242880,
"compressed_size": 2621440,
"savings_percent": 50.0,
"method": "ghostscript",
"download": {
"url": "/api/get-pdf.php?file=...&exp=...&sig=...",
"expires_in": 900
}
},
"meta": { "request_id": "8f9a2b3c1d4e5f6a" }
}POST /merge
Unisce da 2 a 20 PDF in un unico documento, nell'ordine di caricamento.
Parametri
| Nome | Tipo | Descrizione |
|---|---|---|
| files[] * | file[] | Due o più file PDF (array multipart). |
Esempi di codice
curl -X POST https://whatapdf.com/api/v1/merge \
-H "Authorization: Bearer pdn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-F "files[][email protected]" \
-F "files[][email protected]" \
-F "files[][email protected]"const form = new FormData();
for (const f of fileInput.files) form.append('files[]', f);
const res = await fetch('https://whatapdf.com/api/v1/merge', {
method: 'POST',
headers: { 'Authorization': 'Bearer pdn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' },
body: form,
});
console.log(await res.json());import requests
files = [
('files[]', open('a.pdf', 'rb')),
('files[]', open('b.pdf', 'rb')),
('files[]', open('c.pdf', 'rb')),
]
r = requests.post(
'https://whatapdf.com/api/v1/merge',
headers={'Authorization': 'Bearer pdn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'},
files=files,
)
print(r.json())<?php
$ch = curl_init('https://whatapdf.com/api/v1/merge');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer pdn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'],
CURLOPT_POSTFIELDS => [
'files[0]' => new CURLFile('a.pdf', 'application/pdf'),
'files[1]' => new CURLFile('b.pdf', 'application/pdf'),
'files[2]' => new CURLFile('c.pdf', 'application/pdf'),
],
]);
echo curl_exec($ch);
curl_close($ch);POST /split
Divide un PDF in una o più parti per intervalli di pagine. Ogni parte è restituita con il proprio URL di download firmato.
Parametri
| Nome | Tipo | Descrizione |
|---|---|---|
| file * | file | PDF di origine. |
| ranges * | string | Intervalli di pagine separati da virgole. Un intervallo = una parte in uscita. e.g. 1-3,5,7-9 |
Esempi di codice
curl -X POST https://whatapdf.com/api/v1/split \
-H "Authorization: Bearer pdn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-F "[email protected]" \
-F "ranges=1-3,5,7-9"const form = new FormData();
form.append('file', fileInput.files[0]);
form.append('ranges', '1-3,5,7-9');
const res = await fetch('https://whatapdf.com/api/v1/split', {
method: 'POST',
headers: { 'Authorization': 'Bearer pdn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' },
body: form,
});
console.log(await res.json());import requests
with open('input.pdf', 'rb') as f:
r = requests.post(
'https://whatapdf.com/api/v1/split',
headers={'Authorization': 'Bearer pdn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'},
files={'file': f},
data={'ranges': '1-3,5,7-9'},
)
for part in r.json()['data']['parts']:
print(part['pages'], part['download']['url'])<?php
$ch = curl_init('https://whatapdf.com/api/v1/split');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer pdn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'],
CURLOPT_POSTFIELDS => [
'file' => new CURLFile('input.pdf', 'application/pdf'),
'ranges' => '1-3,5,7-9',
],
]);
print_r(json_decode(curl_exec($ch), true));
curl_close($ch);POST /ocr
Estrae testo da un'immagine usando Tesseract OCR. Supporta più di 20 lingue.
Parametri
| Nome | Tipo | Descrizione |
|---|---|---|
| image * | file | Immagine per OCR (PNG, JPEG, TIFF, WebP o BMP). |
| language | string | Codice lingua di Tesseract. Predefinito eng |
Esempi di codice
curl -X POST https://whatapdf.com/api/v1/ocr \
-H "Authorization: Bearer pdn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-F "[email protected]" \
-F "language=eng"const form = new FormData();
form.append('image', imageInput.files[0]);
form.append('language', 'eng');
const res = await fetch('https://whatapdf.com/api/v1/ocr', {
method: 'POST',
headers: { 'Authorization': 'Bearer pdn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' },
body: form,
});
const { data } = await res.json();
console.log(data.text);import requests
with open('scan.png', 'rb') as f:
r = requests.post(
'https://whatapdf.com/api/v1/ocr',
headers={'Authorization': 'Bearer pdn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'},
files={'image': f},
data={'language': 'eng'},
)
print(r.json()['data']['text'])<?php
$ch = curl_init('https://whatapdf.com/api/v1/ocr');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer pdn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'],
CURLOPT_POSTFIELDS => [
'image' => new CURLFile('scan.png', 'image/png'),
'language' => 'eng',
],
]);
$res = json_decode(curl_exec($ch), true);
echo $res['data']['text'];
curl_close($ch);