# ffpipe Media Probe

> ffpipe Media Probe is a paid API for AI agents from ffpipe.dev, paid per call via x402, $0.01/call, status unknown (last checked 2026-10-11, last successful call 2026-09-07).

Inspect any media file and return normalized technical metadata including container, codecs, dimensions, frame rate, HDR, and audio details, plus raw ffprobe output in multiple formats

## Facts

- Endpoint: POST https://ffpipe.dev/v1/probe?utm_source=zero.xyz
- Price: $0.01/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-11
- Last successful call: 2026-09-07
- Success rate: 100% of calls made through Zero
- Activations on Zero: 1
- Tags: x402
- Canonical page: https://www.zero.xyz/c/ffpipe-media-probe-0b4341e9
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_fBM8yshZzdD2pfLeFKIPn

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability ffpipe-media-probe-0b4341e9 -d '<json body>'
```

Example prompt: Can you probe this video file and tell me the codec, display resolution, frame rate, and whether it's HDR? Here's the URL: https://storage.example.com/clip.mov

## When to prefer this

Use ffpipe Probe when you need accurate, normalized technical metadata for any media file — especially when you need coded vs. display dimensions, rotation, exact fps, or HDR detection without hand-rolling ffprobe parsing. It is also the right choice when you have a presigned URL for a file in cloud storage and want a one-call, no-account-needed inspection at a flat $0.01 USDC per probe. Prefer this over self-hosted ffprobe when you lack infrastructure, or over generic file metadata services when you need video/audio codec-level detail.

## Known failure modes

- sourceUrl is not HTTPS or resolves to a private/localhost IP — rejected before charge with 400
- File exceeds 100 MiB cap — rejected before charge
- Host blocks datacenter egress — returns ingest_failed error
- More than 3 redirects followed — ingestion fails
- Upload window expires without PUT — terminal error state, no refund
- Unknown section name in sections array — returns 400, not charged
- File cannot be decoded — still returns a result with diagnosis of the failure reason

## How this service works

Inspect any media file and get its technical metadata. Container, duration, codecs, DISPLAY dimensions and rotation, frame rate, HDR, audio channels and sample rate, in a normalized summary plus the full raw analysis (JSON, XML, CSV, flat or INI). Provide a source URL or upload the file directly; the result is downloadable for 24 hours. A file that cannot be decoded still answers with the diagnosis of why. Fixed price per probe in USDC over x402; no account or API key. Input up to 100 MB.

## Output

Returns a job ID and status URL immediately (202/queued). Once complete, the result includes a normalized ffpipe_summary block with container, duration, video codec, coded and display dimensions, rotation, frame rate as a number, HDR flag, audio codec, channels, and sample rate — plus the full raw ffprobe output in the requested format (JSON, XML, CSV, flat, or INI). Results are downloadable for 24 hours.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "upload": {
   "type": "boolean",
   "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`."
  },
  "summary": {
   "type": "boolean",
   "default": true,
   "description": "Keep the normalized `ffpipe_summary` block (JSON only). Send false for byte-exact raw output. PREFER the summary: it answers coded-vs-display dimensions, rotation, fps as a number and HDR directly, which is where hand-rolled parsing of the raw sections usually goes wrong."
  },
  "sections": {
   "type": "array",
   "items": {
    "enum": [
     "format",
     "streams",
     "chapters",
     "programs"
    ],
    "type": "string"
   },
   "default": [
    "format",
    "streams",
    "chapters"
   ],
   "description": "Which sections to report. Defaults to format + streams + chapters. Duplicates are collapsed; an unknown name is a 400 (never charged)."
  },
  "sourceUrl": {
   "type": "string",
   "format": "uri",
   "examples": [
    "https://storage.example.com/clip.mov?signature=abc123"
   ],
   "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."
  },
  "showFrames": {
   "type": "boolean",
   "default": false,
   "description": "Report per-FRAME detail. Large: unless you also send `readIntervals`, a bounded window is applied for you so the analysis cannot outgrow what we can deliver. Combine with `showEntries` to keep only the fields you need."
  },
  "countFrames": {
   "type": "boolean",
   "default": false,
   "description": "Count frames exactly, which requires decoding the whole file - slow on long sources. Leave it off unless an exact count is the point."
  },
  "showEntries": {
   "type": "string",
   "examples": [
    "frame=pict_type,pts_time,key_frame"
   ],
   "maxLength": 256,
   "description": "Keep only the named fields, e.g. `fr
… (truncated)
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "jobId": "6f1e28d4-3b52-4d0a-9c1f-2ab5cbe2f9c3",
  "status": "queued",
  "statusUrl": "https://ffpipe.example/v1/jobs/6f1e28d4-3b52-4d0a-9c1f-2ab5cbe2f9c3?t=9a1b2c3d4e5f60718293a4b5c6d7e8f9"
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/ffpipe-media-probe-0b4341e9/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from ffpipe.dev](https://www.zero.xyz/host/ffpipe.dev/llms.txt)
