Skip to content
AdCrunch
Esc
↑↓navigate↵open⌘Jpreview

Stored read: List asset groups

Available on: Google Ads

Lists the asset groups of every ad account your organization connects, newest first.

An asset group is Performance Max’s delivery container. A Performance Max campaign has no ad groups and no ads: the asset group holds the headlines, images, videos and audience signals that Google’s automation assembles into placements itself.

Every other provider lists nothing here, and that is normal rather than a failure.

A sibling, not a child

An asset group is a child of a campaign and a sibling of an ad group — not a layer beneath one. That is why it takes campaignId and never adGroupId, and why a Performance Max campaign answers nothing under /observe/ad-groups or /observe/ads.

GET/observe/asset-groups
Authorization
AuthorizationBearer token · headerrequired

Send Authorization: Bearer <credential>.

Use an API key (acr_…), from the AdCrunch console under Settings → API keys.

The credential names the organization, and no operation takes an organization parameter.

See https://docs.adcrunch.dev/api/authentication.

Query parameters
idsstring
cursorstring
min length 1
limitinteger
min 1 · max 500 · default: 100
advertiserIdstring
matches ^(acc_)[\s\S]{0,}$
providerstring
statusstring
Allowed:ACTIVEPAUSEDDELETEDARCHIVED
campaignIdstring
matches ^\d+$
Responses
200

The matching asset groups, and how many there are in all. Only Google Ads advertisers answer rows.

dataobject[]required

The matching rows. From the store, the row AdCrunch stored last comes first; from the provider, the provider’s own order. An empty array means nothing matched, which is a normal answer and not a failure.

Show properties
Array of object
advertiserIdstringrequired

The advertiser that owns it, prefixed acc_.

createdAtnumber | nullrequired

When AdCrunch first stored this row. Null when the row was read live: AdCrunch holds no copy of it. createdAt, updatedAt and deletedAt are AdCrunch’s own times, so all three are null together on a live row.

createdTimenumber | nullrequired

When the provider created the entity. This is the provider’s own time, so a live row carries it. Null where the provider reports none.

currencystring | nullrequired

The account currency, ISO 4217. Every row of one advertiser carries the same one. Null when AdCrunch does not know it yet.

deletedAtnumber | nullrequired

When AdCrunch marked the row deleted. A listing never carries a deleted row, so this is null.

idstringrequired

The id the provider gives, with no prefix. It is unique for one provider and one type, and it may legitimately recur across two types or two providers.

namestringrequired

The name at the provider.

pathstringrequired

The ancestors and this entity, ids joined by /, oldest first. This is what makes a subtree one string comparison.

providerstringrequired

The ad platform: meta, tiktok or gads. Those three are the providers whose entities AdCrunch reads, and https://docs.adcrunch.dev/connect/providers says how deep each one goes.

statusstringrequired

The status, normalized across the providers. TikTok ENABLE and DISABLE read here as ACTIVE and PAUSED.

Allowed:ACTIVEPAUSEDDELETEDARCHIVED
updatedAtnumber | nullrequired

When AdCrunch last rewrote this row. Null if it never changed.

updatedTimenumber | nullrequired

When the provider last edited the entity. Null where the provider reports none.

budgetLevelstring | nullrequired

Where the budget of this entity’s campaign lives. campaign when the campaign carries it — Meta Advantage campaign budget, TikTok Campaign Budget Optimization, and every Google Ads campaign. ad_group when each ad group carries its own. Null on a TikTok campaign whose payload does not say.

Allowed:campaignad_group
campaignIdstring | nullrequired

The campaign it belongs to, as the bare id its provider gives. Null only when the stored path of the row names no campaign.

typestringrequired

The type the provider uses, kept as the provider writes it: asset_group. Only Google Ads has an asset group. The resource names the concept, and the row keeps the provider’s own word, because a Meta adset and a Google Ads ad_group are not the same object.

nextCursorstring

Send this value as cursor to get the next page. It is absent on the last page.

400

The request does not match the schema of this operation: a field is missing or has the wrong type, or the body is not valid JSON. error is invalid_request, and issues names each field. Nothing was changed. Or AdCrunch cannot use the cursor: it cannot read it, or the cursor belongs to a different query. Then error is invalid_cursor. Send the nextCursor of the previous page with no change, or omit cursor to get the first page.

Any of:
object
issuesobject[]required

One entry for each field that does not match.

Show properties
Array of object
instringrequired

The part of the request that holds the field.

Allowed:bodycookieheadersparamsquery
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

pathstringrequired

A JSON Pointer into that part of the request, such as /filename. An empty string is the whole part.

errorstringrequired

A stable code for the failure. This is the field to branch on. It does not change for a given failure.

Allowed:invalid_request
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

object
errorstringrequired

A stable code for the failure. This is the field to branch on. It does not change for a given failure.

Allowed:invalid_cursor
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

401

No API key, or one that does not resolve. See the security scheme. error is unauthorized.

errorstringrequired

A stable code for the failure. This is the field to branch on. It does not change for a given failure.

Allowed:unauthorized
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

403

The caller does not hold observe:read. error is forbidden.

errorstringrequired

A stable code for the failure. This is the field to branch on. It does not change for a given failure.

Allowed:forbidden
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

Request
curl -X GET 'https://api.pr-775.adcrunch.dev/observe/asset-groups' \
  -H 'Authorization: Bearer YOUR_TOKEN'
Response
{
  "data": [
    {
      "advertiserId": "acc_4829301756",
      "budgetLevel": "campaign",
      "campaignId": "20993874561",
      "createdAt": 1789610000000,
      "createdTime": null,
      "currency": "EUR",
      "deletedAt": null,
      "id": "6390218745",
      "name": "Performance Max — winter",
      "path": "20993874561/6390218745",
      "provider": "gads",
      "status": "ACTIVE",
      "type": "asset_group",
      "updatedAt": null,
      "updatedTime": null
    }
  ],
  "nextCursor": "eyJwIjpbMTc4OTYxMDAwMDAwMCwiZ2FkcyIsImFzc2V0X2dyb3VwIiwiNjM5MDIxODc0NSJdLCJxIjoiMmdtajdydHJyam8ifQ"
}