ToolAssay

Convert any video to a clean, web-ready MP4

Convert any video to a clean, web-ready MP4. Provide a source URL or upload the file directly; the paid request returns a status URL to poll, and the finished MP4 (plus a thumbnail) is downloadable for 24 hours. Fixed price per conversion in USDC over x402; no account or API key. Failures on our side automatically mint a free retry voucher. Input up to 100 MB.

Not tested: has real-world effectsour last check, 2026-09-24
0 of 0checks answered this week
n/amedian answer time
$0.02listed price per call
n/aprice it asked us

Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.

Endpoint

POST https://ffpipe.dev/v1/convert

CategoryImage and media
Provider hostffpipe.dev
Networkseip155:8453
Payment schemesexact
Self-reported calls, 30 days23 from 3 payers (the provider's figure, not ours)

Our checks, last 30 days

We never call tools that send, buy, move money or file anything, not even without paying.

Example input (from the provider)

{
  "body": {
    "maxHeight": 720,
    "maxWidth": 1280,
    "sourceUrl": "https://storage.example.com/clip.mov?signature=abc123"
  },
  "bodyType": "json",
  "method": "POST",
  "type": "http"
}

Promised output schema (from the provider)

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "input": {
      "additionalProperties": false,
      "properties": {
        "body": {
          "additionalProperties": true,
          "description": "Provide EXACTLY ONE of sourceUrl (we fetch it) or upload: true (you PUT the bytes to the uploadUrl returned in the 202). Unknown properties are ignored; validation runs before any charge.",
          "oneOf": [
            {
              "required": [
                "sourceUrl"
              ]
            },
            {
              "required": [
                "upload"
              ]
            }
          ],
          "properties": {
            "maxHeight": {
              "default": 1080,
              "description": "Max output height.",
              "maximum": 4096,
              "minimum": 1,
              "type": "integer"
            },
            "maxWidth": {
              "default": 1920,
              "description": "Max output width. Must be a positive integer (JSON number, not a string).",
              "maximum": 4096,
              "minimum": 1,
              "type": "integer"
            },
            "sourceUrl": {
              "description": "https URL we fetch the input from. Rejected before any charge if it is not https, is an IP literal, or resolves to a localhost/.internal/.local name; redirects are followed (max 3) and every hop is re-checked. We fetch from datacenter IP ranges - hosts that block datacenter egress will fail with `ingest_failed`, so prefer a presigned URL from storage you control. Body size cap: 100 MiB by default, enforced while streaming.",
              "examples": [
                "https://storage.example.com/clip.mov?signature=abc123"
              ],
              "format": "uri",
              "type": "string"
            },
            "upload": {
              "const": true,
              "description": "Push intake: instead of a `sourceUrl`, reserve an upload window and PUT the raw bytes (<= 100 MiB, same cap) to the `uploadUrl` in the 202 before `uploadExpiresAt`. You are charged at the 202, before any bytes move: letting the window expire is a terminal `error` with no refund; a pipeline failure after your upload earns a `retryVoucher`.",
              "type": "boolean"
            }
          }
        },
        "bodyType": {
          "enum": [
            "json",
            "form-data",
            "text"
          ],
          "type": "string"
        },
        "method": {
          "enum": [
            "POST"
          ],
          "type": "string"
        },
        "type": {
          "const": "http",
          "type": "string"
        }
      },
      "required": [
        "type",
        "method",
        "bodyType",
        "body"
      ],
      "type": "object"
    },
    "output": {
      "properties": {
        "example": {
          "description": "The 202 acceptance body. Every non-2xx answer is JSON { error: { code, message } } with code one of: invalid_request, invalid_source_url, source_too_large, ingest_failed, pipeline_error, payment_denied, rate_limited, daily_cap_exceeded, not_found, literal_path_template, gone, unknown_job, unauthorized, not_configured, unavailable - and, by the capture rule, a non-2xx response is never charged.",
          "properties": {
            "fundingSource": {
              "description": "What paid for this acceptance: `x402` (the on-chain payment you signed), `credits` (your account's balance, when you sent a Bearer token) or `voucher` (a free retry). Stated back to you so a caller holding both a token and a wallet never has to guess which one it just spent.",
              "enum": [
                "x402",
                "credits",
                "voucher"
              ],
              "type": "string"
            },
            "jobId": {
              "format": "uuid",
              "type": "string"
            },
            "status": {
              "description": "`queued` for pull mode; `awaiting_upload` for upload mode (the job queues when your PUT completes).",
              "enum": [
                "queued",
                "awaiting_upload"
              ],
              "type": "string"
            },
            "statusUrl": {
              "description": "Free, token-gated status endpoint for this job. Keep it: the token is the only proof of ownership and is not recoverable.",
              "format": "uri",
              "type": "string"
            },
            "uploadExpiresAt": {
              "description": "Upload mode only: deadline for the PUT. Past it the job becomes a terminal `error` with no refund.",
              "format": "date-time",
              "type": "string"
            },
            "uploadUrl": {
              "description": "Upload mode only: PUT the raw bytes here before `uploadExpiresAt`. Keep it - this response is the ONLY place the upload token is handed out (the status route never repeats it), and it is not recoverable.",
              "format": "uri",
              "type": "string"
            }
          },
          "required": [
            "jobId",
            "status",
            "statusUrl"
          ],
          "type": "object"
        },
        "type": {
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    }
  },
  "required": [
    "input"
  ],
  "type": "object"
}

This page as JSON