Referência da API
A API REST do ConvertFly permite converter, otimizar e transformar arquivos programaticamente. Monte pipelines de conversão com jobs e tarefas: importe um arquivo, processe-o e exporte o resultado em uma única requisição.
https://convertfly.io/api/v1Todos os endpoints são relativos a esta URL base. As requisições e respostas usam JSON. Todos os carimbos de data e hora estão em UTC, no formato ISO 8601.
Autenticação
Toda requisição deve incluir uma chave de API no cabeçalho Authorization. As chaves têm o prefixo cvfly_sk_ e podem ser criadas no seu painel.
Authorization: Bearer cvfly_sk_live_abc123def456...Dica de segurança: nunca exponha chaves de API em código executado no cliente. Guarde-as em variáveis de ambiente e faça as chamadas à API a partir do seu servidor.
Escopos das chaves
As chaves de API podem ser limitadas a algumas operações. Uma chave criada sem lista de escopos recebe os escopos padrão.
| Escopo | Acesso |
|---|---|
| job:read | Ler jobs(padrão) |
| job:write | Criar, cancelar, repetir e excluir jobs e suas tarefas(padrão) |
| task:read | Ler tarefas(padrão) |
| convert | Executar conversões(padrão) |
| api-key:read | Listar chaves de API |
| api-key:write | Criar e revogar chaves de API |
| webhook:read | Listar webhooks |
| webhook:write | Criar e excluir webhooks |
Início rápido
Converta um PDF em DOCX em três etapas: crie um job, aguarde a conclusão e baixe o resultado.
Crie um job de conversão
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"Aguarde a conclusão
Consulte periodicamente o status do job ou use webhooks para receber notificações em tempo real.
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=..." }
]
}
}
]
}Baixe o resultado
Use a URL do resultado da tarefa de exportação. Os links de download são válidos por 1 hora; os arquivos são excluídos 24 horas após o envio.
curl -o result.docx "https://files.convertfly.io/d/..."Jobs
Um job é um contêiner para uma ou mais tarefas que formam um pipeline de conversão. As tarefas de um job são executadas na ordem das dependências: cada tarefa pode fazer referência à saída de uma tarefa anterior pelo campo input.
Conceito de pipeline
Um pipeline típico tem esta forma: import/url -> convert -> export/url. Você também pode encadear várias operações: import -> convert -> optimize -> watermark -> export.
Status dos jobs
| Status | Descrição |
|---|---|
| waiting | Job criado, na fila para processamento |
| processing | Pelo menos uma tarefa está em execução |
| finished | Todas as tarefas foram concluídas com sucesso |
| error | Uma ou mais tarefas falharam |
Criar um job
/api/v1/jobstagstringRótulo opcional para organizar os jobs (ex.: batch-2026-04).
tasksobjectobrigatórioUm mapa de nomes de tarefas para definições de tarefas. Os nomes das tarefas devem ser únicos dentro do job.
webhook_urlstringURL que receberá um evento job.finished ou job.failed quando o job terminar.
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" }
]
}Exemplo: juntar arquivos em um único PDF
A operação merge combina duas ou mais entradas (PDFs e/ou imagens) em um único PDF. Liste os nomes das tarefas de entrada, em ordem, no 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"]
}
}
}'Exemplo: capturar um site
A operação capture-website não precisa de tarefa de entrada: ela renderiza uma URL pública em 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"]
}
}
}'Obter um job
/api/v1/jobs/:idObtenha os detalhes do job e o status de todas as suas tarefas.
curl https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
-H "Authorization: Bearer cvfly_sk_..."Listar jobs
/api/v1/jobspageintegerNúmero da página, a partir de 1. Padrão: 1.
limitintegerResultados por página, de 1 a 100. Padrão: 20.
statusstringFiltrar por status: WAITING, PROCESSING, FINISHED, ERROR.
tagstringFiltrar por rótulo.
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
}
}Excluir um job
/api/v1/jobs/:idExclua um job e todos os arquivos associados. As tarefas em execução serão canceladas. Esta ação é irreversível.
curl -X DELETE https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
-H "Authorization: Bearer cvfly_sk_..."Aguardar a conclusão
/api/v1/jobs/:id/waitEndpoint de long polling que fica bloqueado até o job atingir um estado final (FINISHED ou ERROR). Expira após 300 segundos com um 202 Accepted se o job ainda estiver em processamento.
curl "https://convertfly.io/api/v1/jobs/job_7kX9mP2qR/wait?timeout=120" \
-H "Authorization: Bearer cvfly_sk_..."Tarefas
As tarefas são as etapas individuais de um job. Cada tarefa tem um nome (a chave no objeto tasks), uma operation e, opcionalmente, um array input que faz referência a nomes de tarefas anteriores.
Campos da tarefa
| Campo | Tipo | Descrição |
|---|---|---|
| operation | string | A operação a executar (ver Operações) |
| input | string[] | Nomes das tarefas cuja saída será usada como entrada |
| output_format | string | Formato de destino das operações de conversão |
| options | object | Configurações específicas da operação (qualidade, densidade etc.) |
Listar as tarefas de um 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..." }
}
]
}Obter uma tarefa
/api/v1/jobs/:job_id/tasks/:task_nameCancelar uma tarefa
/api/v1/jobs/:job_id/tasks/:task_name/cancelCancele uma tarefa em execução ou em espera. As tarefas seguintes que dependem dela também serão canceladas.
Repetir uma tarefa que falhou
/api/v1/jobs/:job_id/tasks/:task_name/retryRepita uma tarefa com status ERROR. Isso consome créditos novamente se a tarefa for cobrada.
Envio de arquivos
Há três maneiras de enviar arquivos ao ConvertFly. Escolha a que melhor se adapta ao seu caso.
Importar de uma URL
O método mais simples. O ConvertFly baixa o arquivo de uma URL acessível publicamente.
{
"import-file": {
"operation": "import/url",
"url": "https://example.com/document.pdf",
"filename": "document.pdf",
"headers": {
"Authorization": "Bearer your-external-token"
}
}
}Envio direto (URL pré-assinada)
Para arquivos no seu computador. O processo tem duas etapas: primeiro, crie a tarefa para obter uma URL de envio pré-assinada; depois, envie o arquivo para essa URL com 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.jpgImportar de Base64
Para arquivos pequenos (menos de 10 MB). Inclua o conteúdo do arquivo diretamente na requisição.
{
"import-file": {
"operation": "import/base64",
"file": "JVBERi0xLjQKJcOkw7zD...",
"filename": "document.pdf"
}
}| Método | Tamanho máx. | Ideal para |
|---|---|---|
| import/url | 5 GB | Arquivos já hospedados online |
| import/upload | 5 GB | Arquivos locais, arquivos grandes |
| import/base64 | 10 MB | Arquivos pequenos, incluídos na requisição |
Opções de conversão
Cada operação aceita opções específicas. Veja a seguir todas as operações disponíveis e os pares de formatos das conversões.
Operações disponíveis
| Operação | Descrição | Créditos |
|---|---|---|
| import/upload | Enviar um arquivo por URL pré-assinada | 0 |
| import/url | Importar um arquivo de uma URL | 0 |
| import/base64 | Importar um arquivo a partir de dados base64 | 0 |
| convert | Converter entre formatos | 1-4 |
| optimize | Comprimir/otimizar um arquivo | 1 |
| thumbnail | Gerar uma miniatura de pré-visualização | 1 |
| merge | Juntar vários PDFs e/ou imagens em um único PDF | 1 |
| watermark | Adicionar uma marca d'água de texto ou imagem a imagens, vídeos ou PDFs | 1 |
| split | Extraia páginas de um PDF ou divida-o em um PDF por página (ZIP) | 1 |
| rotate | Gire as páginas de um PDF em 90, 180 ou 270 graus | 1 |
| resize | Redimensione uma imagem por largura, altura ou porcentagem, mantendo as proporções | 1 |
| gif | Transforme um trecho de vídeo em um GIF animado (início, duração, fps, largura) | 2 |
| ocr | Reconhecer texto em PDFs ou imagens (14 idiomas, os mesmos da página de OCR) | 3 |
| capture-website | Capturar um site público em PDF, PNG ou JPG | 1 |
| metadata | Extrair os metadados do arquivo | 1 |
| export/url | Obter uma URL de download assinada | 0 |
| export/s3 | Exportar diretamente para o seu bucket S3 | 0 |
Pares de formatos compatíveis
Conversões mais usadas. O formato é detectado automaticamente a partir do arquivo, mas você também pode definir input_format explicitamente.
| Categoria | Formatos de entrada | Formatos de saída |
|---|---|---|
| Documentos | pdf, docx, doc, odt, rtf, txt, html | pdf, docx, odt, rtf, txt, html |
| Planilhas | xlsx, xls, ods, csv | xlsx, ods, csv, pdf |
| Apresentações | pptx, ppt, odp | pptx, odp, pdf |
| Imagens | jpg, png, gif, bmp, tiff, webp, svg, heic | jpg, png, gif, bmp, tiff, webp |
| Vídeo | mp4, avi, mov, mkv, webm | mp4, avi, mov, mkv, webm, gif |
| Áudio | mp3, wav, ogg, flac, aac, m4a | mp3, wav, ogg, flac, aac |
Opções de qualidade e processamento
Passe estas opções no objeto options de uma tarefa de conversão.
qualityintegerQualidade de saída para formatos com perda (1-100). Padrão: 85.
densityintegerDPI para conversões de documento em imagem. Padrão: 150.
widthintegerRedimensiona para esta largura em pixels. Mantém a proporção se height for omitido.
heightintegerRedimensiona para esta altura em pixels. Mantém a proporção se width for omitido.
pagesstringIntervalo de páginas para operações em documentos. Ex.: 1-5, 1,3,5, all.
{
"convert-hq": {
"operation": "convert",
"input": ["import-file"],
"output_format": "png",
"options": {
"density": 300,
"quality": 95
}
}
}Webhooks
Registre URLs de webhook para receber notificações em tempo real quando jobs ou tarefas mudarem de status. Todos os payloads são assinados com HMAC-SHA256 para que você possa verificar que vieram do ConvertFly.
Criar um webhook
/api/v1/webhooksurlstringobrigatórioA URL HTTPS que receberá os eventos de webhook.
eventsstring[]obrigatórioTipos de eventos a assinar.
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"
}
}Listar webhooks
/api/v1/webhooksExcluir um webhook
/api/v1/webhooks/:idTipos de eventos
| Evento | Gatilho |
|---|---|
| job.finished | Todas as tarefas do job foram concluídas com sucesso |
| job.failed | Uma ou mais tarefas falharam, o job está no estado ERROR |
| task.finished | Uma tarefa individual foi concluída |
| task.failed | Uma tarefa individual falhou |
Payload do webhook
{
"event": "job.finished",
"timestamp": "2026-04-03T10:31:15Z",
"data": {
"id": "job_7kX9mP2qR",
"status": "finished",
"tasks": { ... }
}
}Verificação das assinaturas
Cada requisição de webhook inclui dois cabeçalhos: X-Webhook-Signature e X-Webhook-Timestamp. Verifique-os para garantir que o payload foi enviado pelo ConvertFly e não foi adulterado.
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)Chaves de API
Gerencie chaves de API programaticamente. Você também pode gerenciar as chaves pelo painel.
Criar uma chave de API
/api/v1/api-keysnamestringobrigatórioUm nome descritivo para a chave.
scopesstring[]Permissões a conceder. Padrão: ["*"] (acesso total).
{
"data": {
"id": "key_Xk9m...",
"name": "production-server",
"key": "cvfly_sk_live_abc123def456...",
"scopes": ["*"],
"created_at": "2026-04-03T10:30:00Z"
}
}Importante: a chave de API completa só é exibida uma vez, no momento da criação. Guarde-a em local seguro: não será possível recuperá-la depois.
Listar chaves de API
/api/v1/api-keysRevogar uma chave de API
/api/v1/api-keys/:idInvalida a chave imediatamente. Qualquer requisição que a utilize retornará 401.
Limite de requisições
As requisições à API são limitadas por chave de API para garantir um uso justo. Quando você ultrapassa o limite, as requisições retornam 429 Too Many Requests.
Limite padrão
Cada chave de API permite 100 requisições por hora. O limite e a janela atuais de uma chave são retornados como rate_limit e rate_limit_window (segundos) quando você lista suas chaves. Entre em contato conosco se a sua integração precisar de um limite maior.
Cabeçalhos de resposta
Toda resposta a uma requisição feita com uma chave de API inclui estes cabeçalhos:
X-RateLimit-LimitcabeçalhoNúmero máximo de requisições permitidas na janela atual.
X-RateLimit-RemainingcabeçalhoRequisições restantes na janela atual.
X-RateLimit-ResetcabeçalhoCarimbo de data e hora Unix em que a janela é reiniciada.
Retry-AftercabeçalhoSegundos de espera antes de tentar novamente (somente em respostas 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."
}Erros
O ConvertFly usa os códigos de status HTTP convencionais. Todas as respostas de erro seguem um formato consistente, com um code legível por máquina e uma message legível por pessoas.
Formato das respostas de erro
{
"code": "INVALID_DATA",
"message": "Missing required field: output_format",
"details": {
"field": "output_format",
"reason": "required"
}
}Códigos de erro
| Código | HTTP | Descrição |
|---|---|---|
| INVALID_DATA | 400 | Corpo da requisição ou parâmetros inválidos |
| UNAUTHENTICATED | 401 | Chave de API ausente ou inválida |
| FORBIDDEN | 403 | A chave de API não tem o escopo necessário para esta operação |
| NOT_FOUND | 404 | O recurso não existe ou foi excluído |
| CONFLICT | 409 | O recurso já existe ou a operação entra em conflito com o estado atual |
| PAYLOAD_TOO_LARGE | 413 | O corpo da requisição excede o tamanho máximo permitido |
| UNSUPPORTED_FORMAT | 422 | A conversão solicitada não é compatível |
| RATE_LIMIT_EXCEEDED | 429 | Limite de requisições excedido: ver Limite de requisições |
| INSUFFICIENT_CREDITS | 402 | Créditos insuficientes para concluir a operação |
| SERVER_ERROR | 500 | Erro interno do servidor: tente novamente ou fale com o suporte |
| UNAVAILABLE | 503 | Serviço temporariamente indisponível: tente novamente em instantes |
Tratamento de erros
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éditos
Cada operação custa um determinado número de créditos. As operações de importação e exportação são gratuitas. Seu saldo restante é incluído em todas as respostas da API pelo cabeçalho X-Credits-Remaining.
Custo em créditos por tipo de conversão
| Operação | Custo | Exemplos |
|---|---|---|
| Importação / Exportação | Grátis | import/url, import/upload, export/url, export/s3 |
| Conversão de imagens | 1 crédito | jpg para png, webp para gif, heic para jpg |
| Conversão de áudio | 1 crédito | mp3 para wav, flac para aac |
| Documento para PDF | 1 crédito | txt para pdf, html para pdf, md para pdf |
| Office para PDF | 2 créditos | docx para pdf, pptx para pdf, xlsx para pdf |
| Conversão de vídeo | 2 créditos | mp4 para webm, mov para mp4 |
| PDF para Office | 4 créditos | pdf para docx, pdf para pptx |
| Otimização | 1 crédito | Comprimir imagens e PDFs |
| Miniatura | 1 crédito | Gerar uma imagem de pré-visualização |
| Junção | 1 crédito | Combinar vários PDFs |
| Marca d'água | 1 crédito | Adicionar sobreposição de texto/imagem |
| Dividir PDF | 1 crédito | Extrair as páginas 1-3, 7 ou um arquivo por página |
| Girar PDF | 1 crédito | Girar todas as páginas ou uma seleção |
| Redimensionar imagem | 1 crédito | 1200 px de largura, 50 por cento |
| Criar GIF | 2 créditos | Trecho mp4 para gif, mesmo preço de uma conversão de vídeo |
| Captura de site | 1 crédito | Renderizar uma URL em PDF ou imagem |
| OCR | 3 créditos | Tornar um PDF digitalizado pesquisável |
| Metadados | 1 crédito | Extrair informações do arquivo |
Consulta do saldo
Toda resposta da API inclui o cabeçalho X-Credits-Remaining com o seu saldo atual.
HTTP/1.1 201 Created
Content-Type: application/json
X-Credits-Remaining: 9847
X-Credits-Used: 2Quando o seu saldo é insuficiente para concluir um job, a API retorna 402 com o código de erro INSUFFICIENT_CREDITS. Recarregue créditos no seu painel de cobrança.
Sandbox
As chaves sandbox permitem criar e testar uma integração de ponta a ponta sem gastar créditos. Crie uma chave com "sandbox": true; ela tem o prefixo cf_test_ em vez de cvfly_sk_. Tudo funciona como em produção, com três diferenças.
| Créditos | Nunca cobrados. Seu saldo permanece intacto. |
| Tamanho do arquivo | As entradas são limitadas a 5 MB. |
| Resultado | Imagens, vídeos e PDFs recebem uma marca d'água "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 para começar a desenvolver?
Crie sua conta gratuita e teste a API com uma chave sandbox, sem custo.