Pendium MCP Docs

Get an AI Visibility Report

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

GET /api/visibility/ai-visibility-report?uuid={uuid}
GET /api/visibility/ai-visibility-report?slug={slug}

Authentication: Required

Read the structured AI Visibility Report by uuid (returned from Trigger an AI Visibility Report) or by public slug. Returns the full row contents — 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.

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

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 slugPublic brand slug (e.g. acme). Only resolves public, completed reports.

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

Example

curl "https://pendium.ai/api/visibility/ai-visibility-report?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": "acme",
  "isPublic": true,
  "reportUrl": "https://pendium.ai/ai-visibility-report/acme",
  "previewUrl": "https://pendium.ai/ai-visibility-report/preview/775ba0fc-...",
  "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..." ]
}

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

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 AI Visibility Report found for uuid=00000000-0000-0000-0000-000000000000"
}

Worked example for outreach

# 1. Trigger
curl -X POST https://pendium.ai/api/visibility/ai-visibility-report \
  -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/ai-visibility-report?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