Repository Public
1# Content provenance23> For the complete documentation index, see [llms.txt](/llms.txt). Markdown versions of documentation pages are available by appending `.md` to the page URL.45Use the Content Provenance API to check whether an image or audio file contains6supported OpenAI provenance signals. Send a file to7`POST /v1/content_provenance_checks` to receive the completed verification8results in the same response. Use these signals in content review,9fact-checking, labeling, and trust and safety workflows.1011To check a file in your browser, use the web tool at12[openai.com/verify](https://openai.com/verify/).1314For request parameters and response schemas, see the15[Content provenance API reference](https://developers.openai.com/api/reference/resources/content_provenance_checks/methods/create).1617A `not_detected` result means the tool didn't find supported signals in the18 uploaded file. Content may still have been generated by OpenAI if its metadata19 was stripped or shows evidence of tampering, its watermark was degraded, it20 came from a legacy generation model, or it was created before provenance21 signals were available. The tool doesn't currently detect content generated by22 another company's AI model, so a `not_detected` result doesn't rule that out23 either.2425## What content provenance checks2627Content provenance checks supported files for the following signals:2829| Signal | Applies to | What it checks |30| ------------------------ | ---------------- | ------------------------------------------------ |31| C2PA Content Credentials | Images | Signed metadata with issuer and AI-use details |32| SynthID | Images and audio | A watermark embedded directly in supported media |3334C2PA metadata provides more context about a file's origin. Editing, converting,35or sharing a file can remove its metadata. A SynthID watermark is part of the36image or audio itself and may survive some transformations.3738The API checks for supported OpenAI signals. It isn't a general-purpose AI39detector and doesn't identify content generated by every AI system. Visible40watermarks and labels are separate from the provenance signals checked by the41API.4243## Verify a file4445Send an image or audio file as the `file` field with the OpenAI SDK. The SDK46builds the multipart request and reads your API key from the `OPENAI_API_KEY`47environment variable:4849Verify an image5051```javascript52import { createReadStream } from "node:fs";53import OpenAI, { toStreamingFile } from "openai";5455const client = new OpenAI();5657const result = await client.contentProvenanceChecks.create({58 file: toStreamingFile(createReadStream("myimage.png"), "myimage.png", {59 type: "image/png",60 }),61});6263console.log(result);64```6566```python67from openai import OpenAI6869client = OpenAI()7071with open("./example.png", "rb") as image:72 result = client.content_provenance_checks.create(73 file=("example.png", image, "image/png"),74 )7576print(result)77```7879```go80package main8182import (83 "context"84 "fmt"85 "os"8687 "github.com/openai/openai-go/v3"88)8990func main() {91 client := openai.NewClient()9293 image, err := os.Open("./example.png")94 if err != nil {95 panic(err)96 }97 defer image.Close()9899 result, err := client.ContentProvenanceChecks.New(100 context.Background(),101 openai.ContentProvenanceCheckNewParams{102 File: openai.File(image, "example.png", "image/png"),103 },104 )105 if err != nil {106 panic(err)107 }108109 fmt.Println(result)110}111```112113```ruby114require "openai"115require "pathname"116117client = OpenAI::Client.new118image = OpenAI::FilePart.new(Pathname("./example.png"), content_type: "image/png")119result = client.content_provenance_checks.create(file: image)120121puts result122```123124```bash125curl https://api.openai.com/v1/content_provenance_checks \126 -H "Authorization: Bearer $OPENAI_API_KEY" \127 -F "file=@./example.png;type=image/png"128```129130131Use these OpenAI SDK versions or later: Python 2.52.0, Go 3.49.0, and Ruby1320.75.0.133134To verify Opus audio, use the same endpoint and set the uploaded file's media135type to `audio/ogg`:136137```bash138curl https://api.openai.com/v1/content_provenance_checks \139 -H "Authorization: Bearer $OPENAI_API_KEY" \140 -F "file=@./example.opus;type=audio/ogg"141```142143The response contains the completed result. For example, an image returns:144145```json146{147 "object": "content_provenance_check",148 "created_at": 1778000000,149 "results": [150 {151 "type": "c2pa",152 "outcome": "detected",153 "validation_state": "trusted",154 "issuer": "OpenAI OpCo, LLC",155 "model": "gpt-image",156 "generated_at": "2026-07-27T18:34:12Z"157 },158 {159 "type": "synthid",160 "outcome": "not_detected",161 "model": null,162 "generated_at": null163 }164 ]165}166```167168The `object` field identifies the response, and `created_at` is the check's169creation time as a Unix timestamp in seconds. The entries in `results` depend on170the uploaded file: images include C2PA and SynthID results, and audio includes a171SynthID result. The API omits checks that don't apply instead of returning172`not_detected`.173174The API completes verification before it returns. You don't need to create a175background job, poll another endpoint, or upload the file to the Files API.176177If a request fails, check the HTTP status and `error.code` when available. A178malformed, unsupported, or blocked file returns `400`; an organization without179access receives `404`; and requests over the rate limit return `429`. Retry only180transient failures, such as rate limits or server errors. For general guidance,181see [API error codes](https://developers.openai.com/api/docs/guides/error-codes).182183## Understand verification results184185Read each applicable entry in `results` independently. Image results include186C2PA and SynthID entries, while audio results include a SynthID entry. The187response doesn't include a top-level `outcome`.188189### C2PA results190191A C2PA result describes the state of an image's Content Credentials:192193```json194{195 "type": "c2pa",196 "outcome": "detected",197 "validation_state": "trusted",198 "issuer": "OpenAI OpCo, LLC",199 "model": "gpt-image",200 "generated_at": "2026-07-27T18:34:12Z"201}202```203204Use the fields as follows:205206- `outcome` indicates whether OpenAI-issued AI-generation credentials were207 `detected` or `not_detected`.208- `validation_state` indicates whether the manifest is `trusted`, `valid`,209 `invalid`, or `not_present`.210- `issuer` identifies the manifest issuer when that information is available.211- `model` identifies the generating model when that information is available.212- `generated_at` identifies the content's generation time when that information213 is available.214215The outcome is `detected` only when a `trusted` or `valid` manifest identifies216OpenAI as its issuer and includes an AI-generation action. A third-party217manifest, a manifest without an AI-generation action, an `invalid` manifest, or218a `not_present` manifest produces `not_detected`. The `issuer` and219`validation_state` can still describe a manifest even when the outcome is220`not_detected`.221222Don't treat an `invalid` manifest as reliable provenance evidence. A223`not_present` result means the image has no available C2PA manifest.224225### SynthID results226227A SynthID result describes whether the verifier detected a supported watermark228in an image or audio file:229230```json231{232 "type": "synthid",233 "outcome": "detected",234 "model": null,235 "generated_at": null236}237```238239An outcome of `detected` means the file contains a recognized watermark. An240outcome of `not_detected` means the verifier didn't detect that watermark. It241doesn't rule out AI-generated or AI-modified content. `model` and242`generated_at` provide the generating model and generation time when available;243either field can be `null`.244245## Supported formats and availability246247The API supports the following file formats:248249- **Images:** PNG, JPEG, and WebP.250- **Audio:** MP3, Opus, AAC, FLAC, WAV, and PCM.251252Limit each uploaded file to 50 MiB. Audio must be 60 seconds or shorter after253decoding.254255Set the uploaded `file` part's media type. For example, use `image/png` for a PNG256image or `audio/ogg` for Opus audio. Don't add a separate `type` field or257manually set the `multipart/form-data` request header. The `curl` `-F` option258sets the request content type and multipart boundary. Send one file per request.259260Content provenance checks aren't eligible for261[Zero Data Retention](https://developers.openai.com/api/docs/guides/your-data#zero-data-retention).262263Strict rate limits help protect the API against misuse. Organizations can264[apply for higher limits](https://openai.com/form/content-provenance-api/), and265OpenAI reviews each application on a case-by-case basis.266267If the API returns `429 rate_limit_exceeded`, reduce your request rate and268honor the `Retry-After` header when present. See269[rate limits](https://developers.openai.com/api/docs/guides/rate-limits) for general retry guidance.270271## Use verification results responsibly272273Use verification results as evidence in a broader review process:274275- Treat `detected` as evidence of a specific supported signal, not a complete276 history of a file.277- Treat `not_detected` as an absence of detected evidence, not proof that the278 content is human-created or wasn't generated with OpenAI.279- Check the C2PA issuer before attributing an image to a particular provider.280- Verify the original file when possible. Compression, cropping, screenshots,281 metadata removal, and format conversions can erase or weaken a signal.282- Account for the originating product, model, file format, and creation date.283 Not all OpenAI-generated content contains a supported signal.284- Pair automated decisions with human review in high-stakes workflows.285- Don't use repeated queries to reverse-engineer, remove, or evade a watermark.286- Don't infer a prompt, account, or individual creator from a verification287 result.288289Using the Content Provenance API is subject to the290[OpenAI Services Agreement](https://openai.com/policies/services-agreement/).291292For information about platform-wide monitoring and retention settings, see293[data controls](https://developers.openai.com/api/docs/guides/your-data).