curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/ai-suggestions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"business_name": "Nordwind Furniture",
"business_description": "Handmade solid oak dining tables, built to order in San Francisco.",
"landing_page_url": "https://nordwind-furniture.com",
"campaign_goal": "traffic",
"daily_budget_micros": 30000000,
"suggestion_count": 3,
"geo_targets": [
"1023191"
]
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/ai-suggestions"
payload = {
"business_name": "Nordwind Furniture",
"business_description": "Handmade solid oak dining tables, built to order in San Francisco.",
"landing_page_url": "https://nordwind-furniture.com",
"campaign_goal": "traffic",
"daily_budget_micros": 30000000,
"suggestion_count": 3,
"geo_targets": ["1023191"]
}
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({
business_name: 'Nordwind Furniture',
business_description: 'Handmade solid oak dining tables, built to order in San Francisco.',
landing_page_url: 'https://nordwind-furniture.com',
campaign_goal: 'traffic',
daily_budget_micros: 30000000,
suggestion_count: 3,
geo_targets: ['1023191']
})
};
fetch('https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/ai-suggestions', 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/campaigns/ai-suggestions",
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([
'business_name' => 'Nordwind Furniture',
'business_description' => 'Handmade solid oak dining tables, built to order in San Francisco.',
'landing_page_url' => 'https://nordwind-furniture.com',
'campaign_goal' => 'traffic',
'daily_budget_micros' => 30000000,
'suggestion_count' => 3,
'geo_targets' => [
'1023191'
]
]),
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/campaigns/ai-suggestions"
payload := strings.NewReader("{\n \"business_name\": \"Nordwind Furniture\",\n \"business_description\": \"Handmade solid oak dining tables, built to order in San Francisco.\",\n \"landing_page_url\": \"https://nordwind-furniture.com\",\n \"campaign_goal\": \"traffic\",\n \"daily_budget_micros\": 30000000,\n \"suggestion_count\": 3,\n \"geo_targets\": [\n \"1023191\"\n ]\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/campaigns/ai-suggestions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"business_name\": \"Nordwind Furniture\",\n \"business_description\": \"Handmade solid oak dining tables, built to order in San Francisco.\",\n \"landing_page_url\": \"https://nordwind-furniture.com\",\n \"campaign_goal\": \"traffic\",\n \"daily_budget_micros\": 30000000,\n \"suggestion_count\": 3,\n \"geo_targets\": [\n \"1023191\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/ai-suggestions")
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 \"business_name\": \"Nordwind Furniture\",\n \"business_description\": \"Handmade solid oak dining tables, built to order in San Francisco.\",\n \"landing_page_url\": \"https://nordwind-furniture.com\",\n \"campaign_goal\": \"traffic\",\n \"daily_budget_micros\": 30000000,\n \"suggestion_count\": 3,\n \"geo_targets\": [\n \"1023191\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"suggestions": [
{
"campaign_type": "PERFORMANCE_MAX",
"estimate_source": "heuristic",
"estimated_daily_clicks": 30,
"id": "pmax-leads",
"payload": {
"business_name": "Nordwind Furniture",
"campaign_name": "Nordwind Furniture — PMax",
"campaign_type": "PERFORMANCE_MAX",
"daily_budget_micros": 30000000,
"descriptions": [
"Solid oak dining tables built to order."
],
"headlines": [
"Handmade Oak Tables"
],
"images": [],
"keyword_themes": [
"handmade oak furniture"
],
"landing_page": "https://nordwind-furniture.com",
"logo_url": "",
"settings": {
"language_code": "en"
}
},
"subtitle": "Best for cross-channel reach (search + display + YouTube)",
"title": "Performance Max — Leads"
}
],
"source": "ai",
"language": "en"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Suggest Google Ads campaigns
Turns a plain description of a business into a complete Performance Max campaign you can preview and launch.
The suggestion carries a payload you can send to Create campaign. Nothing is saved.
You get one suggestion whatever suggestion_count says. Google stopped accepting new Smart campaigns on September 23, 2026, so the two Smart Search approaches this used to return are gone.
The Performance Max suggestion cannot launch as-is. payload.logo_url and payload.images come back empty because this endpoint does not generate images, and Google requires both. Fill both in before you send that payload, hosted where the images field of Create campaign says Base44 can fetch them.
Check source before presenting the copy as generated: fallback means the model did not run or returned nothing. title and subtitle are always English, even when the copy inside payload is in the app’s language, so translate them yourself if you show them to someone.
This one call runs two language-model requests and debits the shared quota twice.
curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/ai-suggestions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"business_name": "Nordwind Furniture",
"business_description": "Handmade solid oak dining tables, built to order in San Francisco.",
"landing_page_url": "https://nordwind-furniture.com",
"campaign_goal": "traffic",
"daily_budget_micros": 30000000,
"suggestion_count": 3,
"geo_targets": [
"1023191"
]
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/ai-suggestions"
payload = {
"business_name": "Nordwind Furniture",
"business_description": "Handmade solid oak dining tables, built to order in San Francisco.",
"landing_page_url": "https://nordwind-furniture.com",
"campaign_goal": "traffic",
"daily_budget_micros": 30000000,
"suggestion_count": 3,
"geo_targets": ["1023191"]
}
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({
business_name: 'Nordwind Furniture',
business_description: 'Handmade solid oak dining tables, built to order in San Francisco.',
landing_page_url: 'https://nordwind-furniture.com',
campaign_goal: 'traffic',
daily_budget_micros: 30000000,
suggestion_count: 3,
geo_targets: ['1023191']
})
};
fetch('https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/ai-suggestions', 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/campaigns/ai-suggestions",
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([
'business_name' => 'Nordwind Furniture',
'business_description' => 'Handmade solid oak dining tables, built to order in San Francisco.',
'landing_page_url' => 'https://nordwind-furniture.com',
'campaign_goal' => 'traffic',
'daily_budget_micros' => 30000000,
'suggestion_count' => 3,
'geo_targets' => [
'1023191'
]
]),
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/campaigns/ai-suggestions"
payload := strings.NewReader("{\n \"business_name\": \"Nordwind Furniture\",\n \"business_description\": \"Handmade solid oak dining tables, built to order in San Francisco.\",\n \"landing_page_url\": \"https://nordwind-furniture.com\",\n \"campaign_goal\": \"traffic\",\n \"daily_budget_micros\": 30000000,\n \"suggestion_count\": 3,\n \"geo_targets\": [\n \"1023191\"\n ]\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/campaigns/ai-suggestions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"business_name\": \"Nordwind Furniture\",\n \"business_description\": \"Handmade solid oak dining tables, built to order in San Francisco.\",\n \"landing_page_url\": \"https://nordwind-furniture.com\",\n \"campaign_goal\": \"traffic\",\n \"daily_budget_micros\": 30000000,\n \"suggestion_count\": 3,\n \"geo_targets\": [\n \"1023191\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/ai-suggestions")
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 \"business_name\": \"Nordwind Furniture\",\n \"business_description\": \"Handmade solid oak dining tables, built to order in San Francisco.\",\n \"landing_page_url\": \"https://nordwind-furniture.com\",\n \"campaign_goal\": \"traffic\",\n \"daily_budget_micros\": 30000000,\n \"suggestion_count\": 3,\n \"geo_targets\": [\n \"1023191\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"suggestions": [
{
"campaign_type": "PERFORMANCE_MAX",
"estimate_source": "heuristic",
"estimated_daily_clicks": 30,
"id": "pmax-leads",
"payload": {
"business_name": "Nordwind Furniture",
"campaign_name": "Nordwind Furniture — PMax",
"campaign_type": "PERFORMANCE_MAX",
"daily_budget_micros": 30000000,
"descriptions": [
"Solid oak dining tables built to order."
],
"headlines": [
"Handmade Oak Tables"
],
"images": [],
"keyword_themes": [
"handmade oak furniture"
],
"landing_page": "https://nordwind-furniture.com",
"logo_url": "",
"settings": {
"language_code": "en"
}
},
"subtitle": "Best for cross-channel reach (search + display + YouTube)",
"title": "Performance Max — Leads"
}
],
"source": "ai",
"language": "en"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Personal access token, sent as Authorization: Bearer <token>.
Path Parameters
ID of the app you are planning a Google Ads campaign for.
Body
Name of the business to build campaigns for.
"Nordwind Furniture"
What the business sells, in a sentence or two. This is what the suggestions are built from.
"Handmade solid oak dining tables, built to order in San Francisco."
Page the campaigns would send people to.
"https://nordwind-furniture.com"
What the campaigns are for: traffic, leads or sales.
"traffic"
Daily budget each suggestion is sized for, in micros (1,000,000 micros = 1 unit of the account's currency).
30000000
How many suggestions to return. Only one approach exists (Performance Max), so any value returns one.
1 <= x <= 53
Locations the campaigns would target, as Google geo target constant IDs. Sharpens the click estimates.
50["1023191"]
Response
Campaigns you can preview and launch.
Suggested campaigns for a business description.
The suggested campaigns. Always exactly one, however many you asked for.
Show child attributes
Show child attributes
[
{
"campaign_type": "PERFORMANCE_MAX",
"estimate_source": "heuristic",
"estimated_daily_clicks": 30,
"id": "pmax-leads",
"payload": {
"business_name": "Nordwind Furniture",
"campaign_name": "Nordwind Furniture — PMax",
"campaign_type": "PERFORMANCE_MAX",
"daily_budget_micros": 30000000,
"descriptions": ["Solid oak dining tables built to order."],
"headlines": ["Handmade Oak Tables"],
"images": [],
"keyword_themes": ["handmade oak furniture"],
"landing_page": "https://nordwind-furniture.com",
"logo_url": "",
"settings": { "language_code": "en" }
},
"subtitle": "Best for cross-channel reach (search + display + YouTube)",
"title": "Performance Max — Leads"
}
]
ai when a language model wrote the copy in these suggestions, fallback when it did not run or returned nothing.
"ai"
Two-letter code for the language the generated copy came back in, or null when the model did not report one.
"en"
Was this page helpful?