# LLM コーディングエージェントの広告主向け公開 API 移行リファレンス

> LLM コーディング エージェントが、クライアントのインテグレーションをユーザー獲得管理 API (legacy)から Ads 統合プラットフォームのパブリック API に移行するためのリファレンス。

> **オーディエンス：**このファイルは、LLM コーディングエージェント (クロードコードまたは
> Unityの**古い機能**である「Advertise API」からクライアントのインテグレーションを移行するタスク
> (`/advertise/v1/...`、`mz-advertiser-public-api` サービス) を**新しい** Unity Ads に送信
> **Advertiser** Public API (`/ads/advertiser/public/v1/...`)。自己完結型に分割されます。
> エンティティブロック。各ブロックには\_、変更内容\_と\_具体的な対応\_が示されます。を読む
> まず、**概念モデル変更**と**グローバル変更**のセクションがあります。これらはすべてのブロックに適用されます。

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

1. この散文ではなく、2 つの契約を真実のソースとして扱います。古い機能 =
   `mz-advertiser-public-api/openapi/specs/advertise-v1.yml`.新規 =
   `ads-unified-platform/openapi/advertiser/platform-public-v1-routes.yaml`.このガイドでは、
   古い機能 **v1** のみ。クライアントが `/advertise/v2alpha1/...` を呼び出す場合は、そのスペシフィケーションの差分
   (`advertise-v2-alpha.yml`) を別に作成し、v2 のみの使用をユーザーに提示します。
2. 指定した順序で**エンティティブロックを1**つずつ移行します(「Apps(アプリケーション)」、「Attribution(アトリビューション)」、「Creatives(クリエイティブ)」、「
   クリエイティブパック → キャンペーン管理 → キャンペーン → 入札 → バジェット → ターゲティング → 割り当て)。実行
   依存するブロックがコンパイル/パスされるまでブロックを開始しない。アプリケーションファースト: すべてが
   新しい`applicationId`。アトリビューションは即座に続き（アプリケーションレベル）、キャンペーンは
   管理検索(`sdk-event-names`/`eligibility`)はキャンペーンの前に来ます。なぜなら、キャンペーンがフィードされるためです。
   キャンペーン設定。
3. レガシー機能が **🚫 No equivalent** (同等の機能 **なし**) の下にリストされている場合、
   エンドポイント。停止し、オープンな質問としてユーザーに提示します。最も重要な例は以下のとおりです。
   **`DELETE app`**(アプリケーション ライフサイクルは現在 USF が所有しています)と**非推奨のリテンション
   product area** (リテンション入札/適格性) — ブロックを参照してください。
4. 各ブロックの後に、フィールドテーブルごとにフィールド名を再マップする。フィールドは持ち越されないと仮定する
   テーブルに "unchanged" と表示されていない限り変更されません。
5. **両替単位** (ドル → マイクロドル) と**アプリケーション ID の**変更の種類
   (24 文字の hex → UUID)。この 2 つの Transform はほとんどすべてのブロックに触れます。最初に正しく

***

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

APIは統合プラットフォームに再ホストされ、「キャンペーン セット」(アプリケーション)**が中心になりました。
プラットフォーム`Application` (UUID) に対する 24 文字の Mongo ID として**、サブリソース読み取りは
キャンペーン オブジェクトと 5 つの別々の入札エンドポイントが 1 つに折りたたまれます。

### 古い機能モデル##legacy-model

```xml
組織
└── アプリケーション (campaignSetId、24 文字の 16 進数) ← パス内の "apps"
    ├──クリエイティブ
    ├── クリエイティブパック
    └── Campaign  (goal: installs|retention|roas|creativeTesting|eventOptimization)
        ├── cpi-bids | source-bids | roas-bids | retention-bids | event-optimization-bids
        │ （5 つの異なるサブリソース、各 GET/PUT/パッチ、ドル文字列）
        ├── ターゲット設定 (GET + パッチ)
        ├── バジェット (GET + パッチ、ドル、日または日ごとの国別マップ)
        └─── 割り当て済みクリエイティブパック (POST/DELETE を 1 つずつ)
```

### 新しいモデル##new-model

```xml
組織
└── アプリケーション (applicationId、UUID) ← パス内の "applications"
    ├── クリエイティブ (パッチ + 削除も可)
    ├── クリエイティブパック
    ├── アトリビューション（GET + パッチ、アプリケーションレベル） ← アトリビューションの新しい配置
    └── キャンペーン（optimizationType：cpi|legacyRetention|roas|appEventConversion、isCreativeTesting）
        ├── 入札（1パッチ.../入札、roas|manual|manualSource|appEvent）
        ├── ターゲット設定 (パッチのみ)
        ├── バジェットキャップ(パッチのみ、マイクロドル、countryGroupDailyLimits)
        ├── assign-creative-pack / unassign-creative-pack (リストベースのパッチ/削除)
        └── (入札/バジェット/ターゲティング/パックの読み取りは GET キャンペーン?includeFields=… から取得)
組織
└─── キャンペーン（新しい組織全体のリスト、appIds によるフィルター）
```

**以下のすべてのトランスフォーメーションを推進するシフト:**

| **#** | **Shift**                       | **移行の結果**                                                                                                                                                                                     |
| ----- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1     | **`apps` → `applications`**     | リソース パス セグメントの名前が変更されました。ID は `campaignSetId`（16 進数で 24 文字）から `applicationId`（**UUID**）に変わります。`legacy campaignSetId → new applicationId` ルックアップをビルドします。                                       |
| 2     | **マネー → マイクロドル**                | すべての入札/予算はドル文字列(`"0.201"`、`"2500.20"`)でした。新しい API は整数 **マイクロドル** (1 USD = 1\_000\_000) です。1e6 で乗算します。                                                                                         |
| 3     | **入札エンドポイント×5 → 1**             | `cpi/source/roas/retention/event-optimization-bids`は、型付きのボディを持つ 1 つの`PATCH …/bids`に折り畳まれます。**No GET bids** — `GET campaign?includeFields=bids` で読み取ります。                                       |
| 4     | **折り畳まれたサブリソース読み取り**            | 古い機能`GET …/budget`、`GET …/targeting`、`GET …/*-bids`、`GET …/assigned-creative-packs`は失われています。`GET campaign?includeFields=bids,budget,creativePacks` から読み取ります。                                  |
| 5     | **`goal` → `optimizationType`** | キャンペーンタイプ enum が変更および分割されました (`creativeTesting` は`isCreativeTesting`ブーリアンになり、`eventOptimization` は `appEventConversion` + `appEventType` になりました)。                                             |
| 6     | **Attribution moved**           | **キャンペーン**作成ボディと**アプリケーション**の古い機能セットのトラッキングURL。新しいAPI:キャンペーン更新には`attributionLinks`がかかりますが、アプリケーションレベルの専用`GET/PATCH …/attribution`が用意されています。キャンペーンの **create ではアトリビューション URL は受け付けられなくなりました**。 |
| 7     | **割り当てはリストベース**                 | 古い機能の割り当て/割り当て解除はリクエストごとに1パック。新しい API は、1 回の呼び出しで`creativePackIds`の **配列** と置き換え/削除します。                                                                                                       |

***

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

| **アスペクト**                 | **古い機能**                                                              | **新規**                                                                                                                                                                                        |
| ------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Host**                  | `https://services.api.unity.com`                                      | `https://services.api.unity.com/ads/advertiser` (本番) · `https://staging.services.api.unity.com/ads/advertiser` (ステージング)                                                                       |
| **パスプレフィックス**             | `/advertise/v1`                                                       | `/public/v1`                                                                                                                                                                                  |
| **アプリケーションパスセグメント**       | `…/organizations/{orgId}/apps/{campaignSetId}`                        | `…/organizations/{organizationId}/applications/{applicationId}`                                                                                                                               |
| **完全な例**                  | `…/advertise/v1/organizations/{orgId}/apps/{campaignSetId}/campaigns` | `…/ads/advertiser/public/v1/organizations/{orgId}/applications/{applicationId}/campaigns`                                                                                                     |
| **Auth**                  | HTTP **Basic**（サービスアカウントキー）                                           | HTTP **Basic** は引き続き機能します。Bearer JWT (`unity`/`ads`発行者) も使用可能です。認証情報は変更されませんが、**必要なロール/権限が異なります** — 後述の「承認」を参照してください。                                                                         |
| **Org id**                | パス内の`organizationId` (int64)                                          | パス内の`organizationId`（Genesis ID、数値）： **変更なし**                                                                                                                                                 |
| **App ID (タイプ変更)**        | `campaignSetId`：24 文字の 16 進数（`^[0-9a-fA-F]{24}$`）                     | `applicationId` — **UUID**                                                                                                                                                                    |
| **お金**                    | ドル 10 進数文字列（`"2500.20"`、入札`"0.201"`）                                  | **microdollars** as integer strings/numbers (`"2500200000"`); 1 USD = 1\_000\_000                                                                                                             |
| **キャンペーン/クリエイティブ/パック ID** | 24 文字の hex — **変更なし** (`^[a-f0-9]{24}$`)                              | 24 文字の hex — **変更なし**                                                                                                                                                                         |
| **リストエンベロープ**             | `{ total, offset, limit, results[] }` everywhere                      | ⚠️ **一貫性がない:** キャンペーンとクリエイティブで`{ items[], meta:{ total, limit, offset } }`を使用。クリエイティブパックで`{ total, offset, limit, results[] }`を使用。**アプリケーションがベア JSON 配列を返す** (エンベロープなし、ページ分割なし)。エンドポイントごとの解析。 |
| **ページ分割パラメーター**           | `offset`（0）、`limit`（最大1000、デフォルト1000）：すべてのリスト                         | `offset`（0）、`limit`（デフォルト **100**）は、ページ処理されたリスト（キャンペーン、クリエイティブ、クリエイティブパック）のみ。**`GET …/applications` takes neither**：そこにパラメーターをドロップ（ブロック A）                                                    |

### 承認 (ロール/権限) — 403 がバグであると仮定する前にお読みください。##authorization-(roles/permissions)--read-before-assuming-403-is-a-bug

Authentication は変更されません（同じ Basic クレデンシャル）。ただし、**承認は変更**されません。新しい
エンドポイントは、ゲートウェイでチェックされた権限文字列によってゲートされます(新しい
spec under `x-unity-gateway.authorization.rules`)。広告主ルートには`advertise.*`が必要です
permissions (`advertise.campaigns.*`、`advertise.creatives.*`、`advertise.creative_packs.*`、
`advertise.bids.update`、`advertise.targeting.update`、`advertise.apps.*`、…)、
Unity Cloudダッシュボードでの**組織スコープ サービス アカウント ロール**(例:「API アプリの宣伝」
Editor" は`advertise.apps.get/list/create/update/delete`を付与します)。共有`…/applications`
エンドポイントは、`advertise.apps.*` またはパブリッシャー側の`monetize.projects.*`のいずれかを受け入れます。

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

1. 移行前に、クライアントのサービス アカウントに必要な情報が保持されているかどうかをユーザーに確認してもらう
   新しい API の広告主の役割:古い機能 API の付与は引き継がれ**ない**でください。
2. 古い API で動作したリクエストが新しい API で **403** を返し、
   認証情報がある場合は、リクエストのバグではなく、ロールの**付与が欠落**しているものとして扱います。停止および表面化;
   リクエストを「修正」しようとして変更しないでください。

### レート制限（クライアント側バックオフの更新）##rate-limits-(update-client-side-backoff)

| **操作クラス**                 | **古い機能**                  | **新規**                                              |
| ------------------------- | ------------------------- | --------------------------------------------------- |
| 読み取り (`GET`)              | 429 defined; per-resource | リソース リミッタあたり**20/秒 + 8000/時**                       |
| 作成 (`POST`)               | (batched)                 | **1/秒 + 60/時間** (`advertiseCreate`)                 |
| アップデート (`PATCH`/`DELETE`) | (バッチ処理)                   | **1/s + 200/hour** (`advertiseModify`)              |
| 入札の更新                     | (バッチ アレイ)                 | **20/秒 + 12000/時** (`advertiseBids`) + 階層の変更        |
| キャンペーン管理読み取り              | —                         | **6/s + 8000/hour** (`advertiseCampaignManagement`) |

***

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

| **古い機能操作**                                  | **古い機能ルート**                                                | **新しい operationId**                                                      | **新規ルート**                                                        | **ブロック** |
| ------------------------------------------- | ---------------------------------------------------------- | ------------------------------------------------------------------------ | ---------------------------------------------------------------- | -------- |
| `advertise-listApps`                        | `GET …/apps`                                               | `publicOrganizationApplications`                                         | `GET …/applications`                                             | A        |
| `advertise-createApp`                       | `POST …/apps`                                              | `publicCreateApplication`                                                | `POST …/applications`                                            | A        |
| `advertise-getApp`                          | `GET …/apps/{campaignSetId}`                               | `publicGetApplicationById`                                               | `GET …/applications/{applicationId}`                             | A        |
| `advertise-updateApp`                       | `PATCH …/apps/{campaignSetId}`                             | `publicUpdateApplication`                                                | `PATCH …/applications/{applicationId}`                           | A        |
| `advertise-deleteApp`                       | `DELETE …/apps/{campaignSetId}`                            | —                                                                        | 🚫 アプリケーション削除エンドポイントなし                                           | A        |
| `advertise-listCreatives`                   | `GET …/apps/{id}/creatives`                                | `publicGetCreatives`                                                     | `GET …/applications/{id}/creatives`                              | B        |
| `advertise-createCreative`                  | `POST …/apps/{id}/creatives` (マルチパート)                      | `publicCreateCreative`                                                   | `POST …/applications/{id}/creatives` (マルチパート)                    | B        |
| `advertise-getCreative`                     | `GET …/creatives/{creativeId}`                             | `publicGetCreativeById`                                                  | `GET …/applications/{id}/creatives/{creativeId}`                 | B        |
| —                                           | —                                                          | `publicUpdateCreativeById`                                               | `PATCH …/creatives/{creativeId}`(NEW: 名前の変更)                     | B        |
| —                                           | —                                                          | `publicDeleteCreativeById`                                               | `DELETE …/creatives/{creativeId}` (NEW)                          | B        |
| `advertise-listCreativePacks`               | `GET …/creative-packs`                                     | `publicGetCreativePacks`                                                 | `GET …/applications/{id}/creative-packs`                         | C        |
| `advertise-createCreativePack`              | `POST …/creative-packs`                                    | `publicCreateCreativePack`                                               | `POST …/applications/{id}/creative-packs`                        | C        |
| `advertise-getCreativePack`                 | `GET …/creative-packs/{packId}`                            | `publicGetCreativePackById`                                              | `GET …/applications/{id}/creative-packs/{creativePackId}`        | C        |
| `advertise-updateCreativePack`              | `PATCH …/creative-packs/{packId}`                          | `publicUpdateCreativePack`                                               | `PATCH …/creative-packs/{creativePackId}`                        | C        |
| `advertise-deleteCreativePack`              | `DELETE …/creative-packs/{packId}`                         | `publicDeleteCreativePack`                                               | `DELETE …/creative-packs/{creativePackId}`                       | C        |
| `advertise-listCampaigns`(アプリごと)            | `GET …/apps/{id}/campaigns`                                | `publicGetCampaigns`(組織全体)                                               | `GET …/organizations/{orgId}/campaigns?appIds={applicationId}`   | D        |
| `advertise-createCampaign`                  | `POST …/apps/{id}/campaigns`                               | `publicCreateCampaign`                                                   | `POST …/applications/{id}/campaigns`                             | D        |
| `advertise-getCampaign`                     | `GET …/campaigns/{campaignId}`                             | `publicGetCampaignById`                                                  | `GET …/applications/{id}/campaigns/{campaignId}?includeFields=…` | D        |
| `advertise-updateCampaign`                  | `PATCH …/campaigns/{campaignId}`                           | `publicUpdateCampaign`                                                   | `PATCH …/applications/{id}/campaigns/{campaignId}`               | D        |
| `advertise-deleteCampaign`                  | `DELETE …/campaigns/{campaignId}`                          | `publicDeleteCampaignById`                                               | `DELETE …/applications/{id}/campaigns/{campaignId}`              | D        |
| `advertise-list/replace/patchCpiBids`       | `GET/PUT/PATCH …/campaigns/{id}/cpi-bids`                  | `publicUpdateBids` (`manualBids`)                                        | `PATCH …/campaigns/{campaignId}/bids`                            | E        |
| …SourceBids                                 | `…/source-bids`                                            | `publicUpdateBids` (`manualSourceBids`)                                  | `PATCH …/campaigns/{campaignId}/bids`                            | E        |
| …RoasBids                                   | `…/roas-bids`                                              | `publicUpdateBids` (`roasBids`)                                          | `PATCH …/campaigns/{campaignId}/bids`                            | E        |
| …EventOptimizationBids                      | `…/event-optimization-bids`                                | `publicUpdateBids` (`appEventBids`)                                      | `PATCH …/campaigns/{campaignId}/bids`                            | E        |
| …RetentionBids                              | `…/retention-bids`                                         | —                                                                        | 🚫リテンション入札は非推奨 — サポート終了                                          | E        |
| `advertise-getBudget`                       | `GET …/campaigns/{id}/budget`                              | — (キャンペーンで読む)                                                            | `GET campaign?includeFields=budget`                              | F        |
| `advertise-updateBudget`                    | `PATCH …/campaigns/{id}/budget`                            | `publicPatchCampaignBudgetCap`                                           | `PATCH …/campaigns/{campaignId}/budget-cap`                      | F        |
| `advertise-getTargeting`                    | `GET …/campaigns/{id}/targeting`                           | — (キャンペーンで読む)                                                            | `GET campaign`(レスポンスのターゲティングフィールド)                               | G        |
| `advertise-updateTargeting`                 | `PATCH …/campaigns/{id}/targeting`                         | `publicPatchCampaignTargeting`                                           | `PATCH …/campaigns/{campaignId}/targeting`                       | G        |
| `advertise-listAssignedCreativePacks`       | `GET …/campaigns/{id}/assigned-creative-packs`             | — (キャンペーンで読む)                                                            | `GET campaign?includeFields=creativePacks`                       | H        |
| `advertise-assignCreativePack`(one)         | `POST …/assigned-creative-packs`                           | `publicAssignCreativePacks` (list)                                       | `PATCH …/campaigns/{campaignId}/assign-creative-pack`            | H        |
| `advertise-unassignCreativePack`(one)       | `DELETE …/assigned-creative-packs/{id}`                    | `publicUnassignCreativePacks` (list)                                     | `DELETE …/campaigns/{campaignId}/unassign-creative-pack`         | H        |
| `advertise-listSdkEventNames`               | `GET …/audience-pinpointer/sdk-event-names`                | `publicGetSdkEventNames`                                                 | `GET …/applications/{id}/sdk-event-names`                        | I        |
| `advertise-listEventOptInfo`                | `GET …/audience-pinpointer/event-optimization-info`        | `publicGetCampaignManagementEligibility`                                 | `GET …/applications/{id}/eligibility`                            | I        |
| `advertise-listRoasInfo` / `…RetentionInfo` | `GET …/audience-pinpointer/roas-info` / `…/retention-info` | —                                                                        | 🚫 ROAS に適格性は必要なくなりました。リテンションは非推奨です                              | I        |
| — (アトリビューションはキャンペーン/アプリでした)                 | (`attributionClickUrl`/`attributionStartUrl`)              | `publicGetApplicationAttribution` / `publicUpdateApplicationAttribution` | `GET/PATCH …/applications/{id}/attribution`                      | J        |

***

## ブロック A — アプリ → アプリケーション##block-a--apps--applications

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

* パス セグメント `apps` → `applications`； ID `campaignSetId`（16 進数で 24 文字） → `applicationId`
  (**UUID**)。これは**最もリスク**の高い再マップします。キャンペーン/クリエイティブ/パック呼び出しはすべてネストされます。
  その下に移行中に`legacy campaignSetId → new applicationId`マップをビルドおよび維持します。
* `platform` は、作成時に**必須の明示**的なフィールドになりました (`store` によって暗示されました)。
* アプリケーションレベルのトラッキング URL (`appAttributionClickUrl`/`appAttributionStartUrl`) は
  専用アトリビューションエンドポイント — ブロック J を参照してください。
* **`DELETE app` に同等**の機能はありません (意図的なものと確認済み)。アプリケーションライフサイクルの移行
  Unity Services Foundation (USF) に対する広告主の範囲であり、アプリケーション削除は現在
  プラットフォーム全体で無効。新しいアプリケーションリソースはリスト/作成/取得/更新のみを公開します。もし
  クライアントは API を介してアプリケーションを削除し、停止して表示します。
* **リストの形状が変更され、ページ処理/フィルタが失われました。**古い機能`GET …/apps`が返されました
  `offset`/`limit` と `filter[store]`/`filter[storeId]` の`{ total, offset, limit, results[] }`
  クエリ params。New `GET …/applications` は、すべての組織の**ベア JSON 配列**を返します。
  アプリケーション — エンベロープ、ページ処理、フィルタなし。params とフィルター/ページ処理のドロップ
  client-side.

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

| **古い機能フィールド**                                   | **新しいフィールド**                             | **ノート**                                                                                         |
| ----------------------------------------------- | ---------------------------------------- | ----------------------------------------------------------------------------------------------- |
| `name` (必須)                                     | `name` (必須)                              | unchanged                                                                                       |
| `store` (`apple`/`google`/`standalone_android`) | `store` + `platform`                     | **enum を再マップする** → `AppleAppStore`/`GooglePlay`/… \*\* と\*\* `platform`を設定 (`iOS`/`Android`/…)。 |
| `storeId`(必須)                                   | `storeId`(任意)                            | unchanged value                                                                                 |
| —                                               | `platform`（**必須**、enum）                  | **新規、必須**。古い機能`store`を継承します。                                                                    |
| `adomain`                                       | —                                        | 🚫 アプリケーション反応のフィールドがありません。クライアントが依存している場合に表面化します。                                               |
| `gameId` (整数)                                   | `gameId`（integer、nullable）               | **反応**に存在します。作成入力ではなく、サーバー側で設定します。                                                              |
| `appAttributionClickUrl`                        | → 帰属 `clickUrl`                          | **移動。** 作成後に`PATCH …/attribution`で設定します (ブロック J)。                                               |
| `appAttributionStartUrl`                        | → 帰属 `startUrl`                          | **移動**`PATCH …/attribution` (ブロック J) で設定します。                                                    |
| —                                               | `privacy.coppa`, `privacy.mixedAudience` | new 任意 privacy オブジェクト                                                                           |
| —                                               | `projectId` / `projectName`              | 新しい任意グループ化（パブリッシャー/広告主共有アプリケーションモデル）                                                            |

New `store` enum： `GooglePlay`、`AppleAppStore`、`SamsungGalaxy`、`AmazonAppStore`、`MacAppStore`、
`UDP`, `MicrosoftStore`, `HuaweiAppGallery`, `APK`.New `platform` enum： `Android`、`iOS`、`OSX`、
`Windows`, `Linux`, `WebGL`, `Windows_Store`, `PS4`, `PS5`, `XboxOne`, `tvOS`, `Switch`, `VisionOS`.

古い機能`store` → 新しい`{store, platform}` (確認済み): `apple` → `{AppleAppStore, iOS}`、`google` →
`{GooglePlay, Android}`； `standalone_android` → 実際のストアによる — Samsung →
`{SamsungGalaxy, Android}`、Huawei → `{HuaweiAppGallery, Android}`。ストアが特定できない場合
プラットフォームはそれを `{APK, Android}` にマップします。

### フィールドマッピング — 反応 (`app` → `ApplicationPublicResponseDto`)##field-mapping--response-(app--applicationpublicresponsedto)

| **古い機能フィールド**                       | **新しいフィールド**                                                                             | **ノート**                      |
| ----------------------------------- | ---------------------------------------------------------------------------------------- | ---------------------------- |
| `id` (24 文字の 16 進数、`campaignSetId`) | `id` (**UUID**)                                                                          | **型の変更。** マッピングを維持します。       |
| `name`                              | `name`                                                                                   | unchanged                    |
| `store` / `storeId`                 | `store` / `storeId`                                                                      | enum 再マップする (前述)             |
| `gameId`                            | `gameId`                                                                                 | unchanged (integer、nullable) |
| `appAttributionClickUrl`/`StartUrl` | ：（`…/attribution` を参照）                                                                   | Attribution リソースに移動しました      |
| `adomain`                           | —                                                                                        | 🚫 行ってしまった                   |
| `createdAt` / `updatedAt`           | ：（DTO にない）                                                                               | アプリケーション反応で公開されない            |
| —                                   | `platform`, `iconUrl`, `projectId`, `testMode`, `kidsSettings`, `coppa`, `mixedAudience` | 新規                           |

> ⚠️ \*\*IDを再マップすることは最もリスクの高いステップです。\*\*Persist `legacy campaignSetId → new {applicationId}`
> `campaignSetId` を使用したすべてのダウンストリーム パスを書き換えます。

***

## ブロック B — クリエイティブ##block-b--creatives

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

* `apps/{campaignSetId}` の代わりに `applications/{applicationId}` の下にネストされています。
* それでも`multipart/form-data`、最初に JSON を`creativeInfo`してからバイナリファイルフィールド。
* **新しい操作:** `PATCH …/creatives/{creativeId}` (名前の変更) と `DELETE …/creatives/{creativeId}`。
* **`type` enum 値**が変更されました（snake＿case）。再マップ。
* 画像アップロード制限が **20 MB** (5 MB) に増加。プレイアブルは **10 MB**。
* **ビデオアップロード (`videoFile`) は古い**機能 (API 所有者の確認が必要) とまったく同じように機能します。OpenAPI
  2026 年 7 月下旬に上陸した動画作成バリアントを文書化したスキーマ。
  spec にはビデオ`oneOf`バリアントがありません。ビデオがサポートされていないと仮定するのではなく、spec を更新してください。

### `type` enum 再マップする##type-enum-remap

| **古い機能`type`**       | **新しい`type`**                                |
| -------------------- | -------------------------------------------- |
| `squareEndCard`      | `end_card_square`                            |
| `endCardPair`        | `end_card_pair`                              |
| `portraitVideo`      | `video_portrait`                             |
| `landscapeVideo`     | `video_landscape`                            |
| `responsivePlayable` | `playable_responsive`                        |
| `portraitPlayable`   | `playable_portrait`                          |
| `landscapePlayable`  | `playable_landscape`                         |
| `squareVideo`        | 🚫 **サポートされていません** — 縦向き/横向きのビデオのみが存在します。表面。 |
| —                    | `banner` (新規)                                |

### `status` enum##status-enum

変更されていないセット: `uploaded`、`processing`、`processingFailed`、`pendingModeration`、`approved`、
`rejected`.

### multipart フィールド名##multipart-field-names

`creativeInfo` (JSON、first) + 次のいずれか 1 つ: `squareEndCardFile`、`portraitEndCardFile` +
`landscapeEndCardFile`、つまり `playableFile`。 `creativeInfo` サブオブジェクトは、
`fileName`。Playable は`orientation`も持ちます (`landscape`/`portrait`/`both`)。反応は
`CreativePublicResponseDto` (`id`, `name`, `language`, `type`, `status`, `files[]{name,url}`,
`createdAt`, `updatedAt`).

***

## Block C — クリエイティブパック##block-c--creative-packs

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

* `applications/{applicationId}` の下にネストされています。CRUD 動詞は同じです（GET/POST/GET/パッチ/削除）。
* `type` は `banner` 値 `video`、`playable`、`video+playable`、`banner` を取得します。
* **リストエンベロープ**は古い機能`{ total, offset, limit, results[] }`です (キャンペーンやクリエイティブとは異なります)。
* 反応はより豊富です。`applicationId`、`moderationStatus`(`pending`/`approved`/`rejected`、
  nullable）、`ageRating`（nullable）、`assignedCampaignIds[]`、`createdAt`/`updatedAt`。

### フィールドマッピング — 作成 (`createCreativePack` → `CreateCreativePackPublicDto`)##field-mapping--create-(createcreativepack--createcreativepackpublicdto)

| **古い機能フィールド**         | **新しいフィールド**          | **ノート**                      |
| --------------------- | --------------------- | ---------------------------- |
| `name` (必須)           | `name` (必須)           | unchanged                    |
| `creativeIds[]` (1–3) | `creativeIds[]`       | 変更なし (24 文字の hex クリエイティブ ID) |
| `type`                | `type`                | 同じ値 + 新しい`banner`            |
| `androidStoreListing` | `androidStoreListing` | unchanged (nullable)         |
| `appleProductPageId`  | `appleProductPageId`  | unchanged (UUID、nullable)    |

### フィールドマッピング — 反応##field-mapping--response

| **古い機能フィールド**                 | **新しいフィールド**                                                               | **ノート**         |
| ----------------------------- | -------------------------------------------------------------------------- | --------------- |
| `id`                          | `id`                                                                       | 24 文字の hex：変更なし |
| `name`, `type`, `creativeIds` | same                                                                       | unchanged       |
| `campaignIds`                 | `assignedCampaignIds`                                                      | **renamed**     |
| —                             | `applicationId`, `moderationStatus`, `ageRating`, `createdAt`, `updatedAt` | new             |

***

## ブロック D — キャンペーン##block-d--campaigns

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

* `applications/{applicationId}` の下にネストされています。取得/更新/削除はアプリケーションごと。**リスト表示はアプリケーションごとになりました。
  組織全体**（`GET …/organizations/{orgId}/campaigns`、フィルター`appIds`）：アプリケーションごとのリストはありません。
* **`goal` → `optimizationType`** (+ `isCreativeTesting` ブーリアン + `appEventType`)。
* \*\*アトリビューション URL はキャンペーン作成の一部ではなくなりました。\*\*キャンペーンでの作成後に設定
  `PATCH`（`attributionLinks`）またはアプリケーションアトリビューションエンドポイント（ブロック J）。
* **`scheduleEnd`は作成フィールド**ではありません。作成は`start`のみで、`PATCH`で`end`を設定します。
* `GET campaign`は`includeFields`（`bids`、`budget`、`creativePacks`、`application`）をサポートします。
  入札/バジェット/割り当て済みパックの読み取り方法です。
* `postInstallWindow`値は、`D0`、`D1`、、`D3`、、、`D7`、`D14`、`D28` の**大文字と展開**です。

### `goal` → 再マップする`optimizationType`##goal--optimizationtype-remap

| **古い機能`goal`**      | **新規**                                                                                                                   |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| `installs`          | `optimizationType: cpi`                                                                                                  |
| `retention`         | `optimizationType: legacyRetention`: ⚠️ リテンションは**非推奨**:入札/適格性はサポートされません。新しいリテンションキャンペーンを作成しない。アクティブなキャンペーンを表示する。         |
| `roas`              | `optimizationType: roas` (+ `roasType`)                                                                                  |
| `eventOptimization` | `optimizationType: appEventConversion` (+ `appEventType`)                                                                |
| `creativeTesting`   | `isCreativeTesting: true` + 基本の**手動**最適化(APIオーナーごとに、現在サポートされている基本のみ、つまり手動CPI: `optimizationType: cpi`、`cpiType: manual`) |

### フィールドマッピング — 作成 (`createCampaign` → `CreateCampaignDto`)##field-mapping--create-(createcampaign--createcampaigndto)

| **古い機能`goal`**      | **新規**                                                                                                                   |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| `installs`          | `optimizationType: cpi`                                                                                                  |
| `retention`         | `optimizationType: legacyRetention`: ⚠️ リテンションは**非推奨**:入札/適格性はサポートされません。新しいリテンションキャンペーンを作成しない。アクティブなキャンペーンを表示する。         |
| `roas`              | `optimizationType: roas` (+ `roasType`)                                                                                  |
| `eventOptimization` | `optimizationType: appEventConversion` (+ `appEventType`)                                                                |
| `creativeTesting`   | `isCreativeTesting: true` + 基本の**手動**最適化(APIオーナーごとに、現在サポートされている基本のみ、つまり手動CPI: `optimizationType: cpi`、`cpiType: manual`) |

### フィールドマッピング — 更新 (`updateCampaign` → `UpdateCampaignPublicDto`)##field-mapping--update-(updatecampaign--updatecampaignpublicdto)

| **古い機能フィールド**                    | **新しいフィールド**                                   | **ノート**                                    |
| -------------------------------- | ---------------------------------------------- | ------------------------------------------ |
| `name`                           | `name`                                         | unchanged                                  |
| `scheduleStart`/`scheduleEnd`    | `start` / `end`                                | date → datetime； null 可能な`end`             |
| `enabled` (ブーリアン)                | `paused` (ブーリアン)                               | **反転感覚** — `enabled:true` ≈ `paused:false` |
| `autoStart`                      | `autoStart` (`ENABLED`/`DISABLED`)             | uppercased                                 |
| `attributionClickUrl`/`StartUrl` | `attributionLinks.{clickUrl,startUrl,viewUrl}` | ネストされたオブジェクトになりました； `viewUrl`は新規           |

> ⚠️ **更新レスポンスがよりスリムなオブジェクト** (`CampaignPublicDetailsResponseDto`: `id`,
> `name`、 `start` `end`、 `autoStart`、 `paused`、 `attributionLinks`)。キャンペーン全体ではありませ **ん** 。
> クライアントがパッチ反応から他のキャンペーンフィールドを読み取る場合は、`GET campaign`経由で再フェッチします。

### フィールドマッピング — 反応 （古い機能`campaign` → `CampaignPublicResponseDto`）##field-mapping--response-(legacy-campaign--campaignpublicresponsedto)

| **古い機能フィールド**                                                           | **新しいフィールド**                                                                                                     | **ノート**                                                                     |
| ----------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| `id`                                                                    | `id`                                                                                                             | 24 文字の hex：変更なし                                                             |
| `name`, `billingType`                                                   | `name`, `billingType`                                                                                            | unchanged                                                                   |
| `goal`                                                                  | `optimizationType` (+ `isCreativeTesting`, `appEventType`, `roasType`)                                           | 上のテーブルを再マップする（逆向き）                                                          |
| `enabled` (ブーリアン)                                                       | `paused` (ブーリアン)                                                                                                 | ⚠️ **読み取り時の反転センス** — `enabled:true` ≈ `paused:false`                        |
| `status` (`live`/`learning`/`paused`、ROAS)                              | —                                                                                                                | 🚫 新しい反応についてではありません。クライアントがその上で分岐する場合の表面。                                   |
| `scheduleStart` / `scheduleEnd`                                         | `start` / `end`                                                                                                  | date → datetime； null 可能な`end`                                              |
| `biddingStrategy` (`manual`/`automated`)                                | `bidConfigurationMethod` (`manual`/`auto`)                                                                       | 名前の変更 + 値の変更 (`automated` → `auto`)                                         |
| `cpiBids[]` / `sourceBids[]` / `roasBids[]` / `eventOptimizationBids[]` | `manualBids[]` / `manualSourceBids[]` / `roasBids[]` / `appEventBids[]`                                          | 名前が変更されました。**`includeFields=bids` でのみ表示されます**。値はマイクロドルです。                   |
| `retentionBids[]`                                                       | —                                                                                                                | 🚫 リテンション入札 **非推奨** — 書き込みサポートなし。読み取り値はレガシーのみとして扱う                          |
| `budget`                                                                | `budget`                                                                                                         | **`includeFields=budget`** のみ。マイクロドル + `campaignLimitType`/`dailyLimitType` |
| `eventOptimizationType` / `sdkEventName`                                | `appEventType` / `sdkEventNames[]`                                                                               | enum rename; single → array                                                 |
| `autoStart` (`enabled`/`disabled`/`canceled`)                           | `autoStart` (`ENABLED`/`DISABLED`/`CANCELED_REJECTED`/`CANCELED_LESS_THAN_TWO_PACK`)                             | 大文字； `canceled` 2 つの理由に分ける                                                  |
| `createdAt` / `updatedAt`                                               | `createdAt` / `updatedAt`                                                                                        | unchanged                                                                   |
| —                                                                       | `applicationId`, `attribution`, `deviceTargeting`, `budgetPacingType`, `forcePausedEnabled`, `isAutoEligible`, … | new — 新しい仕様を参照                                                              |

### `includeFields` による読み取り##reads-via-includefields

キャンペーンの入札/バジェット/割り当て済みパックの古い機能読み取りでは、個別のGETが使用されていました。更新後:
`GET …/campaigns/{campaignId}?includeFields=bids,budget,creativePacks,application`.Bid 配列、
`budget`、`creativePackIds[]`、フル `application`がキャンペーン オブジェクトに返されます。

***

## ブロック E — 入札（5 つのエンドポイント → 1 つ）##block-e--bids-(five-endpoints--one)

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

5 つの古い機能のサブリソース (`cpi-bids`、`source-bids`、`roas-bids`、`retention-bids`、
`event-optimization-bids`)。それぞれ**にドル文字**列 (`GET`/`PUT`/`PATCH`) が含まれている場合は、
**マイクロドル**で型指定されたボディ上の 1 つの\*\*`PATCH …/campaigns/{campaignId}/bids`\*\*。**ある
no GET** — `GET campaign?includeFields=bids`経由で現在の入札を読み取ります。

### エンドポイント + ボディ再マップする##endpoint-+-body-remap

| **古い機能サブリソース**            | **`UpdateCampaignPublicBidDto`の新しいボディフィールド** | **エントリーごとの形状(新規)**                                                                    |
| ------------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------- |
| `cpi-bids`                | `manualBids[]`                               | `{ country, bid }` (マイクロ単位の`bid`)                                                     |
| `source-bids`             | `manualSourceBids[]`                         | `{ country, sourceAppId, bid }` (micros)                                              |
| `roas-bids`               | `roasBids[]`                                 | `{ country, target, maxBid? }`(`maxBid`マイクロ)                                          |
| `event-optimization-bids` | `appEventBids[]`                             | `{ country, bid }` (マイクロ)                                                             |
| `retention-bids`          | 🚫 **非推奨 — サポートなし**                          | 古い機能`{country, baseBid, maxBid}`には後継がありません（確認済み）。移行しません。クライアントリテンション入札の使用状況を人間に提示します。 |

### Transform(重要)##money-transform-(critical)

古い機能ドル文字列 → 新しいマイクロドル： 1＿000＿000 を乗算します。 `"0.201"` → `201000`ROAS
`goal`/`target` (確認済み): 古い機能 ROAS `goal`は**パーセンテージ文字列** (`"12.34"` = 12.34%)。
新しい`target`は、100 で割る**小数割合**です （`"12.34"` → `0.1234`、 10% → `0.10`）。
セマンティクス (API 所有者による確認):

| **古い機能PUT/パッチモデル**                   | **新しいモデル**                                                           |
| ------------------------------------ | -------------------------------------------------------------------- |
| `PUT` はセット全体を置き換えます。`PATCH` はマージします。 | 単一`PATCH`は、指定されたタイプの入札セット全体を**置き換えます**。マージは行われません。常に完全な目的のセットを送信します。 |

**入札のクリア**(確認済み): `PATCH`内のその入札タイプの空の配列`[]`を送信します。同じ
古い機能`PUT []`としての効果。

> ⚠️ 新しい`PATCH`はマージではなく置き換えであるため、古い機能`PATCH`の単純ポート (マージ)
> リクエストに含まれていない入札はすべてサイレント**でドロップさ**れます。古い機能マージスタイルの変換
> フルセット書き込みの更新:`GET campaign?includeFields=bids`経由で現在の入札を読み取り、
> デルタをローカルで取得し、配列全体を送信します。

***

## ブロックF — バジェット → バジェット上限##block-f--budget--budget-cap

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

* `GET …/budget`が消失 → `GET campaign?includeFields=budget` 経由で読み取られる。
* `PATCH …/budget` → **`PATCH …/campaigns/{campaignId}/budget-cap`**.
* **ドル → マイクロドル** (文字列)。
* **国別マップ**（`dailyPerCountry: { "US": "123.45", … }`）は、
  **名前付き国グループ** (`countryGroupDailyLimits: [{ name, countries[], limit }]`)。
* 反応の新しい明示的な型識別子：`campaignLimitType`（`unlimited`/`total`）、
  `dailyLimitType` (`daily`/`countryDaily`/`unlimited`).

### フィールドマッピング (`budget` → `PatchBudgetCapDto`)##field-mapping-(budget--patchbudgetcapdto)

| **古い機能フィールド**                | **新しいフィールド**                | **ノート**                                                                                                                        |
| ---------------------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `total`(ドル文字列)               | `total` (**micros** 文字列)    | ×1e6。キャップ表現セマンティクスは古い機能(APIオーナーごと)から引き継がれます。`"0"`は、依然として「キャップなし」を意味します。                                                        |
| `daily`(ドル文字列)               | `daily` (**micros** 文字列)    | ×1e6                                                                                                                           |
| `dailyPerCountry` (map)      | `countryGroupDailyLimits[]` | **Restructure:** 各`{country: amount}`はグループ`{ name, countries:[country], limit: amount×1e6 }`になります。クライアントが希望するグループ。`name`が必要です。 |
| `dailySpent`/`spent`（読み取り専用） | — (キャンペーン バジェットで読み取り)       | パッチ反応ではなく、キャンペーンバジェット読み取り時に提示されます。                                                                                             |

***

## ブロック G — ターゲティング##block-g--targeting

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

* `GET …/targeting`がなくなりました → `GET campaign` オフターゲティングフィールドを読みます。
* `PATCH …/targeting`は残りますが、**ボディは再**構成され、ほとんどの古い機能デバイス フィールドは
  ドロップされます (古い機能仕様ではすでに`deprecated`されています)。

### フィールドマッピング (`targetingOptions` → `UpdateCampaignPublicTargetingDto`)##field-mapping-(targetingoptions--updatecampaignpublictargetingdto)

| **古い機能フィールド**                                                                                   | **新しいフィールド**                                                                              | **ノート**                                                                          |
| ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| `appTargeting.allowList` / `blockList`                                                          | `allowlistSources[]` / `blocklistSources[]`                                               | renamed (ソースアプリケーション ID)                                                         |
| `categoryTargeting.allowList` / `blockList`                                                     | `apptopiaSourceCategoriesAllowlist/Blocklist[]` (+ `sensorTower…`)                        | プロバイダー固有のカテゴリ リスト                                                                |
| `deviceTargeting` iOS `blockedDevices` / `osMin`                                                | `appleDevice.deviceBlocklist[]` / `appleDevice.osMinVersion`                              | restructured                                                                     |
| `deviceTargeting` Android `osMin` + メーカー/モデル                                                    | `androidDevice.{manufacturerAllowlist,manufacturerBlocklist,modelBlocklist,osMinVersion}` | restructured                                                                     |
| `regionalTargeting`                                                                             | `allowlistCountrySubdivisions[] {country, subdivisions[]}`                                | subdivision-id based                                                             |
| `limitedAdTracking`, `connectionType`, `screenSize`, `screenDensity`, `allowedDevices`, `osMax` | —                                                                                         | 🚫 **removed** (確認済み — ユニファイド では設定できません)。それらを設定するクライアントコードを削除し、人間にドロップすることを伝えます。 |

***

## ブロック H — 割り当てられたクリエイティブパック (現在はリスト)##block-h--assigned-creative-packs-(now-list-based)

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

* 古い機能割り当て済み/未割り当ての**リクエストあたり1パック**(`POST`/`DELETE …/assigned-creative-packs`)。
* 新しい API は**リスト**に対して動作します。
  * `PATCH …/campaigns/{campaignId}/assign-creative-pack` with `{ creativePackIds: [...] }` —
    指定された ID で割り当てられた集合を置き換えます。
  * `DELETE …/campaigns/{campaignId}/unassign-creative-pack` with `{ creativePackIds: [...] }` —
    リストされた ID を削除します。
* 現在割り当てられているパックのリスト：`GET campaign?includeFields=creativePacks`（`creativePackIds[]`）。

### 移行アプローチ##migration-approach

クライアントがキャンペーンに割り当てられたすべてのパックを収集し、**1** つの`PATCH assign-creative-pack`を作成する
（N `POST`の代わりに） 完全な配列を使用します 。セマンティクス確認: エンドポイントによって**置き換えられる
指定した`creativePackIds`で割り当て**を完了 — 常に目的のフル セットを送信するか、
配列から除外されたパックは割り当て解除されます。

***

## ブロック I — オーディエンス Pinpointer → Campaign Management (キャンペーン管理)##block-i--audience-pinpointer--campaign-management

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

| **古い機能**                                            | **新規**                                                  |
| --------------------------------------------------- | ------------------------------------------------------- |
| `GET …/audience-pinpointer/sdk-event-names`         | `GET …/applications/{id}/sdk-event-names`               |
| `GET …/audience-pinpointer/event-optimization-info` | `GET …/applications/{id}/eligibility`                   |
| `GET …/audience-pinpointer/roas-info`               | 🚫削除 — ROAS キャンペーンは **適格性が不要** になりました。ゲームロジックはすべて削除します。 |
| `GET …/audience-pinpointer/retention-info`          | 🚫削除 — リテンションは完全に**非推奨**。サーフェスのアクティブ リテンション使用           |

`sdk-event-names`反応: `{ total, results[]{ eventOptimizationType, sdkEventNames[] } }`。
`eligibility`反応: `{ total, results[]{ eventOptimizationType, countries[] } }`。

***

## ブロック J — アトリビューション（再配置）##block-j--attribution-(relocated)

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

アトリビューション URL が以前に**アプリケーション**に設定され (`appAttributionClickUrl`/`StartUrl`)、
into **campaign create**。新しいAPIには、**アプリケーション レベル専用アトリビューション リソース**に加えて、
キャンペーン更新のキャンペーンごとの`attributionLinks`。

* `GET …/applications/{applicationId}/attribution` → `{ id, startUrl, clickUrl, viewUrl?, partner,
  type?, createdAt, updatedAt }`.
* `{ startUrl?, clickUrl?, viewUrl? }` との`PATCH …/applications/{applicationId}/attribution`。

`partner` enum: `other`、`adjust`、`airbridge`、`appsflyer`、`branch`、`bytebrew`、`kochava`、
`mailru`、`singular`、`tenjin`、`yandex`。 `type` enum: `userLevel`、`nonUserLevel`、`mixed`。

### 移行アプローチ##migration-approach

1. アプリケーションレベルの移動`appAttributionClickUrl`/`appAttributionStartUrl`→`PATCH …/attribution`
   (`clickUrl`/`startUrl`).
2. campaign-create `attributionClickUrl`/`attributionStartUrl` → キャンペーンの`PATCH`の移動
   (`attributionLinks.{clickUrl,startUrl,viewUrl}`)。キャンペーンの作成**後**に実行されます。
3. `viewUrl` は新規 (任意)。 `{ifa}` およびその他の URL マクロ: 検証規則は、共有の
   古い機能と新しい API の**両方**で使用されるトラッキング検証ライブラリ（確認済み）。そのため、マクロ
   動作は変更されません。古い機能 URL をそのまま使用します。

***

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

1. **構成:** ホストを`…/ads/advertiser`にスワップ、パスプレフィックス`/advertise/v1`→`/public/v1`、
   `apps`セグメント → `applications`。Basic 認証を維持します。
2. **アプリケーション(ブロックA):**古い機能アプリケーションごとに、`POST …/applications`します(`store`を再マップする → `{store,
   platform}`)。持続`legacy campaignSetId → new applicationId`。トラッキングを送信**しない**
   ここに URL
3. **アトリビューション（ブロック J）：** 古いアプリケーションレベルの URL で`PATCH …/applications/{id}/attribution`します。
4. **クリエイティブ (Block B):** 再アップロード/再マップ、`type` enum の変換。持続
   ID が再度生成されるかどうかを`legacy creativeId → new creativeId`します (ID が保持されているかどうかを**確認します**)。
5. \*\*クリエイティブパック (\*\*Block C): 新しいクリエイティブ ID を参照するパックを作成します。
6. \*\*キャンペーン管理(\*\*ブロックI):オーディエンス ピンポイント検索の再設定 —
   `…/audience-pinpointer/sdk-event-names` → `…/applications/{id}/sdk-event-names`、および
   `…/audience-pinpointer/event-optimization-info` → `…/applications/{id}/eligibility`.読み取り専用;
   結果を使用して、キャンペーン`appEventType`/`sdkEventNames`および対象国に通知します。
   ROAS 情報ゲームロジックは単純に削除できます (資格は不要)。リテンション情報は
   非推奨のリテンション製品と一緒に使用されました(ステップ13を参照)。
7. **キャンペーン (ブロック** D): `optimizationType` で作成 (+ `isCreativeTesting`/`appEventType`/
   `roasType`)。`start``PATCH`して、`end`、`attributionLinks`、`autoStart`、`paused` を設定します。
8. **入札(ブロックE):** ドル→**マイクロドル**に変換します(ROAS目標: パーセント→小数割合、
   ÷100)。入札タイプごとに**完全**な希望セットを含む`PATCH …/bids`を1つ送信します(パッチ
   Replaces、Never Merge、 `[]` Clears)。リテンション入札は非推奨です。移行しないでください。
   どのような使用法でも表面化します。
9. \*\*バジェット(\*\*ブロックF):マイクロドルで`PATCH …/budget-cap`。`dailyPerCountry`マップの変換 →
   `countryGroupDailyLimits[]`.
10. **ターゲティング(ブロック**G): `appleDevice`/`androidDevice`/ソース+カテゴリリストに再構築
    削除されたデバイス フィールドをドロップします（表面化）。
11. **割り当て(ブロック**H):キャンペーンごとに1つのリストベースの`PATCH assign-creative-pack`。
12. **読み取り:** すべての`GET …/{bids,budget,targeting,assigned-creative-packs}`を
    `GET campaign?includeFields=…`.
13. \*\*削除済み機能 (\*\*表面からユーザー):`DELETE app` (USF 所有のアプリケーションライフサイクル、削除)
    現在無効)、非推奨のリテンション製品(入札 + 適格性)、ROAS適格性
    ゲート（不要：削除）、古い機能 ターゲティングフィールド、`adomain`、および
    `squareVideo` クリエイティブ。

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

* [ ] リクエスト パスに`/advertise/v1`、`/apps/`、`/cpi-bids`、`/source-bids`、
  `/roas-bids`, `/retention-bids`, `/event-optimization-bids`, `/audience-pinpointer`,
  `/assigned-creative-packs`、または `…/budget` (現在は `budget-cap`)。
* [ ] すべてのアプリケーション パスで、24 文字の 16 進数`campaignSetId`ではなく、新しい **UUID** `applicationId`が使用されます。
* [ ] すべての貨幣値は**マイクロドル** (整数) であり、`"2500.20"` のような小数ではありません。
* [ ] 入札は単一の`PATCH …/bids`に送信され、読み取りは`GET campaign?includeFields=bids`を使用します。
* [ ] すべての入札`PATCH`は、その入札タイプの**完全**なセットを送信します(置換セマンティクス — 部分的
  送信では省略された入札がドロップされます）。古い機能マージ形式の更新は読み取り/変更/書き込みに変換されました。
* [ ] ROAS 目標はパーセント文字列から小数比率に変換されました (`"12.34"` → `0.1234`)。
* [ ] バジェットは `budget-cap` + `countryGroupDailyLimits[]` を使用します（`dailyPerCountry` マップなし）。
* [ ] キャンペーン`goal`が`optimizationType`（+ `isCreativeTesting`）に再マッピングされ、アトリビューションが
  URLはキャンペーン作成ではなく、`attributionLinks`/`…/attribution`で設定します。
* [ ] Creative `type` では、新しい snake\_case 値 (`end_card_square`、`video_portrait`、…) が使用されます。
* [ ] 古い機能`enabled`の読み取りはすべて、**センス反転**を使用して`paused`に再マッピングされました。
  （`enabled:true` ⇒ `paused:false`）：レスポンスのリスト、取得、更新。
* [ ] キャンペーン `PATCH`反応をオフにする完全なキャンペーン フィールドを解析するものはありません(
  details オブジェクト）。完全な状態は`GET campaign?includeFields=…`経由で再フェッチされます。
* [ ] アプリケーション リスト解析でベア配列（`{total, results}`エンベロープなし）が予期され、
  `offset`/`limit`/`filter[store]`/`filter[storeId]` を送信します。
* [ ] 割り当てでは、N 回の割り当てではなく、キャンペーンごとに 1 つのリストの呼び出しを使用します。
* [ ] `DELETE app`、非推奨のリテンション使用（入札/適格性）、`squareVideo`クリエイティブ、
  削除されたターゲティングフィールドは、(クライアントがそれらを使用した場合) ギャップとしてユーザーに提示されます。ROAS
  適格性審査が削除されました。

## クイック リファレンス:🚫削除済み/同等の機能なし(移行または製造しない。すべてAPI所有者によって確認済み)##quick-reference:--removed-/-no-equivalent-(do-not-migrate-or-fabricate--all-confirmed-by-api-owners)

* **`DELETE app`**:削除アプリケーション エンドポイントなし。アプリケーション ライフサイクルはUSFが所有し、削除は
  現在プラットフォーム全体で無効になっています。
* **ROAS-info**：削除。ROAS キャンペーンに適格性は必要なくなりました。ゲーティングロジックを削除します。
* **リテンション(全**製品領域):非推奨:`retention-info`とリテンション**の入札に**は
  successor。アクティブなリテンションキャンペーン/入札を表示します。
* **GET bids /** バジェット / targeting / assigned-packs — `GET campaign?includeFields=…`に置き換えられました。
* **古い機能ターゲティングフィールド**（`limitedAdTracking`、`connectionType`、`screenSize`、
  `screenDensity`、`allowedDevices`、`osMax`)およびアプリケーション **`adomain`**: では設定できません。
  統一。クライアントコードを削除します。
* **`squareVideo` クリエイティブ タイプ** — サポートされていません。`video_portrait` / `video_landscape` のみです。
