Skip to main content
プロダクト は AdCP における中核の販売単位です。本ドキュメントではプロダクトモデル、価格/配信種別、発見方法や構造について説明します。
価格モデル プロダクトはサポートする価格モデルを宣言し、バイヤーはメディアバイ作成時に具体的な価格オプションを選択します。CPM、CPCV、CPP、CPC、CPA、vCPM、定額料金、時間ベース価格の詳細は Pricing Models Guide を参照。

プロダクトモデル

  • product_id (string, required)
  • name (string, required)
  • description (string, required)
  • publisher_properties (list[PublisherPropertySelector], required): このプロダクトが対象とするパブリッシャープロパティ。Property Targeting を参照。
  • channels (list[string], optional): このプロダクトが販売される広告チャネル(例: ["retail_media"]["display", "olv"])。セラーは、リテールメディア・CTV/OLV・マルチチャネルバンドルなど、自明でないチャネルにまたがるプロダクトには channels を宣言すべきです。プロダクトのチャネルは、そのプロパティの supported_channels の和集合のサブセットであるべきです。Media Channel Taxonomy を参照。
  • format_ids (list[FormatID], required): 構造化フォーマット ID 参照。Creative Formats を参照。
  • placements (list[Placement], optional): プロダクト内の特定広告プレースメント。提供される場合、バイヤーはクリエイティブ割り当て時に個別プレースメントをターゲティングできます。Placements を参照。
  • shows (list[ShowSelector], optional): このプロダクトが対象とする番組。パブリッシャーごとにグルーピングされ、各エントリは publisher_domain と、パブリッシャーの adagents.json で参照される show_ids を持ちます。Shows and episodes を参照。
  • episodes (list[Episode], optional): このプロダクトで利用可能な特定エピソード。Shows and episodes を参照。
  • delivery_type (string, required): "guaranteed" または "non_guaranteed"
  • exclusivity (string, optional): このプロダクトが排他的アクセスを提供するかどうか。"none"(フィールド未指定時のデフォルト)— 複数の広告主が同時に購入可能。"category" — 業種カテゴリーごとに 1 広告主のみ。"exclusive" — 単独スポンサーシップ。特定の番組やプレースメントに紐付く guaranteed プロダクトで最も関連します。
  • pricing_options (list[PricingOption], required): このプロダクトで利用可能な価格モデルの配列。Pricing Models を参照。
  • delivery_measurement (object, optional): 広告デリバリーを計測する主体 — インプレッションカウントに使用する広告サーバーとビューアビリティベンダー(例: “Google Ad Manager with IAS viewability”)。未指定の場合、バイヤーは自身の計測デフォルトを適用すべきです。Delivery Measurement を参照。
  • outcome_measurement (OutcomeMeasurement, optional): プロダクトに含まれるビジネス成果計測 — インクリメンタル売上リフト、ブランドリフト調査など。リテールメディアプロダクトで一般的。
  • creative_policy (CreativePolicy, optional): クリエイティブ要件と制限。
  • is_custom (bool, optional): 特定ブリーフに基づき生成された場合は true
  • expires_at (datetime, optional): is_custom の場合、プロダクトの有効期限。
  • property_targeting_allowed (bool, optional, default: false): バイヤーが get_products のプロパティリストフィルタリングを使ってこのプロダクトを publisher_properties のサブセットに絞り込めるかどうか。false(デフォルト)の場合、プロダクトは「全か無か」— バイヤーはすべてのプロパティを受け入れなければならず、そうでなければ property_list フィルタリング結果からプロダクトが除外されます。Property Targeting を参照。
  • show_targeting_allowed (bool, optional, default: false): バイヤーがこのプロダクトの shows のサブセットをターゲティングできるかどうか。false(デフォルト)の場合、プロダクトはバンドル — バイヤーはリストされたすべての番組を取得します。true の場合、バイヤーはメディアバイで特定の番組を選択できます。
  • catalog_types (list[string], optional): このプロダクトがカタログ駆動型キャンペーンでサポートするカタログタイプ。スポンサードプロダクトリスティングは ["product"] を、求人ボードは ["job", "offering"] を宣言します。バイヤーはこのフィールドを通じて同期済みカタログとプロダクトを照合します。Catalogs を参照。
  • catalog_match (object, optional): バイヤーが get_productscatalog を提供する場合、このプロダクトで対象となるカタログアイテムを示します。matched_gtins(クロスリテーラー GTIN マッチ)、matched_ids(汎用アイテム ID マッチ)、matched_countsubmitted_count を含みます。
  • metric_optimization (object, optional): このプロダクトのメトリクス最適化機能。存在する場合、プロダクトが kind: "metric"optimization_goals をサポートすることを示します。Metric optimization を参照。
  • max_optimization_goals (integer, optional): パッケージでこのプロダクトが受け付ける optimization_goals の最大数。未指定の場合、上限は宣言されない。ほとんどのソーシャルプラットフォームは 1 つのみ受け付けます。
  • conversion_tracking (object, optional): コンバージョンイベントトラッキング機能。存在する場合、プロダクトが kind: "event"optimization_goals をサポートすることを示します。Conversion tracking を参照。
  • product_card (object, optional): UI でのプロダクト表示用ビジュアルカード定義。Product Cards を参照。

Metric optimization

kind: "metric"optimization_goals をサポートするプロダクトは、metric_optimization に機能を宣言します。メトリクスゴールにはイベントソースやコンバージョントラッキングの設定は不要 — セラーがこれらのメトリクスをネイティブに追跡します。
{
  "metric_optimization": {
    "supported_metrics": ["clicks", "views", "completed_views", "engagements"],
    "supported_view_durations": [2, 6, 15],
    "supported_targets": ["cost_per", "threshold_rate"]
  }
}
フィールド必須説明
supported_metricsstring[]Yesこのプロダクトが最適化できるメトリクス種別。バイヤーはここに列挙されている種別のメトリクスゴールのみ要求すべきです。
supported_view_durationsnumber[]Nocompleted_views ゴールでサポートされる動画視聴時間の閾値(秒単位)。未指定の場合、セラーはプラットフォームのデフォルトを使用します。
supported_targetsstring[]No利用可能なターゲット種別: cost_perthreshold_rate。値は最適化ゴールの target.kind と一致します。列挙された種別のみ受け付けます。省略した場合、バイヤーはターゲットなしのメトリクスゴール(ボリューム最大化)を設定できるが、特定ターゲットは設定できません。

Conversion tracking

kind: "event"optimization_goals をサポートするプロダクトは、conversion_tracking に機能を宣言します。セラーレベルの機能(サポートされるイベントタイプ、UID タイプ、アトリビューションウィンドウ)は get_adcp_capabilities で宣言されます。
{
  "conversion_tracking": {
    "action_sources": ["website", "app"],
    "supported_targets": ["cost_per", "per_ad_spend", "maximize_value"],
    "platform_managed": false
  }
}
フィールド必須説明
action_sourcesstring[]Noこのプロダクトに関連するアクションソース(例: リテールメディアプロダクトは in_storewebsite を持つ場合があります)。
supported_targetsstring[]Noイベントゴールで利用可能なターゲット種別: cost_perper_ad_spendmaximize_value。値は最適化ゴールの target.kind と一致します。列挙された種別のみ受け付けます。省略した場合、バイヤーはターゲットなしのイベントゴールを設定できます。
platform_managedbooleanNoセラーが常時計測を提供するかどうか(例: リテーラーの購買アトリビューション)。true の場合、sync_event_sources はセラー管理のイベントソースを返します。
完全な最適化ゴールのリファレンスは Conversion Tracking & Optimization Goals を参照。

価格モデル

パブリッシャーは各プロダクトでサポートする価格モデルを宣言し、バイヤーはメディアバイ作成時に利用可能なオプションから選択します。このアプローチにより:
  • 1 プロダクトに複数価格モデル - 同一在庫を異なる価格体系で提供可能
  • 複数通貨対応 - パブリッシャーがサポート通貨を宣言し、バイヤーはその通貨を使用しなければなりません
  • 柔軟な価格設定 - CPM、CPCV、CPP(GRP ベース)、CPA などをサポート

サポートされる価格モデル

  • CPM (Cost Per Mille) - 1,000 インプレッションあたりのコスト(従来型ディスプレイ)
  • CPC (Cost Per Click) - 広告クリックあたりのコスト
  • CPCV (Cost Per Completed View) - 動画/オーディオ 100% 再生完了あたりのコスト
  • CPV (Cost Per View) - パブリッシャー定義の閾値での視聴あたりのコスト
  • CPA (Cost Per Acquisition) - コンバージョンイベント(購買、リード、登録等)あたりのコスト
  • CPP (Cost Per Point) - GRP あたりのコスト(TV/オーディオ)
  • Flat Rate - 配信量に関わらず固定費
  • Time - キャンペーン期間に応じてスケールする時間単位(日、週、月)あたりのコスト

PricingOption 構造

各価格オプションの例:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/pricing-options/cpcv-option.json",
  "pricing_option_id": "cpcv_usd_guaranteed",
  "pricing_model": "cpcv",
  "fixed_price": 0.15,
  "currency": "USD",
  "min_spend_per_package": 5000
}
オークション型(fixed_price なし)の場合、floor_price を最低入札制約として、任意の price_guidance をパーセンタイルのヒントとして使用します。入札ベースのオークションモデル(cpmvcpmcpccpcvcpv)では、max_bid をブール値シグナルとして含めることができ、bid_price が確定価格からバイヤー上限モードに切り替わることを示します:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/pricing-options/cpm-option.json",
  "pricing_option_id": "cpm_usd_auction",
  "pricing_model": "cpm",
  "currency": "USD",
  "floor_price": 10.00,
  "max_bid": true,
  "price_guidance": {
    "p25": 12.50,
    "p50": 15.00,
    "p75": 18.00,
    "p90": 22.00
  }
}

Delivery Measurement

プロダクトは利用可能な場合、計測プロバイダーを宣言すべきだ:
{
  "delivery_measurement": {
    "provider": "Google Ad Manager with IAS viewability verification",
    "notes": "MRC-accredited viewability. 50% in-view for 1s display / 2s video."
  }
}
一般的なプロバイダーの例:
  • "Google Ad Manager with IAS viewability"
  • "Nielsen DAR for P18-49 demographic measurement"
  • "Geopath DOOH traffic counts updated monthly"
  • "Comscore vCE for video completion tracking"
  • "Self-reported impressions from proprietary ad server"

Outcome Measurement オブジェクト

成果計測を含むプロダクト(リテールメディアで一般的)の例:
{
  "type": "incremental_sales_lift",
  "attribution": "deterministic_purchase",
  "window": { "interval": 30, "unit": "days" },
  "reporting": "weekly_dashboard"
}

CreativePolicy オブジェクト

クリエイティブ要件や制限を定義します:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/creative-policy.json",
  "co_branding": "required",
  "landing_page": "retailer_site_only",
  "templates_available": true
}

Placements

プロダクトは、在庫内の特定広告プレースメントを任意で宣言できます。プレースメントが提供される場合:
  • バイヤーはプロダクト全体を購入 - パッケージは常にプロダクト全体を対象とし、個別プレースメント単位では購入しません
  • プレースメントターゲティングはクリエイティブ割り当て時に実施 - 異なるクリエイティブを別プレースメントに割り当て可能
  • プレースメント指定を省略 - placement_ids を指定しないクリエイティブはパッケージ内の全プレースメントで配信

Placement オブジェクト構造

{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/placement.json",
  "placement_id": "homepage_banner",
  "name": "Homepage Banner",
  "description": "Above-the-fold banner on the homepage",
  "format_ids": [
    {"agent_url": "https://creative.adcontextprotocol.org", "id": "display_728x90"},
    {"agent_url": "https://creative.adcontextprotocol.org", "id": "display_970x250"}
  ]
}

例: プレースメント付きプロダクト

{
  "product_id": "news_site_premium",
  "name": "News Site Premium Package",
  "description": "Premium placements across news site",
  "format_ids": [
    {"agent_url": "https://creative.adcontextprotocol.org", "id": "display_728x90"},
    {"agent_url": "https://creative.adcontextprotocol.org", "id": "display_300x250"}
  ],
  "placements": [
    {
      "placement_id": "homepage_banner",
      "name": "Homepage Banner",
      "format_ids": [{"agent_url": "https://creative.adcontextprotocol.org", "id": "display_728x90"}]
    },
    {
      "placement_id": "article_sidebar",
      "name": "Article Sidebar",
      "format_ids": [{"agent_url": "https://creative.adcontextprotocol.org", "id": "display_300x250"}]
    }
  ],
  "delivery_type": "guaranteed",
  "pricing_options": [...]
}
メディアバイ作成時に、バイヤーは異なるクリエイティブを別プレースメントに割り当てられます。
{
  "packages": [
    {
      "product_id": "news_site_premium",
      "creative_assignments": [
        {
          "creative_id": "creative_1",
          "placement_ids": ["homepage_banner"]
        },
        {
          "creative_id": "creative_2",
          "placement_ids": ["article_sidebar"]
        }
      ]
    }
  ]
}
詳細は Creative Assignment and Placement Targeting を参照。

番組とエピソード

番組はフォーマットやプレースメントと並ぶ、プロダクトの第三の次元です。プレースメントが広告の「どこに」表示されるかを、フォーマットが「どのように見えるか」を表すのに対し、番組は「コンテンツコンテキスト」— 視聴者が見ているプログラムを表します。プロダクトに showsepisodes を宣言することで、バイヤーは在庫購入時に特定の番組やエピソードをターゲティングできます。 完全なモデル、例、ターゲティングの詳細は Shows and episodes を参照。

Exclusivity

exclusivity フィールドは、プロダクトがその在庫への排他的アクセスを提供するかどうかを示します。未指定の場合はデフォルトで "none"
意味
none複数の広告主がこのプロダクトを同時に購入できる
category業種カテゴリーごとに 1 広告主のみ(例: 1 番組スポンサーシップに 1 自動車ブランド)
exclusive単独スポンサーシップ — このプロダクトを購入できる広告主は 1 社のみ
Exclusivity は、広告主がブランド分離やコンテンツアソシエーションの独占権を求める、特定の番組やプレースメントに紐付く guaranteed プロダクトで最も関連します。

各レベルの使用場面

  • none: プログラマティック在庫、ランオブネットワーク、オープンオークションプロダクト。複数の広告主が同じ在庫を共有するのが前提。
  • category: 競合分離が重要なポッドキャストや CTV スポンサーシップ。1 番組に 1 自動車ブランド、1 エピソードに 1 フィンテックブランド — ただし競合しない複数の広告主が同時に購入可能。
  • exclusive: 単一の番組またはイベントの単独スポンサーシップ。広告主はそのコンテンツに関連付けられる唯一のブランドとなります。
パブリッシャーは shows を持つ guaranteed プロダクトには exclusivity を含めるべきです。"none" の暗黙のデフォルトは番組レベルの在庫には曖昧 — バイヤーはパブリッシャーが共有在庫を意図しているのか、単にフィールドを省略したのかを判断できません。

コンテンツスポンサーシップパターン

delivery_type: "guaranteed"exclusivity: "exclusive"shows を組み合わせたプロダクトはコンテンツスポンサーシップを表す — 広告主は特定コンテンツの唯一のスポンサーとなります。これはポッドキャストのタイトルスポンサーシップ、CTV 番組スポンサーシップ、イベントベースのテイクオーバーの標準パターンです。
{
  "product_id": "signal_noise_sponsor",
  "name": "Signal & Noise — Exclusive Sponsorship",
  "description": "Sole sponsorship of Signal & Noise, a weekly technology podcast. Includes pre-roll and mid-roll placements across all episodes.",
  "publisher_properties": [
    { "publisher_domain": "crestnetwork.example", "property_ids": ["crest_podcasts"] }
  ],
  "format_ids": [
    { "agent_url": "https://ads.crestnetwork.example", "id": "audio_pre_roll_30s" },
    { "agent_url": "https://ads.crestnetwork.example", "id": "audio_mid_roll_60s" }
  ],
  "shows": [{ "publisher_domain": "crestnetwork.example", "show_ids": ["signal_noise"] }],
  "delivery_type": "guaranteed",
  "exclusivity": "exclusive",
  "pricing_options": [
    {
      "pricing_option_id": "flat_monthly",
      "pricing_model": "flat_rate",
      "fixed_price": 25000,
      "currency": "USD"
    }
  ]
}
カテゴリー排他性は、パブリッシャーがネットワーク全体で競合ブランドを分離しながら、競合しない複数の広告主には販売するマルチ番組バンドルで機能する:
{
  "product_id": "crest_business_bundle",
  "name": "Crest Business Podcast Bundle — Category Sponsorship",
  "description": "Sponsorship across three business podcasts. One advertiser per industry category across all shows.",
  "publisher_properties": [
    { "publisher_domain": "crestnetwork.example", "property_ids": ["crest_podcasts"] }
  ],
  "format_ids": [
    { "agent_url": "https://ads.crestnetwork.example", "id": "audio_pre_roll_30s" },
    { "agent_url": "https://ads.crestnetwork.example", "id": "audio_mid_roll_60s" }
  ],
  "shows": [{ "publisher_domain": "crestnetwork.example", "show_ids": ["signal_noise", "market_beat", "founder_stories"] }],
  "delivery_type": "guaranteed",
  "exclusivity": "category",
  "pricing_options": [
    {
      "pricing_option_id": "flat_quarterly",
      "pricing_model": "flat_rate",
      "fixed_price": 60000,
      "currency": "USD"
    }
  ]
}

Property Targeting

property_targeting_allowed フラグは、バイヤーが get_products のプロパティリストフィルタリングを使ってプロダクトをその publisher_properties のサブセットに絞り込めるかどうかを示します。

動作

  • property_targeting_allowed: false(デフォルト): プロダクトは「全か無か」。バイヤーの property_list にプロダクトのプロパティがすべて含まれていない場合、そのプロダクトは結果から完全に除外されます。
  • property_targeting_allowed: true: バイヤーは property_list に一致するプロパティにプロダクトを絞り込める。プロパティとバイヤーのリストに何らかの積集合がある場合、プロダクトは結果に含まれます。

ユースケース

ユースケースproperty_targeting_allowed理由
ランオブネットワークfalseバイヤーはネットワーク全体を受け入れなければなりません
プレミアムバンドルfalseスポーツ + ニュースバンドルはセットで販売
フレキシブル在庫trueバイヤーはカテゴリー内の特定サイトをターゲティングできる

全か無かプロダクトproperty_targeting_allowed: false):
{
  "product_id": "premium_news_bundle",
  "name": "Premium News Bundle",
  "publisher_properties": [
    { "publisher_domain": "news.example.com", "property_ids": ["site_a", "site_b", "site_c"] }
  ],
  "property_targeting_allowed": false
}
バイヤーが site_asite_b のみを含む property_listget_products を呼び出すと、バイヤーのリストにすべてのプロパティが含まれていない(site_c が欠落)ため、このプロダクトは除外される フレキシブルプロダクトproperty_targeting_allowed: true):
{
  "product_id": "news_category_flexible",
  "name": "News Category - Flexible Targeting",
  "publisher_properties": [
    { "publisher_domain": "news.example.com", "property_ids": ["tech", "sports", "finance", "politics"] }
  ],
  "property_targeting_allowed": true
}
バイヤーが techsports のみを含む property_listget_products を呼び出すと、積集合があるためこのプロダクトは含まれる。バイヤーはその後このプロダクトを購入し、パッケージの targeting_overlay.property_list を通じて一致するプロパティのみをターゲティングできます。

カスタム/プリンシパル固有のプロダクト

サーバーは汎用カタログを提供しつつ、以下も返せる:
  • Principal-Specific Products: 特定クライアント向けまたは交渉済みのプロダクト
  • Custom Products: is_custom: trueexpires_at タイムスタンプを持つ動的生成プロダクト

プロダクトの例

標準 CTV プロダクト(複数の価格オプション)

{
  "product_id": "connected_tv_prime",
  "name": "Connected TV - Prime Time",
  "description": "Premium CTV inventory 8PM-11PM",
  "publisher_properties": [
    { "publisher_domain": "streaming.example.com", "selection_type": "all" }
  ],
  "format_ids": [
    {
      "agent_url": "https://creative.adcontextprotocol.org",
      "id": "video_15s"
    },
    {
      "agent_url": "https://creative.adcontextprotocol.org",
      "id": "video_30s"
    }
  ],
  "delivery_type": "guaranteed",
  "pricing_options": [
    {
      "pricing_option_id": "cpm_usd_guaranteed",
      "pricing_model": "cpm",
      "fixed_price": 45.00,
      "currency": "USD",
      "min_spend_per_package": 10000
    },
    {
      "pricing_option_id": "cpcv_usd_guaranteed",
      "pricing_model": "cpcv",
      "fixed_price": 0.18,
      "currency": "USD",
      "min_spend_per_package": 10000
    },
    {
      "pricing_option_id": "cpp_usd_p18-49",
      "pricing_model": "cpp",
      "fixed_price": 250.00,
      "currency": "USD",
      "parameters": {
        "demographic": "P18-49",
        "min_points": 50
      },
      "min_spend_per_package": 12500
    }
  ],
  "delivery_measurement": {
    "provider": "Nielsen DAR for P18-49 demographic measurement",
    "notes": "Panel-based measurement for GRP delivery. Impressions measured via Comscore vCE."
  }
}

オークション型ディスプレイプロダクト

{
  "product_id": "custom_abc123",
  "name": "Custom - Gaming Enthusiasts",
  "description": "Custom audience package for gaming campaign",
  "publisher_properties": [
    { "publisher_domain": "gaming.example.com", "selection_type": "all" }
  ],
  "format_ids": [
    {
      "agent_url": "https://creative.adcontextprotocol.org",
      "id": "display_300x250"
    },
    {
      "agent_url": "https://creative.adcontextprotocol.org",
      "id": "display_728x90"
    }
  ],
  "delivery_type": "non_guaranteed",
  "pricing_options": [
    {
      "pricing_option_id": "cpm_usd_auction",
      "pricing_model": "cpm",
      "currency": "USD",
      "floor_price": 5.00,
      "price_guidance": {
        "p50": 8.00,
        "p75": 12.00
      }
    },
    {
      "pricing_option_id": "cpc_usd_auction",
      "pricing_model": "cpc",
      "currency": "USD",
      "floor_price": 0.50,
      "price_guidance": {
        "p50": 1.20,
        "p75": 2.00
      }
    }
  ],
  "delivery_measurement": {
    "provider": "Google Ad Manager with IAS viewability",
    "notes": "MRC-accredited viewability. 50% in-view for 1s display."
  },
  "is_custom": true,
  "expires_at": "2025-02-15T00:00:00Z"
}

計測付きリテールメディアプロダクト

{
  "product_id": "albertsons_pet_category_offsite",
  "name": "Pet Category Shoppers - Offsite Display & Video",
  "description": "Target Albertsons shoppers who have purchased pet products in the last 90 days. Reach them across premium display and video inventory.",
  "publisher_properties": [
    { "publisher_domain": "groceryretail.example.com", "selection_type": "all" }
  ],
  "format_ids": [
    {
      "agent_url": "https://creative.adcontextprotocol.org",
      "id": "display_300x250"
    },
    {
      "agent_url": "https://creative.adcontextprotocol.org",
      "id": "display_728x90"
    },
    {
      "agent_url": "https://creative.adcontextprotocol.org",
      "id": "video_15s"
    }
  ],
  "delivery_type": "guaranteed",
  "pricing_options": [
    {
      "pricing_option_id": "cpm_usd_guaranteed",
      "pricing_model": "cpm",
      "fixed_price": 13.50,
      "currency": "USD",
      "min_spend_per_package": 10000
    }
  ],
  "delivery_measurement": {
    "provider": "Self-reported impressions from proprietary ad server",
    "notes": "Impressions counted per IAB guidelines. Viewability measured via IAS."
  },
  "outcome_measurement": {
    "type": "incremental_sales_lift",
    "attribution": "deterministic_purchase",
    "window": { "interval": 30, "unit": "days" },
    "reporting": "weekly_dashboard"
  },
  "creative_policy": {
    "co_branding": "optional",
    "landing_page": "must_include_retailer",
    "templates_available": true
  }
}

Product Cards

プロダクトカードは、UI でプロダクトを視覚的に示すための定義です。パブリッシャーは、カードフォーマットと必要アセットを含むカード定義を任意で提供できます。

カードタイプ

パブリッシャーは少なくとも Standard カードを、必要に応じて詳細カードも提供すべきです。 Standard Card (product_card):
  • プロダクトのグリッド/リスト表示向けコンパクトカード(300x400px)
  • Retina 向けに 2x 密度画像をサポート
  • プロダクトを素早く視覚的に把握
Detailed Card (product_card_detailed, 任意):
  • ヒーローカルーセルとテキスト説明を並べたレスポンシブレイアウト
  • 下部に Markdown 仕様セクション
  • メディアキットのような詳細ドキュメント

構造

{
  "product_id": "ctv_premium",
  "name": "Premium CTV Inventory",
  // ... other product fields ...

  "product_card": {
    "format_id": {
      "agent_url": "https://creative.adcontextprotocol.org",
      "id": "product_card_standard"
    },
    "manifest": {
      "display_name": "Premium CTV - Living Room Audiences",
      "hero_image_url": "https://cdn.example.com/products/ctv_hero.jpg",
      "brief_highlight": "Perfect for reaching cord-cutters and premium streaming audiences"
    }
  },

  "product_card_detailed": {
    "format_id": {
      "agent_url": "https://creative.adcontextprotocol.org",
      "id": "product_card_detailed"
    },
    "manifest": {
      "display_name": "Premium CTV - Living Room Audiences",
      "description": "Reach high-income households with premium CTV inventory during peak viewing hours...",
      "carousel_images": [
        "https://cdn.example.com/products/ctv_context1.jpg",
        "https://cdn.example.com/products/ctv_context2.jpg"
      ],
      "specifications_markdown": "# Technical Specifications\n\n..."
    }
  }
}

カードの描画

カード表示には 2 つの方法があります。
  1. preview_creative を使用: カードフォーマットとマニフェストを渡してレンダリング
  2. 事前レンダリング: パブリッシャーがカードを生成し、静的に配信
インフラに合わせて動的生成と静的ホスティングを選択できます。

標準カードフォーマット

AdCP リファレンスクリエイティブエージェントは次の 2 種の標準カードフォーマットを定義します:
  • product_card_standard (300x400px) - プロダクトブラウズ用コンパクトカード
  • product_card_detailed (レスポンシブ) - カルーセルと詳細仕様を含むリッチカード
パブリッシャーはブランドに合わせたり、独自の特徴を強調したりするためにカスタムカードフォーマットを定義できます。 Note: 標準カードフォーマットの定義はプロトコル仕様ではなく creative-agent repository で管理されています。

プロダクトカードを含めるべき場面

プロダクトカードは任意だが、次のケースで推奨されます:
  • 強いビジュアルアイデンティティを持つプロダクト(番組、イベント、媒体など)
  • プレミアムプロダクトで、見た目が価値向上につながる場合
  • 複雑なプロダクトで、ビジュアルハイライトが理解を助ける場合
  • 特定オーディエンスを狙う際、ビジュアルで訴求したい場合
メディアキットのような詳細ドキュメントを提供したい場合は detailed カードを使用してください。

クライアント描画ガイドライン

UI でプロダクトを表示する際のフォールバック順:
  1. product_card があるpreview_creative で描画、または事前レンダリング画像を表示
  2. どちらもない → テキストのみ(プロダクト名 + 説明)を表示
  3. カード描画に失敗 → テキストのみ表示にフォールバック
利用可能なメタデータにかかわらず、一貫したユーザー体験を提供できます。

プロポーザル

パブリッシャーはプロダクトと一緒に プロポーザル(予算配分付きの構造化メディアプラン)を返すことができます。バイヤーはそのまま実行できます。

プロポーザルとは

プロポーザルは、提案予算配分とともにプロダクトをグルーピングした推奨購入戦略です。従来の営業担当が行っていたようなメディアプランニングの知見をエンコードします。 主な特徴:
  • 実行可能: proposal_id を指定して create_media_buy で直接実行
  • 予算非依存: 配分をパーセンテージで保持するため、任意の予算にスケール可能
  • フォーキャスト付き: プロポーザルと配分にはデリバリーフォーキャストを含めることができ、バイヤーが購入前に期待されるパフォーマンスを評価するのに役立つ

プロポーザル構造

{
  "proposal_id": "swiss_balanced_v1",
  "name": "Swiss Multi-Channel Plan",
  "description": "Balanced coverage across devices and language regions",
  "allocations": [
    {
      "product_id": "ch_desktop_de",
      "allocation_percentage": 20,
      "pricing_option_id": "cpm_usd_fixed",
      "rationale": "Primary desktop audience in German Switzerland",
      "tags": ["desktop", "german"]
    },
    {
      "product_id": "ch_desktop_fr",
      "allocation_percentage": 30,
      "tags": ["desktop", "french"]
    },
    {
      "product_id": "ch_mobile_de",
      "allocation_percentage": 8,
      "tags": ["mobile", "german"]
    },
    {
      "product_id": "ch_mobile_fr",
      "allocation_percentage": 12,
      "tags": ["mobile", "french"]
    },
    {
      "product_id": "ch_inapp_de",
      "allocation_percentage": 12,
      "tags": ["in-app", "german"]
    },
    {
      "product_id": "ch_inapp_fr",
      "allocation_percentage": 18,
      "tags": ["in-app", "french"]
    }
  ],
  "total_budget_guidance": {
    "min": 30000,
    "recommended": 50000,
    "currency": "USD"
  },
  "brief_alignment": "Achieves 50/20/30 channel split (desktop/mobile/in-app) and 40/60 language split (German/French)",
  "forecast": {
    "points": [
      {
        "budget": 50000,
        "metrics": {
          "impressions": { "low": 800000, "mid": 1200000, "high": 1500000 },
          "reach": { "low": 400000, "mid": 600000, "high": 750000 },
          "clicks": { "mid": 4800 }
        }
      }
    ],
    "method": "modeled",
    "currency": "USD",
    "valid_until": "2025-04-15T00:00:00Z"
  }
}
tags フィールドで配分を次元別に集計できる:
  • チャネル別: desktop (50%) + mobile (20%) + in-app (30%) = 100%
  • 言語別: German (40%) + French (60%) = 100%

プロポーザルの反復

プロポーザルは buying_mode: "refine"refine 配列を使って改善できます。プロポーザルを ID で参照すると、セラーは更新された配分、フォーキャスト、価格を含む更新版プロポーザルを返します:
// 初回ディスカバリー
get_products({
  buying_mode: "brief",
  brief: "Swiss campaign, $50k, 50% desktop/20% mobile/30% in-app, 40% German/60% French"
})

// レスポンスにプロポーザル "swiss_balanced_v1" を含む

// プロポーザルを改善
get_products({
  buying_mode: "refine",
  refine: [
    { scope: "product", id: "ch_desktop_de", action: "include" },
    { scope: "product", id: "ch_desktop_fr", action: "include" },
    { scope: "product", id: "ch_mobile_de", action: "include" },
    { scope: "product", id: "ch_mobile_fr", action: "include" },
    { scope: "product", id: "ch_inapp_de", action: "include" },
    { scope: "product", id: "ch_inapp_fr", action: "include" },
    { scope: "proposal", id: "swiss_balanced_v1", action: "include", ask: "focus more on German speakers - try 60/40 instead of 40/60" }
  ]
})

// セラーは改訂された配分を含む更新版プロポーザルを返す
完全なワークフローと例は get_products refinement を参照。

プロポーザルの実行

create_media_buyproposal_idtotal_budget を指定して実行します:
{
  "proposal_id": "swiss_balanced_v1",
  "total_budget": {
    "amount": 50000,
    "currency": "USD"
  },
  "brand": { "domain": "acmecorp.com" },
  "start_time": "2025-04-01T00:00:00Z",
  "end_time": "2025-04-30T23:59:59Z"
}
パブリッシャーは配分パーセンテージをパッケージに変換する:
  • ch_desktop_de: 20% × $50,000 = $10,000
  • ch_desktop_fr: 30% × $50,000 = $15,000
  • など
複数ラインアイテムの複雑なキャンペーンを単一のプロポーザル実行に簡略化できます。

プロポーザルを返す場面

パブリッシャーは次の場合にプロポーザルを含める:
  • ブリーフに特定の配分戦略(チャネル配分、言語配分など)が求められます
  • キャンペーン目標に基づく戦略的ガイダンスを提供できます
  • 複数プロダクトを組み合わせた方が効果的
パブリッシャーは通常、wholesale モード(バイヤーがターゲティングと配分を自ら指示します)ではプロポーザルを省略します。また、ブリーフがマルチプロダクト戦略を示唆しない場合も同様です。 プロポーザルは任意 — 配分ガイダンスが不要ならプロダクトのみ返しても構わない。refine モードでは、バイヤーがプロポーザルエントリを含めなかった場合でも、セラーは改善されたプロダクトと並んでプロポーザルを返してもよい。プロポーザルはセラーの提案であり、配分とキャンペーン最適化は主にオーケストレーター(バイヤーサイドエージェント)の責任です。

デリバリーフォーキャスト

パブリッシャーはプロポーザルと個別配分にデリバリーフォーキャストを添付し、バイヤーが予算をコミットする前に期待されるパフォーマンスを評価するのに役立てることができます。 各フォーキャストには 1 つ以上の ForecastPoint の points 配列が含まれ、各ポイントは予算レベルとメトリクス範囲(low/mid/high)をペアにします。単一ポイントは標準的なフォーキャスト; 予算の昇順で並べられた複数ポイントはメトリクスがどのようにスペンドに応じてスケールするかを示します。 メトリクスキーは 2 つの語彙から来る:
  • デリバリー/エンゲージメント: forecastable-metric 列挙値(impressions、reach、clicks、spend、views、completed_views、grps など)
  • 成果: event-type 列挙値(purchase、lead、app_install、add_to_cart、subscribe など)
これにより、セラーはデリバリー(「120 万インプレッション」)と成果(「1,800 件の購買」)の両方を 1 つのフォーキャストで予測できます。各フォーキャストはその手法を宣言する:
  • estimate — 過去の平均やヒューリスティクスに基づく概算
  • modeled — 予測モデルや過去データから導出
  • guaranteed — 予約済み在庫に裏付けられた契約上のコミット配信水準

フォーキャスト範囲単位

forecast_range_unit フィールドは、コンシューマーが points 配列をどう解釈するか — カーブが表す軸 — を伝える:
  • spend(デフォルト)— 予算レベルの昇順ポイント。標準的な予算カーブ。
  • reach_freq — リーチ/フリークエンシーターゲットの昇順ポイント。パブリッシャーがフリークエンシー目標に応じてコストがどのようにスケールするかを示す放送計画で使用。
  • weekly / daily — メトリクスは期間ごとの値。Budget はキャンペーン総スペンドを指します。weekly で頻度 3.2 は週 3.2 回の接触を意味します。
  • clicks / conversions — 成果ターゲットの昇順ポイント。目標ベースの計画で使用(例: 「コンバージョン目標を教えてくれれば予算を伝える」)。
スペンドカーブとリーチ/フリークエンシーカーブは同一データを含む場合がある — 違いはパブリッシャーの意図です。スペンドカーブは「異なる予算で何が買えるか」を示し、リーチ/フリークエンシーカーブは「異なるフリークエンシー目標を達成するのにいくらかかるか」を示します。コンシューマーはどちらのカーブも双方向に読み取れる。 時間単位(weeklydaily)はメトリクスの解釈を変える。範囲単位なし(または spend)の場合、頻度 3.2 はキャンペーン全体で 3.2 回の接触を意味します。weekly の場合は週あたり 3.2 回を意味します。 フォーキャストは 2 つのレベルで表れる:
  • プロポーザルレベル: メディアプラン全体の集計フォーキャスト
  • 配分レベル: 個別ラインアイテムのプロダクトごとフォーキャスト
配分レベルのフォーキャストは、オーディエンス重複とフリークエンシーキャッピングにより、プロポーザルレベルのフォーキャストに加算されない場合があります。両方が存在する場合、プロポーザルレベルのフォーキャストが総デリバリー推定の権威となります。 クロスチャネル計画では、フォーキャストは reach_unit(個人、世帯、デバイス、アカウント、Cookie)を宣言し、バイヤーがパブリッシャー間でリーチを比較できるようにします。GRP ベースのフォーキャスト(地上波 TV、ラジオ)は、CPP 価格と同じパターンに従い、ターゲットデモを指定するために demographic_systemdemographic を使用します。

予算カーブ

予算の昇順で並べられた複数のフォーキャストポイントは、メトリクスがスペンドに応じてどのようにスケールするかを示し、バイヤーが最適な投資レベルを見つけるのに役立つ:
{
  "points": [
    {
      "budget": 25000,
      "metrics": {
        "impressions": { "low": 400000, "mid": 500000, "high": 600000 },
        "reach": { "mid": 180000 },
        "clicks": { "mid": 2000 }
      }
    },
    {
      "budget": 50000,
      "metrics": {
        "impressions": { "low": 850000, "mid": 1050000, "high": 1200000 },
        "reach": { "mid": 320000 },
        "clicks": { "mid": 4200 }
      }
    },
    {
      "budget": 100000,
      "metrics": {
        "impressions": { "low": 1500000, "mid": 1900000, "high": 2200000 },
        "reach": { "mid": 500000 },
        "clicks": { "mid": 7600 }
      }
    }
  ],
  "method": "modeled",
  "currency": "USD",
  "reach_unit": "individuals"
}
カーブは収穫逓減を明らかにする — 予算を $50K から $100K に倍増してもリーチは 2 倍でなく約 56% 増に過ぎません。バイヤーはこれを交渉やパブリッシャー間の予算再配分に活用できます。

GRP デモグラフィクス付き CTV

TV およびオーディオのフォーキャストは、ターゲットデモを指定するために demographic_systemdemographic を使用します。これにより、バイヤーとセラーが計測表記について合意できる:
{
  "points": [
    {
      "budget": 75000,
      "metrics": {
        "grps": { "low": 45, "mid": 60, "high": 72 },
        "impressions": { "mid": 3200000 },
        "reach": { "low": 800000, "mid": 1100000, "high": 1300000 },
        "frequency": { "mid": 2.9 }
      }
    }
  ],
  "method": "modeled",
  "currency": "USD",
  "demographic_system": "nielsen",
  "demographic": "P18-49",
  "reach_unit": "households"
}
reach_unit: "households" は、この CTV パブリッシャーがリーチを個人ではなく世帯で計測することをバイヤーに伝える。reach_unit: "devices" を報告するディスプレイパブリッシャーは異なるものを計測しており、バイヤーは 2 つのリーチ数を直接比較すべきではありません。

成果フォーキャスト付きリテールメディア

リテールメディアパブリッシャーはデリバリーメトリクスとコンバージョン成果の両方を予測できます。成果メトリクスキーは event-type 値を使用します:
{
  "points": [
    {
      "budget": 30000,
      "metrics": {
        "impressions": { "low": 600000, "mid": 750000, "high": 900000 },
        "clicks": { "mid": 6000 },
        "purchase": { "low": 1200, "mid": 1800, "high": 2400 },
        "add_to_cart": { "mid": 4500 }
      }
    }
  ],
  "method": "modeled",
  "currency": "USD"
}
ここで impressionsclicksforecastable-metric 値、purchaseadd_to_cartevent-type 値です。どちらも ForecastRange(low/mid/high)を使用し、同じメトリクスマップに共存します。

配分レベルフォーキャスト

プロポーザルに配分ごとのフォーキャストが含まれる場合、バイヤーは各プロダクトを独立して評価できる:
{
  "proposal_id": "retail_holiday_v1",
  "name": "Holiday Retail Campaign",
  "allocations": [
    {
      "product_id": "sponsored_search",
      "allocation_percentage": 40,
      "forecast": {
        "points": [
          {
            "budget": 20000,
            "metrics": {
              "impressions": { "mid": 500000 },
              "clicks": { "mid": 15000 },
              "purchase": { "mid": 900 }
            }
          }
        ],
        "method": "modeled",
        "currency": "USD"
      }
    },
    {
      "product_id": "offsite_display",
      "allocation_percentage": 60,
      "forecast": {
        "points": [
          {
            "budget": 30000,
            "metrics": {
              "impressions": { "low": 1800000, "mid": 2200000, "high": 2600000 },
              "reach": { "mid": 450000 },
              "purchase": { "low": 400, "mid": 600, "high": 800 }
            }
          }
        ],
        "method": "modeled",
        "currency": "USD",
        "reach_unit": "accounts"
      }
    }
  ],
  "forecast": {
    "points": [
      {
        "budget": 50000,
        "metrics": {
          "impressions": { "low": 2100000, "mid": 2700000, "high": 3100000 },
          "reach": { "mid": 520000 },
          "purchase": { "low": 1100, "mid": 1500, "high": 1900 }
        }
      }
    ],
    "method": "modeled",
    "currency": "USD",
    "reach_unit": "accounts"
  }
}
この例では配分フォーキャスト(900 + 600 = 1,500 件の購買)がプロポーザルフォーキャストと偶然一致しているが、通常はそうならない — オーディエンス重複とフリークエンシーキャッピングにより、全体は部分の和より小さくなることが多い。プロポーザルレベルのフォーキャストが総デリバリーの権威となります。

放送オーディオスポットプラン

放送およびオーディオパブリッシャーは、各配分に daypart_targets を持つスポットプランプロポーザルを返し、forecast_range_unit: "weekly" で週次フリークエンシー予測を行うことができます。このパターンにより、パブリッシャーが最適化問題を解く — バイヤーがフリークエンシー目標を指定すると、パブリッシャーがそれを達成するプランを返します:
{
  "proposal_id": "iheart_q4_audio",
  "name": "Q4 Audio - Adults 25-54",
  "allocations": [
    {
      "product_id": "morning_drive_30s",
      "allocation_percentage": 50,
      "daypart_targets": [
        {
          "days": ["monday", "tuesday", "wednesday", "thursday", "friday"],
          "start_hour": 6,
          "end_hour": 10,
          "label": "Morning Drive"
        }
      ],
      "rationale": "Morning drive delivers highest reach against P25-54 with 3x weekly frequency at 2 spots/day",
      "forecast": {
        "points": [
          {
            "budget": 37500,
            "metrics": {
              "grps": { "mid": 42 },
              "reach": { "low": 140000, "mid": 180000, "high": 210000 },
              "frequency": { "mid": 3.2 },
              "impressions": { "mid": 576000 }
            }
          }
        ],
        "forecast_range_unit": "weekly",
        "method": "modeled",
        "currency": "USD",
        "demographic_system": "nielsen",
        "demographic": "P25-54",
        "reach_unit": "individuals"
      }
    },
    {
      "product_id": "afternoon_drive_30s",
      "allocation_percentage": 30,
      "daypart_targets": [
        {
          "days": ["monday", "tuesday", "wednesday", "thursday", "friday"],
          "start_hour": 15,
          "end_hour": 19,
          "label": "Afternoon Drive"
        }
      ],
      "rationale": "Afternoon drive complements morning with incremental reach and frequency overlap",
      "forecast": {
        "points": [
          {
            "budget": 22500,
            "metrics": {
              "grps": { "mid": 28 },
              "reach": { "low": 95000, "mid": 120000, "high": 145000 },
              "frequency": { "mid": 2.4 },
              "impressions": { "mid": 288000 }
            }
          }
        ],
        "forecast_range_unit": "weekly",
        "method": "modeled",
        "currency": "USD",
        "demographic_system": "nielsen",
        "demographic": "P25-54",
        "reach_unit": "individuals"
      }
    },
    {
      "product_id": "daytime_30s",
      "allocation_percentage": 20,
      "daypart_targets": [
        {
          "days": ["monday", "tuesday", "wednesday", "thursday", "friday"],
          "start_hour": 10,
          "end_hour": 15,
          "label": "Daytime"
        }
      ],
      "rationale": "Daytime fill provides frequency reinforcement at lower CPP",
      "forecast": {
        "points": [
          {
            "budget": 15000,
            "metrics": {
              "grps": { "mid": 18 },
              "reach": { "low": 60000, "mid": 80000, "high": 95000 },
              "frequency": { "mid": 1.8 },
              "impressions": { "mid": 144000 }
            }
          }
        ],
        "forecast_range_unit": "weekly",
        "method": "modeled",
        "currency": "USD",
        "demographic_system": "nielsen",
        "demographic": "P25-54",
        "reach_unit": "individuals"
      }
    }
  ],
  "forecast": {
    "points": [
      {
        "budget": 75000,
        "metrics": {
          "grps": { "mid": 82 },
          "reach": { "low": 220000, "mid": 280000, "high": 330000 },
          "frequency": { "mid": 4.1 },
          "impressions": { "mid": 1008000 }
        }
      }
    ],
    "forecast_range_unit": "weekly",
    "method": "modeled",
    "currency": "USD",
    "demographic_system": "nielsen",
    "demographic": "P25-54",
    "reach_unit": "individuals"
  }
}
各フォーキャストの forecast_range_unit: "weekly" は、すべてのメトリクスが週次値であることをバイヤーに伝える — 頻度 3.2 はキャンペーン全体でなく週あたり 3.2 回の接触を意味します。Budget($75K)はキャンペーン総スペンドです。 各配分の daypart_targets はパブリッシャーが推奨する時間帯を指定します。これは targeting でのハードな daypart 制約と同じ構造 — ここではバイヤーが制約するのでなく、パブリッシャーがスポットプランを規定しています。 配分レベルのリーチは、同じリスナーがモーニングドライブとアフタヌーンドライブのスポットを両方聴く可能性があるため、プロポーザルレベルに加算されない(180K + 120K + 80K > 280K)。プロポーザルレベルのフォーキャストはこの重複を考慮しています。

ディスカバリーとの統合

プロダクトは自然言語でキャンペーンブリーフにマッチさせる Product Discovery プロセスで見つけ、特定後に create_media_buy で購入します。

関連情報