curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/billing/debt \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/billing/debt"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/billing/debt', 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}/billing/debt",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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}/billing/debt"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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/accounts/{account_id}/billing/debt")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/billing/debt")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"state": "payable",
"account_id": "68b1c0d4e7b91d003c45a1f8",
"account_status": "BLOCKED",
"charge_trigger_mode": "cadence",
"recoverable": true,
"can_pay_now": true,
"requires_payment_method": false,
"stripe_unavailable": false,
"block_reason": "PAYMENT_FAILED",
"payment_method": {
"brand": "visa",
"last4": "4242"
},
"invoice": {
"id": "68b1c0d4e7b91d003c45a1fa",
"status": "FAILED",
"billing_type": "weekly",
"period_start": "2026-08-18",
"period_end": "2026-08-24",
"amount_micros": 43500000,
"currency_code": "USD",
"failed_at": "2026-08-25T04:12:00Z"
}
}Get Google Ads account debt
Returns what one of the app’s Google Ads accounts owes for ad spend, and whether it can be settled.
This is the per-account view of Get Google Ads workspace debt, with the same fields apart from app_id. Use that endpoint when you only know the workspace is on a hold. It finds the held account from any app, while this one only reads an account that belongs to the app in the path. Read state first. An account that is not held reports not_recoverable.
Nothing here charges anything. Settling a balance is a card transaction Base44 keeps out of this API, so treat a payable state as something to raise with whoever owns the card. Each call checks the card on file with the payment provider, and the first call for a workspace with no billing record there creates one.
This is limited to 30 requests a minute per app. Some workspaces have a different limit.
curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/billing/debt \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/billing/debt"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/billing/debt', 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}/billing/debt",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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}/billing/debt"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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/accounts/{account_id}/billing/debt")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/google-ads/accounts/{account_id}/billing/debt")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"state": "payable",
"account_id": "68b1c0d4e7b91d003c45a1f8",
"account_status": "BLOCKED",
"charge_trigger_mode": "cadence",
"recoverable": true,
"can_pay_now": true,
"requires_payment_method": false,
"stripe_unavailable": false,
"block_reason": "PAYMENT_FAILED",
"payment_method": {
"brand": "visa",
"last4": "4242"
},
"invoice": {
"id": "68b1c0d4e7b91d003c45a1fa",
"status": "FAILED",
"billing_type": "weekly",
"period_start": "2026-08-18",
"period_end": "2026-08-24",
"amount_micros": 43500000,
"currency_code": "USD",
"failed_at": "2026-08-25T04:12:00Z"
}
}Authorizations
Personal access token, sent as Authorization: Bearer <token>.
Path Parameters
ID of the app whose Google Ads campaigns to manage.
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 403.
Response
What the account owes, and whether it can be settled.
Whether one Google Ads account owes anything, and whether it can be settled.
What can be done about the balance. payable means there is an invoice and a usable card. requires_payment_method and requires_payment_refresh both mean a card is needed. pending_payment means a charge is already in flight. paid_recovery_incomplete means the invoice is paid but the account is still held. unavailable means the balance cannot be settled right now, including when stripe_unavailable is true. no_debt means the account is held with nothing to settle, and not_recoverable means the account is not in a state that settling can fix, which includes an account that is not held at all.
"payable"
ID of the Google Ads account, the one in the path.
"68b1c0d4e7b91d003c45a1f8"
Status of the Google Ads account.
"BLOCKED"
How the account is billed. cadence is the recurring charge and threshold is spend-triggered.
"cadence"
Whether the account is in a state Base44 can settle at all (true) or not (false).
true
Whether there is a chargeable invoice and a usable card, so settling would go through now (true) or not (false).
true
Whether a card has to be added or replaced before the balance can be settled (true) or not (false).
false
Whether Base44 could not reach the payment provider (true) or reached it fine (false). When it is true the card check failed closed, so payment_method reads null and can_pay_now reads false because the check failed, not because the card is missing. Retry rather than telling someone to add a card.
false
Why the account is held, or null when it is not held or the reason is unrecorded.
"PAYMENT_FAILED"
The card on file, or null when the workspace has none and when the payment provider could not be reached.
Show child attributes
Show child attributes
The unpaid invoice behind the hold, or null when there is none to settle and when the latest one is already paid.
Show child attributes
Show child attributes
Was this page helpful?