curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/retry-billing-setup \
--header 'api_key: <api-key>'import requests
url = "https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/retry-billing-setup"
headers = {"api_key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {api_key: '<api-key>'}};
fetch('https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/retry-billing-setup', 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/accounts/{account_id}/retry-billing-setup",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
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/accounts/{account_id}/retry-billing-setup"
req, _ := http.NewRequest("POST", 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.post("https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/retry-billing-setup")
.header("api_key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/retry-billing-setup")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["api_key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "68b1c0d4e7b91d003c45a1f8",
"account_name": "Nordwind Furniture",
"google_customer_id": "1234567890",
"status": "ACTIVE",
"currency_code": "EUR",
"timezone": "Europe/Berlin",
"budget_active": true,
"billing_cadence": "1w",
"charge_trigger_mode": "cadence",
"monthly_spend_cap_micros": 500000000,
"auto_renew": true,
"business_profile_location_id": "locations/12345",
"created_date": "2026-08-25T11:20:00Z",
"updated_date": "2026-08-25T14:05:00Z",
"budget_window_end": "2026-09-30T23:59:59Z",
"terms_accepted_at": "2026-08-25T11:20:00Z"
}Retry Google Ads billing setup
Retries the Google Ads billing setup for an account whose first attempt failed.
Use this when the account is stuck in PENDING_BILLING_SETUP. It returns the account, so read status on the response to see whether the retry moved it on. A retry that fails again leaves the account where it was rather than erroring.
This needs a payment method on the workspace, and the workspace must not be on a billing hold.
curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/retry-billing-setup \
--header 'api_key: <api-key>'import requests
url = "https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/retry-billing-setup"
headers = {"api_key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {api_key: '<api-key>'}};
fetch('https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/retry-billing-setup', 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/accounts/{account_id}/retry-billing-setup",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
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/accounts/{account_id}/retry-billing-setup"
req, _ := http.NewRequest("POST", 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.post("https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/retry-billing-setup")
.header("api_key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/retry-billing-setup")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["api_key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "68b1c0d4e7b91d003c45a1f8",
"account_name": "Nordwind Furniture",
"google_customer_id": "1234567890",
"status": "ACTIVE",
"currency_code": "EUR",
"timezone": "Europe/Berlin",
"budget_active": true,
"billing_cadence": "1w",
"charge_trigger_mode": "cadence",
"monthly_spend_cap_micros": 500000000,
"auto_renew": true,
"business_profile_location_id": "locations/12345",
"created_date": "2026-08-25T11:20:00Z",
"updated_date": "2026-08-25T14:05:00Z",
"budget_window_end": "2026-09-30T23:59:59Z",
"terms_accepted_at": "2026-08-25T11:20:00Z"
}Authorizations
Personal API key.
Path Parameters
ID of the app to advertise.
ID of the Google Ads account, as returned in id by Get Google Ads account. An account that belongs to a different app returns a 404.
Response
Successful Response
The account fields this API commits to.
Base44's ID for the account. Pass it as account_id on the other account endpoints.
"68b1c0d4e7b91d003c45a1f8"
Name of the Google Ads account.
"Nordwind Furniture"
The account's customer ID in Google Ads. Empty until Google has provisioned it.
"1234567890"
State of the account. Either ACTIVE, BLOCKED, SUSPENDED, BILLING_HOLD, CANCELED, PENDING_VERIFICATION, PENDING_BILLING_SETUP, or PENDING_CLOSE. Only an ACTIVE account can create or resume campaigns.
"ACTIVE"
Currency the account bills in, as an ISO 4217 code.
"EUR"
Time zone the account reports in, as an IANA name.
"Europe/Berlin"
Whether the account has a live Google Ads budget, which campaigns need in order to serve.
true
How often the account is charged: 3d, 1w, 2w, or 1m. Only drives charging when charge_trigger_mode is cadence.
"1w"
What triggers a charge on this account. A mode of cadence charges on the billing_cadence schedule, while threshold is a legacy mode that charges when spend crosses a ladder of thresholds and ignores billing_cadence entirely.
"cadence"
Monthly spend cap in micros of the account currency, so 500000000 is 500.00. The value is 0 when no cap is set.
500000000
Whether the account's budget renews automatically at the end of its window.
true
Google Business Profile location linked to the account, as locations/<id>. Empty when none is linked.
"locations/12345"
When the account was created in Base44.
"2026-08-25T11:20:00Z"
When Base44 last changed its record of the account.
"2026-08-25T14:05:00Z"
When the current budget window ends, or null before a budget exists.
"2026-09-30T23:59:59Z"
When the Google Ads terms were accepted for this account, or null until they are.
"2026-08-25T11:20:00Z"
Was this page helpful?