# LLM コーディングエージェントのパブリッシャー公開 API 移行リファレンス

> Monetize Manage API (legacy)から Ads 統合プラットフォームのパブリック API にクライアントのインテグレーションを移行する LLM コーディング エージェントのリファレンス。

> **オーディエンス：**このファイルは、LLM コーディングエージェント (クロードコードまたは
> Unityの**古い機能**である「Monetize」からクライアントのインテグレーションを移行するタスク
> Manage API」(`/monetize/v1/...`)を**新しい** Unity Ads パブリッシャー Public API に追加
> (`/ads/publisher/public/v1/...`).自己完結型エンティティブロックに分割されます。各ブロック
> \_何が変更\_され、\_何をする\_かを示します。**概念モデル変更**を読む
> **グローバル変更**セクションは、まずすべてのブロックに適用されます。

## このファイルの使用方法(エージェントの手順)##how-to-use-this-file-(instructions-for-the-agent)

1. この散文ではなく、2 つの契約を真実のソースとして扱います。古い機能 =
   `ads-selfserve/src/servers/http-internal/openapi/public-v1.yaml`.新規 =
   `ads-unified-platform/openapi/publisher/platform-public-v1-routes.yaml`.
2. 指定した順序で**エンティティブロックを 1** つずつ移行します (「アプリケーション」→「プレースメント」→「
   組織レベルリスト)。ブロックは、依存するブロックがコンパイルまたはパスするまで開始しません。
3. レガシー機能が **🚫 No equivalent** (同等の機能 **なし**) の下にリストされている場合、
   エンドポイント。停止し、オープンな質問としてユーザーに提示します。最も重要な例
   は **eCPM ターゲット**で、新しい API にはありません。
4. 各ブロックの後に、フィールドテーブルごとにフィールド名を再マップする。フィールドは持ち越されないと仮定する
   テーブルに "unchanged" と表示されていない限り変更されません。

***

## 概念モデルの変更 (最初にお読みください)##conceptual-model-change-(read-this-first)

データモデルはフラット化され、**プロジェクト**から**アプリケーション**へと中心が変更されました。

### 古い機能モデル (ネストされたプロジェクト中心)##legacy-model-(nested-project-centric)

```xml
組織
└──── プロジェクト（両ストアにまたがる、coppa + adsProvider あり）
    └── ストア （Apple | Google） （URL パス内）
        └── 広告単位 (adFormat、スキップ/ミュート/バナー設定はこちら)
            └── Placement
                └── eCPM ターゲット (地域ベースの下限価格)
```

### 新しいモデル(フラットなアプリケーション中心)##new-model-(flat-application-centric)

```xml
組織
└── アプリケーション (プラットフォーム + ストアが 1 つずつ、プライバシー + テストモードあり)
    └── 配置 (adFormat + adFormatConfigurations をここに配置。ターゲットなし)
組織
└── テストデバイス (新規、組織スコープ付き)
```

#### すべてのトランスフォーメーションを推進する4つのシフト##the-four-shifts-that-drive-every-transformation

| **#** | **Shift**             | **移行の結果**                                                                                                                                                                          |
| ----- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1     | **プロジェクト → アプリケーション** | `apple`と`google`ストアの **両方** を持っていた古い機能 *プロジェクト* は、**2 つのアプリケーション** (プラットフォームごとに 1 つ) になります。"プロジェクト" は任意のグループ化 （アプリケーション作成時の`projectId`/`projectName`） として残りますが、操作対象のリソースではなくなります。" |
| 2     | **Ad-Units removed**  | 広告単位のリソースがありません。広告単位レベルの設定（スキップタイマー、ミュート、バナー更新）が`adFormatConfigurations`として「**配置**」に移行しました。`adFormat`は「**配置**」プロパティになりました。                                                         |
| 3     | **eCPM ターゲットを削除**     | 🚫 新しいパブリック API には同等のものはありません。                                                                                                                                                     |
| 4     | **バッチ → 個別操作**        | 古い機能によるプレースメントと広告ユニットの一括作成/更新（マップ/配列）。新しい API はリクエストごとに 1 リソースです (`POST`/`PUT`/`DELETE` 単一配置)。                                                                                     |

## グローバル変更（すべてのエンドポイントに適用）##global-changes-(apply-to-all-endpoints)

| **アスペクト**                   | **古い機能**                                       | **新規**                                                                                                                |
| --------------------------- | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| **Host**                    | `https://services.api.unity.com`               | `https://services.api.unity.com/ads/publisher` (本番) · `https://staging.services.api.unity.com/ads/publisher` (ステージング) |
| **パスプレフィックス**               | `/monetize/v1`                                 | `/public/v1`                                                                                                          |
| **完全な例**                    | `…/monetize/v1/organizations/{orgId}/projects` | `…/ads/publisher/public/v1/organizations/{organizationId}/applications`                                               |
| **Auth**                    | HTTP **Basic**（サービスアカウントキー）                    | HTTP の **Basic** は引き続き機能します。Bearer JWT (`unity`/`ads`発行者) も受け付けます。**変更不要** — 既存の Basic 認証情報を維持します。                    |
| **Org id**                  | `organizationId`（数値文字列）                        | `organizationId`（Genesis ID、数値）： **変更なし**                                                                             |
| **パス内のプライマリ ID**            | `projectId` (uuid \*\* または \*\* 数値)            | `applicationId`(Unity App ID、文字列)                                                                                     |
| **`dryrun`クエリパラメーター**       | 書き込みでサポート                                      | 🚫 を削除しました                                                                                                            |
| **`showarchived`クエリパラメーター** | 読み取りでサポート                                      | 配置リストでのみ`isArchived` （ブーリアン） に置き換えられます                                                                                |
| **アーカイブ**                   | `archive: true/false`フィールド                     | 専用`DELETE` (アーカイブ) + `PATCH …/restore` (アーカイブ解除)                                                                      |

### レート制限の変更(クライアント側のバックオフ前提条件の更新)##rate-limits-changed-(update-any-client-side-backoff-assumptions)

|                                 | **古い機能**     | **New**              |
| ------------------------------- | ------------ | -------------------- |
| IP 単位の上限                        | 5/秒、4000/30分 | **40/s**             |
| 読み取り (`GET`)                    | (グローバルでカバー)  | **20/s + 8000/hour** |
| 作成 (`POST`)                     | 5/秒、1000/30分 | **1/秒 + 60/時間**      |
| アップデート (`PATCH`/`PUT`/`DELETE`) | 5/秒、1000/30分 | **1/s + 200/hour**   |

## マスター エンドポイント マップ##master-endpoint-map

| **古い機能操作**                                                                                                             | **古い機能ルート**                                                        | **新規操作**                                                           | **新規ルート**                                                                       | **ブロック** |
| ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------------------- | -------- |
| `getProjects`                                                                                                          | `GET /monetize/v1/organizations/{orgId}/projects`                  | `publicOrganizationApplications`                                   | `GET /public/v1/organizations/{orgId}/applications`                             | A        |
| `postProjects`                                                                                                         | `POST /monetize/v1/organizations/{orgId}/projects`                 | `publicCreateApplication`                                          | `POST /public/v1/organizations/{orgId}/applications`                            | A        |
| `getProjectDetails`                                                                                                    | `GET /monetize/v1/projects/{projectId}`                            | `publicGetApplicationById`                                         | `GET /public/v1/organizations/{orgId}/applications/{applicationId}`             | A        |
| `updateProjectDetails`                                                                                                 | `PATCH /monetize/v1/projects/{projectId}`                          | `publicUpdateApplication`                                          | `PATCH /public/v1/organizations/{orgId}/applications/{applicationId}`           | A        |
| `getAdUnitsByProject` / `getAdUnitsByProjectStore` / `createAdUnits` / `updateAdUnits` / `getAdUnits` / `patchAdUnits` | `…/projects/{projectId}/[stores/{storeName}/]adunits[/{adUnitId}]` | —                                                                  | 🚫広告単位リソースなし                                                                    | B        |
| `createPlacements` (バッチ)                                                                                               | `POST …/adunits/{adUnitId}/placements`                             | `publicCreatePlacement`(シングル)                                      | `POST /public/v1/organizations/{orgId}/applications/{applicationId}/placements` | C        |
| `GetPlacements`(広告単位)                                                                                                  | `GET …/adunits/{adUnitId}/placements`                              | `publicApplicationPlacements`                                      | `GET …/applications/{applicationId}/placements`                                 | C        |
| `getPlacement`                                                                                                         | `GET …/placements/{placementId}`                                   | `publicGetPlacementDetails`                                        | `GET …/applications/{applicationId}/placements/{placementId}`                   | C        |
| `updatePlacements`(バッチ) / `updatePlacement`                                                                            | `PATCH …/placements[/{placementId}]`                               | `publicUpdatePlacement`(シングル、**PUT**)                              | `PUT …/applications/{applicationId}/placements/{placementId}`                   | C        |
| ( によるアーカイブ`archive:true`)                                                                                              | `PATCH …/placements/{placementId}`                                 | `publicArchivePlacement`                                           | `DELETE …/applications/{applicationId}/placements/{placementId}`                | C        |
| ( によるアーカイブ解除`archive:false`)                                                                                           | `PATCH …/placements/{placementId}`                                 | `publicUnArchivePlacement`                                         | `PATCH …/applications/{applicationId}/placements/{placementId}/restore`         | C        |
| `GetPlacements` (org)                                                                                                  | `GET /monetize/v1/organizations/{orgId}/placements`                | `publicOrganizationPlacements`                                     | `GET /public/v1/organizations/{orgId}/placements`                               | D        |
| `getTargets` / `createTargets` / `getTargetDetail` / `patchTarget` / `deleteTarget`                                    | `…/placements/{placementId}/targets[/{targetId}]`                  | —                                                                  | 🚫 eCPMターゲットを削除                                                                 | E        |
| —                                                                                                                      | —                                                                  | `publicGetApplicationTestMode` / `publicUpdateApplicationTestMode` | `GET`/`PATCH …/applications/{applicationId}/test-mode`                          | F (新規)   |
| —                                                                                                                      | —                                                                  | test-device CRUD                                                   | `…/organizations/{orgId}/test-devices[/{testDeviceId}]`                         | G (新規)   |

## ブロック A - プロジェクト → アプリケーション##block-a---projects--applications

### 変更内容##what-changed

* リスト/作成/読み取り/更新したリソースは、プロジェクトではなく**アプリケーション**になります。
* 読み取り/更新が org (`/organizations/{orgId}/applications/{applicationId}`) の下にネストされるようになりました。
  スタンドアロン `/projects/{projectId}` ではなく、**`applicationId`** (Unity App ID) によってキー付けされます。
* 古い機能プロジェクトでは**両方**のストアが使用され、新しいアプリケーションは**シングルプラットフォーム**です。分割
  （Transform rules を参照）。
* `adsProvider` はなくなりました。 `coppa` は enum 文字列からブーリアンに変更され、
  新しい `mixedAudience` ブーリアンを持つ `privacy` オブジェクト。

### エンドポイントマッピング##endpoint-mapping

| **古い機能**                                | **新規**                                                       |
| --------------------------------------- | ------------------------------------------------------------ |
| `GET …/organizations/{orgId}/projects`  | `GET …/organizations/{orgId}/applications`                   |
| `POST …/organizations/{orgId}/projects` | `POST …/organizations/{orgId}/applications`                  |
| `GET …/projects/{projectId}`            | `GET …/organizations/{orgId}/applications/{applicationId}`   |
| `PATCH …/projects/{projectId}`          | `PATCH …/organizations/{orgId}/applications/{applicationId}` |

### フィールドマッピング — **作成** (`createProject` → `CreateApplicationPublicDto`)##field-mapping--**create**-(createproject--createapplicationpublicdto)

| **古い機能フィールド**                                            | **新しいフィールド**                            | **ノート**                                                        |
| -------------------------------------------------------- | --------------------------------------- | -------------------------------------------------------------- |
| `name` (必須)                                              | `name` (必須)                             | unchanged                                                      |
| `adsProvider`（必須、enum）                                   | —                                       | 🚫 **Dropped** 送信しません。同等のものはありません。                             |
| `coppa` (必須、`"compliant"`/`"non_compliant"`)             | `privacy.coppa` (ブーリアン)                 | Transform: `"compliant"` → `true`、`"non_compliant"` → `false`。 |
| —                                                        | `privacy.mixedAudience` (ブーリアン)         | **新規。**`privacy` 内で必須。クライアントが特に認識していない限り、デフォルト`false`。         |
| `stores.apple` / `stores.google` (`{storeId, storeUrl}`) | `store` (enum) + `storeId` + `platform` | **プラットフォームごとのアプリケーションに分割**。Transform ルールを参照してください。             |
| —                                                        | `platform`（必須、enum： `iOS`、`Android`、…）  | **新規、必須。** アプリケーションターゲットのストアから取得します。                           |
| —                                                        | `iconUrl` (URI)                         | 新規、任意                                                          |
| —                                                        | `projectId` (UUID)                      | 任意 — 既存のプロジェクトに関連付ける                                           |
| —                                                        | `projectName` (string)                  | 任意 — 新しいプロジェクトを作成 + 関連付ける。デフォルトはアプリケーション名                      |

### フィールドマッピング — **更新**（`updateProject` → `UpdateApplicationPublicDto`）##field-mapping--**update**-(updateproject--updateapplicationpublicdto)

| **古い機能フィールド**  | **新しいフィールド**            | **ノート**                                           |
| -------------- | ----------------------- | ------------------------------------------------- |
| `adsProvider`  | —                       | 🚫 dropped                                        |
| `coppa` (enum) | `privacy.coppa` (ブーリアン) | create と同じ Transform。更新時に両方の `privacy.*` フィールドが任意 |
| `stores`       | `store` + `storeId`     | アプリケーションごとに 1 プラットフォーム                            |
| —              | `name`                  | now updatable                                     |
| —              | `kidsSettings` (ブーリアン)  | new； `true` がダウンストリームの coppa＝true 更新をトリガー         |

### フィールドマッピング — **反応**（`project`/`projectDetail` → `ApplicationPublicResponseDto`）##field-mapping--**response**-(project/projectdetail--applicationpublicresponsedto)

| **古い機能フィールド**               | **新しいフィールド**                              | **ノート**                                                        |
| --------------------------- | ----------------------------------------- | -------------------------------------------------------------- |
| `id` (プロジェクト ID)            | `id` (アプリケーション ID) + `projectId`          | 反応に **アプリケーション**`id`と、グループ化プロジェクト用の別の`projectId`が含まれるようになりました。 |
| `name`                      | `name`                                    | unchanged                                                      |
| `coppa` (enum)              | `coppa` (ブーリアン) + `mixedAudience` (ブーリアン) | enum→boolean                                                   |
| `adsProvider`               | —                                         | 🚫 行ってしまった                                                     |
| `stores` (Apple/Google マップ) | `store` + `storeId` + `platform`          | single store                                                   |
| `archivedAt`                | —                                         | アプリケーション反応にない                                                  |
| `maxCaps`                   | —                                         | 🚫 行ってしまった                                                     |
| —                           | `iconUrl`, `testMode`, `kidsSettings`     | new                                                            |

### Transform 規則: 1 つの古い機能プロジェクト → N つのアプリケーション##transform-rule:-one-legacy-project--n-applications

`stores.apple`**と**`stores.google`を含む古いプロジェクトの場合、**2 つの**`POST /applications`を放出します。
コール:1 つは `platform: iOS`、`store: AppleAppStore`、`storeId: <apple.storeId>`、もう 1 つは
`platform: Android`, `store: GooglePlay`, `storeId: <google.storeId>`.グループを維持するには、
1 つのプロジェクト、`projectName: <project.name>` での最初のアプリケーションの作成、返されたデータのキャプチャ
`projectId`し、その`projectId`で 2 番目のアプリケーションを作成します。

### 例##example

**古い機能 — プロジェクトの作成 (両方のストア):**

```json
POST /monetize/v1/organizations/3573617062594/projects
{
  "name": マイゲーム
  "adsProvider": "unity",
  "coppa": "non_compliant",
  "stores": {
    "apple":  { "storeId":"1479198816", "storeUrl": "https://apps.apple.com/..." },
    "google": { "storeId": "com.unity.trashdash", "storeUrl": "https://play.google.com/..." }
  }
}
```

**新規 — 2 つのアプリケーションが作成され、1 つのプロジェクトの下にグループ化されます。**

```json
POST /ads/publisher/public/v1/organizations/3573617062594/applications
{
  "name": マイゲーム
  "platform": "iOS",
  "store":"AppleAppStore",
  "storeId":"1479198816",
  "privacy": { "coppa": false, "mixedAudience": false },
  "projectName":マイゲーム
}
// → response.projectId = "5a8591dd-..."; reuse it for the second app:
POST /ads/publisher/public/v1/organizations/3573617062594/applications
{
  "name": マイゲーム
  "platform":"Android",
  "store":"GooglePlay",
  "storeId": "com.unity.trashdash",
  "privacy": { "coppa": false, "mixedAudience": false },
  "projectId":"5a8591dd-..."
}
```

***

## Block B — Ad-Units (広告ユニット) → 削除 (アプリケーション + 配置に展開)##block-b--ad-units--removed-(folded-into-application-+-placement)

### 🚫 同等のリソースなし##-no-equivalent-resource

広告単位のエンドポイントはあり**ません**。を呼び出すすべてのクライアントコードを削除します。
`…/projects/{projectId}/[stores/{storeName}/]adunits…` (`getAdUnitsByProject`,
`getAdUnitsByProjectStore`, `createAdUnits`, `updateAdUnits`, `getAdUnits`, `patchAdUnits`).

### 広告単位データの送信先##where-ad-unit-data-went

| **古い機能の広告単位フィールド**                              | **新しいホーム**                                                               |
| ----------------------------------------------- | ------------------------------------------------------------------------ |
| `adFormat` (`rewarded`/`interstitial`/`banner`) | **配置**`adFormat` (配置ごと)。                                                 |
| `allowSkipInSeconds`, `muteVideo`               | 配置`adFormatConfigurations.adminSettings.{allowSkipInSeconds, muteVideo}` |
| `bannerRefreshRate`                             | 配置`adFormatConfigurations.bannerRefreshRate`(バナーのみ)                      |
| `adTypes` (`display`/`playable`/`video`)        | 🚫 直接同等なものはありません。クライアントが人間に依存している場合は、人間に提示します。                           |
| ネスト `placements` マップ                            | アプリケーション (Block C) の下にプレースメントを個別に作成します。                                  |

**移行アプローチ:** 各古い機能の広告単位をプレースメントの\_グループとして扱い、
adFormat\_。古い機能の広告単位を使用していたすべての配置について、
**アプリケーション** (その広告単位のストアと一致するもの)、広告単位の`adFormat`を
配置、広告単位の管理設定の配置の`adFormatConfigurations`への折りたたみなどです。

***

## ブロック C — プレースメント（アプリケーションごと）##block-c--placements-(per-application)

### 変更内容##what-changed

* パスが`…/applications/{applicationId}/placements[/{placementId}]`になりました。ストア/広告単位はありません。
  セグメント。
* **個々の**操作がバッチマップ/配列に置き換わります。
* 各配置で\*\*`adFormat`が必要\*\*です（広告単位のプロパティでした）。
* 新しい\*\*`adFormatConfigurations`\*\*オブジェクトはプレイヤー/管理者設定を保持します。形状は
  `adFormat`（リワード型/インタースティシャル/バナー）。
* 配置ボディから **eCPM `targets`が削除**されます（ブロック E を参照）。
* 識別子：古い機能`placementId`はナメクジ（`^[\da-zA-Z_-]+$`）で、新しい配置`id`は
  **UUID**。人間が判読できるスラッグは、\*\*`key`\*\*として個別に返されます（`name`から生成）。
* アーカイブ/復元は専用のオペレーションであり、ボディ フラグではありません。
* 配置ごとの**更新は`PUT`**（完全置換）であり、`PATCH`ではありません。

### エンドポイントマッピング##endpoint-mapping

| **Intent** | **古い機能**                                      | **新規**                                                                             |
| ---------- | --------------------------------------------- | ---------------------------------------------------------------------------------- |
| 作成         | `POST …/adunits/{adUnitId}/placements`(バッチ配列) | `POST …/applications/{applicationId}/placements` (one)                             |
| リスト        | `GET …/adunits/{adUnitId}/placements`         | `GET …/applications/{applicationId}/placements` (フィルター: `isArchived`、`adFormat[]`) |
| 取得         | `GET …/placements/{placementId}`              | `GET …/applications/{applicationId}/placements/{placementId}`                      |
| 更新         | `PATCH …/placements/{placementId}`(またはバッチ)    | `PUT …/applications/{applicationId}/placements/{placementId}`                      |
| アーカイブ      | `PATCH …` と `{"archive": true}`               | `DELETE …/placements/{placementId}` (204)                                          |
| 解凍         | `PATCH …` と `{"archive": false}`              | `PATCH …/placements/{placementId}/restore`                                         |

### フィールドマッピング — **リクエスト**（`addPlacements[]`/`patchPlacementObject` → `PlacementPublicRequestDto`）##field-mapping--**request**-(addplacements-/-patchplacementobject--placementpublicrequestdto)

| **古い機能フィールド**                   | **新しいフィールド**                                           | **ノート**                                             |
| ------------------------------- | ------------------------------------------------------ | --------------------------------------------------- |
| `name` (必須)                     | `name` (必須)                                            | unchanged                                           |
| `id` （slug、作成時）                 | —                                                      | 🚫 ID を選択しなくなりました。サーバーは UUID `id`と `key` スラッグを返します。 |
| —                               | `adFormat`（必須、enum `rewarded`/`interstitial`/`banner`） | **新規および必須**。古い機能の親広告単位の`adFormat`からのソース。            |
| `addTargets` / `targets` (eCPM) | —                                                      | 🚫 削除しました。送信しません。ブロック E を参照してください。                  |
| `placementType`                 | —                                                      | not accepted on write                               |
| `archive` (ブーリアン)               | —                                                      | 代わりに `DELETE`/`restore` を使用してください                   |
| —                               | `adFormatConfigurations`                               | **新機能** プレイヤー/管理者設定。下の形状を参照してください。                  |

### `adFormatConfigurations`形状 (`adFormat`)##adformatconfigurations-shape-(by-adformat)

* **rewarded** (`RewardedConfigurations`): `name` (報酬名、必須)、`value` (報酬値、
  必須)、`adminSettings`(`AdminConfigurations`)。
* **インタースティシャル** (`InterstitialConfigurations`): `adminSettings`。
* **バナー**（`BannerConfigurations`）：`adminSettings`、`bannerRefreshRate`（必須）。
* **`AdminConfigurations`**: `allowSkip`, `allowSkipInSeconds`, `videoPlayableSkipInSeconds`,
  `closeTimerDuration`, `tapsToClose`, `muteVideo`, `disableVideoControlsFade`,
  `useCloseIconInsteadOfSkipIcon`.

### フィールドマッピング — **反応** （`placement` → `PlacementPublicResponseDto`）##field-mapping--**response**-(placement--placementpublicresponsedto)

| **古い機能フィールド**   | **新しいフィールド**                                                                                                  | **ノート**                                    |
| --------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
| `id` (ナメクジ)     | `key` (ナメクジ)                                                                                                  | 古い機能のナメクジスタイル ID は、新しい **`key`** にマップされます。 |
| —               | `id` (UUID)                                                                                                   | **新規** 標準 ID。URL パスに記述します。                 |
| `name`          | `name`                                                                                                        | unchanged                                  |
| `archivedAt`    | `archivedAt`（date-time、nullable）                                                                              | ISO-8601 に準拠。アクティブ時に`null`                 |
| `placementType` | —                                                                                                             | アプリケーションごとの反応ではない（組織リスト、ブロック D）            |
| `targets`       | —                                                                                                             | 🚫 を削除しました                                 |
| —               | `adFormat`, `status` (`active`/`paused`), `adFormatConfigurations`, `applicationId`, `createdAt`, `updatedAt` | new                                        |

> ⚠️ \*\*IDを再マップすることは最もリスクの高いステップです。\*\*クライアントが古い機能の配置を維持していた場所
> slug を識別子として使用する場合、パス操作の新しい UUID `id`を格納する必要があります。
> は`key`として存続します。`legacy placement slug → new {id, key}`検索のビルドと永続化は、
> 移行。

### 例##example

**古い機能 — 広告単位でのバッチ作成:**

```json
POST /monetize/v1/projects/{projectId}/stores/apple/adunits/{adUnitId}/placements
[ { "name":"Rewarded Placement", "id": "rewarded_01",
    "addTargets": [ { "value":18.5, "type": "global" } ] } ]
```

**新規 — 配置ごとに1つの作成（ターゲットの削除、adFormat + 設定の追加）：**

```json
POST /ads/publisher/public/v1/organizations/{orgId}/applications/{applicationId}/placements
{
  "name": "リワード配置",
  "adFormat": "rewarded",
  "adFormatConfigurations": {
    "name": "coins",
    "value":100,
    "adminSettings": { "allowSkip": true, "allowSkipInSeconds":5, "muteVideo": false }
  }
}
```

## ブロック D — 組織プレースリスト##block-d--organization-placements-list

### 変更内容##what-changed

同じ意図（組織内のすべてのプレースメントのリスト）ですが、反応形状が異なります。eCPM`targets`は
gone； `adFormat`、`platform`、および`storeId`が追加されます。古い機能`id`は `placementId` になります。
(人間が判読できるキー)。**アクティブな iOS/Android** プレースメントのみが返されます。

### エンドポイントマッピング##endpoint-mapping

| **古い機能**                                            | **新規**                                            |
| --------------------------------------------------- | ------------------------------------------------- |
| `GET /monetize/v1/organizations/{orgId}/placements` | `GET /public/v1/organizations/{orgId}/placements` |

### フィールドマッピング (`placementWithGameId` → `OrganizationPlacementPublicResponseDto`)##field-mapping-(placementwithgameid--organizationplacementpublicresponsedto)

| **古い機能フィールド**   | **新しいフィールド**                                             | **ノート**                               |
| --------------- | -------------------------------------------------------- | ------------------------------------- |
| `id`            | `placementId`                                            | 人間が判読できるキー（`Banner_Android`など）になりました。 |
| `name`          | `name`                                                   | unchanged                             |
| `placementType` | `placementType`                                          | unchanged (文字列、例: `bidding`)          |
| `gameId`        | `gameId`（integer、nullable）                               | unchanged                             |
| `targets` (配列)  | —                                                        | 🚫 を削除しました                            |
| —               | `adFormat` (`rewarded`/`interstitial`/`banner`/`native`) | 新                                     |
| —               | `platform` (`ios`/`android`/`""`)                        | 新規； iOS と Android のどちらでもない場合の`""`     |
| —               | `storeId` (nullable)                                     | 新                                     |

## ブロックE - eCPMターゲットを削除##block-e---ecpm-targets-removed

### 🚫 新しいパブリック API には同等のものはありません##-no-equivalent-in-the-new-public-api

すべての古い機能ターゲット エンドポイントはなくなり、この API に**代わるもの**はありません。
`getTargets`、 `createTargets`、 `getTargetDetail`、 `patchTarget`、 `deleteTarget`、 および
placements/ad-units の `targets`/`addTargets` フィールド。

**エージェント指示:**

1. これらを新しいエンドポイントにマップし**ない**でください。`…/targets`パスを作成しません。
2. すべての配置作成/更新ペイロードから `targets`/`addTargets` を削除します。
3. クライアントのインテグレーションがこのAPIを介してeCPMの下限価格を管理する場合は、これを**停止してレポートする
   人間**がブロックするギャップ — eCPMターゲット管理は新しいパブリッシャーではカバーされない
   パブリックAPI。帯域外で処理する必要がある(例えば、異なるUnityサーフェスや製品を使用)
   decision)。明示的にフラグを立てます。価格ロジックを提示せずに黙ってドロップしないでください。

## ブロック F — アプリケーションテストモード (NEW)##block-f--application-test-mode-(new)

古い機能と同等なものはありません。新しいエンドポイント:

* `GET …/applications/{applicationId}/test-mode` → `{ id, testMode }`
* `PATCH …/applications/{applicationId}/test-mode` と `{ "testMode": "forceAll" | "forceOff" }`

アプリケーション反応にも`testMode`があります(ブロック A)。Migration is additive only（移行は付加的のみ）：
古い機能 API にはポートするものはありません。クライアントがテストモードコントロールが必要な場合は、これらを公開します。

## ブロック G — テストデバイス (NEW)##block-g--test-devices-(new)

古い機能と同等なものはありません。Org-scoped CRUD (組織スコープ付き CRUD):

* `POST …/organizations/{orgId}/test-devices` — `CreateTestDevicePublicDto` `{ name*, advertisingId*, platform? }`
* `GET …/organizations/{orgId}/test-devices` — リスト（任意の`platform`フィルター）
* `GET …/organizations/{orgId}/test-devices/{testDeviceId}` — 購入
* `PATCH …/organizations/{orgId}/test-devices/{testDeviceId}` — `UpdateTestDevicePublicDto`
* `DELETE …/organizations/{orgId}/test-devices/{testDeviceId}` — 204

`testDeviceId` は UUID です。`platform` は完全なプラットフォーム enum を使用します。
(`Android`, `iOS`, `OSX`, `Windows`, `Linux`, `WebGL`, `Windows_Store`, `PS4`, `PS5`, `XboxOne`,
`tvOS`, `Switch`, `VisionOS`).マイグレーションは加算的です。

## 推奨される移行アルゴリズム (エージェントの決定的な順序)##suggested-migration-algorithm-(deterministic-order-for-the-agent)

1. **構成:** ベースホストを`…/ads/publisher`にスワップし、パスプレフィックスを「`/monetize/v1`」→「`/public/v1`」にします。
   Basic 認証を維持します。すべての`dryrun`パラメーターを削除します。
2. **アプリケーション(ブロック**A):古い機能プロジェクトごとに、ストアごとに1つのアプリケーションを作成。Transform
   `coppa` enum→boolean、drop `adsProvider`、set `platform`/`store`/`storeId`。グループ化
   `projectName`/`projectId`.`legacy projectId+store → new {applicationId, projectId}` マップを持続します。
3. \*\*Placements（Block C）：**古い機能配置ごとに、マップから所有アプリケーションを解決し、
   `adFormat`（古い機能の広告単位） + `adFormatConfigurations`を使用して個別に作成
   (広告単位/管理者設定から)。**`targets`/`addTargets` をドロップします。\*\*持続
   `legacy placement slug → new {id, key}`.
4. \*\*再ポイント識別子：\*\*格納された古い機能配置ナメクジをパスの新しい UUID `id`に置き換えます。
   ops (ディスプレイの`key`を保持)。格納されている `projectId` ベースのアプリケーション参照を `applicationId` に置き換えます。
5. **アーカイブセマンティクス:** `archive:true/false`パッチコールを`DELETE`/`PATCH …/restore`に置き換えます。
6. **リスト/読み取り形状：** フィールドテーブルごとの反応解析の更新（esp. org リスト — ブロック D）。
7. \*\*eCPMターゲット(\*\*ブロックE): ターゲットコードを削除し、**ユーザーにレポート**します。
8. **任意新機能:** テストモード (F) とテストデバイス (G) は、必要な場合のみ接続します。
9. **レート制限:** 上限は 1 秒未満と 60 時間未満で作成され、20 秒未満で読み取ります。

## 検証チェックリスト (移行後に実行)##validation-checklist-(run-after-migration)

* [ ] リクエスト パスに`/monetize/v1`、`/projects/{`、`/adunits`、`/stores/`、または`/targets`は含まれません。
* [ ] `adsProvider`、`addTargets`、`targets`、または`archive`を含むリクエスト ボディはありません。
* [ ] `coppa` は、すべての場所でブーリアンです （決して `"compliant"`/`"non_compliant"` ではありません）。
* [ ] 配置作成/更新のたびに、有効な`adFormat`と`adFormatConfigurations`が送信されます。
  その形式と一致します。
* [ ] 配置パスパラメーターは、古い機能のナメクジ （`key`） ではなく、新しい UUID `id`を使用します。
* [ ] 2つのストアを持つ古い機能プロジェクトでは、1つの`projectId`を共有する2つのアプリケーションが生成されていました。
* [ ] eCPM ターゲット管理は、(クライアントがターゲット管理を使用している場合) サポートされていないギャップとしてユーザーに認識されました。

## クイック リファレンス:🚫削除済み/同等なし(移行または製造しない)##quick-reference:--removed-/-no-equivalent-(do-not-migrate-or-fabricate)

* すべて**の広告単位**エンドポイントと広告単位リソース。
* すべての **eCPM ターゲット**エンドポイントと `targets`/`addTargets` フィールド。
* プロジェクトの`adsProvider`と`maxCaps`。
* `dryrun`および`showarchived`クエリパラメーター。
* クライアントによって選択された配置 ID（サーバが UUID を割り当てます。スラッグは `key` として保持します）。
