Detect Watermark

Check whether a clip carries the watermark Speechify seals into audio it generates. Upload the audio as `audio`; nothing about it is stored, and no voice is read or written. Read the answer carefully in one direction. A `watermarked: true` is positive evidence that the audio came from Speechify synthesis. A `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. Checks are rate-limited well below the synthesis budget: this is a forensic question, not a data-plane call.

Authentication

AuthorizationBearer

Enter your API key with the Bearer prefix, e.g. ‘Bearer sk_…’.

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 confidence is not worth acting on, and below half a second it always reports zero.

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 watermark, i.e. whether confidence cleared the service’s configured bar.

confidencedouble0-1

The detector’s score for this clip, in [0, 1]. Comparable only between checks made against the same detector version.

Errors

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