Skip to main content
Every tool is a read. None of them write, and all of them are scoped to the account the API key belongs to.

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.
Each tool below names the REST endpoint it mirrors. Those endpoints live under the Customer API tab and return byte-identical JSON.

Account-level tools

list_brands

Which brands does this account track, and what are their slugs? No parameters. Returns brands — 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. Returns themes — 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. Returns engines, 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.
citation_rate is a 0..1 fraction. The app derives the headline percentage from the counts instead — brand_mentions / total_responses × 100 — so do the same if you want a number that matches the dashboard. Visibility score explains why.
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 on api.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.
  • Use cases — questions that map onto these tools
  • Setup — client configuration and troubleshooting
  • Metrics overview — what each returned field means