Ad¶
An ad is the deliverable unit: one creative (video, playable or image) shown to the
audience of its ad set. Each Nova Play ad set contains 3 to 5 ads; an account has roughly
30 to 50 ads in total. Ads are the lowest level at which insights can be requested
(level=ad).
Naming convention¶
{FORMAT}_{CONCEPT}_v{VERSION}
| Part | Values | Meaning |
|---|---|---|
FORMAT |
VID, PLAY, IMG |
Creative format: video, playable, static image. |
CONCEPT |
Gameplay15s, Gameplay30s, Tutorial, BossFight, FailCompilation, Satisfying, Meme, StoryIntro, UpgradeLoop, Challenge |
Creative concept. |
VERSION |
1..9 |
Iteration number. |
Example: PLAY_Satisfying_v4. The name prefix is the only place where playable ads
are distinguishable from video ads: both have creative.object_type = "VIDEO". Playables
additionally carry creative.asset_feed_spec.playable_asset_id.
Fields¶
| Field | Type | Description |
|---|---|---|
id |
string | Ad id (17 digits). Always returned. |
name |
string | See naming convention. |
adset_id |
string | Parent ad set id. |
campaign_id |
string | Parent campaign id. |
account_id |
string | Numeric ad account id, without act_. |
status |
string | Configured status: ACTIVE or PAUSED. |
configured_status |
string | Same as status. |
effective_status |
string | ACTIVE, PAUSED, CAMPAIGN_PAUSED (parent campaign paused) or ARCHIVED (parent campaign ended). |
creative |
object | The ad creative, see below. Supports nested field selection. |
created_time |
datetime | When the ad started delivering, YYYY-MM-DDT08:00:00+0000. |
updated_time |
datetime | Last change; for paused ads, the day they were paused. |
tracking_specs |
array | [{ "action.type": ["mobile_app_install"], "application": ["<application_id>"] }]. |
Default fields when fields is omitted: id,name.
creative¶
Full object (returned by fields=creative):
{
"id": "12023710517544387",
"name": "VID_UpgradeLoop_v2 creative",
"object_type": "VIDEO",
"call_to_action_type": "INSTALL_MOBILE_APP",
"asset_feed_spec": {
"ad_formats": ["SINGLE_VIDEO"]
}
}
| Key | Description |
|---|---|
id |
Creative id. Different from the ad id; one creative per ad in this sandbox. |
name |
Ad name followed by creative. |
object_type |
VIDEO for video and playable ads, PHOTO for image ads. |
call_to_action_type |
Always INSTALL_MOBILE_APP. |
asset_feed_spec |
{ "ad_formats": ["SINGLE_VIDEO"] } or ["SINGLE_IMAGE"]; playables add "playable_asset_id". |
Nested field selection¶
Ask for a subset of the creative with braces. id is always included in the nested
object.
fields=id,name,creative{id,name,object_type}
Edges¶
| Edge | Description |
|---|---|
/<ad_id>/insights |
Performance for this ad. Default level=ad. |
List ads of an account: GET /act_<account_id>/ads¶
Returns every ad in the account, across all campaigns and ad sets. With the default
limit of 25 you will need more than one page; set limit=500 to get them in one call.
| Parameter | Type | Required | Description |
|---|---|---|---|
access_token |
string | yes | Personal token (or Authorization: Bearer). |
fields |
string | no | Comma-separated list of ad fields; creative{...} may be nested. Default id,name. |
limit |
int | no | Page size, default 25, maximum 500. |
after |
string | no | Cursor from a previous page. See Paging. |
curl -G "https://graph.huydata.com/v21.0/act_199454714457591/ads" \
-d "access_token=$META_ACCESS_TOKEN" \
-d "fields=id,name,adset_id,campaign_id,status,effective_status,creative{id,name,object_type}" \
-d "limit=3"
{
"data": [
{
"id": "12024133208777808",
"name": "VID_UpgradeLoop_v2",
"adset_id": "12029269518058219",
"campaign_id": "12020064400866904",
"status": "ACTIVE",
"effective_status": "ACTIVE",
"creative": {
"id": "12023710517544387",
"name": "VID_UpgradeLoop_v2 creative",
"object_type": "VIDEO"
}
},
{
"id": "12025889893776797",
"name": "VID_FailCompilation_v3",
"adset_id": "12029269518058219",
"campaign_id": "12020064400866904",
"status": "ACTIVE",
"effective_status": "ACTIVE",
"creative": {
"id": "12022243190086259",
"name": "VID_FailCompilation_v3 creative",
"object_type": "VIDEO"
}
},
{
"id": "12028175088840265",
"name": "VID_Challenge_v3",
"adset_id": "12029269518058219",
"campaign_id": "12020064400866904",
"status": "ACTIVE",
"effective_status": "ACTIVE",
"creative": {
"id": "12029144502147881",
"name": "VID_Challenge_v3 creative",
"object_type": "VIDEO"
}
}
],
"paging": {
"cursors": {
"before": "b2Zmc2V0OjA",
"after": "b2Zmc2V0OjM"
},
"next": "https://graph.huydata.com/v21.0/act_199454714457591/ads?fields=id%2Cname%2Cadset_id%2Ccampaign_id%2Cstatus%2Ceffective_status%2Ccreative%7Bid%2Cname%2Cobject_type%7D&limit=3&access_token=...&after=b2Zmc2V0OjM"
}
}
List ads of an ad set or campaign: GET /<adset_id>/ads, GET /<campaign_id>/ads¶
Same parameters and response shape, restricted to the parent. Calling /ads on an ad id
returns error 100 (Tried accessing nonexisting field (ads) on node type (Ad)).
curl -G "https://graph.huydata.com/v21.0/12029269518058219/ads" \
-d "access_token=$META_ACCESS_TOKEN" \
-d "fields=id,name,status,effective_status,created_time,updated_time"
{
"data": [
{
"id": "12024133208777808",
"name": "VID_UpgradeLoop_v2",
"status": "ACTIVE",
"effective_status": "ACTIVE",
"created_time": "2026-04-18T08:00:00+0000",
"updated_time": "2026-04-18T08:00:00+0000"
},
{
"id": "12026127595876205",
"name": "VID_Tutorial_v1",
"status": "PAUSED",
"effective_status": "PAUSED",
"created_time": "2026-05-26T08:00:00+0000",
"updated_time": "2026-07-03T08:00:00+0000"
},
{
"id": "12026126969631519",
"name": "PLAY_Satisfying_v4",
"status": "PAUSED",
"effective_status": "PAUSED",
"created_time": "2026-05-05T08:00:00+0000",
"updated_time": "2026-06-12T08:00:00+0000"
},
"..."
],
"paging": {
"cursors": {
"before": "b2Zmc2V0OjA",
"after": "b2Zmc2V0OjU"
}
}
}
A paused ad delivers through its updated_time day and produces no insights rows after
that, but it keeps appearing in listings. Keep them: historical insights rows still reference their ids.
Read one ad: GET /<ad_id>¶
| Parameter | Type | Required | Description |
|---|---|---|---|
access_token |
string | yes | Personal token. |
fields |
string | no | Comma-separated list of ad fields. Default id,name. |
curl -G "https://graph.huydata.com/v21.0/12024133208777808" \
-d "access_token=$META_ACCESS_TOKEN" \
-d "fields=id,name,adset_id,campaign_id,account_id,status,effective_status,creative,created_time,tracking_specs"
{
"id": "12024133208777808",
"name": "VID_UpgradeLoop_v2",
"adset_id": "12029269518058219",
"campaign_id": "12020064400866904",
"account_id": "199454714457591",
"status": "ACTIVE",
"effective_status": "ACTIVE",
"creative": {
"id": "12023710517544387",
"name": "VID_UpgradeLoop_v2 creative",
"object_type": "VIDEO",
"call_to_action_type": "INSTALL_MOBILE_APP",
"asset_feed_spec": {
"ad_formats": ["SINGLE_VIDEO"]
}
},
"created_time": "2026-04-18T08:00:00+0000",
"tracking_specs": [
{
"action.type": ["mobile_app_install"],
"application": ["5040209235711335"]
}
]
}
With a nested selection:
curl -G "https://graph.huydata.com/v21.0/12024133208777808" \
-d "access_token=$META_ACCESS_TOKEN" \
-d "fields=id,name,creative{id,name,object_type,call_to_action_type}"
{
"id": "12024133208777808",
"name": "VID_UpgradeLoop_v2",
"creative": {
"id": "12023710517544387",
"name": "VID_UpgradeLoop_v2 creative",
"object_type": "VIDEO",
"call_to_action_type": "INSTALL_MOBILE_APP"
}
}