PendiumDocs

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 url will create a new agent for the domain if one doesn't already exist; scanning by syntheticId re-scans an existing agent.
  • After a scan, turn results into work with get_recommendations, and deep-dive a cited source with analyze_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

  1. scan_visibility — trigger the scan. Returns immediately.
  2. get_scan_status — poll every 30–60s until scanAvailable: true.
  3. get_report — pull the full report (raw responses, query-level analysis, topics) for deep analysis.
  4. get_cited_sources — list the URLs AI platforms cite for this brand.
  5. get_scan_history — track score trends across scans to measure content impact.

Tools

scan_visibility

Trigger an AI visibility scan for a brand across the platforms on your plan: ChatGPT, Claude, Gemini, and AI Overviews on Starter, plus Perplexity on Pro. 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.

Type: Write — non-destructive.

ParameterTypeRequiredDefaultDescription
urlstringOne of url or syntheticId—Website URL to scan. Creates a new agent if one doesn't exist for this domain.
syntheticIdintegerOne of url or syntheticId—ID of an existing agent to re-scan.
mode"batch" | "full"No"batch"Both batch and full scan every platform on your plan with fast, cost-effective models. (Premium-model runs are an advanced opt-in, not selected by full on its own.)
maxQueriesinteger (1–200)Nothe plan's full capLeave it out to scan the brand's full question set, the same as the dashboard and weekly scans, so results stay comparable over time. Set it only for a deliberately smaller sample. Capped at the brand owner's plan: 50 on Starter, 160 on Pro, 200 with an enterprise plan.
platformsstring[]No—Additional platforms to scan alongside your plan's defaults. Options: Perplexity, Grok, DeepSeek, Qwen, MiniMax, Nemotron, Llama. Perplexity is already on for Pro; the rest require the enterprise plan.

Platforms by plan: Starter scans ChatGPT, Claude, Gemini, and AI Overviews; Pro adds Perplexity; enterprise plans can broaden coverage via platforms. The response's platforms array lists what the scan runs on. Platforms and the query cap follow the plan of the account that owns the brand. A requested platform your plan doesn't include is skipped (the scan still runs on your plan's platforms), and the response includes a droppedEnterprisePlatforms array plus an enterpriseNotice naming the plan each one needs.

Behavior notes:

  • Scanning an existing syntheticId verifies ownership, checks credit balance, and — if a scan is already running — returns current progress (scanAlreadyRunning: true with a progress object) instead of starting a new one.
  • Scanning a url extracts the domain, re-scans the matching agent if one exists, otherwise creates a new brand agent (website scraping, knowledge base creation, and the scan).
  • scan_visibility never creates a public Brand Index page. If the brand already has one, it shows the newest scan.
  • Errors when the existing agent's owner is on the free plan, even if your own plan is paid: the scan bills the owner, so the owner needs to upgrade to Pro first.
  • Errors on insufficient credits (creditBalance, upgradeUrl). A free account needs the scan's full 50,000 credits before it starts; paid plans need a positive balance. Also returns a short maintenance message when new scans are paused for a platform upgrade (existing scans, get_scan_status, and get_report are 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

Type: Read-only.

ParameterTypeRequiredDescription
syntheticIdintegerYesThe agent ID to check scan status for.

Key response fields:

FieldDescription
scanAvailabletrue when the scan has finished and the score summary is present.
scanFailedtrue 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.
overallScore0–100 visibility score across all platforms.
visibilityLevel"Not Visible", "Low", "Moderate", "Good", or "Strong".
platformScoresPer-platform breakdown (ChatGPT, Claude, Gemini, AI Overviews). A platform the scan didn't query comes back with queried: false and a null score/mention rate, never a real 0 — only read a platform as "scores 0" when queried is true.
personaScoresScores broken down by buyer persona.
topCompetitorsBrands that appear in the same AI responses.
recommendationsActionable suggestions from the scan analysis.
reportUrlShareable link to the visual report.
brandIndexUrlLink to the brand's public Brand Index page, or null if it has none.

The response no longer includes claimUrl; claim links were retired in October 2026.

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

Type: Read-only.

ParameterTypeRequiredDescription
syntheticIdintegerYesThe 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

Type: Read-only.

ParameterTypeRequiredDefaultDescription
syntheticIdintegerYes—The agent ID to get scan history for.
limitinteger (1–50)No10Number 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. As with get_scan_status, a platformScores entry with queried: false means that scan didn't test that platform — its score is null, not a real 0.

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

Type: Read-only.

ParameterTypeRequiredDefaultDescription
syntheticIdintegerYes—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.
mentionsBrandbooleanNo—Filter to sources that mention the brand (true) or don't (false).
domainstringNo—Filter to a specific domain, e.g. forbes.com.
limitinteger (1–200)No50Number of sources to return.
offsetintegerNo0Pagination 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.

Key response fields:

FieldDescription
sources[].isBrandPropertytrue for any URL the brand owns: its website, its Pendium site, and its own profiles on shared platforms.
sources[].pendiumContentMarks pages Pendium published for the brand. "pendium_hosted": served by the brand's Pendium site, at its custom domain, its subpath on the brand's own domain, or pendium.ai/{username}. "pendium_on_your_site": a Pendium post copied to the brand's own WordPress or Webflow. null for every other source. Use it to tell citations of Pendium's pages apart from the brand's existing site.
pendiumSiteAddressesThe addresses the brand's Pendium site serves from, most current first. Empty when the brand has no Pendium site.

Behavior notes:

  • A page and its variants count as one source for pendiumContent: query strings (such as ?view=human), fragments, www. and trailing slashes don't change the label.
  • If the brand's site settings can't be loaded, sources come back with pendiumContent: null instead of the call failing.

On this page