curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/google-ads/tracking-scan \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/google-ads/tracking-scan"
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/tracking-scan', 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/tracking-scan",
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/tracking-scan"
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/tracking-scan")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/google-ads/tracking-scan")
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{
"gaps": [],
"mappings_count": 3,
"calls_count": 0,
"is_clean": false,
"enabled_mappings_count": 2,
"skipped_reason": "no_google_ads_account"
}Scan Google Ads conversion tracking
Cross-references the app’s conversion mappings against the conversion calls in its code, and reports what does not line up.
Each entry in gaps names one problem. An error is a mapped conversion that cannot fire, and a warning is a setup that works but probably is not what you meant, such as a disabled mapping or code firing a goal no mapping points at. A missing-call- gap also carries a composer_prompt you can hand to Send chat message to have the AI write the fix.
missing-call- gap. Publish the app, then scan again.is_clean is true when nothing was scanned, so read skipped_reason first. An app with no Google Ads account comes back with is_clean set to true, no gaps, and skipped_reason set to no_google_ads_account, which is not a clean bill of health. That response also omits enabled_mappings_count.curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/google-ads/tracking-scan \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/google-ads/tracking-scan"
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/tracking-scan', 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/tracking-scan",
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/tracking-scan"
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/tracking-scan")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/google-ads/tracking-scan")
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{
"gaps": [],
"mappings_count": 3,
"calls_count": 0,
"is_clean": false,
"enabled_mappings_count": 2,
"skipped_reason": "no_google_ads_account"
}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 whose Google Ads conversion tracking you want to manage.
Response
What the scan found.
What the conversion-tracking scan found.
Everything the scan flagged. Empty when it found nothing and when it did not run, which skipped_reason tells apart.
Show child attributes
Show child attributes
[]
How many conversion mappings the account has, enabled or not.
3
How many gtag conversion calls with a literal send_to the scan found in the app's code.
0
Whether the scan flagged no error-severity gap (true) or at least one (false). It also reads true when the scan did not run at all, so check skipped_reason first.
false
How many of the mappings are enabled. Absent when skipped_reason is set.
2
Why nothing was scanned. The value is no_google_ads_account when the app has no active Google Ads account, app_not_found, or app_code_unreadable when the app's code is only readable from its published version and Base44 could not read one, for example because the app was never published. The field is absent whenever a scan ran.
"no_google_ads_account"
Was this page helpful?