> ## 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 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>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json get /api/apps/{app_id}/google-ads/analytics/asset-performance
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/analytics/asset-performance:
    get:
      summary: List Google Ads asset performance
      description: >-
        <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>
      operationId: >-
        get_asset_performance_api_apps__app_id__google_ads_analytics_asset_performance_get
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app whose Google Ads reporting you want to read.
            title: App Id
          description: ID of the app whose Google Ads reporting you want to read.
          example: 6820f3a4e7b91d003c45a1f2
      responses:
        '200':
          description: One entry per serving asset, grouped by its role.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/AssetPerformanceRow'
                title: AssetPerformance
        '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.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
components:
  schemas:
    AssetPerformanceRow:
      properties:
        resource_name:
          type: string
          title: Resource Name
          description: >-
            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.
          example: customers/1234567890/assetGroupAssets/2145881234~9988776655~HEADLINE
        field_type:
          type: string
          title: Field Type
          description: >-
            The role the asset plays, for example `HEADLINE`, `LONG_HEADLINE`,
            `DESCRIPTION`, `MARKETING_IMAGE`, `LOGO`, or `YOUTUBE_VIDEO`.
          example: HEADLINE
        text:
          type: string
          title: Text
          description: The asset's text. Empty for images, logos and videos.
          example: Handmade oak furniture
        asset_name:
          type: string
          title: Asset Name
          description: >-
            Google Ads' own name for the asset. Usually the only label an image,
            logo or video has.
          example: spring-hero-1200x628
        type:
          type: string
          title: Type
          description: >-
            Google Ads asset type, for example `TEXT`, `IMAGE`, or
            `YOUTUBE_VIDEO`.
          example: TEXT
        image_url:
          type: string
          title: Image Url
          description: >-
            Hosted URL for an image or logo asset. Empty for text and video
            assets.
          example: https://tpc.googlesyndication.com/simgad/1234567890
        video_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Video Id
          description: >-
            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.
          example: dQw4w9WgXcQ
        campaign:
          type: string
          title: Campaign
          description: Name of the campaign the asset serves in.
          example: Spring sale - Performance Max
        asset_group_id:
          type: string
          title: Asset Group Id
          description: >-
            ID of the asset group the asset belongs to. Empty for logos, which
            attach to the campaign instead.
          example: '9988776655'
        asset_group_name:
          type: string
          title: Asset Group Name
          description: Name of that asset group. Empty for the same reason.
          example: Spring sale - Asset Group
        ad_strength:
          type: string
          title: Ad Strength
          description: >-
            Google Ads' strength rating for the asset group: `POOR`, `AVERAGE`,
            `GOOD`, `EXCELLENT`, or `PENDING`. Empty for logos.
          example: GOOD
        primary_status:
          type: string
          title: Primary Status
          description: >-
            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.
          example: ELIGIBLE
        primary_status_reasons:
          items:
            type: string
          type: array
          title: Primary Status Reasons
          description: >-
            Why the asset is limited or disapproved. Empty when it serves
            normally.
          example:
            - TRADEMARKS_IN_AD_TEXT
        policy_topics:
          items:
            type: string
          type: array
          title: Policy Topics
          description: >-
            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.
          example:
            - TRADEMARKS_IN_AD_TEXT
        performance_label:
          type: string
          title: Performance Label
          description: >-
            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.
          example: LEARNING
        impressions:
          anyOf:
            - type: integer
            - type: 'null'
          title: Impressions
          description: >-
            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.
          example: 18400
        clicks:
          anyOf:
            - type: integer
            - type: 'null'
          title: Clicks
          description: Clicks over the same 30 days, with the same `null` and absent cases.
          example: 612
        cost_micros:
          anyOf:
            - type: integer
            - type: 'null'
          title: Cost Micros
          description: >-
            Spend over the same 30 days in micros, with the same `null` and
            absent cases.
          example: 412500000
      type: object
      required:
        - resource_name
        - field_type
        - text
        - asset_name
        - type
        - image_url
        - campaign
        - asset_group_id
        - asset_group_name
        - ad_strength
        - primary_status
        - performance_label
      title: AssetPerformanceRow
      description: One creative asset in a Performance Max campaign.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: api_key
      description: Personal API key.

````