Ad accounts
Everything else about paid media is readable without this endpoint — you can already list an organization’s campaigns, read their spend, and see the provider ids a workstream governs. What none of that gives you is the one field every one of those reads and every paid-media lifecycle call needs first: the provider’s own account id. A Google Ads query, a status change, a budget change — every one of them takes an account id as its first argument, and until this endpoint nothing published one. You could see the campaigns; you could not run a single query against them.GET /v1/ad-accounts closes that gap. It asks each of your connected ad integrations to list the
accounts it can reach, the same way the integration’s own agent tools would, and returns them in one
shape regardless of provider.
What comes back
Manager accounts return empty, not an error
is_manager is the field worth reading before you use an id, not after something goes wrong. A
manager (MCC) account administers other accounts and holds no campaigns of its own, so a query aimed
at one — spend, keywords, a status change — comes back empty rather than failing. That reads as
“this account has no advertising,” which is the most misleading answer available: it looks like a
finding about the campaigns rather than a mistake about the address.
It’s also the ordinary shape here, not an edge case. Erdo provisions managed developments as
sub-accounts under a manager — Northline Residences’s campaigns live under the Erdo AI manager account shown
above — so an organization’s first account in this list is very often a manager whose id looks just
as valid as the operating account underneath it. To make picking correctly the default, operating
accounts sort first; a manager comes only after every operating account, and only if the
organization has no operating accounts is a manager listed alone. A caller that just takes the first
entry takes one it can actually query.
Selecting a manager when you connect is a different matter, and does not change this one: it widens
which accounts the connection may operate — see below — but a manager still holds no campaigns of its
own, so the ids you actually query are its clients’.
(This is a different “manager” from Erdo’s own manager accounts, which is about
one Erdo organization operating several client organizations. Same word, two unrelated hierarchies —
a Google Ads MCC never implies anything about who administers your Erdo org, and vice versa.)
Choosing an account under a manager
is_manager says what a query against an id will find. Which account your connection is for is a
separate question, answered when you connect, and the two meet here.
Connecting Google Ads lists the accounts that login reaches — including the ones it can only see
through a manager — and asks which account the connection is for. An account reached that way is
labelled as such, Northline Residences (via Erdo AI), and picking it records both halves: the
account the connection operates, and the manager it is operated through. Every request the connection
makes then carries that manager as its context, which is what Google requires before it will answer
for a client account at all. The token cannot supply this — a login that reaches several accounts
cannot say which manager you meant — so the account you picked is where it comes from, and picking an
account listed directly (no manager in the label) records the account as its own context.
Picking the manager itself is a deliberate, different choice. A manager holds no campaigns, so a
connection that could only address the account it selected would have nothing to do. Such a
connection instead operates every client under that manager: list_google_ads_accounts returns
the manager’s clients alongside the manager, each carrying via_manager to say which manager it was
reached through, with operating accounts first as always. Any of those ids can be passed as
customer_id to a read or a lifecycle call — Erdo confirms the account really is
under the selected manager, then sends the request in that manager’s context.
A manager connection cannot feed a dataset, though: a manager holds no data of its own, so datasets
cannot sync from it, and Erdo refuses to rather than sync nothing. The account picker badges a manager
as Manager and says so when you pick it — to sync data, choose one of the client accounts beneath
it instead, listed like Northline Residences (via Erdo AI).
An id outside that hierarchy is refused, and that refusal is what the choice buys. A connection that
selected one client account operates that account; a connection that selected a manager operates the
accounts under it; neither reaches the rest of what the login happens to see. The refusal names the
id and points at the account list, because the accounts a connection can operate are exactly what
that list returns.
Don’t connect a manager account to stand in for your own. If your login can also see an
agency’s manager account, its clients include other advertisers. A connection on that manager reaches
all of them. A manager organization operating its own clients is exactly what that’s for (see
manager accounts), but an organization connecting one because it has no account
yet gains reach it should never have. If your organization has no Google Ads account yet, ask the
organization that manages yours to adopt it and create one for you under its manager.
When you assign a different operating Google Ads account to a connection, Erdo
checks whether another organization already operates it. If it does, choose an
account of your organization’s own; two advertisers sharing one account can
interfere with each other’s bidding. A concurrent assignment returns a retryable
error. Existing account selections and credential refreshes remain available,
including on older shared connections.
Unavailable providers
unavailable names a connected provider whose accounts could not be listed, and why — an expired or
revoked token, most often. This is deliberately kept apart from an organization simply having no ad
accounts: a provider that has never been connected is not reported here at all, because “you have no
Meta Ads accounts because you have no Meta Ads” is not a finding, it’s the absence of one. But a
provider you did connect going quiet must not just make ad_accounts shorter — a caller comparing
this list against campaigns it can already see would otherwise conclude the account had been
disconnected, when the real problem is a token that needs reconnecting.
Two businesses in one account collide silently
An ad account is meant to hold one advertiser, and when it holds two, nothing tells you. Google serves at most one ad per account per auction, so two campaigns in the same account bidding on the same query are not competing with the market — they are taking each other’s impressions, and the account-level totals still look healthy. Separately, a campaign optimises toward every account-level primary conversion action unless it is pinned to its own goal, so a campaign selling one thing can spend against the conversions of everything else in the account. Because neither shows up as an error, Erdo states them where the decision is made rather than leaving them to be found later:- When a lead-generation campaign is created,
conversion_action_idsputs it on the development’s campaign-scoped form-open-only launch goal, shared by campaigns and ad groups with that approved policy. Submitted-lead, phone-tap and qualified-lead actions remain in the measurement inventory but outside the launch bidding goal. A new country, language or theme does not need a new action. Fresh launches use this custom goal even in a single-development account; an existing campaign can retain explicitly approved account goals. Without the intended goal, an account may include other businesses’ primary actions. Erdo reports only what it can verify within your access; hidden goal details remain unknown, and another business’s action names are not exposed. - When a campaign is enabled, and when a keyword is added, the result names every other enabled campaign in the same account already bidding on the same keywords. These are warnings, not refusals: overlap is sometimes deliberate, and the change is approval-gated already.
inherit_negative_keywords_from_campaign_idscopies the negative keywords sibling campaigns already carry onto a new one, so a campaign does not launch without the junk filter the rest of its family has.
What an organization can read in an account it shares
When an agency hosts several of its clients in one Google Ads account, each client organization sees only its own campaigns there. Erdo binds every Google Ads read that organization makes, from the campaign and keyword tools, ad-hoc GAQL and the monitors, to the campaigns recorded as its own. Campaigns Erdo creates for the organization are recorded automatically. The agency’s own manager organization still reads the whole account. Three things follow:- Reports, monitors and chat answers cover your campaigns only. Overlap warnings at enable and keyword-add compare your campaigns with each other, not with another organization’s.
- A synced Google Ads dataset on a shared account has to be scoped to your own campaigns. A dataset that would load the whole account is refused, and an existing one is paused with a note in your feed explaining how to scope it. Nothing is deleted.
- Data-analysis code is not given that connection’s credentials, because a script holding the raw token could read the whole account. Use the Google Ads tools or the synced dataset instead.
Timezone decides where “yesterday” falls
time_zone is the account’s own reporting timezone, and it matters the moment you compare this
account against a daily figure. A provider’s “yesterday” is yesterday in that account’s timezone,
not the caller’s and not UTC — the same reason a scheduled action
lets you set an explicit timezone rather than defaulting silently. Read it here before joining
anything to a day boundary.
Reading it
REST
erdo_list_ad_accounts returns the same list, so an agent can pick an operating
account for itself before running a provider query rather than guessing at an id.
Feeding other calls
This is a lookup step, not a destination — theaccount_id it returns is what you pass as
customer_id everywhere else that asks for one.
A scheduled action’s steps run against a specific provider account:
1234567890 is the account_id this endpoint returned for Northline Residences — not the
5302012239 beside it, which is the manager and holds no campaigns to query, pause, or re-budget.
Related
Paid-media campaign lifecycle
Pause, resume, or re-budget a campaign in the account this endpoint names.
Scheduled actions
Declare reads and judgements that run against an account on a clock.
Manager accounts
Erdo’s own manager/managed-organization hierarchy — a different “manager” from the one this page reports.
Page tracking
The equivalent read for what’s tagging your pages, rather than what you can advertise from.

