Paid-media campaign lifecycle
Erdo can read a connected ad account in full — campaigns, spend, status, keywords — and it can also act on a campaign: pause it, enable it, or change its daily budget. The lifecycle endpoints expose exactly those three actions over/v1 (and the matching MCP tools), so an external product or script can
drive a decision the evidence argues for instead of someone performing it by
hand in the provider’s console.
Every lifecycle call goes through the same approval gate that governs
agent-proposed changes. There is one gated path into a customer’s ad account,
not two: the /v1 call files the very action an agent’s tool would file — same
action key, same input, same deduplication — and a caller with an API key is
never more trusted than an agent.
Supported providers: google_ads. Any other provider is rejected with an
unimplemented error rather than silently ignored.
The two outcomes
What happens depends on whether your organization has granted a standing always-approve policy for the action (the same standing grant you create by choosing “always allow” when deciding an agent’s approval):-
No standing policy — propose. The call does not touch the provider.
It files a pending approval request and returns
status: "pending_approval"with theapproval_request_id— accepted, not performed (202 semantics, expressed in the body). The approval appears in the activity feed and onGET /v1/approvals, stamped withsubject_resource_type: "paid_media_campaign"and the campaign’s external id so you can list everything awaiting decision about one campaign. When a human approves it — feed, CLI, orPOST /v1/approvals/{id}/decide— the exact stored action executes, under the approver’s identity. A rejection is terminal and nothing reaches the provider. -
Standing policy — execute. The call executes immediately through the same
integration handler an agent-run approval would execute, and returns
status: "executed"with the provider’s result.
Set campaign status
externalID(path) — the provider’s campaign id.provider—google_ads.customer_id— the provider account the campaign belongs to (campaign ids are only unique within an account). Required.status—pausedorenabled. Removal is deliberately not exposed: deleting a campaign is destructive, not lifecycle.reason(optional) — shown on the approval card as the why beside the what, so the approver reads the evidence, not just the action.
Set campaign daily budget
daily_budget_micros— the new daily budget in micros of the account currency (50000000= $50.00). Must be positive.
Response
Following up on a pending action
List what is awaiting decision about one campaign:always_org, with parameter constraints)
creates the standing policy that makes subsequent identical calls execute
immediately — see Approvals and Autonomy.
What a new campaign starts with
When Erdo builds a paid-search campaign for you it does not start from a blank sheet. Two things go in before the first click is bought — one of them learned about your kind of business, the other read from your own account:- Exclusions. A library of search terms a business in your vertical should never pay for — someone looking to rent when you are selling, someone price-fishing well below your offer, someone searching a different product class entirely. It is grouped by vertical and by language, so a campaign running Spanish and Portuguese angles gets the Spanish and Portuguese exclusions too: a new-development condo tower selling in Miami excludes rental intent in all three languages from day one, because that is the single biggest source of wasted clicks in that market. These are on top of, not instead of, what your own campaigns have already learned — a new campaign inherits the exclusions your existing campaigns already carry. Once it is running, the traffic quality monitor tells you when off-offer traffic is climbing, and the exclusions that answer it are proposed for your approval like any other change to your account.
- Cost expectations, taken from your own account. A new campaign needs an expected conversion rate to know whether its budget is big enough to ever accumulate the conversions Google’s bidding needs to learn from. Erdo establishes that from your history — your other campaigns matched on the same offer, audience geography and language, and the leads they actually produced — and says in the plan which of your campaigns it read and how many clicks and conversions sit behind the figure. Where you have no comparable history, your first campaign in a new language for instance, it plans on a deliberately conservative standing assumption and labels it as an assumption rather than a measurement. Either way, once you have roughly 30 conversions of your own, the plan is re-made on your measured rate, because a rate you have measured always outranks an assumption.
MCP tools
The same capability is available as MCP tools:erdo_set_paid_media_campaign_status— provider, customer id, campaign id,paused/enabled, optional reason.erdo_set_paid_media_campaign_budget— provider, customer id, campaign id, daily budget in micros, optional reason.

