AdLoop

com.getadloop由 getadloop.com 发布官方发布者v0.40.1更新于 Nov 8, 2026

Google Ads MCP server with Reddit Ads, GA4 and Tag Manager. Every change is previewed first.

已验证Streamable HTTP可网页运行开发者工具数据与分析商业与电商

概览

AI 生成的概览

把 Google Ads、Reddit Ads、GA4、Tag Manager、Search Console 和 Merchant Center 接入 AI 客户端,每次改动前先预览。

可以做什么
  • 读取并分析 Google Ads 广告系列、关键词、搜索词、受众、PMax 素材与变更历史,并可执行任意 GAQL 查询
  • 读取 GA4 报表、实时数据、关键事件与维度,并把 Ads 点击与 GA4 会话和转化做交叉对照
  • 查看 Google Tag Manager 容器、代码、触发器、变量、工作区与版本差异,并审计代码库、GTM 与 GA4 之间的事件覆盖
  • 读取 Search Console 查询数据、Merchant Center 商品 Feed 健康状况与商品问题,并分析落地页速度
  • 用关键词发现和预算预估做规划,并通过草稿、预览、确认流程起草 Google Ads 广告系列、广告、素材和关键词
  • 管理 Reddit Ads 广告系列、广告组、广告、受众与效果数据,并上传图片用作广告素材
适用场景
适合营销和分析人员让助手排查 Google Ads、Reddit Ads、GA4 与 GTM 的付费与自然流量表现,诊断跟踪或归因问题,并准备需要人工确认后才上线的广告改动。
运行要求
可使用远程端点,或在本地以 PyPI 包 adloop 通过 stdio 运行。需要 OAuth 登录;每个 Google 产品都要在 GCP 项目中启用对应 API,账号需具备相应权限。Reddit Ads 需要单独创建开发者应用并完成 OAuth。GTM 写入工具默认关闭,需修改配置并授予额外权限范围。
安装前请注意
写入工具可创建、修改、暂停、归档和发布广告系列、广告、标签与工作区,发布 GTM 改动会直接影响线上网站;Custom HTML 标签需显式允许才会被接受。Reddit 的删除是不可逆的归档。OAuth 令牌保存在本地,启用 GTM 写入需重新授权编辑与发布权限。

安装

在 SourceWeft 中

  1. 打开 控制台中的 AdLoop,将其添加到工作区。
  2. 连接 所需的 凭据。它们会被私密存储,绝不会在公开页面上展示。
  3. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/com.getadloop%2Fadloop/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。 客户端会在首次连接时完成 OAuth 登录。

{
  "mcpServers": {
    "adloop": {
      "type": "http",
      "url": "https://mcp.getadloop.com/mcp"
    }
  }
}

README

AdLoop

The AI command center for Google Ads, Reddit Ads, GA4, and tracking code.

[PyPI] [License: MIT] [Python 3.11+] [MCP Compatible] [Google Ads API] [GA4 Data API] [GitHub stars] [Smithery]

An MCP server that gives your AI assistant read + write access to Google Ads, Reddit Ads and GA4 — with safety guardrails that prevent accidental spend.

☁️ Skip the setup — use AdLoop Cloud (free plan, no card)  ·  or self-host: pip install adloop

[!TIP] AdLoop Cloud is the hosted version of this project, with a free plan that needs no credit card. Connect Google in two clicks and use the full toolset from claude.ai, ChatGPT, Claude Code, Cursor, or Gemini. No Google Cloud project, no API access application, no OAuth verification wait. EU-hosted, GDPR-first, DPA included.

📚 Documentation: docs.getadloop.com — setup guides per AI client, toolsets, the safety model, and troubleshooting for both editions.


Cloud or Self-Hosted?

Both versions run the same tools with the same safety model. The difference is who handles the plumbing:

☁️ AdLoop Cloud🛠️ Self-hosted (this repo)
SetupConnect Google in two clicks~5 min: own Google Cloud project + adloop init
Google Cloud projectNot neededRequired (free)
Ads API accessNot neededGranted to your Cloud project (no developer token, no MCC since Sept 2026)
Works withclaude.ai, ChatGPT, Claude Code, Cursor, GeminiClaude Code, Cursor, Claude Desktop, any local MCP client
Where your data flowsEU servers (Germany), GDPR-first, DPA included100% your machine — nothing leaves it
UpdatesAutomaticpip install -U adloop
PriceFree plan, no card; paid plans for more accounts and volumeFree forever (MIT)

Not sure? Start with Cloud — it's the fastest way to see what AdLoop can do, and it's the only way to use AdLoop from claude.ai or ChatGPT. Self-host when you want everything on your own machine or need to modify the code. And if you're here to hack on AdLoop itself: welcome, keep scrolling.

What It Solves

AdLoop exists because managing Google Ads alongside your code is a mess. These are the specific problems it handles:

  • "My conversions dropped and I don't know why." AdLoop cross-references Ads clicks, GA4 sessions, and conversion events in one query. It detects whether the gap is from GDPR consent rejection, broken tracking, or an actual landing page problem — before you waste hours checking each dashboard separately.

  • "I'm wasting ad spend on irrelevant searches." Pull your search terms report, identify the junk, and add negative keywords — all from a single conversation in your IDE. No context-switching to the Ads UI.

  • "Is my tracking even working?" Compare the event names in your actual codebase against what GA4 is receiving. Find the mismatches: events you fire that GA4 never sees, events GA4 records that you didn't know about.

  • "I need to create ads but the Google Ads UI is hostile." Draft responsive search ads, create campaigns, add keywords — all through natural language. Every change shows a preview first. Nothing goes live without your explicit confirmation: in Claude, ChatGPT and VS Code the preview is an approval card, and only your click on Apply changes the account (the AI cannot press it). New ads and campaigns start paused.

  • "My landing page gets paid traffic but nobody converts." AdLoop joins your ad final URLs with GA4 page-level data. See which pages get clicks but no conversions, which have high bounce rates, and which ones are orphaned from any ad campaign.

  • "Are conversions even being tagged on every page?" AdLoop reads your live Google Tag Manager container, joins it against the events in your codebase and the events firing in GA4, and tells you exactly which conversions are being captured, which tags are paused, which page-scope filters are too narrow, and which codebase events have no tag at all — the kind of three-way audit GTM Preview can't give you in a single view.

  • "I don't know if my EU consent setup is causing data gaps." In Europe, 30-70% of users reject analytics cookies. AdLoop accounts for this automatically — it won't diagnose a normal GDPR consent gap as broken tracking.

Built From Real Usage

Every tool exists because of an actual problem hit while running real Google Ads campaigns. The cross-reference tools exist because we kept manually asking the AI to "get Ads data, then get GA4 data, then compare them" — so we automated the join. The Broad Match + Manual CPC safety rule exists because the AI once created that exact combination and wasted budget. The GDPR consent awareness exists because the AI kept diagnosing normal EU cookie rejection as broken tracking.

The best features come from real workflows. If you're using AdLoop and find yourself wishing it could do something it can't, open an issue describing your situation — not just "add feature X" but "I was trying to do Y and couldn't because Z." The context matters more than the request.

All Tools

Quick start: pip install adloop or git clone https://github.com/kLOsk/adloop.git && cd adloop && uv sync && uv run adloop init — or zero setup on AdLoop Cloud

Diagnostics

ToolWhat It Does
health_checkTest OAuth, GA4, and Ads connectivity in one call — actionable error messages if anything is broken. Also reports the pinned Google Ads API version and warns if a newer version is available.

GA4 Read Tools

ToolWhat It Does
get_account_summariesList GA4 accounts and properties
run_ga4_reportCustom reports: sessions, users, key events, page performance. Optional dimension and metric filters, ordering, paging, and a comparison period
run_realtime_reportLive data — verify tracking fires after deploys
get_tracking_eventsAll configured events and their volume
list_key_eventsThe property's key events (conversions) with counting method, create time and whether they can be deleted
list_ga4_dimensions_and_metricsEvery dimension and metric the property can report on, including custom ones, with search

Google Ads Read Tools

ToolWhat It Does
list_accountsDiscover accessible Ads accounts
get_campaign_performanceCampaign metrics: impressions, clicks, cost, conversions, CPA, Search impression share and share lost to budget/rank
get_ad_performanceAd copy analysis: headlines, descriptions, CTR, policy approval status and topics
get_keyword_performanceKeywords — quality scores, competitive metrics
get_search_termsWhat users actually searched before clicking
get_negative_keywordsList direct campaign-level negative keywords
get_negative_keyword_listsList all shared negative keyword lists (SharedSets) — names, IDs, status, keyword count
get_negative_keyword_list_keywordsList the keywords inside a specific shared negative keyword list
get_negative_keyword_list_campaignsList which campaigns a shared negative keyword list is attached to
get_recommendationsGoogle's auto-generated recommendations with type, estimated impact, and campaign context
get_recommendation_subscriptionsWhich recommendation types Google applies automatically (auto-apply), with status and last change; flags any that are on
get_pmax_performancePerformance Max campaign metrics with network breakdown + asset group ad strength
get_pmax_assetsPer-asset details for PMax — field type, serving status, content
get_asset_group_signalsA PMax asset group's search themes and audience signal, plus the audiences available for it
get_detailed_asset_performanceTop-performing asset combinations — which headline+description+image combos Google selects most
get_audience_performanceAudience segment performance — remarketing, in-market, affinity, demographics
get_shopping_product_performanceSpend, conversions, CPA and ROAS per product across Shopping and Performance Max, plus products that spent without converting
get_change_historyWhat changed before the drop: who changed what and when, through which client (UI, API, scripts, auto-applied recommendations), last 30 days
get_demographic_targetingList demographic criteria (age/gender/parental status/income) on an ad group or campaign
get_audience_listsThe account's remarketing and customer lists (size, eligibility, open/closed), custom and combined segments
search_audience_segmentsFind Google's in-market and affinity segments by name
get_audience_targetingAudiences and audience exclusions on a campaign or ad group, plus the audience mode (observation or targeting)
suggest_brandsResolve a brand name to the brands Google recognizes — brand ID, name, state, URLs
check_brand_namesCheck a shortlist of brand names against Google's brand knowledge graph (max 25 per call)
get_brand_listsList brand lists (SharedSets of type BRANDS) — ID, name, status, member count
get_brand_list_brandsList the brands inside a list, with the Commercial KG MID and the criterion ID for removals
get_brand_list_campaignsWhich campaigns a brand list is attached to, and whether each attachment excludes or targets
get_ai_max_settingsAI Max knobs per campaign and ad group — enable_ai_max, bundling_required, the full asset_automation_settings list and each ad group's disable_search_term_matching
get_campaign_settingsOne flat record per Search campaign — networks, location option, campaign-level broad match, bidding, budget, URL options and AI Max — with the settings that widen reach flagged
get_custom_conversion_goalsCustom conversion goals with their actions, plus one campaign's goal config
run_gaqlArbitrary GAQL queries for anything else

Brand lists — a list is a SharedSet of type BRANDS; attaching it to a campaign is a CampaignCriterion.brand_list (negative=true excludes, false restricts), not a CampaignSharedSet like negative keyword lists. remove_from_brand_list and detach_brand_list_from_campaigns remove for real — SharedCriterion has no status field.

Brand targeting — brand criteria (brand lists, brand exclusions) target a brand's Commercial Knowledge Graph ID, not its display name. Use suggest_brands for a single name or check_brand_names for a shortlist to get the ID; exact_match marks a candidate whose name matches apart from case and punctuation, everything else is a Google suggestion.

AI Max is the container for Search brand exclusions — Google rejects a brand list on a plain Search campaign with "For search advertising channel, brand lists can only be applied to exclusive targeting, broad match campaigns for inclusive targeting or PMax generated campaigns." draft_prepare_brand_exclusions sets the state that makes the exclusion usable without handing Google the automations: AI Max on, search term matching off per ad group, text and final-URL automation opted out. draft_ai_max_settings is the general form when only parts of that state should change — it refuses a plan that would leave an automation on unnoticed, and asks for a second confirmation when that automation was requested explicitly.

Custom conversion goals — a named set of conversion actions that a campaign can be pointed at. get_custom_conversion_goals shows the goals with their actions and a campaign's current goal config; draft_custom_conversion_goal creates a set, draft_update_custom_conversion_goal renames or replaces its actions, draft_assign_custom_conversion_goal points a campaign at it and draft_clear_custom_conversion_goal puts the campaign back on the account-level goals. Only the goal and the campaign's goal config are touched — conversion actions, bidding and budgets stay as they are.

Compact mode — get_campaign_performance, get_keyword_performance, get_search_terms, and get_ad_performance accept compact=true: account totals, breakdowns, top-10 rows, and pre-computed offender lists (zero-conversion spenders, low-QS keywords, negative-keyword candidates, thin RSAs) instead of every row. ~90% smaller responses — built for account audits so raw tables don't flood your AI's context.

Cross-Reference Tools (GA4 + Ads Combined)

These tools call both APIs internally and return unified results with auto-generated insights. They're the core of what makes AdLoop different from having separate GA4 and Ads tools.

ToolWhat It Does
analyze_campaign_conversionsMaps Ads clicks → GA4 sessions → conversions per campaign. Detects GDPR consent gaps, computes real CPA, compares paid vs organic channels.
landing_page_analysisJoins ad final URLs with GA4 page data. Shows conversion rate, bounce rate, and engagement per landing page. Flags pages with paid traffic but zero conversions.
attribution_checkCompares Ads-reported conversions vs GA4 events. Diagnoses whether discrepancies are from GDPR consent, attribution windows, or broken tracking.

Tracking Tools

ToolWhat It Does
validate_trackingCompare event names found in your codebase against what GA4 actually records. Returns matched, missing, and unexpected events with diagnostics.
generate_tracking_codeGenerate ready-to-paste GA4 gtag JavaScript for any event, with recommended parameters for well-known events (sign_up, purchase, etc.) and optional trigger wrappers.

Google Tag Manager Tools

These tools read the live GTM container and join it with the codebase + GA4 to find tracking gaps that pure GA4 inspection can't catch — page-scoped triggers, paused tags, dynamic event names, brittle CSS selectors, and codebase events with no tag wired up at all.

ToolWhat It Does
audit_event_coverageThe flagship. Three-way join: codebase events ↔ GTM tags ↔ GA4 actual fires. For each event name in expected_events, returns one of 10 statuses (ok, no_tag_no_fire, tag_paused, tag_active_but_not_firing, gtm_only_firing, ga4_only, etc.) plus auto-generated insights for the gaps.
list_gtm_accountsDiscover accessible GTM accounts
list_gtm_containersList containers under an account — returns numeric container_id (needed by other tools), public GTM-XXXXXXX ID, and usage context (web/iOS/Android/server)
list_gtm_tagsEvery tag in the live container with parsed event names and resolved firing/blocking trigger names. Pass workspace_id to read a workspace's unpublished state instead, so a just-drafted tag is visible (also on get_gtm_tag, list_gtm_triggers, get_gtm_trigger, list_gtm_variables)
get_gtm_tagFull raw config for a single tag — every parameter, firing/blocking triggers with filter conditions, priority, pause status, sampling
list_gtm_triggersEvery trigger with filter conditions parsed to readable text (e.g. {{Page Path}} contains service-promotions, {{Form ID}} NOT contains wf-form-...). Renders the negate flag explicitly.
get_gtm_triggerFull trigger config + reverse lookup of every tag that uses it. Includes parsed element_visibility block (selector, on-screen ratio, firing frequency) for elementVisibility triggers and group_member_trigger_ids for triggerGroup types
list_gtm_variablesCustom variables (data layer, constants, JS) plus enabled built-in variables
list_gtm_workspacesList drafts (workspaces) under a container — workspace IDs are needed by get_gtm_workspace_diff
get_gtm_workspace_diffDrafted-but-not-published changes — common cause of "I edited a tag but nothing happened". Returns is_clean: true when nothing is pending.
list_gtm_versionsVersion history, newest first, with version IDs and entity counts. The Tag Manager API returns no timestamps or author for versions.
get_gtm_versionName, notes and tag/trigger names for a single historical container version
get_gtm_version_diffWhat a publish changed: added, removed and changed tags, triggers and variables with the changed fields, plus built-in variables enabled or disabled. Defaults to the live version against the one before it; two or three API calls.
GTM write tools (opt-in)

Off by default. Set gtm.write_enabled: true in ~/.adloop/config.yaml and restart; the next call asks you to re-consent with the Tag Manager edit + publish scopes, which are never part of the default grant. Everything follows the usual draft → preview → confirm_and_apply flow, and tag/trigger edits only touch a workspace until you publish it.

ToolWhat It Does
draft_gtm_tagCreate a tag, or update one by tag_id. Updates are a read-modify-write: parameters merge by key and every field you don't pass (priority, consent settings, firing options, schedule, folder, …) is preserved. Tag types are canonical GTM template IDs (googtag, gaawe, awct, sp, gclidw, …) or cvt_<id> gallery templates.
draft_gtm_triggerCreate a trigger, or update one by trigger_id (type is immutable). custom_event_name wires a customEvent trigger to a dataLayer event.
draft_gtm_variableCreate or update variables, e.g. Data Layer Variables for GA4 ecommerce values; renaming a referenced variable is refused, Custom JavaScript is gated
draft_delete_gtm_entityDelete a workspace tag, trigger or variable. Triggers and variables still in use are refused up front, with the references listed.
draft_publish_gtm_workspacePublish a workspace live. The preview lists every pending change, including edits other people made in the GTM UI.
draft_rollback_gtm_versionRepublish an older container version live. The preview is the diff from the live version to the target; the plan pins the live version, so apply refuses if someone publishes in between. Workspaces are left as they are.

Safety gates specific to GTM:

  • Custom HTML runs arbitrary JavaScript on your site, so creating or editing an html tag — or publishing a workspace that adds or changes one — is refused unless gtm.allow_custom_html: true is also set. Pausing or deleting one is always allowed.
  • No stale writes. Updates and deletes pin the entity's fingerprint from the preview, and publish pins the workspace's pending changes; if someone edits the container in between, apply refuses and you re-draft.
  • Publishing stops on merge conflicts or GTM compiler errors. The dry run runs a Tag Manager quick preview first (Tag Manager has no validate-only mode), so compiler errors surface before a version is even created. That preview is a POST and stores a preview version in the container — nothing is published and no live tag changes; the rest of the dry run only reads.
  • The publish and rollback results name the version they replaced (previous_live_version_id), so rolling back is one step: draft_rollback_gtm_version with that id. If the version was created but publishing it failed, the error carries both the created version id and the still-live one.
  • Per-operation names for safety.blocked_operations: gtm_create_tag, gtm_update_tag, gtm_delete_tag, gtm_create_trigger, gtm_update_trigger, gtm_delete_trigger, gtm_publish_workspace, gtm_rollback_version.

The Google account also needs Edit permission on the container (and Publish to publish) under Admin → User Management.

Setup for GTM tools — Enable the Tag Manager API v2 in your GCP project, then add your AdLoop credentials' email (the OAuth user, or the service account email if using a service account) as a Read user on the GTM container under Admin → User Management. Service accounts pick up access on the next call. OAuth users upgrading from an earlier AdLoop version must re-authorize once: the GTM scope is new, so delete ~/.adloop/token.json and run any tool to re-consent — until then GTM tools return a permissions error.

Search Console Tools

ToolWhat It Does
list_gsc_sitesList Search Console properties the connected account can access
run_gsc_reportOrganic search analytics: clicks, impressions, CTR, position by query/page/country/device/date/searchAppearance/hour. Supports fresh data (data_state="all"), aggregation_type, and paging past 25,000 rows with start_row

Web Performance Tools

ToolWhat It Does
analyze_page_speedPageSpeed Insights for landing pages: Lighthouse score, Core Web Vitals, real-user CrUX data (falls back to origin-wide data, labelled as such, when the page has too little traffic), top fixes. No OAuth needed (optional API key).

Merchant Center Tools

ToolWhat It Does
list_merchant_accountsDiscover accessible Merchant Center accounts
get_merchant_feed_healthFeed health — approved/pending/disapproved counts per reporting context, top product issues with docs, account-level issues. Disapprovals silently starve Shopping/PMax.
get_merchant_product_issuesThe products behind the feed-health counts: which are disapproved, limited or pending, and each issue with its attribute and affected countries

Setup for Merchant Center tools — Enable the Merchant API in your GCP project (the Content API for Shopping is deprecated). The Merchant API has no read-only scope; AdLoop uses it strictly read-only. Upgrading OAuth users re-authorize once.

Setup for GSC tools — Enable the Search Console API in your GCP project. Upgrading OAuth users must re-authorize once for the new scope (delete ~/.adloop/token.json, run any tool). The killer combo: cross-reference organic queries with get_keyword_performance to find paid/organic cannibalization and untapped keyword opportunities.

Reddit Ads Tools

A second ad platform, same safety model. Reddit is a separate connection: its own developer app, its own OAuth, no developer token and no approval process. Every tool takes ad_account_id (defaults to reddit.ad_account_id).

ToolWhat It Does
list_reddit_accountsDiscover businesses and ad accounts (currency, time zone, approval state)
list_reddit_funding_instrumentsBilling instruments and posting profiles — prerequisites for creating campaigns and ads
get_reddit_campaigns / get_reddit_ad_groups / get_reddit_adsStructure with configured vs effective status, budgets, bids, pixel, targeting, weekly schedule, rejection reasons; include_copy returns each ad's post (headline, body, destination, media)
get_reddit_performanceSpend, clicks, CTR, CPC, conversions, CPA, ROAS per account/campaign/ad group/ad, optional breakdown (date, country, community, keyword, placement, …), compact mode with insights
run_reddit_reportRaw reports endpoint for any metric (REACH, video, per-event conversions)
get_reddit_pixelsPixels and when each event last fired — flags ad groups optimizing for events the pixel never sent
get_reddit_audiencesCustom and saved audiences with status, size and source, plus the ad groups that target or exclude each
search_reddit_targetingCommunities, interests, geolocations, languages, keyword suggestions, and Reddit's related-community suggestions (by seed communities or website)
get_reddit_account_historyWho changed what and when: field, before/after, member
estimate_reddit_ad_groupAudience size, delivery estimate and suggested bid range for a planned ad group (Reddit's counterpart of estimate_budget)
pause_reddit_entity / enable_reddit_entity / remove_reddit_entityStatus changes through the preview gate (remove = ARCHIVE, irreversible, double-confirmed)
update_reddit_campaign / update_reddit_ad_group / update_reddit_adBudget, bid, run dates, weekly schedule (day names, viewer-local hours), targeting, placements and audiences to target or exclude (validated with Reddit at draft time), landing URL and comment changes with old → new previews, budget cap and bid-increase guards
draft_reddit_campaign / draft_reddit_ad_group / draft_reddit_adCreate campaign → ad group (pixel + targeting required) → post + ad (text, image, video or a 2–6 card carousel, media by URL), or promote an existing post with post_id. Everything is created PAUSED.
draft_reddit_custom_audienceRetargeting audiences from website visitors (pixel events) or people who engaged with your campaigns. No customer-list uploads.

Setup for Reddit Ads tools — In Reddit Ads Manager open Business Manager → Developer Application → Create app (business admins only; no approval wait). Register the redirect URL exactly as http://localhost:8765/callback, then run adloop init and complete the Reddit Ads step: it opens Reddit's consent page (scopes adsread + adsedit, permanent grant), stores the refresh token at ~/.adloop/reddit_token.json, and lets you pick the default ad account. Reddit rate-limits per user (reporting: 60 requests/min) and requires a descriptive User-Agent, which AdLoop builds from your app id and Reddit username. Reddit has no validate-only mode, so confirm_and_apply(dry_run=true) re-reads the target and re-checks the safety caps instead.

Image Uploads

An image on your computer, or one you attached in the chat, has no public URL, and an AI app cannot hand the file to a tool. upload_images gives it a way in.

[An AdLoop upload card in an AI chat: the user drags a banner onto it, the card shows the upload id, posts it into the chat, and the AI drafts the image asset]

ToolWhat It Does
upload_imagesShows an upload card in apps with MCP Apps (drop PNG, JPEG or GIF up to 5 MB); on AdLoop Cloud in other apps it returns a one-time upload link, which a coding agent can also use with curl -T
list_uploadsThe uploads that have not expired yet (kept 24 hours), with id, dimensions and size

The upload ids go into draft_image_assets(upload_ids=[...]), or as upload:<id> into the image fields of draft_reddit_ad on AdLoop Cloud.

Planning Tools

ToolWhat It Does
discover_keywordsDiscover new keyword ideas from seed keywords and/or a URL — with optional per-month search history + seasonality insights (include_monthly_volumes) using Google Ads Keyword Planner. Returns avg monthly searches, competition level, and top-of-page bid range.
estimate_budgetForecast clicks, cost, and conversions for a set of keywords using Google Ads Keyword Planner. Supports geo/language targeting. Essential for budget planning before launching campaigns.

Google Ads Write Tools

All write operations follow a draft → preview → confirm workflow. Nothing executes without explicit approval.

ToolWhat It Does
draft_campaignCreate a full campaign structure — budget + campaign (PAUSED) + ad group + optional keywords. Supports Search partners, display expansion, the location option (presence vs presence or interest), campaign URL options (tracking template, final URL suffix, custom parameters), and max_cpc for either MANUAL_CPC initial ad-group bids or TARGET_SPEND (Maximize Clicks) CPC caps.
draft_shopping_campaignCreate a Standard Shopping campaign for a linked Merchant Center feed — budget, campaign (PAUSED), product ad group, Shopping ad and an "All products" group in one atomic request. Manual CPC, Maximize clicks or target ROAS.
draft_asset_group_assetsAdd and remove Performance Max assets (text, images incl. uploads, YouTube videos) in one change, so replacing an asset never drops a group below Google's minimums
draft_asset_group_signalsAdd search themes or set the audience signal of a PMax asset group
draft_pmax_product_exclusionsExclude products from a retail PMax asset group by item id, brand or custom label
update_campaignModify existing campaign settings — bidding, budget, geo/language targeting, the location option, campaign URL options, campaign-level broad match (Smart Bidding only), Search partners, display expansion, and TARGET_SPEND (Maximize Clicks) max_cpc caps.
draft_ad_groupCreate a paused SEARCH_STANDARD ad group inside an existing campaign, with optional MANUAL_CPC max_cpc.
update_ad_groupUpdate an ad group name and/or MANUAL_CPC max_cpc. Use pause_entity / enable_entity for ad-group status changes.
draft_responsive_search_adCreate RSA preview (3-15 headlines ≤30 chars, 2-4 descriptions ≤90 chars). Warns if headline/description count is below best practice.
draft_calloutsCreate callout assets (1-25 characters) for an ad group, a campaign or the account.
draft_structured_snippetsCreate structured snippet assets for an ad group, a campaign or the account, using official header values and 3-10 values.
draft_business_name_assetCreate the business name shown with the ads, for a campaign or the account.
link_asset_to_customerLink existing assets account-wide; the asset type is checked against the field type.
update_callout / update_sitelink / update_structured_snippetEdit an asset in place, keeping its ID and history; the apply refuses if it was changed in Google Ads since the preview.
draft_call_asset / update_call_assetCreate a call asset (phone number) for an ad group, a campaign or the account, or edit one in place; numbers are parsed and checked against their country.
add_ad_scheduleAdd ad schedule windows to a campaign; overlaps are refused, and a campaign's first schedule needs a double confirmation.
draft_promotion / update_promotionCreate a promotion asset, or edit one in place without losing the fields you don't pass; amounts in the account currency.
draft_price_assetCreate a price asset with 3-8 offerings, in the account currency.
draft_image_assetsCreate campaign image assets from local files, public image URLs or uploads (PNG, JPEG, or GIF); a business logo can also go on the account.
draft_keywordsPropose keyword additions with match types. Proactively checks bidding strategy — flags BROAD match on campaigns without Smart Bidding as dangerous in the preview.
add_negative_keywordsPropose negative keywords directly on a campaign
add_negative_locationsPropose negative geo exclusions on a campaign — exclude cities/regions while keeping broader positive targets
draft_key_eventMark a GA4 event as a key event (conversion) — the fix for "fires but isn't tracked as a conversion"
draft_delete_key_eventRemove a GA4 key event. The event keeps firing but no longer counts as a conversion, for future data only
draft_demographic_targetingPropose demographic criteria (age, gender, parental status, income) — exclusions by default
draft_audience_attachmentAttach audiences as observation (default), targeting (double confirmation) or exclusion; refuses pairings Google doesn't allow and Search lists too small to target
propose_negative_keyword_listDraft a shared negative keyword list (SharedSet) and attach it to a campaign — reusable across multiple campaigns
propose_brand_listDraft a brand list (SharedSet of type BRANDS) from Commercial KG MIDs and optionally attach it to campaigns — negative=true (default) excludes the brands, false restricts targeting to them
add_to_brand_listDraft adding brands to an existing brand list
remove_from_brand_listDraft removing brands from a list (SharedCriteria have no status — removal is the only way; asks for a second confirmation)
attach_brand_list_to_campaignsDraft attaching an existing brand list to campaigns as CampaignCriterion.brand_list
detach_brand_list_from_campaignsDraft detaching a brand list from campaigns (removes only the criterion, the list stays)
draft_ai_max_settingsDraft AI Max controls for a Search campaign: enable_ai_max, per-ad-group disable_search_term_matching, plus text and final-URL asset automation (each OPTED_IN / OPTED_OUT / UNCHANGED)
draft_prepare_brand_exclusionsDraft the safe standard state in one step: AI Max on, search term matching off for every non-removed ad group, text and final-URL automation opted out. Touches nothing else
draft_custom_conversion_goalCreate a custom conversion goal (a named set of conversion actions)
draft_update_custom_conversion_goalRename a custom conversion goal and/or replace its action list (list replace, not append)
draft_assign_custom_conversion_goalPoint a campaign at a custom conversion goal (goal_config_level = CAMPAIGN)
draft_clear_custom_conversion_goalPut a campaign back on the account-level goals (rollback)
draft_dismiss_recommendationsDismiss Google recommendations you won't take, so they stop reappearing (Google can show them again later)
draft_recommendation_subscriptionsPause auto-apply for recommendation types, so Google stops changing the account without a preview. Switching auto-apply back on stays in the Google Ads UI
pause_entityPause a campaign, ad group, ad, keyword or PMax asset group
enable_entityRe-enable a paused entity
remove_entityPermanently remove an entity (irreversible — prefers pause). Supports keywords, negative keywords, ads, ad groups, campaigns.
confirm_and_applyExecute a previously previewed change

Orchestration Rules

AdLoop ships with orchestration rules that teach the AI how to combine these tools — marketing workflows, GAQL syntax, safety protocols, GDPR awareness, and best practices. Without rules, the AI has tools but doesn't know the playbook.

  • Cursor: .cursor/rules/adloop.mdc (canonical source)
  • Claude Code: .claude/rules/adloop.md (synced from Cursor rules via scripts/sync-rules.py)

The rules include:

  • Orchestration patterns for common workflows (performance review, conversion diagnosis, campaign creation, negative keyword hygiene, keyword discovery, tracking validation, budget planning, landing page analysis)
  • GAQL quick reference with syntax, common queries, and gotchas
  • Safety rules including Broad Match + Manual CPC prevention and pre-write validation
  • Ad copy character limit guidance (30-char headlines are shorter than you think)
  • GDPR consent awareness to prevent false tracking diagnoses in EU markets

Slash Commands (Claude Code)

AdLoop includes pre-built slash commands in .claude/commands/ for common workflows:

CommandWhat It Does
/analyze-performanceFull performance review across Google Ads + GA4
/create-adCreate a responsive search ad with safety checks
/diagnose-trackingDiagnose tracking and conversion issues
/optimize-campaignFull optimization checklist for a campaign
/create-campaignCreate a new search campaign with budget estimation
/budget-planEstimate budget for keywords via Keyword Planner

Safety Model

AdLoop manages real ad spend, so safety is not optional.

[An AdLoop approval card in an AI chat: the user clicks Test run, Google validates the change, then Apply makes it live and the card reports back to the chat]

  • Approval cards. In apps that show MCP Apps (Claude, ChatGPT, VS Code and others), every change appears as a card with Test run and Apply. Only the click applies it: the AI's own confirm_and_apply(dry_run=false) is refused with APPROVE_ON_CARD, whatever it was told in the chat.
  • Confirmation dialogs. Apps without cards that support elicitation (Claude Code, for example) get a dialog from AdLoop itself before every real change. The AI cannot answer it; declining changes nothing.
  • Two-step writes. Every mutation returns a preview first. A separate confirm_and_apply call is required to execute.
  • Dry-run by default. Even confirm_and_apply defaults to dry_run=true. Real changes require explicit dry_run=false.
  • Two-phase apply (optional). With safety.two_phase_apply: true, confirm_and_apply refuses dry_run=false until the plan has completed one dry-run pass — preview-then-apply becomes server-enforced instead of a convention.
  • Budget caps. Configurable maximum daily budget — the server rejects anything above the cap.
  • Audit log. Every operation (including dry runs) is logged to ~/.adloop/audit.log.
  • New campaigns and ads are PAUSED. Nothing goes live without manual enablement.
  • Destructive ops are flagged for double confirmation. Removing entities or large budget increases come back with extra warnings, and the AI is instructed to confirm twice.
  • Broad Match without Smart Bidding caught. The #1 cause of wasted ad spend: draft_campaign refuses BROAD keywords unless the campaign uses Smart Bidding, and draft_keywords / draft_ad_group mark them as dangerous in the preview, so the AI has to raise it before anything is applied.
  • Pre-write validation. Before any write, the AI checks bidding strategy, conversion tracking status, and quality scores. If the campaign is fundamentally broken, AdLoop warns you instead of making things worse.
  • Structured error handling. All tools return actionable error messages with hints instead of raw exceptions. Auth errors include specific re-authorization steps.
  • API version pinning. The Google Ads API version is pinned to prevent silent breaking changes from library updates. health_check warns when a newer version is available.
  • Ask mode compatibility. Read tools declare readOnlyHint so they work in Cursor's Ask mode without switching to Agent mode.

Setup

AdLoop uses your own (free) Google Cloud project for OAuth. The adloop init wizard walks you through it — a one-time setup of about 5 minutes, with no shared user caps and no waiting on anyone's verification review. AdLoop does not ship built-in OAuth credentials.

Prefer zero setup? AdLoop Cloud is the hosted version: connect Google in two clicks — no Cloud project, no API access application, EU-hosted.

(Upgrading from ≤0.9 with built-in credentials? Those sign-ins were retired in 0.10 — run adloop init once to switch to your own project.)

[!IMPORTANT] Seeing deleted_client: The OAuth client was deleted. or invalid_client? The shared Google Cloud project behind AdLoop ≤0.9's bundled credentials has been shut down, so its stored sign-ins no longer refresh. Two ways forward: AdLoop Cloud (connect Google in two clicks, nothing to configure) or stay self-hosted with pip install -U adloop && adloop init to set up your own free Google Cloud project. Details in the pinned issue (#49).

Install

From PyPI:

bash
pip install adloopadloop init

From source:

bash
git clone https://github.com/kLOsk/adloop.gitcd adloopuv syncuv run adloop init

What adloop init does

The wizard first asks whether to set up Google. Answer no to run AdLoop on Reddit Ads alone: it skips steps 1 to 6 and goes straight to the Reddit step. Otherwise it walks you through:

  1. Google Cloud setup — creates a project, enables the three APIs, generates an OAuth client (see Custom Google Cloud Project Setup below for the exact steps the wizard refers you to)
  2. Google Ads API access — applied for on your Cloud project's Google Ads API Overview page; the legacy developer-token prompt can be left empty
  3. MCC Account ID — optional, only if you reach several accounts through a Manager Account
  4. OAuth sign-in — opens a browser to sign in with Google (or prints a URL for headless servers)
  5. Auto-discovers your accounts — finds your GA4 properties and Ads accounts automatically
  6. Optional services — pin a GTM container, a Search Console property (both auto-discovered too), and a PageSpeed API key; skip any of them with Enter
  7. Reddit Ads — optional next to Google, required without it: your own Reddit developer app, sign-in, and the default ad account
  8. Safety defaults — budget cap and dry-run preference
  9. Toolsets — optionally expose only part of the tool catalog to your AI client (see Toolsets)
  10. Editor config snippets — prints MCP configuration for both Cursor and Claude Code, including your toolset selection

Requirements

  • Python 3.11+
  • A Google Ads account (a Manager Account is optional; you only need one to reach several accounts through one login)
  • Google Ads API access on your Google Cloud project (see below)

Google Ads API access

Since 9 September 2026, Google Ads API access belongs to the Google Cloud project that owns your OAuth client. Developer tokens are sunset: the API ignores the header, the wizard's token prompt is optional, and you no longer need a Manager Account to get access.

Apply on your project's Google Ads API Overview page in the Cloud Console:

LevelHow to get itWhat it allows
TestAutomatic when you enable the Google Ads APITest accounts only, not production accounts. CLOUD_PROJECT_NOT_APPROVED_FOR_PRODUCTION (or DEVELOPER_TOKEN_NOT_APPROVED on older API versions) means you are here.
Explorer"Upgrade access level" → apply; usually granted automatically2,880 operations/day on production accounts. Enough to get started.
BasicApply; reviewed automatically within minutes once the project is brand-verified (OAuth consent screen set to External and published "In production")15,000 operations/day.
StandardApply; manual review, about ten business daysHigher limits; Google's RMF policy applies

Projects on a Cloud free trial or with billing disabled are refused Explorer and Basic; use a project with billing set up.

Getting CLOUD_PROJECT_NOT_APPROVED_FOR_PRODUCTION? Your project is at Test level. Open the Overview page above and apply for Explorer access.

Headless Servers

Running on a server without a browser (VMs, Docker, SSH)? The wizard automatically detects this and falls back to a manual flow: it prints an authorization URL you can open on any device, then you paste the redirect URL back into the terminal.

Custom Google Cloud Project Setup

The wizard refers to these steps — do them in your browser before running adloop init (or while it waits at the OAuth prompt).

Step 1 — Google Cloud Project
  1. Go to console.cloud.google.com and create a new project
  2. Enable these three APIs (search for each in the API Library):
    • Google Analytics Data API — for GA4 reports and events
    • Google Analytics Admin API — for listing GA4 properties
    • Google Ads API — for all ads operations
Step 2 — OAuth Credentials
  1. In your Google Cloud project, go to APIs & Services → Credentials
  2. Click Create Credentials → OAuth client ID
  3. Select Desktop app as the application type, give it any name
  4. Download the JSON file and save it as ~/.adloop/credentials.json

Service accounts are also supported — just place the service account key JSON at the same credentials_path. AdLoop detects the file type automatically.

Step 3 — Connect to Your Editor

Cursor — Add to your project's .cursor/mcp.json:

json
{  "mcpServers": {    "adloop": {      "command": "/absolute/path/to/adloop/.venv/bin/python",      "args": ["-m", "adloop"]    }  }}

Then copy .cursor/rules/adloop.mdc from this repo into your project's .cursor/rules/ directory.

Claude Code — Run:

bash
claude mcp add --transport stdio adloop -- /absolute/path/to/adloop/.venv/bin/python -m adloop

Or add to your project's .mcp.json:

json
{  "mcpServers": {    "adloop": {      "command": "/absolute/path/to/adloop/.venv/bin/python",      "args": ["-m", "adloop"]    }  }}

Then install the orchestration rules + slash commands globally so every Claude Code session inherits them:

bash
adloop install-rules

This writes a managed block to ~/.claude/CLAUDE.md and copies the slash commands (prefixed adloop-*) into ~/.claude/commands/. The block is delimited by sentinel comments so it's safe to run multiple times — re-running just refreshes the content. Two install modes:

  • inline (default for install-rules) — full rules embedded in ~/.claude/CLAUDE.md. Reliable, but they load into every Claude Code session in every repository, about 30K tokens, whether AdLoop is connected or not.
  • lazy (adloop install-rules --lazy, and the default in adloop init) — a short directive in CLAUDE.md pointing at ~/.adloop/rules/adloop.md. The LLM reads the rules file only when AdLoop tools are in scope, so sessions without AdLoop stay almost free. The file sits outside ~/.claude/ on purpose: Claude Code loads everything in ~/.claude/rules/ into every session.

To refresh after upgrading AdLoop: adloop update-rules. To remove cleanly: adloop uninstall-rules — only the managed block and adloop-* commands are touched, never your own content.

If you'd rather manage things by hand instead, copy .claude/rules/adloop.md and .claude/commands/ from this repo into your project's .claude/ directory.

Claude Desktop / claude.ai has no programmatic rules location. Run adloop install-rules and it will print the rules content for you to paste into Project settings → Custom instructions on claude.ai.

Use It

Ask your AI assistant things like:

  • "How are my Google Ads campaigns performing this month?"
  • "Which search terms are wasting budget? Add them as negative keywords."
  • "My sign-up conversions dropped — check GA4 and Ads to find out why."
  • "Draft a new responsive search ad for my main campaign."
  • "Which landing pages get paid traffic but don't convert?"
  • "Is my tracking set up correctly? Compare my codebase events against GA4."
  • "Audit my Google Tag Manager container — which conversions are being captured and where are the gaps?"
  • "What keywords should I target for [product]? Find ideas and estimate the budget."
  • "How much budget would I need for these keywords in Germany?"
  • "Create a new search campaign for [product feature] with a €20/day budget."

Configuration Reference

All configuration lives in ~/.adloop/config.yaml. See config.yaml.example for a documented template.

SectionKeyDefaultDescription
googleproject_id(empty)Google Cloud project ID (only needed with custom credentials)
googlecredentials_path(empty)Path to OAuth client JSON or service account key. Empty = ~/.adloop/credentials.json, else Application Default Credentials.
googletoken_path~/.adloop/token.jsonWhere to store the OAuth token (auto-created)
ga4property_id—Your GA4 property ID (auto-discovered by adloop init)
adsdeveloper_token—Legacy, optional: API access belongs to your Cloud project since Sept 2026
adscustomer_id—Default Google Ads customer ID (auto-discovered by adloop init)
adslogin_customer_id—Your MCC account ID
redditclient_id / client_secret(empty)Your Reddit developer app (Business Manager → Developer Application)
redditad_account_id(empty)Default Reddit ad account for every Reddit tool (picked by adloop init)
redditusername(empty)Your Reddit username, used only in the User-Agent Reddit requires
reddittoken_path~/.adloop/reddit_token.jsonWhere the Reddit refresh token is stored
safetymax_daily_budget50.00Maximum allowed daily budget per campaign
safetyrequire_dry_runtrueForce all writes to dry-run mode
safetytwo_phase_applyfalseRefuse real applies until the plan had a dry-run pass
safetyblocked_operations[]Operations to block entirely

Toolsets — trim the context footprint

Most MCP clients (claude.ai, ChatGPT, Cursor, …) load every tool schema into the model's context at the start of every conversation. With AdLoop's full catalog that's a noticeable share of the context window, paid before you type a word. If you only use part of AdLoop, expose a subset with the ADLOOP_TOOLSETS environment variable in your MCP client's env block (the adloop init wizard offers this and writes it into the snippets for you):

json
"env": { "ADLOOP_TOOLSETS": "ads,ga4" }
ToolsetCovers
adsGoogle Ads reads, writes, and planning (Keyword Planner)
ga4Google Analytics reports, realtime, key events
trackingCross-channel attribution + tracking code generation
gtmGoogle Tag Manager audits, reads, and opt-in writes
gscSearch Console reads
webPageSpeed / Core Web Vitals
merchantMerchant Center feed health
redditReddit Ads reads, writes, and planning

Google Ads can be narrowed further. Use one of these instead of ads:

SubsetCovers
ads:readAds reports, GAQL, and the Ads/Analytics cross-checks (attribution_check, analyze_campaign_conversions, landing_page_analysis)
ads:writeAds drafts and changes; turns on ads:read too, because a draft needs the reads first (IDs, bidding strategy)
ads:planKeyword ideas and budget forecasts (discover_keywords, estimate_budget)

health_check and confirm_and_apply are always included, whatever you select. Unset = the full catalog; unknown names fail at startup with the valid list. The effect is real: ads:read,ga4 costs about 40% of ads,ga4 for audits and diagnosis, and an ads:plan-only client for keyword research pays about 5% of the full catalog. Toolsets are per client, not per install: one AdLoop config can serve a trimmed Cursor and a full-catalog Claude Code side by side.

On AdLoop Cloud, the same feature is per API key: pick toolsets when creating a key in the dashboard, and that key's tools/list is trimmed server-side for whichever AI client uses it.

Project Structure

src/adloop/├── __init__.py        # Entry point — routes 'adloop init' to wizard, otherwise starts MCP server├── server.py          # FastMCP server — every tool registration with safety annotations and toolset tags├── config.py          # Config loader (~/.adloop/config.yaml)├── auth.py            # OAuth 2.0 flow (user-supplied credentials, headless fallback) + service accounts; GA4 / Ads / GTM scopes├── cli.py             # Interactive 'adloop init' setup wizard├── crossref.py        # Cross-reference tools (GA4 + Ads + GTM combined analysis)├── tracking.py        # Tracking validation + code generation tools├── ga4/│   ├── client.py      # GA4 Data + Admin API clients│   ├── reports.py     # Account summaries, reports, realtime│   └── tracking.py    # Event discovery├── ads/│   ├── client.py      # Google Ads API client (version-pinned) + retry/backoff for rate limits│   ├── gaql.py        # GAQL query execution with human-readable error parsing│   ├── read.py        # Campaign, ad, keyword, search term, negative keyword, shared sets, recommendations, audience reads│   ├── pmax.py        # Performance Max tools — campaign/asset group performance, asset labels, top combinations│   ├── write.py       # Draft campaign, RSA, keywords; pause, enable, remove, confirm│   └── forecast.py    # Budget estimation + keyword discovery via Keyword Planner API├── gtm/│   ├── client.py      # Google Tag Manager API v2 client│   └── read.py        # Live container fetching, tag/trigger/variable parsing, workspace diff, version history├── reddit/│   ├── auth.py        # Reddit OAuth2 (own app, permanent refresh token, loopback flow for adloop init)│   ├── client.py      # Reddit Ads API v3 REST client — bearer refresh, per-user rate limits, pagination│   ├── read.py        # Accounts, campaigns, ad groups, ads, performance reports, pixels, targeting lookups│   └── write.py       # Draft/preflight/apply for status, budget, bid, targeting, and PAUSED creation└── safety/    ├── guards.py      # Budget caps, bid limits, blocked operations, Broad Match safety    ├── preview.py     # Change plans and previews    └── audit.py       # Mutation audit logging

Roadmap

What's been shipped and what's next:

  • GA4 read tools ✓
  • Google Ads read + write tools with safety layer ✓
  • Cross-reference intelligence (campaign→conversion mapping, landing page analysis, attribution comparison) ✓
  • Tracking utilities (validate events against GA4, generate gtag code) ✓
  • Budget estimation + keyword discovery via Keyword Planner ✓
  • Shared negative keyword lists (SharedSet API) ✓
  • Retry/backoff for API rate limits ✓
  • Setup wizard (adloop init) ✓
  • Claude Code support ✓ — CLAUDE.md, .mcp.json, .claude/rules/, .claude/commands/, CLI wizard snippets
  • Claude Desktop one-click install — adloop install claude-desktop (and/or a .dxt extension bundle) that writes the AdLoop MCP entry into claude_desktop_config.json automatically, so Claude Desktop + Cowork users don't have to hand-edit JSON
  • PyPI package ✓ — pip install adloop
  • AdLoop Cloud ✓ — the hosted version: no Google Cloud project, no API access application, connect Google in two clicks (EU-hosted, GDPR-first)
  • Headless server support ✓ — manual URL copy-paste flow for servers without a browser
  • Behavioral eval suites ✓ — prompt-and-expectation tests in tests/evals/ covering read, write, tracking, and planning workflows
  • Google Tag Manager integration ✓ — read tools for tags, triggers, variables, workspaces, and version history, plus the audit_event_coverage three-way join across codebase events, GTM tags, and GA4 actual fires
  • Community launch — HN, Indie Hackers, r/cursor, Twitter
  • Video walkthrough

Contributing

See CONTRIBUTING.md for guidelines. The short version: open an issue describing your situation first, then submit a PR if you want to build it.

License

MIT — see LICENSE.

Privacy

The open-source version runs entirely on your machine. No data is collected, stored, or transmitted to any server. See PRIVACY.md for the full privacy policy. AdLoop Cloud has its own privacy policy and DPA.


If AdLoop helps you run Google Ads, GA4, and tracking code from one place — give it a star or try the hosted version.

Made by @kLOsk | AdLoop Cloud | Privacy Policy

来源:README.md,提交 d1a49a3

工具

165

health_check

Connection health check

Test AdLoop connectivity — checks OAuth token, GA4 API, Google Ads API, and (when configured) the Reddit Ads API. Returns the status of each service and actionable guidance when something is broken, which makes it the diagnostic for failures in other tools. Google Ads API: https://developers.google.com/google-ads/api/docs/start, Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Reddit Ads API: https://ads-api.reddit.com/docs/v3/

无需输入参数。

get_account_summaries

List Analytics properties

List all GA4 accounts and properties accessible by the authenticated user. Serves as the discovery step for which GA4 properties are available. Returns account names, property names, and property IDs. Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

无需输入参数。

run_ga4_report

Analytics report

Run a custom GA4 report with optional filters, ordering, paging and a comparison period. Returns the property, the date range, the dimension and metric headers, one row per dimension combination (values as strings), row_count and total_row_count (plus next_offset while more rows remain). At least one dimension or metric is required. With compare_start/compare_end the comparison period is a second date range: every row then carries a dateRange value of "current" or "comparison", and date_ranges maps both labels to their dates. Invalid filters or ordering return "Validation failed" with details, before anything is sent. insights[] says when GA4 thresholded or sampled the data, grouped rows into "(other)", or the property is close to its API quota, because each makes numbers differ from the GA4 interface. Reports over time (a date-type dimension) or comparing periods also return the property's annotations in those dates, which often explain a jump in the rows. Queries the GA4 Data API. Dimensions and metrics: https://developers.google.com/analytics/devguides/reporting/data/v1/api-schema

输入参数limitoffsetmetricsorder_bydimensionscompare_enddate_rangesproperty_idcompare_startcurrency_codemetric_filterdate_range_end另有 2 个

run_realtime_report

Analytics realtime report

Run a GA4 realtime report showing current active users and events. Useful for checking if tracking is firing correctly after code changes: filter on the event that just shipped, or compare the last few minutes with the minutes before. Returns the dimension and metric headers and one row per dimension combination over the realtime window (the last 30 minutes unless minute_ranges says otherwise). When a filter matches nothing, insights[] lists the usual causes. Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

输入参数limitmetricsorder_bydimensionsproperty_idmetric_filterminute_rangesdimension_filter

get_ga4_property

Analytics property overview

Show a GA4 property's configuration in one call: details, linked Google Ads accounts, data streams and data retention. Returns the property's display name, time zone, currency, industry, service level (standard or 360), type and create time; every linked Google Ads account (customer ID, whether it is a manager account, personalized advertising); every data stream with its measurement ID or app ID; how many months event and user data are kept; and the number of key events. insights[] flags settings that cost data: two-month retention, no Google Ads link while key events exist, the configured Ads account not being linked, a property in the trash. A part the user may not read is listed under unavailable instead of failing the call. Reads the GA4 Admin API (properties.get, googleAdsLinks.list, dataStreams.list, getDataRetentionSettings, keyEvents.list). Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

输入参数property_id

get_tracking_events

List Analytics events

List all GA4 events and their volume for the given date range. Returns every distinct event name with its total event count, sorted by count (highest first). Shows what tracking is configured and active. Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

输入参数property_iddate_range_enddate_range_start

list_key_events

List Analytics key events

List the key events (conversions) configured on a GA4 property. Returns each key event's event name, counting method (ONCE_PER_EVENT or ONCE_PER_SESSION), create time, whether GA4 allows deleting it, whether it is a custom event, and its resource name, sorted by event name, plus the total. Reads the GA4 Admin API (keyEvents.list). Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

输入参数property_id

list_ga4_dimensions_and_metrics

Analytics dimensions and metrics

List the dimensions and metrics a GA4 property can report on, including custom ones. Returns the exact API names valid in run_ga4_report for this property: each with its UI name, category, whether it is a custom definition (customEvent:..., customUser:...), and deprecated API names; metrics also carry their type and, for calculated metrics, the expression. Reads the GA4 Data API metadata (properties.getMetadata), which uses no report quota. Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

输入参数kindsearchcustom_onlyproperty_idinclude_descriptions

run_ga4_funnel

Analytics funnel report

Run a GA4 funnel report: how many users go from one step to the next, and where they drop off. Steps are event names or pages, in order. Returns per step the users, completion rate to the next step, abandonments and abandonment rate, plus how many started and finished, the overall completion rate and the biggest drop (after which step most users leave). With breakdown, the same per value of a dimension (e.g. deviceCategory); with next_action, the most common next event or page after each step, i.e. what users do instead. Uses the GA4 Data API v1alpha (runFunnelReport), the endpoint behind GA4's funnel explorations; data reaches back as far as the property's data retention. Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

输入参数stepsbreakdownnext_actionopen_funnelproperty_iddate_range_endbreakdown_limitdate_range_startdimension_filter

run_ga4_attribution

Analytics conversion attribution

Show which channels, campaigns or sources get the credit for conversions under GA4's attribution models, or compare data-driven with last click. The view of GA4's Advertising workspace: conversions, revenue, ad cost and ROAS per channel (or campaign, source, country, device) attributed by the model, not by session. attribution_model COMPARE runs data-driven and last click side by side and returns each row's share of the credit under both and the shift in percentage points, with insights naming the channels that gain or lose most. Conversions can be named by key event name; empty means all. Uses the GA4 Data API v1alpha (runReport with a conversion spec), which Google is still rolling out: a property without it gets an explanation and the fallback. Ad cost and ROAS need Google Ads linked to the property. Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

输入参数limitmetricsdimensionsconversionsproperty_iddate_range_enddate_range_startattribution_model

audit_ga4_property

Analytics setup audit

Audit a GA4 property's setup in one call: the settings that quietly cost data or conversions. Checks data retention (two months is GA4's default and cuts explorations short), the Google Ads link (and whether the configured Ads account is linked), each data stream's activity in the last 7 days, key events that never fired in 28 days or no key events at all, enhanced measurement per web stream, Google signals (and the thresholding they cause), the custom dimension and metric limits, and a property in the trash. Returns checks with status warn, info or ok (warnings first), a summary count, and the warnings as insights[]; a check the user may not read is listed under unavailable. Reads GA4 only (Admin API, part v1alpha, and two small Data API reports); for whether Google Ads imports the key events, run check_key_event_imports. Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

输入参数property_id

list_ga4_annotations

List Analytics annotations

List a GA4 property's annotations, the notes GA4 shows on a date or date range in its charts. Returns each annotation's ID (resource name), title, description, color, and its date or start and end date, newest first; Google's own annotations are marked system_generated. With a date range, only the annotations that overlap it. The first stop for "what happened on that day?" next to get_change_history in Google Ads. Reads the GA4 Admin API v1alpha (reportingDataAnnotations.list). Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

输入参数property_iddate_range_enddate_range_start

list_ga4_custom_definitions

List Analytics custom definitions

List a GA4 property's custom dimensions and custom metrics, with how many slots are left. Returns each custom dimension's resource name, parameter name, display name, scope (EVENT, USER or ITEM) and description, and each custom metric's resource name, parameter name, display name, measurement unit and description, plus usage per kind against the property's limit (standard: 50 event, 25 user, 10 item dimensions, 50 metrics; 360: 125, 100, 25, 125). Use it before draft_ga4_custom_dimension or draft_ga4_custom_metric. For the field names to use in reports, see list_ga4_dimensions_and_metrics. Reads the GA4 Admin API (customDimensions.list, customMetrics.list). Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

输入参数property_id

list_gsc_sites

List Search Console properties

List all Google Search Console properties the authenticated user can access. Serves as the discovery step for the site URLs that search analytics reports (run_gsc_report) take. Returns the site URL and permission level for each property. Search Console API: https://developers.google.com/webmaster-tools

无需输入参数。

run_gsc_report

Search Console report

Run a Google Search Console search analytics report. Returns clicks, impressions, CTR, and average position broken down by the requested dimensions. Useful for diagnosing organic traffic drops, finding keyword opportunities, and cross-referencing with GA4 and Ads data. One request returns at most 25,000 rows; a full page carries next_start_row for the following request. With data_state "all" the response metadata names the first date whose data is still incomplete. Queries the Search Console API: https://developers.google.com/webmaster-tools/v1/searchanalytics/query

输入参数limitsite_urlstart_rowdata_statedimensionssearch_typedate_range_endaggregation_typedate_range_startdimension_filter_groups

analyze_page_speed

PageSpeed analysis

Run PageSpeed Insights for a landing page — Lighthouse + real-user data. Returns the performance score (0-100), lab Core Web Vitals (LCP, CLS, TBT, FCP), CrUX field data from real Chrome users where available (p75 LCP/INP/CLS/FCP/TTFB + FAST/AVERAGE/SLOW ratings), and the top improvement opportunities with estimated savings. When the page itself has too little traffic for field data, the origin-wide field data is returned instead, marked field.scope="origin". Typical input is an ad final_url: slow landing pages depress Quality Score and waste paid clicks. Takes 10-30s; that is normal for a Lighthouse run. PageSpeed Insights API: https://developers.google.com/speed/docs/insights/v5/about

输入参数url必填strategy

list_merchant_accounts

List Merchant Center accounts

List Google Merchant Center accounts the connected user can access. Returns each account's numeric ID, name and whether it is a test account. Provides the account_id used by get_merchant_feed_health; not needed when merchant.account_id is set in the config. Merchant API: https://developers.google.com/merchant/api/overview

无需输入参数。

get_merchant_feed_health

Merchant Center feed health

Merchant Center feed health — disapproved products + account issues. Disapproved feed items silently starve Shopping and Performance Max campaigns; this reports approved/pending/disapproved counts per reporting context (Shopping ads, free listings, ...), the top product issues by affected products (with documentation links), and account-level issues — CRITICAL ones stop offers serving entirely. Product-status data lags reality by ~30 minutes. Merchant API: https://developers.google.com/merchant/api/overview

输入参数account_id

get_merchant_product_issues

Merchant Center product issues

The products behind the feed-health counts, each with its issues. Lists products by status with offer id, title, brand, click potential and every item issue: its code, the attribute it concerns, severity per reporting context with the affected countries, and whether the merchant has to act or Google is still processing. Products with high click potential come first, because fixing them recovers the most traffic. issues_by_code counts the products per issue. Data lags feed changes by about 30 minutes. Merchant API: https://developers.google.com/merchant/api/overview

输入参数limitstatusaccount_idissue_code

list_accounts

List Google Ads accounts

List accessible Google Ads accounts. Returns account names, IDs, status, and whether each is a manager account. When more accounts exist than `limit`, the response has 'truncated: true'; a much higher limit (e.g. list_accounts(limit=1000)) returns the full list. Workflows that target a specific account need no enumeration at all: get_campaign_performance, run_gaql, etc. take customer_id directly. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数limit

get_campaign_performance

Campaign performance

Get campaign-level performance metrics for a date range. Returns campaign name, status, type, impressions, clicks, cost, conversions, CPA, ROAS, CTR for each campaign, plus Search impression share and the share lost to budget and to ad rank (fractions with matching *_pct percentages; null for campaigns that do not serve on Search or had no impressions). Insights flag converting campaigns that lose a significant share of impressions to budget. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数compactcustomer_iddate_range_enddate_range_start

get_ad_performance

Ad performance

Get ad-level performance data including headlines, descriptions, and metrics. Returns ad type, headlines, descriptions, final URL, impressions, clicks, CTR, conversions, cost for each ad, plus its policy approval status, review status and policy topic names. Disapproved and limited-by-policy ads are listed under policy_issues with their spend. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数compactcustomer_iddate_range_enddate_range_start

get_keyword_performance

Keyword performance

Get keyword metrics including quality scores and competitive data. Returns keyword text, match type, quality score, impressions, clicks, CTR, CPC, conversions for each keyword. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数compactcustomer_iddate_range_enddate_range_start

get_search_terms

Search terms report

Get search terms report — what users actually typed before clicking your ads. Critical for finding negative keyword opportunities and understanding user intent. Returns search term, campaign, ad group, impressions, clicks, conversions. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数compactcustomer_iddate_range_enddate_range_start

get_negative_keywords

List negative keywords

List existing negative keywords for a campaign or all campaigns. Shows the existing negatives, which reveals duplicates before new negative keywords are added. Returns each negative's campaign, keyword text, match type, and a resource_id ("campaignId~criterionId") as taken by remove_entity, plus the total count. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数campaign_idcustomer_id

get_negative_keyword_lists

List shared negative keyword lists

List all shared negative keyword lists (SharedSets) in the account. Returns each list's ID, name, status, and keyword count. Useful before propose_negative_keyword_list: a suitable list may already exist and just need attaching to a campaign. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_id

get_negative_keyword_list_keywords

Keywords in a negative keyword list

List the keywords inside a shared negative keyword list. Returns each negative keyword's text, match type, and a resource_id ("sharedSetId~criterionId"), with the total keyword count. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idshared_set_id必填

get_negative_keyword_list_campaigns

Campaigns using a negative keyword list

List which campaigns a shared negative keyword list is attached to. Returns each list-to-campaign attachment with the list and campaign IDs and names. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idshared_set_id

get_recommendations

Google Ads recommendations

Retrieve Google's auto-generated recommendations with estimated impact. Returns each recommendation's ID, type, associated campaign/ad group, current (base) and projected (potential) metrics, and the estimated improvement. Includes insights that flag budget-increase recommendations (their projected gain comes from spending more) and highlight high-impact suggestions. The `recommendation.id` is what draft_dismiss_recommendations takes. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数campaign_idcustomer_idrecommendation_types

draft_dismiss_recommendations

Draft dismissing recommendations

Dismiss Google Ads recommendations — returns a PREVIEW. Turns down recommendations you will not take (e.g. "add broad match" on a deliberately narrow account) so they stop reappearing in get_recommendations. Nothing in the account changes, and Google can show a dismissed recommendation again later, so a single confirmation is enough. Each ID must be an active recommendation: unknown or already dismissed IDs are refused by name. The preview lists each one's type, campaign and estimated improvement, so the user sees what they are turning down. DismissRecommendation has no validate-only mode: the dry run re-reads the account and checks every recommendation is still active instead of sending the call to Google. The returned plan_id is applied with confirm_and_apply. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idrecommendation_ids必填

get_recommendation_subscriptions

Auto-apply recommendation subscriptions

List the recommendation types Google applies automatically (auto-apply). A subscription makes Google apply every new recommendation of its type without asking, so changes reach the account with no preview. Returns each subscription's type, status (ENABLED or PAUSED), create_date_time and modify_date_time. A type that is not listed is not auto-applied. insights[] names every ENABLED type and flags one modified in the last 30 days, so a recurring audit can catch auto-apply being switched on. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_id

draft_recommendation_subscriptions

Draft pausing auto-apply recommendations

Pause auto-apply for recommendation types — returns a PREVIEW. Pausing is the only change this tool can make: it sets each type's subscription to PAUSED, so Google stops applying those recommendations on its own. Their recommendations still appear in get_recommendations. Re-enabling auto-apply is deliberately not supported; it lets Google change the account without a preview, so it stays a decision for the Google Ads UI. Pausing reduces automation, so a single confirmation is enough. Each type must have an ENABLED subscription (see get_recommendation_subscriptions); a type with none, or one already paused, is refused by name. The dry run sends the request to Google with validate_only. The returned plan_id is applied with confirm_and_apply. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idrecommendation_types必填

get_pmax_performance

Performance Max performance

Get Performance Max campaign and asset group performance. Returns two result sets. campaigns: PMax campaign metrics broken down by ad_network_type (SEARCH, CONTENT, YOUTUBE_SEARCH, YOUTUBE_WATCH, MIXED). MIXED is a catch-all that Google uses for most PMax traffic — full channel splits are not available via the API. asset_groups: per-asset-group metrics including ad_strength (EXCELLENT, GOOD, AVERAGE, POOR). Includes insights flagging weak ad strength, zero-conversion asset groups, and network type distribution. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_iddate_range_enddate_range_start

get_pmax_assets

Performance Max assets

List the assets of Performance Max campaigns with type, status and content. Returns each asset's field_type (HEADLINE, DESCRIPTION, MARKETING_IMAGE, YOUTUBE_VIDEO, etc.), primary_status (ELIGIBLE, NOT_ELIGIBLE, PAUSED, PENDING), and content (text or image URL), plus by_status and by_field_type summaries. Per-asset performance labels (BEST/GOOD/LOW) are not available for PMax assets in the Google Ads API. get_detailed_asset_performance reports which asset combinations Google selects most — the closest proxy for individual asset quality. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数campaign_idcustomer_id

get_detailed_asset_performance

Performance Max asset combinations

Get top-performing asset combinations for Performance Max campaigns. Shows which headline + description + image combinations Google selects most often. Returns each combination with the assets used and their field types. This data helps identify which creative elements work well together. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数campaign_idcustomer_id

get_audience_performance

Audience performance

Get audience segment performance metrics. Returns performance by audience type — remarketing lists (USER_LIST), in-market segments (USER_INTEREST), affinity, demographics (AGE_RANGE, GENDER), etc. Shows display_name, impressions, clicks, cost, conversions, CTR, and CPC for each audience. Works for campaigns with explicit audience targeting (Search, Display). PMax audience targeting is automatic and may not appear in this report. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数campaign_idcustomer_iddate_range_enddate_range_start

get_demographic_targeting

Demographic targeting

List demographic targeting criteria (age, gender, parental status, income). Takes exactly one of ad_group_id or campaign_id. Returns each criterion's value, whether it's negative (excluded) or positive (narrowing), status, and a remove_id (composite resource ID) that can be passed directly to remove_entity with entity_type='ad_group_criterion' or 'campaign_criterion'. By default, Google Ads serves ads to ALL demographic segments — a criterion only appears here once a segment has been actively excluded or narrowed. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数ad_group_idcampaign_idcustomer_id

get_change_history

Change history

List recent account changes: who changed what, when, and through which tool. Answers "what changed before the drop?". Returns each change newest first with its time, the user's email, the client it came through (Google Ads UI, API, Google Ads scripts, Editor, automated rules, auto-applied recommendations, ...), the changed resource type, the operation (CREATE, UPDATE, REMOVE), the changed field paths, and the campaign and ad group names. Also returns counts by resource type, client, user and day, plus insights on auto-applied recommendations and budget or bidding changes. Google Ads keeps change history for 30 days, so older start dates are moved to the earliest available day. Reads the change_event resource: https://developers.google.com/google-ads/api/docs/change-event

输入参数limitcampaign_idcustomer_iddate_range_endresource_typesdate_range_start

analyze_campaign_conversions

Campaign conversions against Analytics

Campaign clicks → GA4 conversions mapping — the real cost-per-conversion. Combines Google Ads campaign metrics with GA4 session/conversion data to reveal click-to-session ratios (GDPR indicator), compare Ads-reported vs GA4-reported conversions, and compute cost-per-GA4-conversion. Also returns non-paid channel conversion rates for comparison context. GA4 conversions are the property's key events (GA4 metric keyEvents). Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idproperty_idcampaign_namedate_range_enddate_range_start

landing_page_analysis

Landing page analysis

Analyze which landing pages convert and which don't. Combines ad final URLs with GA4 page-level data. Returns paid traffic sessions, conversion rates, bounce rates, and engagement per landing page, and identifies pages that get ad clicks but zero conversions and orphaned URLs. Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idproperty_iddate_range_enddate_range_start

attribution_check

Attribution check

Compare Ads-reported conversions vs GA4 — find tracking discrepancies. Checks whether conversions reported by Google Ads match what GA4 records, diagnoses GDPR consent gaps, attribution model differences, and missing conversion event configuration. Returns both sides' totals with the discrepancy and diagnostic insights. GA4 conversions are the property's key events (GA4 metric keyEvents). Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idproperty_iddate_range_enddate_range_startconversion_events

draft_conversion_tracking_setup

Set up conversion tracking

Set up conversion tracking from GA4 into Google Ads in one approved plan, returning a PREVIEW of only the missing steps. Use it when the user wants their conversions (sign-ups, purchases, leads) tracked and used for bidding, or after audit_ga4_property or check_key_event_imports found a gap. It reads both products and plans what is missing, in order: link the GA4 property to the Google Ads account, mark the events as GA4 key events, turn on auto-tagging, import the conversion actions Google Ads created for the key events (they start hidden and record nothing), make them primary, and use their goal for bidding. Steps already in place are listed under already_done. Google Ads creates the conversion action for a newly linked property or new key event by itself, not instantly: such events come back as "After this" warnings, and running the tool again later imports them. NO_CHANGE when everything is set up. The website must send the events; this tool cannot add tracking code (see generate_tracking_code). Nothing changes until confirm_and_apply applies it: the dry run validates the Google Ads steps with validate_only and re-reads the GA4 ones, and every step skips itself if already done, so confirming again after a failed step continues where it stopped. Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数eventsprimarycustomer_idproperty_iddata_retentionads_personalization

check_key_event_imports

Key event import check

Check that every GA4 key event reaches Google Ads: imported, used for bidding, and actually receiving conversions. Matches the property's key events with the Google Ads conversion actions that import them (by GA4 property and event name), and compares GA4's key events from Google Ads traffic (google / cpc) with the conversions Google Ads recorded for each import. insights[] names key events no conversion action imports, imports that are only secondary (reported, not bid on), imports that stay at zero while GA4 counts Google Ads conversions (a broken link or auto-tagging), and imports of events that are no longer key events. Imports from other GA4 properties are listed separately. Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idproperty_iddate_range_enddate_range_start

audit_event_coverage

Tracking coverage audit

Three-way audit: codebase events ↔ GTM tags ↔ GA4 actual fires. Fetches the LIVE GTM container, joins it against GA4 event counts for the date range, and returns a per-event matrix with one of these statuses: ok — tag active and event firing ok_auto_collected — GA4 Enhanced Measurement event, no tag needed no_tag_no_fire — codebase event, no GTM tag, never fires tag_paused — GTM tag exists but is paused tag_active_but_not_firing — tag is active but no GA4 hits gtm_only_firing — GA4 event from a tag, not in codebase gtm_paused_but_firing — only paused tag(s), not in codebase, yet GA4 still fires (event comes from elsewhere) gtm_only_not_firing — tag exists, not in codebase, no fires ga4_only — fires in GA4, no tag, no codebase ref ga4_fires_no_tag — codebase event firing without a GTM tag auto_event_only — Enhanced Measurement event with no codebase ref The result also lists dynamic-event tags ({{Event}} variables) and Custom HTML tags that the audit cannot interpret automatically. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数property_iddate_range_endgtm_account_idexpected_events必填date_range_startgtm_container_id

list_gtm_accounts

List Tag Manager accounts

List all GTM accounts the AdLoop service account / OAuth user can read. The first-time discovery step: provides the account_id that audit_event_coverage takes. Returns each account's ID and name. An empty list means the service account hasn't been added to any GTM container with at least Read permission. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

无需输入参数。

list_gtm_containers

List Tag Manager containers

List all containers under a GTM account. Returns container_id (the numeric ID needed by audit_event_coverage), public_id (the GTM-XXXXXXX string shown in the UI), name, and usage context (web / iOS / Android / amp / server). Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数gtm_account_id

list_gtm_tags

List Tag Manager tags

List every tag in the LIVE GTM container, or in one workspace. Each tag includes type, status, parsed parameters, the GA4 event name (for GA4 event tags), and resolved firing/blocking trigger names. Complements audit_event_coverage for inspecting specific tags. With workspace_id the list shows that workspace's unpublished state, so a just-drafted tag is visible; `source` says which state was read. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数workspace_idgtm_account_idgtm_container_id

get_gtm_tag

Tag Manager tag details

Get the full RAW configuration for a single GTM tag. Includes every parameter, firing/blocking triggers (with their filter conditions resolved to text), priority, pause status, sampling, and monitoring metadata. Suited to inspecting a tag flagged by audit_event_coverage. An unknown tag_id returns an error with the available tag IDs. Reads the live container, or a workspace's unpublished state when workspace_id is set. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数tag_id必填workspace_idgtm_account_idgtm_container_id

list_gtm_triggers

List Tag Manager triggers

List every trigger in the LIVE GTM container, or in one workspace. Each trigger has its filter conditions parsed to readable text (e.g. "{{Page Path}} matches RegExp ^/service-promotions/"). Helps diagnose why a tag fires or doesn't fire on specific pages. With workspace_id the list shows that workspace's unpublished state. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数workspace_idgtm_account_idgtm_container_id

get_gtm_trigger

Tag Manager trigger details

Get the full RAW configuration for a single GTM trigger. Includes filters, auto-event filters, custom-event filters, validation settings, and a list of every tag that uses this trigger. Helps diagnose why a tag with a specific trigger ID does or doesn't fire. An unknown trigger_id returns an error with the available trigger IDs. Reads the live container, or a workspace's unpublished state when workspace_id is set. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数trigger_id必填workspace_idgtm_account_idgtm_container_id

list_gtm_variables

List Tag Manager variables

List GTM variables — both custom and enabled built-in. Without workspace_id both come from the live container version (the Default Workspace supplies the built-ins only when the live version lists none; built_in_source names where they came from). With workspace_id both come from that workspace's unpublished state. Variables matter because triggers reference them: if a trigger uses {{Form ID}} but Form ID isn't enabled, the trigger never matches. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数workspace_idgtm_account_idgtm_container_id

list_gtm_workspaces

List Tag Manager workspaces

List workspaces (drafts) under a GTM container. Returns each workspace's ID, name and description; the IDs are what `get_gtm_workspace_diff` takes. Most containers have a single Default Workspace; multiple workspaces appear when the team uses parallel drafts. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数gtm_account_idgtm_container_id

get_gtm_workspace_diff

Tag Manager workspace changes

Show drafted-but-not-published changes in a GTM workspace. Returns the list of entities (tags, triggers, variables) added, modified, or deleted relative to the live published version, plus any merge conflicts. Common cause of "I edited a tag but nothing happened" — the workspace was never published. is_clean=true means no pending changes and no conflicts. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数workspace_id必填gtm_account_idgtm_container_id

list_gtm_versions

Tag Manager version history

List GTM container version headers (newest first). Version headers include version_id, name, archived flag and entity counts. The Tag Manager API returns no creation or publish time and no author for a version, and does not mark which versions were published; get_gtm_version returns a version's notes and get_gtm_version_diff what changed between two versions. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数page_sizegtm_account_idgtm_container_id

get_gtm_version

Tag Manager version details

Get metadata + entity counts for a single GTM container version. Returns name, description (the version notes), fingerprint, and lists of tag/trigger/variable names at that point in time. The API returns no timestamps or author for a version. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数gtm_account_idgtm_container_idcontainer_version_id必填

get_gtm_version_diff

Tag Manager version diff

Compare two GTM container versions: what a publish changed. Returns added, removed and changed tags, triggers and variables (with names, types and the changed fields; parameters and trigger conditions are diffed key by key), plus built-in variables enabled or disabled. By default compares the live version with the version created before it. The Tag Manager API does not mark which versions were published, so that default "before" version may never have been live. Makes two or three Tag Manager API calls. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数to_version_idgtm_account_idfrom_version_idgtm_container_id

draft_gtm_tag

Draft a Tag Manager tag

Draft creating or updating a Tag Manager tag — returns a PREVIEW. Without tag_id this creates a tag in a workspace; with tag_id it updates the existing tag. The edit lands in the workspace and changes nothing on the site until the workspace is published. Refused unless gtm.write_enabled is set, and Custom HTML (html) is refused as well unless gtm.allow_custom_html is set. Returns the resolved workspace, the tag type, the fields that would change and a plan_id. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数namenotespausedtag_idtag_typeparametersworkspace_idgtm_account_idgtm_container_idfiring_trigger_idsblocking_trigger_ids

draft_gtm_trigger

Draft a Tag Manager trigger

Draft creating or updating a Tag Manager trigger — returns a PREVIEW. Without trigger_id this creates a trigger in a workspace; with trigger_id it updates the existing one. The edit lands in the workspace and changes nothing on the site until the workspace is published. Refused unless gtm.write_enabled is set. Returns the resolved workspace, the trigger fields that would change and a plan_id. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数namenotesfiltersparameterstrigger_idtrigger_typeworkspace_idgtm_account_idgtm_container_idcustom_event_nameauto_event_filterscustom_event_filters

draft_gtm_variable

Draft a Tag Manager variable

Draft creating or updating a Tag Manager variable: returns a PREVIEW. Without variable_id this creates a variable in a workspace; with variable_id it updates the existing one. Data Layer Variables, the usual source for GA4 ecommerce values, take data_layer_key (e.g. "ecommerce.value") instead of raw parameters. Tags and triggers use a variable as {{name}}; renaming one they reference is refused, because the references would break (the GTM UI renames safely). Custom JavaScript variables run code on the site and are refused unless gtm.allow_custom_html is set. The edit lands in the workspace and changes nothing on the site until the workspace is published. Refused unless gtm.write_enabled is set. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数namenotesparametersvariable_idworkspace_iddefault_valuevariable_typedata_layer_keygtm_account_idgtm_container_id

draft_delete_gtm_entity

Draft deleting a Tag Manager tag, trigger or variable

Draft deleting a Tag Manager tag, trigger or variable — returns a PREVIEW. The entity is removed from a workspace and stays on the site until the workspace is published. A trigger that any tag still references, or a variable that a tag, trigger or other variable uses as {{name}}, is refused up front, with the references named. Refused unless gtm.write_enabled is set. Returns the entity that would be deleted, the resolved workspace and a plan_id. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数entity_id必填entity_type必填workspace_idgtm_account_idgtm_container_id

draft_publish_gtm_workspace

Draft publishing a Tag Manager workspace

Draft publishing a Tag Manager workspace LIVE — returns a PREVIEW. Every pending change in the workspace goes live, including changes other people made in the GTM UI; the preview lists them all. Apply refuses when the workspace changed after the preview, has merge conflicts, or reports compiler errors in a quick preview, and it refuses a Custom HTML tag being added or changed while gtm.allow_custom_html is off. Refused unless gtm.write_enabled is set. Returns the pending changes, the version that is live now (for a one-step rollback), the version name that would be created and a plan_id. That gate matches the tag type html; a Custom JavaScript variable or a custom template tag (cvt_…), which can inject a script, is not covered and needs review in the GTM UI. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数version_nameworkspace_idversion_notesgtm_account_idgtm_container_id

draft_rollback_gtm_version

Draft rolling back Tag Manager to a version

Draft republishing an older Tag Manager version LIVE; returns a PREVIEW. A rollback publishes an existing container version again. The preview diffs the live version against the target, so it lists every tag, trigger and variable that changes on the site, and it pins the live version: apply refuses when another version went live after the preview, or when the target was modified or archived. Workspaces are not changed. Refused unless gtm.write_enabled is set, and refused when the target adds or changes a Custom HTML tag while gtm.allow_custom_html is off. Returns the diff, previous_live_version_id (the version that restores today's state), the target version and a plan_id. Tag Manager API: https://developers.google.com/tag-platform/tag-manager/api/v2

输入参数version_id必填gtm_account_idgtm_container_id

run_gaql

Custom Google Ads query

Execute an arbitrary GAQL (Google Ads Query Language) query. For queries beyond the dedicated report tools. Returns the result rows in the requested format with the query echoed back; cost fields stay in raw micros (cost_micros / 1,000,000 = account currency). A failing query returns an error with a hint. Queries the Google Ads API. GAQL syntax and fields: https://developers.google.com/google-ads/api/docs/query/overview

输入参数query必填formatcustomer_id

get_audience_lists

Audience lists

The account's own audiences: remarketing and customer lists, custom segments, combined segments. Each user list comes with its type, membership status (OPEN or CLOSED), size for Search and Display, eligibility and membership duration; custom and combined segments with their id and description. Insights flag lists below the 1,000 users Search needs and closed lists. Use the ids with draft_audience_attachment; for Google's in-market and affinity segments use search_audience_segments. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_id

search_audience_segments

Search audience segments

Find Google's in-market and affinity segments by name, with the segment_id to attach. In-market segments are people actively researching a purchase; affinity segments are long-term interests. Matching is on the segment name, in English, e.g. "running", "insurance", "travel". Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数kindlimitquery必填customer_id

get_audience_targeting

Audience targeting

Audiences attached to one campaign or ad group, its exclusions, and the audience mode. audience_mode is "observation" (audiences only adjust bids and report), "targeting" (ads only reach the audiences) or "not set". Every audience and exclusion carries a remove_id for remove_entity (entity_type "campaign_criterion" or "ad_group_criterion"). Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数ad_group_idcampaign_idcustomer_id

draft_audience_attachment

Draft audience attachment

Draft attaching audiences to a campaign or ad group as observation, targeting or exclusion: returns a PREVIEW. Observation (the default) keeps the reach: the audiences adjust bids and show up in reports. Targeting narrows delivery to the audiences and needs a double confirmation. Exclusions keep the people out and leave the mode alone. The draft refuses combinations Google does not allow (custom segments on Search, combined segments outside Search, audiences at both campaign and ad group level) and lists that cannot serve; Performance Max is refused with a pointer to draft_asset_group_signals. Nothing changes until confirm_and_apply applies the plan_id; a dry run has Google validate it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数modeexcludead_group_idcampaign_idcustomer_idsegment_idsuser_list_idscustom_audience_idscombined_audience_ids

get_shopping_product_performance

Shopping product performance

Spend, clicks, conversions, CPA and ROAS per product across Shopping and Performance Max. Each product (item id) is summed over the campaigns it ran in. Returns the account totals, the top products by spend, and the products that spent without a conversion, with insights on what to do with them. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数limitcampaign_idcustomer_iddate_range_enddate_range_start

get_asset_group_signals

Asset group signals

Search themes and the audience signal of a Performance Max asset group, plus the account's audiences. Returns each search theme and audience signal with its signal_id and approval status, the enabled audiences of the account that can become the group's audience signal (audience_id, name), and insights when a group has no themes or no audience signal. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idasset_group_id必填

draft_asset_group_signals

Draft Performance Max signal changes

Draft adding search themes or an audience signal to a Performance Max asset group, or removing signals — PREVIEW. Signals are hints that steer Performance Max, not targeting. A group has at most one audience signal and up to 50 search themes; replacing the audience means removing the current one in the same draft. Themes already on the group are skipped. Nothing changes until confirm_and_apply applies the plan_id; a dry run has Google validate it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数audience_idcustomer_idasset_group_id必填add_search_themesremove_signal_ids

draft_pmax_product_exclusions

Draft Performance Max product exclusions

Draft which products a retail Performance Max asset group excludes — returns a PREVIEW. Sets the full list of excluded values on one product dimension (item id, brand or a custom label); everything else stays included. Pass the complete list each time: values left out are included again, and an empty list includes all products. Works on asset groups that advertise all products or are already split on that one dimension; more complex product filters are refused and stay a job for Google Ads. The filter is rebuilt in one atomic request. Nothing changes until confirm_and_apply applies the plan_id; a dry run has Google validate it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数dimensioncustomer_idasset_group_id必填exclude_values必填

draft_asset_group_assets

Draft Performance Max asset changes

Draft adding and/or removing assets of a Performance Max asset group — returns a PREVIEW. Adds new text, image and YouTube assets and unlinks existing ones in one atomic request, so an asset is replaced without the group dropping below Google's minimums (3 headlines, 1 long headline, 2 descriptions, one of them at most 60 characters). Texts already in the group are skipped. Images are checked and sorted by aspect ratio; removed assets stay in the account's asset library. The preview lists the asset counts per type after the change. Nothing changes until confirm_and_apply applies the plan_id; a dry run has Google validate it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数imagesheadlinescustomer_iddescriptionsbusiness_nameasset_group_id必填long_headlinesremove_asset_idsyoutube_video_ids

draft_shopping_campaign

Draft a Shopping campaign

Draft a Standard Shopping campaign that advertises a Merchant Center feed — returns a PREVIEW. Creates the budget, the campaign (PAUSED), a product ad group with its Shopping ad, and one "All products" product group, in one atomic request. The Merchant Center account must be linked to the Google Ads account; the draft checks that. Shopping campaigns take no keywords and no language targeting (the feed's language applies). Nothing changes until confirm_and_apply applies the plan_id; a dry run has Google validate it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数max_cpcfeed_labelcustomer_idmerchant_id必填product_bid必填target_roasdaily_budget必填ad_group_namecampaign_name必填geo_target_ids必填bidding_strategycampaign_priority另有 1 个

draft_campaign

Draft a campaign

Draft a full campaign structure — returns a PREVIEW, does NOT create anything. Creates: CampaignBudget + Campaign (PAUSED) + AdGroup + optional Keywords + geo targeting + language targeting. Ads are NOT included — draft_responsive_search_ad adds them once the campaign exists. Only SEARCH campaigns can be created: Performance Max needs an asset group with all its assets in one request, and DISPLAY, SHOPPING and VIDEO need channel-specific settings and ad group types, so the draft refuses them. Returns a preview with a plan_id plus any warnings (e.g. a daily budget below 5x target CPA, MANUAL_CPC); nothing changes until confirm_and_apply applies the returned plan_id. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数max_cpckeywordstarget_cpacustomer_idtarget_roaschannel_typedaily_budget必填language_ids必填ad_group_namecampaign_name必填geo_target_ids必填location_option另有 8 个

draft_ad_group

Draft an ad group

Draft a new ad group within an existing campaign — returns a PREVIEW, does NOT create. Creates an ad group (ENABLED, type SEARCH_STANDARD) in the specified campaign, optionally with keywords in the same atomic operation. Only SEARCH campaigns are supported. Ads are not included, so the ad group cannot serve until one of its ads is created and enabled. Returns a preview with a plan_id plus warnings (BROAD keywords on a non-Smart-Bidding campaign, a duplicate ad group name, a CPC bid that Smart Bidding ignores); nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数keywordscampaign_id必填customer_idad_group_name必填cpc_bid_micros

update_campaign

Draft campaign changes

Draft an update to an existing campaign — returns a PREVIEW, does NOT apply. Only the parameters passed are changed; omitted ones stay as they are, and at least one change is required. Replacing geo targets keeps the campaign's negative geo exclusions (the preview lists them). A budget change shows the current amount; when the budget is shared with other campaigns, the preview names them and needs a double confirmation, because the new amount covers all of them. A bidding change on a campaign in a portfolio bid strategy takes it out of the portfolio, also with a double confirmation. Returns a preview with a plan_id plus any warnings; nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数max_cpctarget_cpacampaign_id必填customer_idtarget_roasdaily_budgetlanguage_idsgeo_target_idslocation_optionbidding_strategyfinal_url_suffixkeyword_match_type另有 6 个

draft_responsive_search_ad

Draft a responsive search ad

Draft a Responsive Search Ad — returns a PREVIEW, does NOT create the ad. The preview shows exactly what will be created; confirm_and_apply executes the returned plan_id. The ad is created PAUSED. final_url is checked for reachability first and an unreachable URL is refused. Several headlines may pin to the same position (Google rotates them there) as long as every position stays fillable, by an asset pinned to it or by a distinct unpinned one. Mixed plain-string and dict entries are allowed within a single call (e.g. brand pinned to HEADLINE_1, the rest unpinned). Warnings note fewer than 8 headlines or 3 descriptions. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数path1path2final_url必填headlines必填ad_group_id必填customer_iddescriptions必填

update_responsive_search_ad

Update a responsive search ad

Update mutable fields on an existing RSA in place — returns a PREVIEW. Edits an existing RSA without creating a new ad; the ad keeps its ID. Google Ads API v23 (``AdService.MutateAds``) permits in-place mutation of ``final_urls``, ``path1``, ``path2``, ``headlines``, and ``descriptions``. At least one mutation must be requested. IMPORTANT: replacing headlines or descriptions is NOT a free in-place edit. Even though the ad ID is preserved, swapping the creative text RESETS the ad's asset-combination learning and performance history and sends the ad BACK THROUGH Google policy review — Google treats the creative as new for optimization. URL-only and path-only edits do not incur this. When headlines/descriptions change, the returned preview includes a ``warnings`` entry stating this trade-off before anything is applied. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数ad_id必填path1path2final_urlheadlinesclear_path1clear_path2customer_iddescriptions

draft_keywords

Draft keywords

Draft keyword additions — returns a PREVIEW, does NOT add keywords. Returns a preview with a plan_id, plus a warning when BROAD keywords go into a campaign without Smart Bidding; nothing changes until confirm_and_apply applies the returned plan_id. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数keywords必填ad_group_id必填customer_id

get_custom_conversion_goals

Custom conversion goals

Read the custom conversion goals and the campaign goal configuration. Returns every custom goal with its name, status and conversion actions, plus — optionally for one campaign — the goal config the campaign uses (`goal_config_level` CUSTOMER or CAMPAIGN and the assigned custom goal). A custom conversion goal bundles conversion actions into a named set that a campaign can be pointed at. Ahead of drafting, this shows which goals exist, which actions they contain and what a campaign currently uses. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数campaign_idcustomer_id

draft_custom_conversion_goal

Draft a custom conversion goal

Create a custom conversion goal — returns a PREVIEW. The goal bundles conversion actions into a named set that campaigns can then be pointed at with draft_assign_custom_conversion_goal. Only the goal is created: conversion actions are read for validation and never modified. It is always created ENABLED — a goal created as REMOVED would be invisible to every other tool, so there is nothing to plan. If a goal with the same name and exactly the same conversion actions already exists, nothing is planned and the result says `already_exists` with that goal's ID (REMOVED goals do not count). A name that exists with different actions is changed with draft_update_custom_conversion_goal. The returned plan_id is applied with confirm_and_apply. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数name必填customer_idconversion_action_ids必填

draft_update_custom_conversion_goal

Draft changes to a custom conversion goal

Rename and/or re-scope an existing custom conversion goal — PREVIEW. conversion_action_ids REPLACES the whole action list, it does not append. An empty parameter stays unchanged. The preview shows the action list before and after. The returned plan_id is applied with confirm_and_apply. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数namecustomer_idconversion_action_idscustom_conversion_goal_id必填

draft_assign_custom_conversion_goal

Draft assigning a custom conversion goal

Point a campaign at a custom conversion goal — returns a PREVIEW. Sets goal_config_level=CAMPAIGN and the goal on that campaign's conversion goal config. Nothing else changes: conversion actions, bidding, budgets and the account-level goals stay as they are. A campaign must have at least one goal configured when it switches to campaign level — Google answers EMPTY_CONVERSION_GOALS otherwise. That is why this tool assigns a goal instead of clearing goals; draft_clear_custom_conversion_goal goes back to the account level. If the campaign already uses exactly this goal, nothing is planned and the result says `already_configured`. The preview carries a note that changing what a campaign optimises for restarts its Smart Bidding learning period. The returned plan_id is applied with confirm_and_apply. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数campaign_id必填customer_idcustom_conversion_goal_id必填

draft_clear_custom_conversion_goal

Draft clearing a custom conversion goal

Put a campaign back on the account-level goals — returns a PREVIEW. Sets goal_config_level=CUSTOMER and clears the custom goal: the rollback for draft_assign_custom_conversion_goal. The account-level goals themselves are not touched. The returned plan_id is applied with confirm_and_apply. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数campaign_id必填customer_id

add_negative_keywords

Draft negative keywords

Draft negative keyword additions — returns a PREVIEW. Negative keywords prevent your ads from showing for irrelevant searches. They are added at campaign level. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数keywords必填match_typecampaign_id必填customer_id

add_negative_locations

Draft negative locations

Draft negative geo location additions — returns a PREVIEW. Excludes cities/regions from a campaign while keeping broader positive targets such as State of Sao Paulo. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数campaign_id必填customer_idgeo_target_ids必填

propose_negative_keyword_list

Draft a shared negative keyword list

Draft a shared negative keyword list and attach it to a campaign — returns a PREVIEW. Creates a reusable negative keyword list (shared set) that can later be applied to multiple campaigns, whereas add_negative_keywords adds negatives directly to one campaign. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数keywords必填list_name必填match_typecampaign_id必填customer_id

add_to_negative_keyword_list

Draft additions to a negative keyword list

Append keywords to an EXISTING shared negative keyword list — returns a PREVIEW. Adds terms to a list that already exists (propose_negative_keyword_list creates a new list instead); get_negative_keyword_list_keywords shows the terms already in a list. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数keywords必填match_typecustomer_idshared_set_id必填

attach_shared_set_to_campaigns

Draft attaching a shared set

Attach an existing shared set to one or more campaigns — returns a PREVIEW. Creates CampaignSharedSet linkages so the campaigns inherit the shared set's criteria (e.g. negative keywords). Most commonly used to attach a shared negative keyword list to newly-built campaigns; get_negative_keyword_list_campaigns lists existing attachments. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idcampaign_ids必填shared_set_id必填

detach_shared_set_from_campaigns

Draft detaching a shared set

Detach a shared set from one or more campaigns — returns a PREVIEW. Removes CampaignSharedSet linkages so the campaigns no longer inherit the shared set's criteria. The shared set itself is unchanged; only the per-campaign attachment is removed. get_negative_keyword_list_campaigns lists the existing attachments. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idcampaign_ids必填shared_set_id必填

get_ai_max_settings

AI Max settings

Read the AI Max controls of Search campaigns, per campaign and ad group. Returns for every campaign: id, name, status, advertising channel type, campaign.ai_max_setting.enable_ai_max, campaign.ai_max_setting.bundling_required (output only) and the full campaign.asset_automation_settings list. Each campaign also carries its non-REMOVED ad groups with ad_group.ai_max_ad_group_setting.disable_search_term_matching. Shows the current state ahead of draft_ai_max_settings, and what the account actually looks like after confirm_and_apply. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数campaign_idcustomer_id

get_campaign_settings

Campaign settings

Read every setting that decides how far a Search campaign reaches, in one call. Returns one flat record per campaign: status, bidding strategy and its target or CPC ceiling, daily budget and whether it is shared, the Google Search / search partner / Display network flags, the location option (positive_geo_target_type) and its negative counterpart, campaign-level broad match (keyword_match_type), the tracking template, final URL suffix and custom parameters, and the AI Max state get_ai_max_settings reports (enable_ai_max, asset automation per type). Money is in the account currency (`currency`). Each campaign lists its `widening_settings`: search partners or Display on, a presence-or-interest location option, broad match on, AI Max on, an automation opted in. `insights[]` names the campaigns that have any. Made for recurring audits: the same call every week diffs cleanly. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数campaign_idcustomer_id

draft_ai_max_settings

Draft AI Max settings

Draft AI Max controls for a Search campaign — returns a PREVIEW. AI Max is the container that makes brand exclusions usable in Search: Google rejects a brand list on a plain Search campaign ("For search advertising channel, brand lists can only be applied to exclusive targeting, broad match campaigns for inclusive targeting or PMax generated campaigns"). Turning AI Max on while leaving its automations running is the trap, so both belong to the same plan. An automation the caller never mentioned is refused outright (the plan says which switch to pass); one named explicitly (disable_search_term_matching=False, text_asset_automation="OPTED_IN") is planned with requires_double_confirm=True, because switching to AI Max with its automations is a real configuration some accounts want. Reads the campaign and its ad groups first, so the preview names concrete ad groups and shows current values per knob. Returns a preview with a plan_id; nothing is written until confirm_and_apply runs. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数campaign_id必填customer_idad_group_idsenable_ai_maxfinal_url_expansiontext_asset_automationinclude_paused_ad_groupsdisable_search_term_matching

draft_prepare_brand_exclusions

Prepare a campaign for brand exclusions

Draft the safe standard state for brand exclusions — returns a PREVIEW. Exactly one combination, nothing else: enable_ai_max = true, disable_search_term_matching = true (all non-removed ad groups), TEXT_ASSET_AUTOMATION = OPTED_OUT and FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION = OPTED_OUT. No bidding, keyword, match type, ad, URL or budget change, and no brand list is attached — attaching stays a separate step with propose_brand_list / attach_brand_list_to_campaigns once this state is verified in the account. Returns a preview with a plan_id (purpose brand_exclusions); nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数campaign_id必填customer_idinclude_paused_ad_groups

draft_demographic_targeting

Draft demographic targeting

Draft demographic targeting (age/gender/parental status/income) — returns a PREVIEW. By default, Google Ads serves to all demographic segments. This tool adds criteria that EXCLUDE a segment (negative=True, default) or NARROW targeting to it (negative=False — uncommon). Takes exactly one of ad_group_id or campaign_id, and at least one of the four demographic lists must contain a value. Returns a preview with a plan_id, plus warnings when the change narrows targeting, excludes 'undetermined' users, or excludes nearly a whole dimension; nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数gendersnegativeage_rangesad_group_idcampaign_idcustomer_idincome_rangesparental_statuses

update_ad_group

Draft ad group changes

Draft an ad group update for name and/or manual CPC bid — returns a PREVIEW. A bid change applies only when the campaign uses MANUAL_CPC: automated bidding strategies ignore ad-group CPC bids, so such a change is refused (for Maximize Clicks the campaign cpc_bid_ceiling, set through update_campaign, is the active constraint). Bid increases above the configured safety.max_bid_increase_pct are refused. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数max_cpcad_group_id必填customer_idad_group_name

draft_callouts

Draft callouts

Draft callout assets for an ad group, a campaign or the account — returns a PREVIEW. Creates callout assets and links them where the id points: ad_group_id links to that ad group, campaign_id to that campaign. Account-wide linking (every campaign without callouts of its own) needs scope="account" and no id. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数scopecallouts必填ad_group_idcampaign_idcustomer_id

draft_structured_snippets

Draft structured snippets

Draft structured snippet assets for an ad group, a campaign or the account — returns a PREVIEW. Creates structured snippet assets and links them where the id points: ad_group_id links to that ad group, campaign_id to that campaign. Account-wide linking needs scope="account" and no id. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数scopesnippets必填ad_group_idcampaign_idcustomer_id

draft_call_asset

Draft a call asset

Draft a call asset (a phone number shown with the ads) — returns a PREVIEW. Creates the call asset and links it where the id points: ad_group_id links to that ad group, campaign_id to that campaign. Account-wide linking needs scope="account" and no id. Google reviews the number before it serves. Returns a preview with a plan_id. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数scopead_group_idad_schedulecampaign_idcustomer_idcountry_code必填phone_number必填call_conversion_action_id

update_call_asset

Draft a call asset edit

Draft changing a call asset in place — returns a PREVIEW. Only the fields passed change. The asset keeps its ID and its links, so the change shows everywhere it is linked. The preview shows the current values and pins them; an edit in Google Ads before the apply stops it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数asset_id必填ad_schedulecustomer_idcountry_codephone_numberclear_ad_schedulecall_conversion_action_idcall_conversion_reporting_state

add_ad_schedule

Draft a campaign ad schedule

Draft ad schedule windows for a campaign — returns a PREVIEW. Adds the windows; existing ones stay. The preview lists the current windows (each with the remove_id that remove_entity takes as a campaign_criterion) and the account time zone the hours are in. Overlapping windows and more than six a day are refused. A campaign without any window serves at all hours, so its first windows restrict it to them: that preview needs a double confirmation. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数schedule必填campaign_id必填customer_id

draft_promotion

Draft a promotion asset

Draft a promotion asset ("20% off winter tyres") — returns a PREVIEW. Creates the promotion and links it where the id points: ad_group_id links to that ad group, campaign_id to that campaign. Account-wide linking needs scope="account" and no id. The final_url is checked for reachability. Returns a preview with a plan_id. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数scopeend_dateoccasionfinal_url必填money_offstart_datead_group_idad_schedulecampaign_idcustomer_idpercent_offcurrency_code另有 7 个

update_promotion

Draft a promotion edit

Draft changing a promotion asset in place — returns a PREVIEW. Only the fields passed change; everything else stays as it is. The asset keeps its ID and history, and the change shows everywhere it is linked. Passing money_off replaces a percent_off (and the other way round); passing promotion_code replaces an orders_over_amount (and the other way round). The preview shows old and new values; an edit in Google Ads before the apply stops it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数asset_id必填end_dateoccasionfinal_urlmoney_offstart_datead_schedulecustomer_idpercent_offclear_fieldscurrency_codelanguage_code另有 6 个

draft_price_asset

Draft a price asset

Draft a price asset (the row of prices under an ad) — returns a PREVIEW. Creates a price asset with 3-8 offerings and links it where the id points: ad_group_id links to that ad group, campaign_id to that campaign. Account-wide linking needs scope="account" and no id. Every offering URL is checked for reachability. Google disapproves prices that differ from the landing page. Returns a preview with a plan_id. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数scopeofferings必填price_type必填ad_group_idcampaign_idcustomer_idcurrency_codelanguage_code必填price_qualifier

draft_business_name_asset

Draft a business name asset

Draft a business name asset for a campaign or the account — returns a PREVIEW. Creates a text asset and links it as the business name shown with the ads. Google links business names at campaign or account level only. Account-wide needs scope="account" and no campaign_id. Returns a preview with a plan_id. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数scopecampaign_idcustomer_idbusiness_name必填

update_callout

Draft a callout edit

Draft changing a callout asset's text in place — returns a PREVIEW. The asset keeps its ID and performance history, and the new text shows everywhere it is linked. The preview pins the current text; if someone edits the asset in Google Ads before the apply, nothing is sent. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数asset_id必填customer_idcallout_text必填

update_structured_snippet

Draft a structured snippet edit

Draft changing a structured snippet asset in place — returns a PREVIEW. Replaces the snippet's values (and header, if given). The asset keeps its ID and performance history everywhere it is linked. The preview pins the current header and values; an edit in Google Ads before the apply stops it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数headervalues必填asset_id必填customer_id

draft_image_assets

Draft image assets

Draft image assets from local files, public image URLs or uploads — returns a PREVIEW. At least one image in total is required across image_paths, image_urls and upload_ids. Images must be PNG, JPEG or GIF and at most 5120 KB (Google's limit). URL images are downloaded now and checked; applying re-downloads them and refuses if the image changed since the preview. Returns a preview with a plan_id and a per-image summary; nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数scopeimage_urlsupload_idscampaign_idcustomer_idfield_typesimage_paths

pause_entity

Draft pausing an entity

Draft pausing a campaign, ad group, ad, or keyword — returns a PREVIEW. Pausing is reversible with enable_entity. Returns a preview with a plan_id (target status PAUSED); nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数entity_id必填customer_identity_type必填

enable_entity

Draft enabling an entity

Draft enabling a paused campaign, ad group, ad, or keyword — returns a PREVIEW. Returns a preview with a plan_id (target status ENABLED); nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数entity_id必填customer_identity_type必填

remove_entity

Draft removing an entity

Draft REMOVING an entity — returns a PREVIEW. This is IRREVERSIBLE. Removed entities cannot be re-enabled; pause_entity is the reversible way to temporarily disable something. Returns a preview with a plan_id and requires_double_confirm=true; nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数entity_id必填customer_identity_type必填

confirm_and_apply

Apply a previewed change

Execute a previously previewed change. IMPORTANT: Defaults to dry_run=True (validate only). Only an explicit dry_run=false applies the change to the ad account (Google Ads or Reddit Ads — the plan knows which platform it targets). Forced dry runs: when real changes are switched off (live changes off for the workspace in AdLoop Cloud, or safety.require_dry_run in a self-hosted config), dry_run=false is IGNORED and the result is still DRY_RUN_SUCCESS, with 'dry_run_forced_by' and 'remediation' fields. 'remediation' says how the user switches that setting; until it is changed, repeated calls with dry_run=false change nothing. Two-phase apply: if 'safety.two_phase_apply: true' is set (always on for AdLoop Cloud tenants), dry_run=false is REFUSED with status DRY_RUN_REQUIRED until this plan_id has completed one dry_run=true pass. The sequence is: dry run, review of its result, then the real apply. Google Ads plans: the dry run sends the exact mutates to Google with validate_only=True, so Google checks the change and executes nothing (`checks` counts the validated calls). Steps that build on an object an earlier step would create cannot be validated and are counted as skipped. Reddit plans: Reddit has no validate-only mode, so the dry run re-reads the target entity and re-checks the safety caps (returned as `checks`). A DRY_RUN_FAILED result means the change does not go through as previewed. The real apply fails the same way, unless Google rejected only part of the request: then it carries out the rest and reports those operations again. Returns a status with the plan_id and operation: DRY_RUN_SUCCESS, DRY_RUN_FAILED, DRY_RUN_REQUIRED, APPLIED, PARTIAL_UPLOAD or APPLY_IN_PROGRESS. APPLIED results carry the created or changed resource names under 'result'. PARTIAL_UPLOAD belongs to the upload tools: the batches it lists are already in the account, so the plan is retired. 'sent_total', 'accepted_total', 'rejected_total' and 'resume_from_line' say how far the upload g

输入参数dry_runplan_id必填

upload_images

Upload images

Let the user upload images (PNG, JPEG, GIF up to 5 MB) for ad assets. For images without a public URL, such as a file on the user's computer or an image attached in the chat. An attached image cannot reach a tool, so the user drops the same file on the card. Apps that show AdLoop's cards display an upload card where the user drops the files; the card then posts the upload ids into the chat. On AdLoop Cloud in other apps the result carries an upload link for the user (or a coding agent, with curl). Uploads expire after a day. The ids go into upload_ids of draft_image_assets, or as "upload:<id>" into the image fields of draft_reddit_ad. Returns the current uploads and how to add more. Google Ads API: https://developers.google.com/google-ads/api/docs/start, Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Reddit Ads API: https://ads-api.reddit.com/docs/v3/

无需输入参数。

upload_conversion_csv

Upload a conversion CSV

Let the user upload a conversion CSV for an offline conversion upload. For the CSV behind draft_upload_call_conversions or draft_upload_enhanced_conversions_for_leads when the file is not on the machine running AdLoop, as on AdLoop Cloud. Apps that show AdLoop's cards display an upload card where the user drops the .csv file; the card then posts the upload id into the chat. Other apps on AdLoop Cloud get an upload link for the user (or a coding agent, with curl). The file holds personal data (phone numbers, emails), so it is kept for two hours at most and deleted as soon as a draft has read it. Returns the CSV uploads waiting to be used and how to add one. Google Ads API: https://developers.google.com/google-ads/api/docs/start

无需输入参数。

list_uploads

List uploads

List the files the user uploaded to AdLoop that have not expired. Returns each upload's upload_id, kind (image or csv), name, type, size, dimensions (images) or lines (CSVs) and hours until it expires: images last a day, conversion CSVs two hours or until a draft reads them. The ids of files the user sent through an upload link show up here. Google Ads API: https://developers.google.com/google-ads/api/docs/start, Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Reddit Ads API: https://ads-api.reddit.com/docs/v3/

无需输入参数。

list_reddit_accounts

List Reddit ad accounts

List Reddit businesses and ad accounts the connected Reddit user can access. Returns the Reddit username, the businesses, and per ad account the ad_account_id values (plus currency, time zone and approval state) that every other Reddit tool takes. Requires the Reddit Ads connection (adloop init → Reddit step, or Settings → Reddit Ads in Cloud). Reddit Ads API: https://ads-api.reddit.com/docs/v3/

无需输入参数。

list_reddit_funding_instruments

Reddit billing + posting profiles

Funding instruments (billing) and posting profiles of a Reddit ad account. Returns funding_instruments (funding_instrument_id, currency, is_servable, reasons_not_servable, credit limit and billable amount in account currency) and profiles (profile_id, username). draft_reddit_campaign needs a servable funding_instrument_id; draft_reddit_ad needs the profile_id that authors the post. Both come from here. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数ad_account_id

get_reddit_campaigns

Reddit campaigns

List Reddit campaigns with status, objective, budget mode and bids. Returns the account currency, the campaigns, and insights for campaigns blocked by account state. Each campaign carries configured_status (what was set) and effective_status (what Reddit computes: PENDING_APPROVAL, REJECTED, PENDING_BILLING_INFO, ...). Money is in account currency. Budgets live on ad groups unless is_campaign_budget_optimization is true. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数ad_account_idinclude_archived

get_reddit_ad_groups

Reddit ad groups

List Reddit ad groups (budget, bid, pixel, weekly schedule, targeting summary), optionally per campaign. Returns the account currency, the ad groups, and insights. Reddit requires conversion_pixel_id on every ad group; insights flag ad groups without one and name ad groups that run on a weekly schedule. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数campaign_idad_account_id

get_reddit_ads

Reddit ads

List Reddit ads with status, rejection_reason, post and click URL. Returns the ads and insights: insights flag REJECTED ads (policy review) and ads still PENDING_APPROVAL. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数ad_group_idcampaign_idinclude_copyad_account_id

get_reddit_performance

Reddit performance

Reddit Ads performance: spend, impressions, clicks, CTR, CPC, conversions, CPA, ROAS. Returns rows per entity for the chosen level with names joined, plus totals and insights[] (zero-conversion spenders, rejected ads, empty windows). 'conversions' is the account's key conversion event. Money is in account currency. Data lags up to 6 hours. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数levelcompactbreakdownad_account_iddate_range_enddate_range_start

run_reddit_report

Raw Reddit report

Run a custom Reddit Ads report for metrics get_reddit_performance omits. Returns the requested fields per breakdown row, the date range and the account currency. Microcurrency and cent fields are converted to currency amounts. Queries the Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数fields必填filterbreakdownstime_zone_idad_account_iddate_range_enddate_range_start

get_reddit_pixels

Reddit pixels

Reddit pixels of the account and when each event (purchase, sign_up, lead, ...) last fired. Returns each pixel's pixel_id, name, last_fired_at per standard event, custom events and a never_fired flag, plus insights. Relevant before conversion-optimized campaigns: insights flag pixels that never fired and ad groups optimizing for an event their pixel has never sent. Every new ad group needs a conversion_pixel_id from here. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数ad_account_id

get_reddit_audiences

Reddit audiences

Reddit custom and saved audiences of the account, and which ad groups use them. Returns each custom audience's audience_id, name, type (PIXEL_RETARGETING, ENGAGEMENT_RETARGETING, CUSTOMER_LIST, LOOKALIKE, ...), status, estimated size_range, its source (pixel events or campaigns, lookback days) and the ad groups that target or exclude it; saved audiences with their targeting; and insights that flag audiences Reddit cannot use yet or that are too small to deliver. The audience_id goes into custom_audience_ids or excluded_custom_audience_ids on an ad group. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数ad_account_id

search_reddit_targeting

Search Reddit targeting

Look up targeting options for draft_reddit_ad_group. Returns ids/names to pass into the targeting lists, with the kind, the query and the total number of matches. Communities target by name, interests by id, geolocations by id (e.g. "DE" or "DE:2874225"), languages by code (e.g. "DE"), carriers by id (e.g. "O2_DEUTSCHLAND"). Devices come back as make/model pairs for the label_map of a device target. Keyword suggestions carry Reddit-wide monthly views, not search volume. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数kind必填limitquerycountrywebsite_url

get_reddit_account_history

Reddit account change history

Who changed what in the Reddit ad account: field, before/after, member, time. Returns the changes, most recent first, with changed_at, by, entity type, id and name, field, and before/after values. The first thing to check when performance moves. Child entities are included when filtering by entity. Changes made through AdLoop show under the connected Reddit user, like changes made in Ads Manager. Money fields are in account currency. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数limitentity_idsentity_typead_account_iddate_range_enddate_range_start

estimate_reddit_ad_group

Estimate a Reddit ad group

Audience size, delivery estimate and Reddit's suggested bid for a planned ad group — read-only. Reddit's counterpart of estimate_budget: takes the same targeting and budget as draft_reddit_ad_group, ahead of drafting. Returns the reachable and targetable audience (fixed 30-day basis), estimated impressions/clicks/reach for the schedule, the minimum/suggested bid range for bid_type in account currency, and insights (audience under 10,000 people, bid_value below the suggested minimum). Nothing is created. At least one of geolocations, communities, interests or keywords is required. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数genderdevicesbid_typecarriersend_timekeywordsbid_valueinterestslanguagesobjectiveplatformsstart_time另有 10 个

pause_reddit_entity

Draft pausing a Reddit entity

Draft pausing a Reddit campaign, ad group or ad — returns a PREVIEW. Returns a preview with a plan_id, the current and target status (PAUSED) and warnings (e.g. already paused); nothing changes until confirm_and_apply applies the plan_id. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数entity_id必填entity_type必填ad_account_id

enable_reddit_entity

Draft enabling a Reddit entity

Draft enabling (configured_status=ACTIVE) a Reddit campaign, ad group or ad — PREVIEW. Enabling a new ad sends it to Reddit policy review (PENDING_APPROVAL). Returns a preview with a plan_id, the current and target status and warnings (e.g. an effective_status of REJECTED or PENDING_BILLING_INFO that keeps it from serving); nothing changes until confirm_and_apply applies the plan_id. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数entity_id必填entity_type必填ad_account_id

remove_reddit_entity

Draft archiving a Reddit entity

Draft ARCHIVING a Reddit campaign, ad group or ad — irreversible, PREVIEW. Reddit has no hard delete for entities that ran; ARCHIVED is permanent. pause_reddit_entity is the reversible alternative when the entity does not need to be gone. Returns a preview with a plan_id that requires double confirmation; confirm_and_apply executes it. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数entity_id必填entity_type必填ad_account_id

update_reddit_campaign

Draft Reddit campaign changes

Draft changes to a Reddit campaign — name, run dates, spend cap, and (CBO only) budget/bid/schedule. daily_budget / lifetime_budget / bid_* / schedule apply only when the campaign uses campaign budget optimization; otherwise the budget lives on its ad groups (changed via update_reddit_ad_group). Budgets are in account currency and checked against max_daily_budget; bid_value against max_bid_increase_pct. Returns a preview with a plan_id showing old → new per field; nothing changes until confirm_and_apply applies it. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数namebid_typeend_timeschedulebid_valuespend_capstart_timecampaign_id必填bid_strategydaily_budgetad_account_idlifetime_budget

update_reddit_ad_group

Draft Reddit ad group changes

Draft changes to a Reddit ad group — budget, bid, run dates, weekly schedule, targeting. Budget (daily_budget or lifetime_budget + end_time) is checked against max_daily_budget; bid_value against max_bid_increase_pct. Targeting lists REPLACE the current value of each key passed (each takes the full list); omitted keys are preserved. Ids/names come from search_reddit_targeting. Budget and schedule of an ad group in a campaign-budget-optimization campaign are set on the campaign (update_reddit_campaign). Returns a preview with a plan_id showing old → new per field; nothing changes until confirm_and_apply applies it. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数namegenderdevicesbid_typecarriersend_timekeywordsschedulebid_valueinterestslanguageslocations另有 17 个

update_reddit_ad

Draft Reddit ad changes

Draft changes to a Reddit ad — name, landing URL (click_url), comments on/off. The headline and body of a live Reddit post cannot be edited; new copy means a new ad via draft_reddit_ad, with the old ad paused. Returns a preview with a plan_id showing old → new; nothing changes until confirm_and_apply executes it. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数namead_id必填click_urlad_account_idallow_comments

draft_reddit_custom_audience

Draft a Reddit retargeting audience

Draft a Reddit retargeting audience (website visitors or engaged people) — PREVIEW. Builds the audience from data Reddit already has: people the pixel saw on the website, or people who saw or engaged with the account's campaigns. No personal data is uploaded. Nothing changes until confirm_and_apply applies the plan_id; Reddit then fills the audience (status PENDING, up to a day), and an ad group uses it through update_reddit_ad_group custom_audience_ids (target) or excluded_custom_audience_ids (exclude). Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数name必填eventspixel_idengagementscampaign_idsad_account_idaudience_type必填custom_eventslookback_window_days

draft_reddit_campaign

Draft a Reddit campaign

Draft a new Reddit campaign (created PAUSED) — returns a PREVIEW. By default the budget lives on the ad groups; campaign_budget_optimization holds it on the campaign. Budgets are checked against max_daily_budget. Ad groups are added with draft_reddit_ad_group. Returns a preview with a plan_id, the payload and warnings; nothing changes until confirm_and_apply applies it. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数bid_typeend_timeschedulebid_valueobjective必填spend_capstart_timebid_strategydaily_budgetad_account_idcampaign_name必填lifetime_budget另有 5 个

draft_reddit_ad_group

Draft a Reddit ad group

Draft a new Reddit ad group (created PAUSED) — returns a PREVIEW. Required: campaign_id, ad_group_name, conversion_pixel_id and at least one targeting list (geolocations, communities, interests or keywords — ids/names from search_reddit_targeting). For non-CBO campaigns also daily_budget (or lifetime_budget + end_time), bid_strategy and bid_type. Budgets are checked against max_daily_budget; keywords and geolocations are pre-validated with Reddit. Returns a preview with a plan_id, the payload and warnings; nothing changes until confirm_and_apply applies it. Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数genderdevicesbid_typecarriersend_timekeywordsschedulebid_valueinterestslanguageslocationsplatforms另有 20 个

draft_reddit_ad

Draft a Reddit ad

Draft a Reddit ad: creates a post on the profile, then the ad (PAUSED) — PREVIEW. click_url and the media URLs are checked before drafting, so ads do not point at unverified pages and Reddit gets real image and video files. Comments are public on Reddit ads. With post_id an EXISTING post is promoted instead, keeping its upvotes and comments: no post is created and the copy arguments are ignored. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Once enabled, the ad goes through Reddit policy review (PENDING_APPROVAL). Reddit Ads API: https://ads-api.reddit.com/docs/v3/

输入参数bodyad_namepost_idheadlineclick_urlimage_urlpost_typevideo_urlprofile_idad_group_id必填display_urlad_account_id另有 4 个

draft_key_event

Draft an Analytics key event

Draft marking a GA4 event as a key event (conversion), or changing an existing one — returns a PREVIEW. The fix for "the event fires but isn't tracked as a conversion": attribution_check / validate_tracking diagnose it, this closes the loop. When the event already is a key event, the plan changes its counting method or default value instead and the preview shows before and after; nothing to change returns NO_CHANGE. Applies to future data only. Returns a preview with a plan_id and warnings; nothing changes until confirm_and_apply applies it. Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

输入参数event_name必填property_idcurrency_codedefault_valuecounting_method

draft_delete_key_event

Draft removing an Analytics key event

Draft removing a GA4 key event so the event no longer counts as a conversion, returning a PREVIEW. The event itself keeps firing and stays in event reports; only its key-event status goes, for future data (key events already recorded are not reclassified). The draft resolves the event name against the property's key events (keyEvents.list), so the preview names the exact key event, its counting method and create time; an unknown name returns the existing key events, and one GA4 marks as not deletable is refused. Returns a preview with a plan_id and warnings; nothing changes until confirm_and_apply applies it (GA4 Admin API keyEvents.delete). Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

输入参数event_name必填property_id

draft_ga4_annotation

Draft an Analytics annotation

Draft creating, changing or deleting a GA4 annotation (a note on a date or date range in GA4's charts), returning a PREVIEW. Use it to mark what explains a change in the data: a site relaunch, a price change, a campaign start, a tracking fix. Create needs title and date; update and delete need the annotation's ID from list_ga4_annotations, and an update changes only the fields passed (the preview shows before and after). Annotations Google created itself cannot be changed. Nothing changes until confirm_and_apply applies it; the dry run re-reads the annotation and refuses if it was changed in GA4 after the preview. GA4 Admin API v1alpha (reportingDataAnnotations). Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

输入参数datecolortitleactionend_dateannotationdescriptionproperty_id

draft_ga4_custom_dimension

Draft an Analytics custom dimension

Draft registering, changing or archiving a GA4 custom dimension, returning a PREVIEW. Registering makes an event parameter (EVENT scope), a user property (USER) or an ecommerce item parameter (ITEM) reportable as a dimension. Before anything reaches Google the draft refuses a parameter that is already registered, a taken display name and a full property (see list_ga4_custom_definitions), and the preview warns that GA4 fills the dimension only from now on and that parameter_name and scope cannot change later. Update changes display_name, description or (USER scope) disallow_ads_personalization; archive removes it from reports and frees the slot, cannot be undone and needs a double confirmation. Nothing changes until confirm_and_apply applies it. GA4 Admin API (customDimensions). Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

输入参数scopeactiondescriptionproperty_iddisplay_nameparameter_namecustom_dimensiondisallow_ads_personalization

draft_ga4_custom_metric

Draft an Analytics custom metric

Draft registering, changing or archiving a GA4 custom metric, returning a PREVIEW. Registering makes a numeric event parameter reportable as a metric. The draft refuses a parameter that is already registered, a taken display name and a full property (see list_ga4_custom_definitions), and the preview warns that GA4 fills the metric only from now on. Update changes display_name, description, measurement_unit or restricted_metric_type; archive removes it from reports, cannot be undone and needs a double confirmation. Nothing changes until confirm_and_apply applies it. GA4 Admin API (customMetrics). Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

输入参数actiondescriptionproperty_iddisplay_namecustom_metricparameter_namemeasurement_unitrestricted_metric_type

draft_ga4_data_retention

Draft an Analytics data retention change

Draft a change to how long GA4 keeps event- and user-level data, returning a PREVIEW. GA4 defaults to 2 months, which cuts explorations, funnels and other user-level reports short; standard properties allow 14 months, GA4 360 up to 50. Standard reports are aggregated and not affected. Lengthening applies from now on (data already deleted does not come back); shortening deletes older data for good and needs a double confirmation. The preview shows before and after and reminds the user that a privacy policy naming a retention period must match. NO_CHANGE when the settings already match. Nothing changes until confirm_and_apply applies it; the dry run re-reads the settings and refuses if they changed in GA4 after the preview. Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1

输入参数property_iduser_data_retentionevent_data_retentionreset_user_data_on_new_activity

draft_create_conversion_action

Draft a conversion action

Draft a new Google Ads ConversionAction — returns a PREVIEW. Returns a preview with a plan_id (plus warnings where relevant); nothing changes until confirm_and_apply applies it. SMART_CAMPAIGN_* and GOOGLE_HOSTED types are auto-managed by Google and rejected with MUTATE_NOT_ALLOWED. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数name必填type_必填categorycustomer_idcounting_typecurrency_codedefault_valueprimary_for_goalattribution_modelalways_use_default_valueview_through_window_daysclick_through_window_days另有 2 个

draft_update_conversion_action

Draft conversion action changes

Draft a partial UPDATE of an existing ConversionAction — returns PREVIEW. Only parameters passed non-empty/non-default are sent to the API. Covers renaming, demoting a Primary to Secondary, changing value, adjusting the call-duration threshold, or changing attribution. SMART_CAMPAIGN_* and GOOGLE_HOSTED types reject mutations with MUTATE_NOT_ALLOWED at apply time. Returns a preview with a plan_id (plus warnings where relevant); nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数namecustomer_idcounting_typecurrency_codedefault_valueprimary_for_goalattribution_modelconversion_action_id必填always_use_default_valueview_through_window_daysclick_through_window_daysphone_call_duration_seconds另有 1 个

draft_remove_conversion_action

Draft removing a conversion action

Draft a REMOVAL of a ConversionAction — returns a PREVIEW. Removal stops counting and drops the action from goal lists; historical data is preserved but the action is irreversible. SMART_CAMPAIGN_* and GOOGLE_HOSTED types reject removal with MUTATE_NOT_ALLOWED. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idconversion_action_id必填

draft_upload_call_conversions

Draft call conversion upload

Draft an offline CALL-conversion upload from a CSV — returns a PREVIEW. Uploads call conversions via ConversionUploadService.UploadCallConversions, matching the call against the ad click by the caller's phone number. The CSV must have columns: Caller's Phone Number, Call Start Time, Conversion Name, Conversion Time, Conversion Value, Conversion Currency. The Conversion Name must match an existing UPLOAD_CALLS-type conversion action — verified against the account while drafting, so a typo fails here rather than after the upload. Optional `Ad User Data` and `Ad Personalization` columns carry consent per row. The CSV comes from csv_path (a file on the machine running AdLoop) or from upload_id (a file uploaded with upload_conversion_csv, the only way on AdLoop Cloud). An uploaded file is deleted once the draft has read it. PII: the caller phone number is required RAW by Google (it cannot be hashed), so it lives in the plan's apply-only payload — the preview shows redacted ids and counts, the audit log and `plan.changes` show neither. Apply uploads exactly what you previewed (no CSV re-read). Phone numbers are normalized with libphonenumber semantics: a number carries no country code needs ``default_region``, an extension is dropped, and the German trunk marker in "+49 (0)89 …" is handled. Rows whose number stays unusable are skipped and reported in `skipped_rows` instead of being uploaded to no effect. Rows that repeat inside one file are named in `dedup_warnings`. A call upload has no dedup key at Google, so each of them still goes out as its own conversion — the warning is the only place that says so. Returns a preview with a plan_id, the row counts, the consent the rows actually carry (`consent_summary`) and the skipped rows; nothing is uploaded until that preview is confirmed. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数consentcsv_pathupload_idcustomer_iddefault_region

draft_upload_enhanced_conversions_for_leads

Draft enhanced conversions upload

Draft an Enhanced Conversions for LEADS upload from a CSV — PREVIEW. Uploads lead conversions via ConversionUploadService.UploadClickConversions with user_identifiers, matching hashed customer PII back to the Google users who clicked the ads. The CSV holds RAW PII in columns: Email, Phone Number, First Name, Last Name (plus Conversion Name, Conversion Time, Conversion Value, Conversion Currency; optional Order ID dedup key, and optional `Ad User Data` / `Ad Personalization` consent columns). PII is normalized and SHA-256-hashed AT PREVIEW TIME — only the hashes are stored in the plan. Raw email/phone/name never land in the plan or the audit log. A cell that already is a SHA-256 hex digest (a CRM export that hashes before writing) is used as it is. The target conversion action must be UPLOAD_CLICKS-type. An Order ID column makes re-uploads dedup instead of double-counting. Rows that repeat inside one file are named in `dedup_warnings`. Rows sharing an Order ID count once at Google; two rows with different Order IDs are two real orders and are not reported. The CSV comes from csv_path (a file on the machine running AdLoop) or from upload_id (a file uploaded with upload_conversion_csv, the only way on AdLoop Cloud). An uploaded file is deleted once the draft has read it. Returns a preview with a plan_id, the row counts, the consent the rows actually carry (`consent_summary`) and the skipped rows; nothing is uploaded until that preview is confirmed. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数consentcsv_pathupload_idcustomer_iddefault_region

validate_tracking

Validate tracking

Compare tracking events found in the codebase against actual GA4 data. Takes the event names found in the codebase's gtag('event', ...) or dataLayer.push calls and checks which ones actually fire in GA4. Returns matched events with their GA4 counts, events missing from GA4, unexpected GA4 events, auto-collected events (page_view, session_start, etc.), insights on likely causes, and the date range. Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数property_iddate_range_endexpected_events必填date_range_start

generate_tracking_code

Generate tracking code

Generate a GA4 event tracking JavaScript snippet. Produces ready-to-paste gtag code for the specified event. Includes recommended parameters for well-known GA4 events (sign_up, purchase, etc.). Optionally checks GA4 to warn if the event already fires. Returns the javascript snippet, already_exists / existing_count from GA4, and notes (duplicates, marking it as a key event, GDPR consent). Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数triggerevent_name必填property_idevent_paramscheck_existing

estimate_budget

Budget forecast

Forecast clicks, cost, and conversions for a set of keywords. Uses Google Ads Keyword Planner to estimate campaign performance without creating anything. Essential for budget planning before launching campaigns. Per-keyword max_cpc values are collapsed to a campaign-level manual CPC cap (the highest one) — the Ads API forecast takes no per-keyword bids. Returns estimated clicks, cost, avg CPC, conversions and avg CPA for the forecast period, daily estimates, and insights. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数keywords必填customer_idlanguage_iddaily_budgetforecast_daysgeo_target_id

discover_keywords

Keyword ideas

Discover new keyword ideas using Google Ads Keyword Planner. Mirrors the "Discover new keywords" UI in Keyword Planner: start with keywords (seed_keywords), start with a website (url), or both together for more targeted ideas. At least one of seed_keywords or url is required. Returns keyword ideas sorted by avg monthly search volume, with competition level (LOW/MEDIUM/HIGH) and top-of-page bid range, plus the seeds used and insights. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数urlpage_sizecustomer_idlanguage_idgeo_target_idseed_keywordsinclude_monthly_volumes

suggest_brands

Suggest brands

Resolve a brand name to the brands Google recognizes for it. Mirrors the brand picker in the Google Ads UI (BrandSuggestionService.SuggestBrands): takes a free-text name such as "EscapeGame München" or "NoWayOut" and returns the matching brands with their ID, display name, state, and associated URLs. The returned brand ID is the Commercial Knowledge Graph ID. Brand criteria — brand lists, brand exclusions — target that ID, not a display name, so a name is resolved here before it can go into a brand list. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idbrand_prefix必填selected_brand_ids

check_brand_names

Check brand names

Check a list of brand names against Google's brand knowledge graph. One SuggestBrands call per name, for the case where a shortlist has to be triaged instead of a single name resolved: which of these brands does Google know at all, and what is the ID of each? Returns checked / matched / no_match counts and one result per name with status "matched" (with a best-match brand plus all candidates) or "no_match" (empty candidate list — a normal answer, not an error). exact_match marks a candidate whose name matches the query apart from case and punctuation; anything else is a Google suggestion, not a guarantee. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数brand_names必填customer_id

get_brand_lists

List brand lists

List all brand lists (SharedSets of type BRANDS) in the account. Returns each list's ID, name, status, and member count, plus the total — the basis for reusing an existing list with add_to_brand_list instead of duplicating it with propose_brand_list. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_id

get_brand_list_brands

Brands in a brand list

List the brands inside a brand list. Returns the brands and their total. Each entry carries brand.entity_id (the Commercial KG MID that suggest_brands returns as id), the display name, primary URL, status and a criterion_id — the latter is what remove_from_brand_list needs. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idshared_set_id必填

get_brand_list_campaigns

Campaigns using a brand list

List which campaigns a brand list is attached to. Brand lists attach as CampaignCriterion rows of type BRAND_LIST (not as CampaignSharedSet like negative keyword lists). Returns each attachment's campaign ID, name and status, the criterion, and `role`: "excluded" when the criterion is negative, "targeted" when it restricts targeting to the list. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idshared_set_id

propose_brand_list

Draft a brand list

Draft a brand list and optionally attach it to campaigns — returns a PREVIEW. Creates a SharedSet of type BRANDS, fills it with brands, and — when campaign_ids is given — attaches it to those campaigns. Returns a preview with a plan_id; nothing changes until the returned plan_id is applied with confirm_and_apply. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数negativebrand_ids必填list_name必填customer_idcampaign_ids

add_to_brand_list

Draft additions to a brand list

Append brands to an EXISTING brand list — returns a PREVIEW. For a list that already exists and only needs more brands (propose_brand_list creates a new list instead). The shared_set_id comes from get_brand_lists; get_brand_list_brands shows the brands already in the list, which makes a brand that would be added twice visible. Returns a preview with a plan_id; nothing changes until the returned plan_id is applied with confirm_and_apply. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数brand_ids必填customer_idshared_set_id必填

remove_from_brand_list

Draft removing brands from a list

Remove brands from a brand list — returns a PREVIEW. SharedCriteria have no status field, so removal is the only way to take a brand out of a list — there is nothing to pause. Removing a brand does not detach the list from any campaign. Returns a preview with a plan_id; nothing changes until the returned plan_id is applied with confirm_and_apply. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idcriterion_ids必填shared_set_id必填

attach_brand_list_to_campaigns

Draft attaching a brand list

Attach an existing brand list to one or more campaigns — returns a PREVIEW. Creates a CampaignCriterion.brand_list per campaign. This is NOT the CampaignSharedSet linkage used for negative keyword lists — brand lists are criteria, and `negative` decides the role. The shared_set_id comes from get_brand_lists; get_brand_list_campaigns lists existing attachments. Returns a preview with a plan_id; nothing changes until the returned plan_id is applied with confirm_and_apply. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数negativecustomer_idcampaign_ids必填shared_set_id必填

detach_brand_list_from_campaigns

Draft detaching a brand list

Detach a brand list from one or more campaigns — returns a PREVIEW. Removes the CampaignCriterion rows linking the list to those campaigns; the list itself and its brands are unchanged. get_brand_list_campaigns lists the existing attachments. Returns a preview with a plan_id; nothing changes until the returned plan_id is applied with confirm_and_apply. Google Ads API: https://developers.google.com/google-ads/api/docs/start

输入参数customer_idcampaign_ids必填shared_set_id必填

版本历史

22
  1. v0.38.1Nov 4, 2026
  2. v0.37.0Oct 29, 2026
  3. v0.35.1Oct 23, 2026
  4. v0.33.1Oct 21, 2026
  5. v0.33.0Oct 18, 2026
  6. v0.32.1Oct 17, 2026
  7. v0.32.0Oct 16, 2026
  8. v0.30.0Oct 16, 2026
  9. v0.29.2Oct 15, 2026
  10. v0.29.1Oct 14, 2026
  11. v0.27.1Oct 14, 2026
  12. v0.27.0Oct 13, 2026
  13. v0.24.0Oct 13, 2026
  14. v0.23.0Oct 12, 2026
  15. v0.22.2Oct 11, 2026
  16. v0.22.1Oct 11, 2026
  17. v0.21.0Oct 9, 2026
  18. v0.20.0Oct 9, 2026
  19. v0.19.0Oct 6, 2026
  20. v0.18.0Oct 4, 2026
  21. v0.16.0Oct 3, 2026
  22. v0.13.2Sep 16, 2026

评分

已满足适用检查项的 85%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分