LLM 코딩 에이전트용 퍼블리셔 공용 API 마이그레이션 레퍼런스
Monetize Manage API (legacy)에서 Ads Unified Platform 공용 API로 클라이언트의 통합을 마이그레이션하는 LLM 코딩 에이전트에 대한 레퍼런스입니다.
읽는 시간 23분최근 업데이트: 한 달 전
잠재 고객: 이 파일은 LLM 코딩 에이전트(Claude Code 또는 similar)는 레거시 Unity "Monetize"에서 클라이언트 통합을 마이그레이션합니다. 새로운 Unity Ads 퍼블리셔 공용 API 관리() (/monetize/v1/...). 그것은 독립적인 엔티티 블록으로 분할됩니다. 각 차단 상태 변화 및 정확히 어떻게 해야 하는. 개념 모델 변경 및 먼저 전역 변경 섹션 - 모든 차단에 적용됩니다./ads/publisher/public/v1/...
이 파일을 사용하는 방법(에이전트 지침)
- 이 프로시가 아니라 두 계약을 진실의 근원으로 취급합니다. 레거시 =
. New =
ads-selfserve/src/servers/http-internal/openapi/public-v1.yaml.ads-unified-platform/openapi/publisher/platform-public-v1-routes.yaml - 지정된 순서로 한 번에 한 엔티티 차단을 마이그레이션합니다(애플리케이션 → 플레이스먼트 → org 레벨 목록). 의존 중인 블록이 컴파일/패스하기 전에는 차단 시작하지 않습니다.
- 레거시 기능이 ± No equivalent 아래에 나열되면**** 엔드포인트 중지하고 인간에게 열린 질문으로 표면. 가장 중요 예제 는 새로운 API에 존재하지 않는 eCPM 타겟입니다.
- 각 차단 후 필드 테이블별로 필드 이름을 다시 매핑합니다. 필드가 이동된 것으로 간주하지 마십시오. 표에 "unchanged"라고 표시되지 않는 한 변경되지 않습니다.
개념 모델 변경(첫 번째 읽기)
데이터 모델이 평평화되고 프로젝트에서 애플리케이션으로 재중심화되었습니다.
레거시 모델(중첩, 프로젝트 중심)
조직└── 프로젝트(두 스토어 모두 포함, coppa + adsProvider 포함) └── 스토어 (apple | google) (URL 경로) └── Ad-Unit(adFormat, 건너뛰기/음소거/배너 설정 라이브) └── 플레이스먼트 └── eCPM 타겟(기하 기반 단가)
새로운 모델(플랫, 애플리케이션 중심)
조직└── 애플리케이션(플랫폼 하나 + 각각 하나의 스토어, 개인정보 보호 기능 + testMode 포함) └── 플레이스먼트(adFormat + adFormatConfigurations는 여기에 라이브, 타겟 없음)조직└── 테스트 기기(새로운, 조직 범위)
모든 변환, 변형 유도하는 4가지 쉬프트
# | Shift | 마이그레이션의 결과 |
|---|---|---|
| 1 | 프로젝트 → 애플리케이션 | 레거시 프로젝트 에는 |
| 2 | Ad-Units 제거 | 광고 유닛 리소스가 없습니다. 애드 유닛 레벨 설정(건너뛰기 타이머, 음소거, 배너 새로고침)은 placement로 |
| 3 | eCPM 타겟 제거 | 새로운 공용 API 해당하는 항목이 없습니다. |
| 4 | 배치 → 개별 작업 | 레거시 생성/업데이트된 플레이스먼트와 광고 유닛 일괄(맵/배열) 새로운 API는 요청당 하나의 리소스( |
전역 변경 사항(모든 엔드포인트에 적용)
종횡비 | 레거시 | 신규 |
|---|---|---|
| 호스트 | | |
| 경로 접두어 | | |
| 전체 예제 | | |
| Auth | HTTP Basic(서비스 계정 키) | HTTP Basic은 계속 작동하며 Bearer JWT( |
| ORG ID | 경로의 |
경로에 있는 |
| 경로에 있는 기본 ID | | |
| 쓰기에서 지원됨 | 거의 제거된 |
|
읽기에서 지원됨 | 배치 목록에 있는 |
| 아카이빙 | 패치 바디의 | 전용 |
속도 제한이 변경됨(클라이언트 측 백오프 가정 업데이트)
레거시 | 신규 | |
|---|---|---|
| IP당 천장 | 5/s, 4000/30분 | 40/s |
읽기( | (전역) | 20/s + 8000/hour |
생성( | 5/s, 1000/30분 | 1/s + 60/hour |
업데이트( | 5/s, 1000/30분 | 1/s + 200/hour |
마스터 엔드포인트 맵
레거시 작업 | 레거시 경로 | 신규 작업 | 새로운 경로 | 차단 |
|---|---|---|---|---|
| | | | A |
| | | | A |
| | | | A |
| | | | A |
| | — | 에서 광고 유닛 리소스 없음 보고 | B |
| | | | C |
| | | | C |
| | | | C |
| | | | C |
(아카이브 via | | | | C |
(un-아카이브 via | | | | C |
| | | | D |
|
|
— | eCPM 타겟 제거 보고서E | |
| — | — | | | F(새로운) |
| — | — | 시험 기기 CRUD | | G(새로운) |
차단 A - 프로젝트 → 응용 프로그램
변경한 사항
- 나열/생성/읽기/업데이트하는 리소스는 이제 프로젝트가 아니라 애플리케이션입니다.
- 읽기/업데이트는 이제 org() 아래에 중첩됩니다. 스탠드얼론
/organizations/{orgId}/applications/{applicationId}가 아닌/projects/{projectId}(Unity App ID)가 키를 입력합니다.applicationId - 레거시 프로젝트는 둘 다 저장소를 가져왔습니다. 새로운 애플리케이션은 단일 플랫폼입니다. 분할 변환하다(동사), 트랜스폼(명사) 규칙을 참조하십시오.
- 가 사라졌습니다. 열거형 문자열에서 부울로 변경된
adsProvider는 새로운coppa부울 옆의mixedAudience오브젝트privacy
엔드포인트 매핑
레거시 | 신규 |
|---|---|
| |
| |
| |
| |
필드 매핑 — 생성 (createProject → CreateApplicationPublicDto)
레거시 필드 | 새 필드 | 참고 |
|---|---|---|
| | 변경되지 않음 |
| — | Dropped 전송하지 않습니다. 동등하지 않습니다. |
| | 변환: |
| — | | 신제품. |
|
열거형 |
플랫폼별 앱으로 분할 변환하다(동사), 트랜스폼(명사) 규칙을 참조하십시오. |
| — | | 신규, 필수 앱 타겟을 저장하는 데 파생됩니다. |
| — | | 새로운 옵션 |
| — | | 선택 사항 — 기존 프로젝트와 연결하기 |
| — | | 선택 사항 - 새 프로젝트를 만들고 연결합니다. 기본값은 앱 이름입니다 |
필드 매핑 — 업데이트(updateProject → UpdateApplicationPublicDto)
레거시 필드 | 새 필드 | 참고 |
|---|---|---|
| — | 파티가 중단됨 |
|
|
create와 동일한 변환하다(동사), 트랜스폼(명사); 업데이트 시 두 |
|
|
앱당 한 개의 플랫폼 |
| — | | 현재 업데이트 가능 |
| — | | new; |
필드 매핑 — 응답 (project/projectDetail → ApplicationPublicResponseDto)
레거시 필드 | 새 필드 | 참고 |
|---|---|---|
| | 이제 응답에는 그룹화 프로젝트에 대한 애플리케이션 |
| | 변경되지 않은 |
|
|
enum→boolean |
| — | ↓ 없어짐 |
| | 단일 저장소 |
|
— | 앱 응답에서없음 |
| — | 비록 사라졌습니다 |
| — | | new |
변환하다(동사), 트랜스폼(명사): 하나의 레거시 프로젝트 → N 응용 프로그램
stores.applestores.googlePOST /applicationsplatform: iOSstore: AppleAppStorestoreId: <apple.storeId>platform: Androidstore: GooglePlaystoreId: <google.storeId>projectName: <project.name>projectIdprojectId예제
레거시 — create project (both stores):
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/..." } }}
새로운 — 하나의 프로젝트에 그룹화된 두 개의 애플리케이션 생성:
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-..."}
차단 B — Ad-Units → 제거(애플리케이션 + 플레이스먼트로 접히기)
□ 동등한 리소스 없음
광고 유닛 엔드포인트는 없습니다. 호출하는 모든 클라이언트 코드를 삭제합니다.
(,
, , , , ).
…/projects/{projectId}/[stores/{storeName}/]adunits…getAdUnitsByProjectgetAdUnitsByProjectStorecreateAdUnitsupdateAdUnitsgetAdUnitspatchAdUnits광고 유닛 데이터가 이동한 위치
레거시 유닛 광고 필드 | 새로운 집 |
|---|---|
| 플레이스먼트 |
| 플레이스먼트 |
| 배치 |
| 는 직접적으로 동등하지 않습니다. 표면은 클라이언트가 의지했다면 인간에 해당합니다. |
중첩된 | 애플리케이션에서 개별적으로 플레이스먼트를 생성합니다(차단 C). |
마이그레이션 방식: 각 레거시 광고 유닛을 공유된 플레이스먼트 그룹으로 취급합니다.
adFormat。 레거시 ad 유닛에 속한 모든 플레이스먼트의 경우,
애플리케이션(광고 유닛의 스토어와 일치하는 애플리케이션), 광고 유닛의 를
광고 유닛의 관리자 설정을 배치하고 플레이스먼트의 로 접습니다.
adFormatadFormatConfigurations차단 C — 플레이스먼트(애플리케이션별)
변경한 사항
- 경로가 이제 — 스토어/다음 단위 없음 세그먼트。
…/applications/{applicationId}/placements[/{placementId}] - 개별 작업은 배치 맵/배열을 대체합니다.
- 각 플레이스먼트에 대한 가 필요(유닛 프로퍼티였음).
adFormat - 새 오브젝트는 플레이어/관리자 설정을 포함합니다. 모양은
adFormatConfigurations(보상형 광고/인터스티셜 광고/배너).adFormat - 배치 바디에서 eCPM 가 사라집니다(차단 E 참조).
targets - 식별자: 레거시 는 슬러그(
placementId); 새로운 배치^[\da-zA-Z_-]+$는 UUID, 인간이 읽을 수 있는 슬러그는 별도로id(key에서 생성)로 반환됩니다.name - 복원그 아닌 전용 작업입니다.
- 플레이스먼트별 업데이트는 (전체 대체)이며, 아닙니다
PUT.PATCH
엔드포인트 매핑
Intent | 레거시 | 신규 |
|---|---|---|
| 생성 | | |
| 목록 | | |
| 받으세요 | | |
| 업데이트 | | |
| 아카이브 | | |
| 아카이브 | | |
필드 매핑 — 요청 (addPlacements[] / patchPlacementObject → PlacementPublicRequestDto)
레거시 필드 | 새 필드 | 참고 |
|---|---|---|
| | 변경되지 않음 |
| — | 더 이상 ID를 선택하지 않습니다. 서버는 UUID |
| — | | 신규 및 필수 레거시 부모 ad 유닛의 |
|
— | 님이 삭제되었습니다. 전송하지 않습니다. 차단 E. | 참조
| — | 작문으로 수락 안 함 |
| — | 대신 |
| — | | 신규. 플레이어/관리자 설정, 아래 모양을 참조하십시오. |
adFormatConfigurations 모양(adFormat 기준)
- 보상형 광고():
RewardedConfigurations(보상 이름, 필수),name(보상형 광고, required),value(adminSettings).AdminConfigurations - 인터스티셜 광고 ():
InterstitialConfigurations.adminSettings - 배너 ():
BannerConfigurations,adminSettings(필수).bannerRefreshRate - :
AdminConfigurations,allowSkip,allowSkipInSeconds,videoPlayableSkipInSeconds,closeTimerDuration,tapsToClose,muteVideo,disableVideoControlsFade.useCloseIconInsteadOfSkipIcon
필드 매핑 — 응답 (placement → PlacementPublicResponseDto)
레거시 필드 | 새 필드 | 참고 |
|---|---|---|
| | 레거시 슬러그 스타일 ID는 새로운 ** |
| — | | 새로운 규칙적 ID입니다. 이 ID는 URL 경로에 들어갑니다. |
| | 변경되지 않은 |
| | 현재 ISO-8601; 활성화된 경우 |
| — | 앱별 응답에 표시되지 않음(조직 목록, 차단 D) |
| — | 가 거의 제거되었습니다 |
| — | | new |
⚡️ ID 다시 매핑은 가장 높은 위험 단계입니다. 클라이언트 레거시 플레이스먼트를 유지한 위치 슬러그는 이제 경로 작업을 위해 새 UUID를 저장해야 하며, 슬러그는id로 살아남는다. 빌드하고 유지하는 동안의key룩업 마이그레이션。legacy placement slug → new {id, key}
예제
레거시 — ad-unit 아래 배치 생성:
POST /monetize/v1/projects/{projectId}/stores/apple/adunits/{adUnitId}/placements[ { "name": "Rewarded Placement", "id": "rewarded_01", "addTargets": [ { "value": 18.5, "type": "global" } ] } ]
새로운 — 플레이스먼트당 한 번 생성(타겟 삭제, adFormat + 구성 추가):
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 — 조직 배치 목록
변경한 사항
동일한 의도(조직 내 모든 플레이스먼트 나열) 하지만 다른 응답 형태: eCPM
사라지고, , , 가 추가되고, 레거시 가 가 됩니다.
(사람이 읽을 수 있는 키입니다.) 활성 iOS/Android 플레이스먼트만 반환됩니다.
targetsadFormatplatformstoreIdidplacementId엔드포인트 매핑
레거시 | 신규 |
|---|---|
| |
필드 매핑(placementWithGameId → OrganizationPlacementPublicResponseDto)
레거시 필드 | 새 필드 | 참고 |
|---|---|---|
| | 현재 인간이 읽을 수 있는 키(예: |
| | 변경되지 않은 |
| | 변경되지 않음(문자열, 예: |
| | 변경되지 않은 |
| — | 거의 제거된 |
| — | | new |
| — | | 신규, iOS 또는 Android가 없는 경우 |
| — | | new |
차단 E - eCPM 타겟 제거
± 새로운 공용 API 해당하는 항목이 없습니다.
모든 레거시 타겟 엔드포인트가 사라지고 이 API에서는 교체할 수 없습니다.
, , , ,
플레이스먼트/광고 유닛의 / 필드
getTargetscreateTargetsgetTargetDetailpatchTargetdeleteTargettargetsaddTargets에이전트 지침:
- 이를 새 엔드포인트에 매핑 하지 마십시오. 경로를 생성하지 마십시오.
…/targets - 모든 플레이스먼트 생성/업데이트 페이로드에서 /
targets를 제거합니다.addTargets - 이 API를 통해 클라이언트의 통합이 eCPM 기본 가격을 관리하는 경우 이 값을 중지하고 인간의 차단점 — eCPM 대상 관리가 새로운 퍼블리셔에 포함되지 않음 공용 API 및 대역에서 처리해야 합니다(예: 다른 Unity 표면 또는 제품을 통해 처리) decision). 명시적으로 플래그를 플래그. 가격 로직을 표시하지 않고는 자동으로 내보내지 마십시오.
차단 F — 애플리케이션 테스트 모드(신규)
레거시 동등은 없습니다. 새로운 엔드포인트:
- →
GET …/applications/{applicationId}/test-mode{ id, testMode } - 와
PATCH …/applications/{applicationId}/test-mode{ "testMode": "forceAll" | "forceOff" }
애플리케이션 응답(차단 A)에도 가 존재합니다. 마이그레이션은 추가 단계일 뿐이며,
레거시 API 포팅 항목이 없습니다. 클라이언트 테스트 모드 컨트롤을 원하는 경우 이를 노출해야 합니다.
testMode차단 G — 테스트 장치(새로운 장치)
레거시 동등은 없습니다. Org 범위 CRUD:
- —
POST …/organizations/{orgId}/test-devicesCreateTestDevicePublicDto{ name*, advertisingId*, platform? } - — 목록(옵션
GET …/organizations/{orgId}/test-devices필터)platform - — get one
GET …/organizations/{orgId}/test-devices/{testDeviceId} - —
PATCH …/organizations/{orgId}/test-devices/{testDeviceId}UpdateTestDevicePublicDto - — 204
DELETE …/organizations/{orgId}/test-devices/{testDeviceId}
testDeviceIdplatformAndroidiOSOSXWindowsLinuxWebGLWindows_StorePS4PS5XboxOnetvOSSwitchVisionOS권장 마이그레이션 알고리즘(에이전트 결정적 순서)
- 설정: 지지대 호스트를 와 경로 접두사
…/ads/publisher→/monetize/v1로 변경합니다. 기본 인증을 유지합니다. 모든/public/v1파라미터를 제거합니다.dryrun - 애플리케이션(차단 A): 각 레거시 프로젝트에 대해 스토어당 하나의 애플리케이션을 생성합니다. 변환하다(동사), 트랜스폼(명사)
열거형→부울, 드롭
coppa, 설정adsProvider/platform/store. 을 통한 그룹화storeId/projectName.projectId맵을 유지합니다.legacy projectId+store → new {applicationId, projectId} - 플레이스먼트(차단 C): 각 레거시 배치에 대해 맵에서 소유 애플리케이션을 결정합니다.
(레거시 ad-unit에서) +
adFormat로 개별적으로 생성 (ad-unit/admin 설정에서) 드롭adFormatConfigurations/targets. 지속addTargets.legacy placement slug → new {id, key} - 포인트 변경 식별자: 저장된 레거시 배치 슬러그를 경로에 대한 새 UUID 로 대체 ops(표시할
id유지). 저장된key기반 앱 리프를projectId로 교체합니다.applicationId - 아카이브 시맨틱: PATCH 호출을
archive:true/false/DELETE로 대체한다.PATCH …/restore - 리스트/읽기 모양: 필드 테이블별로 응답 파싱 업데이트(esp. org list - 차단 D).
- eCPM 타겟(차단 E): 타겟 코드를 제거하고, 인간에게 공백을 보고한다.
- 선택적인 새로운 기능: 요청 시에만 테스트 모드(F) 및 테스트 장치(G)를 연결합니다.
- 속도 제한: 캡은 ≤1/s 및 ≤60/hour에서 생성되고, 값은 ≤20/s입니다.
확인 체크리스트(마이그레이션 후 실행)
- 요청 경로에는 ,
/monetize/v1,/projects/{,/adunits또는/stores/가 포함되어 있지 않습니다./targets - 요청 바디에는 ,
adsProvider,addTargets또는targets가 포함되어 있지 않습니다.archive - 는 모든 곳에서 부울(아무
coppa/"compliant"없음)."non_compliant" - 모든 플레이스먼트 생성/업데이트는 유효한 및
adFormat를 전송합니다. 형식과 일치합니다.adFormatConfigurations - 플레이스먼트 경로 파라미터는 레거시 슬러그()가 아니라 새 UUID
key를 사용합니다.id - 두 개의 상점이 있는 레거시 프로젝트는 하나의 를 공유하는 두 개의 애플리케이션을 생성했습니다.
projectId - eCPM 타겟 관리는 클라이언트 지원하지 않는 공백으로 나타났습니다.
빠른 레퍼런스: 제거됨/동등하지 않음(마이그레이션 또는 제조하지 않음)
- 모든 Ad-Unit 엔드포인트와 ad-unit 리소스
- 모든 eCPM 타겟 엔드포인트 및 /
targets필드addTargets - 프로젝트 및
adsProvider.maxCaps - 및
dryrun쿼리 파라미터showarchived - 클라이언트가 선택한 플레이스먼트 ID(서버가 UUID를 할당하고 슬러그를 로 유지).
key