Run a visibility scan
Trigger an AI visibility scan for a brand, poll for results, and read the full report and cited sources.
Measure how ChatGPT, Claude, Gemini, and AI Overviews perceive and recommend a brand. Trigger a scan, poll until it finishes, then read the score summary, the full report, historical trends, and the sources AI platforms cite.
When to use
- Reach for this when you want a fresh, authoritative visibility measurement for an agent you own (a Starter or Pro plan is required — the scan is a write plus LLM/SerpAPI spend).
- Scanning by
urlwill create a new agent for the domain if one doesn't already exist; scanning bysyntheticIdre-scans an existing agent. - After a scan, turn results into work with
get_recommendations, and deep-dive a cited source withanalyze_url. - For a fast, public, shareable report without managing an agent, use the brand preview instead. For any brand's public score with no API key, use the brand score lookup.
Typical sequence
scan_visibility— trigger the scan. Returns immediately.get_scan_status— poll every 30–60s untilscanAvailable: true.get_report— pull the full report (raw responses, query-level analysis, topics) for deep analysis.get_cited_sources— list the URLs AI platforms cite for this brand.get_scan_history— track score trends across scans to measure content impact.
Tools
scan_visibility
Trigger an AI visibility scan for a brand across ChatGPT, Claude, Gemini, and AI Overviews. Provide either a website url (creates a new agent if needed) or a syntheticId (for an existing agent). Returns immediately — poll with get_scan_status.
Authentication: Paid (Starter or Pro). An account in read-only mode can't run a scan (it's a write plus LLM/SerpAPI spend) — the tool errors with a read-only message.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
url | string | One of url or syntheticId | — | Website URL to scan. Creates a new agent if one doesn't exist for this domain. |
syntheticId | integer | One of url or syntheticId | — | ID of an existing agent to re-scan. |
mode | "batch" | "full" | No | "batch" | Both batch and full scan all 4 AI platforms with fast, cost-effective models. (Premium-model runs are an advanced opt-in, not selected by full on its own.) |
maxQueries | integer (1–100) | No | 30 | Total queries to run across all platforms. 20–40 recommended. Higher values give more coverage but cost more credits. |
platforms | string[] | No | — | Additional enterprise-only platforms to scan alongside the standard four. Options: Perplexity, Grok, DeepSeek, Qwen, MiniMax, Nemotron, Llama. Requires the enterprise plan. |
Enterprise platforms: every scan covers the four standard platforms. Enterprise plans can broaden coverage via platforms. On non-enterprise accounts the requested enterprise platforms are skipped (the scan still runs on the standard four) and the response includes a droppedEnterprisePlatforms array plus an enterpriseNotice.
Behavior notes:
- Scanning an existing
syntheticIdverifies ownership, checks credit balance, and — if a scan is already running — returns current progress (scanAlreadyRunning: truewith aprogressobject) instead of starting a new one. - Scanning a
urlextracts the domain, re-scans the matching agent if one exists, otherwise creates a new brand agent (website scraping, knowledge base creation, and the scan). - Errors on insufficient credits (
creditBalance,upgradeUrl) and returns a short maintenance message when new scans are paused for a platform upgrade (existing scans,get_scan_status, andget_reportare unaffected).
get_scan_status
Poll the status of a visibility scan. Returns the full score summary when complete, or progress while running. Call every 30–60s after triggering.
Authentication: Required
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID to check scan status for. |
Key response fields:
| Field | Description |
|---|---|
scanAvailable | true when the scan has finished and the score summary is present. |
scanFailed | true when this run reached no AI engine (a transient failure) — the scores are that run's real 0, not a previous good scan. Always reflects the most recent attempt; re-run if you see it. |
overallScore | 0–100 visibility score across all platforms. |
visibilityLevel | "Not Visible", "Low", "Moderate", "Good", or "Strong". |
platformScores | Per-platform breakdown (ChatGPT, Claude, Gemini, AI Overviews). |
personaScores | Scores broken down by buyer persona. |
topCompetitors | Brands that appear in the same AI responses. |
recommendations | Actionable suggestions from the scan analysis. |
reportUrl | Shareable link to the visual report. |
brandIndexUrl | Link to the brand's public Brand Index page. |
While running, returns scanAvailable: false with scanInProgress: true and a progress object (completedQueries / totalQueries). Before any data exists it returns scanAvailable: false, scanInProgress: false with a "keep polling" message.
get_report
Get the full visibility report — the most detailed view available. Includes raw LLM responses, individual query analysis, cited sources, competitor data, topics, account info, and recommendations. Use after a scan completes for deep analysis.
Authentication: Required
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID to get the full report for. |
scanFailed behaves as in get_scan_status — true means the run reached no AI engine and the report is that run's real 0-score result, always reflecting the most recent attempt; re-run if you see it.
Compared to get_scan_status: get_report additionally returns query-level data (queryAnalysis), raw LLM responses (rawResponses), cited sources (citedSources), account info (balance, plan), and topics. Use get_scan_status for polling and quick checks; use get_report when you need per-query results, which sources AI platforms cited, or specific gaps to build content against.
get_scan_history
Get historical visibility scan scores to track trends over time and measure the impact of content you've created.
Authentication: Required
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
syntheticId | integer | Yes | — | The agent ID to get scan history for. |
limit | integer (1–50) | No | 10 | Number of historical scans to return. |
Key fields: latestScore (most recent overall 0–100), scoreChange (difference between the two most recent scans, positive = improving), scoreTrend ("improving", "declining", or "stable"), and history (scan summaries, newest-first). Each history entry includes platformScores, personaScores, topCompetitors, citedSources, and queryAnalysis for detailed trend analysis.
get_cited_sources
Get the full list of URLs that AI platforms cite when discussing this brand, aggregated across all scans. Each source includes which platforms cite it, how often, an influence score, and which queries reference it. To produce a deep brief on a source, pass its URL to analyze_url.
Authentication: Required
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
syntheticId | integer | Yes | — | The agent ID to get sources for. |
citationType | "cited" | "research" | "both" | No | — | cited: directly cited in responses. research: used as research/context. both: appears in both roles. |
mentionsBrand | boolean | No | — | Filter to sources that mention the brand (true) or don't (false). |
domain | string | No | — | Filter to a specific domain, e.g. forbes.com. |
limit | integer (1–200) | No | 50 | Number of sources to return. |
offset | integer | No | 0 | Pagination offset. |
Returns a summary (total sources, opportunity count, how many mention you, how many are your own website) and a sources array with per-source platform, frequency, influence, and related-query data.