Documentation de l’API REST
API REST conv2pdf : convertissez, fusionnez, découpez, compressez, protégez et numérotez vos PDF depuis votre application — 14 outils exposés via 5 endpoints REST. Hébergement en France, RGPD respecté. Aucun service américain n’intervient dans le processus.
Démarrage rapide
- Créez un compte (gratuit, magic link par email)
- Depuis votre tableau de bord, créez une clé API (plan Dev gratuit, 300 conversions/mois pour démarrer)
- Authentifiez vos appels avec l’en-tête
Authorization: Bearer cpdf_live_…
Base URL
https://api.conv2pdf.com/v1
SDK, OpenAPI & Postman
- SDK PHP officiel :
composer require conv2pdf/php(repo et exemples). - Spécification OpenAPI 3.0 (JSON) — pour générer un client dans un autre langage, l'importer dans un outil (Swagger, Insomnia…) ou alimenter un agent.
- Collection Postman — importez-la, renseignez votre clé, convertissez un PDF en une minute.
Authentification
Chaque requête doit inclure l’en-tête HTTP Authorization: Bearer <votre_clé>. Une clé révoquée ou inexistante renvoie un code 401. Un quota dépassé renvoie 429 avec les détails de réinitialisation.
Endpoints
GET /v1/tools
Renvoie la liste des outils disponibles, leurs limites et formats acceptés.
curl https://api.conv2pdf.com/v1/tools \
-H "Authorization: Bearer cpdf_live_..."
POST /v1/convert/:tool
Effectue une conversion. Les fichiers sont envoyés en multipart/form-data.
14 outils disponibles. La liste machine à jour (formats acceptés, bornes de fichiers) est renvoyée par GET /v1/tools.
Outil (:tool) | Entrée | Fichiers | Sortie |
|---|---|---|---|
image-to-pdf | PNG, JPG, WEBP, GIF, TIFF | 1 | |
heic-to-jpg | HEIC, HEIF | 1 | JPG |
heic-to-pdf | HEIC, HEIF | 1 | |
office-to-pdf | DOC(X/M), ODT, RTF, TXT, XLS(X/M), ODS, CSV, PPT(X/M), ODP | 1 | |
pdf-to-word | 1 | DOCX | |
pdf-to-image | 1 | ZIP (1 image/page) | |
merge-pdf | 2 à 20 | ||
split-pdf | 1 | ||
compress-pdf | 1 | ||
rotate-pdf | 1 | ||
protect-pdf | 1 | ||
unlock-pdf | 1 | ||
watermark-pdf | 1 | ||
page-numbers-pdf | 1 |
Paramètres optionnels (champs form-data) :
split-pdf:rangesrequis (ex :1-5,7,10-12)compress-pdf:quality(low,mediumpar défaut,high)protect-pdf:passwordrequis (4 à 64 caractères) ; optionnelsprevent_print=on,prevent_copy=onunlock-pdf:passwordrequis (mot de passe actuel du PDF, à retirer)rotate-pdf:rotationrequis (90,180ou270)watermark-pdf:textrequis (texte du filigrane)pdf-to-image:format(pngpar défaut oujpg)page-numbers-pdf:position(bottom-centerpar défaut,bottom-left,bottom-right) ;format=simplepour le numéro seul (sans total)
Exemple : Image → PDF (curl)
curl -X POST https://api.conv2pdf.com/v1/convert/image-to-pdf \
-H "Authorization: Bearer cpdf_live_..." \
-F "file=@photo.jpg"
Exemple : Fusion PDF (curl)
curl -X POST https://api.conv2pdf.com/v1/convert/merge-pdf \
-H "Authorization: Bearer cpdf_live_..." \
-F "file=@doc1.pdf" \
-F "file=@doc2.pdf" \
-F "file=@doc3.pdf"
Exemple : Compression (curl)
curl -X POST https://api.conv2pdf.com/v1/convert/compress-pdf \
-H "Authorization: Bearer cpdf_live_..." \
-F "file=@gros.pdf" \
-F "quality=medium"
Exemple : PDF → Word (curl)
curl -X POST https://api.conv2pdf.com/v1/convert/pdf-to-word \
-H "Authorization: Bearer cpdf_live_..." \
-F "file=@rapport.pdf"
Renvoie un fichier .docx éditable. Un PDF scanné (sans couche texte) renvoie 422 pdf_scanned_needs_ocr : l'OCR existe pour les comptes Premium, sur le site uniquement, et n'est pas exposé par l'API ; au-delà de 500 pages, 422 pdf_too_many_pages.
Exemple : PDF → Image (curl)
curl -X POST https://api.conv2pdf.com/v1/convert/pdf-to-image \
-H "Authorization: Bearer cpdf_live_..." \
-F "file=@rapport.pdf" \
-F "format=png"
Rend chaque page en image à 150 DPI et renvoie une archive .zip (une image par page). Champ format : png (défaut) ou jpg. Au-delà de 100 pages, 422 too_many_pages ; si le résultat dépasse la taille maximale, 422 output_too_large.
Exemple : Protection par mot de passe (curl)
curl -X POST https://api.conv2pdf.com/v1/convert/protect-pdf \
-H "Authorization: Bearer cpdf_live_..." \
-F "file=@confidentiel.pdf" \
-F "password=secret123" \
-F "prevent_print=on" \
-F "prevent_copy=on"
Chiffrement AES-256. Le PDF généré demandera le mot de passe à l’ouverture et appliquera les restrictions cochées.
Réponse en cas de succès
L’objet quota n’est présent que pour les appels authentifiés par clé API.
{
"job_id": "abc123…",
"status": "success",
"download_url": "/v1/download/abc123…",
"size_bytes": 124533,
"quota": {
"plan": "starter",
"quota": 1000,
"used": 42,
"soft_cap_limit": 1100,
"status": "ok",
"period_end": 1715789012345
}
}
GET /v1/download/:jobId
Télécharge le fichier converti. Le fichier est servi avec son type MIME (application/pdf, le format DOCX pour PDF → Word, ou application/zip pour PDF → Image) et Cache-Control: no-store. Disponible une heure après la conversion.
curl https://api.conv2pdf.com/v1/download/abc123… \
-H "Authorization: Bearer cpdf_live_..." \
-o sortie.pdf
GET /v1/job/:jobId
Renvoie le statut et les métadonnées d’un job (status, taille, dates). Pratique pour vérifier qu’une conversion est prête avant de la télécharger.
curl https://api.conv2pdf.com/v1/job/abc123… \
-H "Authorization: Bearer cpdf_live_..."
DELETE /v1/job/:jobId
Supprime immédiatement un job et son fichier, sans attendre l’expiration automatique (1 h).
curl -X DELETE https://api.conv2pdf.com/v1/job/abc123… \
-H "Authorization: Bearer cpdf_live_..."
Exemples : Node.js
import { readFile } from 'node:fs/promises';
const file = await readFile('./photo.jpg');
const formData = new FormData();
formData.append('file', new Blob([file]), 'photo.jpg');
const res = await fetch('https://api.conv2pdf.com/v1/convert/image-to-pdf', {
method: 'POST',
headers: { 'Authorization': 'Bearer cpdf_live_...' },
body: formData
});
const data = await res.json();
console.log(data.download_url);
Exemples : Python
import requests
with open('photo.jpg', 'rb') as f:
r = requests.post(
'https://api.conv2pdf.com/v1/convert/image-to-pdf',
headers={'Authorization': 'Bearer cpdf_live_...'},
files={'file': f}
)
print(r.json()['download_url'])
Exemples : PHP
SDK officiel (recommandé)
Installez le SDK : composer require conv2pdf/php. Voir le repo et ses exemples.
use Conv2pdf\Conv2pdf;
$c = new Conv2pdf('cpdf_live_...');
$job = $c->convert('image-to-pdf', 'photo.jpg');
$c->download($job['download_url'], 'photo.pdf');
Sans dépendance (requête brute)
$ch = curl_init('https://api.conv2pdf.com/v1/convert/image-to-pdf');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer cpdf_live_...'],
CURLOPT_POSTFIELDS => ['file' => new CURLFile('photo.jpg')],
]);
$data = json_decode(curl_exec($ch), true);
echo $data['download_url'];
Codes d’erreur
| Code | Erreur | Cause |
|---|---|---|
| 400 | not_enough_files / too_many_files | Nombre de fichiers hors bornes pour l’outil |
| 401 | missing_bearer_token / invalid_api_key | Auth manquante ou clé invalide |
| 403 | forbidden | Job appartient à une autre clé |
| 404 | tool_not_found / job_not_found | Outil ou job inexistant |
| 409 | job_not_ready | Le job existe mais n’a pas de sortie : conversion en cours, échouée ou rejetée. Le corps porte status (pending / failed / rejected). |
| 410 | file_expired / job_deleted | Ressource partie définitivement : TTL de 1 h dépassé, ou job supprimé via DELETE /v1/job/:jobId. Inutile de retenter. |
| 413 | file_too_large | Fichier > 200 Mo (limite API) |
| 415 | unsupported_content | Le contenu du fichier ne correspond pas à l’outil. Le type est déterminé au CONTENU, jamais à l’extension du nom : un PDF valide est accepté même sans extension, et un fichier renommé en .pdf est refusé. La réponse porte le type détecté (detected_type). |
| 422 | empty_file | Fichier vide (0 octet) |
| 422 | password_protected | Fichier protégé par mot de passe d’ouverture (chiffré) ; retirer la protection avant conversion |
| 422 | pdf_scanned_needs_ocr | PDF → Word : document scanné sans couche texte. L'OCR est réservé au site, pour les comptes Premium ; l'API renvoie toujours ce code. |
| 422 | pdf_too_many_pages | PDF → Word : plus de 500 pages |
| 429 | quota_exceeded | Quota mensuel atteint |
| 503 | server_busy | File de conversion saturée (retry recommandé sous 5 s, header Retry-After) |
| 500 | failed | Erreur de conversion serveur (détail dans le champ error) |
Quotas et réinitialisation
Chaque clé API a un quota mensuel selon son plan (voir tarifs). Le quota se réinitialise à chaque échéance anniversaire mensuelle (et non au 1er du mois) : le timestamp de la prochaine remise à zéro est renvoyé dans period_end, et le compteur used repart de zéro. Un léger dépassement est toléré (soft_cap_limit, +10 %) avant le blocage en 429.
Confidentialité
Aucun fichier (entrée ou sortie) n’est conservé au-delà d’une heure. Aucun résultat n’est mis en cache. L’intégralité du traitement a lieu sur des serveurs en France (OVH Gravelines). Voir notre politique de confidentialité pour le détail.
Support
Pour toute question technique, utilisez notre formulaire de contact (sujet « Question technique »). Plans Business et Sur-mesure : support prioritaire avec SLA contractuel.