Generate Google Ads text assets

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

Writes ad copy for the app and returns it as previews.

Nothing reaches Google Ads here. Each line comes back with a session_asset_id you pass to Accept a generated Google Ads asset to put it on a live campaign. Use Generate Google Ads assets instead when you want copy and pictures in one call.

Pick the lines you want with asset_field_types. SEARCH campaigns do not take LONG_HEADLINE, so Google rejects that combination.

Grounding is flexible here, unlike image generation. You may send final_url and freeform_prompt together, and sending neither grounds the copy in the app's own home page.

The copy is written in the language of the app's own site, not the language you ask in, and the response reports which one in language.

<Note>Only one generation of each kind runs per app at a time. Calling this while one is running returns a 200 carrying in_flight set to true, that run's session_id, and an empty assets. Poll the session_id you were given rather than retrying.</Note>

This endpoint costs 2 of 20 copy requests a minute per app, shared with the other Google Ads endpoints that write copy, and up to 4 when the retry below happens.

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

post/api/apps/{app_id}/google-ads/assets/generate-text

Path parameters

app_idstring required

ID of the app whose Google Ads creative you want to generate or read.

ID of the app whose Google Ads creative you want to generate or read.

Request body

channel_typestring

Campaign type the copy is for, one of PERFORMANCE_MAX, DEMAND_GEN, SEARCH or DISPLAY.

asset_field_typesstring[]

Which kinds of line to write, from HEADLINE, LONG_HEADLINE or DESCRIPTION. Send between one and three entries. An image field type here is rejected with a 422.

final_urlstring

Page to base the copy on. Unlike image generation you may send this together with freeform_prompt, and sending neither grounds the copy in the app's own home page.

freeform_promptstring

What the copy should say, in your own words, up to 1500 characters.

keywordsstring[]

Keywords to work into the copy. Send between 1 and 15 of them, and none of them blank. Omit the field entirely rather than sending an empty list.

Example request

{
  "channel_type": "PERFORMANCE_MAX",
  "asset_field_types": [
    "HEADLINE",
    "DESCRIPTION"
  ],
  "final_url": "https://example.com/spring",
  "freeform_prompt": "Lead with free delivery across Germany",
  "keywords": [
    "oak furniture",
    "handmade table"
  ]
}

Response

The copy that was generated.

session_idstring required

ID of this generation. Pass it as session_id to List Google Ads generated assets, or to Accept a generated Google Ads asset with one of the returned session_asset_id values.

languagestring nullable

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 on a lock-miss response unless you asked for a specific campaign.

in_flightboolean nullable

Present and true only when a text generation for this app was already running, in which case session_id is that run's and assets is empty. Poll the returned session_id rather than retrying. The field is absent on every other response.

Example response

{
  "session_id": "9c1d2e3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f",
  "assets": [],
  "language": "de",
  "in_flight": true
}

Changes

No recorded changes to this endpoint across all 1 revision of this API.