Developer Dashboard Management API
Revision History
| Release Date | Revision Notes |
|---|---|
| 2026-05-25 | §7.3.1 documents AdMob appId / auto_app_id for manual vs automated × Android/iOS; Appendix 2 AdMob aligned. |
| 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; AdMob appId rules in §7.3.1 |
| 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; do not send for AdMob; see AdMob rules in §7.3.1 |
7.3.1 AdMob: placement_config.appId and auto_app_id (adsource_id=2)
appId must be copied from the AdMob console; for manual creation, placementId must also be copied from AdMob. OpenAPI does not generate appId. Unrelated to OAuth authorization.
Operating system is taken from the app that owns the ad seat (os: 1 = Android, 2 = iOS; see list_apps). For AdMob, OpenAPI applies the same rules on Android and iOS (may differ from TradPlus Web UI for some networks on iOS — OpenAPI behavior prevails).
| Creation mode | OS | auto_app_id | placement_config.appId | placement_config.placementId |
|---|---|---|---|---|
Manual is_auto_create=0 | Android | Do not send | Required — Apps → App settings → App ID | Required — ad unit ID (e.g. ca-app-pub-xxx/yyy) |
Manual is_auto_create=0 | iOS | Do not send | Required (same as Android) | Required (same as Android) |
Automated is_auto_create=1 | Android | Do not send | Required (app must already exist in AdMob) | May be ""; system creates ad unit and backfills |
Automated is_auto_create=1 | iOS | Do not send | Required (same as Android) | May be "" (same as Android) |
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) Manual/automated × Android/iOS requirements: §7.3.1 (same rules on Android and iOS). | 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 |