# Changelog

Changes to the realpng API and MCP server, newest first.

## October 14, 2026

`POST /audit` checks voice clips. Calls with an image or a video work as before.

- [`POST /audit`](/docs/api-reference/audit-image) takes `audio_url` or `audio_upload_id`, an MP3, WAV or M4A, and `seconds` when you know the clip's length. [Check a voice clip](/docs/guides/check-a-voice-clip) covers it.
- A voice check is a job, polled at [`GET /audit/{id}`](/docs/api-reference/get-check). Its answer carries `media: "audio"`, a `voice` lane in place of `pixels` and `watermark`, and `audio`, each window's reading. `decided_by` can be `voice`.
- A voice clip costs what a video check costs. Only as much of a clip as `seconds` covers is read. `POST /optimize` refuses a voice clip with `unsupported_media`.
- `POST /uploads` and `request_upload` take MP3, WAV and M4A up to the [video limit](/docs/credits-and-limits#video-limits).
- New error codes: `audio_too_long`, `audio_too_large`, `audio_unsupported` and `audio_unreachable`, as [Errors](/docs/errors) lists.
- The MCP server adds `audit_audio`. `get_processing_result` resumes it.

## October 8, 2026

Both endpoints take videos. Calls with an image work as before, and every answer now says which kind it holds.

- [`POST /audit`](/docs/api-reference/audit-image) and [`POST /optimize`](/docs/api-reference/start-optimization) take `video_url` or `video_upload_id`, and `seconds`, the video's length, when you know it. [Check and optimize a video](/docs/guides/check-and-optimize-a-video) covers them.
- A video check is a job. `POST /audit` answers it with 202 and its `id`, and the new [`GET /audit/{id}`](/docs/api-reference/get-check) returns its verdict with each frame's reading.
- A finished video optimization returns `file_url`, the optimized MP4, and `video`, each frame's optimization score. The new [`GET /optimize/{id}/file`](/docs/api-reference/download-file) downloads either kind, and `GET /optimize/{id}/image` stays as the same download.
- Every answer from `POST /audit`, `POST /optimize`, `GET /optimize/{id}` and the webhook carries `media`, `image` or `video`. A finished image optimization also carries `file_url`. The webhook's sample signatures in [Verify the signature](/docs/guides/optimize-an-image#verify-the-signature) are new, since the bodies they sign changed.
- `POST /uploads` and `request_upload` take MP4, MOV and WebM up to the [video limit](/docs/credits-and-limits#video-limits).
- New error codes: `video_too_long`, `video_too_large`, `video_unsupported` and `video_unreachable`, as [Errors](/docs/errors) lists.
- The MCP server adds two tools, `audit_video` and `process_video`. `get_processing_result` resumes either kind of job.
- The spec adds the `Media`, `Check`, `CheckedVideo`, `OptimizedVideo`, `VideoFacts` and `LengthDetail` schemas. Regenerate any client built from it.

## October 7, 2026

A finished optimization returns `optimization_score`, 100 minus our detectors' AI reading of the optimized file, in place of `audit`. This is a breaking change, so update any code that reads `audit` from an optimization.

- [`GET /optimize/{id}`](/docs/api-reference/get-optimization), the webhook and the MCP tools `process_image` and `get_processing_result` return `optimization_score`: a `score` from 0 to 100 and a `zone` of `high`, `good` or `low`. [Read the optimization score](/docs/guides/optimize-an-image#read-the-optimization-score) explains them.
- An optimization no longer returns a check of the optimized image, and `GET /optimize/{id}` no longer takes `detail=full`. `POST /audit` and its `detail=full` do not change.
- The webhook body is the job as `GET /optimize/{id}` answers it, on one line with no space between JSON items. It is still signed over its raw bytes in `RealPNG-Signature`, so a receiver that verifies the raw body needs no change. The [sample signatures](/docs/guides/optimize-an-image#verify-the-signature) are new.
- [`GET /optimize/{id}/image`](/docs/api-reference/download-optimization) answers 200 with the PNG as an attachment, in place of a 302 redirect to storage. A client that follows redirects needs no change.
- An error the engine reports, in a failed optimization or an error response, carries our own `message`. Codes do not change, so keep branching on `code`.
- The spec's `Optimization` schema has `optimization_score` in place of `audit`, described by the new `OptimizationScore` schema. Regenerate any client built from it.

## October 6, 2026

The optimizer endpoints move to new paths. The paths they had at launch no longer answer, so update any call to them. Request and response fields, credits and limits do not change.

- [`POST /optimize`](/docs/api-reference/start-optimization) starts an optimization, [`GET /optimize/{id}`](/docs/api-reference/get-optimization) returns its status and [`GET /optimize/{id}/image`](/docs/api-reference/download-optimization) downloads the optimized image.
- A webhook's `image_url` is the new download link, the same one `GET /optimize/{id}` returns.
- The spec names their operations `startOptimization`, `getOptimization` and `downloadOptimization`, and the job schema `Optimization`. Regenerate any client built from it.
- While optimizing is paused, `POST /optimize` answers 503 with the renamed code `optimizations_disabled`, as [Errors](/docs/errors) lists.
- The MCP tools `process_image` and `get_processing_result` keep their names and inputs.

## September 25, 2026

Version 1.0.0 of the realpng API and MCP server, and the launch of [these docs](/docs).

- The REST API. [`POST /audit`](/docs/api-reference/audit-image) checks an image. Three endpoints start an optimization, return its status and download the optimized image. October 6 moved them to their current paths. [`POST /uploads`](/docs/api-reference/create-upload) returns an upload URL.
- The [MCP server](/docs/mcp) with [four tools](/docs/mcp/tools): `audit_image`, `process_image`, `get_processing_result` and `request_upload`.
- [Uploads](/docs/guides/upload-a-local-file). Send a local file straight to storage with `POST /uploads` or `request_upload`, including files too large for `image_base64`.
- [Webhooks](/docs/guides/optimize-an-image#get-a-webhook-instead). Pass `callback_url` when you start an optimization to receive the finished one as a POST, signed in the `RealPNG-Signature` header.
- The OpenAPI spec at `/api/v1/openapi.json`.
