ffpipe · Schema
ProbeRequest
EXACTLY ONE of `sourceUrl` or `upload: true` is required. Every option below is optional and every number/boolean must be a JSON number/boolean, not a string. Validation runs before any charge.
MediaPaymentsVideoAutomation
Properties
| Name | Type | Description |
|---|---|---|
| sourceUrl | object | |
| upload | object | |
| outputFormat | string | Format of the delivered analysis. `json` (the default) is the only one that carries the normalized `ffpipe_summary` block; the others are the raw writer output, untouched. `flat` is delivered as .txt. |
| sections | array | Which sections to report. Defaults to format + streams + chapters. Duplicates are collapsed; an unknown name is a 400 (never charged). |
| summary | boolean | 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, wh |
| selectStreams | string | Restrict the analysis to matching streams, e.g. `v:0` (first video stream) or `a` (all audio). A specifier that matches nothing still succeeds and says so. |
| showFrames | boolean | 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 th |
| showPackets | boolean | Report per-PACKET detail. Same bounded-window treatment as `showFrames`. |
| showEntries | string | Keep only the named fields, e.g. `frame=pict_type,pts_time,key_frame` or `format=duration`. Section and field names only; a malformed expression is a 400 (never charged) rather than a job that cannot |
| readIntervals | string | Limit the analysis to a window, e.g. `%+60` (the first 60 seconds), `30%+10` (10 seconds from 0:30) or `%+#500` (the first 500 packets). Applied automatically when frame/packet detail is requested wit |
| countFrames | boolean | Count frames exactly, which requires decoding the whole file - slow on long sources. Leave it off unless an exact count is the point. |
| countPackets | boolean | Count packets exactly. Same cost caveat as `countFrames`. |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/ffpipe-dev/json-schema/ffpipe-dev-probe-request-schema.json",
"title": "ProbeRequest",
"description": "EXACTLY ONE of `sourceUrl` or `upload: true` is required. Every option below is optional and every number/boolean must be a JSON number/boolean, not a string. Validation runs before any charge.",
"x-generated": "2026-11-07",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/ffpipe-dev-openapi.json#/components/schemas/ProbeRequest",
"type": "object",
"additionalProperties": true,
"properties": {
"sourceUrl": {
"$ref": "#/$defs/SourceUrl"
},
"upload": {
"$ref": "#/$defs/UploadFlag"
},
"outputFormat": {
"type": "string",
"enum": [
"json",
"xml",
"csv",
"flat",
"ini"
],
"default": "json",
"description": "Format of the delivered analysis. `json` (the default) is the only one that carries the normalized `ffpipe_summary` block; the others are the raw writer output, untouched. `flat` is delivered as .txt."
},
"sections": {
"type": "array",
"items": {
"type": "string",
"enum": [
"format",
"streams",
"chapters",
"programs"
]
},
"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)."
},
"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."
},
"selectStreams": {
"type": "string",
"maxLength": 256,
"description": "Restrict the analysis to matching streams, e.g. `v:0` (first video stream) or `a` (all audio). A specifier that matches nothing still succeeds and says so."
},
"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."
},
"showPackets": {
"type": "boolean",
"default": false,
"description": "Report per-PACKET detail. Same bounded-window treatment as `showFrames`."
},
"showEntries": {
"type": "string",
"maxLength": 256,
"description": "Keep only the named fields, e.g. `frame=pict_type,pts_time,key_frame` or `format=duration`. Section and field names only; a malformed expression is a 400 (never charged) rather than a job that cannot succeed."
},
"readIntervals": {
"type": "string",
"maxLength": 256,
"description": "Limit the analysis to a window, e.g. `%+60` (the first 60 seconds), `30%+10` (10 seconds from 0:30) or `%+#500` (the first 500 packets). Applied automatically when frame/packet detail is requested without one. A malformed expression is a 400 (never charged)."
},
"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."
},
"countPackets": {
"type": "boolean",
"default": false,
"description": "Count packets exactly. Same cost caveat as `countFrames`."
}
},
"$defs": {
"SourceUrl": {
"type": "string",
"format": "uri",
"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."
},
"UploadFlag": {
"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`."
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/ffpipe-dev-probe-request"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.