Developer Dashboard Management API
Revision History
| Release Date | Revision Notes |
|---|---|
| 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 |
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
},
{
"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 | Note: iOS only. If provided, the app is considered released and released app information will be used automatically. In this case, app_name and package_name may be omitted. If provided, they will be overwritten. |
| 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 |
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 | |
| 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.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 |
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",
"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",
"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 |
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 |
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 | |
| 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 |
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_header_bidding | String | Whether Header Bidding is enabled | |
| 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",
"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 see fill rules below |
| placement_list.is_native | Int | N | Ad support type | 1 Native 0 Normal; Only for Banner, Splash, and Interstitial placements. For a Banner placement, add a banner ad with is_native=0; add a Native Banner ad with is_native=1. Splash/Interstitial follow the same rule. See Appendix 2 for different ad source parameter configurations.) |
| 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 only Meta and AdMob are supported |
| placement_list.auto_app_id | string | N | Top-level App ID for automated creation | Required for Meta automation only (is_auto_create=1); do not send for AdMob — use placement_config.appId |
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广告位配置参数不能为空.
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 |
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 |
| Rewarded Video | Sigmob (permission required) Tencent Ads Meta Vungle Mintegral Inmobi YSO Columbus Bigo Yandex Pangle Pangle Unity Ads |
| Interstitial | Sigmob (permission required) Tencent Ads Meta Vungle Mintegral Inmobi YSO Columbus Bigo Yandex Pangle Pangle Unity Ads |
| Banner | Tencent Ads Meta Vungle Mintegral Inmobi YSO Columbus Bigo Yandex Pangle Pangle Unity Ads |
| Standard Native | Tencent Ads Meta Vungle Mintegral Inmobi Columbus Bigo Yandex Pangle Pangle |
| Native Banner | Tencent Ads Meta Vungle Mintegral Inmobi Columbus Bigo Yandex Pangle Pangle |
| Draw feed | Tencent Ads |
| Native Splash | Tencent Ads Vungle Mintegral Inmobi Columbus Bigo Yandex Pangle Pangle |
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 | |||
| Native Banner | - | ||||
| 5 | Unity Ads | appId (App ID) placementId (Placement ID) | Rewarded Video | - | Supports Header Bidding |
| Interstitial | - | Supports Header Bidding | |||
| Splash | Not supported | ||||
| 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) 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 | |
| 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 | |||
| 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 | |
| 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) | ||||
| Banner | ad_size Ad source size | ad_size: 1: 320x50 2: 300x250 When is_native=1 [Native Banner], no ad_size style parameter | |||
| 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 | |
| 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 | ||||
| Standard Native | is_template_rendering Template type 1- 2-self-rendering | ||||
| Banner | ad_size Ad source size | 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 | |||
| Standard Native | - | ||||
| Banner | ad_size Ad source size | 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 | - |
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 |