Riferimento API
L'API REST di ConvertFly ti permette di convertire, ottimizzare e trasformare file in modo programmatico. Crea pipeline di conversione con job e task: importa un file, elaboralo ed esporta il risultato in un'unica richiesta.
https://convertfly.io/api/v1Tutti gli endpoint sono relativi a questo URL di base. Richieste e risposte usano JSON. Tutte le marche temporali sono in UTC, formato ISO 8601.
Autenticazione
Ogni richiesta deve includere una chiave API nell'intestazione Authorization. Le chiavi hanno il prefisso cvfly_sk_ e si creano dal tuo pannello.
Authorization: Bearer cvfly_sk_live_abc123def456...Consiglio di sicurezza: non esporre mai le chiavi API nel codice lato client. Conservale in variabili d'ambiente ed effettua le chiamate API dal tuo server.
Ambiti delle chiavi
Le chiavi API possono essere limitate ad alcune operazioni. Una chiave creata senza un elenco di ambiti riceve quelli predefiniti.
| Ambito | Accesso |
|---|---|
| job:read | Leggere i job(predefinito) |
| job:write | Creare, annullare, riprovare ed eliminare i job e i relativi task(predefinito) |
| task:read | Leggere i task(predefinito) |
| convert | Eseguire conversioni(predefinito) |
| api-key:read | Elencare le chiavi API |
| api-key:write | Creare e revocare le chiavi API |
| webhook:read | Elencare i webhook |
| webhook:write | Creare ed eliminare i webhook |
Guida rapida
Converti un PDF in DOCX in tre passaggi: crea un job, attendi che termini, poi scarica il risultato.
Crea un job di conversione
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"Attendi il completamento
Interroga periodicamente lo stato del job oppure usa i webhook per ricevere notifiche in tempo reale.
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=..." }
]
}
}
]
}Scarica il risultato
Usa l'URL presente nel risultato del task di esportazione. I link di download sono validi per 1 ora; i file vengono eliminati 24 ore dopo il caricamento.
curl -o result.docx "https://files.convertfly.io/d/..."Job
Un job è un contenitore per uno o più task che formano una pipeline di conversione. I task di un job vengono eseguiti nell'ordine delle dipendenze: ogni task può fare riferimento al risultato di un task precedente tramite il campo input.
Il concetto di pipeline
Una pipeline tipica ha questa forma: import/url -> convert -> export/url. Puoi anche concatenare più operazioni: importazione -> conversione -> ottimizzazione -> filigrana -> esportazione.
Stati dei job
| Stato | Descrizione |
|---|---|
| waiting | Job creato, in coda per l'elaborazione |
| processing | Almeno un task è in esecuzione |
| finished | Tutti i task sono stati completati correttamente |
| error | Uno o più task non sono riusciti |
Creare un job
/api/v1/jobstagstringEtichetta facoltativa per organizzare i job (ad es. batch-2026-04).
tasksobjectobbligatorioUna mappa che associa i nomi dei task alle loro definizioni. I nomi dei task devono essere univoci all'interno del job.
webhook_urlstringURL che riceve un evento job.finished o job.failed quando il job termina.
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" }
]
}Esempio: unire più file in un solo PDF
L'operazione merge combina due o più input (PDF e/o immagini) in un unico PDF. Elenca in ordine i nomi dei task di input nell'array 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"]
}
}
}'Esempio: acquisire un sito web
L'operazione capture-website non richiede alcun task di input: esegue il rendering di un URL pubblico in PDF, PNG o 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"]
}
}
}'Recuperare un job
/api/v1/jobs/:idRecupera i dettagli di un job e lo stato di tutti i suoi task.
curl https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
-H "Authorization: Bearer cvfly_sk_..."Elencare i job
/api/v1/jobspageintegerNumero di pagina, a partire da 1. Predefinito: 1.
limitintegerRisultati per pagina, da 1 a 100. Predefinito: 20.
statusstringFiltra per stato: WAITING, PROCESSING, FINISHED, ERROR.
tagstringFiltra per etichetta.
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
}
}Eliminare un job
/api/v1/jobs/:idElimina un job e tutti i file associati. I task in esecuzione vengono annullati. Questa azione è irreversibile.
curl -X DELETE https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
-H "Authorization: Bearer cvfly_sk_..."Attendere il completamento
/api/v1/jobs/:id/waitEndpoint in long polling che resta in attesa finché il job non raggiunge uno stato finale (FINISHED o ERROR). Scade dopo 300 secondi con un 202 Accepted se il job è ancora in elaborazione.
curl "https://convertfly.io/api/v1/jobs/job_7kX9mP2qR/wait?timeout=120" \
-H "Authorization: Bearer cvfly_sk_..."Task
I task sono i singoli passaggi di un job. Ogni task ha un nome (la chiave nell'oggetto tasks), un campo operation e, facoltativamente, un array input che fa riferimento ai nomi di task precedenti.
Campi del task
| Campo | Tipo | Descrizione |
|---|---|---|
| operation | string | L'operazione da eseguire (vedi Operazioni) |
| input | string[] | Nomi dei task il cui risultato va usato come input |
| output_format | string | Formato di destinazione per le operazioni di conversione |
| options | object | Impostazioni specifiche dell'operazione (qualità, densità, ecc.) |
Elencare i task di 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..." }
}
]
}Recuperare un task
/api/v1/jobs/:job_id/tasks/:task_nameAnnullare un task
/api/v1/jobs/:job_id/tasks/:task_name/cancelAnnulla un task in esecuzione o in attesa. Vengono annullati anche i task successivi che dipendono da esso.
Ripetere un task non riuscito
/api/v1/jobs/:job_id/tasks/:task_name/retryRipete un task con stato ERROR. Se il task è a pagamento, i crediti vengono consumati di nuovo.
Caricamento dei file
Ci sono tre modi per inviare file a ConvertFly. Scegli quello più adatto al tuo caso d'uso.
Importare da URL
Il metodo più semplice. ConvertFly scarica il file da un URL accessibile pubblicamente.
{
"import-file": {
"operation": "import/url",
"url": "https://example.com/document.pdf",
"filename": "document.pdf",
"headers": {
"Authorization": "Bearer your-external-token"
}
}
}Caricamento diretto (URL prefirmato)
Per i file presenti sul tuo computer. Il processo si svolge in due passaggi: prima crei il task per ottenere un URL di caricamento prefirmato, poi invii il file a quell'URL con una richiesta PUT.
{
"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.jpgImportare da Base64
Per i file di piccole dimensioni (sotto i 10 MB). Incorpora il contenuto del file direttamente nella richiesta.
{
"import-file": {
"operation": "import/base64",
"file": "JVBERi0xLjQKJcOkw7zD...",
"filename": "document.pdf"
}
}| Metodo | Dimensione massima | Ideale per |
|---|---|---|
| import/url | 5 GB | File già disponibili online |
| import/upload | 5 GB | File locali, file di grandi dimensioni |
| import/base64 | 10 MB | File piccoli, inclusi nella richiesta |
Opzioni di conversione
Ogni operazione supporta opzioni specifiche. Ecco tutte le operazioni disponibili e le coppie di formati per le conversioni.
Operazioni disponibili
| Operazione | Descrizione | Crediti |
|---|---|---|
| import/upload | Carica un file tramite URL prefirmato | 0 |
| import/url | Importa un file da un URL | 0 |
| import/base64 | Importa un file da dati base64 | 0 |
| convert | Converte da un formato all'altro | 1-4 |
| optimize | Comprime o ottimizza un file | 1 |
| thumbnail | Genera un'anteprima in miniatura | 1 |
| merge | Unisce più PDF e/o immagini in un unico PDF | 1 |
| watermark | Aggiunge una filigrana di testo o immagine a immagini, video o PDF | 1 |
| split | Estrai pagine da un PDF o dividilo in un PDF per pagina (ZIP) | 1 |
| rotate | Ruota le pagine di un PDF di 90, 180 o 270 gradi | 1 |
| resize | Ridimensiona un'immagine per larghezza, altezza o percentuale, mantenendo le proporzioni | 1 |
| gif | Trasforma un clip video in una GIF animata (inizio, durata, fps, larghezza) | 2 |
| ocr | Riconosce il testo in PDF o immagini (14 lingue, le stesse della pagina OCR) | 3 |
| capture-website | Acquisisce un sito web pubblico in PDF, PNG o JPG | 1 |
| metadata | Estrae i metadati del file | 1 |
| export/url | Ottiene un URL di download firmato | 0 |
| export/s3 | Esporta direttamente nel tuo bucket S3 | 0 |
Coppie di formati supportate
Conversioni più diffuse. Il formato viene rilevato automaticamente dal file, ma puoi anche impostare input_format in modo esplicito.
| Categoria | Formati di input | Formati di output |
|---|---|---|
| Documenti | pdf, docx, doc, odt, rtf, txt, html | pdf, docx, odt, rtf, txt, html |
| Fogli di calcolo | xlsx, xls, ods, csv | xlsx, ods, csv, pdf |
| Presentazioni | pptx, ppt, odp | pptx, odp, pdf |
| Immagini | jpg, png, gif, bmp, tiff, webp, svg, heic | jpg, png, gif, bmp, tiff, webp |
| Video | mp4, avi, mov, mkv, webm | mp4, avi, mov, mkv, webm, gif |
| Audio | mp3, wav, ogg, flac, aac, m4a | mp3, wav, ogg, flac, aac |
Opzioni di qualità e di elaborazione
Passale nell'oggetto options di un task di conversione.
qualityintegerQualità di output per i formati con perdita (1-100). Predefinito: 85.
densityintegerDPI per la conversione da documento a immagine. Predefinito: 150.
widthintegerRidimensiona a questa larghezza in pixel. Mantiene le proporzioni se height è omesso.
heightintegerRidimensiona a questa altezza in pixel. Mantiene le proporzioni se width è omesso.
pagesstringIntervallo di pagine per le operazioni sui documenti. Ad es. 1-5, 1,3,5, all.
{
"convert-hq": {
"operation": "convert",
"input": ["import-file"],
"output_format": "png",
"options": {
"density": 300,
"quality": 95
}
}
}Webhook
Registra degli URL webhook per ricevere notifiche in tempo reale quando lo stato di job o task cambia. Tutti i payload sono firmati con HMAC-SHA256, così puoi verificare che provengano da ConvertFly.
Creare un webhook
/api/v1/webhooksurlstringobbligatorioL'URL HTTPS che riceve gli eventi webhook.
eventsstring[]obbligatorioTipi di evento a cui iscriversi.
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"
}
}Elencare i webhook
/api/v1/webhooksEliminare un webhook
/api/v1/webhooks/:idTipi di evento
| Evento | Attivazione |
|---|---|
| job.finished | Tutti i task del job sono stati completati correttamente |
| job.failed | Uno o più task non sono riusciti, il job è in stato ERROR |
| task.finished | Un singolo task è stato completato |
| task.failed | Un singolo task non è riuscito |
Payload del webhook
{
"event": "job.finished",
"timestamp": "2026-04-03T10:31:15Z",
"data": {
"id": "job_7kX9mP2qR",
"status": "finished",
"tasks": { ... }
}
}Verificare le firme
Ogni richiesta webhook include due intestazioni: X-Webhook-Signature e X-Webhook-Timestamp. Verificale per assicurarti che il payload sia stato inviato da ConvertFly e non sia stato alterato.
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)Chiavi API
Gestisci le chiavi API in modo programmatico. Puoi gestirle anche dal pannello.
Creare una chiave API
/api/v1/api-keysnamestringobbligatorioUn nome descrittivo per la chiave.
scopesstring[]Autorizzazioni da concedere. Predefinito: ["*"] (accesso completo).
{
"data": {
"id": "key_Xk9m...",
"name": "production-server",
"key": "cvfly_sk_live_abc123def456...",
"scopes": ["*"],
"created_at": "2026-04-03T10:30:00Z"
}
}Importante: la chiave API completa viene mostrata una sola volta, al momento della creazione. Conservala in modo sicuro: non potrai recuperarla in seguito.
Elencare le chiavi API
/api/v1/api-keysRevocare una chiave API
/api/v1/api-keys/:idInvalida immediatamente la chiave. Tutte le richieste che la usano restituiranno 401.
Limiti di frequenza
Le richieste API sono soggette a un limite di frequenza per chiave API, per garantire un utilizzo equo. Quando superi il limite, le richieste restituiscono 429 Too Many Requests.
Limite predefinito
Ogni chiave API consente 100 richieste all'ora. Il limite attuale e la finestra di una chiave vengono restituiti come rate_limit e rate_limit_window (in secondi) quando elenchi le tue chiavi. Contattaci se la tua integrazione ha bisogno di un limite più alto.
Intestazioni di risposta
Ogni risposta a una richiesta effettuata con una chiave API include queste intestazioni:
X-RateLimit-LimitintestazioneNumero massimo di richieste consentite nella finestra corrente.
X-RateLimit-RemainingintestazioneRichieste rimanenti nella finestra corrente.
X-RateLimit-ResetintestazioneMarca temporale Unix in cui la finestra si azzera.
Retry-AfterintestazioneSecondi da attendere prima di riprovare (solo nelle risposte 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."
}Errori
ConvertFly usa i codici di stato HTTP convenzionali. Tutte le risposte di errore seguono un formato coerente, con un code leggibile dalle macchine e un message leggibile dalle persone.
Formato delle risposte di errore
{
"code": "INVALID_DATA",
"message": "Missing required field: output_format",
"details": {
"field": "output_format",
"reason": "required"
}
}Codici di errore
| Codice | HTTP | Descrizione |
|---|---|---|
| INVALID_DATA | 400 | Corpo della richiesta o parametri non validi |
| UNAUTHENTICATED | 401 | Chiave API mancante o non valida |
| FORBIDDEN | 403 | La chiave API non ha l'ambito richiesto per questa operazione |
| NOT_FOUND | 404 | La risorsa non esiste o è stata eliminata |
| CONFLICT | 409 | La risorsa esiste già o l'operazione è in conflitto con lo stato attuale |
| PAYLOAD_TOO_LARGE | 413 | Il corpo della richiesta supera la dimensione massima consentita |
| UNSUPPORTED_FORMAT | 422 | La conversione richiesta non è supportata |
| RATE_LIMIT_EXCEEDED | 429 | Limite di frequenza superato: vedi Limiti di frequenza |
| INSUFFICIENT_CREDITS | 402 | Crediti insufficienti per completare l'operazione |
| SERVER_ERROR | 500 | Errore interno del server: riprova o contatta l'assistenza |
| UNAVAILABLE | 503 | Servizio temporaneamente non disponibile: riprova tra un momento |
Gestione degli errori
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();Crediti
Ogni operazione costa un certo numero di crediti. Le operazioni di importazione ed esportazione sono gratuite. Il saldo residuo è incluso in ogni risposta API tramite l'intestazione X-Credits-Remaining.
Costo in crediti per tipo di conversione
| Operazione | Costo | Esempi |
|---|---|---|
| Importazione / Esportazione | Gratuito | import/url, import/upload, export/url, export/s3 |
| Conversione di immagini | 1 credito | da jpg a png, da webp a gif, da heic a jpg |
| Conversione audio | 1 credito | da mp3 a wav, da flac a aac |
| Da documento a PDF | 1 credito | da txt a pdf, da html a pdf, da md a pdf |
| Da Office a PDF | 2 crediti | da docx a pdf, da pptx a pdf, da xlsx a pdf |
| Conversione video | 2 crediti | da mp4 a webm, da mov a mp4 |
| Da PDF a Office | 4 crediti | da pdf a docx, da pdf a pptx |
| Ottimizzazione | 1 credito | Comprimere immagini e PDF |
| Miniatura | 1 credito | Generare un'immagine di anteprima |
| Unione | 1 credito | Unire più PDF |
| Filigrana | 1 credito | Aggiungere una sovrimpressione di testo o immagine |
| Dividere PDF | 1 credito | Estrai le pagine 1-3, 7 o un file per pagina |
| Ruotare PDF | 1 credito | Gira tutte le pagine o una selezione |
| Ridimensionare immagini | 1 credito | 1200 px di larghezza, 50 per cento |
| Creare GIF | 2 crediti | clip mp4 in gif, stesso prezzo di una conversione video |
| Acquisizione di siti web | 1 credito | Rendering di un URL in PDF o immagine |
| OCR | 3 crediti | Rendere ricercabile un PDF scansionato |
| Metadati | 1 credito | Estrarre le informazioni del file |
Controllare il saldo
Ogni risposta API include l'intestazione X-Credits-Remaining con il tuo saldo attuale.
HTTP/1.1 201 Created
Content-Type: application/json
X-Credits-Remaining: 9847
X-Credits-Used: 2Quando il saldo è troppo basso per completare un job, l'API restituisce 402 con il codice di errore INSUFFICIENT_CREDITS. Ricarica i crediti dal tuo pannello di fatturazione.
Sandbox
Le chiavi sandbox ti permettono di sviluppare e testare un'integrazione dall'inizio alla fine senza spendere crediti. Crea una chiave con "sandbox": true; avrà il prefisso cf_test_ invece di cvfly_sk_. Tutto funziona come in produzione, con tre differenze.
| Crediti | Mai addebitati. Il tuo saldo resta invariato. |
| Dimensione dei file | I file in ingresso sono limitati a 5 MB. |
| Risultato | Immagini, video e PDF riportano la filigrana “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": truePronto a iniziare a sviluppare?
Crea il tuo account gratuito e prova l'API con una chiave sandbox, senza costi.