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.

URL basehttps://convertfly.io/api/v1

Todos 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.

Cabeçalho HTTP
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.

EscopoAcesso
job:readLer jobs(padrão)
job:writeCriar, cancelar, repetir e excluir jobs e suas tarefas(padrão)
task:readLer tarefas(padrão)
convertExecutar conversões(padrão)
api-key:readListar chaves de API
api-key:writeCriar e revogar chaves de API
webhook:readListar webhooks
webhook:writeCriar 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.

1

Crie um job de conversão

curl
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"]
      }
    }
  }'
JavaScript
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"
Python
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"
2

Aguarde a conclusão

Consulte periodicamente o status do job ou use webhooks para receber notificações em tempo real.

curl
curl https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
  -H "Authorization: Bearer cvfly_sk_live_abc123..."
Resposta
{
  "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=..." }
        ]
      }
    }
  ]
}
3

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

StatusDescrição
waitingJob criado, na fila para processamento
processingPelo menos uma tarefa está em execução
finishedTodas as tarefas foram concluídas com sucesso
errorUma ou mais tarefas falharam

Criar um job

POST/api/v1/jobs
tagstring

Rótulo opcional para organizar os jobs (ex.: batch-2026-04).

tasksobjectobrigatório

Um mapa de nomes de tarefas para definições de tarefas. Os nomes das tarefas devem ser únicos dentro do job.

webhook_urlstring

URL que receberá um evento job.finished ou job.failed quando o job terminar.

curl
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"]
      }
    }
  }'
Resposta (201 Created)
{
  "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
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
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

GET/api/v1/jobs/:id

Obtenha os detalhes do job e o status de todas as suas tarefas.

curl
curl https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
  -H "Authorization: Bearer cvfly_sk_..."

Listar jobs

GET/api/v1/jobs
pageinteger

Número da página, a partir de 1. Padrão: 1.

limitinteger

Resultados por página, de 1 a 100. Padrão: 20.

statusstring

Filtrar por status: WAITING, PROCESSING, FINISHED, ERROR.

tagstring

Filtrar por rótulo.

curl
curl "https://convertfly.io/api/v1/jobs?status=finished&per_page=5" \
  -H "Authorization: Bearer cvfly_sk_..."
Resposta
{
  "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

DELETE/api/v1/jobs/:id

Exclua um job e todos os arquivos associados. As tarefas em execução serão canceladas. Esta ação é irreversível.

curl
curl -X DELETE https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
  -H "Authorization: Bearer cvfly_sk_..."

Aguardar a conclusão

GET/api/v1/jobs/:id/wait

Endpoint 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
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

CampoTipoDescrição
operationstringA operação a executar (ver Operações)
inputstring[]Nomes das tarefas cuja saída será usada como entrada
output_formatstringFormato de destino das operações de conversão
optionsobjectConfigurações específicas da operação (qualidade, densidade etc.)

Listar as tarefas de um job

GET/api/v1/jobs/:id/tasks
Resposta
{
  "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

GET/api/v1/jobs/:job_id/tasks/:task_name

Cancelar uma tarefa

POST/api/v1/jobs/:job_id/tasks/:task_name/cancel

Cancele uma tarefa em execução ou em espera. As tarefas seguintes que dependem dela também serão canceladas.

Repetir uma tarefa que falhou

POST/api/v1/jobs/:job_id/tasks/:task_name/retry

Repita 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.

Definição da tarefa
{
  "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.

Etapa 1: criar o job com import/upload
{
  "upload-file": {
    "operation": "import/upload",
    "filename": "photo.jpg"
  }
}
Etapa 2: enviar para a URL pré-assinada
# 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.jpg

Importar de Base64

Para arquivos pequenos (menos de 10 MB). Inclua o conteúdo do arquivo diretamente na requisição.

Definição da tarefa
{
  "import-file": {
    "operation": "import/base64",
    "file": "JVBERi0xLjQKJcOkw7zD...",
    "filename": "document.pdf"
  }
}
MétodoTamanho máx.Ideal para
import/url5 GBArquivos já hospedados online
import/upload5 GBArquivos locais, arquivos grandes
import/base6410 MBArquivos 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çãoDescriçãoCréditos
import/uploadEnviar um arquivo por URL pré-assinada0
import/urlImportar um arquivo de uma URL0
import/base64Importar um arquivo a partir de dados base640
convertConverter entre formatos1-4
optimizeComprimir/otimizar um arquivo1
thumbnailGerar uma miniatura de pré-visualização1
mergeJuntar vários PDFs e/ou imagens em um único PDF1
watermarkAdicionar uma marca d'água de texto ou imagem a imagens, vídeos ou PDFs1
splitExtraia páginas de um PDF ou divida-o em um PDF por página (ZIP)1
rotateGire as páginas de um PDF em 90, 180 ou 270 graus1
resizeRedimensione uma imagem por largura, altura ou porcentagem, mantendo as proporções1
gifTransforme um trecho de vídeo em um GIF animado (início, duração, fps, largura)2
ocrReconhecer texto em PDFs ou imagens (14 idiomas, os mesmos da página de OCR)3
capture-websiteCapturar um site público em PDF, PNG ou JPG1
metadataExtrair os metadados do arquivo1
export/urlObter uma URL de download assinada0
export/s3Exportar diretamente para o seu bucket S30

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.

CategoriaFormatos de entradaFormatos de saída
Documentospdf, docx, doc, odt, rtf, txt, htmlpdf, docx, odt, rtf, txt, html
Planilhasxlsx, xls, ods, csvxlsx, ods, csv, pdf
Apresentaçõespptx, ppt, odppptx, odp, pdf
Imagensjpg, png, gif, bmp, tiff, webp, svg, heicjpg, png, gif, bmp, tiff, webp
Vídeomp4, avi, mov, mkv, webmmp4, avi, mov, mkv, webm, gif
Áudiomp3, wav, ogg, flac, aac, m4amp3, wav, ogg, flac, aac

Opções de qualidade e processamento

Passe estas opções no objeto options de uma tarefa de conversão.

qualityinteger

Qualidade de saída para formatos com perda (1-100). Padrão: 85.

densityinteger

DPI para conversões de documento em imagem. Padrão: 150.

widthinteger

Redimensiona para esta largura em pixels. Mantém a proporção se height for omitido.

heightinteger

Redimensiona para esta altura em pixels. Mantém a proporção se width for omitido.

pagesstring

Intervalo de páginas para operações em documentos. Ex.: 1-5, 1,3,5, all.

Exemplo: PNG de alta qualidade a 300 DPI
{
  "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

POST/api/v1/webhooks
urlstringobrigatório

A URL HTTPS que receberá os eventos de webhook.

eventsstring[]obrigatório

Tipos de eventos a assinar.

curl
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"]
  }'
Resposta (201 Created)
{
  "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

GET/api/v1/webhooks

Excluir um webhook

DELETE/api/v1/webhooks/:id

Tipos de eventos

EventoGatilho
job.finishedTodas as tarefas do job foram concluídas com sucesso
job.failedUma ou mais tarefas falharam, o job está no estado ERROR
task.finishedUma tarefa individual foi concluída
task.failedUma tarefa individual falhou

Payload do webhook

POST para a sua URL de 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.

Node.js
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)
  );
}
Python
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

POST/api/v1/api-keys
namestringobrigatório

Um nome descritivo para a chave.

scopesstring[]

Permissões a conceder. Padrão: ["*"] (acesso total).

Resposta (201 Created)
{
  "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

GET/api/v1/api-keys

Revogar uma chave de API

DELETE/api/v1/api-keys/:id

Invalida 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çalho

Número máximo de requisições permitidas na janela atual.

X-RateLimit-Remainingcabeçalho

Requisições restantes na janela atual.

X-RateLimit-Resetcabeçalho

Carimbo de data e hora Unix em que a janela é reiniciada.

Retry-Aftercabeçalho

Segundos de espera antes de tentar novamente (somente em respostas 429).

Exemplo de resposta 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

JSON
{
  "code": "INVALID_DATA",
  "message": "Missing required field: output_format",
  "details": {
    "field": "output_format",
    "reason": "required"
  }
}

Códigos de erro

CódigoHTTPDescrição
INVALID_DATA400Corpo da requisição ou parâmetros inválidos
UNAUTHENTICATED401Chave de API ausente ou inválida
FORBIDDEN403A chave de API não tem o escopo necessário para esta operação
NOT_FOUND404O recurso não existe ou foi excluído
CONFLICT409O recurso já existe ou a operação entra em conflito com o estado atual
PAYLOAD_TOO_LARGE413O corpo da requisição excede o tamanho máximo permitido
UNSUPPORTED_FORMAT422A conversão solicitada não é compatível
RATE_LIMIT_EXCEEDED429Limite de requisições excedido: ver Limite de requisições
INSUFFICIENT_CREDITS402Créditos insuficientes para concluir a operação
SERVER_ERROR500Erro interno do servidor: tente novamente ou fale com o suporte
UNAVAILABLE503Serviço temporariamente indisponível: tente novamente em instantes

Tratamento de erros

JavaScript
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çãoCustoExemplos
Importação / ExportaçãoGrátisimport/url, import/upload, export/url, export/s3
Conversão de imagens1 créditojpg para png, webp para gif, heic para jpg
Conversão de áudio1 créditomp3 para wav, flac para aac
Documento para PDF1 créditotxt para pdf, html para pdf, md para pdf
Office para PDF2 créditosdocx para pdf, pptx para pdf, xlsx para pdf
Conversão de vídeo2 créditosmp4 para webm, mov para mp4
PDF para Office4 créditospdf para docx, pdf para pptx
Otimização1 créditoComprimir imagens e PDFs
Miniatura1 créditoGerar uma imagem de pré-visualização
Junção1 créditoCombinar vários PDFs
Marca d'água1 créditoAdicionar sobreposição de texto/imagem
Dividir PDF1 créditoExtrair as páginas 1-3, 7 ou um arquivo por página
Girar PDF1 créditoGirar todas as páginas ou uma seleção
Redimensionar imagem1 crédito1200 px de largura, 50 por cento
Criar GIF2 créditosTrecho mp4 para gif, mesmo preço de uma conversão de vídeo
Captura de site1 créditoRenderizar uma URL em PDF ou imagem
OCR3 créditosTornar um PDF digitalizado pesquisável
Metadados1 créditoExtrair informações do arquivo

Consulta do saldo

Toda resposta da API inclui o cabeçalho X-Credits-Remaining com o seu saldo atual.

Cabeçalhos de resposta
HTTP/1.1 201 Created
Content-Type: application/json
X-Credits-Remaining: 9847
X-Credits-Used: 2

Quando 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éditosNunca cobrados. Seu saldo permanece intacto.
Tamanho do arquivoAs entradas são limitadas a 5 MB.
ResultadoImagens, vídeos e PDFs recebem uma marca d'água "ConvertFly SANDBOX".
Criar uma chave 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": true

Pronto para começar a desenvolver?

Crie sua conta gratuita e teste a API com uma chave sandbox, sem custo.

Os seus dados

Sem publicidade nem redes de anúncios, portanto nada para recusar. Veja o que usamos.

Os seus arquivos

Armazenados com criptografia e excluídos 24 horas após o envio.

Cookies essenciais

Sempre ativos
Para que serveNomeDuração
Lembrar o seu idiomaNEXT_LOCALEAté fechar o navegador
Contar a sua cota gratuitacf_free1 ano
Manter o seu loginauthjs.*30 dias, se tiver uma conta

Plausible, hospedado pela Dizzus, sem cookies. Vemos totais, não pessoas.

Fornecedores: Stripe para pagamentos, Cloudflare para DNS e proteção contra bots. Política de privacidade