> ## Documentation Index
> Fetch the complete documentation index at: https://adcp-docs-ja.pier1.co.jp/llms.txt
> Use this file to discover all available pages before exploring further.

# `media_buy_status` への移行（3.1）

> create_media_buy と update_media_buy の成功レスポンスで、ボディレベルの status から media_buy_status へ移す。3.1 では加算的、レガシーフィールドは 3.2 で削除、ネストされた status カスケードは 4.0 で続く。

# `media_buy_status` への移行（3.1）

AdCP 3.1 は、3.0 が同じレスポンスルートキーで衝突させていた 2 つの enum を分割します:

* **エンベロープ `status`** — TaskStatus（`submitted` / `working` / `input-required` / `completed` / `canceled` / `failed` / `rejected` / `auth-required` / `unknown`）。beta.2 から必須（[#4876](https://github.com/adcontextprotocol/adcp/issues/4876)）。
* **ボディ `media_buy_status`** — MediaBuyStatus（`pending_creatives` / `pending_start` / `active` / `paused` / `completed` / `rejected` / `canceled`）。**3.1 で新規。**

MCP のフラットオンザワイヤーシリアライゼーションの下では、両フィールドがレスポンスルートを共有します。3.0 では両方が `status` と名付けられ、ボディレベルの MediaBuyStatus は、エンベロープが同じパスに TaskStatus をスタンプすると黙って破壊されました。どの検証器もそれを捕まえませんでした。3.1 はそれらを分割します。

## 何が変わったか

| Surface                       | 3.0                                             | 3.1                                                                                                                      |
| ----------------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| `create_media_buy` 成功レスポンス    | ルートの `status`（MediaBuyStatus）                   | ルートの `media_buy_status`（MediaBuyStatus）。レガシー `status` は `deprecated: true`                                               |
| `update_media_buy` 成功レスポンス    | 同じ                                              | 同じ                                                                                                                       |
| `get_media_buys` アイテム         | `media_buys[].status`（MediaBuyStatus）           | 3.1 では変更なし — 4.0 で `media_buys[].media_buy_status` にリネーム（[#4905](https://github.com/adcontextprotocol/adcp/issues/4905)） |
| `get_media_buy_delivery` アイテム | `media_buy_deliveries[].status`（MediaBuyStatus） | 3.1 では変更なし — 4.0 でリネーム（[#4905](https://github.com/adcontextprotocol/adcp/issues/4905)）                                   |
| `core/media-buy.json`         | `status`（MediaBuyStatus）                        | 3.1 では変更なし — 4.0 でリネーム（[#4905](https://github.com/adcontextprotocol/adcp/issues/4905)）                                   |

## Before（3.0）

```json theme={null}
{
  "status": "completed",
  "media_buy_id": "mb_12345",
  "status": "active",
  "packages": [...]
}
```

`status` という名前の 2 つのキーが、MCP フラットシリアライゼーションの下で JSON ルートで衝突します — ボディレベルの `MediaBuyStatus: 'active'` 値がエンベロープの `TaskStatus: 'completed'` によって黙って破壊されます。どの検証器もそれを捕まえません。

## After（3.1）

```json theme={null}
{
  "status": "completed",
  "media_buy_id": "mb_12345",
  "media_buy_status": "active",
  "packages": [...]
}
```

2 つの明確なフィールド。エンベロープ `status` はルートでタスクライフサイクル状態を運びます。ボディ `media_buy_status` はバイのライフサイクル状態を隣で運びます。

## 3.1 適合性

* **セラー** は `create_media_buy` と `update_media_buy` の成功レスポンスに `media_buy_status` を発すべき（SHOULD）。3.1 非推奨ウィンドウ中は非推奨のトップレベル `status: MediaBuyStatus` を発し続けてもよい（MAY）。
* **バイヤー** は存在するとき `media_buy_status` を優先しなければならない（MUST）。レガシー形式のままのセラーとの互換性のためにレガシー `status` にフォールバックしてもよい（MAY）。
* **3.0 セラーとバイヤー** は変更なく動作し続けます。`required[]` のスワップなし、リネームなし、破壊なし。
* **コンプライアンスストーリーボード** は `path: "media_buy_status"` をアサートします。レガシー `status` のみを発する 3.1 セラーはスキーマ有効ですが、3.1 ストーリーボード認証に失敗します。ストーリーボードが拘束力のある適合性チェックです。スキーマの `deprecated: true` マーカーは助言的です。
* **両フィールドを発するセラー** は、`media_buy_status` と非推奨の `status` に同一の値を発しなければなりません（MUST）。分岐した発行（例: `status: "active", media_buy_status: "paused"`）は JSON Schema 検証を通過しますが適合性違反です — 3.1 ストーリーボードは、正準の `media_buy_status` チェックと並んで `status` の `field_value_or_absent` アサーションを通じて等価を強制します。`if/then` JSON Schema 制約は評価され延期されました: 移行ウィンドウが短く、codegen ツールチェーンの互換性が不確実で、ストーリーボードゲートで十分だからです。[#4908](https://github.com/adcontextprotocol/adcp/issues/4908) を参照。

## SDK の動作

レガシー `status` フィールドは `deprecated: true`（JSON Schema 2020-12）を運びます。codegen を通じた伝播は異なります:

| Toolchain                                       | Propagation                                            |
| ----------------------------------------------- | ------------------------------------------------------ |
| TypeScript（`json-schema-to-typescript`）         | フィールドに `@deprecated` JSDoc。信頼できる。                      |
| Python（`datamodel-code-generator` v2+）          | `Field(...)` 引数に `deprecated=True`。古いピン留めバージョンは黙って落とす。 |
| Go（`quicktype` など）                              | 一般的に伝播されない。                                            |
| `@adcp/client` 3.1+、Python `adcp` SDK、`adcp-go` | 正準の `media_buy_status` が SDK ユーザーの消費する型付き形状。           |

ツールチェーンが非推奨をサーフェスしない場合、ストーリーボードゲートが強制シグナルです。

## レガシーフィールドが消えるとき

* **3.2**（[#4906](https://github.com/adcontextprotocol/adcp/issues/4906)）: 非推奨のトップレベル `status: MediaBuyStatus` が `CreateMediaBuySuccess` と `UpdateMediaBuySuccess` から **削除** されます。3.2 の後、これらのレスポンスのトップレベル `status` は明確にエンベロープ TaskStatus のみを運びます。非推奨ウィンドウは意図的に短い — ストーリーボードゲートがすでに 3.1 準拠セラーをレガシーフィールドから追い出します。
* **4.0**（[#4905](https://github.com/adcontextprotocol/adcp/issues/4905)）: ネストされた `status` カスケードが着地します — `get-media-buys-response` の `media_buys[].status`、`get-media-buy-delivery-response` の `media_buy_deliveries[].status`、`core/media-buy.json` の `status` が `media_buy_status` にリネーム。真に破壊的（`required[]` スワップ）で、メジャーに保留。

## 前方互換のバイヤーコード

3.0、3.1、4.0 セラーにまたがる必要があるコード:

```js theme={null}
// media_buy_status（3.1+）を優先、status（3.0 + 4.0 ネストサーフェス互換）にフォールバック
const mediaBuyStatus = response.media_buy_status ?? response.status;
const buyLifecycleStatus = mediaBuy.media_buy_status ?? mediaBuy.status;
```

## 関連

* [create\_media\_buy リファレンス](/docs/media-buy/task-reference/create_media_buy) — 正準レスポンス例
* [メディアバイライフサイクル](/docs/media-buy/media-buys/lifecycle) — MediaBuyStatus ステートマシン
* [エンベロープ task-status](/docs/building/by-layer/L3/task-lifecycle) — TaskStatus セマンティクス
