Accounts¶
Nova Play's Google Ads presence is organised as one manager account with ten
client customer accounts, one per game. All reporting queries are run against a
client customer; the manager account only appears in the login-customer-id header.
Manager account 9990001111 (Nova Play)
├── customer 5423891542 Dragon Merge Saga (Android)
│ ├── campaign DMS_GG_AND_SEA_VALUE_202512
│ │ ├── ad group SEA_Broad_ID-PH-VN
│ │ │ ├── ad VID_BossFight_v2
│ │ │ └── ad …
│ │ └── ad group …
│ └── campaign …
├── customer 8340496580 Idle Mining Empire (Android)
└── … (10 customers in total)
Discovering your customers¶
GET /v18/customers:listAccessibleCustomers returns the resource names of every
customer your credentials may query. Always start from this call rather than hard-coding ids.
curl -s "https://googleads.huydata.com/v18/customers:listAccessibleCustomers" \
-H "Authorization: Bearer $GOOGLE_ACCESS_TOKEN" \
-H "developer-token: $GOOGLE_DEVELOPER_TOKEN" \
-H "login-customer-id: 9990001111"
{
"resourceNames": [
"customers/5423891542",
"customers/8340496580",
"customers/2375371730",
"customers/1163385796",
"customers/3250885192",
"customers/6919164314",
"customers/2405781364",
"customers/8230886562",
"customers/2325394968",
"customers/9516973558"
]
}
| Response field | Type | Description |
|---|---|---|
resourceNames[] |
string |
Resource names of the form customers/{customerId}. The id is the 10-digit number after the slash. |
The manager account itself is not listed and cannot be queried. Querying any
customer id that is not in this list returns HTTP 403 with
authorizationError: USER_PERMISSION_DENIED (see Authentication).
The ten game accounts¶
Each customer corresponds to exactly one game and one app store. The customer
resource gives you the descriptive name; the campaign resource gives you the store
app id (campaign.app_campaign_setting.app_id).
| Customer id | customer.descriptive_name |
Game code | OS | app_campaign_setting.app_id |
app_campaign_setting.app_store |
|---|---|---|---|---|---|
5423891542 |
Dragon Merge Saga (Android) | DMS |
Android | com.novaplay.dragonmerge |
GOOGLE_APP_STORE |
8340496580 |
Idle Mining Empire (Android) | IME |
Android | com.novaplay.idlemining |
GOOGLE_APP_STORE |
2375371730 |
Zombie Siege Defense (Android) | ZSD |
Android | com.novaplay.zombiesiege |
GOOGLE_APP_STORE |
1163385796 |
Puzzle Blast Mania (iOS) | PBM |
iOS | id1600000011 |
APPLE_APP_STORE |
3250885192 |
Castle Match Legends (iOS) | CML |
iOS | id1600000012 |
APPLE_APP_STORE |
6919164314 |
Car Park Master 3D (Android) | CPM |
Android | com.novaplay.carpark3d |
GOOGLE_APP_STORE |
2405781364 |
Sushi Shop Tycoon (iOS) | SST |
iOS | id1600000013 |
APPLE_APP_STORE |
8230886562 |
Hero Tower Defense (Android) | HTD |
Android | com.novaplay.herotd |
GOOGLE_APP_STORE |
2325394968 |
Word Garden Story (iOS) | WGS |
iOS | id1600000014 |
APPLE_APP_STORE |
9516973558 |
Pixel Survivors (Android) | PSV |
Android | com.novaplay.pixelsurvivors |
GOOGLE_APP_STORE |
The ids above are the ones returned by the sandbox at the time of writing. Treat
customers:listAccessibleCustomersas the source of truth.
All accounts share these settings:
| Field | Value |
|---|---|
customer.currency_code |
USD |
customer.time_zone |
Etc/UTC |
customer.manager |
false |
customer.status |
ENABLED |
Example — reading the customer resource:
curl -s -X POST "https://googleads.huydata.com/v18/customers/5423891542/googleAds:searchStream" \
-H "Authorization: Bearer $GOOGLE_ACCESS_TOKEN" \
-H "developer-token: $GOOGLE_DEVELOPER_TOKEN" \
-H "login-customer-id: 9990001111" \
-H "Content-Type: application/json" \
-d '{"query": "SELECT customer.id, customer.descriptive_name, customer.currency_code, customer.time_zone, customer.manager, customer.status FROM customer"}'
[
{
"results": [
{
"customer": {
"id": "5423891542",
"descriptiveName": "Dragon Merge Saga (Android)",
"currencyCode": "USD",
"timeZone": "Etc/UTC",
"manager": false,
"status": "ENABLED"
}
}
],
"fieldMask": "customer.id,customer.descriptiveName,customer.currencyCode,customer.timeZone,customer.manager,customer.status",
"requestId": "65c48971f61b46d88d85"
}
]
Account hierarchy¶
| Level | GAQL resource | Typical count per customer | Notes |
|---|---|---|---|
| Customer | customer |
1 | One per game |
| Campaign | campaign |
2 – 4 | Video action campaigns (advertising_channel_type = VIDEO, advertising_channel_sub_type = VIDEO_ACTION) |
| Ad group | ad_group |
2 – 3 per campaign | Each ad group targets an audience in a subset of the campaign's countries |
| Ad | ad_group_ad |
3 – 5 per ad group | One creative each (video, playable or image) |
Across the 10 customers there are about 30 campaigns, 70 ad groups and 280 ads.
Every entity has a numeric id returned as a string, and a resource_name:
| Resource | resource_name pattern |
Example |
|---|---|---|
customer |
customers/{customerId} |
customers/5423891542 |
campaign |
customers/{customerId}/campaigns/{campaignId} |
customers/5423891542/campaigns/22245080429 |
campaign_budget |
customers/{customerId}/campaignBudgets/{budgetId} |
customers/5423891542/campaignBudgets/32245080429 |
ad_group |
customers/{customerId}/adGroups/{adGroupId} |
customers/5423891542/adGroups/22395831285 |
ad_group_ad |
customers/{customerId}/adGroupAds/{adGroupId}~{adId} |
customers/5423891542/adGroupAds/22395831285~20923328157 |
ad (inside ad_group_ad.ad) |
customers/{customerId}/ads/{adId} |
customers/5423891542/ads/20923328157 |
geo_target_constant |
geoTargetConstants/{criterionId} |
geoTargetConstants/2840 |
Naming conventions¶
Nova Play names its entities so that the key dimensions can be parsed from the name.
Campaign names¶
{GAME}_{PLATFORM}_{OS}_{GEO}_{OBJECTIVE}_{YYYYMM}
| Token | Values | Meaning |
|---|---|---|
GAME |
DMS, IME, ZSD, PBM, CML, CPM, SST, HTD, WGS, PSV |
Three-letter game code (see the account table above) |
PLATFORM |
GG |
Ad platform — always GG (Google) in this API |
OS |
AND, IOS |
Operating system of the promoted app |
GEO |
T1, SEA, LATAM, EA |
Country group the campaign targets (see Geo targets) |
OBJECTIVE |
INSTALL, VALUE |
INSTALL optimises for installs (bidding_strategy_type = TARGET_CPA); VALUE optimises for purchase value (MAXIMIZE_CONVERSION_VALUE) |
YYYYMM |
e.g. 202512 |
Year and month the campaign started |
Examples: DMS_GG_AND_SEA_VALUE_202512, DMS_GG_AND_EA_INSTALL_202610. If two campaigns
in the same account would get the same name, the second one carries a _B suffix.
Ad group names¶
{GEO}_{AUDIENCE}_{COUNTRY-COUNTRY-…}
AUDIENCE is one of Broad, Lookalike_Payers, Interest_Gaming; the trailing part
lists the ISO country codes the ad group targets, sorted and joined with -.
Example: SEA_Lookalike_Payers_ID-PH-TH-VN.
Ad names¶
{FORMAT}_{CONCEPT}_v{N}
FORMAT is VID (video), PLAY (playable) or IMG (image); CONCEPT is the
creative concept (Gameplay15s, Gameplay30s, Tutorial, BossFight,
FailCompilation, Satisfying, Meme, StoryIntro, UpgradeLoop, Challenge);
N is the version. Example: VID_BossFight_v2.
Campaign status and lifecycle¶
| Field | Values | Meaning |
|---|---|---|
campaign.status |
ENABLED, PAUSED |
The advertiser's setting. A campaign that has reached its end date keeps ENABLED. |
campaign.serving_status |
SERVING, ENDED |
ENDED once campaign.end_date is in the past. |
campaign.start_date |
YYYY-MM-DD |
First day the campaign could serve. |
campaign.end_date |
YYYY-MM-DD |
2037-12-30 means "no end date" (the Google Ads convention). |
Paused or ended campaigns, ad groups and ads still appear when you query attributes only. They disappear from metric queries for the dates they did not serve, because rows with zero activity are omitted (see Reporting).