curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/{campaign_id} \
--header 'api_key: <api-key>'import requests
url = "https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/{campaign_id}"
headers = {"api_key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {api_key: '<api-key>'}};
fetch('https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/{campaign_id}', 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/{campaign_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/{campaign_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("api_key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/{campaign_id}")
.header("api_key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/{campaign_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["api_key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "68b1c0d4e7b91d003c45a1f2",
"google_campaign_id": "21098765432",
"campaign_name": "Spring sale in Berlin",
"campaign_type": "SMART",
"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"
}Get Google Ads campaign
Returns one campaign, with the status fields Google reports for it.
Use this for a single campaign’s current state. It reads the same cache as List campaigns and additionally folds in a live check of whether Google has disapproved the campaign’s assets, so a rejected Performance Max campaign shows up here.
curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/{campaign_id} \
--header 'api_key: <api-key>'import requests
url = "https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/{campaign_id}"
headers = {"api_key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {api_key: '<api-key>'}};
fetch('https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/{campaign_id}', 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/{campaign_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/{campaign_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("api_key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/{campaign_id}")
.header("api_key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/{campaign_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["api_key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "68b1c0d4e7b91d003c45a1f2",
"google_campaign_id": "21098765432",
"campaign_name": "Spring sale in Berlin",
"campaign_type": "SMART",
"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"
}Authorizations
Personal API key.
Path Parameters
ID of the app whose Google Ads campaigns to manage.
Base44's ID for the campaign, as returned in id by List campaigns. This is not the Google Ads campaign ID, which is reported separately as google_campaign_id.
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 SMART and PERFORMANCE_MAX. The other values appear only on campaigns created outside Base44 and synced in.
SMART, PERFORMANCE_MAX, SEARCH, DISPLAY, SHOPPING, VIDEO, DEMAND_GEN, LOCAL, UNKNOWN "SMART"
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, empty when the campaign has none. E.164 on PERFORMANCE_MAX (where it is a call asset); as typed 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?