curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"geo_targets": [
"geoTargetConstants/1007339"
],
"language_code": "en"
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes"
payload = {
"geo_targets": ["geoTargetConstants/1007339"],
"language_code": "en"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({geo_targets: ['geoTargetConstants/1007339'], language_code: 'en'})
};
fetch('https://app.base44.com/api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.base44.com/api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'geo_targets' => [
'geoTargetConstants/1007339'
],
'language_code' => 'en'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes"
payload := strings.NewReader("{\n \"geo_targets\": [\n \"geoTargetConstants/1007339\"\n ],\n \"language_code\": \"en\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.base44.com/api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"geo_targets\": [\n \"geoTargetConstants/1007339\"\n ],\n \"language_code\": \"en\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"geo_targets\": [\n \"geoTargetConstants/1007339\"\n ],\n \"language_code\": \"en\"\n}"
response = http.request(request)
puts response.read_body{
"keyword_themes": [
"phone repair shop",
"screen replacement"
]
}Suggest Google Ads setup keyword themes
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 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.
curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"geo_targets": [
"geoTargetConstants/1007339"
],
"language_code": "en"
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes"
payload = {
"geo_targets": ["geoTargetConstants/1007339"],
"language_code": "en"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({geo_targets: ['geoTargetConstants/1007339'], language_code: 'en'})
};
fetch('https://app.base44.com/api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.base44.com/api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'geo_targets' => [
'geoTargetConstants/1007339'
],
'language_code' => 'en'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes"
payload := strings.NewReader("{\n \"geo_targets\": [\n \"geoTargetConstants/1007339\"\n ],\n \"language_code\": \"en\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.base44.com/api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"geo_targets\": [\n \"geoTargetConstants/1007339\"\n ],\n \"language_code\": \"en\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/google-ads/setup-suggestions/keyword-themes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"geo_targets\": [\n \"geoTargetConstants/1007339\"\n ],\n \"language_code\": \"en\"\n}"
response = http.request(request)
puts response.read_body{
"keyword_themes": [
"phone repair shop",
"screen replacement"
]
}Authorizations
Personal access token, sent as Authorization: Bearer <token>.
Path Parameters
ID of the app you are setting up Google Ads for.
Body
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.
["geoTargetConstants/1007339"]
Language the themes should be in, normally the language_code Suggest Google Ads setup targeting returned. A missing or unsupported code gets English themes.
"en"
Response
Google's keyword themes, or an empty list.
Google's keyword themes for the app's landing page.
Up to 25 themes Google suggests, in Google's order. Empty when Google could not answer.
["phone repair shop", "screen replacement"]
Was this page helpful?