Advertiser API
The advertiser endpoints are prefixed with /api/advertiser. Except for login / register / password reset, all require the advertiser JWT in the request header: Authorization: Bearer <token>.
For the response envelope, pagination, and error-code conventions, see Overview & Authentication.
Authentication
Login
POST /api/advertiser/auth/login
| Param | Type | Required | Description |
|---|---|---|---|
username | string | Yes | Username; login by registered email is also supported |
password | string | Yes | Login password |
curl -X POST https://api.adbnk.co/api/advertiser/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"demo","password":"secret123"}'{
"code": 0,
"message": "Login successful",
"data": {
"token": "eyJ0eXAiOiJKV1Qi....",
"token_type": "Bearer",
"expires_in": 86400,
"user": {
"id": 12,
"username": "demo",
"nickname": "Demo",
"email": "[email protected]",
"advertisement_id": 8,
"role": "ADMIN"
}
},
"timestamp": 1752200000
}Register
POST /api/advertiser/auth/register
Uses progressive KYC; the minimum required fields are just email + password. A successful registration returns a usable token directly.
| Param | Type | Required | Description |
|---|---|---|---|
email | string | Yes | Valid email, globally unique |
password | string | Yes | Password, at least 8 characters |
username | string | No | Auto-derived if omitted (3-30 alphanumeric/underscore) |
mobile | string | No | Mobile number |
company_name | string | No | Company name |
contact_name | string | No | Contact person |
industry | string | No | Industry name |
Other auth endpoints
| Method | Path | Description |
|---|---|---|
POST | /auth/forgot-password | Send reset email, param email; one per 60s per email |
POST | /auth/reset-password | Params token, new_password, confirm_password |
POST | /auth/logout | Log out (frontend just discards the token) |
GET | /auth/profile | Get the current advertiser's info |
POST | /auth/password | Change password, params old_password, new_password, confirm_password |
Campaigns
List
GET /api/advertiser/campaigns
| Param | Type | Required | Description |
|---|---|---|---|
page / page_size | int | No | Pagination |
keyword | string | No | Fuzzy search by name |
status | string | No | Status filter |
pricing_model | string | No | Pricing model filter |
start_date / end_date | date | No | Creation time range |
Create
POST /api/advertiser/campaigns
Precondition
Creating a campaign enters the review flow and requires account profile completeness at basic, otherwise it returns 412.
| Param | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Campaign name |
ad_type | string | Yes* | Ad type (BANNER/NATIVE/VIDEO/POPUP/REWARDED/RESPONSIVE, etc.). Can be derived from campaign_option_id |
campaign_option_id | int | No | Ad-format option ID; can replace ad_type |
price / bid | number | Yes | Bid; bid falls back to price, cannot be negative |
pricing_model | string | No | Pricing model, default CPC; options CPM/CPA/CPS |
type | string | No | Campaign type, default PERFORMANCE |
objective | string | No | Objective, default TRAFFIC |
daily_budget | number | No | Daily budget, cannot be negative |
total_budget | number | No | Total budget, cannot be negative |
start_date / end_date | date | No | Serving start/end; empty means unlimited |
landing_url | string | No | Landing page URL |
tracker_id | int | No | Conversion tracker ID; required for CPA/CPS billing |
rotation_mode | string | No | Rotation mode, default EVEN |
target_countries | array | No | Target countries/regions |
target_devices | array | No | Target devices |
target_os | array | No | Target OS |
target_browsers | array | No | Target browsers |
target_hours / weekdays | array | No | Daypart / weekday targeting |
curl -X POST https://api.adbnk.co/api/advertiser/campaigns \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "Summer Sale",
"ad_type": "BANNER",
"pricing_model": "CPC",
"bid": 0.35,
"daily_budget": 200,
"landing_url": "https://shop.example.com"
}'Other campaign operations
| Method | Path | Description |
|---|---|---|
GET | /campaigns/{id} | Details |
PUT | /campaigns/{id} | Update |
DELETE | /campaigns/{id} | Delete |
POST | /campaigns/{id}/toggle | Enable/pause |
POST | /campaigns/{id}/copy | Copy |
POST | /campaigns/{id}/submit-audit | Submit for review |
POST | /campaigns/batch-submit-audit | Batch submit for review |
GET | /campaigns/{id}/stats | Campaign stats |
Ads and ad groups
Ad groups /api/advertiser/adgroups and ads /api/advertiser/ads both provide standard CRUD (index / show / store / update / destroy) plus toggle, stats, submit-audit, and similar operations, structured the same as campaigns.
Creatives and media
Creative list
GET /api/advertiser/creatives
| Param | Type | Required | Description |
|---|---|---|---|
keyword | string | No | Name search |
type | string | No | Creative type |
status | string | No | Status |
audit_status | string | No | Review status |
Create creative
POST /api/advertiser/creatives
| Param | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Creative name |
creative_type | string | No | Creative subtype, default image (must be in the allowed set) |
type | string | No | Display type, default IMAGE |
size_id / width / height | int | No | Size |
image_media_id | int | No | Main image asset ID (recommended, from the media library) |
image_media_id_2 | int | No | Second image asset ID |
video_media_id | int | No | Video asset ID |
icon_media_id | int | No | Icon asset ID |
html_code | string | No | HTML ad code |
vast_xml / vast_url | string | No | VAST video ad |
click_url | string | No | Click URL |
Media referenced by media_id
When advertisers create/update creatives, the *_url fields don't accept external URLs; images/videos can only be referenced via the media library's *_media_id, from which the server resolves a usable URL.
Media library endpoints: GET /media, POST /media/upload, POST /media/ai-image, POST /media/ai-video, POST /media/ai-copy.
Upload helpers: POST /creatives/upload (image), POST /creatives/upload-video (video).
Reporting
All reports default to the last 7 days.
| Method | Path | Description |
|---|---|---|
GET | /statistics/report | Summary report |
GET | /statistics/campaigns | By campaign |
GET | /statistics/region | Geo report |
GET | /statistics/hourly | Hourly report |
GET | /statistics/device | Device report |
GET | /statistics/export | Export |
GET /api/advertiser/statistics/report params:
| Param | Type | Required | Description |
|---|---|---|---|
start_date | date | No | Start date, default 7 days ago |
end_date | date | No | End date, default today |
group_by | string | No | Group dimension, default date |
campaign_id | int | No | Specific campaign |
curl "https://api.adbnk.co/api/advertiser/statistics/region?start_date=2026-07-01&end_date=2026-07-10" \
-H "Authorization: Bearer <token>"Balance and top-up
| Method | Path | Description |
|---|---|---|
GET | /deposits/balance | Query account balance |
GET | /deposits | Top-up order list |
POST | /deposits | Initiate a top-up |
GET | /deposits/transactions | Fund transactions |
GET | /deposits/{id} | Top-up order details |
POST | /deposits/{id}/cancel | Cancel order |
Initiate a top-up
POST /api/advertiser/deposits
| Param | Type | Required | Description |
|---|---|---|---|
amount | number | Yes | Top-up amount, greater than 0 and not below the minimum |
payment_method | string | Yes | Payment method: BANK/USDT/ALIPAY/WECHAT/OFFLINE |
Precondition
Top-up requires account profile completeness at basic, otherwise it returns 412.
curl -X POST https://api.adbnk.co/api/advertiser/deposits \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"amount": 500, "payment_method": "USDT"}'Conversion trackers
For creating / managing conversion trackers, see Events & Conversion Reporting and the Conversion Tracking guide. Related endpoints live at /api/advertiser/trackers.
TIP
For more advertiser features (optimization rules, responsive ads, referral, notification binding, etc.), refer to the advertiser console.