PendiumDocs

Get a Visibility Scan Preview

Read the full structured Visibility Scan Preview — brand identity, both visibility scores, LLM analysis, persona archetypes, category prompts.

GET /api/visibility/scan-preview?uuid={uuid}
GET /api/visibility/scan-preview?slug={slug}

Authentication: Required — partner accounts only (same partner gate as the trigger endpoint). Partner-originated scans are always private (isPublic is false), so reportUrl is the white-labeled partner URL, never a public /brand/preview/<slug> page. Fetching a preview is read-only, so it works even for accounts in read-only mode (only triggering a scan is refused).

Read the structured Visibility Scan Preview by uuid (returned from Trigger a Visibility Scan Preview) or by slug. Returns a curated projection of the scan — brand identity, both visibility scores, the LLM analysis (summary + observations + recommendations), persona archetypes, category prompts with per-platform mention estimates, and post ideas — surfaced as expanded JSON so an outreach-email template can pluck whichever fields it needs without us having to redesign the response shape per template change. Internal and operational columns (lead-capture details, hosting/preview linkage, source flags, the partner-team binding that white-labels a partner-originated report, and the resolved local-business listing context — Yelp / Google Business Profile — used to ground the scan) are deliberately omitted; the field guide below is the complete contract.

Poll this endpoint every 5–15 seconds after triggering until status is "complete" (or "failed").

Note: the deprecation warning (and Deprecation / Warning / X-Pendium-Warning headers) for a now-ignored isPublic: true is returned by the trigger (POST) response only — this read endpoint does not repeat it.

Query parameters

ParameterTypeRequiredDescription
uuidstringOne of uuid or slugUUID returned from the trigger endpoint. Resolves any scan you own (or any public scan).
slugstringOne of uuid or slugBrand slug (e.g. acme). Resolves a public completed report, or — since this endpoint is partner-only — one of your own partner-originated reports by its historical slug. Each business gets its own slug — for directory-listing seed URLs (e.g. a Yelp business page) the slug is anchored per listing, not per domain, so two businesses on the same platform never collide.

Authorization: non-admin callers can read scans they own or any public scan. Admin keys see anything.

Example

curl "https://pendium.ai/api/visibility/scan-preview?uuid=775ba0fc-c67a-4ff2-aa0a-e1c15a638d4a" \
  -H "x-api-key: pendium_xxxxxxxxxxxx"

Response — status: complete

{
  "success": true,
  "status": "complete",
  "uuid": "775ba0fc-c67a-4ff2-aa0a-e1c15a638d4a",
  "slug": null,
  "isPublic": false,
  "reportUrl": "https://pendium.ai/partner/youragency/visibility-scan-preview/775ba0fc-...",
  "previewUrl": "https://pendium.ai/partner/youragency/visibility-scan-preview/775ba0fc-...",
  "agentSiteUrl": "https://pendium.ai/agent-site/preview/dabbc622-...",
  "seedUrl": "https://acme.com",
  "createdAt": "2026-05-03T15:00:00Z",
  "completedAt": "2026-05-03T15:01:30Z",
  "updatedAt": "2026-05-03T15:01:30Z",
  "failureMessage": null,
 
  "brand": {
    "name": "Acme Inc.",
    "summary": "...",
    "industry": "Retail",
    "industrySubcategory": "...",
    "valueProposition": "...",
    "missionStatement": "...",
    "targetAudience": "...",
    "productsOrServices": ["..."],
    "geographicFocus": "Global",
    "competitorNames": ["..."],
    "inferredGoals": ["..."]
  },
 
  "scores": {
    "overallScore": 47,
    "visibilityLevel": "moderate",
    "knowledgeScore": 32,
    "knowledgeLevel": "thin"
  },
 
  "analysis": {
    "summary": "2-3 sentence narrative...",
    "observations": ["...", "..."],
    "recommendations": [
      { "priority": "high", "action": "...", "rationale": "..." }
    ]
  },
 
  "brandDirectSentiment": { "...full direct-brand sentiment object..." },
  "metaAnalysis":         { "...full meta-analysis object..." },
  "personas":             [ "...persona archetypes..." ],
  "prompts":              [ "...category prompts with per-platform mention estimates..." ],
  "postIdeas":            [ "...content post idea stubs..." ]
}

createdAt, completedAt, and updatedAt are ISO 8601 UTC timestamps. completedAt is null until status is "complete".

Shareable URLs

FieldWhat it is
reportUrlThe canonical visibility-scan report to send a prospect. Because this endpoint is partner-only and partner scans are private, this is the white-labeled partner URL — the team's verified custom domain when set, otherwise https://pendium.ai/partner/<slug>/visibility-scan-preview/<uuid>.
previewUrlThe UUID-keyed report URL — available the moment the scan exists, before a slug resolves.
agentSiteUrlThe brand's agent site preview (/agent-site/preview/<uuid>) — a rich, ready-to-launch site built from the same scan. null unless the scan produced one (local-business / Yelp / GBP scans). Send this when you want to show the prospect their site, not the report. Plain public URL — no partner white-label wrapping.

Field guide

FieldWhat it isUse it for
brand.nameLLM-inferred brand name from the seed URLSubject lines, salutations
brand.competitorNames5–10 real competing brands in this spaceCompetitor-comparison hooks
scores.overallScore (0–100)Overall AI visibility across category queriesThe headline number for outreach
scores.visibilityLevelexcellent/good/moderate/low/invisiblePlain-English score band
scores.knowledgeScore (0–100)How well AI agents know this brand by nameDirect-brand awareness signal
scores.knowledgeLevelstrong/partial/thin/unknownPlain-English knowledge band
analysis.summary2–3 sentence narrative (the most interesting finding)Email body lede
analysis.observations3–6 specific findingsBullet points
analysis.recommendations3–5 prioritized content recommendationsThe "what to do about it" pitch
brandDirectSentiment.notableFactsThings AI agents would surface about the brandPersonalization hooks
brandDirectSentiment.riskFlagsThings AI agents might be getting wrong"Here's what's wrong" angles
metaAnalysis.scoreSlideHeadlineLLM-generated headline for this brand's scoreReusable outreach copy
personas[]Persona archetypes the brand's customers map toAudience segmentation
prompts[]Real category prompts customers ask AI, with per-platform (ChatGPT/Claude/Gemini/AIOverviews) mention estimates"We tested these prompts and you're invisible" angle
postIdeas[]LLM-generated content stubs (pitch, blog title, first sentence, hero image)Content-strategy upsell
reportUrlShareable link to the rendered report. Resolved server-side from the scan owner's account: agency-partner accounts get a white-labeled link — the team's verified custom domain (https://reports.youragency.com/visibility-scan-preview/<uuid>) when one is set, otherwise /partner/<slug>/… — rendering under the agency's branding; all other accounts get the Pendium-hosted /visibility-scan-preview/<uuid> link (or the canonical /brand/preview/<slug> once the scan is public). The caller doesn't choose this.The CTA link in your outreach

Response — status: pending or analyzing

The same shape, with brand/scores/analysis populated as the LLM streams in. failureMessage is null. Poll every 5–15 seconds.

Response — status: failed

{
  "success": true,
  "status": "failed",
  "uuid": "...",
  "failureMessage": "This URL points to a parked domain with no business content."
}

Most failures happen because the seed URL doesn't represent a real, active business (parked domain, error page, login wall). Re-trigger with a different URL.

Response — not found / forbidden

If the UUID doesn't exist, or it's a private scan owned by another user, you'll get a 404:

{
  "error": "No Visibility Scan Preview found for uuid=00000000-0000-0000-0000-000000000000"
}

Worked example for outreach

# 1. Trigger
curl -X POST https://pendium.ai/api/visibility/scan-preview \
  -H "x-api-key: pendium_xxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://acme.com"}'
# → { uuid, reportUrl: ".../preview/{uuid}" }
 
# 2. Poll until complete (5-15s intervals)
curl "https://pendium.ai/api/visibility/scan-preview?uuid=…" \
  -H "x-api-key: pendium_xxxxxxxxxxxx"
# → { status: "complete", brand.name, scores.overallScore,
#       scores.knowledgeScore, analysis.summary, reportUrl: ".../{slug}" }
 
# 3. Drop into the email template:
#       Subject: {{brand.name}} only scores {{scores.overallScore}}/100 on AI search
#       Body:    {{analysis.summary}} — see the full report at {{reportUrl}}

On this page