All integrations

Google Ads

MARKETING · MARKETING

Campaigns, ad groups, keywords, and budgets in their own Ads account.

Acts as the person, not as itself

Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.

Credentials never touch the agent

Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.

Every call on the record

Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.

What an agent can do

Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.

google_ads_add_ad_group_labelWRITE

Attach an existing label to an ad group. Purely organizational.

labels:write
google_ads_add_campaign_labelWRITE

Attach an existing label to a campaign. Purely organizational.

labels:write
google_ads_add_keywordsWRITE

Add up to 100 keywords to one ad group in a single batch. EVERY KEYWORD IS ADDED PAUSED — google_ads_enable_keyword is the separate step that starts it matching searches and buying clicks. cpc_bid_micros applies to every keyword in the batch and is the most each will pay for one click; omit it to inherit the ad group's bid.

keywords:write
google_ads_add_negative_keywordsWRITE

Add up to 100 negative keywords to a campaign, stopping it matching those searches. THIS IS THE SPEND-REDUCING WRITE and it takes effect immediately. Feed it from google_ads_list_search_terms.

keywords:write
google_ads_add_shared_criteriaWRITE

Add up to 100 negative keywords to a shared set. Every campaign the set is attached to stops matching them.

keywords:write
google_ads_apply_recommendationWRITE

Apply one of Google's recommendations. WHAT THIS DOES DEPENDS ENTIRELY ON THE RECOMMENDATION: a CAMPAIGN_BUDGET recommendation raises a budget, a TARGET_CPA_OPT_IN changes the bidding strategy, a KEYWORD adds keywords. Read it with google_ads_list_recommendations and check its type and its cost impact first. Google publishes no un-apply.

recommendations:apply
google_ads_attach_ad_group_assetWRITE

Attach an existing asset to one ad group, overriding what the campaign attaches for that field type.

assets:write
google_ads_attach_asset_group_assetWRITE

Put an existing asset into a Performance Max asset group in a given field type. This is how a PMax asset group's ad strength is improved.

assets:write
google_ads_attach_campaign_assetWRITE

Attach an existing asset to a campaign in a given field type, e.g. a sitelink or a callout. The asset begins showing with that campaign's ads once Google approves it.

assets:write
google_ads_attach_shared_setWRITE

Attach a shared negative list to a campaign, so the campaign stops matching everything in it. Spend-reducing.

keywords:write
google_ads_create_account_budget_proposalWRITE

Propose an ACCOUNT-level budget: a ceiling on what this whole account may be invoiced for between two dates. proposed_spending_limit_micros is REQUIRED — an account budget with no ceiling is exactly the unbounded-spend case Agentic Fabriq refuses to ship. The proposal must still be approved by Google; read it back with google_ads_list_account_budget_proposals.

billing:write
google_ads_create_adWRITE

Create a responsive search ad in an ad group. ALWAYS CREATED PAUSED — google_ads_enable_ad is the separate step that starts it serving. Google requires at least 3 headlines (30 characters each) and 2 descriptions (90 characters each); it will reject fewer. The landing page in final_urls is the customer's own and Agentic Fabriq never chooses it.

ads:write
google_ads_create_ad_groupWRITE

Create an ad group inside a campaign. ALWAYS CREATED PAUSED — google_ads_enable_ad_group is the separate step that starts it serving. cpc_bid_micros is the most this ad group will pay for one click; omit it to inherit the campaign's bidding strategy.

adgroups:write
google_ads_create_ad_group_bid_modifierWRITE

Add an ad-group-level bid multiplier for a device type, e.g. bid 1.3x on mobile. bid_modifier is bounded to 0.1-10.0.

bidding:write
google_ads_create_asset_groupWRITE

Create an asset group inside a Performance Max campaign. ALWAYS CREATED PAUSED. An asset group with too few assets will not serve; read ad_strength back with google_ads_list_asset_groups.

assets:write
google_ads_create_audienceWRITE

Create an audience from existing user lists. Creating one changes nothing about delivery until it is used as a targeting criterion.

audiences:write
google_ads_create_bidding_strategyWRITE

Create a bidding strategy campaigns can share. Every type here requires the target it is defined by — a strategy with no target is the unbounded-bid case Agentic Fabriq does not ship. Creating a strategy spends nothing until a campaign is attached to it.

bidding:write
google_ads_create_campaignWRITE

Create a campaign against an existing budget. IT IS ALWAYS CREATED PAUSED and there is no argument that changes that — starting it costs money, so that is a second, separately-granted, confirmation-gated step (google_ads_enable_campaign). Supply the budget's resource name from google_ads_list_campaign_budgets or create one first.

campaigns:write
google_ads_create_campaign_bid_modifierWRITE

Add a campaign-level bid multiplier for an interaction type, e.g. bid 1.2x on calls. bid_modifier is bounded to 0.1-10.0 in the schema and in the connector.

bidding:write
google_ads_create_campaign_budgetWRITE

Create a DAILY budget a campaign can spend against. amount_micros is REQUIRED and is the ceiling: it is what Google may spend per day, in micros of the account currency (1,000,000 micros = 1 unit, so 50 dollars a day is 50000000). Creating a budget spends nothing on its own — nothing is charged until a campaign referencing it is enabled.

budgets:write
google_ads_create_campaign_criterionWRITE

Add one campaign-level targeting criterion or exclusion: a location, a language, or a negative keyword that applies to the whole campaign. Use google_ads_suggest_geo_target_constants to find a location id.

campaigns:write
google_ads_create_campaign_draftWRITE

Create a private draft copy of a campaign. Nothing about the live campaign changes and the draft spends nothing; it exists so changes can be made and then either promoted onto the original or run as an experiment.

experiments:write
google_ads_create_campaign_groupWRITE

Create a campaign group for organizing campaigns in reporting. Changes nothing about delivery or spend.

campaigns:write
google_ads_create_conversion_actionWRITE

Create a new conversion action. What an account counts as a conversion is what every automated bidding strategy in it optimizes toward, so this is a bidding change wearing a measurement hat. Created ENABLED because a conversion action that is not enabled records nothing and is therefore inert — it cannot spend money.

conversions:write
google_ads_create_conversion_custom_variableWRITE

Create a custom variable that uploaded conversions can carry, for example a deal stage or a product line. Additive and inert until an upload sets it.

conversions:write
google_ads_create_customer_clientWRITE

Create a brand-new Google Ads account underneath this manager (MCC) account, with a name, currency and time zone. IRREVERSIBLE THROUGH THE API: Google publishes no way to delete an account — only a person can cancel one in the Google Ads UI. Requires a developer token with Basic access or above; Explorer access cannot reach account creation at all.

account:write
google_ads_create_experimentWRITE

Create a campaign experiment. Created in SETUP status and running nothing until google_ads_schedule_experiment starts it, so this spends nothing on its own.

experiments:write
google_ads_create_experiment_armWRITE

Add an arm to an experiment: the control arm names the existing campaign, the treatment arm gets a copy. traffic_split is the percentage of traffic this arm receives and the two arms must sum to 100.

experiments:write
google_ads_create_image_assetWRITE

Create a reusable image asset from IMAGE BYTES, supplied base64-encoded. Deliberately NOT from a URL: an operation that takes a URL Agentic Fabriq then fetches is a server-side request forgery sink, and no image asset is worth one.

assets:write
google_ads_create_labelWRITE

Create a label that can then be attached to campaigns, ad groups and ads. Labels change nothing about delivery or spend.

labels:write
google_ads_create_shared_setWRITE

Create a reusable negative-keyword or negative-placement list. Empty until google_ads_add_shared_criteria puts members in it, and inert until google_ads_attach_shared_set attaches it to a campaign.

keywords:write
google_ads_create_text_assetWRITE

Create a reusable text asset — a headline, description, callout or structured snippet — that can then be attached to a campaign, ad group or asset group. Creating one changes nothing about delivery.

assets:write
google_ads_create_user_listWRITE

Create a RULE-BASED remarketing list — one that fills itself from site traffic matching a URL rule. Agentic Fabriq deliberately does not create Customer Match lists, which are built by uploading the identities of real people.

audiences:write
google_ads_detach_ad_group_assetWRITE

Detach an asset from an ad group. The inverse of google_ads_attach_ad_group_asset.

assets:write
google_ads_detach_campaign_assetWRITE

Detach an asset from a campaign. It stops showing with that campaign's ads. The asset itself is untouched and can be re-attached with google_ads_attach_campaign_asset.

assets:write
google_ads_detach_shared_setWRITE

Detach a shared negative list from a campaign. The campaign starts matching those searches again, so it increases spend. The inverse of google_ads_attach_shared_set.

keywords:write
google_ads_dismiss_recommendationWRITE

Dismiss a recommendation so it stops being suggested. Changes nothing about the account's delivery or spend. There is no un-dismiss in the API — Google will re-surface the recommendation on its own if the condition persists, and a person can restore it in the Google Ads UI. That absence is stated here rather than implied.

recommendations:apply
google_ads_enable_adWRITE

Set an ad to ENABLED. THIS STARTS SERVING and buying clicks, provided its ad group and campaign are also enabled. The inverse is google_ads_pause_ad.

ads:write
google_ads_enable_ad_groupWRITE

Set an ad group to ENABLED. THIS STARTS SPENDING: its ads begin serving against the campaign's budget, provided the campaign is also enabled. The inverse is google_ads_pause_ad_group.

adgroups:write
google_ads_enable_campaignWRITE

Set a campaign to ENABLED. THIS STARTS SPENDING MONEY: an enabled campaign buys clicks against its daily budget from the next few minutes onward. Read the campaign's budget with google_ads_list_campaign_budgets and its end date with google_ads_list_campaigns before calling this. The inverse is google_ads_pause_campaign, which ships in the same migration.

campaigns:write
google_ads_enable_keywordWRITE

Set a keyword to ENABLED. THIS STARTS SPENDING: it begins matching searches and buying clicks. The inverse is google_ads_pause_keyword.

keywords:write
google_ads_end_experimentWRITE

End an experiment immediately, returning all traffic to the base campaign and discarding the trial arm's remaining schedule. This is the inverse of google_ads_schedule_experiment and it is the SAFE direction — it reduces spend — but it cannot be undone, so it is confirmation-gated.

experiments:write
google_ads_generate_keyword_forecast_metricsREAD

Forecast the clicks, impressions and COST a proposed set of keywords and bids would produce over a date range. Read-only — it spends nothing — and it is the right call BEFORE google_ads_add_keywords, because it prices the change first.

planning:read
google_ads_generate_keyword_historical_metricsREAD

Return average monthly searches, competition and top-of-page bid range for keywords you name. Read-only. One request per second per account.

planning:read
google_ads_generate_keyword_ideasREAD

Ask the Keyword Planner for keyword ideas from seed words or a URL, with each idea's average monthly searches and competition. Read-only and spends nothing. Google rate-limits this to ONE REQUEST PER SECOND per account, and Explorer-level developer tokens cannot reach the planning services at all.

planning:read
google_ads_get_customerREAD

Read one Google Ads account's own settings: its descriptive name, currency, time zone, whether it is a manager, whether it is a TEST account, its auto-tagging and tracking-template settings and its optimization score. Read this before any write — a test account cannot serve ads or produce metrics, and mistaking one for a live account is the most common way a Google Ads integration appears broken when it is working.

account:read
google_ads_get_google_ads_fieldREAD

Read the metadata for one named field, e.g. campaign.status: its data type, its enum values, and whether it is selectable, filterable and sortable.

reporting:read
google_ads_get_identity_verificationREAD

Report where this account stands in Google's advertiser identity verification programme, including any deadline. An unverified account can have its ads stopped, so this is a diagnostic worth reading before concluding a campaign is misconfigured.

account:read
google_ads_graduate_experimentWRITE

Convert the experiment's trial arm into an INDEPENDENT campaign with its own budget, which then spends on its own alongside the original. Both campaigns run afterwards, so total spend goes up. Supply the budget the graduated campaign will use.

experiments:write
google_ads_list_accessible_customersREAD

List every Google Ads account the connected Google login can reach DIRECTLY, as resource names like customers/1234567890. START HERE: every other Google Ads tool needs a customer_id and this is the only call that needs none. Note what it does NOT return: accounts reachable only THROUGH a manager account are not listed — use google_ads_list_customer_clients with a manager's id for those.

account:read
google_ads_list_account_budget_proposalsREAD

List proposals to create, change or end an account budget, with their approval status. The precondition read for google_ads_create_account_budget_proposal and the only way to see a proposal id before withdrawing one.

billing:read
google_ads_list_account_budgetsREAD

List the ACCOUNT-level budgets — the invoicing ceilings for the whole account over a period — with how much has been served against each. Distinct from campaign budgets, which are the daily ceilings google_ads_list_campaign_budgets reads.

billing:read
google_ads_list_ad_group_assetsREAD

List creative assets attached at ad-group level with their field type and approval status.

assets:read
google_ads_list_ad_group_bid_modifiersREAD

List ad-group-level bid multipliers, for example a device modifier that bids more on mobile.

adgroups:read
google_ads_list_ad_group_criteriaREAD

List EVERY criterion on an ad group, not only keywords: audiences, age ranges, genders, placements, topics and their bid modifiers. `negative = true` means an exclusion.

keywords:read
google_ads_list_ad_group_labelsREAD

List which labels are attached to which ad groups.

adgroups:read
google_ads_list_ad_groupsREAD

List ad groups with their status, type, campaign, and the bids that apply to them. The `resource_name` of each row is what every ad-group write takes, and `ad_group.campaign` is what links it upward.

adgroups:read
google_ads_list_adsREAD

List the ads in this account with their type, status, POLICY APPROVAL STATUS and landing-page URLs. approval_status is the diagnostic for 'our ad is not showing': DISAPPROVED means Google is refusing to serve it, and no amount of bidding fixes that.

ads:read
google_ads_list_asset_group_assetsREAD

List which assets are in which asset group and what field type each fills — the read that tells you a PMax asset group is missing headlines.

assets:read
google_ads_list_asset_groupsREAD

List the asset groups of Performance Max campaigns, with their ad strength, landing pages and primary status. Ad strength is the diagnostic for an underperforming PMax campaign.

assets:read
google_ads_list_asset_setsREAD

List asset sets — collections of assets such as location groups or business-profile feeds — with their type and status.

assets:read
google_ads_list_assetsREAD

List the account's creative assets — text, images, sitelinks, callouts — with their type, source and landing pages. NOTE: the HTTP authorization token on a Business Profile location set and the lead-form webhook secret are withheld from these rows by Agentic Fabriq; they are the customer's credentials for other systems and an agent has no use for them.

assets:read
google_ads_list_audiencesREAD

List the account's audiences with their name, description, scope and status. Produces the audience resource names targeting writes need.

audiences:read
google_ads_list_batch_jobsREAD

List the batch jobs on this account with their status, operation counts and progress. Agentic Fabriq does not CREATE batch jobs — a job takes an arbitrary array of mutate operations, which would let one granted action reach every write in the API — but a job created elsewhere is visible here, which is how an unexplained bulk change gets found.

reporting:read
google_ads_list_bidding_strategiesREAD

List the account's PORTFOLIO bidding strategies — strategies shared across campaigns — with their type, their targets (target CPA, target ROAS, CPC ceiling) and how many campaigns use each. Changing one changes what every campaign attached to it pays, which is why google_ads_update_bidding_strategy is destructive.

campaigns:read
google_ads_list_billing_setupsREAD

List how this account pays: each billing setup, its status, the payments account behind it and the period it covers. No payment instrument, card number or bank detail is ever returned — Google does not publish one on this resource.

billing:read
google_ads_list_campaign_assetsREAD

List the creative assets attached at campaign level — sitelinks, callouts, images, promotions — with the field type each occupies and its approval status.

assets:read
google_ads_list_campaign_bid_modifiersREAD

List the campaign-level bid multipliers — for example a 1.2 modifier on calls means the account bids 20% more for that interaction. The precondition read for changing one.

campaigns:read
google_ads_list_campaign_budgetsREAD

List the DAILY budgets in this account: the amount in micros, whether the budget is shared, how many campaigns reference it, and Google's own recommended amount. READ THIS BEFORE CHANGING A BUDGET — writing the previous amount_micros back is the only undo Google publishes.

campaigns:read
google_ads_list_campaign_criteriaREAD

List what a campaign targets or excludes at the campaign level: locations, languages, devices, audiences, and campaign-level negative keywords. `negative = true` means an exclusion.

campaigns:read
google_ads_list_campaign_draft_async_errorsREAD

List the errors a draft promotion produced. Promotion is asynchronous, so a failure surfaces HERE and nowhere else — without this read a failed promotion is silent.

campaigns:read
google_ads_list_campaign_draftsREAD

List the drafts of campaigns in this account — a draft is a private copy you can change and then either promote onto the live campaign or run as an experiment. The precondition read for promoting one.

campaigns:read
google_ads_list_campaign_groupsREAD

List the campaign groups used to organize campaigns for reporting.

campaigns:read
google_ads_list_campaign_labelsREAD

List which labels are attached to which campaigns. Pair with google_ads_list_labels to resolve each label resource name to its text.

campaigns:read
google_ads_list_campaign_shared_setsREAD

List which shared negative-keyword or placement lists are attached to which campaigns.

campaigns:read
google_ads_list_campaignsREAD

List this account's campaigns with their status, channel type, bidding strategy, budget resource name, start and end dates and labels. Configuration only — for spend and clicks use google_ads_report_campaign_performance. The `resource_name` field of each row is what every campaign write takes.

campaigns:read
google_ads_list_change_eventsREAD

WHO CHANGED WHAT, WHEN. Every configuration change in the account with the user's email, the resource, the operation and the exact fields touched. Google restricts this to the LAST 30 DAYS and to 10,000 rows per query, and REQUIRES a change_date_time filter — Agentic Fabriq supplies the last 30 days when you give no dates. This is the diagnostic that makes every write in this connector supportable: it is how an unexpected spend change gets attributed.

reporting:read
google_ads_list_change_statusREAD

List which resources changed since a point in time and whether each was added, changed or removed. Cheaper than the full change history when the question is 'what moved', not 'who moved it'. Google keeps 90 days.

reporting:read
google_ads_list_conversion_actionsREAD

List what this account counts as a conversion: each action's type, category, counting rule, attribution window, default value, and whether it is included in the `conversions` metric that automated bidding optimizes toward. Read this before believing any conversion number.

conversions:read
google_ads_list_conversion_custom_variablesREAD

List the custom variables that can be attached to an uploaded conversion, with their tags. Produces the resource names google_ads_upload_click_conversions needs to send one.

conversions:read
google_ads_list_custom_audiencesREAD

List custom audiences — audiences defined by interests, URLs or apps rather than by a membership list.

audiences:read
google_ads_list_customer_client_linksREAD

List the DIRECT client links a manager account holds, with each link's status and whether the client is hidden. Unlike google_ads_list_customer_clients this shows only one level and shows PENDING invitations as well as accepted links.

account:read
google_ads_list_customer_clientsREAD

Walk the manager-account hierarchy below one account: every child account, its id, name, currency, time zone, whether it is itself a manager, whether it is a test account, and how many levels below it sits. This is the read that produces the customer ids the mutate tools require when the connected login reaches accounts through an MCC — google_ads_list_accessible_customers only returns direct grants. Pass the MANAGER's id as customer_id and the manager's id again as login_customer_id.

account:read
google_ads_list_customer_conversion_goalsREAD

List the account-level conversion goals: which conversion categories are biddable, meaning which ones automated bidding is allowed to optimize toward.

conversions:read
google_ads_list_customer_manager_linksREAD

List the manager (MCC) accounts linked ABOVE this account and the status of each link. The manager ids here are the values to send as login_customer_id.

account:read
google_ads_list_customer_user_accessREAD

List every user with access to this account, their access role (ADMIN, STANDARD, READ_ONLY, EMAIL_ONLY), when it was granted and who invited them. RETURNS EMAIL ADDRESSES — third-party personal data — which is why it sits under its own permission and not under account:read. There is deliberately no matching write: Agentic Fabriq does not edit the permission system it is being permitted by.

useraccess:read
google_ads_list_customer_user_access_invitationsREAD

List invitations to access this account that have not yet been accepted, with the invited email address, the role offered and the invitation's status. Also returns email addresses.

useraccess:read
google_ads_list_experiment_armsREAD

List the arms of an experiment: which is the control, which campaigns each arm runs and how the traffic is split between them.

campaigns:read
google_ads_list_experiment_async_errorsREAD

List the errors an experiment's asynchronous promotion or graduation produced. Those run asynchronously, so a failure surfaces HERE and nowhere else.

campaigns:read
google_ads_list_experimentsREAD

List campaign experiments with their status, schedule, promote status and the long-running operation behind each. Read before ending, graduating or promoting one.

campaigns:read
google_ads_list_invoicesREAD

List this account's invoices for one month, with their totals and the billing setup they belong to. Monthly invoicing must be enabled on the account; accounts on automatic card payments have no invoices and Google answers with an empty list rather than an error.

billing:read
google_ads_list_keywordsREAD

List the keywords in this account with their text, match type, status, bid and quality score. Only KEYWORD criteria are returned — for audiences, demographics and placements use google_ads_list_ad_group_criteria.

keywords:read
google_ads_list_labelsREAD

List the labels defined in this account, with their text and colour. Produces the label resource names every label-assignment write needs.

campaigns:read
google_ads_list_negative_keywordsREAD

List the campaign-level negative keywords — the searches a campaign refuses to match. Filtered to negative KEYWORD criteria by a fixed clause. Ad-group-level negatives are in google_ads_list_ad_group_criteria.

keywords:read
google_ads_list_offline_conversion_upload_summariesREAD

Report the health of recent offline conversion uploads: how many events succeeded, how many are pending, the success rate and when the last upload happened. THIS IS THE DIAGNOSTIC for 'our CRM conversions stopped importing' — without it that question ends at a silence.

conversions:read
google_ads_list_payments_accountsREAD

List the payments accounts this account can be billed through, with their ids and names. Needed to create a billing setup, which Agentic Fabriq deliberately does not expose — see docs/coverage/google_ads.md.

billing:read
google_ads_list_recommendation_subscriptionsREAD

List which recommendation types this account has subscribed to AUTO-APPLY. Read-only in Agentic Fabriq and deliberately so: creating a subscription is a standing rule that changes budgets and bids forever with no action row behind any of it. Listing them is how you DETECT one — an account with an auto-apply subscription is an account whose spend changes without anybody calling a tool.

recommendations:read
google_ads_list_recommendationsREAD

List Google's own optimization recommendations for this account, each with the campaign or budget it applies to, whether it has been dismissed, and Google's estimate of its impact on impressions, clicks and COST. Read the impact.potential_metrics.cost_micros before applying anything: a recommendation is Google advising the account to spend more, and it is usually right about the impressions.

recommendations:read
google_ads_list_remarketing_actionsREAD

List the account's remarketing actions — the tags that build remarketing lists from site traffic.

audiences:read
google_ads_list_search_termsREAD

List the ACTUAL SEARCHES people typed that caused an ad to serve, with the campaign and ad group each matched. This is the diagnostic behind every 'why did we pay for that click' question and the input to google_ads_add_negative_keywords. For the metrics on each term use google_ads_report_search_term_performance.

keywords:read
google_ads_list_shared_criteriaREAD

List the individual exclusions inside a shared set.

keywords:read
google_ads_list_shared_setsREAD

List the account's shared sets — reusable negative-keyword and negative-placement lists — with how many members each has and how many campaigns use it.

keywords:read
google_ads_list_user_listsREAD

List remarketing and customer lists with their type, size, membership duration and whether each is eligible for Search or Display. size_for_search below Google's minimum is why a remarketing campaign is not serving.

audiences:read
google_ads_pause_adWRITE

Set an ad to PAUSED. It stops serving immediately and nothing is lost; google_ads_enable_ad puts it back.

ads:write
google_ads_pause_ad_groupWRITE

Set an ad group to PAUSED. It stops serving immediately and nothing is lost — its keywords, ads and history are untouched and google_ads_enable_ad_group puts it back.

adgroups:write
google_ads_pause_campaignWRITE

Set a campaign to PAUSED. It stops serving and stops spending immediately, and nothing is lost: its settings, keywords, ads and history are untouched and google_ads_enable_campaign puts it back. This is the safe half of the pair and needs no confirmation.

campaigns:write
google_ads_pause_keywordWRITE

Set a keyword to PAUSED. It stops matching searches immediately and keeps its quality-score history; google_ads_enable_keyword puts it back. This is the right way to stop a keyword spending.

keywords:write
google_ads_promote_campaign_draftWRITE

Copy the draft's configuration onto the LIVE campaign it was made from, overwriting it. THE PRE-PROMOTION CONFIGURATION IS NOT RECOVERABLE through the API. Runs asynchronously — the response carries a long-running operation and google_ads_list_campaign_drafts reports when it finishes.

experiments:write
google_ads_promote_experimentWRITE

Overwrite the BASE campaign with the experiment arm's configuration. The base campaign's previous configuration is not recoverable through the API. Asynchronous — check google_ads_list_experiment_async_errors afterwards.

experiments:write
google_ads_remove_account_budget_proposalWRITE

Withdraw a pending account budget proposal. This is the inverse of google_ads_create_account_budget_proposal and it is why that operation is shippable: a proposal that has not been approved can be taken back.

billing:write
google_ads_remove_adWRITE

Set an ad to REMOVED. TERMINAL — Google publishes no un-remove. Its historical metrics survive. Pause it instead unless you are certain.

ads:write
google_ads_remove_ad_groupWRITE

Set an ad group to REMOVED, taking every keyword and ad in it with it. TERMINAL — Google publishes no un-remove. Pause it instead unless you are certain.

adgroups:write
google_ads_remove_ad_group_bid_modifierWRITE

Remove an ad-group-level bid modifier, returning that device to the ad group's base bid.

bidding:write
google_ads_remove_ad_group_labelWRITE

Detach a label from an ad group. The inverse of google_ads_add_ad_group_label.

labels:write
google_ads_remove_asset_groupWRITE

Remove an asset group from a Performance Max campaign. Its assets survive in the account and can be reused; the grouping does not.

assets:write
google_ads_remove_asset_group_assetWRITE

Take an asset out of a Performance Max asset group. Removing below Google's minimum for a field type will stop the group serving. The inverse of google_ads_attach_asset_group_asset.

assets:write
google_ads_remove_audienceWRITE

Remove an audience. Every ad group and campaign targeting it loses that targeting, which changes who sees the ads and therefore what is spent.

audiences:write
google_ads_remove_bidding_strategyWRITE

Remove a shared bidding strategy. Every campaign using it is left without one and STOPS SERVING until a strategy is set, so check non_removed_campaign_count first. The inverse is google_ads_create_bidding_strategy plus pointing the campaigns back.

bidding:write
google_ads_remove_campaignWRITE

Set a campaign to REMOVED. TERMINAL: Google publishes no un-remove for a campaign — a REMOVED campaign can never be enabled again, only recreated from scratch. Its historical metrics survive for reporting. google_ads_pause_campaign is almost always what is actually wanted.

campaigns:write
google_ads_remove_campaign_bid_modifierWRITE

Remove a campaign-level bid modifier, returning bids for that interaction to the campaign's base bid.

bidding:write
google_ads_remove_campaign_budgetWRITE

Remove a budget. Every campaign that referenced it stops delivering until it is given another one, so check reference_count with google_ads_list_campaign_budgets first. A removed budget cannot be restored, only recreated with google_ads_create_campaign_budget.

budgets:write
google_ads_remove_campaign_criterionWRITE

Remove one campaign-level criterion. REMOVING A NEGATIVE CRITERION WIDENS what the campaign matches, which increases spend; removing a positive one narrows it. The inverse of google_ads_create_campaign_criterion.

campaigns:write
google_ads_remove_campaign_draftWRITE

Discard a draft without promoting it. The live campaign is untouched. This is the inverse of google_ads_create_campaign_draft and the safe way out of a draft you do not want.

experiments:write
google_ads_remove_campaign_groupWRITE

Remove a campaign group. The campaigns in it are untouched.

campaigns:write
google_ads_remove_campaign_labelWRITE

Detach a label from a campaign. The inverse of google_ads_add_campaign_label.

labels:write
google_ads_remove_conversion_actionWRITE

Remove a conversion action. Every automated bidding strategy optimizing toward it loses its signal and its historical conversions stop being reported. google_ads_update_conversion_action with status=PAUSED stops the recording without the loss and is almost always what is wanted.

conversions:write
google_ads_remove_experimentWRITE

Remove an experiment that has not been promoted. The base campaign is untouched. The inverse of google_ads_create_experiment.

experiments:write
google_ads_remove_experiment_armWRITE

Remove an arm from an experiment that has not started. The inverse of google_ads_create_experiment_arm.

experiments:write
google_ads_remove_keywordsWRITE

Set up to 100 keywords to REMOVED in one batch. TERMINAL, and it also discards their accumulated quality-score history, which does not come back if you re-add the same text. google_ads_pause_keyword is almost always what is actually wanted.

keywords:write
google_ads_remove_labelWRITE

Remove a label from the account. It is detached from everything it was attached to; nothing else about those objects changes.

labels:write
google_ads_remove_negative_keywordsWRITE

Remove up to 100 campaign negative keywords. THIS WIDENS WHAT THE CAMPAIGN MATCHES and therefore increases spend — it is the inverse of google_ads_add_negative_keywords and it is the direction that costs money, which is why it is marked destructive.

keywords:write
google_ads_remove_shared_criteriaWRITE

Remove exclusions from a shared set. Widens what every attached campaign matches, so it increases spend. The inverse of google_ads_add_shared_criteria.

keywords:write
google_ads_remove_shared_setWRITE

Remove a shared set, detaching it from every campaign. THOSE CAMPAIGNS IMMEDIATELY START MATCHING THE SEARCHES THE LIST WAS EXCLUDING, which is a spend increase. Check reference_count with google_ads_list_shared_sets first.

keywords:write
google_ads_remove_user_listWRITE

Remove a remarketing list and its membership. Google publishes no restore — rebuilding it means re-accumulating members over the list's duration, which for a 540-day list is eighteen months.

audiences:write
google_ads_report_account_performanceREAD

Impressions, clicks, CTR, average CPC, cost, conversions and conversion value for the whole account, broken down by day. Costs are in MICROS of the account currency: divide cost_micros by 1,000,000.

reporting:read
google_ads_report_ad_group_performanceREAD

Per-ad-group impressions, clicks, cost and conversions by day. Costs are in MICROS.

reporting:read
google_ads_report_ad_performanceREAD

Per-ad impressions, clicks, cost and conversions by day, alongside each ad's policy approval status — so an ad with zero impressions can be told apart from an ad Google is refusing to serve.

reporting:read
google_ads_report_age_range_performanceREAD

Impressions, clicks, cost and conversions by age bracket. Only campaigns with demographic targeting produce rows.

reporting:read
google_ads_report_asset_performanceREAD

Impressions, clicks and conversions per creative asset, with its text and the field type it fills. The read behind 'which headline is working'.

reporting:read
google_ads_report_campaign_performanceREAD

Per-campaign impressions, clicks, cost, conversions, search impression share and top-of-page rate, broken down by day. The report an ads question usually means. Costs are in MICROS.

reporting:read
google_ads_report_conversion_action_performanceREAD

Conversions and conversion value broken down by WHICH conversion action produced them, per campaign. The read that says whether the conversions a bidding strategy is chasing are the ones the business cares about. It reports NO COST: Google does not attribute spend to a conversion action, so cost cannot be selected alongside this breakdown. Use google_ads_report_campaign_performance for spend.

reporting:read
google_ads_report_device_performanceREAD

Per-campaign impressions, clicks, cost and conversions split by device — mobile, desktop, tablet, connected TV. The input to a device bid modifier.

reporting:read
google_ads_report_gender_performanceREAD

Impressions, clicks, cost and conversions by gender bracket. Only campaigns with demographic targeting produce rows.

reporting:read
google_ads_report_geo_performanceREAD

Impressions, clicks, cost and conversions by country, region and city. The read behind 'where is our money going'. The country arrives as country_criterion_id — the geo target constant id — because geographic_view does not support a country SEGMENT; region and city arrive as names.

reporting:read
google_ads_report_keyword_performanceREAD

Per-keyword impressions, clicks, cost, conversions and QUALITY SCORE by day. Quality score is the diagnostic for an expensive keyword: a low one raises what every click costs.

reporting:read
google_ads_report_landing_page_performanceREAD

Impressions, clicks, cost and conversions by landing-page URL. The read that separates 'the ads are bad' from 'the page is bad'.

reporting:read
google_ads_report_search_term_performanceREAD

What people ACTUALLY SEARCHED, with the impressions, clicks, cost and conversions each search produced and how it matched. Sorted by cost, this is the fastest route from 'we are spending too much' to a list for google_ads_add_negative_keywords.

reporting:read
google_ads_report_shopping_performanceREAD

Impressions, clicks, cost and conversions per PRODUCT for Shopping and Performance Max campaigns. Produces rows only where a Merchant Center account is linked.

reporting:read
google_ads_schedule_experimentWRITE

Start an experiment running. FROM THIS POINT THE TREATMENT ARM SPENDS the split of the campaign's budget its traffic_split names. The inverse is google_ads_end_experiment, which returns all traffic to the base campaign.

experiments:write
google_ads_searchREAD

Run ANY GAQL query against ANY of the resources this API publishes. GAQL CANNOT WRITE — its published grammar has no INSERT, UPDATE, DELETE, DDL or statement separator, only SELECT / FROM / WHERE / ORDER BY / LIMIT / PARAMETERS — but it can read everything, so this is a separate permission from the shaped reports. Shape: SELECT field, field FROM resource WHERE predicate ORDER BY field LIMIT n. Exactly one FROM resource; there are no joins and no subqueries. Use google_ads_search_google_ads_fields to discover selectable fields. Agentic Fabriq imposes a row cap and rewrites an oversized or missing LIMIT rather than refusing the query. There is NO page size: Google fixes this endpoint's page at 10,000 rows and rejects a request that asks for another. Bound the result with LIMIT in the query, and walk pages with page_token.

reporting:query
google_ads_search_google_ads_fieldsREAD

Query Google's own metadata about every field the API publishes: which resource it belongs to, its data type, whether it is SELECTABLE, FILTERABLE or SORTABLE, and which other fields can be selected alongside it. THIS IS HOW AN AGENT DISCOVERS WHAT GOOGLE_ADS_SEARCH CAN ASK FOR without guessing — the field set changes four times a year. The query is GAQL-shaped but takes NO FROM CLAUSE: the resource is implicit, and naming it is an error.

reporting:read
google_ads_suggest_geo_target_constantsREAD

Turn a place name — 'London', 'California', 'Canada' — into the geo target constant resource name every location-targeting write needs. Needs no customer_id: the geo target constants are global.

planning:read
google_ads_suggest_keyword_themesREAD

Suggest keyword themes for a Smart campaign from a business description or a landing page. Read-only.

planning:read
google_ads_update_adWRITE

Change a responsive search ad's headlines, descriptions or landing pages. Note the resource here is the AD, not the ad-group-ad: use the `ad_group_ad.ad.id` from google_ads_list_ads to build customers/<cid>/ads/<ad id>. Editing an ad RESETS ITS LEARNING and sends it back through policy review, so it stops serving for a while.

ads:write
google_ads_update_ad_groupWRITE

Change an ad group's name or bids. Does not change status — that is google_ads_enable_ad_group / google_ads_pause_ad_group. Only the fields you supply are changed.

adgroups:write
google_ads_update_assetWRITE

Change an asset's internal name or its landing-page URLs. An asset's TEXT and IMAGE BYTES are immutable in Google Ads — to change either, create a new asset and re-attach it.

assets:write
google_ads_update_asset_groupWRITE

Change an asset group's name, landing pages, display paths or status. Only the fields you supply are changed.

assets:write
google_ads_update_audienceWRITE

Change an audience's name or description. Only the fields you supply are changed.

audiences:write
google_ads_update_bidding_strategyWRITE

Change a shared strategy's target or name. THE BLAST RADIUS IS EVERY CAMPAIGN ATTACHED TO IT, not the one you were thinking about — read campaign_count with google_ads_list_bidding_strategies first.

bidding:write
google_ads_update_campaignWRITE

Change a campaign's name, dates, tracking template or bidding targets. Does NOT change status — enabling, pausing and removing are separate operations so an operator can grant editing without granting spending. Only the fields you supply are changed.

campaigns:write
google_ads_update_campaign_budgetWRITE

Change a budget's daily amount or name. RAISING amount_micros RAISES WHAT THIS ACCOUNT SPENDS, on every campaign sharing the budget, within minutes. Read google_ads_list_campaign_budgets first and keep the previous amount_micros — writing it back is the only undo Google publishes. Only the fields you supply are changed; anything you omit is left exactly as it was.

budgets:write
google_ads_update_conversion_actionWRITE

Change a conversion action's name, category, default value, counting rule, attribution window or whether it feeds the biddable `conversions` metric. Turning include_in_conversions_metric OFF silently changes what every automated bidding strategy in the account is optimizing for. Only the fields you supply are changed.

conversions:write
google_ads_update_conversion_custom_variableWRITE

Change a custom variable's name or status. Its TAG is immutable.

conversions:write
google_ads_update_customerWRITE

Change this account's own settings: its descriptive name, whether auto-tagging (the gclid parameter Google appends to landing-page URLs) is on, its account-wide tracking template and its final-URL suffix. Read google_ads_get_customer first and write the previous value back to undo. Cannot change who has access and cannot spend money. Turning auto_tagging_enabled OFF breaks conversion import for every campaign in the account.

account:write
google_ads_update_experimentWRITE

Change an experiment's name, description or schedule. Only the fields you supply are changed.

experiments:write
google_ads_update_keywordWRITE

Change one keyword's bid or landing page. Does not change status — that is google_ads_enable_keyword / google_ads_pause_keyword. A keyword's TEXT and MATCH TYPE are immutable in Google Ads: to change either, remove it and add a new one.

keywords:write
google_ads_update_user_listWRITE

Change a remarketing list's name, description, membership duration or open/closed status. Shortening membership_life_span_days DROPS existing members who joined longer ago than the new value.

audiences:write
google_ads_upload_call_conversionsWRITE

Report conversions from phone calls, matched on the caller's number and the time of the call. Feeds automated bidding the same way google_ads_upload_click_conversions does. NOTE this one DOES carry a phone number, which is personal data about the advertiser's own caller; send only numbers the advertiser is entitled to process.

conversions:upload
google_ads_upload_click_conversionsWRITE

Report conversions that happened outside Google — a CRM sale, a closed deal — back against the click that caused them, identified by the gclid Google appended to the landing-page URL. This feeds automated bidding, so a wrong upload moves spend. Carries no personal identifier: the gclid is an opaque token the advertiser already holds. Set validate_only true first — Google reports every rejected row individually and the reasons are specific.

conversions:upload
google_ads_upload_conversion_adjustmentsWRITE

Restate the value of a conversion already reported, or RETRACT it entirely. This is the inverse of google_ads_upload_click_conversions and it is why that operation is shippable: an over-reported conversion that would otherwise train bidding on a lie can be taken back.

conversions:upload

Put Google Ads behind one governed endpoint.

Same permissions, same audit trail, whatever else you connect next.