curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/google-ads/campaign-briefs \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"platform_type": "SMART",
"business_name": "Nordwind Furniture",
"business_description": "Handmade oak furniture, delivered across Germany.",
"landing_page_url": "https://example.com/spring",
"language": "de",
"keywords": [
"oak furniture",
"handmade table"
],
"daily_budget_micros": 15000000,
"geo_targets": [
"1003854"
]
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/google-ads/campaign-briefs"
payload = {
"platform_type": "SMART",
"business_name": "Nordwind Furniture",
"business_description": "Handmade oak furniture, delivered across Germany.",
"landing_page_url": "https://example.com/spring",
"language": "de",
"keywords": ["oak furniture", "handmade table"],
"daily_budget_micros": 15000000,
"geo_targets": ["1003854"]
}
headers = {
"api_key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {api_key: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
platform_type: 'SMART',
business_name: 'Nordwind Furniture',
business_description: 'Handmade oak furniture, delivered across Germany.',
landing_page_url: 'https://example.com/spring',
language: 'de',
keywords: ['oak furniture', 'handmade table'],
daily_budget_micros: 15000000,
geo_targets: ['1003854']
})
};
fetch('https://app.base44.com/api/apps/{app_id}/google-ads/campaign-briefs', 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/campaign-briefs",
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([
'platform_type' => 'SMART',
'business_name' => 'Nordwind Furniture',
'business_description' => 'Handmade oak furniture, delivered across Germany.',
'landing_page_url' => 'https://example.com/spring',
'language' => 'de',
'keywords' => [
'oak furniture',
'handmade table'
],
'daily_budget_micros' => 15000000,
'geo_targets' => [
'1003854'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"api_key: <api-key>"
],
]);
$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/campaign-briefs"
payload := strings.NewReader("{\n \"platform_type\": \"SMART\",\n \"business_name\": \"Nordwind Furniture\",\n \"business_description\": \"Handmade oak furniture, delivered across Germany.\",\n \"landing_page_url\": \"https://example.com/spring\",\n \"language\": \"de\",\n \"keywords\": [\n \"oak furniture\",\n \"handmade table\"\n ],\n \"daily_budget_micros\": 15000000,\n \"geo_targets\": [\n \"1003854\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("api_key", "<api-key>")
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/campaign-briefs")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"platform_type\": \"SMART\",\n \"business_name\": \"Nordwind Furniture\",\n \"business_description\": \"Handmade oak furniture, delivered across Germany.\",\n \"landing_page_url\": \"https://example.com/spring\",\n \"language\": \"de\",\n \"keywords\": [\n \"oak furniture\",\n \"handmade table\"\n ],\n \"daily_budget_micros\": 15000000,\n \"geo_targets\": [\n \"1003854\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/google-ads/campaign-briefs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["api_key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"platform_type\": \"SMART\",\n \"business_name\": \"Nordwind Furniture\",\n \"business_description\": \"Handmade oak furniture, delivered across Germany.\",\n \"landing_page_url\": \"https://example.com/spring\",\n \"language\": \"de\",\n \"keywords\": [\n \"oak furniture\",\n \"handmade table\"\n ],\n \"daily_budget_micros\": 15000000,\n \"geo_targets\": [\n \"1003854\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "68b1c0d4e7b91d003c45a1f5",
"platform_type": "SMART",
"source": "user",
"business_name": "Nordwind Furniture",
"business_description": "Handmade oak furniture, delivered across Germany.",
"landing_page_url": "https://example.com/spring",
"language": "en",
"keywords": [
"oak furniture",
"handmade table"
],
"target_audience": "Homeowners aged 30 to 55",
"daily_budget_micros": 15000000,
"geo_targets": [
"1003854"
],
"headlines": [
"Handmade oak furniture"
],
"descriptions": [
"Built to last. Delivered free."
],
"schedule_type": "always",
"schedule_days": [
{
"day": "MONDAY",
"end_hour": 17,
"start_hour": 9
}
],
"created_date": "2026-08-25T11:20:00Z",
"updated_date": "2026-08-25T14:05:00Z"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Create Google Ads campaign brief
Saves a new campaign brief.
A campaign brief is saved input for a campaign you have not launched yet: the business details, the keywords, the budget you have in mind, and the ad copy. Base44 stores it so you can build a campaign over several requests instead of one, and nothing about a brief reaches Google Ads until you create a campaign from it.
Every field is optional, so you can save a partial brief and fill it in later with Update campaign brief. Set platform_type to SMART or PERFORMANCE_MAX. It is stored as sent and is not checked against that list.
language you send is stored as-is and echoed back here. List campaign briefs and Get campaign brief report it normalized instead. A regional code is reduced to its primary subtag, so pt-BR reads back as pt, and a code Google Ads does not support reads back as en. Send a plain two-letter code to get the same value from every endpoint.curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/google-ads/campaign-briefs \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"platform_type": "SMART",
"business_name": "Nordwind Furniture",
"business_description": "Handmade oak furniture, delivered across Germany.",
"landing_page_url": "https://example.com/spring",
"language": "de",
"keywords": [
"oak furniture",
"handmade table"
],
"daily_budget_micros": 15000000,
"geo_targets": [
"1003854"
]
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/google-ads/campaign-briefs"
payload = {
"platform_type": "SMART",
"business_name": "Nordwind Furniture",
"business_description": "Handmade oak furniture, delivered across Germany.",
"landing_page_url": "https://example.com/spring",
"language": "de",
"keywords": ["oak furniture", "handmade table"],
"daily_budget_micros": 15000000,
"geo_targets": ["1003854"]
}
headers = {
"api_key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {api_key: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
platform_type: 'SMART',
business_name: 'Nordwind Furniture',
business_description: 'Handmade oak furniture, delivered across Germany.',
landing_page_url: 'https://example.com/spring',
language: 'de',
keywords: ['oak furniture', 'handmade table'],
daily_budget_micros: 15000000,
geo_targets: ['1003854']
})
};
fetch('https://app.base44.com/api/apps/{app_id}/google-ads/campaign-briefs', 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/campaign-briefs",
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([
'platform_type' => 'SMART',
'business_name' => 'Nordwind Furniture',
'business_description' => 'Handmade oak furniture, delivered across Germany.',
'landing_page_url' => 'https://example.com/spring',
'language' => 'de',
'keywords' => [
'oak furniture',
'handmade table'
],
'daily_budget_micros' => 15000000,
'geo_targets' => [
'1003854'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"api_key: <api-key>"
],
]);
$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/campaign-briefs"
payload := strings.NewReader("{\n \"platform_type\": \"SMART\",\n \"business_name\": \"Nordwind Furniture\",\n \"business_description\": \"Handmade oak furniture, delivered across Germany.\",\n \"landing_page_url\": \"https://example.com/spring\",\n \"language\": \"de\",\n \"keywords\": [\n \"oak furniture\",\n \"handmade table\"\n ],\n \"daily_budget_micros\": 15000000,\n \"geo_targets\": [\n \"1003854\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("api_key", "<api-key>")
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/campaign-briefs")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"platform_type\": \"SMART\",\n \"business_name\": \"Nordwind Furniture\",\n \"business_description\": \"Handmade oak furniture, delivered across Germany.\",\n \"landing_page_url\": \"https://example.com/spring\",\n \"language\": \"de\",\n \"keywords\": [\n \"oak furniture\",\n \"handmade table\"\n ],\n \"daily_budget_micros\": 15000000,\n \"geo_targets\": [\n \"1003854\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/google-ads/campaign-briefs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["api_key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"platform_type\": \"SMART\",\n \"business_name\": \"Nordwind Furniture\",\n \"business_description\": \"Handmade oak furniture, delivered across Germany.\",\n \"landing_page_url\": \"https://example.com/spring\",\n \"language\": \"de\",\n \"keywords\": [\n \"oak furniture\",\n \"handmade table\"\n ],\n \"daily_budget_micros\": 15000000,\n \"geo_targets\": [\n \"1003854\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "68b1c0d4e7b91d003c45a1f5",
"platform_type": "SMART",
"source": "user",
"business_name": "Nordwind Furniture",
"business_description": "Handmade oak furniture, delivered across Germany.",
"landing_page_url": "https://example.com/spring",
"language": "en",
"keywords": [
"oak furniture",
"handmade table"
],
"target_audience": "Homeowners aged 30 to 55",
"daily_budget_micros": 15000000,
"geo_targets": [
"1003854"
],
"headlines": [
"Handmade oak furniture"
],
"descriptions": [
"Built to last. Delivered free."
],
"schedule_type": "always",
"schedule_days": [
{
"day": "MONDAY",
"end_hour": 17,
"start_hour": 9
}
],
"created_date": "2026-08-25T11:20:00Z",
"updated_date": "2026-08-25T14:05:00Z"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Personal API key.
Path Parameters
ID of the app whose Google Ads campaigns to manage.
Body
Which campaign type the brief is for, SMART or PERFORMANCE_MAX. Stored as sent and not checked against that list.
Business name to advertise.
What the business does. Used when Base44 generates copy.
URL the ads will send clicks to.
Language the ad copy is in, as a lowercase two-letter code such as en or de.
Keywords the campaign should match.
Free-text description of who the campaign is for.
Planned daily budget in micros of the account currency, so 15000000 is 15.00.
Google Ads geo target constant IDs to target.
Ad headlines.
Ad description lines.
When the campaign runs. Use always to run continuously, or custom to use schedule_days.
Day and hour windows to run in, used only when schedule_type is custom.
Show child attributes
Show child attributes
Response
Successful Response
A saved campaign brief.
ID of the brief. Pass this as brief_id to read, update, or delete it.
"68b1c0d4e7b91d003c45a1f5"
Which campaign type the brief is for, SMART or PERFORMANCE_MAX.
"SMART"
Who wrote the brief. The value is ai when Base44 generated it and user when you created it.
"user"
Business name to advertise.
"Nordwind Furniture"
What the business does. Base44 uses this when it generates copy.
"Handmade oak furniture, delivered across Germany."
URL the ads will send clicks to.
"https://example.com/spring"
Language the ad copy is written in, as a lowercase two-letter code. See the note on this field in each endpoint. Create and update echo what you send, while list and get report the normalized value.
"en"
Keywords the campaign should match.
["oak furniture", "handmade table"]
Free-text description of who the campaign is for. Empty when unset.
"Homeowners aged 30 to 55"
Planned daily budget in micros of the account currency, so 15000000 is 15.00. The value is 0 when unset.
15000000
Google Ads geo target constant IDs to target.
["1003854"]
Ad headlines. Populated by generate, or by you.
["Handmade oak furniture"]
Ad description lines.
["Built to last. Delivered free."]
When the campaign runs. Use always to run continuously, or custom to use schedule_days.
"always"
Day and hour windows to run in, used only when schedule_type is custom.
[
{
"day": "MONDAY",
"end_hour": 17,
"start_hour": 9
}
]
When the brief was created.
"2026-08-25T11:20:00Z"
When the brief was last changed.
"2026-08-25T14:05:00Z"
Was this page helpful?