---
title: "List Google Ads asset performance"
method: GET
path: "/api/apps/{app_id}/google-ads/analytics/asset-performance"
---

# List Google Ads asset performance

`GET /api/apps/{app_id}/google-ads/analytics/asset-performance`

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Returns every serving creative asset in the account's Performance Max campaigns, with its status, any policy limits, and its traffic over the trailing 30 days.

The 30-day window is fixed and does not follow a date parameter.

Google attributes Performance Max metrics per served asset, so these numbers do not add up to the asset group's or campaign's totals. Use them to rank creatives against each other, not to reconcile spend.

Three kinds of row arrive in one list. Assets inside an asset group carry the full shape. Logos attach to the campaign instead, so they have no asset group, no policy topics and no metrics at all. A campaign Google has not echoed back yet contributes rows built from the creative Base44 sent at launch, with a `primary_status` of `GATHERING_DATA`, an empty `performance_label` and no metrics.

<Note>Performance Max campaigns only. An account without one returns an empty list.</Note>

<Note>This endpoint accepts a personal API key. Workspace API keys are not authorized for it and are rejected with a 403.</Note>

<Warning>The response includes fields beyond the ones documented here. Don't rely on undocumented response fields, as they can change at any time.</Warning>

## Path parameters

- `app_id` string, required — ID of the app whose Google Ads reporting you want to read.

## Response `200`

One entry per serving asset, grouped by its role.

- AssetPerformanceRow[]
  - `resource_name` string, required — Google Ads resource name for the asset's link to its asset group or campaign. Empty on rows Base44 synthesized from the campaign's saved creative.
  - `field_type` string, required — The role the asset plays, for example `HEADLINE`, `LONG_HEADLINE`, `DESCRIPTION`, `MARKETING_IMAGE`, `LOGO`, or `YOUTUBE_VIDEO`.
  - `text` string, required — The asset's text. Empty for images, logos and videos.
  - `asset_name` string, required — Google Ads' own name for the asset. Usually the only label an image, logo or video has.
  - `type` string, required — Google Ads asset type, for example `TEXT`, `IMAGE`, or `YOUTUBE_VIDEO`.
  - `image_url` string, required — Hosted URL for an image or logo asset. Empty for text and video assets.
  - `video_id` string, nullable — YouTube video ID for a `YOUTUBE_VIDEO` asset. Empty on other assets in an asset group, and absent entirely on logo rows and on rows Base44 synthesized from launch creative.
  - `campaign` string, required — Name of the campaign the asset serves in.
  - `asset_group_id` string, required — ID of the asset group the asset belongs to. Empty for logos, which attach to the campaign instead.
  - `asset_group_name` string, required — Name of that asset group. Empty for the same reason.
  - `ad_strength` string, required — Google Ads' strength rating for the asset group: `POOR`, `AVERAGE`, `GOOD`, `EXCELLENT`, or `PENDING`. Empty for logos.
  - `primary_status` string, required — Whether the asset can serve, for example `ELIGIBLE`, `LIMITED`, `DISAPPROVED`, or `PENDING_REVIEW`. `GATHERING_DATA` is Base44's own value, used on a row synthesized from launch creative that Google has not echoed back yet.
  - `primary_status_reasons` string[] — Why the asset is limited or disapproved. Empty when it serves normally.
  - `policy_topics` string[] — The Google Ads policy topics limiting the asset, without the generic status reasons `primary_status_reasons` also carries. Always empty for logos, which expose no policy detail, and absent on rows Base44 synthesized from launch creative.
  - `performance_label` string, required — Base44's own band for the asset, since Google publishes no per-asset rating for Performance Max: `LEARNING` while the campaign is still in its launch window, then `LOW`, `GOOD` or `EXCELLENT` from the asset's click-through rate against a threshold for its field type. `PENDING` and `DISAPPROVED` pass the serving status through instead. Empty when the asset cannot be rated, which is permanent for logos and for rows Base44 synthesized from launch creative.
  - `impressions` integer, nullable — Impressions over the trailing 30 days. `null` when Google reported no row for the asset in that window, and absent entirely on logos and on rows Base44 synthesized from saved creative.
  - `clicks` integer, nullable — Clicks over the same 30 days, with the same `null` and absent cases.
  - `cost_micros` integer, nullable — Spend over the same 30 days in micros, with the same `null` and absent cases.

## Other responses

- `401` — Missing or invalid credentials.
- `403` — You don't have access to this app, the app does not exist, or you used a workspace API key. A missing app and an app you cannot reach are deliberately the same answer.
- `404` — The app has no connected Google Ads account.

## Changes

- **2026-08-30** `394136a6cdd4` — 1 info
  - removed the non-success response with the status `422`
- **2026-08-26** `f2727732ced1` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/idealspot/apis/base44-app-management-api/changes/api/apps/:app_id/google-ads/analytics/asset-performance/get.md)

---

[API](https://skmtc.dev/idealspot/apis/base44-app-management-api.md) · [All operations](https://skmtc.dev/idealspot/apis/base44-app-management-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/idealspot/base44-app-management-api/revisions/394136a6cdd4/schema)
