Developer Dashboard Management API
Revision History
| Release Date | Revision Notes |
|---|---|
| 2026-09-02 | App, placement, mediation group, and ad source read/write now cover dashboard fields: release/domain, callbacks, timeouts/frequency, header_bidding_mode / s2s_placement / group_list / floor price / is_modify_pid. Added type-mismatch errors, group_list mismatch does not close groups, and is_modify_pid conflict. |
| 2026-09-01 | Added automated Fyber and YSO ad source creation with third-party Placement ID write-back, and manual zMaticoo ad source creation. |
| 2026-08-31 | Enabled automated Unity Ads ad source creation (non-bidding only), with notes on Game ID, Placement ID write-back, and banner size. |
| 2026-08-21 | Pangle CN (adsource_id=17) manual create requires placement_config.primeRitId; OpenAPI automation is not supported. |
| 2026-08-21 | AdMob and Moloco Native Banner native_ad_size only allows 3 (300 x 250); existing records are not migrated. |
| 2026-08-20 | Added manual Moloco and Magnite ad source creation (no automation), aligned with dashboard ad types and Header Bidding (S2S). |
| 2026-08-12 | Re-enabled automated Yandex ad source creation, with notes on permission, app ID, and rewarded video fields. |
| 2026-08-07 | The Get Placements API (/api/seat/seats) now returns adseat_label to distinguish normal, shared, and intelligent-strategy placements. |
| 2026-08-06 | Support Splash: Unity Ads interstitial splash. |
| 2026-07-27 | Added support for automated Mintegral, Vungle, Bigo, TaurusX, and Inmobi ad source creation, covering conversion and adaptation scenarios for various ad types. |
| 2026-06-26 | Extended native_ad_size and close_button to Meta, Mintegral, InMobi, Yandex, and Bigo for Native Banner; Meta Banner supports is_native=13 (stitched native banner). |
| 2026-06-12 | Support AdMob and GAM inline adaptive banner ad sources. |
| 2026-06-11 | Native Banner ad sources support native_ad_size and close_button in placement_config for AdMob, GAM, Pangle, Vungle, and Moloco. |
| 2026-05-26 | Updated AdMob ad source creation docs; unified App ID requirements for manual and automated creation. |
| 2026-05-07 | Added support for automated Pangle ad source creation, covering conversion and adaptation scenarios for various ad types. |
| 2026-04-14 | API update: added optional parameters for querying ad source information; creating and editing mediation groups now supports updating the default group. |
| 2026-04-09 | Added support for automated Meta and AdMob ad source creation, covering conversion and adaptation scenarios for various ad types. |
| 2026-03-25 | Added full lifecycle management for A/B Tests |
1 Get API Key
Log in to the dashboard, click the company name, go to "My Account" > "API Key", and obtain the API Key and secret.
| Name | Purpose |
|---|---|
| API Key (bear) | Identifies the user |
| Secret | Generates the request signature |
2 API Integration
All requests use the POST method. The default POST data format is multipart/form-data. Request domain: https://openapi.tradplusad.com
2.1 Common Request Parameters
| Parameter | Description | Delivery Method | Example |
|---|---|---|---|
| bear | API key | HTTP Header | 157E4A5D-3877-1236-DE06-457FT3F70C4 |
| sign | Signature | GET | 5DE008C88087D8556D276A9E5B8E37E6 |
| timestamp | Timestamp, seconds of the current time | GET | 1629525680 |
| nonce | 16-character random string, combination of digits and letters | GET | 5c672d4e9628d0a7 |
2.2 Generate Signature
Obtain the bear and secret. See 1 Get API Key.
Rules:
- Concatenate secret, timestamp, nonce, and the request path
- Apply MD5 encryption and convert to uppercase
$sign = strtoupper(md5($secret+$timestamp+$nonce+$path));
2.3 Request Example
curl --location --request POST 'https://openapi.tradplusad.com/api/seat/store?sign=5DE008C88087D8556D276A9E5B8E37E6×tamp=1629525680&nonce=5c672d4e9628d0a7' \
--header 'bear: 157E4A5D-3877-1236-DE06-457FT3F70C4' \
--form 'adseat_list[0][app_uuid]="BA04D9C5A5E736CCDA8003BC5D936BE5"' \
--form 'adseat_list[0][seat_name]="testCreate"' \
--form 'adseat_list[0][ad_type]="5"' \
--form 'adseat_list[0][adseat_uuid]=""'
2.4 Response Parameters
Returns JSON format
2.4.1 Success
{
"code": 200,
"status": 0,
"data": {
"list": [
{
"adseat_uuid": "8629EE09A4E3C6B60AEC48FA7D6CA4D4",
"seat_name": "testCreate",
"error_message": ""
}
]
}
}
2.4.2 Failure
{
"code": 403,
"status": -1,
"error_message":"sign error"
}
3 Reports
3.1 Submit Third-party Ad Platform Report Data
Request Path: /api/report/submit
Request Parameters:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| report_data_list | Array | Y | Up to 10 items; extra items will be discarded | |
| report_data_list.day | String | Y | Date; only day-level Y-m-d format is supported | Example: 2021-02-01 |
| report_data_list.iso | String | Y | Two-letter country code (short code) | Example: GE; see 9.1 |
| report_data_list.adsource_id | Int | Y | TradPlus ad platform ID | See 9.3 |
| report_data_list.placement_id | String | Y | Third-party ad platform placement ID | For Mintegral, concatenate the AD Unit ID with "_". For Unity Ads, concatenate the Game ID. For AppLovin, concatenate the SDK Key. For Kidoz, concatenate the app package_name. For ReklamUp, concatenate the app package_name. Example: placementID_adUnitID |
| report_data_list.currency | String | N | Currency unit, CNY or USD. Defaults to CNY if omitted | |
| report_data_list.bidding_request | Int | N | Bidding requests | default: 0 |
| report_data_list.bidding_response | Int | N | Bidding responses | default: 0 |
| report_data_list.request | Int | N | Requests | default: 0 |
| report_data_list.fill | Int | N | Fills | default: 0 |
| report_data_list.impression | Int | N | Impressions | default: 0 |
| report_data_list.click | Int | N | Clicks | default: 0 |
| report_data_list.income | Float | N | Revenue | default: 0 |
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| error | Array | Y | Error message list |
| error.message | String | N | Error message |
| error.report_data | Array | N | Error details (same as request data) |
Response Example:
{
"code": 200,
"status": 0,
"data": {
"error": [
{
"message": "Two-letter country code (short code) is missing or invalid",
"report_data": {
"day": "2022-01-18",
"iso": "USA",
"adsource_id": "16",
"placement_id": "abc123",
"currency": "CNY",
"income": "50",
"fill": "800"
}
},
{
"message": "Ad network ID is missing or invalid",
"report_data": {
"day": "2022-01-19",
"iso": "CN",
"adsource_id": "475",
"placement_id": "22",
"currency": "CNY",
"income": "20",
"fill": "600",
"impression": "100"
}
}
]
}
}
4 App Management
4.1 Get App Categories
Request Path: /api/app/allcategory
Request Parameters: None
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| first_category | Array | Y | Primary category |
| first_category.id | String | Y | Category ID |
| first_category.name_cn | String | Y | Chinese name |
| first_category.name_en | String | Y | English name |
| sub_category | Array | Y | Secondary category |
| sub_category.id | String | Y | Secondary categoryid |
| sub_category.pid | String | Y | Corresponding primary category ID |
| sub_category.name_cn | String | Y | Chinese name |
| sub_category.name_en | String | Y | English name |
Response Example:
{
"code": 200,
"status": 0,
"data": {
"first_category": [
{
"id": "1",
"name_cn": "Game",
"name_en": "Game"
},
{
"id": "2",
"name_cn": "App",
"name_en": "App"
}
],
"sub_category": [
{
"id": "101",
"name_cn": "Action",
"name_en": "Action",
"pid": "1"
},
{
"id": "102",
"name_cn": "Adventure",
"name_en": "Adventure",
"pid": "1"
}...
]
}
}
4.2 Get Apps
Request Path: /api/app/apps
Request Parameters:
If app_uuids is passed, page is ignored. has_more and total are returned only app_uuids is not passed.
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| app_uuids | Stirng | N | App ID | Accepts up to 100 each time |
| page | Int | N | Page number, default 1 | 100 items per page |
Response Fields:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| total | Int | N | Total count | |
| has_more | Int | N | Whether there are more items | |
| app_list | Array | Y | App information | |
| app_list.app_uuid | String | Y | Developer app ID | |
| app_list.app_name | String | Y | App name | |
| app_list.category_id | Int | Y | Secondary category | |
| app_list.app_url | String | Y | App store URL | |
| app_list.package_name | String | Y | App package name | |
| app_list.os | Int | Y | App platform | 1:Android 2:iOS |
| app_list.is_release | Int | Y | Release status | 1:Not released 2:Released 3:Other app market |
| app_list.domain | String | Y | App domain | |
| app_list.other_app_market | Int | N | Android app market | Android only; 13 = Google Play |
| app_list.app_release_region | Int | N | Release region | 1 global, 2 China, 3 overseas |
Request Example
curl --location --request POST 'https://openapi.tradplusad.com/api/app/apps?sign=5DE008C88087D8556D276A9E5B8E37E6×tamp=1629525680&nonce=5c672d4e9628d0a7' \
--header 'bear: 157E4A5D-3877-1236-DE06-457FT3F70C4' \
--header 'Content-Type: application/json' \
--data '{"app_uuids":"348FA2C4CFA91471D09DC529EAB1459E","page":1}'
Response Example:
{
"code": 200,
"status": 0,
"data": {
"has_more": 0,
"total": 25,
"app_list": [
{
"app_uuid": "A741926221D7FEFBCB179D08B4477713",
"app_name": "test1",
"os": 1,
"is_release": 2,
"package_name": "com.test1",
"app_url": "http://www.test1.com",
"category_id": 102,
"domain": "example.com",
"other_app_market": 13,
"app_release_region": 1
},
{
"app_uuid": "4F1E43B002376A505FFFB03F04C170E5",
"app_name": "test2",
"os": 1,
"is_release": 2,
"package_name": "com.test.4iphone",
"app_url": "http://www.test2.com",
"category_id": 111
},...
]
}
}
4.3 Create and Edit Apps
Request Path: /api/app/store
Request Parameters:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| app_list | Array | Y | App information | Up to 10 items each time; extra items will be discarded |
| app_list.app_uuid | String | N | Developer app ID | Required when editing |
| app_list.app_name | String | N | App name | Required when editing |
| app_list.os | Int | N | App platform 1:Android 2:iOS | Cannot be edited after creation |
| app_list.package_name | String | N | App package name | Required when creating |
| app_list.app_url | String | N | App store URL | Required when is_release is 2 or 3. For iOS released apps or Android other_app_market=13, store metadata is fetched; app_name and package_name can override. |
| app_list.category_id | Int | N | Category ID. See 4.1 Get App Categories | Required when creating |
| app_list.direction | Int | N | Screen orientation | 1 portrait, 2 landscape, 0 adaptive |
| app_list.is_release | Int | Y | Release status | Required on create. 1 not released, 2 released, 3 other market. 2/3 require domain and app_url |
| app_list.domain | String | N | App domain | Required when is_release is 2 or 3 |
| app_list.other_app_market | Int | N | Android app market | Android only. 13 = Google Play (store fetch) |
| app_list.app_release_region | Int | N | Release region | 1 global, 2 China, 3 overseas |
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| list | Array | Y | App information |
| list.app_uuid | Stirng | N | Developer app ID |
| list.app_name | Stirng | N | App name |
| list.error_message | Stirng | N | Error message, Empty string means success |
Request Example
curl --location --request POST 'https://openapi.tradplusad.com/api/app/store?sign=5DE008C88087D8556D276A9E5B8E37E6×tamp=1629525680&nonce=5c672d4e9628d0a7' \
--header 'bear: 157E4A5D-3877-1236-DE06-457FT3F70C4' \
--header 'Content-Type: application/json' \
--data '{"app_list":[{"app_uuid":"","app_name":"API App","os":1,"package_name":"api","app_url":"","category_id":101,"direction":1}]}'
Response Example:
{
"code": 200,
"status": 0,
"data": {
"list": [
{
"app_uuid": "",
"app_name": "a1",
"error_message": "App name already exists"
},
{
"app_uuid": "A741926221D7FEFBCB179D08B4477713",
"app_name": "test1",
"error_message": ""
}
]
}
}
5 Placement Management
5.1 Get Placements
Request Path: /api/seat/seats
Request Parameters:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| app_uuid | Stirng | N | Single app ID. Used to get all placements under an app | app_uuid and adseat_uuid are mutually exclusive. If both are passed, only app_uuid is used |
| adseat_uuids | String | N | Placement IDs, separated by commas. Returns up to 100 | Pass one or more placement IDs to query placement details |
| page | String | N | Page number, default 1 | 100 items per page |
Response Fields:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| has_more | Int | N | ||
| total | Int | N | ||
| adseat_list | Array | Y | ||
| adseat_list.app_uuid | String | Y | Developer app ID | |
| adseat_list.seat_name | String | Y | Placement name | |
| adseat_list.adseat_uuid | String | Y | Placement ID | |
| adseat_list.adseat_label | String | Y | Read-only placement type label. normal: standard placement; shared: shared placement owner; intelligent: intelligent-strategy placement (parent or child). Each placement returns exactly one label. Priority: shared > intelligent > normal. Placements bound to a shared placement (non-owner) return normal. | |
| adseat_list.cache_num | Int | Y | Parallel request count | |
| adseat_list.ad_type | Int | Y | Ad type: 1 Native 2 Interstitial 3 Splash 4 Banner 5 Rewarded Video | |
| adseat_list.use_frequency | Int | Y | Whether to set impression frequency cap: 1: yes, 0: no | |
| adseat_list.frequency_limit | Int | Y | Impression cap | |
| adseat_list.frequency_unit_count | Int | Y | Unit interval | |
| adseat_list.frequency_unit | Int | Y | Frequency unit: 1 minutes 2 hours 3 days | eg: Every 5 (frequency_unit_count) minutes (frequency_unit) 10 impressions (frequency_limit) |
| adseat_list.ad_type_template | Int | N | Native template type Standard Native: 1 Native Banner: 2 Draw feed: 3 Native Splash: 4 | Returned for native types |
| adseat_list.refresh_time | Int | N | Refresh time | Native Banner, Returned for Banner |
| adseat_list.skip_time | Int | N | Show the skip button after n seconds | Splash, Native Splash type returned |
| adseat_list.countdown_time | Int | N | Total countdown duration | Splash, Native Splash type returned |
| adseat_list.is_skip | Int | N | Skippable | Splash, Native Splash type returned |
| adseat_list.monetary_name | String | N | Reward item | Returned for Rewarded Video |
| adseat_list.monetary | Int | N | Reward amount | Returned for Rewarded Video |
| adseat_list.is_server_callback | Int | N | Reward callback switch | 1 on, 0 off; rewarded video |
| adseat_list.callback_url | String | N | Reward callback URL | |
| adseat_list.secret_key | String | N | Reward callback secret | Plaintext |
| adseat_list.imp_is_server_callback | Int | N | Impression callback switch | 1 on, 0 off |
| adseat_list.imp_callback_url | String | N | Impression callback URL | |
| adseat_list.imp_secret_key | String | N | Impression callback secret | Plaintext |
| adseat_list.imp_callback_type | Int | N | Impression callback type | 1 normal, 2 precise |
Request Example
curl --location --request POST 'https://openapi.tradplusad.com/api/seat/seats?sign=5DE008C88087D8556D276A9E5B8E37E6×tamp=1629525680&nonce=5c672d4e9628d0a7' \
--header 'bear: 157E4A5D-3877-1236-DE06-457FT3F70C4' \
--header 'Content-Type: application/json' \
--data '{"app_uuid":"348FA2C4CFA91471D09DC529EAB1459E", "adseat_uuids":"","page":1}'
Response Example:
{
"code": 200,
"status": 0,
"data": {
"has_more": 0,
"total": 58,
"adseat_list": [
{
"app_uuid": "A741926221D7FEFBCB179D08B4477713",
"seat_name": "cp1",
"adseat_uuid": "E1FF0FF0BFF1EBDB61C0FED50E66229D",
"adseat_label": "normal",
"ad_type": 2,
"cache_num": 2,
"use_frequency": 0,
"frequency_limit": 0,
"frequency_unit_count": 0,
"frequency_unit": 0
},
{
"app_uuid": "1BCEFCAD3011A276134CC6225E724064",
"seat_name": "bzys",
"adseat_uuid": "D202406D331F32A5BBD1231065BAD7A0",
"adseat_label": "normal",
"ad_type": 1,
"cache_num": 2,
"use_frequency": 0,
"frequency_limit": 0,
"frequency_unit_count": 0,
"frequency_unit": 0,
"ad_type_template": 1
},...
]
}
}
5.2 Create and Edit Placements
Request Path: /api/seat/store
Request Parameters:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| adseat_list | Array | Y | Up to 10 items; extra items will be discarded | |
| adseat_list.app_uuid | String | Y | Developer app ID | Developer app ID, Cannot be edited after creation. |
| adseat_list.seat_name | String | Y | Placement name | Required when creating |
| adseat_list.adseat_uuid | String | N | Placement ID Required when editing | |
| adseat_list.cache_num | Int | N | Parallel ad request count, default: 2 | Required when creating. Splash range: 1-5; other ad types: 1-20 |
| adseat_list.ad_type | Int | Y | Ad type: 1 Native 2 Interstitial 3 Splash 4 Banner 5 Rewarded Video | Ad type. Required when creating, Cannot be edited after creation. |
| adseat_list.use_frequency | Int | N | Whether to set impression frequency cap: default: no | 1: yes, 0: no |
| adseat_list.frequency_limit | Int | N | Impression cap n impressions, default: 1 | |
| adseat_list.frequency_unit_count | Int | N | Unit interval, default: 1 | |
| adseat_list.frequency_unit | Int | N | Frequency unit, minutes: 1 hours: 2 days: 3 default: 1 | |
| adseat_list.ad_type_template | Int | N | 1 Standard Native 2 Native Banner 3 Draw feed 4 Native Splash | Required when creating native types, Cannot be edited after creation. |
| adseat_list.refresh_time | Int | N | Auto refresh, range: 15-150 seconds | Only applies to Banner and Native Banner May be omitted, which means no refresh |
| adseat_list.skip_time | Int | N | Show the skip button after n seconds Range: 0-10 seconds, default 2 | Required when creating Splash and Native Splash; only applies to Splash and Native Splash |
| adseat_list.countdown_time | Int | N | Total countdown duration Range: 3-10 seconds, default 5 | Required when creating Splash and Native Splash Only applies to Splash and Native Splash. Total countdown duration must be greater than skip_time |
| adseat_list.is_skip | Int | N | Skippable. 1: yes, 0: no; default: yes | Required when creating Splash and Native Splash; only applies to Splash and Native Splash |
| adseat_list.monetary_name | String | N | Reward item | Only applies to rewarded video |
| adseat_list.monetary | Int | N | Reward amount | Only applies to rewarded video |
| adseat_list.is_server_callback | Int | N | Reward callback switch | Rewarded video only; 1=on requires callback_url and secret_key. Other ad types return 「非激励视频无需设置奖励回调」 |
| adseat_list.callback_url | String | N | Reward callback URL | Max 2000 |
| adseat_list.secret_key | String | N | Reward callback secret | Max 100 |
| adseat_list.imp_is_server_callback | Int | N | Impression callback switch | 1=on requires imp_callback_url and imp_secret_key |
| adseat_list.imp_callback_url | String | N | Impression callback URL | Max 2000 |
| adseat_list.imp_secret_key | String | N | Impression callback secret | Max 100 |
| adseat_list.imp_callback_type | Int | N | Impression callback type | 1 normal, 2 precise |
Response Fields:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| list | Array | Y | ||
| list.adseat_uuid | String | Y | ||
| list.seat_name | String | Y | ||
| list.error_message | String | Y | Error message, Empty string means success |
Request Example
curl --location --request POST 'https://openapi.tradplusad.com/api/seat/store?sign=5DE008C88087D8556D276A9E5B8E37E6×tamp=1629525680&nonce=5c672d4e9628d0a7' \
--header 'bear: 157E4A5D-3877-1236-DE06-457FT3F70C4' \
--header 'Content-Type: application/json' \
--data '{"adseat_list":[{"app_uuid":"BA04D9C5A5E736CCDA8003BC5D936BE5","seat_name":"API Create","ad_type":"5","adseat_uuid":""}]}'
Response Example:
{
"code": 200,
"status": 0,
"data": {
"list": [
{
"adseat_uuid": "9D0A151A3B9169369CB75873FD86713E",
"seat_name": "testNative Banner",
"error_message": ""
},
{
"adseat_uuid": "",
"seat_name": "",
"error_message": "App ID is required"
}
]
}
}
6 Mediation Group Management
6.1 Query Mediation Group List
Request Path: /api/intermediary/group_list
Request Parameters:
| Field | Type | Required | Description |
|---|---|---|---|
| currency | String | Y | Currency unit, USD or CNY |
| adseat_uuid | String | Y | Placement UUID |
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| abtest_name | String | Y | A/B Test group name |
| bucket_id | String | Y | A/B Test group ID |
| group_id | String | Y | Mediation group ID |
| group_name | String | Y | Mediation group name |
| bidding_adsource_cache_num | String | Y | Bidding ad source cache count |
| bidding_floor_price | String | Y | Bidding floor price |
| cache_num | String | Y | Parallel request count |
| is_preset | String | Y | Whether it is a preset mediation group 1: yes, 0: no |
| is_cold_scene | String | Y | Whether it is cold start 1: yes, 0: no |
| country | String | Y | Country/region |
| city | String | Y | City |
| rule_json | String | Y | Traffic segmentation rules |
| segment_tag | String | Y | Custom user attributes |
| status | String | Y | Status 1: enabled, 2: disabled |
| preset_country | String | Y | Preset mediation group countries |
| min_cache | String | N | Minimum cache |
| ad_fill_callback | String | N | Ad fill callback |
| sdk_request_adsource_timeout | String | N | Ad source request timeout |
| sdk_bidding_timeout | String | N | Server bidding timeout |
| sdk_c2s_bidding_timeout | String | N | C2S bidding timeout |
| sdk_load_max_wait_time | String | N | eCPM-first max wait |
| frequency_capping_hour | String | N | Hourly impression cap |
| frequency_capping_day | String | N | Daily impression cap |
| frequency_pacing_min | String | N | Impression interval (minutes) |
| request_fail_retry | String | N | Request fail retry (Splash) |
| is_refresh | String | N | Auto refresh (Banner) |
| refresh_time | String | N | Refresh interval (Banner) |
| banner_click_refresh | String | N | Refresh after click (Banner) |
Request Example
curl --location 'https://openapi.tradplusad.com/api/intermediary/group_list' \
--header 'bear: EEB82554-BD76-1474-EB7E-3785B5107872' \
--header 'Content-Type: application/json' \
--data '{"currency": "USD","adseat_uuid": "15974C36532C36C820D5B9AAEC21EB12"}'
Response Example:
{
"code": 200,
"status": 0,
"data": [
{
"group_id": "56646",
"group_name": "Custom",
"bucket_id": "8094",
"bidding_adsource_cache_num": "2",
"bidding_floor_price": "0",
"cache_num": "2",
"is_preset": "0",
"is_cold_scene": "0",
"country": "",
"city": "",
"rule_json": "{}",
"segment_tag": "",
"status": "1",
"preset_country": "",
"abtest_name": "Control group"
},
{
"group_id": "0",
"group_name": "All countries",
"bucket_id": "8094",
"bidding_adsource_cache_num": "2",
"bidding_floor_price": "0",
"cache_num": "2",
"is_preset": "0",
"is_cold_scene": "0",
"country": "",
"city": "",
"rule_json": "{}",
"segment_tag": "",
"status": "1",
"preset_country": "",
"abtest_name": "Control group"
},
{
"group_id": "56647",
"group_name": "Custom",
"bucket_id": "8095",
"bidding_adsource_cache_num": "2",
"bidding_floor_price": "0",
"cache_num": "2",
"is_preset": "0",
"is_cold_scene": "0",
"country": "",
"city": "",
"rule_json": "{}",
"segment_tag": "",
"status": "1",
"preset_country": "",
"abtest_name": "Experiment group1"
},
{
"group_id": "0",
"group_name": "All countries",
"bucket_id": "8095",
"bidding_adsource_cache_num": "2",
"bidding_floor_price": "0",
"cache_num": "2",
"is_preset": "0",
"is_cold_scene": "0",
"country": "",
"city": "",
"rule_json": "{}",
"segment_tag": "",
"status": "1",
"preset_country": "",
"abtest_name": "Experiment group1"
}
]
}
6.2 Create and Edit Mediation Groups
Request Path: /api/intermediary/store
Request Parameters:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| currency | String | Y | Currency unit, USD or CNY | |
| group_list | Array | Y | Mediation group list | Up to 10 items; extra items will be discarded |
| group_list.group_id | int | N | Mediation group ID | Required when editing. If 0 is passed, the default group will be updated |
| group_list.group_name | String | Y | Mediation group name | |
| group_list.adseat_uuid | String | Y | Placement ID | |
| group_list.bucket_id | Int | Y | A/B Test group ID | Editing is not supported |
| group_list.is_preset | Int | Y | Preset mediation group | 1: yes, 0: no. Editing is not supported |
| group_list.is_cold_scene | Int | Y | Cold start | 1: yes, 0: no. Only Splash is supported. Editing is not supported |
| group_list.bidding_floor_price | float | N | Bidding floor price | Company levels 2/3/9 |
| group_list.cache_num | Int | Y | Parallel request count | Maximum is 20 |
| group_list.bidding_adsource_cache_num | Int | Y | Bidding ad source cache count | -1 means unlimited; the maximum limit is 20 |
| group_list.country | Int | N | Country/region | Country ISO codes. For multiple values, separate them with English commas. See 9.1 |
| group_list.city | Int | N | Province/city | Province/city IDs. For multiple values, separate them with commas. See 9.2 |
| group_list.segment_tag | Int | N | Developer custom Segment Tag | Multiple Segment Tags separated by English commas |
| group_list.preset_country | String | N | Preset mediation group countries | Country ISO codes. Separate multiple values with commas |
| group_list.placement_ids | String | N | Ad source ID | Separate multiple values with commas |
| group_list.rule_json | String | N | Traffic segmentation rules | JSON format. See Appendix 3 |
| group_list.min_cache | Int | N | Minimum cache | |
| group_list.sdk_request_adsource_timeout | Int | N | Ad source request timeout | Requires request_ad_timeout |
| group_list.sdk_bidding_timeout | Int | N | Server bidding timeout | Requires request_ad_timeout |
| group_list.sdk_c2s_bidding_timeout | Int | N | C2S bidding timeout | |
| group_list.sdk_load_max_wait_time | Int | N | eCPM-first max wait | |
| group_list.ad_fill_callback | Int | N | Ad fill callback | 1 or 2; company levels 3/9 |
| group_list.frequency_capping_hour | Int | N | Hourly impression cap | |
| group_list.frequency_capping_day | Int | N | Daily impression cap | |
| group_list.frequency_pacing_min | Int | N | Impression interval (minutes) | |
| group_list.request_fail_retry | Int | N | Request fail retry | Splash only; other types return an error |
| group_list.is_refresh | Int | N | Auto refresh | Banner only; other types return 「is_refresh不适用于当前广告类型」 |
| group_list.refresh_time | Int | N | Refresh interval | Banner only; other types return an error |
| group_list.banner_click_refresh | Int | N | Refresh after click | Banner only; developer OpenAPI has no permission and returns an error |
Response Fields:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| list | Array | Y | ||
| list.group_id | String | Y | ||
| list.group_name | String | Y | ||
| list.error_message | String | Y | Error message, Empty string means success |
Request Example
curl --location 'https://openapi.tradplusad.com/api/intermediary/store' \
--header 'bear: EEB82554-BD76-1474-EB7E-3785B5107872' \
--header 'Content-Type: application/json' \
--data '{"currency": "USD","group_list": [{"group_id":56657,"group_name":"Custom","adseat_uuid":"8C321665C992CDDBE6F5892409A67612","bucket_id":0,"is_preset":0,"is_cold_scene":0,"bidding_floor_price":1,"cache_num":0,"country":"US,JP","city":"","bidding_adsource_cache_num":-1,"segment_tag":"","rule_json":"{\"rules\":[{\"name\":\"app_ver\",\"type\":\"version\",\"op\":\"in\",\"data\":[\"1\",\"2\"]}],\"timezoneOffset\":\"0\"}","placement_ids":"653046","preset_country":"AM,DE,SG"}]}'
Response Example:
{
"code": 200,
"status": 0,
"data": {
"list": [
{
"group_id": "",
"group_name": "",
"error_message": ""
}
]
}
}
6.3 Query Mediation Group Ad Source List
Request Path: /api/intermediary/group_placements
Request Parameters:
| Field | Type | Required | Description |
|---|---|---|---|
| currency | String | Y | Currency unit, USD or CNY |
| adseat_uuid | String | Y | Placement UUID |
| bucket_id | Int | N | A/B Test group ID |
| group_id | Int | N | Mediation group ID |
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| adseat_uuid | String | Y | |
| bucket_id | String | Y | A/B Test group ID |
| group_id | String | Y | Mediation group ID |
| placement_list | Array | Y | Mediation group ad source list |
| placement_list.bucket_id | Obj | Y | A/B Test group ID |
| placement_list.bucket_id.group_id | Obj | Y | Mediation group ID |
| placement_list.bucket_id.group_id.header_bidding_list | Array | N | Header Bidding area |
| placement_list.bucket_id.group_id.auto_optimization_list | Array | N | Price-sorted area |
| placement_list.bucket_id.group_id.manual_sorting_list | Array | N | Manual sorting area |
| placement_list.bucket_id.group_id.low_priority_list | Array | N | Low-priority area |
| placement_list.bucket_id.group_id.closed_list | Array | N | Ad sources disabled in the mediation group |
| Corresponding list fields: | |||
| id | String | Y | Mediation group ad source ID |
| status | String | Y | Mediation group ad source status 1 enabled, 0 disabled |
| adsource_id | String | Y | Ad network ID |
| group_id | String | Y | Mediation group ID |
| group_name | String | Y | Mediation group name |
| bucket_id | String | Y | A/B Test group ID array |
| bucket_name | String | Y | A/B Test group name |
| is_header_bidding | String | Y | Whether Header Bidding is enabled 1: yes, 0: no |
| is_auto_price | String | Y | Whether automatic price is enabled 1 enabled, 2 disabled |
| ecpm_forcast | String | Y | Predicted eCPM |
| rate | String | Y | Sorting price |
| bid_floor | String | Y | bid floor price |
| fequency_capping_day | String | Y | Frequency cap, impression limit per day |
| frequency_capping_hour | String | Y | Frequency cap, impression limit per hour |
| fequency_capping_min | String | Y | Frequency cap, impression limit per minute |
| sdk_request_timeout | String | Y | SDK ad request timeout duration |
| request_interval_status | String | Y | Request interval control, 1 enabled, 2 disabled |
| request_no_fill_num | String | Y | Request interval control, consecutive no-fill count |
| request_interval | String | Y | Request interval control, request interval in seconds |
| auto_optimization | String | Y | Sorting area: 1 price sorting, 2 manual sorting, 3 low priority |
Response Example:
{
"code": 200,
"status": 0,
"data": {
"adseat_uuid": "08056F3650B0B65B79714A1482FE5EEE",
"group_id": "",
"group_id": "",
"placement_list": {
"0": {
"0": {
"auto_optimization_list": {
"0": {
"id": "157751",
"status": "1",
"adsource_id": "16",
"group_id": "0",
"group_name": "Default group",
"group_id": "0",
"group_name": "",
"is_header_bidding": "0",
"is_auto_price": "1",
"ecpm_forcast": "",
"rate": "3",
"fequency_capping_day": "",
"frequency_capping_hour": "",
"fequency_capping_min": "",
"sdk_request_timeout": "10",
"request_interval_status": "",
"request_no_fill_num": "",
"request_interval": "",
"auto_optimization": "1"
}
}
},
"2396": {
"auto_optimization_list": {
"0": {
"id": "157801",
"status": "1",
"adsource_id": "16",
"group_id": "2396",
"group_name": "cn group",
"group_id": "0",
"group_name": "",
"is_header_bidding": "0",
"is_auto_price": "1",
"ecpm_forcast": "",
"rate": "3",
"fequency_capping_day": "2",
"frequency_capping_hour": "1",
"fequency_capping_min": "3",
"sdk_request_timeout": "10",
"request_interval_status": "1",
"request_no_fill_num": "3",
"request_interval": "180",
"auto_optimization": "1"
}
}
}
}
}
}
}
6.4 Batch Update Ad Source Properties in Mediation Groups (New A/B Test Permission Required)
Request Path: /api/intermediary/update_group_placement
Request Parameters:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| currency | String | Y | Currency unit, CNY or USD | |
| placement_list | Array | Y | Mediation group ad source array | Up to 10 items per request |
| placement_list.id | Int | Y | Mediation group ad source ID | |
| placement_list.sdk_request_timeout | Int | N | SDK ad request timeout duration | |
| placement_list.fequency_capping_day | Int | N | Frequency cap, impression limit per day | |
| placement_list.frequency_capping_hour | Int | N | Frequency cap, impression limit per hour | |
| placement_list.fequency_capping_min | Int | N | Frequency cap, impression limit per minute | |
| placement_list.request_interval_status | Int | N | Request interval control 1 enabled, 2 disabled | |
| placement_list.request_no_fill_num | Int | N | Request interval control, consecutive no-fill count | |
| placement_list.request_interval | Int | N | Request interval control, request interval in seconds | |
| placement_list.is_auto_price | Int | N | Whether automatic price is enabled 1 enabled, 2 disabled | |
| placement_list.rate | Int | N | Sorting price optional range: 0.01-10000 | |
| Response Fields: |
| Field | Type | Required | Description |
|---|---|---|---|
| data | Array | Y | |
| data.placement_id | Int | Y | Mediation group ad source ID |
| data.error_message | String | Y | Error message |
Response Example:
{
"code": 200,
"status": 0,
"data": [
{
"placement_id": 157651,
"error_message": ""
},
{
"placement_id": 157652,
"error_message": ""
},
{
"placement_id": 122,
"error_message": "Ad source error"
}
]
}
6.5 Enable or Disable Mediation Group Ad Sources
Request Path: /api/intermediary/on_off_placement
Request Parameters:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| status | Int | Y | Status 1 Enable 0 Disable | |
| placement_id_list | Array | Y | Mediation group ad source ID array | Up to 10 items per request |
| placement_id_list.id | Int | Y | Mediation group ad source ID | |
| Response Fields: |
| Field | Type | Required | Description |
|---|---|---|---|
| data | Array | Y | |
| data.placement_id | Int | Y | Mediation group ad source ID |
| data.error_message | String | Y | Error message |
Response Example:
{
"code": 200,
"status": 0,
"data": [
{
"placement_id": 157651,
"error_message": ""
},
{
"placement_id": 157652,
"error_message": ""
},
{
"placement_id": 122,
"error_message": "Ad source error"
}
]
}
7 Ad Source Management
7.1 Query Ad Network Authorization Information
Request Path: /api/PlacementApiToken/api_tokens
Request Parameters: None
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| data | Array | Y | |
| data.api_token_id | Int | Y | Network authorization ID |
| data.account_name | String | Y | Account name |
| data.adsource_id | Int | Y | Ad network ID |
| data.is_open | Int | Y | Whether enabled 1: yes, 0: no |
Response Example:
{
"code": 200,
"status": 0,
"data": [
{
"id": 1466,
"account_name": "default: account",
"adsource_id": 17,
"is_open": 0
},
{
"id": 2796,
"account_name": "default: account",
"adsource_id": 43,
"is_open": 0
}
]
}
7.2 Query Ad Source Information
Request Path: /api/placement/placements
Request Parameters:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| currency | String | Y | Currency unit, CNY or USD | |
| placement_ids | String | N | Ad source ID | comma-separated, up to 100 |
| adsource_ids | String | N | Ad network ID | comma-separated |
| app_uuids | String | N | App ID | comma-separated, up to 100 |
| adseat_uuids | String | N | Placement ID | comma-separated, up to 100 |
| fields | String | N | Fields to return | all fields by default |
| page | Int | N | Page number, default 1 | 100 items per page |
| is_on | Int | N | Filter ad source enable status: default 1 | 0 returns only disabled; 1 returns only enabled; -1 returns enabled + disabled (all); omitted or empty keeps historical behavior, defaulting to enabled only |
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| has_more | Int | Y | Whether there are more items 1: yes, 0: no |
| placements | Array | Y | |
| placements.placement_id | String | Ad source ID | |
| placements.name | String | Ad source name | |
| placements.adsource_id | String | Ad network ID | |
| placements.is_native | String | Ad support type | 0 Normal, 1 Native, 99 Inline adaptive (AdMob and GAM Banner only) |
| placements.is_header_bidding | String | Whether Header Bidding is enabled | |
| placements.header_bidding_mode | Int | Bidding mode: 0 default, 1 dynamic | |
| placements.s2s_placement | Object | Beizi S2S {channel,secret} | adsource_id=58 only |
| placements.placement_config | Json | Placement parameter configuration | demo:{"appId":"5175107","placementId":"946159096","adsource_type": "1"} |
| placements.api_token_id | String | Authorization ID | |
| placements.account_name | String | Authorized account name | |
| placements.app_uuid | String | App ID | |
| placements.app_name | String | App name | |
| placements.os | String | App OS 1 Android 2 ios | |
| placements.adseat_uuid | String | Placement UUID | |
| placements.seat_name | String | Placement name | |
| placements.ad_type | String | Placement type | |
| placements.intermediary_group | Array | Mediation group ad source information. See 6.1 | |
| Response Example: |
{
"code": 200,
"status": 0,
"data": {
"placements": [
{
"placement_id": "23399",
"name": "Pangle(cn)_int_1",
"adsource_id": "17",
"is_header_bidding": "0",
"header_bidding_mode": 0,
"placement_config": {
"appId": "5175107",
"placementId": "946159096",
"adsource_type": "1",
"app_download_setup": "0",
"popconfirm": "0",
"is_template_rendering": "1"
},
"api_token_id": "1466",
"account_name": "default: account",
"app_uuid": "6B5AE472641DB544632AE2E84F952658",
"app_name": "Stickman Battle",
"os": "1",
"adseat_uuid": "6ECF7327CD62D9BAC9965FC57CC27249",
"seat_name": "interstitial ad",
"ad_type": "2",
"currency": "USD",
"intermediary_gorup": [
{
"id": "33489",
"status": "1",
"group_id": "0",
"group_name": "Default group",
"group_id": "0",
"group_name": "",
"is_auto_price": "1",
"ecpm_forcast": "",
"rate": "0",
"fequency_capping_day": "",
"frequency_capping_hour": "",
"fequency_capping_min": "",
"sdk_request_timeout": "60",
"auto_optimization": "1",
"sort": "0"
}
]
}
],
"has_more": 0
}
}
7.3 Create and Edit Ad Source Information (New A/B Test Permission Required)
Supported ad sources for create and edit: See Appendix 2
Request Path: /api/placement/store
Request Parameters:
1 Create ad source
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| currency | String | Y | Currency unit, CNY or USD | |
| placement_list | Array | Y | Ad source configuration | Up to 10 items per request |
| placement_list.name | String | Y | Ad source name | Must be unique under the same placement |
| placement_list.api_token_id | Int | Y | Network authorization ID | See 7.1 |
| placement_list.adsource_id | Int | Y | Ad network ID | See 9.3 |
| placement_list.adseat_uuid | String | Y | Placement UUID | Ad sources supported by the placement type. See Appendix 2 |
| placement_list.is_header_bidding | Int | N | Whether Header Bidding is enabled | 1: yes, 0: no See Appendix 1 |
| placement_list.is_auto_price | Int | N | Whether automatic price is enabled | 1: enabled, 2: disabled. Required for non-Header Bidding |
| placement_list.rate | Float | N | Sorting price | Associated with currency, Required for non-Header Bidding, and must be greater than 0.01 and less than 10000 |
| placement_list.placement_config | Json | Y | Ad source parameter configuration | See Appendix 2; for AdMob and Unity Ads see fill rules below |
| placement_list.is_native | Int | N | Ad support type | 0 Normal, 1 Native; only for Banner, Splash, and Interstitial placements (Banner: 0 normal banner, 1 native banner; Splash/Interstitial follow the same rule). AdMob and GAM Banner also support 99 (inline adaptive); Meta Banner also supports 13 (stitched native banner); see fill rules below. Returned on create and when querying ad sources. |
| placement_list.is_bottom | Int | N | Fallback ad | 1: yes, 0: no; This field is invalid Header Bidding is enabled |
| placement_list.is_auto_create | Int | N | Whether to create automatically | 1: yes, 0: no. Currently supports Meta, AdMob, Pangle, Mintegral, Vungle, Fyber, Bigo, Yandex, TaurusX, Inmobi, YSO, Unity Ads |
| placement_list.auto_app_id | string | N | Top-level App ID for automated creation | Required for Meta, Inmobi, Yandex, and YSO automation (is_auto_create=1); do not send for AdMob, Fyber, or Unity Ads — use placement_config.appId for the app / Game ID |
| placement_list.header_bidding_mode | Int | N | Bidding mode | 0 default, 1 dynamic; 1 is My Network (51) only and requires mynetwork_header_bidding_mode |
| placement_list.s2s_placement | Json | N | Beizi S2S | adsource_id=58 only; must include channel and secret. Other networks return an error |
| placement_list.group_list | Array | N | Mediation groups | Each item must include group_id, bucket_id, adseat_id (numeric placement ID, not adseat_uuid) belonging to the current placement; optional selected/rate/is_auto_price. Omit to add to all groups. A mismatch returns an error and does not close existing groups |
| placement_list.bidding_floor_price | Float | N | Placement bidding floor | Non-ADX requires HB_FLOOR_PRICE; TradPlus ADX / SAAS ADX without permission writes 0 |
| placement_list.is_modify_pid | Int | N | Sync PID across placements | Update only; 1 follows Admin PID sync rules and requires modify_placement. If other placements still hold the old PID and others already hold the new PID, returns 「广告位下已存在相同广告源参数」 and does not write |
AdMob (adsource_id=2) appId / placementId fill rules
| Creation mode | OS | placement_config.appId | placement_config.placementId |
|---|---|---|---|
Manual is_auto_create=0 | Android | Required, non-empty | Required, non-empty — ad unit ID (e.g. ca-app-pub-xxx/yyy) |
Manual is_auto_create=0 | iOS | Required, non-empty (same as Android) | Required, non-empty (same as Android) |
Automated is_auto_create=1 | Android | Required, non-empty (app must already exist in AdMob) | Key required; value may be ""; system backfills after ad unit creation |
Automated is_auto_create=1 | iOS | Required, non-empty (same as Android) | Key required; value may be "" (same as Android) |
Validation errors: missing appId → appId广告位配置参数缺失; empty appId → appId广告位配置参数不能为空.
Unity Ads (adsource_id=5) appId / placementId fill rules
| Creation mode | placement_config.appId | placement_config.placementId |
|---|---|---|
Manual is_auto_create=0 | Required, non-empty Unity Game ID | Required, non-empty existing Unity Placement ID |
Automated is_auto_create=1 | Required, non-empty Unity Game ID | May be omitted or empty; after calling the Unity placements API, the returned id is written back |
Splash placements support interstitial splash only: pass is_native=0 and placement_config.placement_ad_type=2 (required; missing → placement_ad_type样式配置参数缺失, value other than 2 → placement_ad_type配置参数错误).
Unity Ads automated creation fill rules
| Item | Description |
|---|---|
| Ad types | Banner, Interstitial, Rewarded Video, and Splash only; other types return 「广告类型不支持自动化创建」 |
| Header Bidding | Not supported. is_header_bidding=1 returns 「Unity自动化创建不支持Bidding源」 |
| Authorization | The Unity authorization referenced by api_token_id must have automation enabled; otherwise 「网络授权id不支持自动化创建」 |
auto_app_id | Do not send; use placement_config.appId for the Game ID |
| Banner | ad_size is required, values 1 (320 x 50) or 2 (728 x 90); missing → ad_size样式配置参数缺失, invalid → ad_size配置参数错误 |
| Splash | Interstitial splash only (placement_ad_type=2); Unity treats splash and interstitial as an interstitial Ad Unit |
Fyber (adsource_id=24) automated creation fill rules
| Item | Description |
|---|---|
placement_config.appId | Required Fyber App ID |
placement_config.placementId | May be omitted or empty; the ID returned by Fyber is written back after creation |
| Ad types | Banner, Interstitial, Rewarded Video, and interstitial splash. Splash requires is_native=0 and placement_ad_type=2 |
| Styles | Interstitial and interstitial splash require video_mute (1: muted, 2: unmuted) |
| Header Bidding | Not supported. Pass is_header_bidding=0 |
YSO (adsource_id=77) automated creation fill rules
| Item | Description |
|---|---|
auto_app_id | Required YSO App Key |
placement_config.placementId | May be omitted or empty; the data.key returned by YSO is written back after creation |
| Ad types | Banner, Interstitial, and Rewarded Video only |
| Header Bidding | Required; S2S only (header_bidding_type=0) |
zMaticoo (adsource_id=55) manual creation fill rules
placement_config must include non-empty AppKey and placementId. Manual, non-Header-Bidding creation only. Native Banner requires native_ad_size; Native Banner and Interstitial may include video_mute; iOS Native Interstitial is not supported.
Pangle CN (adsource_id=17) primeRitId fill rules
| Item | Description |
|---|---|
| Create | Manual only (is_auto_create omitted or 0). placement_config must include non-empty appId, placementId, and primeRitId. Missing primeRitId → primeRitId广告位配置参数缺失; empty string → primeRitId广告位配置参数不能为空 |
| Automation | Not supported. is_auto_create=1 returns 「当前广告网络不支持自动化创建」. OpenAPI does not call Pangle CN prime_rit/create or code-slot create |
| Query | Stored value is returned as placement_config.primeRitId; older rows without the key omit it and do not error |
| Update | Omitting primeRitId keeps the stored value; a new value updates that row’s JSON; empty string is rejected. get_placement_list_by_app does not copy primeRitId across TradPlus ad seats (different exposure scenes need different physical slots) |
Copy primeRitId from the Pangle CN (csjplatform) console physical ad slot (prime_rit_id).
Yandex (adsource_id=50) automated creation fill rules
| Item | Description |
|---|---|
| Permission | Company must have Yandex ad network access (HB_YANDEX); without it, create returns 「当前公司未开通Yandex广告网络权限」, and Yandex is filtered from the ad source list |
auto_app_id | Required when is_auto_create=1; missing → 「缺少自动化需要的APP ID」 |
placement_config.placementId | May be omitted or empty for automated creation; after calling the Yandex adunit API, the returned id is written back (aligned with Web) |
| Normal rewarded | When placement_ad_type=0, currencyType (reward name) and currencyValue (reward amount) are required; interstitial rewarded (placement_ad_type=2) does not require them |
| Native Banner | is_template_rendering may be passed; persisted on create and returned when querying |
Native Banner (is_native=1) native_ad_size / close_button fill rules
Applies when: Banner placement + placement_list.is_native=1 + ad network is AdMob (2), Meta (1), Pangle (19), Vungle (7), Mintegral (18), InMobi (23), Yandex (50), Bigo (57), zMaticoo (55), Columbus (76), TaurusX (74), or Moloco (82). Both fields go in placement_config; returned in placement_config when querying the placement list.
| Field | Description |
|---|---|
| native_ad_size | Native Banner size: 1-320 x 50, 2-320 x 100, 3-300 x 250, 4-728 x 90; required on create. AdMob (2) and Moloco (82) only allow 3 (300 x 250) |
| close_button | Close button: 1-show, 2-hide; optional on create, default 2 (hide) |
Meta stitched native banner (is_native=13): Meta Banner placements only. Pass is_native=13 for stitched native banner; the system fixes is_template_rendering=2 (self-rendering). native_ad_size (required) and close_button (optional, default 2) apply; ad_size and is_template_rendering are not required. When querying ad sources, is_native is returned as 13.
Vungle normal banner (placement_ad_type=1): Banner placement + is_native=0 + placement_config.placement_ad_type=1 also uses native_ad_size (required) and close_button (optional, default 2).
Validation errors: missing native_ad_size → native_ad_size样式配置参数缺失; AdMob/Moloco values other than 3 → native_ad_size配置参数错误 (existing sizes are not migrated; omit the field on edit to keep the stored value); is_native=13 on non-Meta or non-Banner placements → 「广告支持类型参数错误」; on other platforms, native_ad_size/close_button are ignored when is_native=1 is used.
Inline adaptive banner (is_native=99) fill rules
Applies when: Banner placement + is_native=99 + ad network is AdMob (2) or GAM (48).
| Field | Description |
|---|---|
| is_native | Pass 99 for inline adaptive banner |
| placement_config | Fill authorization and placement parameters per Appendix 2; ad_size and collapsible are not required |
Banner style type cannot be changed after creation.
Common errors: is_native=99 on non-AdMob/GAM or non-Banner placements returns 「广告支持类型参数错误」; passing ad_size or collapsible for inline adaptive banner returns 「内嵌式自适应横幅不支持 ad_size/collapsible」.
2 Edit ad source
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| currency | String | Y | Currency unit, CNY or USD | |
| placement_list | Array | Y | Ad source configuration | |
| placement_list.placement_id | String | Y | Ad source ID | |
| placement_list.name | String | N | Ad source name | |
| placement_list.api_token_id | Int | N | Network authorization ID | See 7.1 |
| placement_list.is_auto_price | Int | N | Whether automatic price is enabled | For non-Header Bidding, this can be updated. 1: enabled, 2: disabled |
| placement_list.rate | Int | Float | Sorting price | Associated with currency, Can be updated for non-Header Bidding |
| placement_list.placement_config | Json | Y | Ad source parameter configuration | Only style configuration can be modified; Pangle CN (17) may also update primeRitId (omit to keep, empty string rejected). is_modify_pid=1 can update PID fields and sync them across placements |
| placement_list.header_bidding_mode | Int | N | Bidding mode | 0 default, 1 dynamic; My Network (51) only for 1 |
| placement_list.s2s_placement | Json | N | Beizi S2S | adsource_id=58 only |
| placement_list.group_list | Array | N | Mediation group status | Each item must include group_id, bucket_id, adseat_id (numeric ID) belonging to the current placement; optional selected/rate/is_auto_price. A mismatch returns an error and does not close existing groups |
| placement_list.bidding_floor_price | Float | N | Placement bidding floor | Non-ADX requires permission |
| placement_list.is_modify_pid | Int | N | Sync PID across placements | 1 requires modify_placement. If both old and new PIDs are already used on other placements, returns 「广告位下已存在相同广告源参数」 |
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| data | Array | Y | |
| data.placement_id | Int | Y | Ad source ID |
| data.name | String | Y | Ad source name |
| data.placement_config | String | Y | Passed ad source parameter configuration |
| data.error_message | String | Y | Error message, Empty means success |
Request Example
curl --location --request POST 'https://openapi.tradplusad.com/api/placement/store?sign=5DE008C88087D8556D276A9E5B8E37E6×tamp=1629525680&nonce=5c672d4e9628d0a7' \
--header 'bear: 157E4A5D-3877-1236-DE06-457FT3F70C4' \
--header 'Content-Type: application/json' \
--data '{"currency":"USD","placement_list":[{"name":"API-1 Create Ad Source","api_token_id":1640,"adsource_id":16,"adseat_uuid":"42D65EDFC13A93B5B25F70FC57280A97","is_header_bidding":0,"is_auto_price":1,"rate":0.03,"placement_config":"{\"placementId\":\"9499192321\",\"appId\":\"53102791\",\"is_template_rendering\":2,\"video_mute\":1,\"auto_play_video\":1,\"video_max_time\":5}","is_bottom":1,"is_native":1}]}'
Response Example:
{
"code": 200,
"status": 0,
"data": [
{
"placement_id": 0,
"name": "test_yky1",
"placement_config": "{ "appId": "zzz", "placementId": "23","video_mute":1 }",
"error_message": "Ad source name already exists"
},
{
"placement_id": 859455,
"name": "test_yky2",
"placement_config": "{ "appId": "zzz", "placementId": "23","video_mute":1 }",
"error_message": ""
},
]
}
8 A/B Test Management
8.1 A/B Test List
Request Path: /api/abtest/list
Request Parameters:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| abtest_id | Int | N | A/B Test ID | Filters by the specified A/B Test when passed |
| adseat_uuid | String | N | Placement UUID | Filters by placement when passed |
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| data | Array | Y | A/B Test list |
| data[].abtest_id | Int | Y | A/B Test ID |
| data[].name | String | Y | A/B Test name |
| data[].app_uuid | String | Y | App UUID |
| data[].adseat_uuid | String | Y | Placement UUID |
| data[].share_adseat_uuid | String | Y | Shared placement UUID |
| data[].status | Int | Y | A/B Test status 0-pending manual start 1-scheduled to start 2-in progress 3-ended |
| data[].group_id | String/Int | Y | Group ID |
| data[].ab_type | Int | Y | A/B Test type (1 Placement A/B Test, 2 Mediation group A/B Test) |
| data[].start_time | Int | Y | Start time (timestamp) |
| data[].end_time | Int | Y | End time (timestamp) |
| data[].is_system | Int | Y | Whether smart hosting is enabled |
| data[].reverse | Int | Y | Whether user traffic split is reversed (0/1) |
| data[].auto_hand | Int | Y | Whether it takes effect manually (0/1) |
| data[].available_time | Int | Y | Scheduled effective time (timestamp) |
| data[].available_time_zone | String | Y | Effective time zone |
| data[].description | String | Y | Notes |
| data[].is_bind_share_adseat | Int | Y | Whether a shared placement is bound (0/1) |
| data[].buckets | Array | Y | Group list |
| data[].buckets[].id | Int | Y | Group ID |
| data[].buckets[].name | String | Y | Group name |
| data[].buckets[].percent | String/Int | Y | Traffic split percentage |
| data[].buckets[].weight | Int | Y | Weight |
| data[].buckets[].ab_status | Int | Y | Group status 1: enabled, 2: paused, 3: ended |
| data[].buckets[].is_win | Int | Y | Whether it is the winning group (0/1); 1 means winning group |
| data[].buckets[].bucket_group_id | Int | Y | Bucket group number |
| data[].buckets[].is_share_bucket | String | Y | Whether the group uses a shared placement (0/1); 1 means used |
Request Example
curl--location'http://openapi.tradplusad.com/api/abtest/list?sign=A33B4508815081F9D41D96E96F7B297E×tamp=1666261328&nonce=5c672d4e9628d0a7'
--header'bear: EEB82554-BD76-1474-EB7E-3785B5107872'
--header'Content-Type: application/json'
--data'{"adseat_uuid":"E6379DA920E44F5DC13A06FCBE09E212"}'
Response Example
{
"code": 200,
"status": 0,
"data": [
{
"name": "ABTest_Modify_20260312",
"status": "2",
"group_id": "0",
"ab_type": "1",
"start_time": "1773395668",
"end_time": "0",
"is_system": "0",
"reverse": "0",
"auto_hand": "1",
"available_time": "0",
"available_time_zone": "8",
"description": "modify by openapi11",
"is_bind_share_adseat": "1",
"abtest_id": "3203",
"app_uuid": "8EFC6E4C26E961B3C68C274CE4862511",
"adseat_uuid": "E6379DA920E44F5DC13A06FCBE09E212",
"share_adseat_uuid": "797A392C56327B804E3547DD76E29812",
"buckets": [
{
"id": "8417",
"name": "Group C - Added/Updated",
"percent": "1",
"weight": "1",
"ab_status": "2",
"is_win": "0",
"bucket_group_id": "3",
"is_share_bucket": "0"
},
{
"id": "8416",
"name": "Group B - Updated",
"percent": "45",
"weight": "45",
"ab_status": "1",
"is_win": "0",
"bucket_group_id": "2",
"is_share_bucket": "0"
},
{
"id": "8415",
"name": "Group A - Updated",
"percent": "55",
"weight": "55",
"ab_status": "1",
"is_win": "0",
"bucket_group_id": "1",
"is_share_bucket": "1"
}
]
}
]
}
8.2 Create A/B Test
Request Path: /api/abtest/store
Request Parameters:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| name | String | Y | A/B Test name | Maximum 30 characters |
| ab_type | Int | Y | A/B Test type | 1 Placement A/B Test, 2 Mediation group A/B Test |
| app_uuid | String | Y | App ID | |
| adseat_uuid | String | Y | Placement ID | Must match app_uuid |
| group_id | String/Int | N | Group ID | Required when ab_type=2; pass 0 for the all-countries group; defaults to empty if omitted |
| auto_hand | Int | Y | Whether it takes effect manually | 1 manual start, 0 start automatically by time |
| available_time | String | N | Effective time | Required when auto_hand=0; recommended format: Y-m-d H:i:s |
| available_time_zone | String | N | Time zone | Required when auto_hand=0, optional: -8, 0, 8 |
| buckets | Array | Y | A/B Test group configuration | At least 2 groups |
| buckets[].name | String | Y | Group name | Group names cannot be duplicated |
| buckets[].percent | float | Y | Traffic split percentage | Pass values according to business rules 0~100; Note: the sum of all A/B Test groups must be in the range 99-100 (tolerance: 1) |
| buckets[].weight | Int | Y | Weight | 0~100 |
| buckets[].ab_status | Int | Y | Group status | Pass fixed value 1 when creating (enabled) |
| buckets[].copy_group_config | Int | N | Whether to copy the current configuration | 1: copy current configuration (recommended); other values do not copy current configuration (the first group will be forced to 1) |
| buckets[].is_share_bucket | Int | N | Whether the group uses a shared placement | Takes effect when is_bind_share_adseat=1, 1 means used |
| description | String | N | Notes | Maximum 100 characters |
| is_bind_share_adseat | Int | N | Whether a shared placement is bound | 0 no, 1 yes |
| share_adseat_uuid | String | N | Shared placement ID | is_bind_share_adseat=1 Required |
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| abtest_id | Int | Y | A/B Test ID |
| name | String | Y | A/B Test name |
Request Example
curl--location'http://openapi.tradplusad.com/api/abtest/store?sign=A33B4508815081F9D41D96E96F7B297E×tamp=1666261328&nonce=5c672d4e9628d0a7'
--header'bear: EEB82554-BD76-1474-EB7E-3785B5107872'
--header'Content-Type: application/json'
--data'{"name":"ABTest_API","ab_type":1,"app_uuid":"8EFC6E4C26E961B3C68C274CE4862511","adseat_uuid":"E6379DA920E44F5DC13A06FCBE09E212","group_id":0,"auto_hand":0,"available_time":"2026-03-12 20:00:00","available_time_zone":"8","description":"openapi create abtest","is_bind_share_adseat":0,"share_adseat_uuid":"","buckets":[{"name":"Group A","percent":50,"weight":50,"ab_status":1,"copy_group_config":1,"is_share_bucket":0},{"name":"Group B","percent":50,"weight":50,"ab_status":1,"copy_group_config":1,"is_share_bucket":0}] }'
Response Example
Success:
{
"code": 200,
"status": 0,
"data": {
"abtest_id": 12345,
"name": "AB Test - Interstitial"
}
}
Failure:
{
"code": 10002,
"status": 1,
"message": "Parameter error"
}
8.3 Edit A/B Test
Request Path: /api/abtest/modify
Request Parameters:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| abtest_id | Int | Y | A/B Test ID | |
| name | String | Y | A/B Test name | Maximum 30 characters |
| reverse | Int | N | Whether user traffic split is reversed | 0 no, 1 yes; Can be set only when the A/B Test is in progress |
| description | String | N | Notes | Maximum 100 characters |
| buckets | Array | Y | A/B Test group configuration | At least 2 groups |
| buckets[].id | Int | N | Group record ID | Required when editing an existing group (obtained from the list API); omit when adding a group |
| buckets[].bucket_group_id | Int | N | Bucket group number | Required when editing an existing group (obtained from the list API); omit or pass 0 when adding a group |
| buckets[].name | String | Y | Group name | Cannot be empty |
| buckets[].percent | float | Y | Traffic split percentage | Pass values according to business rules 0~100; Note: the sum of all A/B Test groups must be in the range 99-100 (tolerance: 1) |
| buckets[].weight | Int | Y | Weight | 0~100 |
| buckets[].ab_status | Int | Y | Group status | 1: enabled, 2: paused |
| buckets[].is_share_bucket | Int | N | Whether the group uses a shared placement | Takes effect when is_bind_share_adseat=1, 1 means used; Can be updated only before the A/B Test is enabled |
| buckets[].copy_group_config | Int | N | Whether to copy the current configuration | Used when adding a group: 1: copy current configuration (recommended); other values do not copy current configuration |
Request Example
curl--location'http://openapi.tradplusad.com/api/abtest/modify?sign=A33B4508815081F9D41D96E96F7B297E×tamp=1666261328&nonce=5c672d4e9628d0a7'
--header'bear: EEB82554-BD76-1474-EB7E-3785B5107872'
--header'Content-Type: application/json'
--data'{"abtest_id":3203,"name":"ABTest_Modify_20260312","reverse":1,"description":"modify by openapi11","buckets":[{"id":8415,"bucket_group_id":1,"name":"Group A - Updated","percent":55,"weight":55,"ab_status":1,"is_share_bucket":1},{"id":8416,"bucket_group_id":2,"name":"Group B - Updated","percent":45,"weight":45,"ab_status":1,"is_share_bucket":0},{"name":"Group C - Added","percent":1,"weight":1,"ab_status":1,"copy_group_config":1,"is_share_bucket":0}]}'
Response Example
Success:
{
"code": 200,
"status": 0,
"data": {
"abtest_id": 12345,
"name": "ABTest_Modify"
}
}
Failure:
{
"code": 10002,
"status": 1,
"message": "Parameter error"
}
8.4 Start A/B Test
Request Path: /api/abtest/start
Request Parameters:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| abtest_id | Int | Y | A/B Test ID | Only A/B Tests in pending manual start status can be started |
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| abtest_id | Int | Y | A/B Test ID |
| status | Int | Y | A/B Test status (0-pending manual start 1-scheduled to start 2-in progress 3-ended) |
Request Example
curl--location'http://openapi.tradplusad.com/api/abtest/start?sign=A33B4508815081F9D41D96E96F7B297E×tamp=1666261328&nonce=5c672d4e9628d0a7'
--header'bear: EEB82554-BD76-1474-EB7E-3785B5107872'
--header'Content-Type: application/json'
--data'{"abtest_id":3203}'
Response Example
Success:
{
"code": 200,
"status": 0,
"data": {
"abtest_id": 3208,
"status": 2
}
}
Failure:
{
"code": 1001,
"status": 1,
"message": "Parameter error"
}
8.5 Close A/B Test
Request Path: /api/abtest/close
Request Parameters:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| abtest_id | Int | Y | A/B Test ID | |
| bucket_id | Int | N | Winning group ID | Required when closing an active A/B Test (used to specify the winning group) |
| type | Int | N | Close type | 1 regular close, 2 smart-hosting close |
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| abtest_id | Int | Y | A/B Test ID |
| status | Int | Y | A/B Test status (0-pending manual start 1-scheduled to start 2-in progress 3-ended) |
Request Example
curl--location'http://openapi.tradplusad.com/api/abtest/close?sign=A33B4508815081F9D41D96E96F7B297E×tamp=1666261328&nonce=5c672d4e9628d0a7'
--header'bear: EEB82554-BD76-1474-EB7E-3785B5107872'
--header'Content-Type: application/json'
--data'{"abtest_id":3203,"group_id":8431,"type":1}'
Response Example
Success:
{
"code": 200,
"status": 0,
"data": {
"abtest_id": 3208,
"status": 3
}
}
Failure:
{
"code": 1001,
"status": 1,
"message": "Parameter error"
}
9 Query Common Information
9.1 Query Country Information
Request Path: /api/info/region
Request Parameters: None
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| list | Array | Y | |
| list.name | String | Y | Chinese name |
| list.name_en | String | Y | English name |
| list.iso | String | Y | Two-letter country code (short code) |
Response Example:
{
"code": 200,
"status": 0,
"data": {
"list": [
{
"name": "Belgium",
"name_en": "Belgium",
"iso": "BE"
},
{
"name": "Libya",
"name_en": "Libya",
"iso": "LY"
},...
]
}
}
9.2 Query City Information
Request Path: /api/info/city
Request Parameters: None
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| list | Array | Y | |
| list.id | String | Y | id |
| list.pid | String | Y | Parent ID |
| list.name | String | Y | City |
Response Example:
{
"code": 200,
"status": 0,
"data": {
"list": [
{
"id": "1",
"pid": "0",
"name": "Beijing"
},
{
"id": "2",
"pid": "0",
"name": "Tianjin"
},...
]
}
}
9.3 Query Ad Networks
Request Path: /api/info/adsource_list
Request Parameters: None
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| list | Array | Y | |
| list.name | String | Y | Ad platform name |
| list.adsource_id | Int | Y | TradPlus ad platform ID |
Response Example:
{
"code": 200,
"status": 0,
"data": {
"list": [
{
"name": "Meta",
"adsource_id": 1
},
{
"name": "Admob",
"adsource_id": 2
},...
]
}
}
10 Ad Scenes
10.1 Query Ad Scenes
Request Path: /api/AdScene/scenes
Request Parameters:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| app_uuid | String | N | App UUID | |
| adseat_uuid | String | N | Placement ID | |
| page | Int | N | Page number, default 1 | 100 items per page |
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| has_more | Int | Y | Whether there are more items 1: yes, 0: no |
| total | Int | Y | Total count |
| adscene_list | Array | Y | |
| adscene_list.ad_scene_id | String | Y | Scene primary key ID |
| adscene_list.ad_scenes_name | String | Scene name | |
| adscene_list.app_uuid | String | App ID | |
| adscene_list.adseat_uuid | String | Placement ID | |
| adscene_list.uuid | String | Scene UUID | Used by SDK |
| adscene_list.is_custom_uid | String | Whether to use a custom scene 1: yes, 0: no | |
| adscene_list.status | String | Status 1 enabled, 2 disabled | |
| adscene_list.remark | String | Notes | |
| Response Example: |
{
"code": 200,
"status": 0,
"data": {
"has_more": 0,
"total": 1,
"adscene_list": [
{
"ad_scene_id": "260",
"ad_scenes_name": "tab",
"app_uuid": "38C0EB39AC0C015903E5CA6CA069AFF7",
"adseat_uuid": "2A7E2D218A488665581A608D7AC9AA6F",
"uuid": "76BE82DBAE98A3",
"is_custom_uid": "0",
"status": "1",
"remark": ""
}
]
}
}
10.2 Create and Edit Ad Scenes
Request Path: /api/AdScene/store
Request Parameters:
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| adscene_list | Array | Y | Ad scene information | |
| adscene_list.adseat_uuid | String | Y | Placement ID | |
| adscene_list.ad_scene_id | Int | N | Ad scene primary key ID | Required when editing. corresponding to ad_scene_id in 10.1 |
| adscene_list.ad_scene_name | String | Y | Scene name | |
| adscene_list.status | Int | N | Status. Required when creating. 1: enabled, 2: disabled | |
| adscene_list.remark | String | N | Notes | |
| adscene_list.is_custom_uid | Int | N | Whether to use a custom scene. Required when creating. 1: yes, 0: no | |
| adscene_list.custom_uid | String | N | Custom scene UID | Required and must be unique using a custom scene |
Response Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| list | Array | Y | |
| list.adseat_uuid | String | N | App ID |
| list.ad_scene_name | String | N | Scene name |
| list.ad_scene_id | Int | N | Scene primary key ID |
| list.error_message | String | N | Error message, Empty string means success |
Response Example:
{
"code": 200,
"status": 0,
"data": {
"list": [
{
"adseat_uuid": "2A7E2D218A488665581A608D7AC9AA6F",
"ad_scene_name": "Reward screen",
"ad_scene_id": 125,
"error_message": ""
},
{
"adseat_uuid": "2A7E2D218A488665581A608D7AC9AA6F",
"ad_scene_name": "Level",
"ad_scene_id": 220,
"error_message": ""
}
]
}
}
Appendix 1 Header Bidding
| Placement type | Ad source |
|---|---|
| Splash | Tencent Ads Vungle Mintegral Inmob Columbus Bigo Yandex Pangle Unity Ads TaurusX Moloco Magnite |
| Rewarded Video | Sigmob (permission required) Tencent Ads Meta Vungle Mintegral Inmobi YSO Columbus Bigo Yandex Pangle Pangle Unity Ads TaurusX Moloco Magnite |
| Interstitial | Sigmob (permission required) Tencent Ads Meta Vungle Mintegral Inmobi YSO Columbus Bigo Yandex Pangle Pangle Unity Ads TaurusX Moloco Magnite |
| Banner | Tencent Ads Meta Vungle Mintegral Inmobi YSO Columbus Bigo Yandex Pangle Pangle Unity Ads TaurusX Moloco Magnite |
| Standard Native | Tencent Ads Meta Vungle Mintegral Inmobi Columbus Bigo Yandex Pangle Pangle TaurusX Moloco Magnite |
| Native Banner | Tencent Ads Meta Vungle Mintegral Inmobi Columbus Bigo Yandex Pangle Pangle TaurusX Moloco Magnite |
| Draw feed | Tencent Ads |
| Native Splash | Tencent Ads Vungle Mintegral Inmobi Columbus Bigo Yandex Pangle Pangle TaurusX Moloco Magnite |
Appendix 2 Ad Network and Placement Type Configuration Mapping
| Ad network ID | Ad network name | Placement parameter configuration | Ad type | Ad style parameter configuration | Notes |
|---|---|---|---|---|---|
| 1 | Meta | placementId (Placement ID) | Rewarded Video | adsource_type Placement type 1-Rewarded Video 2-rewarded interstitial | |
| Interstitial | - | When creating Reels Ads, pass is_native=1 | |||
| Splash | is_template_rendering Template type 2: self-rendering | ||||
| Banner | ad_size Ad source size/Height | Size: | |||
| Standard Native | is_template_rendering Template type 1: template rendering 2: self-rendering | Height: | |||
| Native Banner | is_template_rendering Template type 1: template rendering 2: self-rendering | ||||
| 2 | AdMob | appId (App ID) placementId (Ad Unit ID) See §7.3. | Rewarded Video | adsource_type Placement type 1-rewarded video ad 2-rewarded interstitial ad | When placement_ad_type=2 [interstitial rewarded video], the adsource_type style parameter is not available |
| Interstitial | - | ||||
| Banner | ad_size Ad source size | 1: 320 x 50 | |||
| Splash | placement_ad_type Ad type 0-normal splash 2-interstitial splash | ||||
| Standard Native | ad_size Creative aspect ratio | 1: Unspecified | |||
| 5 | Unity Ads | appId (App ID) placementId (Placement ID) | Rewarded Video | - | Supports Header Bidding (manual create only); |
| Interstitial | - | Supports Header Bidding (manual create only); | |||
| Splash | placement_ad_type Ad type: 2-interstitial splash | Supports Header Bidding (manual create only); | |||
| Standard Native | Not supported | ||||
| Banner | ad_size Ad source size | ad_size: | |||
| 7 | Vungle | appId (App ID) placementId (Placement Reference ID) | Rewarded Video | video_mute Video mute 1 yes, 2 no | iOS apps do not have the direction style parameter; |
| Interstitial | video_mute Video mute 1 yes, 2 no | When is_native=0 [normal interstitial], Android apps have the direction style parameter; iOS apps do not have this style parameter; | |||
| Banner | is_template_rendering Placement type 0-banner ad 1-medium rectangle banner ad | ad_size: | |||
| Splash | video_mute Video mute 1 yes, 2 no | When is_native=0 [normal splash] and placement_ad_type=0, Android apps only have direction with values 1 and 2; iOS apps have no style parameter; | |||
| Standard Native | is_template_rendering Ad type 1-medium rectangle banner ad 2-Standard Native 3-Inline | When is_template_rendering=3, the ad_size style parameter is available | |||
| 15 | Chartboost | appSign (App Signature) appId (App ID) placementId (Location) | Rewarded Video | - | |
| Interstitial | - | ||||
| Banner | ad_size Ad source size | ad_size: | |||
| Splash | Not supported | ||||
| Standard Native | Not supported | ||||
| 16 | Tencent Ads | appId (Media ID) placementId (Unit ID) | Rewarded Video | video_mute Video mute 1 yes, 2 no | |
| Interstitial | full_screen_video Full screen 1 yes, 2 no | no duration limit: video_max_time -1 | |||
| Banner | is_template_rendering Template type 1 Tencent Ads rendering | ||||
| Splash | zoom_out Splash V+ 1 yes, 2 no | ||||
| Standard Native | is_template_rendering 1 Tencent Ads rendering 2 developer self-rendering 4 in-stream video ad(Tencent Ads rendering) 5 in-stream video ad(self-rendering) | ||||
| Native Banner | is_template_rendering 2 developer self-rendering 5 in-stream video ad(self-rendering) | ||||
| Draw feed | - | ||||
| Native Splash | is_template_rendering 2 developer self-rendering 3 Tencent Ads rendering
video_mute Video mute 1 yes, 2 no | ||||
| 17 | Pangle | appId (App ID) primeRitId (Prime Rit ID) placementId (Slot ID) | Rewarded Video | app_download_setup Placement type, confirmation dialog before download 0 default, 1 specified (Android only) | When app_download_setup is 0, popconfirm is invalid (same below) |
| Interstitial | adsource_type Placement type, 1 full-screen video 2interstitial ad 3 new interstitial ad | Note: 1) When adsource_type=1, there are no ad_size_ratio or video_orientation parameters. 2) When adsource_type=2, is_template_rendering must be 1 and there is no video_orientation parameter. 3) When adsource_type=3, there are no ad_size_ratio or is_template_rendering parameters. | |||
| Banner | app_download_setup Placement type, confirmation dialog before download 0 default, 1 specified (Android only) popconfirm secondary confirmation dialog 1 yes, 2 no (Android only) ad_size 1,2,3,4,5,6,7,8 | 1: 600 x 300 | |||
| Splash | is_template_rendering Template type 1 template rendering(personalized template) 2 self-rendering | ||||
| Standard Native | is_template_rendering Template type 1 template rendering(personalized template) 2 self-rendering 3 in-stream video ad | ||||
| Draw feed | - | ||||
| Native Splash | is_template_rendering Template type 1 template rendering(personalized template) 2 self-rendering | ||||
| 18 | Mintegral | AppKey (App Key) appId (App ID) placementId (Location) unitId (AD Unit ID) | Rewarded Video | video_mute Video mute 1 yes, 2 no | When is_auto_create=1 and placement_ad_type=2 [interstitial rewarded], ad_space_type is required (1/2) |
| Interstitial | video_mute Video mute 1 yes, 2 no | When creating native interstitial, adsource_type is required; | |||
| Banner | is_template_rendering Template type 2 self-rendering | ad_size: | |||
| Splash | is_skipable Skippable 1 yes, 2 no[normal splash] | When is_native=0 [normal splash], only is_skipable, direction, countdown_time, and placement_ad_type are available. If it is a bidding source (is_header_bidding=1), ad_size is also required. When is_native=1 [Native Splash], only placement_ad_type, is_template_rendering, video_mute, and auto_play_video are available. When is_native=0 and placement_ad_type=2 [interstitial splash], only placement_ad_type and video_mute are available; when is_auto_create=1 and placement_ad_type=2, ad_space_type is required (1/2) | |||
| Standard Native | is_template_rendering Template type 1 auto-rendering 2 custom rendering | is_template_rendering=2, only the video_mute style parameter is available; | |||
| 19 | Pangle | appId (App ID) placementId (Slot ID) | Rewarded Video | is_template_rendering Template type 1-template rendering | When placement_ad_type=0 [normal rewarded video], applicable fields: is_template_rendering, orientation; is_template_rendering values: 1-template rendering; orientation values: 1-portrait, 2-landscape; |
| Interstitial | accept_material_type Ad creative type 1-image only 2-video only 3-image + video | When is_native=0 [normal interstitial], applicable fields: accept_material_type, orientation; not applicable fields: adsource_type, ad_categories; | |||
| Banner | is_template_rendering Template type 2-self-rendering | ad_size values: 1-640 x 100, 2-600 x 500; | |||
| Splash | placement_ad_type Ad type 0-normal splash 2-interstitial splash | When is_native=0 [normal splash], applicable fields: placement_ad_type, orientation; placement_ad_type values: 0-normal splash, 2-interstitial splash; not applicable fields: ad_categories; | |||
| Standard Native | banner_mrec Placement type 1-Standard Native 4-Banner/MREC | When banner_mrec=1 [Standard Native], applicable fields: is_template_rendering, ad_categories; not applicable fields: slide_banner; | |||
| 20 | Kuaishou | appId (App ID) appName(App name) placementId (Placement ID) | Rewarded Video | direction Screen orientation 1 portrait, 2 landscape 3 | |
| Interstitial | adsource_type Placement type, 1 full-screen video 2interstitial ad | only adsource_type is 1full-screen video directionScreen orientationoptional | |||
| Splash | - | ||||
| Standard Native | is_template_rendering Template type 1 template rendering 2 self-rendering | ||||
| Native Banner | is_template_rendering Template type 2 self-rendering | ||||
| Draw feed | - | ||||
| Native Splash | is_template_rendering Template type 1 template rendering 2 self-rendering | ||||
| 21 | Sigmob | appId (App ID) AppKey (App Key) placementId ( ID) | Rewarded Video | ||
| Interstitial | - | ||||
| Splash | - | ||||
| Standard Native | - | ||||
| Native Banner | - | ||||
| Native Splash | - | ||||
| 23 | Inmobi | placementId (Placement ID) | Rewarded Video | placement_ad_type Type 0-normal rewarded video 2-interstitial rewarded video | When is_auto_create=1, C2S Bidding (header_bidding_type=1) is not supported |
| Interstitial | adsource_type style parameter: 1-interstitial, 2-half-screen interstitial | When is_native=1 [native interstitial],only the adsource_type style parameter is available; | |||
| Splash | placement_ad_type SplashType 1-Native Splash 2-interstitial splash | ||||
| Standard Native | banner_mrec Placement type 1-Standard Native 4-MREC(300x250) | When is_auto_create=1, banner_mrec is required (1/4) | |||
| Banner | ad_size Ad source size [Normal Banner] | ad_size: | |||
| 24 | Fyber | appId (App ID) placementId (Placement ID) | Rewarded Video | - | |
| Interstitial | video_mute Video mute 1 yes, 2 no | ||||
| Splash | video_mute Video mute 1 yes, 2 no | ||||
| Standard Native | Not supported | ||||
| Banner | - | ||||
| 40 | TradPlus Adx | placementId (Placement ID) | Rewarded Video | video_mute Video mute 1-yes 2-no | When adsource_type=1, the skip_time style parameter is not available |
| Interstitial | video_mute Video mute 1-yes 2-no | When adsource_type=2, the video_mute style parameter is not available | |||
| Splash | - | ||||
| - | |||||
| Standard Native | template_render_type Template type | 1- 2- 3- 4- 5- | |||
| Banner | ad_size Ad source size | ad_size: 1: Banner(320x50) 2: Banner(320x90) 3: Banner(300x250) 4: Banner(728x90) 100: Custom When ad_size=100, requires width, height style parameter | |||
| 43 | Baidu Union | appId (APP ID) placementId (Ad Place ID) | Rewarded Video | - | |
| Interstitial | adsource_type Placement type, 1 full-screen video 3 Interstitial | ||||
| Banner | is_native=0 Not supported | ||||
| Splash | - | ||||
| Standard Native | is_template_rendering Template type Template type 1 smart optimization 2 self-rendering | ||||
| Native Banner | is_template_rendering Template type Template type 2 self-rendering | ||||
| Native Splash | is_template_rendering Template type Template type 1 smart optimization 2 self-rendering | ||||
| 44 | Youkeying | appId (App ID) placementId (Placement ID) | Rewarded Video | video_mute Video mute 1 yes, 2 no | |
| Interstitial | - | ||||
| Splash | - | ||||
| Standard Native | is_template_rendering Template type 2 self-rendering | ||||
| Native Splash | is_template_rendering Template type 2 self-rendering | ||||
| 50 | Yandex | placementId (Ad Unit ID) | Rewarded Video | placement_ad_type Type 0-normal rewarded video 2-interstitial rewarded video | When is_auto_create=1 and placement_ad_type=0 [normal rewarded], currencyType and currencyValue are required; placement_ad_type=2 [interstitial rewarded] does not require them; |
| Interstitial | adsource_type style parameter: 1-full-screen video, 2-half-screen interstitial | When is_native=0 [normal interstitial], there is no style parameter; | |||
| Splash | placement_ad_type SplashType 0-normal splash 1-Native Splash 2-interstitial splash | When is_auto_create=1, placementId may be empty and is written back from the Yandex response id | |||
| Standard Native | is_template_rendering Template type 1- 2-self-rendering | When is_auto_create=1, placementId may be empty and is written back from the Yandex response id | |||
| Banner | ad_size Ad source size [Normal Banner] | ad_size: | |||
| 57 | Bigo | appId (App ID) placementId (Placement ID) | Rewarded Video | placement_ad_type 0-normal rewarded video 2-interstitial rewarded video | When creating interstitial rewarded video, only the placement_ad_type=2 style parameter is available; |
| Interstitial | adsource_type Placement type 1-full-screen video 2-half-screen interstitial | When is_native=0 [normal interstitial], there is no style parameter | |||
| Splash | adsource_type Placement type 1-half-screen ad 2-full-screen ad | When is_native=0 [normal splash], only the adsource_type style parameter is available; when is_auto_create=1, splashShowMaximumDuration and splashTurnOffAllowed are also required | |||
| Standard Native | banner_mrec Placement type 1-Standard Native 4-MREC | When is_auto_create=1 and banner_mrec=1 [Standard Native], adSpecification is required; | |||
| Banner | ad_size Ad source size [Normal Banner] | ad_size: | |||
| 74 | TaurusX | appId (App ID) placementId (Placement ID) | Rewarded Video | placement_ad_type Type 0 normal rewarded 2 interstitial rewarded | When is_auto_create=1, placement_ad_type is required (0/2); non-HB may pass cpm_rate |
| Interstitial | adsource_type Style 1 full-screen 2 half-screen | When is_native=0 [normal interstitial], video_mute applies; | |||
| Splash | placement_ad_type Splash type 0-normal 2-interstitial splash | When is_native=0 and is_auto_create=1, placement_ad_type is required (0/2); | |||
| Standard Native | ad_sub_format Third-party size 1-300x250 2-300x300 | When is_auto_create=1, ad_sub_format is required (1/2) | |||
| Banner | ad_size Ad source size [Normal Banner] | ad_size: | |||
| 76 | Columbus | appKey (App Key) appSecret (App Secret) placementId (Placement ID) | Rewarded Video | placement_ad_type Type 0 normal rewarded video 2 interstitial rewarded video | iOS appsNot supportedCreate |
| Interstitial | adsource_type style parameter: 1-interstitial, 2-half-screen interstitial | When is_native=0 [normal interstitial],no adsource_type style parameter | |||
| Banner | ad_size Ad source size | ad_size: | |||
| Splash | placement_ad_type 1Native Splash 2 interstitial splash | When is_native=1 [Native Splash], placement_ad_type=1 | |||
| Standard Native | - | ||||
| 77 | Yso | placementId (Placement ID) | Rewarded Video | - | |
| Interstitial | - | ||||
| Splash | - | ||||
| Standard Native | - | ||||
| Banner | - | ||||
| 82 | Moloco | appkey (App Key) placementId (Ad Unit ID) | Rewarded Video | - | Supports Header Bidding (S2S); automation is not supported |
| Interstitial | adsource_type 1 fullscreen interstitial 2 half-screen interstitial | When is_native=0 [normal interstitial], no adsource_type; when is_native=1 [native interstitial], adsource_type applies; supports Header Bidding (S2S) | |||
| Splash | placement_ad_type 1 native splash 2 interstitial splash | When is_native=1 [native splash], placement_ad_type=1; | |||
| Standard Native | - | Supports Header Bidding (S2S) | |||
| Banner | ad_size ad source size [normal banner] | ad_size: | |||
| 83 | Magnite | appId (App ID) accountId (Account ID) siteId (Site ID) placementId (Placement ID) | Rewarded Video | - | Supports Header Bidding (S2S); automation is not supported |
| Interstitial | adsource_type 1 fullscreen interstitial 2 half-screen interstitial | When is_native=0 [normal interstitial], no extra style fields; when is_native=1 [native interstitial], adsource_type applies; supports Header Bidding (S2S) | |||
| Splash | - | Supports Header Bidding (S2S) | |||
| Standard Native | - | Supports Header Bidding (S2S) | |||
| Banner | ad_size ad source size [normal banner] | ad_size: |
Appendix 3 Traffic Segmentation Rule Data Format
| Field | Type | Required | Description | Notes |
|---|---|---|---|---|
| rules | Array[Object] | Y | Traffic segmentation rule list | |
| rules.name | string | Y | Name | Network connection type device_contype App app_ver Device type device_type Device manufacturer device_mak Weekday week Time period time Age user_age Gender user_gender SDK sdk_ver OS version device_osv Phone RAM device_ram CPU architecture device_cpu In-game level user_level In-app purchase amount user_iap_amount In-app purchase currency user_iap_currency In-app purchase count user_iap_count Channel channel Sub-channel sub_channel Custom user ID user_id Device ID device_idfa IDFA authorization device_idfa_auth Segment Tag segment_tag App install time app_instimespan Custom user attributes user_custom |
| rules.type | string | Y | Type | int,float,version,complex |
| rules.op | string | Y | Operator | in,notIn,greater than,less than,greater than or equal to,less than or equal to,=,range |
| rules.data | string | Y | Content | Network connection type WiFi(2),5G(7),4G(6),3G(5),2G(4) Device type 1-Phone,2-Pad Device manufacturer Apple,Acer,Advan,Amazon,Asus,Blackshark,Coolpad,GIONEE,Google,Hisense,Honor,HTC,Huawei,Infinix,Lanix,LeEco,Lenovo,LGE,Meitu,Meizu,MetroPCS,Motorola,Nokia,Nubia,OnePlus,OPPO,Qcom,Realme,Redmi,Samsung,Sharp,Smartfren,Smartisan,Sony,TCL,Tecno,Verizon,Vivo,Xiaomi,ZTE,360 Weekday 1-7(code,) Gender male(male),female(female) In-app purchase currency USD,CNY,EUR IDFA authorization 1 authorized,2 unauthorized |
| timezoneOffset | string | Y | Time zone | Uses the selected time zone offset |