---
title: "List Google Ads generated assets"
method: GET
path: "/api/apps/{app_id}/google-ads/assets"
---

# List Google Ads generated assets

`GET /api/apps/{app_id}/google-ads/assets`

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

Returns the ad creative Base44 has generated for the app.

Which field you get back depends on what you ask for, and you never get both `session` and `library`:

- Send `session_id` and you get `session`, the previews from that one generation. Use it to poll a generation you just started. Previews are transient, so an expired session reads as an empty list.
- Omit `session_id` and you get `library`, the app's generated assets newest first. This is the durable copy and the one to read when you want to pick something to use. It returns at most the 5,000 most recent, with no pagination and no marker when it truncates.
- Add `campaign_id` to either and you also get `durable`, read live from Google Ads, listing what is already attached to that campaign.

The two lists carry different fields, because they come from different stores. `library` rows add `status`, `accepted_campaign_id` and `accepted_resource_names`, which is how you tell what has already been pushed to Google.

A `session` list is empty rather than missing while a generation is in flight, so poll until assets appear rather than treating the first empty read as failure.

Sending `campaign_id` brings the campaign's own errors with it, because the campaign has to be resolved before Google can be read. Without `campaign_id` this endpoint only ever answers 200, 401 or 403.

<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 creative you want to generate or read.

## Query parameters

- `session_id` string, nullable — Return the previews from this generation session instead of the durable library, as returned in `session_id` by [Generate Google Ads assets](/api-reference/generate-google-ads-assets).
- `campaign_id` string, nullable — Also return what is already attached to this campaign in Google Ads, as returned in `id` by [List campaigns](/api-reference/list-google-ads-campaigns).

## Response `200`

The app's generated creative.

- GeneratedAssetsList — The app's generated Google Ads creative.
  - `session` GeneratedAssetSummary[], nullable — Assets in the generation session you asked for. Present only when you send `session_id`, and an empty list while the generation is still running or when it produced nothing.
    - `session_asset_id` string, required — ID of this asset within the session. Pass it as `session_asset_id` to [Accept a generated Google Ads asset](/api-reference/accept-a-generated-google-ads-asset).
    - `asset_field_type` string, required — Which slot on the ad this asset fills. Text assets are `HEADLINE`, `LONG_HEADLINE` or `DESCRIPTION`. Image assets are `MARKETING_IMAGE`, `SQUARE_MARKETING_IMAGE`, `PORTRAIT_MARKETING_IMAGE` or `TALL_PORTRAIT_MARKETING_IMAGE`.
    - `kind` string, required — Whether the asset is copy (`text`) or a picture (`image`).
    - `text` string, nullable, required — The generated copy, or `null` on an image asset.
    - `image_url` string, nullable, required — URL of the generated picture, or `null` on a text asset. It is a Base44 preview URL, not a Google one, and it stops resolving once the asset is cleaned up.
    - `source` string, required — Which engine wrote it. The value is `google` for Google's own asset generation and `inhouse` for the Base44 model that covers languages Google does not generate for, and that stands in when Google's call fails.
    - `language` string, nullable, required — Language of a text asset as a lowercase two-letter code, or `null` on an image, because image assets carry no copy.
    - `channel_type` string, required — Campaign type the asset was generated for, one of `SEARCH`, `PERFORMANCE_MAX`, `DISPLAY` or `DEMAND_GEN`.
    - `created_at` string, date-time, required — When the asset was generated.
  - `library` LibraryAssetSummary[], nullable — The app's generated assets, newest first, capped at the 5,000 most recent. Present only when you omit `session_id`. There is no pagination and nothing marks a truncated list, so an app past 5,000 assets silently stops seeing its oldest ones.
    - `id` string, required — Base44's ID for the library row.
    - `session_asset_id` string, required — ID the asset was generated under. Pass it as `session_asset_id` to [Accept a generated Google Ads asset](/api-reference/accept-a-generated-google-ads-asset), which works from the library long after the generation session has expired.
    - `session_id` string, required — The generation session the asset came from. Empty on a row written before Base44 recorded it.
    - `asset_field_type` string, required — Which slot on the ad this asset fills. Text assets are `HEADLINE`, `LONG_HEADLINE` or `DESCRIPTION`. Image assets are `MARKETING_IMAGE`, `SQUARE_MARKETING_IMAGE`, `PORTRAIT_MARKETING_IMAGE` or `TALL_PORTRAIT_MARKETING_IMAGE`.
    - `kind` string, required — Whether the asset is copy (`text`) or a picture (`image`).
    - `text` string, nullable, required — The generated copy, or `null` on an image asset.
    - `image_url` string, nullable, required — URL of the generated picture, or `null` on a text asset. Unlike the session copy this one is durable, which is what makes the library worth reading.
    - `source` string, required — Which engine wrote it. The value is `google` for Google's own asset generation and `inhouse` for the Base44 model that covers languages Google does not generate for, and that stands in when Google's call fails.
    - `language` string, nullable, required — Language of a text asset as a lowercase two-letter code, or `null` on an image, because image assets carry no copy.
    - `channel_type` string, required — Campaign type the asset was generated for, one of `SEARCH`, `PERFORMANCE_MAX`, `DISPLAY` or `DEMAND_GEN`.
    - `status` string, required — Whether the asset has been pushed to Google Ads. The value is `generated` until you accept it and `accepted` afterwards.
    - `accepted_campaign_id` string, required — The campaign the asset was accepted onto, as **Google Ads'** campaign ID rather than the Base44 `campaign_id` you sent to accept it. Match it against `google_campaign_id` from [List campaigns](/api-reference/list-google-ads-campaigns), not against `id`. Empty while `status` is `generated`.
    - `accepted_resource_names` string[], required — Google Ads resource names created when the asset was accepted. Empty while `status` is `generated`, and empty on an accept where Google returned no resource name.
    - `created_date` string, date-time, required — When the asset was generated.
    - `updated_date` string, date-time, required — When the row last changed, which is the accept time on an accepted asset.
  - `durable` DurableAssetRow[], nullable — Assets already attached to the campaign in Google Ads. Present only when you send `campaign_id`.
    - `resource_name` string, required — Google Ads resource name of the link between the asset and the asset group.
    - `field_type` string, nullable, required — Which slot the asset fills, as Google reports it, or `null` when Google returned no field type.
    - `primary_status` string, nullable, required — Google's serving status for the asset, such as `ELIGIBLE`, `LIMITED` or `PENDING`. The value is `null` when Google returned no status.

## 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, or there is no campaign with this ID on it. Only returned when you send `campaign_id`.
- `409` — The campaign has not reached Google Ads yet, so it has no asset groups to read or attach to. Sync it and retry. Only returned when you send `campaign_id`.
- `422` — The campaign is not a Performance Max campaign. Only Performance Max campaigns have the asset groups these endpoints work on. Only returned when you send `campaign_id`.

## Changes

- **2026-09-01** `d8572ad3094a` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/idealspot/apis/base44-app-management-api/changes/api/apps/:app_id/google-ads/assets/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/56dc45634956/schema)
