Verify Watermark

The public AI detection tool. Ask whether a clip carries the watermark Speechify seals into audio it generates, with no account, no API key and no credential of any kind. `verify` answers; `detect` measures. This route returns a bare yes or no, the way verifying a signature does. Its sibling `POST /v1/audio/watermark/detect` takes an API key and returns the detector's confidence alongside the verdict. This is the programmatic half of the tool published at <https://speechify.ai/detect>, and it exists so the tool can be invoked without visiting our website, as California's AI Transparency Act (BPC 22757.2) requires. Nothing about the clip is stored, and nothing identifying about you is collected or retained. The answer is a bare verdict. `watermarked: true` is positive evidence that the audio came from Speechify synthesis. `watermarked: false` is NOT proof that it did not: only models redeployed since the watermark shipped mark their output, the detector needs at least three seconds of clear speech to judge, and re-encoding or changing the speed of a clip degrades the mark. Treat a negative as the absence of evidence rather than as evidence of absence. Because the tool takes no credential, it is rate-limited per client address and shares a platform-wide budget: expect a 429 under sustained automated use, and retry after the interval the response advertises. Use `POST /v1/audio/watermark/detect` with an API key for the detector's confidence score and a per-workspace allowance of its own.

Headers

Speechify-VersionstringOptional

Request

This endpoint expects a multipart form containing a file.
audiofileRequired

The clip to check, at most 25MB. Give the detector at least three seconds of clear speech; below that its answer is not worth acting on.

Response headers

Speechify-Request-IdstringOptional
Unique identifier for this request, present on every response (2xx and non-2xx alike). If the caller sends a `Speechify-Request-Id` request header the server echoes it back (sanitized and length-capped) so one logical request can be traced end-to-end; otherwise the server generates a fresh value. Log it on every response and quote it in support requests - it is the stable handle that ties your observation to Speechify's server-side logs, and it matches the `request_id` field in the error envelope. The legacy alias `X-Request-ID` carries the same value and is still accepted on requests, until 2027-07-24. Prefer the un-prefixed name (RFC 6648).
RateLimit-Limitinteger

Request-rate budget: the maximum number of requests in the current window (the bucket capacity). The IETF-draft un-prefixed name; the legacy alias X-RateLimit-Limit carries the same value. Rides every response.

RateLimit-Remaininginteger

Request-rate budget: requests left in the current window. Legacy alias: X-RateLimit-Remaining.

RateLimit-Resetinteger

Request-rate budget: integer delta-seconds until the window fully refills (same unit as Retry-After). Legacy alias: X-RateLimit-Reset.

Response

The clip was checked.
watermarkedboolean
Whether the clip carries the Speechify watermark.

Errors

400
Bad Request Error
413
Content Too Large Error
422
Unprocessable Entity Error
429
Too Many Requests Error
500
Internal Server Error
502
Bad Gateway Error