curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/google-ads/campaigns \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"campaign_name": "Spring sale in Berlin",
"campaign_type": "PERFORMANCE_MAX",
"daily_budget_micros": 15000000,
"landing_page": "https://example.com/spring",
"keyword_themes": [
"spring sale",
"discount furniture"
],
"geo_targets": [
"1003854"
],
"headlines": [
"Oak dining tables",
"Spring sale on now",
"Made in Berlin"
],
"descriptions": [
"Solid oak, built to order.",
"Free delivery across Germany this spring."
],
"logo_url": "https://storage.base44.com/gads-assets/b7f3a1c8-logo.png",
"images": [
{
"url": "https://storage.base44.com/gads-assets/b7f3a1c8-landscape.png",
"field_type": "MARKETING_IMAGE"
},
{
"url": "https://storage.base44.com/gads-assets/b7f3a1c8-square.png",
"field_type": "SQUARE_MARKETING_IMAGE"
}
]
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/google-ads/campaigns"
payload = {
"campaign_name": "Spring sale in Berlin",
"campaign_type": "PERFORMANCE_MAX",
"daily_budget_micros": 15000000,
"landing_page": "https://example.com/spring",
"keyword_themes": ["spring sale", "discount furniture"],
"geo_targets": ["1003854"],
"headlines": ["Oak dining tables", "Spring sale on now", "Made in Berlin"],
"descriptions": ["Solid oak, built to order.", "Free delivery across Germany this spring."],
"logo_url": "https://storage.base44.com/gads-assets/b7f3a1c8-logo.png",
"images": [
{
"url": "https://storage.base44.com/gads-assets/b7f3a1c8-landscape.png",
"field_type": "MARKETING_IMAGE"
},
{
"url": "https://storage.base44.com/gads-assets/b7f3a1c8-square.png",
"field_type": "SQUARE_MARKETING_IMAGE"
}
]
}
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({
campaign_name: 'Spring sale in Berlin',
campaign_type: 'PERFORMANCE_MAX',
daily_budget_micros: 15000000,
landing_page: 'https://example.com/spring',
keyword_themes: ['spring sale', 'discount furniture'],
geo_targets: ['1003854'],
headlines: ['Oak dining tables', 'Spring sale on now', 'Made in Berlin'],
descriptions: ['Solid oak, built to order.', 'Free delivery across Germany this spring.'],
logo_url: 'https://storage.base44.com/gads-assets/b7f3a1c8-logo.png',
images: [
{
url: 'https://storage.base44.com/gads-assets/b7f3a1c8-landscape.png',
field_type: 'MARKETING_IMAGE'
},
{
url: 'https://storage.base44.com/gads-assets/b7f3a1c8-square.png',
field_type: 'SQUARE_MARKETING_IMAGE'
}
]
})
};
fetch('https://app.base44.com/api/apps/{app_id}/google-ads/campaigns', 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",
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([
'campaign_name' => 'Spring sale in Berlin',
'campaign_type' => 'PERFORMANCE_MAX',
'daily_budget_micros' => 15000000,
'landing_page' => 'https://example.com/spring',
'keyword_themes' => [
'spring sale',
'discount furniture'
],
'geo_targets' => [
'1003854'
],
'headlines' => [
'Oak dining tables',
'Spring sale on now',
'Made in Berlin'
],
'descriptions' => [
'Solid oak, built to order.',
'Free delivery across Germany this spring.'
],
'logo_url' => 'https://storage.base44.com/gads-assets/b7f3a1c8-logo.png',
'images' => [
[
'url' => 'https://storage.base44.com/gads-assets/b7f3a1c8-landscape.png',
'field_type' => 'MARKETING_IMAGE'
],
[
'url' => 'https://storage.base44.com/gads-assets/b7f3a1c8-square.png',
'field_type' => 'SQUARE_MARKETING_IMAGE'
]
]
]),
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"
payload := strings.NewReader("{\n \"campaign_name\": \"Spring sale in Berlin\",\n \"campaign_type\": \"PERFORMANCE_MAX\",\n \"daily_budget_micros\": 15000000,\n \"landing_page\": \"https://example.com/spring\",\n \"keyword_themes\": [\n \"spring sale\",\n \"discount furniture\"\n ],\n \"geo_targets\": [\n \"1003854\"\n ],\n \"headlines\": [\n \"Oak dining tables\",\n \"Spring sale on now\",\n \"Made in Berlin\"\n ],\n \"descriptions\": [\n \"Solid oak, built to order.\",\n \"Free delivery across Germany this spring.\"\n ],\n \"logo_url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-logo.png\",\n \"images\": [\n {\n \"url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-landscape.png\",\n \"field_type\": \"MARKETING_IMAGE\"\n },\n {\n \"url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-square.png\",\n \"field_type\": \"SQUARE_MARKETING_IMAGE\"\n }\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")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"campaign_name\": \"Spring sale in Berlin\",\n \"campaign_type\": \"PERFORMANCE_MAX\",\n \"daily_budget_micros\": 15000000,\n \"landing_page\": \"https://example.com/spring\",\n \"keyword_themes\": [\n \"spring sale\",\n \"discount furniture\"\n ],\n \"geo_targets\": [\n \"1003854\"\n ],\n \"headlines\": [\n \"Oak dining tables\",\n \"Spring sale on now\",\n \"Made in Berlin\"\n ],\n \"descriptions\": [\n \"Solid oak, built to order.\",\n \"Free delivery across Germany this spring.\"\n ],\n \"logo_url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-logo.png\",\n \"images\": [\n {\n \"url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-landscape.png\",\n \"field_type\": \"MARKETING_IMAGE\"\n },\n {\n \"url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-square.png\",\n \"field_type\": \"SQUARE_MARKETING_IMAGE\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/google-ads/campaigns")
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 \"campaign_name\": \"Spring sale in Berlin\",\n \"campaign_type\": \"PERFORMANCE_MAX\",\n \"daily_budget_micros\": 15000000,\n \"landing_page\": \"https://example.com/spring\",\n \"keyword_themes\": [\n \"spring sale\",\n \"discount furniture\"\n ],\n \"geo_targets\": [\n \"1003854\"\n ],\n \"headlines\": [\n \"Oak dining tables\",\n \"Spring sale on now\",\n \"Made in Berlin\"\n ],\n \"descriptions\": [\n \"Solid oak, built to order.\",\n \"Free delivery across Germany this spring.\"\n ],\n \"logo_url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-logo.png\",\n \"images\": [\n {\n \"url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-landscape.png\",\n \"field_type\": \"MARKETING_IMAGE\"\n },\n {\n \"url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-square.png\",\n \"field_type\": \"SQUARE_MARKETING_IMAGE\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "68b1c0d4e7b91d003c45a1f2",
"google_campaign_id": "21098765432",
"campaign_name": "Spring sale in Berlin",
"campaign_type": "PERFORMANCE_MAX",
"status": "ENABLED",
"daily_budget_micros": 15000000,
"landing_page": "https://example.com/spring",
"geo_targets": [
"1003854"
],
"phone_number": "+493012345678",
"review_status": "REVIEWED",
"serving_status": "SERVING",
"primary_status": "ELIGIBLE",
"primary_status_reasons": [
"CAMPAIGN_BUDGET_LIMITED"
],
"created_date": "2026-08-25T11:20:00Z",
"updated_date": "2026-08-25T14:05:00Z",
"learning_ends_at": "2026-09-08T11:20:00Z"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Create Google Ads campaign
Creates a campaign on the app’s Google Ads account and starts serving it.
This spends money. The workspace needs a payment method on file and an account in good standing. Without either, the call returns a 402 and no campaign is created. A campaign is also created paused when the app’s conversion tracking is not yet verified, so check status on the response rather than assuming it is serving.
Set campaign_type to PERFORMANCE_MAX. Google stopped accepting new Smart campaigns on September 23, 2026, so SMART and any other type return a 400 before anything is created. daily_budget_micros is in micros of the account currency and has a per-currency floor Google enforces. A budget below it comes back as a 400 carrying Google’s reason, and the campaign is not created. Advertisers in the EU must declare whether the campaign carries political advertising. The call is rejected until that declaration is on file.
Google validates the campaign as it is created, so a rejected ad text, an unreachable landing page, or a budget below the floor comes back as a 400 with Google’s own reason.
curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/google-ads/campaigns \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"campaign_name": "Spring sale in Berlin",
"campaign_type": "PERFORMANCE_MAX",
"daily_budget_micros": 15000000,
"landing_page": "https://example.com/spring",
"keyword_themes": [
"spring sale",
"discount furniture"
],
"geo_targets": [
"1003854"
],
"headlines": [
"Oak dining tables",
"Spring sale on now",
"Made in Berlin"
],
"descriptions": [
"Solid oak, built to order.",
"Free delivery across Germany this spring."
],
"logo_url": "https://storage.base44.com/gads-assets/b7f3a1c8-logo.png",
"images": [
{
"url": "https://storage.base44.com/gads-assets/b7f3a1c8-landscape.png",
"field_type": "MARKETING_IMAGE"
},
{
"url": "https://storage.base44.com/gads-assets/b7f3a1c8-square.png",
"field_type": "SQUARE_MARKETING_IMAGE"
}
]
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/google-ads/campaigns"
payload = {
"campaign_name": "Spring sale in Berlin",
"campaign_type": "PERFORMANCE_MAX",
"daily_budget_micros": 15000000,
"landing_page": "https://example.com/spring",
"keyword_themes": ["spring sale", "discount furniture"],
"geo_targets": ["1003854"],
"headlines": ["Oak dining tables", "Spring sale on now", "Made in Berlin"],
"descriptions": ["Solid oak, built to order.", "Free delivery across Germany this spring."],
"logo_url": "https://storage.base44.com/gads-assets/b7f3a1c8-logo.png",
"images": [
{
"url": "https://storage.base44.com/gads-assets/b7f3a1c8-landscape.png",
"field_type": "MARKETING_IMAGE"
},
{
"url": "https://storage.base44.com/gads-assets/b7f3a1c8-square.png",
"field_type": "SQUARE_MARKETING_IMAGE"
}
]
}
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({
campaign_name: 'Spring sale in Berlin',
campaign_type: 'PERFORMANCE_MAX',
daily_budget_micros: 15000000,
landing_page: 'https://example.com/spring',
keyword_themes: ['spring sale', 'discount furniture'],
geo_targets: ['1003854'],
headlines: ['Oak dining tables', 'Spring sale on now', 'Made in Berlin'],
descriptions: ['Solid oak, built to order.', 'Free delivery across Germany this spring.'],
logo_url: 'https://storage.base44.com/gads-assets/b7f3a1c8-logo.png',
images: [
{
url: 'https://storage.base44.com/gads-assets/b7f3a1c8-landscape.png',
field_type: 'MARKETING_IMAGE'
},
{
url: 'https://storage.base44.com/gads-assets/b7f3a1c8-square.png',
field_type: 'SQUARE_MARKETING_IMAGE'
}
]
})
};
fetch('https://app.base44.com/api/apps/{app_id}/google-ads/campaigns', 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",
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([
'campaign_name' => 'Spring sale in Berlin',
'campaign_type' => 'PERFORMANCE_MAX',
'daily_budget_micros' => 15000000,
'landing_page' => 'https://example.com/spring',
'keyword_themes' => [
'spring sale',
'discount furniture'
],
'geo_targets' => [
'1003854'
],
'headlines' => [
'Oak dining tables',
'Spring sale on now',
'Made in Berlin'
],
'descriptions' => [
'Solid oak, built to order.',
'Free delivery across Germany this spring.'
],
'logo_url' => 'https://storage.base44.com/gads-assets/b7f3a1c8-logo.png',
'images' => [
[
'url' => 'https://storage.base44.com/gads-assets/b7f3a1c8-landscape.png',
'field_type' => 'MARKETING_IMAGE'
],
[
'url' => 'https://storage.base44.com/gads-assets/b7f3a1c8-square.png',
'field_type' => 'SQUARE_MARKETING_IMAGE'
]
]
]),
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"
payload := strings.NewReader("{\n \"campaign_name\": \"Spring sale in Berlin\",\n \"campaign_type\": \"PERFORMANCE_MAX\",\n \"daily_budget_micros\": 15000000,\n \"landing_page\": \"https://example.com/spring\",\n \"keyword_themes\": [\n \"spring sale\",\n \"discount furniture\"\n ],\n \"geo_targets\": [\n \"1003854\"\n ],\n \"headlines\": [\n \"Oak dining tables\",\n \"Spring sale on now\",\n \"Made in Berlin\"\n ],\n \"descriptions\": [\n \"Solid oak, built to order.\",\n \"Free delivery across Germany this spring.\"\n ],\n \"logo_url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-logo.png\",\n \"images\": [\n {\n \"url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-landscape.png\",\n \"field_type\": \"MARKETING_IMAGE\"\n },\n {\n \"url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-square.png\",\n \"field_type\": \"SQUARE_MARKETING_IMAGE\"\n }\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")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"campaign_name\": \"Spring sale in Berlin\",\n \"campaign_type\": \"PERFORMANCE_MAX\",\n \"daily_budget_micros\": 15000000,\n \"landing_page\": \"https://example.com/spring\",\n \"keyword_themes\": [\n \"spring sale\",\n \"discount furniture\"\n ],\n \"geo_targets\": [\n \"1003854\"\n ],\n \"headlines\": [\n \"Oak dining tables\",\n \"Spring sale on now\",\n \"Made in Berlin\"\n ],\n \"descriptions\": [\n \"Solid oak, built to order.\",\n \"Free delivery across Germany this spring.\"\n ],\n \"logo_url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-logo.png\",\n \"images\": [\n {\n \"url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-landscape.png\",\n \"field_type\": \"MARKETING_IMAGE\"\n },\n {\n \"url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-square.png\",\n \"field_type\": \"SQUARE_MARKETING_IMAGE\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/google-ads/campaigns")
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 \"campaign_name\": \"Spring sale in Berlin\",\n \"campaign_type\": \"PERFORMANCE_MAX\",\n \"daily_budget_micros\": 15000000,\n \"landing_page\": \"https://example.com/spring\",\n \"keyword_themes\": [\n \"spring sale\",\n \"discount furniture\"\n ],\n \"geo_targets\": [\n \"1003854\"\n ],\n \"headlines\": [\n \"Oak dining tables\",\n \"Spring sale on now\",\n \"Made in Berlin\"\n ],\n \"descriptions\": [\n \"Solid oak, built to order.\",\n \"Free delivery across Germany this spring.\"\n ],\n \"logo_url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-logo.png\",\n \"images\": [\n {\n \"url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-landscape.png\",\n \"field_type\": \"MARKETING_IMAGE\"\n },\n {\n \"url\": \"https://storage.base44.com/gads-assets/b7f3a1c8-square.png\",\n \"field_type\": \"SQUARE_MARKETING_IMAGE\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "68b1c0d4e7b91d003c45a1f2",
"google_campaign_id": "21098765432",
"campaign_name": "Spring sale in Berlin",
"campaign_type": "PERFORMANCE_MAX",
"status": "ENABLED",
"daily_budget_micros": 15000000,
"landing_page": "https://example.com/spring",
"geo_targets": [
"1003854"
],
"phone_number": "+493012345678",
"review_status": "REVIEWED",
"serving_status": "SERVING",
"primary_status": "ELIGIBLE",
"primary_status_reasons": [
"CAMPAIGN_BUDGET_LIMITED"
],
"created_date": "2026-08-25T11:20:00Z",
"updated_date": "2026-08-25T14:05:00Z",
"learning_ends_at": "2026-09-08T11:20:00Z"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Personal access token, sent as Authorization: Bearer <token>. Each operation lists the permission it needs: read_only or full_access. A full-access token can call every operation. A read-only token can call only the operations that list read_only; anything else returns 403 read_only_credential_route_not_allowed.
Path Parameters
ID of the app to advertise.
Body
Name for the campaign.
Daily budget in micros of the account currency, so 15000000 is 15.00. Google enforces a per-currency minimum and rejects anything below it with a 400.
Which campaign type to create.
PERFORMANCE_MAX URL the ads send clicks to. Google rejects the campaign if it cannot reach this page.
URL of the logo, at least 128×128. Required for a PERFORMANCE_MAX campaign. It follows the same hosting rules as images[].url, but unlike an image a logo Base44 cannot fetch fails the request instead of being left out. A logo that is not square is padded to square.
Marketing images for a PERFORMANCE_MAX campaign. It needs at least one MARKETING_IMAGE and one SQUARE_MARKETING_IMAGE, and Google rejects the campaign without them.
Base44 leaves out an image it cannot fetch, rather than rejecting the request. That includes an address on another host, a file over 5 MB, and one that does not respond. If that leaves a required slot empty, Google rejects the campaign for the missing image. An address that returns something other than an image is rejected outright.
Show child attributes
Show child attributes
Extra links shown under a PERFORMANCE_MAX campaign's ads, up to 20. A row with neither text nor url is dropped, a row with only one of them is rejected, and exact duplicates collapse to one. Each url needs a full domain, such as example.com.
Show child attributes
Show child attributes
Themes to match searches on.
Ad headlines. Google reviews these against its advertising policies.
Ad description lines. Google reviews these against its advertising policies.
Google Ads geo target constant IDs to target.
Business name shown in the ad.
Phone number shown in the ad, as a call asset. It must be in international format with the country code (e.g. +18506168085) — Google needs the country alongside the number, and any other format is rejected with a 400. Omit for no phone.
Long headlines for a PERFORMANCE_MAX campaign, up to 5. Each is shortened to 90 characters without cutting a word. When you send none, the first headline is used. Google reviews these against its advertising policies.
Google Ads geo target constant IDs to keep the ads out of. A location can't be both targeted and excluded.
Search terms the ads must not show for, up to 25, matched exactly. A comma or semicolon splits an entry into separate terms.
A radius around an address to serve within, instead of geo_targets. It can't be combined with geo_targets or advertise_products. With no geo_targets, the campaign counts as reaching the EU, so the request can ask for contains_eu_political_advertising. Available only when radius targeting is enabled for your account; otherwise it returns a 400.
Show child attributes
Show child attributes
Set to custom to run the ads only in the schedule_days windows. Any other value runs them all the time.
When the ads run, used only when schedule_type is custom. Hours are whole hours in the Google Ads account's time zone. Google rejects the campaign for an invalid day or hour.
Show child attributes
Show child attributes
Up to 5 YouTube videos for a PERFORMANCE_MAX campaign, each a YouTube link or an 11-character video ID. To use a video file, upload it with Upload a Google Ads video and pass the ID it returns.
Set to true to advertise the products in the app's product feed on a PERFORMANCE_MAX campaign. The feed must be ready, and it can't be combined with proximity. Available only when product campaigns are enabled for your account; otherwise the request returns a 404.
Product IDs from the feed that the campaign must not advertise, up to 100. They stay in the feed. Only with advertise_products.
Deprecated and not used for targeting. Send keyword_themes.
Deprecated. A single video, added to youtube_videos.
Whether the campaign carries political advertising. Required before an EU advertiser can create a campaign.
Campaign settings. Only language_code is supported. Leave other keys out.
Show child attributes
Show child attributes
Response
Successful Response
The campaign fields this API commits to.
Base44's ID for the campaign. Pass this as campaign_id on the other campaign endpoints.
"68b1c0d4e7b91d003c45a1f2"
The campaign's ID in Google Ads. Empty while a just-created campaign is still being pushed to Google.
"21098765432"
Name shown for the campaign.
"Spring sale in Berlin"
Campaign type. Base44 creates PERFORMANCE_MAX; SMART campaigns are ones it created before Google retired Smart creation on 2026-09-23. The other values appear only on campaigns created outside Base44 and synced in.
SMART, PERFORMANCE_MAX, SEARCH, DISPLAY, SHOPPING, VIDEO, DEMAND_GEN, LOCAL, UNKNOWN "PERFORMANCE_MAX"
Serving state in Base44's cache. A status of REMOVED is a deleted campaign, which Google keeps for reporting.
ENABLED, PAUSED, REMOVED, UNKNOWN "ENABLED"
Daily budget in micros of the account currency, where 1,000,000 micros is one unit, so 15000000 is 15.00.
15000000
URL the ads send clicks to.
"https://example.com/spring"
Google Ads geo target constant IDs the campaign targets.
["1003854"]
Campaign phone number in E.164, empty when the campaign has none. Both channel types store the normalized form Google holds: a call asset on PERFORMANCE_MAX, smartCampaignSettings.phone_number on SMART.
"+493012345678"
Google's policy review status, passed through as Google reports it (REVIEWED, UNDER_REVIEW, …). Empty until the first sync after creation.
"REVIEWED"
Google's serving status, passed through as Google reports it. Can still report review gating after policy review clears, so read it alongside review_status.
"SERVING"
Google's summary of whether the campaign is serving well, passed through as Google reports it (ELIGIBLE, LIMITED, NOT_SERVING, …).
"ELIGIBLE"
Google's reasons behind primary_status, for example why a campaign is limited. Empty when there is nothing to explain.
["CAMPAIGN_BUDGET_LIMITED"]
When the campaign was created in Base44.
"2026-08-25T11:20:00Z"
When Base44 last changed its record of the campaign.
"2026-08-25T14:05:00Z"
When Smart Bidding's learning period is expected to end, about 14 days after creation, or null on a campaign that has not started learning.
"2026-09-08T11:20:00Z"
Was this page helpful?