curl --request GET \
--url https://api.erdo.ai/v1/managed-organizations/{orgSlug}/ads-container \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.erdo.ai/v1/managed-organizations/{orgSlug}/ads-container"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.erdo.ai/v1/managed-organizations/{orgSlug}/ads-container', 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://api.erdo.ai/v1/managed-organizations/{orgSlug}/ads-container",
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://api.erdo.ai/v1/managed-organizations/{orgSlug}/ads-container"
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://api.erdo.ai/v1/managed-organizations/{orgSlug}/ads-container")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/managed-organizations/{orgSlug}/ads-container")
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{
"adopted": true,
"already_provisioned": true,
"billing_configured": true,
"billing_status": "<string>",
"customer_id": "<string>",
"descriptive_name": "<string>",
"integration_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"login_customer_id": "<string>",
"org_slug": "<string>",
"previous_campaign_count": 123,
"previous_customer_id": "<string>"
}{
"code": "not_found",
"details": {},
"message": "<string>"
}GetManagedOrganizationAdsContainerAPI reports the Google Ads container a
managed org already has under your MCC, and creates nothing. The POST above answers the same question, but only by being willing to provision — so a portal refreshing an org’s billing status, or checking whether a container exists before offering to create one, had to send a create-capable request to find out. 404 means the org has no container under this manager. Deliberately no MCP tool, for the same reason its sibling has none (see the file header): the pair belongs to the same capability and splitting them across surfaces would make the read look like a different feature from the write.
curl --request GET \
--url https://api.erdo.ai/v1/managed-organizations/{orgSlug}/ads-container \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.erdo.ai/v1/managed-organizations/{orgSlug}/ads-container"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.erdo.ai/v1/managed-organizations/{orgSlug}/ads-container', 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://api.erdo.ai/v1/managed-organizations/{orgSlug}/ads-container",
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://api.erdo.ai/v1/managed-organizations/{orgSlug}/ads-container"
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://api.erdo.ai/v1/managed-organizations/{orgSlug}/ads-container")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/managed-organizations/{orgSlug}/ads-container")
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{
"adopted": true,
"already_provisioned": true,
"billing_configured": true,
"billing_status": "<string>",
"customer_id": "<string>",
"descriptive_name": "<string>",
"integration_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"login_customer_id": "<string>",
"org_slug": "<string>",
"previous_campaign_count": 123,
"previous_customer_id": "<string>"
}{
"code": "not_found",
"details": {},
"message": "<string>"
}Authorizations
An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).
Path Parameters
Response
Success response
existed under the manager's MCC (named by the request's customer_id) and was connected rather than created.
delegated connection under this manager's MCC, which was returned instead of creating a second sub-account.
setup, which is what decides whether it can serve. A container is created with none: Google's BillingSetupService can only attach one programmatically for customers on monthly invoicing, so until the MCC is approved for that, somebody has to link a payments profile in the Google Ads UI. Saying so here is the difference between a known remaining step and one discovered at go-live, when the campaigns are built and nothing serves.
APPROVED_HELD, CANCELLED. Two values are ours rather than Google's: "none" when the account has no billing setup at all, and "unknown" when the check itself could not be made. Those are different facts and a caller gating go-live must not read the second as the first — an unreadable answer is a reason to go and look, not evidence of absence.
under the manager's MCC).
Empty when AlreadyProvisioned: Erdo does not store Google's display name, and re-reading it would put a Google call on the idempotent path.
the id every request against CustomerID is sent in the context of.
carrying — the size of the rebuild. Zero means the account it superseded had nothing in it, which is why no consent was needed to supersede it.
already operating when this container was provisioned, if it was operating one. That account is where its campaigns still are — nothing moved them, and no connection in the org resolves it any more.

