# Changelog and beta status

> What the public beta includes, what it does not, known limits, deprecations, and dated changes to the API contract.

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

## Beta status

The API is in **public beta**. The contract lives under `/v1` and the [OpenAPI document](https://api.framequery.com/v1/api/openapi.json) is the source of truth. During the beta, changes are additive: new fields, endpoints and enum values can appear, so ignore fields you do not know and treat enum values you do not recognise as plain strings. Anything we have to remove is deprecated first and listed below.

**Included:** scene detection with captions, object labels, colour palettes and shot type and angle; speaker-labelled transcription with SRT, WebVTT and plain-text export; uploads, URL fetches and batches; multi-track audio; signed webhooks; per-stage, per-second billing with prepaid credits.

**Not included:** search or indexing endpoints, face recognition, NLE export (those are desktop-app features), word-level timestamps, team or organisation accounts, and scoped keys.

**Known limits:**

- Camera RAW formats are switched on one at a time; R3D comes first. `GET /formats` shows which are live.
- The Go, Rust and Ruby SDKs are at 0.1 until they adopt the 0.2 surface.
- The [MCP server](https://www.framequery.com/docs/mcp) is not released yet.

## Deprecations

| Deprecated | Use instead |
|---|---|
| The job `status` field and the `GET /jobs?status=` filter | `state` and `?state=` |
| `DELETE /jobs/{jobId}` | `POST /jobs/{jobId}/cancel` |
| `speakerTag` on transcript segments | `speaker` |
| `startTs` / `endTs` on scenes | `startTime` / `endTime` (the aliases go when SDK 0.1 is retired) |
| `errorMessage` on the job | `error.message` |
| The `uploading` state value in filters | `awaiting_upload` |

## 2026-10-13: v1 public beta contract

**Added**

- A derived job `state` (`awaiting_upload`, `queued`, `processing`, `completed`, `failed`, `cancelled`, `expired`) and per-stage `stages.{ingest,vision,transcript}` with `status`, timestamps and `error`.
- Every create endpoint returns the full Job object; jobs carry absolute `links` and your `metadata`.
- `GET /jobs/{jobId}/transcript` with `text`, `speakers` and a `speaker` label per segment, and SRT, WebVTT and plain-text export; `GET /jobs/{jobId}/scenes`.
- `RESULTS_NOT_READY` (retry) and `RESULTS_UNAVAILABLE` (never coming, with a `reason`).
- `POST /jobs/{jobId}/cancel`.
- Webhooks for `job.completed`, `job.failed` and `job.cancelled`, signed per account following Standard Webhooks, with secret rotation, a delivery log and a test endpoint.
- Errors carry `docUrl` and `param`; every retryable error carries `Retry-After`; idempotent replays carry `Idempotent-Replayed: true`.
- `GET /jobs` pagination with `hasMore`, `nextCursor` and a `Link` header.
- Keyless `GET /openapi.json`, `GET /pricing`, `GET /pricing/estimate` and `GET /formats`.
- Per-stage pricing: $1.15 vision and $0.35 transcript per footage-hour ($1.50 together), camera RAW $2.50, volume rates after 500 hours a month. Failed and skipped stages are never charged.
- Keys are Polar license keys (`fq_live_`), issued with credit purchases and managed from the dashboard.

**Changed**

- The `uploading` state is now `awaiting_upload` (`?state=uploading` still works).
- Rate limits are per account: 600 reads, 30 job creations and 120 other requests per minute.

**Removed**

- `POST /keys` and key revocation through the API: keys are issued and managed through the dashboard and Polar.
