One pipeline. Every file operation.

Write upload, scan, transform, store, and serve as steps in one pipeline. A single run does all of it. You watch every run, verify signed webhooks, scope each API key, and give your team roles.

pipeline.jsondeclarative
{  "steps": [    { "id": "verify", "use": "file/verify",      "input": ":original" },    { "id": "scan", "use": "file/virusscan",      "input": ":verify" },    { "id": "thumb", "use": "image/resize",      "input": ":scan", "params": { "width": 512 } },    { "id": "serve", "use": "file/serve",      "input": ":thumb" }  ]}

Pipelines as JSON.

Save a pipeline through the API, or send a definition inline with a run. A pipeline is a steps array. Each step names a processor and its input.

Steps route by reference.

Each step's input points at a prior step's output by id (:stepId) or the original upload (:original). Those references are the routing. Each output flows into the next step's input. Forward references and cycles are rejected before a run starts.

  • Reference :original or any prior :stepId
  • Set params and inputs at the step or pipeline level
  • Validated as a DAG. Forward refs and cycles are rejected

Real processors.

Add any of these as a use step.

  • image/resizeResize images
  • image/convertConvert formats
  • image/compressCompress images
  • document/convertConvert documents
  • document/thumbsDocument thumbnails
  • file/hashContent hash
  • file/verifyVerify by magic bytes
  • file/virusscanVirus scan
  • file/serveSigned delivery URL
  • s3/storeStore to S3
  • cloudflare/storeStore to R2
  • speech/transcribeTranscribe audio
  • image/ocrExtract text
  • image/describeDescribe images

See what each run did.

A run reports its own status and every step's status, outputs, errors, and timing. When a step fails, you get a machine-readable reason instead of a guess.

  • Run status: queued, running, succeeded, failed, cancelled
  • Per-step status, outputs, and errors
  • Timing: startedAt, finishedAt, durationMs
  • Per-step usage and billing events
GET /v1/runs/run_3xk2succeeded
verify42mssucceeded
scan610mssucceeded
thumb180mssucceeded
serve11mssucceeded
failure reasons
timeoutcrashquota_exceededcancelledagent_offlinetemplate_errorprocessor_error

Signed webhooks on every run.

Subscribe to pipeline.run.succeeded and pipeline.run.failed. Filebot signs every delivery, so you verify each one came from us.

HMAC-SHA256 signatures

Each delivery carries an X-Filebot-Signature v1= header with a timestamp. You verify it against a replay window.

Automatic retries

Failed deliveries retry with exponential backoff. Up to 6 attempts from one minute to one day, then dead-letter.

Delivery attempts

List every delivery attempt for a webhook. You see what was sent and when.

Retries on every webhook and queued job.

A brief failure should not lose work. Webhook deliveries and queued jobs both retry on their own. A short outage stays an outage and does not become a dropped event.

Webhook delivery retries

Exponential backoff up to 6 attempts, then a dead-letter. Nothing drops in silence.

Queue-level job retries

Queued processing jobs retry on their own. One brief error does not fail the run.

Scoped API keys.

Every API key carries resource and action scopes. A key does only what you grant it. Secrets show once at creation and are stored hashed.

  • Resources: runs, pipelines, webhooks, credentials
  • Actions: read, write, or * for full access
  • Secrets are reveal-once and stored hashed
  • SSRF guards on imports and webhook targets
API key scopes
least privilege by default
{
  "runs": ["read", "write"],
  "webhooks": ["read"]
}

Users, roles, and permissions.

An organization groups your team. Each member holds a role, you invite by email, and an audit log records the changes.

Owner, admin, member

Three roles scope what each member does.

Email invitations

Invite teammates to your organization by email.

Audit log

Filebot records member and API-key changes.

Start building in minutes.

A few lines, and you're live. No credit card needed.