> ## Documentation Index
> Fetch the complete documentation index at: https://docs.base44.com/llms.txt
> Use this file to discover all available pages before exploring further.

# List Google Ads generated 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>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json get /api/apps/{app_id}/google-ads/assets
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - ApiKeyAuth: []
paths:
  /api/apps/{app_id}/google-ads/assets:
    get:
      summary: List Google Ads generated assets
      description: >-
        <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>
      operationId: list_generated_assets_api_apps__app_id__google_ads_assets_get
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: >-
              ID of the app whose Google Ads creative you want to generate or
              read.
            title: App Id
          description: >-
            ID of the app whose Google Ads creative you want to generate or
            read.
          example: 6820f3a4e7b91d003c45a1f2
        - name: session_id
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              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).
            title: Session Id
          description: >-
            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).
          example: 9c1d2e3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f
        - name: campaign_id
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              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).
            title: Campaign Id
          description: >-
            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).
          example: 68b1c0d4e7b91d003c45a1f2
      responses:
        '200':
          description: The app's generated creative.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneratedAssetsList'
        '401':
          description: Missing or invalid credentials.
        '403':
          description: >-
            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':
          description: >-
            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':
          description: >-
            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':
          description: >-
            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`.
components:
  schemas:
    GeneratedAssetsList:
      properties:
        session:
          anyOf:
            - items:
                $ref: '#/components/schemas/GeneratedAssetSummary'
              type: array
            - type: 'null'
          title: Session
          description: >-
            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.
          example: []
        library:
          anyOf:
            - items:
                $ref: '#/components/schemas/LibraryAssetSummary'
              type: array
            - type: 'null'
          title: Library
          description: >-
            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.
          example: []
        durable:
          anyOf:
            - items:
                $ref: '#/components/schemas/DurableAssetRow'
              type: array
            - type: 'null'
          title: Durable
          description: >-
            Assets already attached to the campaign in Google Ads. Present only
            when you send `campaign_id`.
          example: []
      type: object
      title: GeneratedAssetsList
      description: The app's generated Google Ads creative.
    GeneratedAssetSummary:
      properties:
        session_asset_id:
          type: string
          title: Session Asset Id
          description: >-
            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).
          example: b7f3a1c8-52d4-4a0e-9b31-2c6f0d8e4a19
        asset_field_type:
          type: string
          title: Asset Field Type
          description: >-
            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`.
          example: HEADLINE
        kind:
          type: string
          title: Kind
          description: Whether the asset is copy (`text`) or a picture (`image`).
          example: text
        text:
          anyOf:
            - type: string
            - type: 'null'
          title: Text
          description: The generated copy, or `null` on an image asset.
          example: Handmade oak furniture, built to last
        image_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Image Url
          description: >-
            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.
          example: https://storage.base44.com/gads-assets/b7f3a1c8-square.png
        source:
          type: string
          title: Source
          description: >-
            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.
          example: google
        language:
          anyOf:
            - type: string
            - type: 'null'
          title: Language
          description: >-
            Language of a text asset as a lowercase two-letter code, or `null`
            on an image, because image assets carry no copy.
          example: de
        channel_type:
          type: string
          title: Channel Type
          description: >-
            Campaign type the asset was generated for, one of `SEARCH`,
            `PERFORMANCE_MAX`, `DISPLAY` or `DEMAND_GEN`.
          example: PERFORMANCE_MAX
        created_at:
          type: string
          format: date-time
          title: Created At
          description: When the asset was generated.
          example: '2026-08-25T14:05:00Z'
      type: object
      required:
        - session_asset_id
        - asset_field_type
        - kind
        - text
        - image_url
        - source
        - language
        - channel_type
        - created_at
      title: GeneratedAssetSummary
      description: One generated asset in a live generation session.
    LibraryAssetSummary:
      properties:
        id:
          type: string
          title: Id
          description: Base44's ID for the library row.
          example: 68b1c0d4e7b91d003c45a1fb
        session_asset_id:
          type: string
          title: Session Asset Id
          description: >-
            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.
          example: b7f3a1c8-52d4-4a0e-9b31-2c6f0d8e4a19
        session_id:
          type: string
          title: Session Id
          description: >-
            The generation session the asset came from. Empty on a row written
            before Base44 recorded it.
          example: 9c1d2e3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f
        asset_field_type:
          type: string
          title: Asset Field Type
          description: >-
            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`.
          example: SQUARE_MARKETING_IMAGE
        kind:
          type: string
          title: Kind
          description: Whether the asset is copy (`text`) or a picture (`image`).
          example: image
        text:
          anyOf:
            - type: string
            - type: 'null'
          title: Text
          description: The generated copy, or `null` on an image asset.
          example: Handmade oak furniture, built to last
        image_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Image Url
          description: >-
            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.
          example: https://storage.base44.com/gads-assets/b7f3a1c8-square.png
        source:
          type: string
          title: Source
          description: >-
            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.
          example: inhouse
        language:
          anyOf:
            - type: string
            - type: 'null'
          title: Language
          description: >-
            Language of a text asset as a lowercase two-letter code, or `null`
            on an image, because image assets carry no copy.
          example: de
        channel_type:
          type: string
          title: Channel Type
          description: >-
            Campaign type the asset was generated for, one of `SEARCH`,
            `PERFORMANCE_MAX`, `DISPLAY` or `DEMAND_GEN`.
          example: PERFORMANCE_MAX
        status:
          type: string
          title: Status
          description: >-
            Whether the asset has been pushed to Google Ads. The value is
            `generated` until you accept it and `accepted` afterwards.
          example: generated
        accepted_campaign_id:
          type: string
          title: Accepted Campaign Id
          description: >-
            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`.
          example: '21458812345'
        accepted_resource_names:
          items:
            type: string
          type: array
          title: Accepted Resource Names
          description: >-
            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.
          example:
            - customers/1234567890/assets/98765432
        created_date:
          type: string
          format: date-time
          title: Created Date
          description: When the asset was generated.
          example: '2026-08-25T14:05:00Z'
        updated_date:
          type: string
          format: date-time
          title: Updated Date
          description: >-
            When the row last changed, which is the accept time on an accepted
            asset.
          example: '2026-08-26T09:15:00Z'
      type: object
      required:
        - id
        - session_asset_id
        - session_id
        - asset_field_type
        - kind
        - text
        - image_url
        - source
        - language
        - channel_type
        - status
        - accepted_campaign_id
        - accepted_resource_names
        - created_date
        - updated_date
      title: LibraryAssetSummary
      description: One generated asset in the app's durable library.
    DurableAssetRow:
      properties:
        resource_name:
          type: string
          title: Resource Name
          description: >-
            Google Ads resource name of the link between the asset and the asset
            group.
          example: customers/1234567890/assetGroupAssets/1122334455~98765432~HEADLINE
        field_type:
          anyOf:
            - type: string
            - type: 'null'
          title: Field Type
          description: >-
            Which slot the asset fills, as Google reports it, or `null` when
            Google returned no field type.
          example: HEADLINE
        primary_status:
          anyOf:
            - type: string
            - type: 'null'
          title: Primary Status
          description: >-
            Google's serving status for the asset, such as `ELIGIBLE`, `LIMITED`
            or `PENDING`. The value is `null` when Google returned no status.
          example: ELIGIBLE
      type: object
      required:
        - resource_name
        - field_type
        - primary_status
      title: DurableAssetRow
      description: One asset already attached to a campaign in Google Ads.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: api_key
      description: Personal API key.

````