# Formats and limits

> Anything FFmpeg can decode, audio-only files, and camera RAW where enabled. Size and duration limits per tier, and the live GET /formats endpoint.

Source: https://www.framequery.com/docs/formats (updated 2026-10-13)

## Check the live list

`GET /formats` needs no key and always reflects what the API accepts right now, including which camera RAW formats are switched on:

```bash
curl https://api.framequery.com/v1/api/formats
```

```json
{
  "data": {
    "standard": ["mp4", "mov", "m4v", "mkv", "webm", "avi", "mxf", "…", "mp3", "wav", "flac", "m4a"],
    "audioOnly": ["mp3", "wav", "aiff", "aif", "flac", "aac", "m4a", "ogg", "oga", "opus", "wma", "amr", "ac3", "caf"],
    "raw": { "r3d": true, "braw": false, "arri": false },
    "rawExtensions": { "r3d": "r3d", "nev": "r3d", "braw": "braw", "ari": "arri", "arx": "arri" },
    "blocked": ["app", "bat", "cmd", "exe", "…"],
    "unknownExtensions": "accepted",
    "limits": {
      "standardMaxBytes": 21474836480,
      "rawMaxBytes": 107374182400,
      "maxDurationSec": 43200,
      "uploadUrlExpirySeconds": 3600
    }
  }
}
```

The values above are illustrative; trust the live response.

## Standard formats

The standard tier covers anything FFmpeg can decode. The advertised video extensions are `mp4`, `mov`, `m4v`, `mkv`, `webm`, `avi`, `wmv`, `asf`, `flv`, `f4v`, `ts`, `m2ts`, `mts`, `mpg`, `mpeg`, `mpe`, `m2v`, `vob`, `3gp`, `3g2`, `mxf`, `dv`, `gxf`, `lxf`, `ogv`, `ogm`, `rm`, `rmvb`, `y4m`, `ivf`, `h264`, `264`, `h265`, `hevc`, `mjpeg`, `mjpg`, `mod`, `tod`, `dvr-ms` and `nut`, which covers H.264, H.265/HEVC, ProRes, DNxHD/DNxHR, AV1, VP9 and the other common codecs inside them.

Unknown extensions are accepted too: the file is probed with FFprobe when processing starts, and a file it cannot decode fails with job error `VALIDATION_FAILED` (never charged).

## Audio-only files

`mp3`, `wav`, `aiff`, `aif`, `flac`, `aac`, `m4a`, `ogg`, `oga`, `opus`, `wma`, `amr`, `ac3` and `caf` are processed as audio. There is no picture, so the vision stage is `skipped` and the job is billed at the transcript rate even with `processingMode: "all"`. Requesting scenes returns `404 RESULTS_UNAVAILABLE` with `reason: "audio_only_input"`.

## Camera RAW

Camera RAW is decoded on GPUs with the camera makers' SDKs and priced on its own [RAW tier](https://www.framequery.com/docs/pricing). Each format is switched on separately; `raw` in `GET /formats` says which ones are live.

| Format | Extensions | Format key |
|---|---|---|
| RED R3D | `.r3d`, `.nev` | `r3d` |
| Blackmagic RAW | `.braw` | `braw` |
| ARRIRAW | `.ari`, `.arx` | `arri` |

Creating a job for a RAW format that is not enabled fails at once with `415` [`UNSUPPORTED_FORMAT`](https://www.framequery.com/docs/errors#UNSUPPORTED_FORMAT). R3D is the first RAW format enabled in the beta; BRAW and ARRIRAW are planned.

## Blocked file types

Executables and scripts (`exe`, `bat`, `cmd`, `sh`, `py`, `js`, `jar`, `dll`, `msi`, `ps1` and similar) are refused at creation with `415 UNSUPPORTED_FORMAT`. The full list is `blocked` in `GET /formats`.

## Limits

| Limit | Standard | Camera RAW |
|---|---|---|
| File size | 20 GiB (21 474 836 480 bytes) | 100 GiB (107 374 182 400 bytes) |
| Duration per file | 12 hours | 12 hours |
| Upload URL lifetime | 1 hour | 1 hour |
| Separate audio tracks per job | 16 | 16 |
| Clips per batch request | 100 | 100 |
| Minimum billable duration | 30 seconds | 30 seconds |

- Send `fileSizeBytes` on `POST /jobs` and an oversize file fails immediately with `413` [`FILE_TOO_LARGE`](https://www.framequery.com/docs/errors#FILE_TOO_LARGE) (the body includes `maxUploadBytes` and `formatTier`). The upload URL also enforces the limit.
- A file longer than the duration limit fails during ingest with `VALIDATION_FAILED`. Need longer files or a higher size limit? [Contact us](https://www.framequery.com/contact); limits can be raised per account.
- Request and rate limits are on [Rate limits](https://www.framequery.com/docs/rate-limits).

## Getting media to us cheaply

- **Direct upload** (`POST /jobs`) goes straight to Google Cloud Storage and costs you nothing in transfer fees.
- **From a URL**: you pay whatever your storage provider charges for egress. A provider without egress fees, such as Cloudflare R2, makes URL jobs free to fetch; for large RAW files in a cloud that does charge egress, the transfer can cost more than the processing.
