Référence de l’API
L’API REST de ConvertFly vous permet de convertir, d’optimiser et de transformer des fichiers par programmation. Construisez des chaînes de conversion avec des jobs et des tâches : importez un fichier, traitez-le et exportez le résultat en une seule requête.
https://convertfly.io/api/v1Tous les endpoints sont relatifs à cette URL de base. Les requêtes et les réponses sont au format JSON. Tous les horodatages sont en UTC, au format ISO 8601.
Authentification
Chaque requête doit inclure une clé API dans l’en-tête Authorization. Les clés commencent par le préfixe cvfly_sk_ et se créent dans votre tableau de bord.
Authorization: Bearer cvfly_sk_live_abc123def456...Conseil de sécurité : n’exposez jamais vos clés API dans du code côté client. Stockez-les dans des variables d’environnement et appelez l’API depuis votre serveur.
Portées des clés
Les clés API peuvent être limitées à certaines opérations. Une clé créée sans liste de portées reçoit les portées par défaut.
| Portée | Accès |
|---|---|
| job:read | Lire les jobs(par défaut) |
| job:write | Créer, annuler, relancer et supprimer des jobs et leurs tâches(par défaut) |
| task:read | Lire les tâches(par défaut) |
| convert | Lancer des conversions(par défaut) |
| api-key:read | Lister les clés API |
| api-key:write | Créer et révoquer des clés API |
| webhook:read | Lister les webhooks |
| webhook:write | Créer et supprimer des webhooks |
Démarrage rapide
Convertissez un PDF en DOCX en trois étapes : créez un job, attendez qu’il se termine, puis téléchargez le résultat.
Créer un job de conversion
curl -X POST https://convertfly.io/api/v1/jobs \
-H "Authorization: Bearer cvfly_sk_live_abc123..." \
-H "Content-Type: application/json" \
-d '{
"tasks": {
"import-file": {
"operation": "import/url",
"url": "https://example.com/report.pdf"
},
"convert": {
"operation": "convert",
"input": ["import-file"],
"output_format": "docx"
},
"export": {
"operation": "export/url",
"input": ["convert"]
}
}
}'const res = await fetch("https://convertfly.io/api/v1/jobs", {
method: "POST",
headers: {
"Authorization": "Bearer cvfly_sk_live_abc123...",
"Content-Type": "application/json",
},
body: JSON.stringify({
tasks: {
"import-file": {
operation: "import/url",
url: "https://example.com/report.pdf",
},
convert: {
operation: "convert",
input: ["import-file"],
output_format: "docx",
},
export: {
operation: "export/url",
input: ["convert"],
},
},
}),
});
const job = await res.json();
console.log(job.id); // "cmxr9k2p0..."
console.log(job.status); // "processing"import requests
resp = requests.post(
"https://convertfly.io/api/v1/jobs",
headers={"Authorization": "Bearer cvfly_sk_live_abc123..."},
json={
"tasks": {
"import-file": {
"operation": "import/url",
"url": "https://example.com/report.pdf",
},
"convert": {
"operation": "convert",
"input": ["import-file"],
"output_format": "docx",
},
"export": {
"operation": "export/url",
"input": ["convert"],
},
}
},
)
job = resp.json()
print(job["id"]) # "cmxr9k2p0..."
print(job["status"]) # "processing"Attendre la fin du traitement
Interrogez régulièrement le statut du job ou utilisez les webhooks pour être notifié en temps réel.
curl https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
-H "Authorization: Bearer cvfly_sk_live_abc123..."{
"id": "cmxr9k2p0",
"status": "finished",
"created_at": "2026-04-03T10:30:00Z",
"tasks": [
{
"name": "export",
"operation": "export/url",
"status": "finished",
"result": {
"files": [
{ "url": "https://files.convertfly.io/d/cmv.../result.docx?e=...&s=..." }
]
}
}
]
}Télécharger le résultat
Utilisez l’URL fournie dans le résultat de la tâche d’export. Les liens de téléchargement sont valables 1 heure ; les fichiers sont supprimés 24 heures après leur envoi.
curl -o result.docx "https://files.convertfly.io/d/..."Jobs
Un job est un conteneur regroupant une ou plusieurs tâches qui forment une chaîne de conversion. Les tâches d’un job s’exécutent dans l’ordre de leurs dépendances : chaque tâche peut faire référence au résultat d’une tâche précédente via le champ input.
Principe de la chaîne
Une chaîne typique se présente ainsi : import/url -> convert -> export/url. Vous pouvez aussi enchaîner plusieurs opérations : import -> convert -> optimize -> watermark -> export.
Statuts d’un job
| Statut | Description |
|---|---|
| waiting | Job créé, en file d’attente |
| processing | Au moins une tâche est en cours d’exécution |
| finished | Toutes les tâches se sont terminées avec succès |
| error | Une ou plusieurs tâches ont échoué |
Créer un job
/api/v1/jobstagstringÉtiquette facultative pour organiser les jobs (p. ex. batch-2026-04).
tasksobjectobligatoireTable associant des noms de tâches à des définitions de tâches. Les noms de tâches doivent être uniques au sein du job.
webhook_urlstringURL qui recevra un événement job.finished ou job.failed à la fin du job.
curl -X POST https://convertfly.io/api/v1/jobs \
-H "Authorization: Bearer cvfly_sk_..." \
-H "Content-Type: application/json" \
-d '{
"tag": "invoice-batch",
"tasks": {
"import-file": {
"operation": "import/url",
"url": "https://example.com/invoice.pdf"
},
"to-png": {
"operation": "convert",
"input": ["import-file"],
"output_format": "png",
"options": { "density": 300 }
},
"export": {
"operation": "export/url",
"input": ["to-png"]
}
}
}'{
"id": "cmxr9k2p0",
"tag": "invoice-batch",
"status": "processing",
"created_at": "2026-04-03T10:30:00Z",
"tasks": [
{ "name": "import-file", "operation": "import/url", "status": "finished" },
{ "name": "to-png", "operation": "convert", "status": "processing" },
{ "name": "export", "operation": "export/url", "status": "waiting" }
]
}Exemple : fusionner des fichiers en un seul PDF
L’opération merge combine au moins deux entrées (PDF et/ou images) en un seul PDF. Indiquez dans l’ordre les noms des tâches d’entrée dans le tableau input.
curl -X POST https://convertfly.io/api/v1/jobs \
-H "Authorization: Bearer cvfly_sk_..." \
-H "Content-Type: application/json" \
-d '{
"tasks": {
"cover": {
"operation": "import/url",
"url": "https://example.com/cover.png"
},
"report": {
"operation": "import/url",
"url": "https://example.com/report.pdf"
},
"merge-all": {
"operation": "merge",
"input": ["cover", "report"]
},
"export": {
"operation": "export/url",
"input": ["merge-all"]
}
}
}'Exemple : capturer un site web
L’opération capture-website ne nécessite aucune tâche d’entrée : elle rend une URL publique en PDF, PNG ou JPG.
curl -X POST https://convertfly.io/api/v1/jobs \
-H "Authorization: Bearer cvfly_sk_..." \
-H "Content-Type: application/json" \
-d '{
"tasks": {
"capture": {
"operation": "capture-website",
"url": "https://example.com",
"output_format": "pdf",
"width": 1280
},
"export": {
"operation": "export/url",
"input": ["capture"]
}
}
}'Consulter un job
/api/v1/jobs/:idRécupérez le détail d’un job et le statut de toutes ses tâches.
curl https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
-H "Authorization: Bearer cvfly_sk_..."Lister les jobs
/api/v1/jobspageintegerNuméro de page, à partir de 1. Par défaut : 1.
limitintegerRésultats par page, de 1 à 100. Par défaut : 20.
statusstringFiltrer par statut : WAITING, PROCESSING, FINISHED, ERROR.
tagstringFiltrer par étiquette.
curl "https://convertfly.io/api/v1/jobs?status=finished&per_page=5" \
-H "Authorization: Bearer cvfly_sk_..."{
"data": [ ... ],
"links": { "first": "?page=1&per_page=5", "last": "?page=9&per_page=5", "prev": null, "next": "?page=2&per_page=5" },
"meta": {
"page": 1,
"per_page": 5,
"total": 42
}
}Supprimer un job
/api/v1/jobs/:idSupprime un job et tous les fichiers associés. Les tâches en cours sont annulées. Cette action est irréversible.
curl -X DELETE https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
-H "Authorization: Bearer cvfly_sk_..."Attendre la fin du traitement
/api/v1/jobs/:id/waitEndpoint à interrogation longue qui reste en attente jusqu’à ce que le job atteigne un état final (FINISHED ou ERROR). Il expire au bout de 300 secondes et renvoie 202 Accepted si le job est toujours en cours.
curl "https://convertfly.io/api/v1/jobs/job_7kX9mP2qR/wait?timeout=120" \
-H "Authorization: Bearer cvfly_sk_..."Tâches
Les tâches sont les étapes individuelles d’un job. Chaque tâche possède un nom (la clé dans l’objet tasks), une operation et, en option, un tableau input faisant référence aux noms de tâches précédentes.
Champs d’une tâche
| Champ | Type | Description |
|---|---|---|
| operation | string | L’opération à effectuer (voir Opérations) |
| input | string[] | Noms des tâches dont le résultat sert d’entrée |
| output_format | string | Format cible des opérations de conversion |
| options | object | Paramètres propres à l’opération (qualité, densité, etc.) |
Lister les tâches d’un job
/api/v1/jobs/:id/tasks{
"data": [
{
"name": "import-file",
"operation": "import/url",
"status": "finished",
"result": { "file_id": "file_Xk9m..." }
},
{
"name": "convert",
"operation": "convert",
"status": "finished",
"result": { "file_id": "file_Pm3n..." }
}
]
}Consulter une tâche
/api/v1/jobs/:job_id/tasks/:task_nameAnnuler une tâche
/api/v1/jobs/:job_id/tasks/:task_name/cancelAnnule une tâche en cours ou en attente. Les tâches en aval qui en dépendent sont également annulées.
Relancer une tâche en échec
/api/v1/jobs/:job_id/tasks/:task_name/retryRelance une tâche dont le statut est ERROR. Des crédits sont à nouveau consommés si la tâche est facturable.
Import de fichiers
Il existe trois façons de transmettre des fichiers à ConvertFly. Choisissez celle qui correspond le mieux à votre cas d’usage.
Import depuis une URL
La méthode la plus simple. ConvertFly télécharge le fichier depuis une URL accessible publiquement.
{
"import-file": {
"operation": "import/url",
"url": "https://example.com/document.pdf",
"filename": "document.pdf",
"headers": {
"Authorization": "Bearer your-external-token"
}
}
}Import direct (URL présignée)
Pour les fichiers présents sur votre machine. Le processus se déroule en deux étapes : créez d’abord la tâche pour obtenir une URL d’import présignée, puis envoyez votre fichier par PUT vers cette URL.
{
"upload-file": {
"operation": "import/upload",
"filename": "photo.jpg"
}
}# The task result will contain the presigned URL
curl -X PUT "https://files.convertfly.io/convertfly-files/..." \
-H "Content-Type: image/jpeg" \
--data-binary @photo.jpgImport en Base64
Pour les petits fichiers (moins de 10 Mo). Intégrez directement le contenu du fichier dans la requête.
{
"import-file": {
"operation": "import/base64",
"file": "JVBERi0xLjQKJcOkw7zD...",
"filename": "document.pdf"
}
}| Méthode | Taille max. | Idéal pour |
|---|---|---|
| import/url | 5 GB | Fichiers déjà hébergés en ligne |
| import/upload | 5 GB | Fichiers locaux, fichiers volumineux |
| import/base64 | 10 MB | Petits fichiers, intégrés à la requête |
Options de conversion
Chaque opération accepte des options spécifiques. Voici toutes les opérations disponibles et les paires de formats pour les conversions.
Opérations disponibles
| Opération | Description | Crédits |
|---|---|---|
| import/upload | Importer un fichier via une URL présignée | 0 |
| import/url | Importer un fichier depuis une URL | 0 |
| import/base64 | Importer un fichier à partir de données Base64 | 0 |
| convert | Convertir d’un format à un autre | 1-4 |
| optimize | Compresser ou optimiser un fichier | 1 |
| thumbnail | Générer une miniature d’aperçu | 1 |
| merge | Fusionner plusieurs PDF et/ou images en un seul PDF | 1 |
| watermark | Ajouter un filigrane texte ou image à des images, des vidéos ou des PDF | 1 |
| split | Extraire des pages d’un PDF, ou le diviser en un PDF par page (ZIP) | 1 |
| rotate | Faire pivoter les pages d’un PDF de 90, 180 ou 270 degrés | 1 |
| resize | Redimensionner une image par largeur, hauteur ou pourcentage, en conservant les proportions | 1 |
| gif | Transformer un extrait vidéo en GIF animé (début, durée, fps, largeur) | 2 |
| ocr | Reconnaître le texte de PDF ou d’images (14 langues, les mêmes que sur la page OCR) | 3 |
| capture-website | Capturer un site web public en PDF, PNG ou JPG | 1 |
| metadata | Extraire les métadonnées d’un fichier | 1 |
| export/url | Obtenir une URL de téléchargement signée | 0 |
| export/s3 | Exporter directement vers votre bucket S3 | 0 |
Paires de formats prises en charge
Conversions courantes. Le format est détecté automatiquement à partir du fichier, mais vous pouvez aussi définir input_format explicitement.
| Catégorie | Formats d’entrée | Formats de sortie |
|---|---|---|
| Documents | pdf, docx, doc, odt, rtf, txt, html | pdf, docx, odt, rtf, txt, html |
| Tableurs | xlsx, xls, ods, csv | xlsx, ods, csv, pdf |
| Présentations | pptx, ppt, odp | pptx, odp, pdf |
| Images | jpg, png, gif, bmp, tiff, webp, svg, heic | jpg, png, gif, bmp, tiff, webp |
| Vidéo | mp4, avi, mov, mkv, webm | mp4, avi, mov, mkv, webm, gif |
| Audio | mp3, wav, ogg, flac, aac, m4a | mp3, wav, ogg, flac, aac |
Options de qualité et de traitement
Transmettez-les dans l’objet options d’une tâche de conversion.
qualityintegerQualité de sortie pour les formats avec perte (1 à 100). Par défaut : 85.
densityintegerRésolution en DPI pour la conversion de documents en images. Par défaut : 150.
widthintegerRedimensionne à cette largeur en pixels. Conserve les proportions si height est omis.
heightintegerRedimensionne à cette hauteur en pixels. Conserve les proportions si width est omis.
pagesstringPlage de pages pour les opérations sur documents. P. ex. 1-5, 1,3,5, all.
{
"convert-hq": {
"operation": "convert",
"input": ["import-file"],
"output_format": "png",
"options": {
"density": 300,
"quality": 95
}
}
}Webhooks
Enregistrez des URL de webhook pour être notifié en temps réel lorsque des jobs ou des tâches changent de statut. Toutes les charges utiles sont signées en HMAC-SHA256 pour que vous puissiez vérifier qu’elles proviennent bien de ConvertFly.
Créer un webhook
/api/v1/webhooksurlstringobligatoireL’URL HTTPS qui recevra les événements du webhook.
eventsstring[]obligatoireTypes d’événements auxquels s’abonner.
curl -X POST https://convertfly.io/api/v1/webhooks \
-H "Authorization: Bearer cvfly_sk_..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-app.com/webhooks/convertfly",
"events": ["job.finished", "job.failed"]
}'{
"data": {
"id": "wh_Abc123...",
"url": "https://your-app.com/webhooks/convertfly",
"events": ["job.finished", "job.failed"],
"signing_secret": "whsec_9f8e7d6c5b4a...",
"created_at": "2026-04-03T10:30:00Z"
}
}Lister les webhooks
/api/v1/webhooksSupprimer un webhook
/api/v1/webhooks/:idTypes d’événements
| Événement | Déclencheur |
|---|---|
| job.finished | Toutes les tâches du job se sont terminées avec succès |
| job.failed | Une ou plusieurs tâches ont échoué, le job est à l’état ERROR |
| task.finished | Une tâche s’est terminée |
| task.failed | Une tâche a échoué |
Charge utile du webhook
{
"event": "job.finished",
"timestamp": "2026-04-03T10:31:15Z",
"data": {
"id": "job_7kX9mP2qR",
"status": "finished",
"tasks": { ... }
}
}Vérifier les signatures
Chaque requête de webhook comporte deux en-têtes : X-Webhook-Signature et X-Webhook-Timestamp. Vérifiez-les pour vous assurer que la charge utile a bien été envoyée par ConvertFly et n’a pas été altérée.
import crypto from "crypto";
function verifyWebhook(rawBody, signature, timestamp, secret) {
const signedContent = timestamp + "." + rawBody;
const expected = "v1=" + crypto
.createHmac("sha256", secret)
.update(signedContent)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature)
);
}import hmac, hashlib
def verify_webhook(raw_body: bytes, signature: str, timestamp: str, secret: str) -> bool:
signed_content = f"{timestamp}.{raw_body.decode()}"
expected = "v1=" + hmac.new(
secret.encode(), signed_content.encode(), hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)Clés API
Gérez vos clés API par programmation. Vous pouvez aussi les gérer depuis le tableau de bord.
Créer une clé API
/api/v1/api-keysnamestringobligatoireUn nom descriptif pour la clé.
scopesstring[]Autorisations à accorder. Par défaut : ["*"] (accès complet).
{
"data": {
"id": "key_Xk9m...",
"name": "production-server",
"key": "cvfly_sk_live_abc123def456...",
"scopes": ["*"],
"created_at": "2026-04-03T10:30:00Z"
}
}Important : la clé API complète ne s’affiche qu’une seule fois, au moment de sa création. Conservez-la en lieu sûr : vous ne pourrez plus la récupérer.
Lister les clés API
/api/v1/api-keysRévoquer une clé API
/api/v1/api-keys/:idInvalide immédiatement la clé. Toute requête qui l’utilise renverra 401.
Limitation du débit
Le débit des requêtes est limité par clé API afin de garantir un usage équitable. Au-delà de la limite, les requêtes renvoient 429 Too Many Requests.
Limite par défaut
Chaque clé API autorise 100 requêtes par heure. La limite et la fenêtre en vigueur pour une clé sont renvoyées dans rate_limit et rate_limit_window (en secondes) lorsque vous listez vos clés. Contactez-nous si votre intégration nécessite une limite plus élevée.
En-têtes de réponse
Chaque réponse à une requête effectuée avec une clé API comporte ces en-têtes :
X-RateLimit-Limiten-têteNombre maximal de requêtes autorisées dans la fenêtre en cours.
X-RateLimit-Remainingen-têteRequêtes restantes dans la fenêtre en cours.
X-RateLimit-Reseten-têteHorodatage Unix de la réinitialisation de la fenêtre.
Retry-Afteren-têteNombre de secondes à attendre avant de réessayer (uniquement sur les réponses 429).
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1743681600
Retry-After: 3600
{
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. 100 requests per 3600s allowed."
}Erreurs
ConvertFly utilise les codes de statut HTTP habituels. Toutes les réponses d’erreur suivent un format cohérent, avec un code lisible par machine et un message lisible par un humain.
Format des réponses d’erreur
{
"code": "INVALID_DATA",
"message": "Missing required field: output_format",
"details": {
"field": "output_format",
"reason": "required"
}
}Codes d’erreur
| Code | HTTP | Description |
|---|---|---|
| INVALID_DATA | 400 | Corps de requête ou paramètres invalides |
| UNAUTHENTICATED | 401 | Clé API absente ou invalide |
| FORBIDDEN | 403 | La clé API ne dispose pas de la portée requise pour cette opération |
| NOT_FOUND | 404 | La ressource n’existe pas ou a été supprimée |
| CONFLICT | 409 | La ressource existe déjà ou l’opération entre en conflit avec l’état actuel |
| PAYLOAD_TOO_LARGE | 413 | Le corps de la requête dépasse la taille maximale autorisée |
| UNSUPPORTED_FORMAT | 422 | La conversion demandée n’est pas prise en charge |
| RATE_LIMIT_EXCEEDED | 429 | Limite de débit dépassée, voir Limitation du débit |
| INSUFFICIENT_CREDITS | 402 | Crédits insuffisants pour effectuer l’opération |
| SERVER_ERROR | 500 | Erreur interne du serveur : réessayez ou contactez l’assistance |
| UNAVAILABLE | 503 | Service temporairement indisponible : réessayez dans un instant |
Gérer les erreurs
const res = await fetch("https://convertfly.io/api/v1/jobs", {
method: "POST",
headers: {
"Authorization": "Bearer cvfly_sk_...",
"Content-Type": "application/json",
},
body: JSON.stringify({ tasks: { /* ... */ } }),
});
if (!res.ok) {
const error = await res.json();
console.error(`[${error.code}] ${error.message}`);
// "[INVALID_DATA] Missing required field: output_format"
return;
}
const { data: job } = await res.json();Crédits
Chaque opération coûte un certain nombre de crédits. Les opérations d’import et d’export sont gratuites. Votre solde restant figure dans chaque réponse de l’API, dans l’en-tête X-Credits-Remaining.
Coût en crédits par type de conversion
| Opération | Coût | Exemples |
|---|---|---|
| Import / Export | Gratuit | import/url, import/upload, export/url, export/s3 |
| Conversion d’image | 1 crédit | jpg en png, webp en gif, heic en jpg |
| Conversion audio | 1 crédit | mp3 en wav, flac en aac |
| Document en PDF | 1 crédit | txt en pdf, html en pdf, md en pdf |
| Office en PDF | 2 crédits | docx en pdf, pptx en pdf, xlsx en pdf |
| Conversion vidéo | 2 crédits | mp4 en webm, mov en mp4 |
| PDF en Office | 4 crédits | pdf en docx, pdf en pptx |
| Optimisation | 1 crédit | Compresser des images, des PDF |
| Miniature | 1 crédit | Générer une image d’aperçu |
| Fusion | 1 crédit | Combiner plusieurs PDF |
| Filigrane | 1 crédit | Ajouter une surimpression texte ou image |
| Diviser PDF | 1 crédit | Extraire les pages 1-3, 7 ou un fichier par page |
| Pivoter PDF | 1 crédit | Tourner toutes les pages ou une sélection |
| Redimensionner une image | 1 crédit | 1200 px de large, 50 pour cent |
| Créer un GIF | 2 crédits | Extrait mp4 en gif, même prix qu’une conversion vidéo |
| Capture de site web | 1 crédit | Rendre une URL en PDF ou en image |
| OCR | 3 crédits | Rendre un PDF scanné interrogeable |
| Métadonnées | 1 crédit | Extraire les informations d’un fichier |
Consulter votre solde
Chaque réponse de l’API comporte l’en-tête X-Credits-Remaining indiquant votre solde actuel.
HTTP/1.1 201 Created
Content-Type: application/json
X-Credits-Remaining: 9847
X-Credits-Used: 2Lorsque votre solde est insuffisant pour exécuter un job, l’API renvoie 402 avec le code d’erreur INSUFFICIENT_CREDITS. Rechargez vos crédits depuis votre espace de facturation.
Bac à sable
Les clés de bac à sable vous permettent de développer et de tester une intégration de bout en bout sans dépenser de crédits. Créez une clé avec "sandbox": true ; elle commence par le préfixe cf_test_ au lieu de cvfly_sk_. Tout fonctionne comme en production, à trois différences près.
| Crédits | Jamais débités. Votre solde reste inchangé. |
| Taille des fichiers | Les fichiers d’entrée sont limités à 5 Mo. |
| Sortie | Les images, vidéos et PDF portent un filigrane « ConvertFly SANDBOX ». |
curl -X POST https://convertfly.io/api/v1/api-keys \
-H "Authorization: Bearer YOUR_LIVE_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Sandbox", "sandbox": true}'
# Response includes: "key": "cf_test_...", "is_sandbox": truePrêt à vous lancer ?
Créez votre compte gratuit et testez l’API avec une clé de bac à sable, sans frais.