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

# Regenerate Google Ads asset group creative

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

Generates fresh creative for one asset group, for when its existing creative has stopped performing.

Use it when [List Google Ads asset performance](/api-reference/list-google-ads-asset-performance) shows an asset group rated `POOR` or `LOW`. That endpoint tells you creative has gone stale; this is what replaces it.

Nothing reaches Google Ads here. The response is the same shape as [Generate Google Ads assets](/api-reference/generate-google-ads-assets), and the new creative comes back as previews you accept one at a time with [Accept a generated Google Ads asset](/api-reference/accept-a-generated-google-ads-asset). Nothing on the asset group is replaced or removed for you, so accepting adds to what is already there rather than swapping it.

Pass the asset group's Google Ads ID, which is numeric. Anything else is rejected with a 422 without a call to Google.

The rate limits, the two 200 shapes, and the retry accounting are the same as [Generate Google Ads assets](/api-reference/generate-google-ads-assets), because this runs the same generation underneath.

<Note>When Google refuses the page you pointed at, Base44 retries once on the app's own published URL, and that retry costs the same again. Pace requests against the doubled figure, not the single one, or a refusal-heavy app hits a 429 part-way through its own recovery.</Note>

<Note>Generating creative does not spend credits and is not billed. It is capped by rate limits instead, so a burst gets a 429 rather than a bill.</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. Send only the fields documented here. Other request fields are not supported and their behavior can change.</Warning>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json post /api/apps/{app_id}/google-ads/asset-groups/{asset_group_id}/regenerate-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/asset-groups/{asset_group_id}/regenerate-assets:
    post:
      summary: Regenerate Google Ads asset group creative
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Generates fresh creative for one asset group, for when its existing
        creative has stopped performing.


        Use it when [List Google Ads asset
        performance](/api-reference/list-google-ads-asset-performance) shows an
        asset group rated `POOR` or `LOW`. That endpoint tells you creative has
        gone stale; this is what replaces it.


        Nothing reaches Google Ads here. The response is the same shape as
        [Generate Google Ads assets](/api-reference/generate-google-ads-assets),
        and the new creative comes back as previews you accept one at a time
        with [Accept a generated Google Ads
        asset](/api-reference/accept-a-generated-google-ads-asset). Nothing on
        the asset group is replaced or removed for you, so accepting adds to
        what is already there rather than swapping it.


        Pass the asset group's Google Ads ID, which is numeric. Anything else is
        rejected with a 422 without a call to Google.


        The rate limits, the two 200 shapes, and the retry accounting are the
        same as [Generate Google Ads
        assets](/api-reference/generate-google-ads-assets), because this runs
        the same generation underneath.


        <Note>When Google refuses the page you pointed at, Base44 retries once
        on the app's own published URL, and that retry costs the same again.
        Pace requests against the doubled figure, not the single one, or a
        refusal-heavy app hits a 429 part-way through its own recovery.</Note>


        <Note>Generating creative does not spend credits and is not billed. It
        is capped by rate limits instead, so a burst gets a 429 rather than a
        bill.</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. Send only the fields documented here. Other request fields are not
        supported and their behavior can change.</Warning>
      operationId: >-
        regenerate_asset_group_assets_api_apps__app_id__google_ads_asset_groups__asset_group_id__regenerate_assets_post
      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: asset_group_id
          in: path
          required: true
          schema:
            type: string
            description: >-
              Google Ads' own numeric ID for the asset group, as reported in
              `asset_group_id` by [List Google Ads asset
              performance](/api-reference/list-google-ads-asset-performance).
            title: Asset Group Id
          description: >-
            Google Ads' own numeric ID for the asset group, as reported in
            `asset_group_id` by [List Google Ads asset
            performance](/api-reference/list-google-ads-asset-performance).
          example: '1122334455'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              title: RegenerateAssetGroupAssets
              type: object
              properties:
                channel_type:
                  type: string
                  description: >-
                    Campaign type to generate for, which decides the slots that
                    get filled. One of `PERFORMANCE_MAX`, `DEMAND_GEN`, `SEARCH`
                    or `DISPLAY`. Asset groups belong to Performance Max
                    campaigns, so the default is the value you almost always
                    want.
                  default: PERFORMANCE_MAX
                  example: PERFORMANCE_MAX
                final_url:
                  type: string
                  description: >-
                    Page the new pictures should be based on. Send this or
                    `freeform_prompt`, not both, or omit both to ground the
                    creative in the app's own home page.
                  example: https://example.com/spring
                freeform_prompt:
                  type: string
                  description: >-
                    What the new creative should show, in your own words, up to
                    1500 characters. Send this or `final_url`, not both.
                  example: Brighter lifestyle shots with the product in use
            example:
              channel_type: PERFORMANCE_MAX
              freeform_prompt: Brighter lifestyle shots with the product in use
      responses:
        '200':
          description: The replacement creative that was generated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenerateAssetsResult'
        '400':
          description: >-
            Google Ads rejected the generation request, for example a landing
            page it could not read. The response message carries Google's
            reason.
        '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: >-
            No asset group with this ID exists on the app's Google Ads account,
            or the campaign it belongs to is not one Base44 manages for this
            app.
        '409':
          description: >-
            The app's Google Ads account is not ready to generate assets yet, or
            the request to Google Ads timed out after being sent. Nothing was
            attached to a campaign either way, so retrying is safe.
        '422':
          description: >-
            The asset group ID is not numeric, or you sent both `final_url` and
            `freeform_prompt`, or `freeform_prompt` is longer than 1500
            characters.
        '429':
          description: >-
            The app has used up one of the creative rate limits, either 20 copy
            requests a minute or 10 picture requests a minute. Retry later.
components:
  schemas:
    GenerateAssetsResult:
      properties:
        session_id:
          type: string
          title: Session Id
          description: >-
            ID of this generation. Pass it as `session_id` to [List Google Ads
            generated assets](/api-reference/list-google-ads-generated-assets)
            to poll for the images that are still coming.
          example: 9c1d2e3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f
        text:
          items:
            $ref: '#/components/schemas/GeneratedAssetSummary'
          type: array
          title: Text
          description: >-
            The copy that was generated. Empty when the text engine produced
            nothing and when a generation for this app was already running.
          example: []
        images:
          items:
            $ref: '#/components/schemas/GeneratedAssetSummary'
          type: array
          title: Images
          description: >-
            The pictures that finished in time to be returned inline. The rest
            are counted in `background_image_count`.
          example: []
        background_image_count:
          anyOf:
            - type: integer
            - type: 'null'
          title: Background Image Count
          description: >-
            How many more pictures are still being generated for this session.
            The response comes back as soon as the copy is done, so poll [List
            Google Ads generated
            assets](/api-reference/list-google-ads-generated-assets) with
            `session_id` for these. The field is absent when a generation for
            this app was already running, which is how you tell that case apart.
          example: 3
        language:
          anyOf:
            - type: string
            - type: 'null'
          title: Language
          description: >-
            Language the copy was written in, as a lowercase two-letter code. It
            comes from the app's own site rather than from anything you send.
            The field is absent when a generation for this app was already
            running.
          example: de
      type: object
      required:
        - session_id
        - text
        - images
      title: GenerateAssetsResult
      description: The creative one generation produced.
    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.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: api_key
      description: Personal API key.

````