> This is a page from the ElevenLabs documentation. For an index of the documentation, fetch https://elevenlabs.io/docs/llms.txt.

# Content Provenance API (Beta)

Audio generated by ElevenLabs carries an inaudible watermark embedded in the audio samples themselves. The content provenance endpoint, `POST /v1/content-provenance/watermark`, reads a file you upload and tells you whether it finds one.

When the watermark matches a generation record, the response names the product and model that produced the audio, when it was generated, and an id for that generation. It never includes the prompt, the account, or the user behind the generation.

## What the watermark reports

A finished check returns two fields: `is_detected` and `details`.

**`is_detected`** is `true` when the decoder recognised an ElevenLabs watermark in the file, and `false` when it did not.

**`details`** is populated only when the generation details can be recovered from the watermark, which might not be possible for short or heavily changed audio. It then carries `product`, `model`, `generated_at`, and `unique_id`. Any of these four can be `null`. If no record matched, or no watermark was found, `details` is `null`.

You can also send `version` to choose which decoder reads the file. Leave it out, or send `latest`, to use the latest decoder. Currently only `latest` is supported.

## Check a file

Upload the audio as a multipart form with the field name `file`, and set the part's media type, for example `audio/mpeg`. Your API key needs the watermark permission. OAuth access tokens are not accepted.

```bash
curl -X POST https://api.elevenlabs.io/v1/content-provenance/watermark \
  -H "xi-api-key: $ELEVENLABS_API_KEY" \
  -F "file=@./example.mp3;type=audio/mpeg"
```

`version` is optional. To send it explicitly:

```bash
curl -X POST https://api.elevenlabs.io/v1/content-provenance/watermark \
  -H "xi-api-key: $ELEVENLABS_API_KEY" \
  -F "file=@./example.mp3;type=audio/mpeg" \
  -F "version=latest"
```

A file that carries a watermark returns something like this:

```json
{
  "is_detected": true,
  "details": {
    "product": "Music",
    "model": "Eleven Music v2",
    "generated_at": "2026-07-27T18:34:12+00:00",
    "unique_id": "row-123"
  }
}
```

## Limits

**Accepted files.** Any `audio/*` type the decoder can read, including MP3, WAV, FLAC, AAC, and Ogg. You can also omit the media type or send `application/octet-stream`. An image or any other non-audio type returns `400` with the status `invalid_file_type`.

**Size and length.** Each file can be at most 50 MB, and between 0.5 seconds and 5 minutes long after decoding. Send one file per request.

**Rate limit.** Each API key user can submit 25 checks per 24 hours. Requests over that limit return `429`. If you need a higher limit, [reach out](https://elevenlabs.io/docs/help-center/other/how-can-i-contact-support).

## Handling errors

A `429` is worth retrying later. A `400` or `422` means the request itself needs to change, for example a non-audio file or a `version` other than `latest`.

## Using the result

The endpoint reads the watermark that is already in the file, nothing more. The response has no prompt and no account, so for any decision that depends on where audio came from, keep a person in the loop.