Generate Google Ads assets

Changed on

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

Writes ad copy and generates pictures for the app in one call, and returns them as previews.

Nothing reaches Google Ads here. Everything comes back as a preview you look at first, and only Accept a generated Google Ads asset puts one on a live campaign.

Which slots get filled follows channel_type. SEARCH gets HEADLINE and DESCRIPTION copy plus landscape and square pictures. DISPLAY gets the same pictures and adds LONG_HEADLINE copy. PERFORMANCE_MAX and DEMAND_GEN get that copy plus all four picture shapes, adding portrait and tall portrait. You cannot ask for individual slots on this endpoint.

The copy is written in language_code when you send it, and otherwise in the language of the app's own site. The response reports which one in language.

Pictures take longer than copy, so the response returns as soon as the copy is ready. images holds only the pictures that finished in time and background_image_count says how many more are coming. Poll List Google Ads generated assets with the returned session_id for the rest.

<Warning>Only one generation runs per app at a time. Calling this while one is already running returns a 200 carrying that run's session_id with text and images empty, and with background_image_count and language absent. That absence is how you tell it apart from a generation that genuinely produced nothing, and the right response is to poll the session_id you were given rather than to retry.</Warning>

Rate limits are per app and split across two pools. The copy costs 2 of 20 requests a minute. The pictures cost one of 30 requests a minute for each picture shape, so a PERFORMANCE_MAX call costs 4 and a SEARCH call costs 2. For PERFORMANCE_MAX the picture pool runs out first, which puts the ceiling at about seven calls a minute. A leg that has nothing to do costs nothing. Each leg can also retry once, as below, and the retry costs that leg the same again.

<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>When one leg fails and the other produced something, you get a 200 with only the successful leg's assets. The failure is only raised when neither leg produced anything, so check text and images rather than assuming a 200 means both ran.</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-all

Request

  • Base URL
    https://app.base44.com
  • URL
    https://app.base44.com/api/apps/{app_id}/google-ads/assets/generate-all
  • Auth
    HTTP bearer

Path parameters

app_idstring required

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

Request body

channel_typestring

Campaign type to generate for, which decides the slots that get filled. One of PERFORMANCE_MAX, DEMAND_GEN, SEARCH or DISPLAY.

final_urlstring

Page the pictures should be based on. Send this or freeform_prompt, not both.

freeform_promptstring

What the pictures should show, in your own words, up to 1500 characters. Send this or final_url, not both.

language_codestring

Two-letter code of the language to write the copy in and make the pictures for, for example de. A regional tag such as pt-BR is reduced to pt. Omit it to use the language of the app's own site. A language Google Ads doesn't support returns a 400.

session_idstring

The session_id of an earlier generation to add these previews to. List Google Ads generated assets returns the combined set for an hour. Omit it to start a new generation. Sending it always starts a new generation, even while one is running for the app, so poll List generated assets for progress rather than calling this again.

Example request

{
  "channel_type": "PERFORMANCE_MAX",
  "final_url": "https://example.com/spring",
  "freeform_prompt": "Warm studio shots of handmade oak dining tables",
  "language_code": "de",
  "session_id": "3f9c2a7b8d1e4f6a9b0c1d2e3f4a5b6c"
}

Response

The creative that was generated.

session_idstring required

ID of this generation. Pass it as session_id to List Google Ads generated assets to poll for the images that are still coming.

background_image_countinteger nullable

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

languagestring nullable

Language the copy was written in, as a lowercase two-letter code: language_code when you sent it, and otherwise the language of the app's own site. The field is absent when a generation for this app was already running and you sent no language_code.

Example response

{
  "session_id": "9c1d2e3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f",
  "text": [],
  "images": [],
  "background_image_count": 3,
  "language": "de"
}

Changes