Skip to main content
These endpoints cover everything around the score: which apps you have set up, whether the latest scan worked, where you are missing from AI answers, which websites the assistants cite, and fixes you can ship to close the gaps. In the dashboard this lives under AI Visibility: the gaps list, the cited sources, the fix cards and the scan history.
All endpoints accept an API key or a signed-in session and bill the AI Visibility credit pool, not your general API credits. Reads cost 1 credit. Editing or dismissing a fix is free. Generating fixes costs 5 credits; shipping a fix is charged like a scan. See Pricing.

API

Every endpoint except /apps and /storefronts takes an optional country query parameter (default us). Data is kept per country, so pass the storefront you set the app up in.

Your apps

GET /v1/ai-visibility/apps lists the apps that have been bootstrapped or scanned, most recently active first. By default it lists the us storefront; pass ?country=all to list every country, which is how you find an app that was set up outside the US.

Setup and scan status

GET /v1/ai-visibility/:appId/status?country=us answers “is this app set up, and did the last scan work?”
  • latestRun is null before the first scan.
  • modelHealth shows whether each assistant is answering normally right now. Models that are down are skipped on manual scans, so you are not charged for them.

Storefronts

GET /v1/ai-visibility/:appId/storefronts helps you pick a country and language before you bootstrap.

Scan runs

GET /v1/ai-visibility/:appId/runs?country=us&limit=30 lists recent runs, newest first. limit is 1–100 (default 30). GET /v1/ai-visibility/:appId/runs/:runId returns the run plus one row per answer: answerId, promptText, intentLabel, modelSlug, status, a short excerpt, mentionsCount and ownerMentioned. Open the full answer with GET /answers/:answerId.

Opportunities

GET /v1/ai-visibility/:appId/opportunities?country=us&days=30 is the “where AI doesn’t recommend you” view. days is 1–90 (default 30). Each active intent gets a status from its latest scores across all models: Intents are sorted with the biggest gaps first.
winners are the apps recommended for that intent instead of yours, with the share of answers they appear in. sources lists the websites the assistants cite across the whole app; most citations come from models that search the web, such as Perplexity.

Sources for one intent

GET /v1/ai-visibility/:appId/intents/:intentId/sources?country=us&days=30 returns the same sources list, limited to one intent’s answers: each cited domain with its most-cited URL, how many answers cited it, which models, the apps it backed, and citesOwner (true when the domain is your own website). Use it to find the pages worth getting listed on.

Fixes

A fix is a concrete action for one intent, grounded in your scan data: A fix moves through these statuses:
  1. Generate. POST /v1/ai-visibility/:appId/intents/:intentId/fixes/generate?country=us proposes 2–4 fixes. It needs at least one scan of the intent; otherwise it returns 422 NO_FIXES. Costs 5 credits.
  2. Ship. After you make the change, call POST /v1/ai-visibility/:appId/fixes/:fixId/ship. Appeeky saves the intent’s current numbers as the baseline. Optional body: { "targetUrl": "https://example.com/sleep" }. Charged like a scan of your enabled models.
  3. Measure. The next completed scan after shipping is compared with the baseline. If visibility rose by more than one point the fix becomes verified, otherwise no_change. The result field holds the after numbers either way.
To drop a fix, call PATCH /v1/ai-visibility/:appId/fixes/:fixId with { "status": "dismissed" }. Send { "targetUrl": "…" } instead to only change the URL. GET /v1/ai-visibility/:appId/fixes?country=us lists fixes, newest first. Filter with intentId; dismissed fixes are hidden unless you pass includeDismissed=true.

Errors


MCP

Example prompt: “Which AI Visibility intents is my app 1234567890 missing from, and what should I fix first?”

See also