Adthena
Search & AI Intelligence
- Category
- Marketing
- Primary Subcategory
- Competitive & Market Intelligence
Integration details
Description
Connect to the Adthena competitive intelligence platform to analyze paid search markets, monitor competitors, and uncover search opportunities directly inside ChatGPT. Explore market share trends, compare advertiser visibility, discover high-value search terms, analyze ad copy strategies, track AI Overview presence, and detect potential trademark infringements using natural language queries. Ask questions like “Who is gaining market share in running shoes?”, “What ad copy themes are competitors using?”, or “Which search terms are driving growth in this category?” and receive structured, data-driven insights instantly. The app provides authoritative competitive search intelligence across market analysis, search optimization, brand protection, and AI search visibility. Requires an active Adthena subscription and authenticates securely via OAuth using your existing Adthena credentials.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Competitive & Market Intelligence
- Secondary Subcategories
- None listed
- Brand
- Adthena
- Access
- Account required
- First tracked
- 2026-07-04
- Tool count
- 23
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Get alerts for Adthena
Get updates when Adthena’s Discoverability Score or category rank changes.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT Competitive & Market Intelligence
View Category23 tools agents can invoke
Get AI Ads Intelligence data: how often the brand and competitors appear in paid LLM ad placements (ChatGPT and Google AI). This is a separate surface from get_llm_performance - it tracks PAID AD placements inside LLM responses, not organic citations. Engines are "chatgpt" and "googleai" (NOT "perplexity"). Requires the account to have llm_ads_enabled; per-engine entitlement flags further gate which engines respond - disabled engines are silently dropped, and a call with no entitled engines returns 403. IMPORTANT: end_date must not be later than yesterday (today's data is not yet available). Dates in YYYY-MM-DD format. Soft-delete behaviour: includes any AI Ads prompt that was active during any part of the requested window. A prompt deleted mid-window contributes data for the days it was alive - so historical metrics can reference prompts no longer returned by get_llm_ad_prompts(). The `prompt_group` filter follows the same active-during-window rule. The `prompt` filter is different: it matches the underlying scrape data directly, so a fully-historic prompt name still matches as long as scrape rows exist for it. report_type options: - "performance_trends" (default): one segment per (engine, location) bucket with period-level summary metrics (ad_presence_rate, prompts_with_ads, total_prompts, competitors_detected, top_competitor, top_competitor_detection_rate) and a daily time_series (date, ad_presence_rate, prompts_with_ads, competitors_detected). Unpaginated. - "advertiser_share_trends": one segment per (engine, location) containing a competitors list - the brand row first, then top competitors by detection count (cap via max_number_of_domains, default 5). Each entry carries a period share_of_ads and a daily time_series (date, share_of_ads). Unpaginated. - "prompts_analysis": one row per prompt with brand vs competitor rates (your_ads_detection_rate, top_competitor_rate, avg_competitor_detection_rate, you_vs_top_competitor_rate), the competitors list, competitors_count, and is_greenfield flag. Paginated. prompt_status (prompts_analysis only): "with_brand_ads" = prompts where the brand has ads; "gap" = prompts where competitors have ads but the brand does not; "all" = both (default). segment_by=["engine"] splits the trend results per LLM engine; empty default aggregates engines into a single comma-joined label like "chatgpt, googleai". Ignored for prompts_analysis. max_number_of_domains (advertiser_share_trends only): 1-100, default 5. The brand row is always returned in addition to these competitors. Sorting (prompts_analysis only): order_by one of "prompt", "your_ads_detection_rate" (default), "top_competitor_rate", "avg_competitor_detection_rate", "competitors_count". order_direction defaults to "desc". Default page_size is 0 (all results). AI Ads Intelligence volumes are small; pass a specific page_size only if you need smaller pages. DATA INTERPRETATION - how to read the response (fields, omissions, zero-fill): - NOT every rate is capped at 1. The brand-side rates (`ad_presence_rate`, `your_ads_detection_rate`) and `share_of_ads` are in [0, 1]. The COMPETITOR rates - `top_competitor_detection_rate` (performance_trends), `top_competitor_rate` and `avg_competitor_detection_rate` (prompts_analysis) - are ad placements / scrapes, and every ad counts: a competitor showing several ads in one answer counts more than once, so these CAN EXCEED 1. Do not render them as a percentage-of-scrapes bar or clamp them to 100%. `you_vs_top_competitor_rate` is the brand rate minus the top competitor rate, so it can go below -1. - The API NEVER returns JSON `null`. Undefined values are OMITTED FROM THE RESPONSE (the key is absent), not serialized as `null`. To detect "undefined", check for key absence - `field is None in JS/Python after parsing` because the key doesn't exist, not because it was explicitly null. - `ad_presence_rate` (both period-level and per-day in time_series) is ALWAYS PRESENT and numeric - the DAO zero-fills buckets with no data and substitutes 0 for any undefined value. A `0` is therefore AMBIGUOUS: it can mean "no scrapes occurred" OR "scrapes occurred but the brand was not detected". Use the corresponding `total_prompts` field at the same level to disambiguate (never use the period-level value to interpret a daily value, or vice versa): - PERIOD level: each segment exposes a `total_prompts`. `total_prompts > 0` ⇒ scrapes occurred during the period ⇒ `ad_presence_rate = 0` is a real "brand absent across the period" signal. `total_prompts = 0` ⇒ no scrapes occurred in the period ⇒ the rate carries no signal; do not recommend action. - PER-DAY level: each `time_series` point also exposes a `total_prompts` (count of distinct prompts scraped on that day). Same rule: `total_prompts > 0` ⇒ scrapes occurred that day ⇒ `ad_presence_rate = 0` means the brand was absent that day; `total_prompts = 0` ⇒ no scrapes that day, the rate carries no signal. - In `prompts_analysis` this ambiguity does NOT exist - every returned row has scrapes > 0 (SQL HAVING filter), so an absent `your_ads_detection_rate` is a definitive "brand absent" signal. - Period-level rate fields that CAN be omitted (the key is absent). Each carries a specific presence/absence signal - absence tells you which entity is missing from the data, not "we couldn't compute". For all of these, the rate would have been 0 had it been emitted: - `your_ads_detection_rate` (prompts_analysis): absent ↔ the brand had zero detections on that prompt. - `top_competitor_rate`, `avg_competitor_detection_rate` (prompts_analysis), `top_competitor_detection_rate` (performance_trends): absent ↔ no competitors were detected. - `you_vs_top_competitor_rate` (prompts_analysis): absent ↔ either the brand or the competitors are absent (or both). - `share_of_ads` (period and daily) is always present - advertisers with zero detections in the period don't appear in the response at all, including the brand. If a brand row is missing from `advertiser_share_trends`, the brand had no detections in that bucket. - `top_competitor` key is OMITTED when no competitors were detected in that bucket / on that prompt. Treat absence as "uncontested", not "missing data". - In prompts_analysis: a row with `your_ads_detection_rate` absent and `competitors_count > 0` is a GAP prompt. A row with `top_competitor` absent and `your_ads_detection_rate` present is a GREENFIELD prompt (also signalled explicitly via `is_greenfield: true`). - `is_greenfield` is always present (boolean). True when the brand has detections AND no competitors were detected. - The advertiser DOMAIN is the identity. Advertisers are grouped and counted by domain, and placements with no domain are unattributable and are dropped before aggregation - so a `competitors` entry, a `top_competitor` or an `advertiser_share_trends` row always carries a non-empty `domain`, and `competitors_count` / `competitors_detected` are counts of distinct domains. The `name` is the DISPLAY LABEL only: it is the bucket's most-detected advertiser name, and it FALLS BACK TO THE DOMAIN when no named placement exists. Match, dedupe and join on `domain`; never on `name` (one advertiser has several name spellings, and two businesses can share one). - Zero-fill is BY BUCKET of the resolved time_period, not by day: a daily response carries every day in range, a weekly one only the Sunday week-starts, and a monthly one only the month-firsts. Bucket dates are also clamped inward to [start_date, end_date], so a partial bucket at either end is not emitted at all. Read the `date` sequence rather than assuming consecutive days, and check `filters.time_period` in the response for which granularity you actually got. - In `performance_trends`, every requested (engine, location) bucket always appears - a segment with no data is returned fully zero-filled. `advertiser_share_trends` is different: it is built only from advertisers that had detections, so a bucket with no detections yields no segment at all. - `engine` field on segments: a single engine name when segment_by=["engine"]; otherwise a sorted comma-joined label (e.g. "chatgpt, googleai") representing the aggregated bucket. - No prior-period deltas are computed server-side. To compare two periods, call this tool twice with adjacent date ranges and compute deltas client-side. Filtering: prompt / excluded_prompt / prompt_group / excluded_prompt_group narrow the tracked prompt set (use get_llm_ad_prompts() to discover them). competitor / excluded_competitor / competitor_group / excluded_competitor_group narrow the ADVERTISER DOMAINS on every report type: competitor takes domains, competitor_group takes the account's competitor group names (the same groups used by get_market_share() and get_ads(); discover them via get_account_settings()). The filters are literal - the account's own domain is a filterable domain like any other, so a selection that does not contain it hides the brand row in advertiser_share_trends and zeroes the brand-side rates (ad_presence_rate, your_ads_detection_rate), and brand-relative fields (you_vs_top_competitor_rate, share_of_ads, is_greenfield, competitors_count, top_competitor) are computed over the filtered advertiser set. The domains that can match are the LLM-relevant competitors: every domain ever seen advertising or cited on the account's tracked prompts, NOT the Google-SERP relevant competitors used elsewhere. There are no device, ad_type, search_term, or adwords_campaign filters. The applied values are echoed under filters.competitor / filters.excluded_competitor / filters.competitor_group / filters.excluded_competitor_group. filtering_options controls how the competitor / competitor_group selection interacts with the metrics. "relative" (default) applies the selection BEFORE aggregation, so share_of_ads is recomputed over the selected domain set and the selected shares sum to 1. "absolute" computes every metric over the whole market and only filters which domain rows are returned, so shares keep their whole-market values and do not sum to 1. Exclusions (excluded_competitor / excluded_competitor_group) apply in both modes. Ignored when no competitor filters are given. advertiser_share_trends only - it is not sent for performance_trends or prompts_analysis, whose rates are per-scrape and unaffected by the domain set. See docs://date-rules for date and time_period handling. See docs://data-access for pagination and segmentation. See docs://concepts for metric definitions (Ad Presence Rate, Share of Ads, Greenfield/Gap prompts). See docs://workflows section "AI Ads Intelligence Visibility Analysis" for a multi-step analysis pattern.
get_ai_ads_intelligence
Get the UNTRACKED prompts that carried paid LLM ads: prompts the brand or a named competitor advertised on, which are NOT in the account's tracked AI Ads prompt set. This is the expansion/gap-discovery surface for AI Ads Intelligence, and it is the complement of every other AI Ads tool: get_ai_ads_intelligence() and get_llm_ad_prompts() only ever describe prompts the account ALREADY tracks. This tool answers "what am I (or my named competitors) advertising on that I am not monitoring?" - the candidate list for expanding the tracked set. Engines are "chatgpt" and "googleai" (NOT "perplexity"). IMPORTANT: end_date must not be later than yesterday (today's data is not yet available). Dates in YYYY-MM-DD format. Gating: requires the ai-ads-prompt-expansion flag on the account (403 otherwise), plus per-engine AI Ads entitlement - disabled engines are silently dropped from the request and a call with no entitled engines returns 403. An account with no country configured returns 422. signal options - which prompts qualify: - "you" (default): prompts the account's OWN domain advertised on. This is the in-platform worklist: your spend running outside your monitored set. - "competitors": prompts where ONLY named competitors advertised and the brand did not. Whitespace in the market. - "all": both. SCOPE - three constraints decide what can appear, and all three are server-side: - The account's OWN country only. There is no location parameter: the account's configured country scopes every row, and sub-national geo codes resolve to their country. - A prompt only qualifies when the brand's own domain OR a member of the account's built-in "Named Competitors" group advertised on it. A prompt where only unrelated advertisers appeared is not returned, whatever `signal` is. - The prompt must NOT be in the account's active tracked ad-prompt set. Adding a returned prompt to a tracked group therefore removes it from this list on the next read. GRAIN - one row per (prompt, ENGINE), always. The result is unconditionally segmented by engine: `filters.segment_by` comes back as `["engine"]` and there is no way to ask for an engine-aggregated shape. A prompt that carried ads on both engines therefore yields TWO rows, each with its own advertisers, share and last_seen. Do not treat the row count as a prompt count - de-duplicate on `prompt` for that. Response fields, one row per (prompt, engine): prompt (the text), engine (which engine this row is for), you_advertise (whether the brand's own domain advertised on it, on this engine), advertiser_domains (EVERY advertiser domain seen on the prompt for this engine, busiest first - not just the relevant ones), advertiser_count (distinct advertisers), top_advertiser_domain and top_advertiser_share (the busiest advertiser and its share of this row's ads), last_seen (last ad observation inside the window). DATA INTERPRETATION: - `top_advertiser_share` is a FRACTION between 0 and 1 (published to 4 decimal places), not a percentage - the same units as `share_of_ads` and the detection rates elsewhere in the LLM family. Multiply by 100 to display it. It is a share of that row's ad placements, so it never exceeds 1. - Raw ad counts are deliberately not exposed. Rank advertisers by share, and prompts by advertiser_count / last_seen. - Relevance is decided PER ENGINE: a named competitor advertising on chatgpt does not pull the prompt into the googleai rows. - `advertiser_domains` is the full observed advertiser set, so it CAN contain domains that are neither the brand nor a named competitor. Do not read its length as a competitor count - use advertiser_count for distinct advertisers, and cross-reference the "Named Competitors" group (get_account_settings) to tell competitors from bystanders. - `you_advertise` false with signal="all" means only named competitors ran ads there. - Every returned row had at least one ad in the window, so there are no zero-filled or empty rows - an empty `data` array means nothing qualified, not that data is missing. - The response NEVER contains JSON `null`. A filter the caller did not set, or a value that is undefined, is OMITTED (the key is absent) rather than published as null - check key presence, not for null. - The DOMAIN is the identity. Placements with no advertiser domain are unattributable and dropped before aggregation. Sorting: order_by one of "relevant_advertiser_count" (default - how many of the brand + named competitors are on the row), "last_seen", "top_advertiser_share". order_direction defaults to "desc". Ties break on (prompt, engine), so paging is stable. Default page_size is 0 (all results), which the API streams rather than buffering. Prompt-expansion volumes are small; pass a specific page_size only if you need smaller pages. `advertiser` narrows to prompts where that domain is one of the relevant advertisers (the brand or a named competitor); `search` is a free-text match on the prompt text. See docs://date-rules for date and time_period handling. See docs://data-access for pagination and filtering.
get_ai_ads_prompt_expansion
Get AI Overview appearance data and frequency metrics. IMPORTANT: start_date must be 2025-07-31 or later. report_type options: - "overview": Time series of AI Overview appearance frequency. No pagination. - "search_terms": Per-term AI Overview data. Paginated. Response fields (overview): device, overall_frequency, complex_query_frequency (volume-weighted AIO frequency over 5+ word terms), the non-AIO benchmarks all_non_aio_frequency and premium_non_aio_frequency, six intent shares (local_intent_share, investigational_intent_share, seasonal_intent_share, problem_solving_intent_share, transactional_intent_share, navigational_intent_share), and the word-count buckets {one_two,three_four,five_six,seven_plus}_word_{appearances,frequency}. Two nested lists: relative_positions[] entries carry type, ad_type, non_aio_frequency, above_share, below_share, inside_share (premium ad position data); time_series[] entries carry date, appearances, frequency. There is no top-level date, appearances or frequency - those live only inside time_series. Response fields (search_terms): search_term, device, frequency, impressions, intent, term_type, plus 20 ad-position fields. For the account: account_textad_{above,below,inside}_share and account_pla_{above,below,inside}_share. For competitors: competitor_textad_{above,below,inside}_share, competitor_pla_{above,below,inside}_share, and the domain counts competitor_textad_domains_{above,below,inside,total}_count and competitor_pla_domains_{above,below,inside,total}_count. Absolute data: accounts entitled to absolute figures additionally receive a _numerator and _denominator twin for each share metric. On overview these are all_textad_{above,below}_*, all_pla_{above,below}_*, premium_textad_{above,below,inside}_* and premium_pla_{above,below,inside}_*, with {above,below,inside}_share_{numerator,denominator} inside relative_positions[]; on search_terms they are the {account,competitor}_{textad,pla}_{above,below,inside}_share_{numerator,denominator} set. These are absent from the published OpenAPI schema by design, so do not conclude from the docs that they are unavailable - but they are also absent entirely for accounts without the entitlement, so check for the keys rather than depending on them. term_type for search_terms: ["wmv"] (default) or ["premium"] (premium-enabled accounts only). order_by for search_terms: "search_term", "impressions", "frequency". No competitor, ad_type, is_whole_market, or adwords_campaign filters on this endpoint. See docs://date-rules for date and time_period handling. See docs://data-access for segment_by details.
get_ai_overview
Get AI Overview citation analysis: sentiment, themes, and competitor citations. Premium-only. start_date must be within the last 30 days. Dates in YYYY-MM-DD format. report_type options: - "content": Citation frequency, sentiment breakdown (favourable/unfavourable/neutral/comparative/inconclusive), theme breakdown (how_to/comparison/problem_solve/review/faq/news), top 5 cited domains by position, and daily citation frequency time series. No pagination. - "competitors": Top cited domains with overall citation share and daily time series per domain. No pagination. Use max_number_of_domains to control how many domains are returned (default 10). max_number_of_domains only applies to report_type="competitors" (1-1000, default 10). No competitor, location, or term_type filters on these endpoints. See docs://data-access for segment_by and filtering details.
get_ai_overview_content
Get AI Overview impact on CTR and CPC with frequency breakdown. Premium-only. start_date must be within the last 30 days. Dates in YYYY-MM-DD format. report_type options: - "impact": Aggregate CTR/CPC with vs without AI Overview, per-frequency-bucket breakdown (CTR/CPC by AIO frequency), and daily time series. No pagination. - "search_terms": Paginated list of search terms with their frequency bucket, AIO frequency, estimated AIO impressions, and search volume. Use bucket_label to filter by specific frequency buckets. bucket_label values (for search_terms): "0", ">0-25", ">25-50", ">50-75", ">75-<100", "100". Omit for all buckets. For "impact": device and segment_by are supported. For "search_terms": device is fixed to both desktop+mobile (not selectable). order_by defaults to "search_volume". No competitor, location, or term_type filters on these endpoints. See docs://data-access for segment_by and filtering details.
get_ai_overview_impact
Get account configuration data: locations, search term groups, and group metrics. Call "locations" or "search_term_groups" first to discover values for use as filters in other tools. Competitor filters: the competitor_group / excluded_competitor_group names accepted by the market, ad and LLM tools are the account's competitor groups (built-in "Named Competitors" and "Ignored Competitors" plus any customer-defined ones); the same group names apply to get_llm_performance(), get_ai_ads_intelligence() and get_llm_ad_library(). There is no setting_type that lists competitor domains. For Google SERP tools, discover domains from get_market_share() (the competitor field). For the LLM tools the filterable domains are the LLM-relevant competitors - every domain ever seen cited or advertising on the account's tracked prompts, including the account's own domain - so discover them from the LLM responses themselves: get_llm_performance(report_type="domain_performance") for cited domains and get_ai_ads_intelligence(report_type="advertiser_share_trends") or get_llm_ad_library(report_type="ads") for advertiser domains. A Google-only competitor that has never appeared in an LLM answer matches nothing on the LLM tools. setting_type options: - "locations": All locations in the account hierarchy. No extra params needed. - "search_term_groups": Group hierarchy with metadata. Paginated. - "search_term_groups_metrics": Groups with performance metrics. Requires start_date, end_date, device. Paginated. Response fields (search_term_groups): group_name, group_type, created_at, created_by, modified_at, modified_by, search_term_count, locations. Response fields (search_term_groups_metrics): group_name, device, ad_type, location_name, total_estimated_impressions, total_estimated_clicks, total_estimated_spend, avg_position, competitor_count. order_by for groups: "group_name", "group_type", "created_at", "created_by", "modified_at", "modified_by". order_by for metrics: "total_estimated_clicks", "group_name", "total_estimated_impressions", "total_estimated_spend", "avg_position", "competitor_count". See docs://date-rules for date and time_period handling. See docs://data-access for pagination and segment_by details.
get_account_settings
Get the most frequent ad copies or product listing ads. ad_format options: - "text" (default): Top text ads. Use ad_type to control which: ["textad"], ["organic"], or both. - "pla": Top product listing ads. Requires PLA enabled. ad_type not applicable. Response fields (text): ad_id, ad_type, device, location_name, competitor, title, display_text, description1, description2, frequency, first_seen, last_seen, estimated_impressions, search_terms, best_position, average_position. Response fields (pla): ad_id, device, location_name, competitor, title, display_text, frequency, first_seen, last_seen, estimated_impressions, search_terms, price, old_price, price_numeric, old_price_numeric, rating, shopping_tag, badge, image, comparison_shopping_services (CSS - Comparison Shopping Services - provider that placed the ad, e.g. "Google Shopping" or a third-party CSS partner; may be null), return_policy. order_by options for text: "frequency", "estimated_impressions" (default). order_by options for pla: "frequency", "estimated_impressions" (default), "price". Use ad_text/excluded_ad_text for text search. Use is_new=true for ads first seen in last 7 days, is_current=true for last seen in last 7 days (text only). Data is always segmented by device and ad_type. See docs://date-rules for date and time_period handling.
get_ads
Get ad hijacking detection data. Workflow: Call "configurations" first to get IDs, then use configuration_id with "incidents" or "summary". report_type options: - "configurations" (default): Hijacking rule configs. Only needs account_id. Paginated. - "incidents": Detailed hijacking records. Requires configuration_id, start_date, end_date. Paginated. - "summary": Aggregated stats with top hijackers. Requires configuration_id, start_date, end_date. Response fields (configurations): id, name, created_date, modified_date, enabled, location_name. Response fields (incidents): one object per hijacking instance - geo_code, hijacker_id, ad_url, final_url, date, domain, device, search_term, utm_params, evidence_link, redirect_count, and a nested redirects[] chain. Each redirects[] hop has order_num, status_code, redirect_url, affiliate_network_name, affiliate_id, sub_id, date. Results are sorted by date, newest first by default; pass order_direction to override. `evidence_link` is an opaque, server-generated URL to Adthena's stored capture of the hijacking incident. It has no derivable structure and is only valid exactly as returned - it cannot be reconstructed from the domain, search term, date, or any other field. The same applies to the captured `ad_url`, `final_url`, and each `redirects[].redirect_url`. Surface these links verbatim; a record may omit `evidence_link`, in which case no evidence capture exists for it. Response fields (summary): the payload is NOT flat - it has exactly two keys. `stats` holds total_incidents, unique_hijackers, unique_search_terms, desktop_count, mobile_count. `top_hijackers` is a list whose entries carry hijacker_id, affiliate_network_name, count. There is no device_breakdown key - the device split is desktop_count and mobile_count inside `stats`. Use affiliate_text to search affiliate_id/sub_id. Use network_name to filter by affiliate_network_name. See docs://date-rules for date handling.
get_ad_hijacking
Get Adthena-detected trademark cases - the inputs to Google's Auto-Takedown enforcement system. These are *detections*, not enforcement outcomes. After a user reports a detection from the Adthena app, the downstream outcome (successful / unsuccessful / pending) is returned by `get_trademark_takedowns` - a separate tool. Detection → report → enforcement outcome. For the general SERP Tracker rule family (non-trademark rule matches), use `get_serp_tracker` instead. report_type options: - "matches" (default): Detailed detection records. Requires start_date/end_date. Paginated. - "summary": Aggregated stats including total_matches, unique_competitors, top-N competitors by match_count. Requires start_date/end_date. - "rules": Auto-Takedown rule configurations for the account. No dates needed. Paginated. Response fields (matches): name (rule name), id, date_time, device, location_name, competitor, search_term, title, description1, description2, click_url, destination_url, display_url, position, evidence_link. `evidence_link` is an opaque, server-generated URL to Adthena's stored capture of the SERP for that detection. It has no derivable structure and is only valid exactly as returned - it cannot be reconstructed from the competitor, search term, date, or any other field. The same applies to `click_url`, `destination_url`, and `display_url`, which are captured from the live ad. Surface these links verbatim; a record may omit `evidence_link`, in which case no evidence capture exists for it. Response fields (summary): total_matches, unique_competitors, unique_search_terms, desktop_count, mobile_count, top_competitors (each with competitor + match_count). Response fields (rules): id, name, device, enabled, location_name, email_count. order_by for matches: "name", "search_term", "date_time" (default). order_by for rules: "name". See docs://date-rules for date handling.
get_auto_takedown
Get Brand Activator data showing automated bid management activity and savings. CRITICAL: Savings UP = fewer competitors (good). Savings DOWN = more competitors (bad). Do NOT invert this. See docs://workflows § Brand Activator Analysis for full interpretation rules and common mistakes to avoid. IMPORTANT: Only search_term filtering available (no competitor/group/location filters). SAVINGS DATA LAGS 4 DAYS. Savings for the most recent 4 days have not landed yet and come back as 0 - that is missing data, NOT zero savings. Exclude those incomplete days from totals and averages, or caveat them explicitly. The platform UI never shows those days at all. Prefer end_date <= today minus 4 days for savings reports. The activity_log is real-time and has no such lag. report_type options: - "activity_log": Activity records. Paginated. LIMITED TO LAST 60 DAYS. - "daily_savings": Daily savings per search term. Paginated. No date restriction, but see the 4-day lag note above. - "daily_savings_summary": Aggregated savings overview. Uses top_n. No date restriction, but see the 4-day lag note above. Response fields (activity_log): search_term, action, reason, domains, timestamp. Response fields (daily_savings): search_term, date, currency, savings, in_negative_list, competitor_count. Response fields (daily_savings_summary): the payload is NOT flat - it has exactly two keys. `stats` holds total_savings, currency, total_days, avg_daily_savings, max_daily_savings, total_search_terms, avg_competitor_count, avg_time_in_negative_list_pct. `top_terms` is a list whose entries carry search_term, total_savings, avg_competitor_count. There is no top_search_terms key. See docs://workflows § Brand Activator Analysis for interpretation rules.
get_brand_activator
Get search term overlap analysis between your domain and each competitor. Shows shared search terms, overlap ratios, and click estimates per competitor. Response fields: competitor, device, ad_type, location_name, your_relevant_search_terms, relevant_search_terms, shared_relevant_search_terms, competitor_only_search_terms, overlap_ratio (0-1), competitor_coverage_ratio (0-1), jaccard_similarity (0-1), estimated_clicks, shared_terms_estimated_clicks. order_by options: "shared_relevant_search_terms" (default), "relevant_search_terms", "competitor_only_search_terms", "overlap_ratio", "competitor_coverage_ratio", "jaccard_similarity", "estimated_clicks", "shared_terms_estimated_clicks". Use min_shared_terms=0 to include all competitors. Set pairwise=true with exactly 2 or 3 domains in the competitor filter to additionally receive a top-level `pairwise` block with competitor-to-competitor intersection counts: each competitor's own term-set size, every pairwise intersection and, for 3 competitors, the triple intersection - enough to draw a proportional Venn diagram. pairwise=true with any other competitor count is rejected with a 400. See docs://date-rules for date and time_period handling. See docs://data-access for pagination and segment_by details.
get_competitor_overlap
Get time series showing the number of unique competitors per time period. Tracks how competitive intensity changes over time - spot new entrants or leavers. Response: list of segments, each with time_series of {date, competitor_count}. No pagination - returns all data, ordered by date ascending. See docs://date-rules for date and time_period handling. See docs://data-access for segment_by details.
get_competitor_trends
Get the actual ad creatives detected in LLM answers: the ad copy, shopping units, advertisers, landing URLs, and per-creative detection history behind AI Ads Intelligence. This is the creative-level view of the same PAID AD placements that get_ai_ads_intelligence() reports on in aggregate. Use get_ai_ads_intelligence() for rates and share ("how visible are we"); use this tool for the creatives themselves ("what are they actually saying, and where does it point"). Engines are "chatgpt" and "googleai" (NOT "perplexity") - this is not the organic-citation surface covered by get_llm_performance(). Requires the account to have llm_ads_enabled; per-engine entitlement flags further gate which engines respond - disabled engines are silently dropped, and a call with no entitled engines returns 403. Dates in YYYY-MM-DD format. end_date must not be later than yesterday (today's data is not yet available). report_type options: - "ads" (default): the text ad creatives, one row per (creative, engine, advertiser). Fields: creative_id, engine, advertiser, advertiser_domain, is_own_brand, headline, body, headline_length, image_id, image_url, sample_url, landing_path, state, first_seen, last_seen, detections, prompt_count, days_seen, best_position, avg_position. Paginated. - "plas": the shopping (PLA) unit creatives, same grain as "ads". Fields: creative_id, engine, advertiser, advertiser_domain, is_own_brand, title, price, old_price, tag, headline_length, image_id, image_url, sample_url, landing_path, state, first_seen, last_seen, detections, prompt_count, days_seen, best_position, avg_position. The copy fields are title/price/old_price/tag rather than the headline/body of a text ad. Paginated. - "prompts": the prompts a single creative appeared on, one row per prompt. Fields: prompt, detections, days_seen, best_position, avg_position. Requires creative_id. Paginated. - "trend": a single creative's detections over time, one row per period bucket. Fields: date, detections, prompt_count, best_position, avg_position. Requires creative_id. Paginated. - "destinations": the landing URLs a single creative carried. Fields: destination_url, destination_domain, destination_host, detections, first_seen, last_seen. Requires creative_id. Paginated. creative_id is a path parameter on the three detail report types and comes from the creative_id field of an "ads" or "plas" row. It is ignored for the two list report types. Filters (the two lists only): advertiser matches on either advertiser name or domain. advertiser_scope restricts to your own brand's creatives ("own"), your competitors' ("competitors"), or everything ("all", default). state restricts to one lifecycle state, or "all" (default). search (the two lists only) is free-text over the creative copy and advertiser fields ("ads": headline, body, advertiser, advertiser_domain; "plas": title, advertiser, advertiser_domain). It is repeatable and repeats NARROW rather than widen: terms are ANDed, so search=["laptop", "monitor"] returns only creatives matching BOTH terms. Each individual term still matches if ANY of the searched fields contains it. prompt / excluded_prompt / prompt_group / excluded_prompt_group narrow the account's tracked prompt set, so they filter the lists and the "prompts" / "trend" report types identically. They are NOT accepted on "destinations" (see the destinations caveat below) and are not sent for it. competitor / excluded_competitor / competitor_group / excluded_competitor_group narrow the ADVERTISER DOMAIN (advertiser_domain) on the same report types as the prompt filters - the two lists plus "prompts" and "trend" - and are likewise not sent for "destinations". competitor takes domains; competitor_group takes the account's competitor group names (the same groups used by get_market_share() and get_ads(); discover them via get_account_settings()). They are literal: the account's own domain is a filterable domain like any other, so a selection that does not contain it hides the brand's own creatives. The domains that can match are the LLM-relevant competitors - every domain ever seen advertising or cited on the account's tracked prompts, NOT the Google-SERP relevant competitors used elsewhere. These compose with advertiser (name-or-domain match) and advertiser_scope (own / competitors / all), which stay unchanged; the applied values are echoed under filters.competitor / filters.excluded_competitor / filters.competitor_group / filters.excluded_competitor_group. Sorting - order_by is per report_type, and omitting it takes the endpoint's own default: - "ads" / "plas": "detections" (default), "prompt_count", "days_seen", "first_seen", "last_seen", "best_position", "avg_position", "advertiser", "headline" (on "plas" this sorts the product title). - "prompts": "detections" (default), "prompt". - "trend": "date" only. - "destinations": "detections" (default), "destination_url". Omitting order_direction also takes the endpoint's own default, which is "desc" everywhere EXCEPT "trend", which defaults to "asc" so the series reads oldest to newest. Pass it explicitly only when you want to override that. Default page_size is 50 (max 1000). Pass page_size=0 to fetch all results - creative lists can be large, so prefer paging or a tighter date range over pulling everything. DATA INTERPRETATION - how to read the response (fields, omissions, semantics): - The API NEVER returns JSON `null`. Undefined values are OMITTED FROM THE RESPONSE (the key is absent), not serialized as `null`. Detect "undefined" by checking for key absence. - Grain: list rows are one per (creative, engine, advertiser DOMAIN) - the domain is the advertiser identity here, and `advertiser` is a display name picked off the same rows. The SAME creative appears once per engine it ran on, so do not sum detections across rows and call it a unique-creative count, and group on `advertiser_domain` rather than `advertiser` when rolling rows up. - `days_seen` is a SPAN, not a count of active days: inclusive days between the first and last observation. A creative seen once in January and once in June has days_seen of about 150, not 2. On list rows the span covers the creative's whole observed lifetime; on "prompts" rows it is measured inside the requested window (weekly and monthly observations count through the end of their last bucket, clamped to end_date). - `first_seen` / `last_seen` on list rows likewise span the creative's whole observed lifetime, NOT the requested range. A creative can therefore report a last_seen before your start_date while still returning detections inside the range. - `state` is measured against the END of the requested date range, not against today: "new" = first observed within 7 days of that end, "quiet" = last observed more than 7 days before it (still in the data, but it has stopped appearing), "live" = neither. Because it derives from the lifetime first_seen / last_seen, a creative CAN read "quiet" inside a range it was detected in. Query a historical range and you get the states as of that range. - `best_position` is the best (lowest) 1-based rank achieved; `avg_position` is detection-weighted, to 2 decimal places. Both are omitted when no rank was captured. Lower is better for each. - `is_own_brand` is true when the advertiser's domain matches your account's domain. It is what advertiser_scope filters on. - `advertiser` and `advertiser_domain` can be empty strings - the source data carries no advertiser for that row. Treat that as "unattributed", not as a lookup failure. - `sample_url` is the creative's MOST-DETECTED landing URL over the range, exactly as observed. Per-impression tracking tokens make any single URL a sample of where the creative points rather than a stable identifier - use report_type="destinations" for the full set. `landing_path` is that URL's path with scheme, host, query string and fragment removed, which is the field to group on. Both are omitted when no destination was captured. - `image_id` is a content-addressed SHA-256 digest, stable for identical image bytes (so it is safe to cache against); `image_url` is the absolute Adthena-served URL. Both are omitted when the creative has no image. `headline_length` is 0, not omitted, when the creative carries no headline. - "trend" is NOT zero-filled: buckets with no detections are simply absent from the response. This is the opposite of get_ai_ads_intelligence()'s time_series, which zero-fills every day. Do not read a missing bucket as a zero without checking the date sequence yourself. - "destinations" detections COUNT ON A WIDER BASIS and do not sum to the creative's `detections` on the list row. A landing URL is recorded against the creative alone with no record of the prompt that produced it, so its detections cover every prompt the creative was answered on, while the list row and the "prompts" / "trend" report types count only the prompts your account tracks. Expect the destinations total to be the LARGER of the two, and never present it as a share of the creative's detections. This is also why the prompt filters do not apply there. - Bucket dates follow time_period: daily rows carry the day, weekly rows the Sunday week-start, monthly rows the first of the month. Data depth differs by time_period: the daily tables hold roughly the last month, the weekly tables the last 13 months, and the monthly tables the full history. A range reaching past the chosen period's depth returns only the rows that exist, so pick a coarser time_period for long histories. Because weekly and monthly rows are stored on their bucket-start date, a range containing no bucket start returns no rows at all - a "monthly" query over a mid-month week is an empty result, not an error. These endpoints support only the prompt, competitor and creative filters above - there is no device, ad_type, search_term, adwords_campaign, location or segment_by parameter. Location is fixed to the account's own market. Use get_llm_ad_prompts() to discover the prompts and prompt groups available for filtering. See docs://date-rules for date and time_period handling. See docs://data-access for pagination. See docs://concepts for metric definitions. See docs://workflows section "AI Ads Intelligence Visibility Analysis" for how this fits the wider analysis.
get_llm_ad_library
List AI Ads prompts and prompt groups configured for an account. This is the discovery tool for the AI Ads Intelligence surface - call it first to see what ad prompts and prompt groups exist before querying ad metrics with get_ai_ads_intelligence(). No date range or engine parameters needed. AI Ads prompts are customer-managed and a different surface from the AEO/organic prompts returned by get_llm_prompts(). An **empty result** means the account has no AI Ads prompts configured - treat this as the gate signal that AI Ads Intelligence is not in use for this account. By default (is_all=false) this returns only **currently active** prompts/groups; soft-deleted entries are excluded. There is no date window - listings describe current account configuration. Pass is_all=true to also include soft-deleted entries (those with a valid_to set). Use is_all=true to reconcile discovery output with get_ai_ads_intelligence(), which already counts prompts for the days they were alive, so a metric window may reference a prompt that the default (active-only) listing omits. report_type options: - "prompt_groups": List AI Ads prompt groups with their associated locations. - "prompts": List individual AI Ads prompts with their group name and locations. Default page_size is 0 (all results). LLM data is typically under 500 items. Pass a specific page_size if you need smaller pages. Response fields (prompt_groups): group_name, locations, valid_to (null while the group still has any active prompt, otherwise the latest deletion time among its prompts). Response fields (prompts): prompt, group_name, locations, valid_to (null while the prompt is active, otherwise its deletion timestamp), created_at, modified_at, modified_by (email of the last modifier). order_by for prompt_groups: "group_name" only. order_by for prompts: "prompt", "group_name". Use the returned group names and prompt texts as filter values in get_ai_ads_intelligence().
get_llm_ad_prompts
Get LLM domain performance data: citation trends and per-domain metrics from ChatGPT, Perplexity and Google AI Mode. METRIC SEMANTICS - read before reporting numbers. citations_frequency is a SHARE, not a rate: the domain's slice of all citations across tracked domains (0-1), not how often the domain appears per response. Report it as "share of citations", never as "citation frequency of responses". Citations count cited source LINKS; they are unrelated to brand MENTIONS in answer text (see get_llm_prompt_metrics for mention metrics). Never present a mention share as a citation share or vice versa. Any date range; `time_period` selects the grain. end_date must not be later than yesterday (today's data is not yet available). Dates in YYYY-MM-DD format. See docs://date-rules for time_period handling; the resolved grain is echoed as filters.time_period in the response, so read it rather than assuming the `date` values are consecutive days. ENGINES: "chatgpt", "perplexity" and "googleai" (Google AI Mode). The default is chatgpt + perplexity, so AI Mode is only included when you ask for it explicitly - add "googleai" to `engine` whenever the question is about AI Mode or about total organic visibility. Engines the account is not entitled to, or that are switched off for it, are silently dropped from the request and the response's filters.engine reports which ones actually answered; a call naming only unavailable engines returns 403. Compare filters.engine against what you asked for before reporting a total, because a smaller engine set means a smaller number. Soft-delete behaviour: includes any prompt that was active during any part of the requested window. A prompt deleted mid-window contributes data for the days it was alive, then disappears - so historical trends can reference prompts no longer returned by get_llm_prompts(). The `prompt` and `prompt_group` filters follow the same rule: a prompt that was already deleted before the window started cannot be matched, even by exact name. report_type options: - "domain_trends": Time series of top-cited domains in LLM responses. NOT paginated - returns all selected domains (up to max_number_of_domains) with full daily time series. Use max_number_of_domains (1-100, default 10) and primary_dimension to control which domains are selected. - "domain_performance": Per-domain performance table with scores, citation share, and position metrics. Default page_size is 0 (all results). LLM data is typically under 500 items. Pass a specific page_size if you need smaller pages. primary_dimension (domain_trends only): "frequency" (default) ranks domains by citation share (the citations_frequency field); "average_position" ranks by average position (lower = better). Response fields (domain_trends): each data entry has just two keys - engine (the engine label) and a nested competitors[] list. There is no segments key. Each competitors[] entry carries competitor, citations_frequency (share of all citations, 0-1), avg_position, performance_score (0-100), avg_position_citation, avg_position_link, and its own daily time_series (date, citations_frequency, avg_position). Response fields (domain_performance): competitor, engine, performance_score (0-100), citations_frequency (share of all citations, 0-1), avg_position, avg_position_citation, avg_position_link. order_by for domain_performance: "competitor", "performance_score", "citations_frequency", "avg_position", "avg_position_citation", "avg_position_link". segment_by=["engine"] splits results per LLM engine (ChatGPT vs Perplexity). Default (empty) aggregates across engines. Filtering: prompt / excluded_prompt / prompt_group / excluded_prompt_group narrow the tracked prompt set (use get_llm_prompts() to discover them). competitor / excluded_competitor / competitor_group / excluded_competitor_group narrow the CITED DOMAINS: competitor takes domains, competitor_group takes the account's competitor group names (the same groups used by get_market_share() and get_ads(); discover them via get_account_settings()). The filters are literal - the account's own domain is a filterable domain like any other, so a selection that does not contain it hides the brand row/series, and any brand-relative figure is computed over the filtered domain set. The domains that can match here are the LLM-relevant competitors: every domain ever seen cited or advertising on the account's tracked prompts, NOT the Google-SERP relevant competitors used elsewhere, so a Google competitor that has never been cited by an LLM matches nothing. There are no device, ad_type, search_term, or adwords_campaign filters. The applied values are echoed under filters.competitor / filters.excluded_competitor / filters.competitor_group / filters.excluded_competitor_group. filtering_options controls how the competitor / competitor_group selection interacts with the metrics. "relative" (default) applies the selection BEFORE aggregation, so citations_frequency and performance_score are recomputed over the selected domain set and the selected shares sum to 1. "absolute" computes every metric over the whole market and only filters which domain rows are returned, so shares keep their whole-market values and do not sum to 1. Exclusions (excluded_competitor / excluded_competitor_group) apply in both modes. Ignored when no competitor filters are given; sent for both report types.
get_llm_performance
Get LLM prompt-level mention, citation, and health metrics. MENTIONS ARE NOT CITATIONS. A mention counts the brand's NAME appearing in AI answer text; a citation counts a cited source LINK pointing to a domain. brand_share_of_mentions is a text-mention share and says nothing about citations - a brand can score 100% share of mentions while receiving few or no citations. For the brand's share of citations use brand_share_of_citations (prompt_groups report), or get_llm_performance(report_type= "domain_performance") for per-domain citation share. Never report one metric using the other's name. DATE RANGE: any range for every report_type; `time_period` selects the grain (see docs://date-rules), and the resolved value is echoed as filters.time_period. end_date must not be later than yesterday (today's data is not yet available). Dates in YYYY-MM-DD format. ENGINES: "chatgpt", "perplexity" and "googleai" (Google AI Mode). The default is chatgpt + perplexity, so AI Mode is only included when you ask for it explicitly - add "googleai" to `engine` whenever the question is about AI Mode or about total organic visibility. Engines the account is not entitled to, or that are switched off for it, are silently dropped from the request and the response's filters.engine reports which ones actually answered; a call naming only unavailable engines returns 403. Compare filters.engine against what you asked for before reporting a total, because a smaller engine set means a smaller number. Soft-delete behaviour: includes any prompt that was active during any part of the requested window. A prompt deleted mid-window contributes data for the days it was alive, then disappears - so historical metrics can reference prompts no longer returned by get_llm_prompts(). The `prompt` and `prompt_group` filters follow the same rule: a prompt that was already deleted before the window started cannot be matched, even by exact name. report_type options: - "prompt_groups": Per-prompt-group metrics - unique domain count and total citation count (citation-based), plus brand_share_of_mentions (text mentions, computed over the requested range at every grain) and brand_share_of_citations (cited links). segment_by=["engine"] available to split by engine. - "prompts": THE per-prompt report, always segmented by engine. Citation breadth AND mention metrics over the requested range at any grain: cited_domain_count/cited_domains, total_mentions, total_brand_mentions, brand_mentioned, brand_share_of_mentions, the framing counters, mentioned_competitors with mentioned_competitor_domains (positionally paired), account_brand_name, top_cited_urls. Rows are the union of cited and mentioned prompts. The CLASSIFICATION fields alone (category, scenarios, health_status) describe the current health window (the latest scored trailing week), independent of the requested range: they appear only when the resolved time_period is "daily" and are ABSENT (omitted, not null) on weekly/monthly responses - check filters.time_period before concluding a prompt is unscored. Default page_size is 0 (all results). LLM data is typically under 500 items. Pass a specific page_size if you need smaller pages. Response fields (prompt_groups): group_name, engine, unique_domain_count, total_citation_count, brand_share_of_mentions (share of brand-name text mentions, 0-1), brand_share_of_citations (share of cited source links pointing to the account's domain, 0-1). Response fields (prompts): prompt, group_name, engine, cited_domain_count (unique domains citing this prompt on this engine), cited_domains, total_mentions, total_brand_mentions, brand_mentioned, brand_share_of_mentions, recommended_count, informational_count, cautionary_count, competitor_recommended_count, mentioned_competitors with mentioned_competitor_domains (positionally paired), account_brand_name, top_cited_urls - all over the requested range - plus, on daily resolution only (current health window), category, scenarios, health_status (AT_RISK / ATTENTION / STRONG). A prompt's overall citation breadth across engines is the UNION of its rows' cited_domains, not the sum of their cited_domain_count values, which would double count any domain cited on more than one engine. order_by for prompt_groups: "group_name", "unique_domain_count", "total_citation_count". order_by for prompts: "prompt", "group_name", "cited_domain_count". Note: If a prompt belongs to multiple groups, it appears as separate rows - one per (prompt, group_name, engine) combination. Use get_llm_prompts() to discover available prompts and prompt groups before querying metrics. These endpoints only support prompt-based filtering - no device, ad_type, search_term, competitor, or adwords_campaign filters.
get_llm_prompt_metrics
List AEO (organic) LLM prompts and prompt groups configured for an account. This is the discovery tool for the AEO Performance surface - call it first to see what organic prompts and prompt groups exist before querying metrics with get_llm_prompt_metrics() or get_llm_performance(). No date range or engine parameters needed. Prompts are customer-managed. This tool returns organic prompts only - for the AI Ads surface use get_llm_ad_prompts(). By default (is_all=false) this returns only **currently active** prompts; soft-deleted prompts are excluded. There is no date window - listings describe current account configuration. Pass is_all=true to also include soft-deleted prompts (those with a valid_to set). Use is_all=true to reconcile discovery output with get_llm_prompt_metrics() / get_llm_performance(), which already count prompts for the days they were alive, so a metric window may reference a prompt that the default (active-only) listing omits. report_type options: - "prompt_groups": List prompt groups with their associated locations. - "prompts": List individual prompts with their group name and locations. Default page_size is 0 (all results). LLM data is typically under 500 items. Pass a specific page_size if you need smaller pages. Response fields (prompt_groups): group_name, locations, valid_to (null while the group still has any active prompt, otherwise the latest deletion time among its prompts). Response fields (prompts): prompt, group_name, locations, valid_to (null while the prompt is active, otherwise its deletion timestamp), created_at, modified_at, modified_by (email of the last modifier). order_by for prompt_groups: "group_name" only. order_by for prompts: "prompt", "group_name". Use the returned group names and prompt texts as filter values in get_llm_performance() and get_llm_prompt_metrics().
get_llm_prompts
List all Adthena accounts you have access to. IMPORTANT: Call this tool first before using any other Adthena tool. If there are multiple accounts, you MUST present the list to the user and ask them which account to use. Do NOT proceed with queries until the user has confirmed their choice. Never query all accounts unless the user explicitly asks for it. Returns a list of accounts with account_id, domain, location_code, location_name, and parent_account_id. **Filtering:** Use `domain` and/or `location` to narrow results. Both perform case-insensitive substring matching (e.g., domain="nike" matches "nike.com" and "nike.co.uk"). When the full list is large, always filter to keep results manageable. **Location hierarchy:** Accounts with a non-null `parent_account_id` are child locations within a hierarchy. To query data across multiple locations efficiently, use the parent account and pass the desired location names via the `location` parameter - this returns all locations' data in a single call instead of making separate requests per child account. **Missing accounts:** Only accounts with API access enabled are listed here. If an expected account is not shown, it likely does not have API access enabled. The user should contact their Adthena account manager to verify and enable API access for that account. Args: domain: Filter accounts by domain (case-insensitive substring match). location: Filter accounts by location name (case-insensitive substring match).
list_accessible_accounts
Get competitor market share data showing performance in clicks, spend, and impressions. report_type options: - "detail": Per-competitor rows with share metrics. Paginated. - "groups_and_locations": Market share broken down by every search term group and location combination. - "summary": Single overview with your shares, market leader, and top N competitors. Uses top_n instead of pagination. Response fields (detail): competitor, device, ad_type, location_name, estimated_impressions, share_of_clicks, share_of_spend, share_of_impressions, average_position, relevant_search_terms, average_cpc, average_ctr. Response fields (groups_and_locations): competitor, device, ad_type, location_name, search_term_group_name, estimated_impressions, total_impressions, share_of_clicks, share_of_spend, share_of_impressions, average_position. This shape differs from detail: it adds search_term_group_name and total_impressions, and carries NO relevant_search_terms and NO cpc/ctr. Response fields (summary): device, ad_type, location_name, total_competitors, total_estimated_impressions, your_share_of_clicks, your_share_of_spend, your_share_of_impressions, your_average_position, your_relevant_search_terms, your_average_cpc, your_average_ctr, avg_share_of_clicks, median_share_of_clicks, market_leader, market_leader_share_of_clicks, and a nested top_competitors[] list whose entries carry competitor, share_of_clicks, share_of_spend, share_of_impressions, average_position, estimated_impressions, relevant_search_terms, average_cpc, average_ctr. Efficiency metrics: this tool always requests them, so `average_cpc` / `average_ctr` (and `your_average_cpc` / `your_average_ctr` on summary) come back on detail and summary. They are absent from the published OpenAPI schema by design - do not conclude from the docs that they are unavailable. They are still omitted per the usual rule when the underlying spend or click data is missing. Absolute data: accounts entitled to absolute figures additionally receive the share numerators and denominators on detail and groups_and_locations - share_of_clicks_numerator/_denominator, share_of_spend_numerator/_denominator, share_of_impressions_numerator/_denominator. These are also absent from the published schema, and absent entirely for accounts without the entitlement, so treat them as a bonus rather than something to depend on. Entitlement is a property of the account, NOT of the `filtering_options` argument. order_by options vary by report_type: - "detail": share_of_clicks, share_of_spend, estimated_impressions, share_of_impressions, average_position, competitor, relevant_search_terms - "groups_and_locations": share_of_clicks, share_of_spend, estimated_impressions, share_of_impressions, average_position, competitor - "summary": share_of_clicks, share_of_spend Use filtering_options="absolute" for absolute numbers instead of shares. When comparing two periods, use page_size=0 to get all competitors. See docs://date-rules for date and time_period handling. See docs://data-access for pagination and segment_by details.
get_market_share
Get competitor performance trends over time as time series data. Returns time series for the top N competitors (max_number_of_domains, default 10, max 1000), ranked by primary_dimension. primary_dimension options: "share_of_clicks" (default), "share_of_spend", "share_of_impressions", "average_position", "average_cpc", "frequency_share". Response: list of segments, each with competitors and time_series of {date, share_of_clicks, share_of_spend, share_of_impressions, average_position, average_cpc, frequency_share}. Absolute data: accounts entitled to absolute figures additionally receive, on every point, a _numerator and _denominator twin for each share metric (share_of_clicks, share_of_spend, share_of_impressions, frequency_share) plus estimated_impressions and overall_estimated_impressions. These are absent from the published OpenAPI schema by design, so do not conclude from the docs that they are unavailable - but they are also absent entirely for accounts without the entitlement, so check for the keys rather than depending on them. Entitlement is a property of the account, NOT of the `filtering_options` argument. No pagination - returns all data points, ordered by date ascending. See docs://date-rules for date and time_period handling. See docs://data-access for segment_by details.
get_market_trends
Get SERP Tracker rule matches - ads on the search results page that triggered a configured rule. These are *rule matches*, **not legal infringements**. Many legitimate competitor behaviours (e.g. permitted brand-bidding on your terms) trip rules. When summarising to a user, say "rule matches" or "SERP Tracker matches" - never "infringements". SERP Tracker is the in-platform name for what was formerly called the "Infringement Tracker". Adthena scans the SERP every hour for ads that match rules configured for your account (brand misuse, unauthorized resellers, etc.). For trademark-specific detections that feed Google's Auto-Takedown system, use `get_auto_takedown` instead. For the enforcement *outcomes* of trademark takedowns (successful / unsuccessful / pending), use `get_trademark_takedowns`. report_type options: - "matches" (default): Detailed match records. Requires start_date/end_date. Paginated. - "summary": Aggregated stats including total_matches, unique_competitors, top-N competitors by match_count. Requires start_date/end_date. - "rules": SERP Tracker rule configurations for the account. No dates needed. Paginated. Response fields (matches): name (rule name), id, date_time, device, location_name, competitor, search_term, title, description1, description2, click_url, destination_url, display_url, position, evidence_link. `evidence_link` is an opaque, server-generated URL to Adthena's stored capture of the SERP for that match. It has no derivable structure and is only valid exactly as returned - it cannot be reconstructed from the competitor, search term, date, or any other field. The same applies to `click_url`, `destination_url`, and `display_url`, which are captured from the live ad. Surface these links verbatim; a record may omit `evidence_link`, in which case no evidence capture exists for it. Response fields (summary): total_matches, unique_competitors, unique_search_terms, desktop_count, mobile_count, top_competitors (each with competitor + match_count). Response fields (rules): id, name, device, enabled, location_name, email_count. order_by for matches: "name", "search_term", "date_time" (default). order_by for rules: "name". See docs://date-rules for date handling.
get_serp_tracker
Get search term analysis data. report_type options: - "detail": Per-search-term performance data. Paginated. - "detail_summary": Pre-aggregated overview stats. Uses top_n. - "opportunities": Terms competitors bid on but you don't. Paginated. Limited to last 30 days, forces daily time period. Does not support ad_type, segment_by, is_whole_market, or time_period. - "opportunities_summary": Pre-aggregated opportunities stats. Same constraints as opportunities. Uses top_n. Response fields (detail): search_term, device, ad_type, location_name, competitors, top_competitor, estimated_impressions, estimated_clicks, average_position, min_cpc, max_cpc, is_priority, is_ignored. Response fields (opportunities): search_term, device, location_name, competitors, top_competitor, estimated_clicks, total_clicks, average_position, min_cpc, max_cpc, is_priority, is_ignored, is_rejected. There is no ad_type field on this report_type, and no estimated_impressions. order_by options for detail: "search_term", "estimated_impressions", "estimated_clicks", "competitors", "average_position", "top_competitor". order_by options for opportunities: "search_term", "estimated_clicks". See docs://date-rules for date and time_period handling. See docs://data-access for pagination and segment_by details.
get_search_terms
Get Google's trademark auto-takedown enforcement outcomes. Different from get_auto_takedown (the trademark detections) - this shows Google's enforcement outcomes on reported cases. report_type options: - "detail": Individual takedown records. Paginated. - "summary": Aggregated counts and success_rate with top domains. Uses top_n. Response fields (detail): case_id, domain_name, status (successful/unsuccessful/pending), reason, timestamp, company_name, geo_location_code, trademark_details. Response fields (summary): successful_count, unsuccessful_count, pending_count, total_count, success_rate, top_domains. success_rate = successful_count / (successful_count + unsuccessful_count). Pending cases are excluded from the denominator. Null when there are no resolved (non-pending) cases. See docs://date-rules for date handling.
get_trademark_takedowns
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Adthena alternatives on ChatGPT?
As of 2026-09-28, Adthena competes with Clozd, Crayon, G2 MCP, IntelCue, Particl Market Research, Similarweb, Trendata Market Intelligence, Trooth Network in ChatGPT Competitive & Market Intelligence, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.