Conventions
A few things hold across the whole surface, so they’re stated once here.slug is a brand’s brand_slug, from list_brands. Call that first.
range accepts 7d, 30d, or 90d, and 365d also resolves. Anything else, including an empty value, falls back to 30 days.
region is a lowercase ISO 3166-1 alpha-2 country code — us, gb, de, in. See Managing brands for how a brand’s scan region is set.
Engine slugs are chatgpt, claude, gemini, perplexity, copilot, deepseek, grok, ai_overviews, and ai_mode. Your plan decides which of them are actually scanned, so a filter on an engine you don’t scan returns nothing.
Five tools take no brand parameter and read your newest brand:
list_citations, list_topics, get_model_channels, get_industry_metrics, and get_industry_gap. If you track more than one brand and the numbers look like the wrong company, that’s why. Use get_visibility and list_mentions, which take a slug, when you need a specific brand. The REST twins accept a brand_slug parameter to pick another brand; the MCP tools don’t expose it.Account-level tools
list_brands
Which brands does this account track, and what are their slugs? No parameters. Returnsbrands — one record per tracked brand with id, brand_slug, brand_name, domain, vertical, site_id, scan_frequency_hours, next_scan_at, and added_at — plus count and your plan’s brand limit. Newest brand first. Mirrors GET /api/public/v1/brands.
No visibility numbers here — this is the brand record only. For scores call
get_visibility with the slug, or get_model_channels for the per-engine split.get_portfolio
How is every brand in the account doing, side by side?
Returns
totals: brand count, brands with data, average visibility and its delta (both percentage points), total mentions and responses, and the sentiment split. Then top and bottom — your five best and five worst brands, ordered to match the percentages the app prints — plus per_engine averages across the portfolio. A brands array carries each brand’s latest snapshot, and regions lists the locales your brands are tracked in. Brands with no snapshot yet appear with has_data: false. Mirrors GET /api/public/v1/portfolio.
totals.avg_citation_rate and totals.avg_citation_delta are both in percentage points, and both are weighted by how much data each brand has. A brand with far more responses moves them further, so neither is a plain average across brands.list_citations
Which sources do AI engines cite when they answer questions in your space?
Returns
domains, ranked by citation count, each with rank, domain, count, share, category, the engines that cited it, latest_date, is_owned, is_competitor, and — when FixAEO has them — domain authority, top content type, sentiment counts, and a seven-day series_7d sparkline. Alongside that: total_citations, categories, bucket_counts, a time_series, the available engine and region facets, and rank, which is your own highest-placed domain and its position (0 when you’re not cited at all). Mirrors GET /api/public/v1/citations.
q matches the domain string only, not full URLs. Searching for a path or a page title returns nothing.list_topics
Which themes do your tracked prompts cluster into? No parameters. Returnsthemes — each with theme, count, and a tier of 20, 30, 50, or 70 that drives the size of the chip in the app — plus total_keywords. Scoped to your newest brand. Mirrors GET /api/public/v1/topics. Background on how clusters are built is in Topics and labels.
get_model_channels
Which engines mention you most, and which ignore you? No parameters. Returnsengines, one row per engine with engine, score, and delta, plus a fixed range of 30d. delta is the movement across that window. Mirrors GET /api/public/v1/model.
score here runs from 0 to 100. The citation_rate in get_visibility is a fraction from 0 to 1. Convert before you compare the two.get_industry_metrics
Where do you sit against competitors, and who’s gaining?
Returns
ranking: every brand mentioned in your space, with name, mentions, share as a percentage, delta in percentage points, is_own, is_pinned, and a sentiment split. Alongside it, a daily time_series carries per-competitor counts. An own block gives your total mentions, total responses, and average position. You also get tracked_competitors, last_refreshed, and a methodology block that spells out the denominator and the share formula. Mirrors GET /api/public/v1/industry/metrics. See Industry benchmarks for how to read it.
get_industry_gap
Which sites cite your competitors but never you?
Returns up to 50
gaps, each with domain, citations, competitor_chats, distinct_competitors, the competitors named, the engines involved, a gap_score, and latest_date. Your own domains are excluded, as are the websites of competitors you pinned yourself. Mirrors GET /api/public/v1/industry/gap.
Pinning a competitor puts its domain on file, which is what lets the gap list exclude it. Pin the rivals you care about and the results get sharper. See Competitors.
Brand-scoped tools
get_brand
What’s on file for one brand?
Returns a single
brand object with the same fields one list_brands row carries. It’s the brand record, not a scorecard — there are no scores in this response. Errors with “brand not found” when the slug isn’t one of yours. Mirrors GET /api/public/v1/brands/{slug}.
get_visibility
How has this brand’s visibility moved over time?
Returns
snapshots, one row per day, each with date, citation_rate, brand_mentions, total_responses, the sentiment split, per_engine rates, a ranking map, ranking_per_engine, and sentiment_per_competitor. The window is echoed back as range, from, and to. A brand with no scans yet returns an empty array, not an error. Mirrors GET /api/public/v1/brands/{slug}/snapshots.
There’s no region parameter here. The tool reads the brand’s primary active region, which is the same scope the dashboard uses.
list_mentions
Which answers actually named this brand?
Returns up to 100
mentions, newest first, each with id, engine, date, sentiment, confidence, the prompt that produced it, a snippet of the answer, and source_url when the engine cited one. Any sentiment value outside the three listed is rejected as an error rather than ignored. Mirrors GET /api/public/v1/brands/{slug}/mentions. Understanding answers covers how these are classified.
list_prompts
What is FixAEO asking on this brand’s behalf?
Returns
prompts with id, prompt_text, is_active, intent (informational, commercial, or transactional), created_at, last_snapshot_date, and — for prompts accepted from a Search Console suggestion — source and source_query. Also count for this brand, used_total across the whole account, and your plan limit. The prompt pool is shared account-wide, which is why the last two differ. Mirrors GET /api/public/v1/brands/{slug}/prompts.
There’s no per-prompt visibility figure in this response.
last_snapshot_date tells you when a prompt was last scanned; use list_mentions to see which answers named you.Integration-dependent tools
All fourteen tools appear in your client’s list onapi.fixaeo.com. These last three still need a per-brand integration to have anything to return. Without one they answer with an empty result rather than an error, which reads as “no data” instead of “not connected”.
get_search_performance
How does this brand do on Google organic search?
Returns a daily
metrics series with clicks, impressions, ctr, and position, window totals where position is impression-weighted, the top 25 top_queries and top_pages, and up to 25 countries with their click share. The window is fixed at 30 days — this tool takes no range. Needs Google Search Console connected for that brand; without it you get an empty series rather than an error. Mirrors GET /api/public/v1/brands/{slug}/search-performance.
get_seo_aeo_gap
Which Google queries do you rank for but get no AI mentions on?
Takes your top 50 organic queries by clicks over the last 30 days and classifies each one. Returns
rows with query, seo_clicks, seo_impressions, seo_position, matched_prompt_id, gap_score, and ai_state, which is one of:
Rows come back sorted by
gap_score, highest first, so the biggest opportunity is at the top. Needs Search Console connected. This one has no REST twin — it’s only on MCP and on the app’s Search performance page.
get_agent_traffic
Which AI crawlers are visiting the site, and what are they reading?
Returns a 30-day view.
totals covers hits, unique_visitors, active_bots, pages crawled, and a failure_rate. Breakdowns arrive as by_bot, by_vendor, by_kind, by_folder, by_country, and by_status, with per_engine_hits beside them. You also get top_page — the single most-crawled URL — series_by_bot trend lines, and previous for the prior equal-length window. channels splits hits between the JavaScript tag and server-log ingestion. Needs the tracking tag or a server-log connector; see Agent analytics. Mirrors GET /api/public/v1/brands/{slug}/agents.
Related pages
- Use cases — questions that map onto these tools
- Setup — client configuration and troubleshooting
- Metrics overview — what each returned field means