Bon Retour

Connectez-vous pour accéder à vos documents et signatures

ou continuer avec l'email
Mot de passe oublié ?
API v1 · Stable

API développeur WHAT A PDF!

Traitez vos PDF à grande échelle depuis votre application. Compressez, fusionnez, divisez et appliquez l'OCR via une interface REST claire avec authentification par jeton Bearer et limites de débit par plan.

Démarrage rapide

Trois étapes vers votre premier appel API.

  1. Créez une clé API depuis Compte › Clés API
  2. Envoyez un POST multipart/form-data vers l'un des endpoints v1 avec un en-tête Authorization: Bearer.
  3. Inspectez la réponse JSON — les appels réussis renvoient une URL de téléchargement signée valable 15 minutes.

URL de base

https://whatapdf.com/api/v1

Authentification

Chaque requête doit inclure un en-tête Authorization contenant votre clé API sous forme de jeton Bearer.

Authorization: Bearer pdn_live_a1b2c3d4e5f6...
Gardez vos clés de production secrètes. Traitez-les comme des mots de passe. Ne les versionnez jamais et ne les exposez pas dans du code côté client.

Formats de clé

  • pdn_live_<32 hex> — Clé de production. Compte dans la limite de débit de votre plan.
  • pdn_test_<32 hex> — Clé de test. Même limite ; utile pour distinguer les environnements dans les logs.

Limites de débit

Les limites de débit sont calculées par utilisateur, sur une fenêtre glissante d'une heure. Chaque réponse inclut des en-têtes X-RateLimit-* pour planifier vos relances.

PlanRequêtes / heure
Free10
Premium1,000
Business5,000
EnterpriseIllimité

En-têtes de réponse

  • X-RateLimit-Limit — Le plafond horaire de votre plan.
  • X-RateLimit-Remaining — Appels restants dans la fenêtre actuelle.
  • X-RateLimit-Reset — Horodatage Unix de la réinitialisation de la fenêtre.
  • Retry-After — Secondes à attendre, envoyé uniquement sur les réponses 429.

Erreurs

Toutes les erreurs sont retournées en JSON avec un code stable et un message lisible.

{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded for your plan (free: 10/hour)."
  },
  "meta": { "request_id": "8f9a2b3c1d4e5f6a" }
}

Codes d'erreur

CodeHTTPSignification
unauthorized401Clé API manquante, malformée ou révoquée.
rate_limited429Limite de débit horaire dépassée pour votre plan.
invalid_input400Le corps de la requête ou les paramètres ont échoué à la validation.
payload_too_large413Le fichier ou la charge utile combinée dépasse la limite de taille de votre plan.
internal_error500Erreur inattendue du serveur. Réessayez avec une attente progressive.

POST /compress

Compresse un PDF avec Ghostscript lorsqu'il est disponible, avec une solution de repli FPDI. Renvoie une URL de téléchargement signée.

POSThttps://whatapdf.com/api/v1/compress

Paramètres (multipart/form-data)

NomTypeDescription
file *fileFichier PDF à compresser.
levelstringPréréglage de compression. low, medium, high

Exemples de code

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);

Exemple de réponse

{
  "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

Fusionne de 2 à 20 PDF en un seul document, dans l'ordre de téléversement.

POSThttps://whatapdf.com/api/v1/merge

Paramètres

NomTypeDescription
files[] *file[]Deux fichiers PDF ou plus (tableau multipart).

Exemples de code

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

Divise un PDF en une ou plusieurs parties par plages de pages. Chaque partie est renvoyée avec sa propre URL de téléchargement signée.

POSThttps://whatapdf.com/api/v1/split

Paramètres

NomTypeDescription
file *filePDF source.
ranges *stringPlages de pages séparées par des virgules. Une plage = une partie de sortie. e.g. 1-3,5,7-9

Exemples de code

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

Extrait le texte d'une image à l'aide de Tesseract OCR. Compatible avec plus de 20 langues.

POSThttps://whatapdf.com/api/v1/ocr

Paramètres

NomTypeDescription
image *fileImage à océriser (PNG, JPEG, TIFF, WebP ou BMP).
languagestringCode de langue Tesseract. Par défaut eng

Exemples de code

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);
WHAT A PDF! pour Gmail - Extension Chrome

Ouvrez les pièces jointes PDF de Gmail directement dans WHAT A PDF!. Modifiez, signez et convertissez vos PDF instantanément !

Installer l'extension gratuite

Wait — don't miss out!

Subscribe for free PDF tips, new tools, and feature updates delivered to your inbox.

No spam ever. Unsubscribe anytime.