
List a Google Ads account's third-party product links (e.g. app analytics providers). Use this to find accountlinkid before calling updateaccountlink.
Link a Google Ads account to a third-party mobile app analytics provider (e.g. AppsFlyer, Adjust) for conversion tracking. Use listaccountlinks first to check for an existing link to the same app.
Change the status of an existing account link (e.g. set to REMOVED to disable it). Use listaccountlinks to find the accountlinkid first.
Target or exclude audiences on an ad group: user interests, remarketing lists, or custom audiences. Batch operation. Use listuserlists for USERLIST resource names and searchgoogleads (FROM userinterest / FROM custom_audience) for the others. The audience a criterion points to is fixed at creation.
Change the status or bid modifier of an existing ad group audience criterion. The audience it targets cannot be changed - remove it and create a new one instead. Use searchgoogleads (FROM adgroupcriterion) to find criterion_id.
Permanently remove an audience criterion from an ad group. Use searchgoogleads (FROM adgroupcriterion) to find criterion_id first.
Target or exclude placements on an ad group: websites, YouTube videos and channels, mobile apps, mobile app categories, or topics. Batch operation. Use searchgoogleads (FROM topicconstant / FROM mobileappcategoryconstant) for resource names. Content-label exclusions are account-wide only - use createcustomernegative_criteria.
Permanently remove a placement, YouTube, mobile-app, or topic criterion from an ad group. Use searchgoogleads (FROM adgroupcriterion) to find criterion_id first.
Target or exclude demographics on an ad group: age ranges, genders, parental statuses, and household income ranges. Batch operation across all four dimensions. Demographic criteria apply to Display, Video, and Demand Gen ad groups; Search ad groups support a narrower set and the API will reject unsupported combinations.
Permanently remove an age-range, gender, parental-status, or income-range criterion from an ad group. Use searchgoogleads (FROM adgroupcriterion) to find criterion_id first.
List ad groups for a customer with optional filtering by campaign and status. Use getadgroup to retrieve a specific ad group.
Get details of a specific ad group.
Create a new ad group within a campaign. Required: customerid, campaignid (from listcampaigns), name. Use listcampaigns to find a valid campaign_id.
Update an ad group: name, status, CPC bid, tCPA/tROAS overrides, AI Max Search Term Matching, Targeting-vs-Observation modes, or tracking/URL settings. status=REMOVED deletes (not combinable with other fields). Omitted fields stay untouched; empty string/list clears. Call getadgroup first for the current targetingsetting, which is replaced wholesale. IDs: listad_groups.
List ads for a customer with optional filtering by ad group and status. Use get_ad to retrieve a specific ad.
Get details of a specific ad.
Create a Responsive Search Ad. Headlines: 3-15 required (max 30 chars each). Descriptions: 2-4 required (max 90 chars each). Final URLs: at least 1. Each headline/description may be a bare string or an object with pinnedfield to pin it to a position. Use listadgroups to find adgroupid. Edit the creative afterwards with updateresponsivesearchad.
Update an ad's status within its ad group (pause, enable, or set REMOVED to delete). This tool changes status only - to edit a responsive search ad's headlines, descriptions, pinning, or URLs use updateresponsivesearchad, which calls AdService instead. Use listads to find adid and adgroup_id.
Create a Responsive Display Ad in a Display ad group. Needs at least one landscape and one square image asset - create them with createmediaasset or find them with list_assets. Defaults to PAUSED. Ad content cannot be edited after creation; create a new ad to change it.
Edit a responsive search ad's creative in place: headlines and descriptions (with pinning), URL paths, final/mobile URLs, tracking template, final URL suffix, or custom parameters. List fields are REPLACED wholesale, so call getad first and send the complete list. validateonly=true policy-checks without applying. Use updatead for status. IDs: listads.
Remove specific Google-automatically-created assets (e.g. auto-generated sitelinks or callouts) from a Responsive Search Ad. Use searchgoogleads (FROM adgroupadassetview) to find which assets on an ad were automatically created before calling.
Create a Performance Max asset group, the creative bundle a PMax campaign serves from. A PMax campaign cannot serve without one. Follow this with attachassetgroupasset for headlines, descriptions, images, and a logo; getassetgroupminimum_requirements lists what Google requires.
Change an asset group's name, landing page URLs, display paths, or status. Its parent campaign is fixed at creation and cannot be changed. Set status=REMOVED to delete it. Use listassetgroups to find the ID.
List Performance Max asset groups, optionally filtered to one campaign or one status. Use this to find an assetgroupid for attachassetgroupasset, createassetgroupsignal, or createlistinggroup_filter.
Read one Performance Max asset group, including Google's ad strength rating for it. Use listassetgroups to browse and find an assetgroupid.
Attach an asset to a Performance Max asset group in a creative role such as HEADLINE, MARKETINGIMAGE, or LOGO. Create assets with createtextasset or createmediaasset. For sitelinks, callouts, and other non-PMax roles use attachasset instead.
Detach an asset from a Performance Max asset group. The asset itself is not deleted. Removing an asset can drop the group below Google's required counts and stop it serving; check getassetgroupminimumrequirements first.
List the assets attached to a Performance Max asset group and the role each fills, optionally filtered to one role. Compare the counts against getassetgroupminimumrequirements to check the group is servable.
Return Google's documented asset counts a Performance Max asset group needs to serve, per creative role. Reference data only, no API call. Compare against listassetgroup_assets to see what an asset group is still missing.
Add an audience or search-theme signal to a Performance Max asset group, hinting at who to reach. Signals guide Google's targeting rather than restricting it. Signals cannot be edited - remove and recreate to change one.
Permanently remove an audience or search-theme signal from a Performance Max asset group. Use searchgoogleads (FROM assetgroupsignal) to find the criterion ID first.
Add one node to a Performance Max asset group's product filter tree, deciding which products the campaign advertises. Build trees one node per call, parent first, passing the parent's returned resource name as parentresourcename. A retail asset group needs a root node to serve.
Remove one node from a Performance Max asset group's product filter tree. Removing a SUBDIVISION removes its children with it, so remove leaves first if you mean to keep them. Use listlistinggroup_filters to find the node's resource name.
List the product filter tree nodes on a Performance Max asset group, including each node's parent, so the tree's shape can be read back. Use listassetgroups to find the assetgroupid.
Create a lead form asset: an in-ad form collecting contact details without a landing page. Attach it with attachasset using fieldtype=LEADFORM. businessname, call to action, headline, description, privacypolicyurl and one field are required. The account must accept the lead form Terms of Service in the Ads UI first, or creates are refused. For sitelinks and callouts use createtextasset.
Create a promotion asset: a sale or discount shown under a search ad, e.g. '20% off running shoes'. Attach it with attachasset using fieldtype=PROMOTION. Set exactly one discount - percentoff, or moneyamountoffmicros with currencycode - and at most one trigger, promotioncode or ordersoveramountmicros. For sitelinks and callouts use createtext_asset.
Create a price asset: 3 to 8 priced rows - services, products or plans - shown under a search ad. Attach it with attachasset using fieldtype=PRICE. Every row needs a header, description, price and landing page; fewer than 3 or more than 8 is rejected. For sitelinks and callouts use createtextasset.
Create an asset set (a named group of assets, e.g. a Performance Max page feed). Create the assets first with createtextasset or createmediaasset, then use addassettoset to add them and linkasset_set to attach the set to a campaign or ad group.
Add an existing asset to an asset set. Use createassetset to create the set first, createtextasset (assettype=PAGEFEED) to create a page feed asset, and listassets to find an assetid.
Remove an asset from an asset set (inverse of addassettoset). The asset itself is kept. To find existing links, use searchgoogleads with 'SELECT assetset.id, asset.id FROM assetsetasset'.
Link an asset set to a campaign or ad group, making its assets eligible to serve. Use createassetset to create the set first.
Remove a campaign or ad group's link to an asset set. The asset set and its assets are not deleted, only the association.
Create a reusable text asset: a sitelink, callout, structured snippet, call, plain text, or page feed URL. Attach it with attachasset, or add it to a page feed with addassettoset. For lead form, promotion and price assets use createleadformasset, createpromotionasset or createprice_asset.
Create an image asset from base64-encoded bytes, reference a YouTube video as an asset, or build a Demand Gen carousel card from existing image assets and a headline. Attach images with attachasset; logos are images too. Card asset IDs feed createdemandgencarousel_ad.
List assets on an account, optionally filtered by type. Use this to find an assetid for attachasset, addassettoset, or createresponsivedisplayad. Use get_asset to read one asset by ID.
Read one asset by ID. Use listassets to browse assets and find an assetid.
Attach an existing asset to an account, campaign, or ad group so it can serve, e.g. adding a sitelink or callout, or replacing the brand assets on a Performance Max campaign with brand guidelines enabled (BUSINESSNAME, LOGO, LANDSCAPELOGO, scope=CAMPAIGN only). Use createtextasset/createmediaasset/listassets for assetid.
Permanently detach an asset from an account, campaign, or ad group so it stops serving there. The asset itself is not deleted. Supply the same scope, assetid, and fieldtype used to attach it.
Describe who an audience is: break it down by age, gender, interests, locations, YouTube channels and more, against a baseline. Reads Google's planning data and changes nothing. Use suggestgeotargetconstants for countrylocationids and listuserlists for a userlist. To find NEW audiences to target instead, use generatesuggestedtargeting_insights.
Suggest audiences worth targeting, either from a seed audience or from a plain-English description. Reads Google's planning data and changes nothing. Pass exactly one of audience or audiencedescription; the description path also needs descriptioncountrylocationids and takes five seconds or more. To describe an audience you already have, use generateaudiencecomposition_insights.
List reusable audiences (AudienceService) for a customer, with their dimensions and exclusions. These are the modern audience objects campaigns and ad groups target. For keyword/URL interest audiences use listcustomaudiences, and for Customer Match lists use listuserlists.
Create a reusable audience from positive dimensions (age, gender, household income, parental status, or segments) plus optional user-list exclusions. Segment values are resource names you must look up first: listuserlists, listcustomaudiences, or searchgoogleads (FROM userinterest / lifeevent / detailed_demographic). Name must be unique in the account.
Update an audience's name, description, dimensions, or user-list exclusions. Dimensions and exclusions are REPLACED wholesale, so call listaudiences first and send the complete desired set. Omitted fields stay untouched. Use listaudiences to find audience_id.
List custom audiences (CustomAudienceService) - keyword, URL, app and place-category interest-and-intent audiences - with their members. Use listaudiences for the reusable AudienceService objects, and listcustominterests for the older CUSTOMAFFINITY/CUSTOM_INTENT audiences.
Create a custom audience from keywords, URLs, apps, or place-category IDs. Leave type as AUTO unless you need to pin how Google interprets the members. The result's resource name can be used as a customaudience segment in createaudience. Names must be unique across BOTH custom audiences and custom interests, so check listcustomaudiences and listcustominterests first.
Update a custom audience's name, description, type, or members. Members are REPLACED wholesale, so call listcustomaudiences first and send the complete desired list. Omitted fields stay untouched. Use listcustomaudiences to find customaudienceid.
Permanently remove a custom audience. Any audience or campaign referencing it as a segment loses it, and this cannot be undone. Custom audiences and custom interests share an id space, so this also removes a custom interest by its id - the only deletion path for one. Use listcustomaudiences or listcustominterests to find the id.
List custom interests (CustomInterestService) - the CUSTOMAFFINITY and CUSTOMINTENT audiences - with their keyword and URL members. For newer keyword/URL intent audiences use listcustomaudiences, and for reusable audience objects use list_audiences.
Create a custom interest audience from keywords and URLs. CUSTOMAFFINITY targets long-term interests, CUSTOMINTENT targets in-market intent. The name must be free across BOTH custom interests and custom audiences (one shared namespace), so check both list tools first. This service has no remove - removecustomaudience with the id is the only known deletion path.
Update a custom interest's name, description, type, or members. Members are REPLACED wholesale, so call listcustominterests first and send the complete list. The API offers no delete or retire for this resource, so there is no way to remove one. Use listcustominterests to find custominterestid.
Create a new empty batch job for bulk asynchronous mutations. Follow with addbatchjoboperations to add operations, runbatchjob to execute it, getbatchjob to poll status, and listbatchjobresults once DONE. Use for large operation counts or operations that reference each other's temporary resource names within the same request.
Add raw mutate operations to a batch job created by createbatchjob. Call runbatchjob afterward to execute them. Can be called multiple times with the sequence_token from the previous response to append more operations before running.
Execute a batch job's queued operations asynchronously. Poll getbatchjob until status=DONE, then call listbatchjob_results to see per-operation outcomes.
Get the status and progress of a batch job (PENDING, RUNNING, or DONE), including how many of its operations have executed. Use createbatchjob's result to find batchjobid.
List per-operation results for a completed batch job (status=DONE from getbatchjob), showing which operations succeeded (with their new resource names) and which failed (with error details).
Add a call bid adjustment to a Search campaign: raise or lower bids when the interaction is a phone call, without changing base bids. The only campaign-level criterion Google Ads supports is the CALLS interaction type. Use listcampaigns to find campaignid. For device or hotel adjustments use createadgroupbidmodifier.
Change a campaign-level bid modifier's multiplier (the call bid adjustment on search campaigns). This adjusts bids, not base bids. Use createcampaignbidmodifier to add one, and searchgoogleads (FROM campaignbidmodifier) to find an existing criterionid.
Permanently remove a campaign-level bid modifier, so bids return to the unadjusted base bid. Use searchgoogleads (FROM campaignbidmodifier) to find criterion_id first.
Raise or lower an ad group's bids for a device or a hotel booking criterion, without changing the base bid. Use listadgroups to find adgroupid. To stop serving on a device entirely rather than bidding less, use createcampaigndevice_exclusion.
Change an ad group bid modifier's multiplier. The criterion it applies to is fixed at creation - remove it and create a new one to change that. Use searchgoogleads (FROM adgroupbidmodifier) to find criterionid.
Permanently remove an ad group bid modifier, so bids return to the unadjusted base bid. Use searchgoogleads (FROM adgroupbidmodifier) to find criterionid first.
List Smart Bidding data exclusions on an account, optionally filtered to a date range. Use this to find a dataexclusionid before updating or removing one.
Tell Smart Bidding to ignore a window's conversion data entirely, for example after a tracking outage made the numbers meaningless. Scope it account-wide, to campaigns from listcampaigns, or to channel types. To keep the data but expect a different rate, use createbiddingseasonalityadjustment.
Change a data exclusion's name, window, or scoping lists. Omitted fields are left untouched; a supplied list replaces the existing one. Use listbiddingdata_exclusions to find the ID.
Permanently remove a Smart Bidding data exclusion, so its window's conversion data counts again. Use listbiddingdata_exclusions to find the ID first.
List Smart Bidding seasonality adjustments on an account, optionally filtered to a date range. Use this to find a seasonalityadjustmentid before updating or removing one.
Tell Smart Bidding to expect a different conversion rate over a short window, such as a flash sale. Scope it account-wide, to campaigns from listcampaigns, or to channel types. For a window whose data should be ignored entirely instead, use createbiddingdataexclusion.
Change a seasonality adjustment's name, window, conversion-rate multiplier, or scoping lists. Omitted fields are left untouched; a supplied list replaces the existing one. Use listbiddingseasonality_adjustments to find the ID.
Permanently remove a Smart Bidding seasonality adjustment, so bidding stops expecting the adjusted conversion rate. Use listbiddingseasonality_adjustments to find the ID first.
List portfolio (shareable) bidding strategies for a customer. Use createbiddingstrategy to create one, then update_campaign to attach it to a campaign.
Create a portfolio (shareable) bidding strategy. Types: TARGETCPA, TARGETROAS, TARGETSPEND, MAXIMIZECONVERSIONVALUE, MAXIMIZECONVERSIONS, TARGETIMPRESSIONSHARE. Use update_campaign to attach it to a campaign afterward.
Update a portfolio bidding strategy's name, its target CPA or ROAS, or its CPC bid floor and ceiling. The strategy's type cannot be changed after creation, but pass type alongside any target or bound so the right scheme leaf is written - without it the update is rejected. Use listbiddingstrategies to find biddingstrategyid and the existing type.
Permanently remove a portfolio bidding strategy. Use listbiddingstrategies to find biddingstrategyid. Google Ads rejects removing a strategy still attached to a campaign.
List billing setups (payments account associations) for a Google Ads account. Use this to find billingsetupid/resource name before calling cancelbillingsetup or createaccountbudget_proposal.
Create a billing setup associating a payments account with a Google Ads account. Provide paymentsaccountid to reuse an existing payments account, or paymentsaccountname + paymentsprofileid to link a new one. Use listbillingsetups first to check for an existing setup.
Cancel a pending or approved billing setup. Use listbillingsetups to find the exact billingsetupid first.
List account budget proposals for a Google Ads account. Use this to find accountbudgetproposalid before calling cancelaccountbudgetproposal.
Propose a new account-level spending budget against a billing setup, or propose changes to an existing one (UPDATE/END/REMOVE with accountbudget set). Use listbillingsetups to find billingsetup and listaccountbudgetproposals to find an existing accountbudget to modify.
Cancel a pending account budget proposal before it's approved. Use listaccountbudgetproposals to find the exact accountbudgetproposalid first.
List campaign budgets for a customer. Budgets are required when creating campaigns. Use this to discover available budgets before calling create_campaign.
Create a new campaign budget. The budget resource name returned here is required when creating campaigns. Use listcampaignbudgets to find existing budgets.
Update a campaign budget's name, amount, delivery method, or shared state. Use listcampaignbudgets to find campaignbudgetid. Google Ads rejects unsharing a budget still attached to multiple campaigns, and rejects renaming a budget whose explicitly_shared is false.
Permanently remove a campaign budget. Use listcampaignbudgets to find campaignbudgetid. Google Ads rejects removing a budget still attached to a non-removed campaign - remove or detach the campaign first.
Exclude one or more keywords from triggering ads on a campaign (campaign-level negative keywords). Batch operation. Use listadgroups/listcampaigns to confirm the campaign first; use removecampaignnegativekeyword to undo.
Permanently remove a campaign-level negative keyword. Use searchgoogleads to find criterion_id first.
Exclude an existing brand list from a campaign (brand exclusion). Use searchgoogleads (FROM brandlist) to find sharedbrandlistresourcename; use removebrand_exclusion to undo.
Permanently remove a brand exclusion from a campaign. Use searchgoogleads to find criterion_id first.
Target or exclude locations on a campaign: resolved geo targets (use suggestgeotargetconstants first) or proximity (radius around an address). Batch operation. Use removecampaigngeotargeting_criterion to undo.
Permanently remove a campaign geo-targeting (location or proximity) criterion. Use searchgoogleads to find criterion_id first.
Target one or more languages on a campaign. Batch operation. Google Ads doesn't support negative (excluded) language targeting. Use searchgoogleads (FROM languageconstant) to find languageconstants; use removecampaignlanguage_targeting to undo.
Permanently remove a campaign language-targeting criterion. Use searchgoogleads to find criterion_id first.
Restrict a campaign to specific days and times (ad scheduling / day-parting), optionally with a per-window bid modifier. Batch operation. Once any schedule exists, the campaign only runs inside the windows you add. Use removecampaignad_schedule to undo.
Permanently remove an ad-schedule (day-part) criterion from a campaign. Use searchgoogleads to find criterion_id first.
Stop a campaign showing ads on specific devices, by setting the device criterion's bid modifier to 0. Batch operation. Campaigns target every device by default, so there is no include variant. To raise or lower bids on a device instead of excluding it, use updatecampaigndevicebidmodifier.
Undo a device exclusion on a campaign, so ads can serve on that device again. Use searchgoogleads to find criterion_id first.
Raise or lower a campaign's bids on one device (mobile, desktop, tablet, connected TV) by setting its criterion bid modifier, 0.1 to 10.0. Find criterionid with searchgoogleads on campaigncriterion where type = 'DEVICE'. Pass 0 to exclude the device, or use createcampaigndevice_exclusion; pass 1.0 to clear an adjustment.
Target or exclude demographics on a campaign: age ranges, genders, parental statuses, and household income ranges. Batch operation across all four dimensions. Demographic criteria apply to Display, Video, and Demand Gen campaigns; the API rejects unsupported combinations on Search.
Permanently remove an age-range, gender, parental-status, or income-range criterion from a campaign. Use searchgoogleads to find criterion_id first.
Exclude one or more audience (remarketing) lists from a campaign, so its members never see these ads. Batch operation. Use listuserlists to find user list resource names. Positive campaign-level audience targeting is done at ad group scope with createadgroupaudiencecriteria.
Permanently remove an audience-list exclusion from a campaign, so its members can see these ads again. Use searchgoogleads to find criterion_id first.
Stop a campaign advertising pages matching a URL, title, content, or custom-label rule. Used with Performance Max and dynamic search campaigns to keep specific pages out. This is an exclusion, distinct from a page feed's positive URL list built with createassetset.
List campaign drafts, optionally for one base campaign or one status. Each draft carries draftcampaign, the resource name of the copy to edit - edit that campaign, never the base. Use it to find draftid for promotecampaigndraft or removecampaigndraft, and to poll a promotion's status.
Create a draft copy of a campaign so changes can be trialled in isolation. Use listcampaigns to find basecampaignid. The response carries draftcampaign - apply your edits to that campaign, not the base - then promotecampaigndraft copies them back.
Copy a draft's changes onto its base campaign. Asynchronous: this returns only the operation's name, so poll listcampaigndrafts for the status moving through PROMOTING to PROMOTED or PROMOTEFAILED. Promotion cannot be undone. Use listcampaigndrafts to find basecampaignid and draftid.
Permanently remove a campaign draft and its draft campaign, discarding any unpromoted changes. Use listcampaigndrafts to find basecampaignid and draft_id. This does not affect the base campaign.
Create an App campaign promoting a mobile app across Search, Play, YouTube and Display. appid, appstore and the sub type are IMMUTABLE, so set them here. The bidding scheme is derived from biddingstrategygoaltype: *TARGET*COST goals need targetcpamicros, the ROAS goal needs targetroas, *WITHOUTTARGET* goals take neither. Defaults to PAUSED.
Create an App ad in an App campaign's ad group. Google assembles the creative from the headlines, descriptions and optional image, video and HTML5 assets you supply. Ads carry no final URL - the destination is the app itself. Use createmediaasset for asset IDs and listadgroups for adgroupid. WARNING: created ENABLED and serves at once; Google rejects a paused App ad, so there is no draft.
Create a Demand Gen campaign, which runs image and video creative across YouTube, Discover and Gmail. upgradedtargeting is IMMUTABLE and moves location and language targeting to the ad group level, so decide it here. Add creative with createdemandgenmultiassetad or createdemandgencarouselad. Defaults to PAUSED.
Create a Demand Gen multi-asset ad from images, headlines and descriptions. Needs landscape or square marketing images (at least one of the two), and images are capped at 20 across all orientations combined. businessname is a plain string here, unlike the video ad types. Use createmedia_asset for asset IDs. Defaults to PAUSED.
Create a Demand Gen carousel ad from 2-10 carousel cards, a logo, one headline and one description. Build the cards first with createmediaasset(assettype='DEMANDGENCAROUSELCARD') or find existing ones with listassets. createdemandgenmultiassetad takes plain images instead. Defaults to PAUSED.
Create a responsive video ad in a Demand Gen campaign - the supported way to run video creative through the API, since VIDEO-channel campaigns cannot be mutated at all. Requires a name, a YOUTUBEVIDEO asset, a logo and a business name; businessname is a text asset here and the call to action is an asset, not a string. Defaults to PAUSED.
List campaign groups for a customer, optionally filtered by status. Use this to find campaigngroupid before calling updatecampaigngroup.
Create a campaign group to track aggregate performance across multiple campaigns with a shared goal. Follow with updatecampaign to set each campaign's campaigngroup field.
Update a campaign group's name or status. Set status=REMOVED to delete it. Use listcampaigngroups to find the campaigngroupid first.
List campaigns for a customer with optional filtering by status, channel type, and name. Use get_campaign to retrieve a specific campaign.
Get details of a specific campaign.
Create a new campaign. Required parameters: customerid, name, advertisingchanneltype, campaignbudget (from listcampaignbudgets), biddingstrategytype. Use listcampaignbudgets to find a valid campaign_budget resource name.
Update a campaign: name, status, budget, bidding (inline scheme + tCPA/tROAS, or a portfolio strategy), AI Max, Targeting-vs-Observation modes, dates, tracking/URL settings, networks, or frequency caps. status=REMOVED deletes. Omitted fields stay untouched; empty string/list clears. Call getcampaign first for the current biddingstrategytype and targetingsetting. IDs: list_campaigns.
Create a Performance Max campaign. Requires a budget from createcampaignbudget and a conversion-based bidding strategy. Defaults to PAUSED because a PMax campaign cannot serve until it has an asset group - createassetgroup is a mandatory next step. For a retail campaign pass merchantid (a linked Merchant Center account); only then can its asset groups take createlistinggroupfilter.
Opt a campaign into or out of Google's automatically generated assets, including the final-URL-expansion text automation. The list replaces the campaign's existing settings, so include every automation you want to keep. Opting into one automation can enable related ones, so read the campaign back afterwards.
Turn on brand guidelines for an existing Performance Max campaign created without them. Either let Google pick the business name and logos from the asset groups (autopopulatebrandassets=true, which needs BUSINESSNAME and LOGO assets already attached via attachassetgroupasset) or pass brandassets explicitly. Fails on a campaign that already has guidelines.
List conversion actions for a customer with optional filtering by status and category. Conversion actions must exist before uploading offline conversions - use createconversionaction to add one.
Get details of a specific conversion action. Use listconversionactions to find conversionactionid.
Create a new conversion action to track conversions. Required before uploading offline conversions (use type=UPLOADCLICKS with uploadclickconversions, or type=UPLOADCALLS with uploadcallconversions) or before enhanced/website conversion tracking (type=WEBPAGE). Use listconversionactions to check for an existing action of the right type before creating a duplicate.
Update a conversion action. Set status=REMOVED to delete. Use listconversionactions to find conversionactionid.
Retract, restate, or enhance previously reported conversions. Use RETRACTION to cancel a conversion, RESTATEMENT to correct its value (requires adjustedvalue), or ENHANCEMENT to attach user identifiers. Identify the original conversion by orderid or gclid+conversiondatetime. Use listconversionactions to find conversion_action resource names.
List the account's default conversion goals and whether Smart Bidding currently optimizes toward each. Read this before flipping one with updatecustomerconversion_goal - every category and origin combination always exists, so there is nothing to create.
Turn an account-level conversion goal on or off for Smart Bidding. Goals are keyed by category and origin and always exist, so this only flips biddable. Use listcustomerconversiongoals to see current state, and updatecampaignconversiongoal to override one campaign.
List campaign-level conversion goals and whether each is biddable, optionally for one campaign. Campaign goals only take effect when the campaign's config is set to CAMPAIGN level - check that with getconversiongoalcampaignconfig.
Turn a conversion goal on or off for one campaign. Only takes effect once that campaign's config is set to CAMPAIGN level with updateconversiongoalcampaignconfig; otherwise the campaign follows the account defaults. Use listcampaignconversion_goals to see current state.
Read whether a campaign follows the account's default conversion goals or uses its own, and which custom conversion goal drives it. Every campaign always has exactly one config. Change it with updateconversiongoalcampaignconfig.
Switch a campaign between the account's default conversion goals and its own, and optionally point it at a custom conversion goal. This is how a custom goal from createcustomconversiongoal actually gets attached to a campaign. Read the current state with getconversiongoalcampaign_config.
List custom conversion goals on an account and the conversion actions each covers. Use this to find a customconversiongoalid for updatecustomconversiongoal, or a resource name for updateconversiongoalcampaignconfig.
Create a named custom conversion goal from a set of conversion actions. Call listconversionactions first to get the conversion action resource names. Attach the new goal to a campaign with updateconversiongoalcampaignconfig; creating it alone changes nothing.
Rename a custom conversion goal, replace which conversion actions it covers, or set status=REMOVED to delete it. A supplied conversionactions list replaces the existing membership rather than adding to it. Use listcustomconversiongoals to find the ID.
Upload offline click conversions (gclid/gbraid/wbraid based) for import into Google Ads. Use createconversionaction (type=UPLOADCLICKS) first to get a valid conversionaction resource name. Never log the gclid/gbraid/wbraid values returned - treat them as sensitive per-user data.
Upload offline call conversions (phone call tracking) for import into Google Ads. Use createconversionaction (type=UPLOADCALLS) first to get a valid conversionaction resource name. Never log the caller_id values returned - treat them as sensitive per-user data.
List conversion value rules on an account, optionally filtered by status. Use this to find the value rule resource names createconversionvalueruleset needs, or an ID for updateconversionvalue_rule.
Create a rule that adjusts reported conversion value when a geo, device, or audience condition matches. At least one condition is required. The rule does nothing until it belongs to a rule set - follow this with createconversionvalueruleset. Use suggestgeotargetconstants and listuser_lists for condition values.
Change a value rule's adjustment, its conditions, or its status. Supply actionoperation and actionvalue together. A supplied condition list replaces the existing one. Set status=REMOVED to delete the rule. Use listconversionvalue_rules to find the ID.
Permanently remove a conversion value rule, so it stops adjusting reported conversion value. Use listconversionvaluerules to find the ID first. To stop a rule applying without deleting it, use updateconversionvaluerule with status=PAUSED.
List conversion value rule sets on an account, showing which rules each contains and whether it is attached account-wide or to a campaign. Use this to find an ID for updateconversionvalueruleset or removeconversionvalueruleset.
Group conversion value rules into a set and attach it account-wide or to one campaign, which is what makes the rules take effect. Create the rules first with createconversionvaluerule. dimensions must cover the conditions those rules use. attachmenttype is fixed at creation.
Replace which value rules a set contains, in priority order, or which condition dimensions it declares. A supplied list replaces the existing one entirely. The set's attachment cannot be changed after creation. Use listconversionvaluerulesets to find the ID.
Permanently remove a conversion value rule set, so its rules stop adjusting reported conversion value. The rules themselves survive and can be reused in another set. Use listconversionvaluerulesets to find the ID first.
From a manager (MCC) account, invite an existing Google Ads account to become a managed client. Creates a PENDING link that the client account owner must accept via updatecustomermanagerlink. Use listaccessiblecustomers to find the managercustomer_id.
From a manager (MCC) account, change the status of an existing manager-client link (e.g. CANCELED to withdraw a pending invite, INACTIVE to end an active relationship). This changes account access - use searchgoogleads (FROM customerclientlink) to find the exact managerlinkid first.
From a client account, accept, refuse, or terminate a manager (MCC) account's access to it. Setting status=ACTIVE grants the manager full control of this account; INACTIVE immediately revokes it. Use searchgoogleads (FROM customermanagerlink) on the client account to find the exact managerlinkid before calling - no fuzzy matching is performed.
Create a new Google Ads client account under a manager (MCC) account, or invite an existing email to accept ownership of one. Requires managercustomerid (from listaccessiblecustomers), descriptivename, currencycode, and time_zone. The new account inherits test status from the manager: creating under a test manager yields a test account, under a production manager a real billable one.
Update account-level settings for a Google Ads customer (display name, tracking URL template, final URL suffix, auto-tagging). Use get_customer to see current values first.
Create account-wide (customer-level) negative criteria that apply across every campaign: placement exclusions (criteriontype=PLACEMENT), app exclusions (MOBILEAPPLICATION), app-category exclusions (MOBILEAPPCATEGORY), or content-label exclusions (CONTENTLABEL). Batch operation. Use searchgoogleads to find criterionid for removal.
Permanently remove an account-wide (customer-level) negative criterion. Use searchgoogleads to find criterion_id first.
List all Google Ads customer account IDs accessible with the current credentials. Use the customer_id from this result when calling other tools.
Get details of a specific Google Ads customer account (ID, name, currency, timezone).
List customizer attribute definitions (dynamic ad copy placeholders) for a Google Ads account. Use this to find customizerattributeid before calling setcustomizervalue or removecustomizerattribute.
Create a customizer attribute definition that ad copy can reference as {CUSTOMIZER.name} for dynamic per-entity substitution. Follow with setcustomizervalue to bind an actual value at the customer, campaign, or ad group level.
Delete a customizer attribute definition and all its bound values. Use listcustomizerattributes to find the exact customizerattributeid first.
List customizer values bound at the customer, campaign, or ad group level. Use this to find an existing binding before calling removecustomizervalue.
Bind a customizer value to a customer, campaign, or ad group so ad copy referencing {CUSTOMIZER.name} substitutes it for that entity. Use listcustomizerattributes to find customizerattributeid first.
Remove a customizer value binding from a customer, campaign, or ad group. Use listcustomizervalues to find the exact binding first.
Set a dynamic numeric/price ad parameter for a keyword, substituted into ad text via {param1:} or {param2:} placeholders. Use listkeywords to find the criterionid first.
Update the substituted text of an existing ad parameter.
Remove an ad parameter from a keyword.
List a Google Ads account's YouTube video/channel data links. Requires allow-listed access to DataLinkService. Use this to find the resourcename before calling updatedatalink or removedata_link.
Link a Google Ads account to a specific YouTube video for creator collaboration campaigns. Requires allow-listed access to DataLinkService; the requesting account's name and ID are shared with the video's channel owner.
Change the status of an existing YouTube data link. Use listdatalinks to find the exact resource_name first.
Remove an existing YouTube data link. Use listdatalinks to find the exact resource_name first.
Create an experiment shell to A/B test campaign changes. It does nothing until you add its arms with addexperimentarm, then start it with schedule_experiment.
Add arms to an experiment. Pass the control arm (naming the live campaigns) with treatmentarms to create all arms in one request, which Google requires because the splits must total 100 per request; each treatment's draft campaign is generated from the control. Then scheduleexperiment starts it.
Start an experiment, which begins serving the treatment arm and spending budget. This starts an async operation rather than finishing immediately: poll getexperiment for the status moving SETUP to INITIATED to ENABLED. Add all arms with addexperiment_arm first.
Apply the treatment arm's changes to the original campaign and end the experiment. Irreversible: the original campaign is permanently overwritten, so confirm must be true. To keep the treatment as a separate campaign instead, use graduateexperiment; to discard it, use endexperiment.
Turn an experiment's treatment into a permanent standalone campaign, leaving the original untouched. Each in-design campaign needs its own budget, so confirm must be true. Use listexperimentarms for the campaigns and listcampaignbudgets for the budgets.
End an experiment without keeping its treatment, discarding the treatment arm's changes. Irreversible, so confirm must be true. To keep the changes instead, use promoteexperiment or graduateexperiment before ending.
List experiments on an account, optionally filtered by status or type. Use this to find an experiment_id, or to see which experiments are still in SETUP and which are running.
Read one experiment, including its current status. This is how you poll a scheduleexperiment or promoteexperiment operation: watch status move SETUP to INITIATED to ENABLED, or on to PROMOTED, GRADUATED, or HALTED.
List an experiment's arms, their traffic splits, and the campaigns each covers. A treatment arm's indesigncampaigns are the draft campaigns graduate_experiment needs to map to budgets.
Look up GAQL field/resource metadata (data type, selectable/filterable/sortable) before building a query for searchgoogleads or searchgoogleadsstream. Use names for exact lookups or namecontains to browse a resource's fields. Lean field set by default - set includedetails=True for selectablewith/metrics/segments/enumvalues. Paginate with limit and pagetoken.
List invoices issued for a Google Ads account's billing setup in a specific month. Requires billingsetup (from listbillingsetups), issueyear, and issue_month. Only available for accounts on monthly invoicing.
List payments accounts accessible to a Google Ads account. Use this to find paymentsaccountid before calling createbillingsetup.
List saved keyword plans for a customer. Use createkeywordplan to start a new one, or getkeywordplan for details of a specific plan.
Get details of a specific keyword plan. Use listkeywordplans to find keywordplanid.
Create a new saved keyword plan. Follow with createkeywordplancampaign, createkeywordplanadgroup, and addkeywordplankeywords to build out the plan as a reusable account resource. For performance estimates use generatekeywordforecast_metrics, which forecasts keywords directly and does not read a saved plan.
Rename a saved keyword plan or change its forecast window. Use listkeywordplans to find keywordplanid. At least one of name or forecastdateinterval must be supplied; an omitted field is left unchanged.
Permanently remove a saved keyword plan, along with its campaigns, ad groups and keywords. Use listkeywordplans to find keywordplanid. To remove one part of a plan instead, use removekeywordplancampaign, removekeywordplanadgroup or removekeywordplankeyword.
Remove one campaign from a saved keyword plan, along with its ad groups and keywords. Use searchgoogleads (FROM keywordplancampaign) or the ID returned by createkeywordplan_campaign.
Remove one ad group from a saved keyword plan, along with its keywords. Use searchgoogleads (FROM keywordplanadgroup) or the ID returned by createkeywordplanad_group.
Remove one keyword from a keyword plan ad group. Use the IDs returned by addkeywordplankeywords, or searchgoogleads (FROM keywordplanadgroupkeyword). For a plan's campaign-level negative keywords use removekeywordplancampaign_keyword instead.
Remove one campaign-level negative keyword from a saved keyword plan. Use the IDs returned by addkeywordplancampaignkeywords, or searchgoogleads (FROM keywordplancampaignkeyword). For an ad group's own keywords use removekeywordplankeyword instead.
Create a campaign within a keyword plan, defining the network, geo targets, and languages to forecast against. Use createkeywordplan first to get keywordplanid, suggestgeotargetconstants to find geotargetconstantids, and searchgoogleads (FROM languageconstant) to find languageconstant_ids.
Create an ad group within a keyword plan campaign, to group keywords for forecasting. Use createkeywordplancampaign first to get keywordplancampaignid.
Add keywords to a keyword plan ad group for forecasting. Use createkeywordplanadgroup first to get keywordplanadgroupid.
Add campaign-level negative keywords to a keyword plan, excluding them from every ad group's forecast. These are always negative - use addkeywordplankeywords for keywords to forecast on. Use createkeywordplancampaign first to get keywordplancampaign_id.
Forecast clicks, cost, average CPC, conversions, and average CPA for a set of keywords under a given bidding strategy. Forecasts a hypothetical campaign directly - it does not read a saved keyword plan, so no createkeywordplan setup is needed. Provide exactly one bidding strategy. Note the API returns no impressions or CTR.
Suggest new keywords from seed keywords, a page URL, or a whole site, with search volume and bid estimates. This is keyword research for keywords you do not have yet; use listkeywords for keywords already in an ad group. Use suggestgeotargetconstants and searchgoogleads (FROM language_constant) for the scoping fields.
Look up search volume, competition, and bid estimates for keywords you already have, optionally over a specific month range. Returns the whole batch in one response with no pagination. To discover new keywords instead, use generatekeywordideas.
List keywords (ad group criteria) for a customer with optional filtering by ad group, status, and negative (excluded) flag.
Create one or more keywords in an ad group, positive or negative (excluded). Batch operation: create multiple keywords efficiently in a single call. Use listadgroups to find adgroupid.
Update a keyword's status (ENABLED/PAUSED) or CPC bid. Use listkeywords to find criterionid. To delete a keyword use remove_keyword.
Permanently remove a keyword from an ad group. Use listkeywords to find criterionid.
List labels for a customer with optional filtering by status. Use createlabel to add a new label, or the add*label tools (addcampaignlabel, addadgrouplabel, addadlabel, addkeywordlabel, addcustomerlabel) to apply a label to an entity.
Create a new label that can be applied to campaigns, ad groups, ads, keywords, or the customer account. Use the add*label tools afterward to apply it to entities.
Update a label's name, background color, or description. Use listlabels to find labelid. Use remove_label to delete the label entirely.
Permanently remove a label. This also removes it from every entity it is applied to. Use listlabels to find labelid.
Apply a label to a campaign. Use listcampaigns to find campaignid and listlabels (or createlabel) to find label_id.
Remove a label from a campaign. Use listcampaigns to find campaignid and listlabels to find labelid.
Apply a label to an ad group. Use listadgroups to find adgroupid and listlabels (or createlabel) to find label_id.
Remove a label from an ad group. Use listadgroups to find adgroupid and listlabels to find labelid.
Apply a label to an ad. Use listads to find adid and listlabels (or createlabel) to find label_id.
Remove a label from an ad. Use listads to find adid and listlabels to find labelid.
Apply a label to a keyword. Use listkeywords to find criterionid and listlabels (or createlabel) to find label_id.
Remove a label from a keyword. Use listkeywords to find criterionid and listlabels to find labelid.
Apply a label to the customer (account) itself. Account labels are a manager (MCC) feature: the label must be owned by a manager account of this customer, so pass managercustomerid when the label lives on the manager. Use listlabels (or createlabel) to find label_id.
Remove a label from the customer (account). Use listlabels to find labelid.
Execute multiple create/update/remove operations across resource types in one synchronous request. Use when operations depend on each other's temporary resource names (e.g. a budget plus the campaign using it). For large batches use createbatchjob instead. Requires exact field names - confirm them with discovergaqlfields first.
List a Google Ads account's links to other Google products (Merchant Center, another Google Ads account, or a data partner). Use this to find productlinkid before calling removeproductlink.
Link a Google Ads account to Merchant Center, another Google Ads account, or a data partner. Requires linktype plus the matching ID field (datapartnerid, linkedcustomerid, or merchantcenterid). Use listproduct_links first to check for an existing link.
Remove an existing product link (Merchant Center, linked Google Ads account, or data partner). Use listproductlinks to find the exact productlinkid first.
List pending, accepted, or rejected product link invitations for a Google Ads account (e.g. a Merchant Center account inviting this account to link). Use this to find productlinkinvitationid before calling updateproductlinkinvitation.
Accept, reject, or revoke a pending product link invitation (e.g. from a Merchant Center account). Use listproductlinkinvitations to find the exact productlinkinvitationid first.
List the locations reach planning can forecast for, with their IDs and country codes. Call this first: the location ID feeds listplannableproducts and generatereachforecast targeting, and product availability varies by market. Requires a Cloud project allowlisted for reach planning; otherwise the call fails with 'Developer Token not enabled'.
List the ad products that can be forecast in one location, with the targeting each allows. The returned plannableproductcode values are the only ones generatereachforecast accepts for that location. Use listplannablelocations to find plannablelocationid. Requires a Cloud project allowlisted for reach planning; otherwise the call fails with 'Developer Token not enabled'.
List the account's user lists that can be targeted in a reach forecast, with whether each is currently plannable. Use these IDs in generatereachforecast targeting; listuserlists shows every list, not only the plannable ones. Requires a Cloud project allowlisted for reach planning; otherwise the call fails with 'Developer Token not enabled'.
Search the user interests that can be targeted in a reach forecast, filtered by name or taxonomy path. Use namequery when you know roughly what the audience is called and pathquery to walk the taxonomy. Requires a Cloud project allowlisted for reach planning; otherwise the call fails with 'Developer Token not enabled'.
Get Google's suggested conversion rate for each plannable product, to pass as conversionrate on a planned product in generatereach_forecast instead of guessing. Requires a Cloud project allowlisted for reach planning; otherwise the call fails with 'Developer Token not enabled'.
Forecast reach, impressions and conversions for a mix of up to 15 video ad products before any campaign exists. Codes and location IDs vary by market: call listplannableproducts and listplannablelocations first. Needs a duration - durationindays or a start/end date pair. Requires a Cloud project allowlisted for reach planning; otherwise the call fails with 'Developer Token not enabled'.
List which recommendation types this account auto-applies, with each subscription's status and timestamps. Call this before createrecommendationsubscription to avoid duplicating a type, and to find the subscriptiontype that updaterecommendation_subscription takes.
Subscribe the account to auto-applying one recommendation type, so Google applies matching recommendations as it produces them instead of you polling. The type is immutable once created. Google restricts which types are subscribable and rejects the rest. Use listrecommendationsubscriptions first to avoid duplicating a type.
Pause or resume auto-applying one recommendation type. PAUSED stops it without deleting the subscription, which is the only way to stop it - the service has no remove operation. Status is the only mutable field; the type is fixed at creation. Use listrecommendationsubscriptions to find the subscription_type.
Apply one or more Google Ads recommendations (e.g. budget increases, keyword additions, bid adjustments). Use searchgoogleads (SELECT recommendation.resourcename, recommendation.type FROM recommendation) to find resourcenames first, and check the recommendation's type-specific fields for any required apply parameters.
Dismiss one or more Google Ads recommendations so they stop being surfaced. Use searchgoogleads (SELECT recommendation.resourcename FROM recommendation) to find resourcenames first.
Ask Google what it WOULD recommend for a campaign shape, without a stored recommendation existing. Advisory only: results carry no resource name, so they cannot be passed to applyrecommendations - use searchgoogleads (FROM recommendation) for applicable ones. Ten types, SEARCH or PERFORMANCEMAX only. CAMPAIGNBUDGET additionally needs biddinginfo, countrycodes and languagecodes.
List remarketing actions with their tag snippets - the global site tag and event snippet JavaScript to install on the advertiser's site. Call this after createremarketingaction to retrieve the snippets, which the create call does not return.
Create a remarketing action, which generates the site tag used to collect remarketing data. The tag snippets are not returned here - call listremarketingactions afterwards to read them. There is no remove operation for this resource.
Rename a remarketing action. Name is the only writable field - the tag snippets are generated by Google and cannot be edited. Use listremarketingactions to find remarketingactionid.
Run a custom GAQL (Google Ads Query Language) query to retrieve arbitrary resource data and metrics. Use this for custom reports, performance metrics, or any data not available through structured tools. Example: SELECT campaign.name, metrics.clicks, metrics.impressions FROM campaign WHERE campaign.status = ENABLED
Run a custom GAQL query using server-side streaming for large result sets, instead of page-by-page retrieval like searchgoogleads. Use this when you expect a very large number of rows (e.g. account-wide keyword or ad performance reports) and want them all in one call rather than paginating through searchgoogleads with page_token.
Read the account's identity verification state: which programs apply, their start and completion deadlines, the current status, and the actionurl the advertiser must visit to finish. Call this before startidentity_verification to check whether verification is needed, and after it to collect the link. An empty list means none is required.
Start advertiser identity verification for the account. This begins a real compliance process and cannot be undone or cancelled through the API, and it does NOT complete verification: a human must then visit the actionurl that getidentityverification returns. Check getidentity_verification first to confirm it is actually required.
Generate public, time-limited preview links for Performance Max asset groups or ads. Each preview needs a previewtype: UIPREVIEW for a Google Ads UI link, or YOUTUBELIVEPREVIEW for YouTube links - which is the only type that accepts an ad rather than an asset group. Anyone holding a link can view unpublished creative until it expires, so treat the URLs as secrets.
Update the SKAdNetwork conversion value schema that maps iOS postback values to conversion values. UPDATE-only: the schema exists per linked app and cannot be created or removed here. Set validateonly=true to check a schema first, and enablewarnings=true for non-blocking issues. Find customerlinkid with searchgoogleads.
Append messages to Local Services leads, so a provider's replies are recorded against the lead. Batch operation: several conversations in one call, each naming its lead. Find lead resource names with searchgoogleads (FROM localserviceslead).
Submit a satisfaction survey for a Local Services lead, which can earn a bonus credit for a poor lead. A reason is required and must match the answer's polarity; the OTHER* reasons also need a comment. NEUTRAL takes neither - the API has nowhere to carry them. An issued credit becomes usable in about two months. Find lead IDs with searchgoogleads (FROM localservices_lead).
List shared sets (e.g. shared negative-keyword lists) for a customer. Use createsharedset to create one, addsharedcriteria to add keywords to it, and linkcampaignshared_set to attach it to a campaign.
Create a shared set (e.g. a shared negative-keyword list usable across multiple campaigns). Use addsharedcriteria to populate it and linkcampaignshared_set to attach it to a campaign.
Rename a shared set. Use listsharedsets to find sharedsetid.
Permanently remove a shared set. Use listsharedsets to find sharedsetid. Google Ads rejects removing a shared set still attached to a campaign - unlink it with unlinkcampaignshared_set first.
List the criteria inside a shared set - keywords carry text and matchtype, placements carry placementurl. Use addsharedcriteria to add more, removesharedcriterion to remove one.
Add keywords or placements to a shared set. Pass exactly one of them, matching the set's own type: keywords for NEGATIVEKEYWORDS, placements for NEGATIVEPLACEMENTS - check it with listsharedsets. Batch operation. Use createsharedset first, and linkcampaignshared_set to attach the set to a campaign.
Remove a keyword from a shared set. Use listsharedcriteria to find criterion_id.
List which shared sets are attached to which campaigns. Use linkcampaignsharedset / unlinkcampaignsharedset to change attachments.
Attach a shared set (e.g. a shared negative-keyword list) to a campaign, applying it to that campaign. Use createsharedset to create the set first.
Remove a campaign's link to a shared set. The shared set and its criteria are not deleted, only the attachment to this campaign.
Create a Shopping campaign advertising a Merchant Center feed. merchantid is required and immutable, and the Merchant Center account must already be linked to this customer. campaignpriority (0-2) is required too. Build the product partition tree with createlistinggroupsubdivision and createlistinggroupunit. Defaults to PAUSED.
Create a Shopping product ad. It takes no creative at all - headlines, images and prices come from the Merchant Center feed, so the only inputs are the ad group and a status. Which products it covers is set by the product partition tree, not here. Create the ad group with createadgroup type=SHOPPINGPRODUCTADS. Defaults to PAUSED.
List the product partition tree of a Shopping ad group, with each node's type, case value, parent and bid. Call this to find the criterionid values that createlistinggroupsubdivision, createlistinggroupunit and removelisting_group take, and to see which subdivisions still lack an 'everything else' unit.
Create a SUBDIVISION node in a Shopping ad group's product partition tree together with its first bidding leaves, in one request. Omit parentcriterionid for the tree's single root, which takes no dimension. units must share one dimension and include exactly one 'everything else' unit, which Google requires in the same request. Add more leaves later with createlistinggroup_unit.
Add a UNIT leaf to an existing subdivision in a Shopping ad group's product partition tree: it sets the bid for the products it matches, or excludes them with negative=true. The subdivision's 'everything else' unit already exists from createlistinggroupsubdivision; use this for further leaves on the same dimension. Use listlistinggroups for parentcriterion_id.
Remove a node from a Shopping ad group's product partition tree. Removing a subdivision removes everything beneath it, and removing a unit can leave its parent subdivision incomplete, which Google rejects on the next edit - so re-check the tree with listlistinggroups afterwards.
Resolve location names (e.g. 'New York', 'France') or existing geo target constant IDs to Google Ads geo target constants for use in geographic targeting. This is a global lookup, not scoped to a customer account.
Suggest Smart Campaign keyword themes matching a business description (e.g. 'plumber'). This is a global lookup, not scoped to a customer account.
Suggest brands matching a name prefix, for brand exclusion or brand safety targeting. Use selectedbrandids to exclude brands already chosen.
Create a Hotel campaign advertising a Hotel Center feed. hotelcenterid is required, and the Hotel Center account must already be linked to this customer or the create is rejected. PERCENT_CPC bids a fraction of the room price; COMMISSION pays per completed stay. Hotel ads carry no creative - add an ad group and let Google build from the feed. Defaults to PAUSED.
Create a Travel campaign advertising a Travel account's activities feed. travelaccountid is required and IMMUTABLE, so it can only be set here, and the account must already be linked or the create is rejected. Travel ads carry no creative; use suggesttravelassets for text and image assets. Defaults to PAUSED.
Get Google's suggested text and image assets for travel places, keyed by Google Places ID. Use it to populate a Travel campaign's creative rather than writing hotel copy by hand. Read-only, and place_ids may be omitted to let Google choose places from the linked Travel account.
List users with existing access to a Google Ads account, including their userid, email, and accessrole. Call this before updatecustomeruseraccess or removecustomeruseraccess to find the exact user_id.
Invite a new user to access a Google Ads account by email. The user must accept the invitation before gaining access. Use listcustomerusers first to check whether the user already has access.
List pending, accepted, or expired user access invitations for a Google Ads account. Call this before cancelcustomeruserinvitation to find the exact invitationid.
Cancel a pending user access invitation, preventing the invited email from gaining access. Requires the exact invitationid from listcustomeruserinvitations - no fuzzy matching is performed.
Change an existing user's access role on a Google Ads account (e.g. from STANDARD to ADMIN). This changes what the user can do - requires the exact userid from listcustomer_users, no fuzzy matching is performed.
Revoke a user's access to a Google Ads account entirely. This immediately blocks the user from accessing this account. Requires the exact userid from listcustomer_users - no fuzzy matching is performed. Cannot remove the account's last remaining admin.
Add people to a Customer Match list by email, phone, or name and address. Create the list with createuserlist; find existing ids with listuserlists. Plaintext is normalized and SHA-256 hashed before it leaves, so never send values you may not share. Up to 10000 per call. Returns a requestid for getuserlistupload_status; matching takes hours to reach the list's size.
Remove specific people from a Customer Match list by email, phone, or name and address. Identify them the same way they were uploaded - matching is on the hash, so a different identifier removes nobody. Use listuserlists for userlistid. Returns a requestid for getuserlistuploadstatus. To empty a list entirely use removealluserlist_members.
Empty a Customer Match list, leaving the list itself in place. Pass removeasoftime to drop only members added before a moment, or leave it null to remove everyone. Use listuserlists for userlistid. This cannot be undone - the members have to be uploaded again. Returns a requestid for getuserlistuploadstatus.
Check how a Customer Match upload or removal is progressing, by the requestid that uploaduserlistmembers, removeuserlistmembers or removealluserlistmembers returned. Reports SUCCESS, PROCESSING, FAILED or PARTIALSUCCESS per destination, with counts of rejected members by reason. A request made with validate_only=true cannot be polled - Google keeps no status for it and rejects its id.
List user lists (audiences) for a customer, optionally filtered by type. Use createuserlist to create a new Customer Match list, and uploaduserlist_members to put people in one.
Create a new Customer Match (CRM-based) user list. The list starts empty - add people with uploaduserlistmembers, which takes the id this returns. Use listuser_lists to check for an existing list before creating a duplicate.
Update a user list of any type: name, description, membership status (CLOSED stops accepting new members without deleting), membership lifespan, or integration code. Omitted fields stay untouched. To stop using a list but keep its members, set membershipstatus=CLOSED rather than removing it. Use listuserlists to find userlist_id.
Permanently remove a user list. This cannot be undone and any campaign or ad group targeting the list loses it. To stop adding members while keeping the list and its audience, use updateuserlist with membershipstatus=CLOSED instead. Use listuserlists to find userlist_id.
Validate Google Ads OAuth2 credentials by listing accessible customer accounts, then reading the login customer account if one is set, or up to 3 listed accounts otherwise, to confirm the app can reach production accounts.

In an mcp.json file, add the configuration below, and restart Cursor.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "url": "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
5 "headers": {
6 "Authorization": "Bearer yMt*****"
7 }
8 }
9 }
10}
11Open your Claude Desktop configuration file and add the server configuration below. You'll also need to restart the application for the changes to take effect.
Make sure Claude is using the Node v20+.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "yMt*****"
14 }
15 }
16 }
17}Open your Windsurf MCP configuration file and add the server configuration below.
Click on the refresh button in the top right of the Manage MCP server page or in the top right of the chat box in the box icon.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api.merge.dev/api/v1/tool-packs/<tool-pack-id>/registered-users/<registered-user-id>/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "<ah-production-access-key>"
14 }
15 }
16 }
17 }In Command Palette (Cmd+Shift+P on macOS, Ctrl+Shift+P on Windows), run "MCP: Open User Configuration".
You can then add the configuration below and press "start" right under servers. Enter the auth token when prompted.
Learn more in the official documentation ↗
1{
2 "inputs": [
3 {
4 "type": "promptString",
5 "id": "agent-handler-auth",
6 "description": "Agent Handler AUTH_TOKEN", // "yMt*****" when prompt
7 "password": true
8 }
9 ],
10 "servers": {
11 "agent-handler": {
12 "type": "stdio",
13 "command": "npx",
14 "args": [
15 "-y",
16 "mcp-remote@latest",
17 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
18 "--header",
19 "Authorization: Bearer ${input:agent-handler-auth}"
20 ]
21 }
22 }
23}Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now