DEV Community

Cover image for クロードAPIの応答にウォーターマーク導入:開発者が知るべき重要事項
Akira
Akira

Posted on Originally published at apidog.com

クロードAPIの応答にウォーターマーク導入:開発者が知るべき重要事項

Claude APIを呼び出す製品を出荷している場合、2026年8月に変更点があります。サポートされているモデルから返されるテキストには、モデルレベルで適用された埋め込みウォーターマークが含まれており、これをオフにするパラメータはありません。Claudeが生成するファイルには、署名付きC2PAプロビナンスメタデータが付加されます。これらは両方とも、そのままユーザーに渡されます。

今すぐApidogを試す

統合に問題は発生しません。レスポンス形式が変更されたり、新しい必須フィールドが出現したり、測定できるほどのレイテンシーが追加されたりすることはありません。

変わるのは、出力について製品として何を主張できるか、そしてAnthropicではなくあなたに課される義務の範囲です。

この記事では、次の実装ポイントを整理します。

  • レスポンスで実際に変わること・変わらないこと
  • モデルごとのマーキング状態の管理方法
  • C2PAメタデータを壊しやすいパイプライン
  • CIで追加すべきAPIテスト

Apidogでこれらのチェックをシナリオ化しておけば、コンプライアンスレビューで初めて問題を見つけるのではなく、デプロイごとに継続して検証できます。

レスポンスで何が変わったのか

結論から言うと、目に見える変化はありません

テキストウォーターマークは生成テキスト自体に織り込まれています。知覚できず、レスポンスの意味や可読性を変えることもありません。また、ウォーターマークの存在を知らせるマーカーバイト、HTTPヘッダー、JSONフィールドも追加されません。

そのため、次の実装は影響を受けません。

  • JSONパース
  • トークンカウント
  • プロンプトキャッシュ
  • 既存のレスポンススキーマ検証

ただし、以下の点は明確に理解しておく必要があります。

  • 自前で検出することはできません。

    テキストウォーターマーク用の公開リーダーはまだありません。Anthropicは検出サポートと関連ドキュメントを提供予定としています。

  • 削除することはできません。

    ウォーターマーキングはモデルレベルで適用されます。watermark: false のようなリクエスト設定、専用ヘッダー、エンタープライズプランによる無効化はありません。

  • 再販しても回避できません。

    Claudeを内部実装としてラップし、自社の /summarize、コピー生成、チャットAPIとして提供する場合でも、返却するテキストはマーク付きです。

  • 地域ではなくモデルに依存します。

    マーキングはEU圏トラフィックに限定されず、Claudeが提供される地域で適用されます。地理ルーティングで回避することはできません。

ファイル出力はより注意が必要

ファイルでは事情が異なります。Claudeが .svg.png.jpg などのサポート対象ファイルを生成する場合、署名付きの C2PA マニフェストが付加されます。

このマニフェストはファイル内部の実データです。そのため、後続の画像変換やCDN最適化によって失われる可能性があります。

混合フリート問題

運用上の重要なポイントは、マーキングがすべてのモデルで一律ではないことです。

2026年8月2日以降にリリースされたClaudeモデルは、リリース時点で機械可読なマーキングをサポートします。それ以前にリリースされたモデルは移行期間の対象であり、Anthropicがマーキング対応を追加中です。

つまり、「自社の出力はマークされているか」という質問への答えは、実際に呼び出したモデルIDごとに異なります

Claude APIの料金を削減する方法のように、コストやレイテンシーを理由にモデルティア間でルーティングしている場合、フリートは意図せず混合状態になります。

たとえば、新しいモデルから古いモデルへフォールバックした場合、そのリクエストのマーキング状態も変わります。

1. マーキング状態をモデル設定として管理する

マーキング状態はグローバルな真偽値ではなく、モデル固有のメタデータとして持ちます。価格、コンテキストウィンドウ、リージョン対応などと同じ設定層に置くと管理しやすくなります。

{
  "models": {
    "claude-opus-5": {
      "marked": true,
      "since": "2026-08-02"
    },
    "claude-sonnet-5": {
      "marked": false,
      "note": "カットオフ前、レトロフィット保留中"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

ルーティングロジックでは、選択候補ごとにこの状態を参照できるようにしてください。

type ModelConfig = {
  marked: boolean;
  since?: string;
  note?: string;
};

const models: Record<string, ModelConfig> = {
  "claude-opus-5": {
    marked: true,
    since: "2026-08-02"
  },
  "claude-sonnet-5": {
    marked: false,
    note: "カットオフ前、レトロフィット保留中"
  }
};

function getModelMetadata(modelId: string): ModelConfig {
  const model = models[modelId];

  if (!model) {
    throw new Error(`未登録のモデルIDです: ${modelId}`);
  }

  return model;
}
Enter fullscreen mode Exit fullscreen mode

2. 実際に解決されたモデルをアサートする

Messages APIは、解決されたモデルをレスポンスボディで返します。

リクエストしたモデル名だけをログに残すのでは不十分です。フォールバック、エイリアス更新、ルーティング変更によって、実際の応答モデルが変わる可能性があります。

最低限、以下をテスト対象にしてください。

// レスポンス後スクリプト
const body = JSON.parse(pm.response.text());

pm.test("解決されたモデルは指定されたものである", function () {
  pm.expect(body.model).to.eql(pm.environment.get("EXPECTED_MODEL"));
});
Enter fullscreen mode Exit fullscreen mode

本番ログでも、リクエスト時のモデル名とレスポンスの model を分けて記録すると、意図しない切り替えを追跡しやすくなります。

logger.info("Claude response received", {
  requestedModel,
  resolvedModel: response.model,
  marked: getModelMetadata(response.model).marked
});
Enter fullscreen mode Exit fullscreen mode

Anthropicの責任とあなたの責任

ここは誤解しやすい部分です。

Claudeを自社製品に組み込んでデプロイする場合、製品・サービスに対して第50条が何を求めるかは、あなた自身が評価する必要があります。

準拠したプロバイダーを利用していることは、あなたのコンプライアンス義務を代行するものではありません。

役割 担当者 義務
GPAIモデルの提供者 Anthropic 第50条(2):出力を機械可読形式でマークし、検出可能にする
AIシステムの展開者 通常はあなた 第50条(1)および第50条(4):人々がAIとやり取りしていることを伝え、ディープフェイクとAI生成された公共の利益に関するテキストを開示する

Anthropicが出力にマークを付けることは、Anthropic側の義務を満たすためのものです。

一方で、以下はあなたの製品側で設計・検証する必要があります。

  • ユーザーにAIと対話していることを伝えるUI
  • AI生成コンテンツであることを示すレスポンスフィールド
  • 公益に関するAI生成テキストに必要な開示
  • API利用者が下流で義務を果たせる契約・ドキュメント

第50条違反には、最大1,500万ユーロまたは全世界年間売上高の3%のいずれか高い方の罰金が科せられます。詳細はAPI開発者向けEU AI法第50条を参照してください。

下流のAPI利用者にも開示情報を渡す

Claudeの出力を自社API経由で再販・公開する場合、API利用者にも独自の義務が発生する可能性があります。

たとえば、下流チームが /summarize エンドポイントを利用しているとしても、レスポンスがモデル出力であることを契約やAPI仕様で伝えていなければ、そのチームは適切な開示を実装できません。

レスポンスボディまたはHTTPヘッダーで、明示的な開示フィールドを提供します。

{
  "summary": "要約結果です。",
  "ai_generated": true,
  "model": "claude-opus-5"
}
Enter fullscreen mode Exit fullscreen mode

または、ヘッダーとして返します。

X-AI-Generated: true
X-AI-Model: claude-opus-5
Enter fullscreen mode Exit fullscreen mode

これは単なるドキュメント上の注記ではなく、API設計の一部です。独自のAPIにAI開示を追加するも参照してください。

あなたのパイプラインがプロビナンスを破壊する可能性のある場所

テキストウォーターマークはテキスト本体に存在するため、JSON、データベース、テンプレート、Webページへコピーされても残ります。通常のパイプラインが誤って削除することはありません。

一方、C2PAマニフェストはコンテナレベルの添付情報です。ファイルコンテナを書き換える処理は、明示的に保存・再署名しない限りマニフェストを削除します。

主な破壊ポイントは次のとおりです。

  • 画像のリサイズとサムネイル化

    Sharp、ImageMagick、Pillowなどは、デフォルトでマニフェストなしの新しいファイルを生成します。

  • フォーマット変換

    PNGからWebP、JPEGからAVIFへの変換では新しいコンテナが作られ、マニフェストが失われます。

  • 画像CDNと自動最適化

    オンザフライ変換、圧縮、品質調整、形式変換が行われる場合があります。一部は保持・再署名に対応していますが、対応状況を実測で確認する必要があります。

  • エディタでの再保存やスクリーンショット

    どちらもプロビナンス情報を完全に失います。

  • アップロード時に正規化するオブジェクトストレージ処理

    アップロードフック、Lambda、ワーカー、ウイルススキャン後の再エンコードなどを見落としがちです。

Claude生成画像を受け取り、リサイズやCDN配信を経てユーザーへ提供している場合、明示的に保存しない限り、ブラウザに到達するまでにマニフェストは失われている可能性が高くなります。

あなたのAPIはC2PAメタデータを削除しているでは、往復テストでこの問題を検出する方法を解説しています。

テストスイートに追加すべきこと

以下の4つを追加すると、実用上の主要なリスクをカバーできます。いずれも通常のAPIアサーションとして実装可能です。

1. 解決されたモデルをアサートする

すべてのAIバックエンドエンドポイントで、レスポンス内のモデルが意図したモデルと一致することを確認します。

これにより、フォールバックでマーキング状態が密かに変わる問題を防げます。

// レスポンス後スクリプト
const body = JSON.parse(pm.response.text());

pm.test("解決されたモデルは指定されたものである", function () {
  pm.expect(body.model).to.eql(pm.environment.get("EXPECTED_MODEL"));
});
Enter fullscreen mode Exit fullscreen mode

フォールバックを意図的に許可する場合は、許可リスト方式にします。

const body = JSON.parse(pm.response.text());
const allowedModels = JSON.parse(
  pm.environment.get("ALLOWED_RESOLVED_MODELS") || "[]"
);

pm.test("解決されたモデルは許可リストに含まれる", function () {
  pm.expect(allowedModels).to.include(body.model);
});
Enter fullscreen mode Exit fullscreen mode

2. 自身の開示フィールドが存在することをアサートする

契約上、ai_generated フィールドや X-AI-Generated ヘッダーを返すなら、モデル出力を返すすべてのパスで検証します。

正常系だけでなく、特に次のパスを含めてください。

  • キャッシュヒット
  • フォールバック応答
  • 非同期ジョブ完了後の取得
  • 部分的なエラー応答
  • レート制限やリトライ後の応答
pm.test("AI生成フラグが返される", function () {
  const body = JSON.parse(pm.response.text());

  pm.expect(body).to.have.property("ai_generated");
  pm.expect(body.ai_generated).to.be.true;
});

pm.test("AI生成ヘッダーが返される", function () {
  pm.expect(pm.response.headers.get("X-AI-Generated")).to.eql("true");
});
Enter fullscreen mode Exit fullscreen mode

3. 画像を往復させ、マニフェストを検証する

署名付きフィクスチャをアップロードし、実際の配信パスを通して再取得します。その後、C2PAマニフェストが残っており、有効であることを検証します。

テスト対象には、実際のユーザー経路を含めてください。

Claude生成ファイル
  → アップロードAPI
  → オブジェクトストレージ
  → 画像変換処理
  → CDN
  → 公開URLからダウンロード
  → C2PA検証
Enter fullscreen mode Exit fullscreen mode

これにより、リサイズ処理、CDN設定変更、画像最適化の回帰を捕捉できます。

4. OpenAPI仕様に対して検証する

OpenAPIスキーマに開示フィールドを含め、レスポンス検証を有効にします。これにより、リファクタリング時に ai_generated のような重要フィールドが消えることを防げます。

components:
  schemas:
    SummaryResponse:
      type: object
      required:
        - summary
        - ai_generated
        - model
      properties:
        summary:
          type: string
        ai_generated:
          type: boolean
          example: true
        model:
          type: string
          example: claude-opus-5
Enter fullscreen mode Exit fullscreen mode

すでに仕様検証をCIで実行しているなら、このチェックに大きな追加コストはかかりません。OpenAPI仕様を検証する方法を参照してください。

CIで継続実行する

4つのチェックをテストシナリオとしてまとめ、apidog-cli からCIパイプラインで実行します。リグレッションを検出したらビルドを失敗させる構成にしてください。

GitHub Actionsを使う場合の基本形は次のようになります。

name: API compliance checks

on:
  pull_request:
  push:
    branches:
      - main

jobs:
  test-api:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Run Apidog scenarios
        run: |
          apidog-cli run \
            --environment ci \
            --reporter cli
Enter fullscreen mode Exit fullscreen mode

既存のGitHub Actionsに組み込む場合は、GitHub ActionsでのAPIテストの自動化と同じ考え方で設定できます。Apidogをダウンロードして、実際のエンドポイントに対するシナリオを構築してください。

これが変更しないこと

報道が劇的に見えることもあるため、変わらない点も明確にしておきます。

  • Claudeの出力をあなたのアカウントやユーザーに追跡可能にするものではありません。マークは、コンテンツがClaudeによって処理された可能性を示すものです。顧客ごとの識別子ではありません。

  • 品質を低下させるものではありません。Anthropicによると、ウォーターマークはレスポンスの意味、品質、可読性を変更せず、レスポンス形式にも違いはありません。

  • 盗作検出機能を提供するものではありません。検出されたマークは、校正や翻訳を含め、Claudeがコンテンツに手を加えた可能性を示します。マークがないことは何も示しません。

  • 統合を継続するためにコード変更は必要ありません。既存のClaude API統合は動作します。対応が必要なのは、モデル設定、開示契約、ファイルパイプライン、テストです。

よくある質問(FAQ)

  • Claude APIのウォーターマーキングを無効にできますか?

    いいえ。テキストウォーターマーキングはモデルレベルで適用されます。どのClaude製品やインターフェースから生成したかにかかわらず存在し、リクエストパラメータ、ヘッダー、プランで削除することはできません。

  • ウォーターマーキングはトークン使用量やレイテンシーに影響しますか?

    いいえ。ウォーターマークはテキスト生成方式の一部であり、追加の処理ステップではありません。レスポンス形式も変更されません。

  • Bedrock、Vertex、Microsoft Foundryを通じてClaudeを呼び出した場合も適用されますか?

    埋め込みテキストウォーターマークは、AWS、Google Cloud、Microsoft Foundryを通じて適用されます。署名付きプロビナンスメタデータは、各プラットフォームが提供するファイル処理機能によって、すべてのプラットフォームでサポートされるとは限りません。

  • ユーザーがEU圏外の場合も影響しますか?

    マークは世界中で適用されるため、出力はマークされます。第50条がビジネスに適用されるかどうかは別の問題であり、システムをEU市場に投入するか、出力がEUで使用されるかによって異なります。

  • ユーザーにAI生成コンテンツであることを伝える必要がありますか?

    適用範囲内であれば、おそらく必要です。これは第50条(1)および第50条(4)に関する要件であり、Anthropicではなく展開者であるあなたに課されます。技術的な判断だけでなく、製品・法務上の評価が必要です。

  • 呼び出しているモデルがマークされているかどうかを確認するにはどうすればよいですか?

    2026年8月2日以降にリリースされたモデルは、リリース時にマークされます。それ以前のモデルは後から改修中です。ルーティング設定でモデルIDごとに状態を管理し、テストでは解決済みモデルをアサートしてください。

要点

Claudeのウォーターマーキングがエンジニアリングに与える影響は小さく、具体的です。

実装では、次を優先してください。

  1. モデルごとにマーキング状態を管理する
  2. レスポンスで実際に解決されたモデルをアサートする
  3. C2PAマニフェストを含むファイルの往復テストを行う
  4. API契約にAI開示フィールドを追加し、OpenAPIで必須化する
  5. これらをCIで継続実行する

Anthropicが出力にマークを付けることは、Anthropicの義務を満たすものです。あなたの製品に必要な開示、下流利用者への情報提供、ファイルプロビナンスの保持は、依然としてあなたが設計・検証すべき領域です。

Top comments (0)