If you ship a product that calls the Claude API, something changed under you in August 2026: text returned by supported models carries an embedded watermark applied at the model level, with no opt-out parameter. Supported files Claude generates carry signed C2PA provenance metadata. Both can travel through your product to users.
Your integration does not break: response schemas, JSON parsing, token counts, prompt caching, and measurable latency are unchanged. The implementation work is elsewhere: track which resolved model produced an answer, expose AI disclosure through your API contract, and test whether your file pipeline preserves C2PA metadata. Run those checks continuously with Apidog, not just before a compliance review.
What changed in the response
Concretely, nothing visible changes in a text response.
The watermark is woven into generated text. It is imperceptible, does not change meaning or readability, and does not appear as a marker byte, response header, or JSON field.
Your existing parsing code continues to work:
{
"id": "msg_123",
"model": "claude-opus-5",
"content": [
{
"type": "text",
"text": "Generated content..."
}
]
}
There is no new watermark property to parse. In practice:
- You cannot detect it yourself. There is no public reader for the text watermark yet. Anthropic has committed to supporting detection and says documentation is coming.
-
You cannot remove it. It is applied at the model level. There is no
watermark: falseoption, enterprise exemption, or request header. -
Reselling does not remove it. If your API wraps Claude, text returned from endpoints such as
/summarize,/chat, or/generate-copyremains marked. - Region does not remove it. Marking applies wherever Claude is offered, not only to EU traffic.
Files are different. When Claude generates supported types such as .svg, .png, or .jpg, it attaches a signed C2PA manifest. Unlike the text watermark, that manifest is stored in the file container and can be removed by downstream processing.
Handle a mixed model fleet
Marking is not uniform across every model.
Claude models launched on or after August 2, 2026 support machine-readable marking at launch. Earlier models are in a transition period while Anthropic works to add support.
If you route requests across model tiers for availability or cost—such as when applying techniques from how to cut your Claude API bill—a fallback can change the marking status of a response without changing your API response shape.
1. Store marking status per model ID
Do not use one global watermarked setting. Keep this metadata alongside routing, pricing, and context-window configuration.
{
"models": {
"claude-opus-5": {
"marked": true,
"since": "2026-08-02"
},
"claude-sonnet-5": {
"marked": false,
"note": "pre-cutoff, retrofit pending"
}
}
}
When your routing layer picks a model, log both the requested model and the resolved model:
logger.info("Claude response received", {
requestedModel,
resolvedModel: response.model,
marked: modelConfig[response.model]?.marked
});
2. Assert the resolved model, not the requested model
The Messages API returns the resolved model in the response. Test that value so aliases, fallback rules, and routing changes cannot silently alter the marking status of output.
// Apidog post-response script
const body = JSON.parse(pm.response.text());
pm.test("resolved model is the pinned model", () => {
pm.expect(body.model).to.eql(pm.environment.get("EXPECTED_MODEL"));
});
If intentional fallbacks are part of your design, validate against an explicit allowlist instead:
const body = JSON.parse(pm.response.text());
const allowedModels = JSON.parse(
pm.environment.get("ALLOWED_MODELS")
);
pm.test("resolved model is approved for this endpoint", () => {
pm.expect(allowedModels).to.include(body.model);
});
Separate Anthropic's obligations from yours
If you deploy Claude in your own product, you should independently assess what Article 50 requires for your product and service.
Being a customer of a compliant model provider does not transfer your deployer obligations.
| Role | Who | Obligation |
|---|---|---|
| Provider of the GPAI model | Anthropic | Article 50(2): mark outputs in a machine-readable format and make them detectable |
| Deployer of an AI system | You, usually | Article 50(1) and 50(4): tell people they are interacting with AI; disclose deepfakes and AI-generated public-interest text |
Anthropic's marking addresses Anthropic's provider obligation. It does not automatically satisfy your obligation to disclose that a user is interacting with AI or that published content is AI-generated where applicable.
Article 50 breaches can carry fines of up to €15 million or 3% of worldwide annual turnover, whichever is higher. See EU AI Act Article 50 for API developers for the breakdown.
Make disclosure part of your API contract
If you expose Claude output through your own API, downstream consumers need a reliable way to identify it as model output.
For example, include a response field:
{
"summary": "The document describes the deployment process.",
"ai_generated": true,
"model": "claude-opus-5"
}
Or expose it through a header:
X-AI-Generated: true
X-AI-Model: claude-opus-5
Document the behavior in OpenAPI:
components:
schemas:
SummaryResponse:
type: object
required:
- summary
- ai_generated
properties:
summary:
type: string
ai_generated:
type: boolean
description: Indicates that the response contains AI-generated output.
model:
type: string
description: The resolved model that generated the response.
This is an API design concern, not just a UI concern. A team consuming your /summarize endpoint cannot meet its own obligations if your contract does not disclose what it receives. See adding AI disclosure to your own API.
Identify where C2PA provenance breaks
Text watermarks live in generated text, so they survive ordinary application operations such as storing a JSON field, rendering a template, or copying text into a database.
C2PA metadata does not work that way. It is attached to a file container. Any process that creates a new file can drop the manifest unless it explicitly preserves and re-signs it.
Common failure points include:
- Image resizing and thumbnail generation: Sharp, ImageMagick, Pillow, and similar tools commonly produce a new file without the manifest by default.
- Format conversion: PNG to WebP or JPEG to AVIF creates a different container.
- Image CDNs and automatic optimization: On-the-fly transforms can rewrite the asset.
- Editors and screenshots: Re-saving an image or taking a screenshot removes provenance completely.
- Object-storage normalization jobs: Upload pipelines may rewrite assets before delivery.
For example, this image transformation creates a new output file:
import sharp from "sharp";
await sharp("source.png")
.resize(1200)
.png()
.toFile("output.png");
Treat this as a provenance-risk operation. If your product receives a Claude-generated image, transforms it, and serves the transformed version, assume the original C2PA manifest is gone until you test the actual delivery path.
Your API is stripping C2PA metadata covers a round-trip test strategy.
Add these checks to your test suite
Four checks cover most of the engineering risk.
1. Assert the resolved model
For every AI-backed endpoint, verify the model in the provider response matches the expected model or approved fallback list.
const body = JSON.parse(pm.response.text());
pm.test("resolved model is the pinned one", () => {
pm.expect(body.model).to.eql(pm.environment.get("EXPECTED_MODEL"));
});
This catches changes that could alter marking status without changing your endpoint's schema.
2. Assert your disclosure is present
Test your ai_generated field or X-AI-Generated header for every path that returns model output.
pm.test("response declares AI-generated content", () => {
const body = JSON.parse(pm.response.text());
pm.expect(body.ai_generated).to.eql(true);
});
pm.test("AI disclosure header is present", () => {
pm.expect(pm.response.headers.get("X-AI-Generated")).to.eql("true");
});
Run this check for:
- fresh model responses,
- cached responses,
- fallback-model responses,
- partial or retry paths,
- error paths that return generated fallback content.
Those are the paths where disclosure fields commonly disappear.
3. Round-trip a signed image fixture
Build an integration test that:
- Uploads a C2PA-signed fixture.
- Sends it through your real storage, transformation, and CDN path.
- Fetches the delivered file.
- Verifies the C2PA manifest is still present and valid.
This test catches regressions caused by a new resize step, CDN setting, or format conversion.
4. Validate the response against OpenAPI
Add ai_generated, model, and any disclosure headers to your API specification, then validate responses in CI.
paths:
/summarize:
post:
responses:
"200":
description: AI-generated summary
headers:
X-AI-Generated:
schema:
type: string
enum: ["true"]
content:
application/json:
schema:
$ref: "#/components/schemas/SummaryResponse"
Schema validation prevents a refactor from silently removing disclosure fields. If you already validate specs, this is an incremental addition. See how to validate OpenAPI specs.
Run the checks in CI
Group the model, disclosure, file round-trip, and schema checks into a test scenario. Run it with apidog-cli in your deployment pipeline so failures block a release.
A typical CI flow is:
# Run the API scenario with environment-specific values
apidog-cli run \
--environment production-like \
--reporter cli
Use environment variables for values such as:
EXPECTED_MODEL=claude-opus-5
ALLOWED_MODELS=["claude-opus-5"]
API_BASE_URL=https://staging.example.com
If your tests run in GitHub Actions already, apply the same pattern described in automating API tests in GitHub Actions. Download Apidog to build and automate scenarios against your own endpoints.
What this does not change
A few points are worth stating clearly.
- It does not make output traceable to your account or users. The mark signals that content may have been processed by Claude; it is not a per-customer identifier.
- It does not degrade output quality. Anthropic says the watermark does not change meaning, quality, or readability, and the response format remains unchanged.
- It is not a plagiarism detector. A detected mark indicates Claude may have touched content, including during proofreading or translation. No mark does not prove human authorship.
- It does not require changes for your API integration to function. The implementation work is in model routing metadata, disclosure contracts, and file-processing tests.
FAQ
Can I disable watermarking on the Claude API?
No. Text watermarking is applied at the model level. No request parameter, header, or plan removes it.
Does watermarking affect token usage or latency?
No. The watermark is part of generation rather than an extra response-processing step, and the response format is unchanged.
Does it apply if I call Claude through Bedrock, Vertex, or Microsoft Foundry?
Embedded text watermarks apply through AWS, Google Cloud, and Microsoft Foundry. Signed provenance metadata may not be supported on every platform, depending on available file-handling features.
My users are outside the EU. Does this affect me?
The marks apply worldwide, so your output is marked. Whether Article 50 applies to your business is a separate question that depends on whether you place your system on the EU market or its output is used in the EU.
Do I have to tell my users their content is AI-generated?
Probably, if you are in scope. This is an Article 50(1) and 50(4) question that generally applies to you as the deployer. It requires a legal assessment for your product.
How do I know whether the model I call is marked?
Models launched on or after August 2, 2026 mark output at launch. Earlier models are being retrofitted. Track this per model ID and assert the resolved model in automated tests.
The takeaway
The engineering changes are focused:
- Track marking status per model, not globally.
- Assert the resolved model on every AI-backed endpoint.
- Put AI disclosure in your response schema or headers.
- Round-trip test C2PA-signed files through your actual delivery pipeline.
- Run the checks in CI so regressions fail before release.
Anthropic marking output addresses Anthropic's obligation. Your disclosure contract and file pipeline remain your responsibility.
Top comments (0)