---
title: "Suggest Google Ads setup keyword themes"
method: POST
path: "/api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes"
---

# Suggest Google Ads setup keyword themes

`POST /api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes`

## Request

- Base URL: `https://app.base44.com`
- URL: `https://app.base44.com/api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes`
- Auth: HTTP bearer

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

Asks Google which keyword themes fit the app's landing page in the locations you picked, for a campaign you have not launched yet.

These come from Google's own read of the app's published site, so prefer them over the generated `keyword_themes` from [Suggest Google Ads setup targeting](/api-reference/suggest-google-ads-setup-targeting) and fill up from those. Send the `language_code` that endpoint returned, so Google answers in the same language.

The call always returns a 200 once it is allowed through. `keyword_themes` is empty when Google cannot answer: the app has no Google Ads account with a Google customer ID yet, the app is not published where Google can read it, none of `geo_targets` is a geo target constant ID, Google returns nothing, or the request to Google fails. Read an empty list as "keep the generated themes", not as an error. Nothing is saved, and no language model runs.

This is limited to 10 requests a minute per app. Some workspaces have a different limit. It is refused with a 409 while the workspace is on a Google Ads billing hold.

<Note>This endpoint accepts a personal API key from anyone who can edit the app. A read-only key is refused with a 403, and so are workspace API keys.</Note>

## Path parameters

- `app_id` string, required: ID of the app you are setting up Google Ads for.

## Request body

- GoogleAdsSetupKeywordThemesRequest
  - `geo_targets` string[]: Locations the campaign targets, as Google geo target constant IDs (`geoTargetConstants/1023191`, or just `1023191`). Entries in any other form are ignored, and with none left you get an empty list.
  - `language_code` string: Language the themes should be in, normally the `language_code` [Suggest Google Ads setup targeting](/api-reference/suggest-google-ads-setup-targeting) returned. A missing or unsupported code gets English themes.

## Response `200`

Google's keyword themes, or an empty list.

- GoogleAdsSetupKeywordThemes: Google's keyword themes for the app's landing page.
  - `keyword_themes` string[], required: Up to 25 themes Google suggests, in Google's order. Empty when Google could not answer.

## Other responses

- `401`: Missing or invalid credentials.
- `403`: You can't edit this app, the app does not exist, or you used a read-only or workspace API key. A missing app and an app you cannot reach are deliberately the same answer.
- `409`: The workspace is on a Google Ads billing hold.
- `422`: The body has a field other than `geo_targets` and `language_code`, or a field of the wrong type.
- `429`: The app has used up its 10 keyword theme requests for the current minute. Retry later.

## Changes

- **2026-10-11** `80287813ab84`: 1 info
  - the endpoint scheme security `PersonalAccessTokenAuth` was added to the API
- **2026-10-10** `fc604cdcc3a2`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/idealspot/apis/base44-app-management-api/changes/api/apps/:app_id/google-ads/setup-suggestions/keyword-themes/post.md)

---

[API](https://skmtc.dev/idealspot/apis/base44-app-management-api.md) - [All operations](https://skmtc.dev/idealspot/apis/base44-app-management-api/llms.txt) - [OpenAPI document](https://skmtc.dev/idealspot/apis/base44-app-management-api/revisions/b5b4ebd82a1e?raw)
