keletto

API

Base URL https://shortlistdai.vercel.app

Read your results and start scans from your own scripts and tools, such as Zapier, n8n or a spreadsheet. The API works for websites saved to your signed-in account.

Authentication

Create a key in Settings > API keys. It is shown once, so copy it then. Send it with every request:

Authorization: Bearer sl_your_key

A key can read every website on your account and start scans with your saved settings. Keep it private, and delete it in Settings if it leaks. New keys can take up to a minute to start working.

Endpoints

RequestReturns
GET /api/v1/sitesYour websites, with the last scan date and latest visibility
GET /api/v1/sites/{domain}Latest results: visibility, recommended, scores, each engine, competitors, wrong facts and head-to-head comparisons
GET /api/v1/sites/{domain}/historyEvery daily and scan point: visibility, recommended, each engine, competitors, alerts
GET /api/v1/sites/{domain}/planThe fix plan, with which fixes are done
GET /api/v1/sites/{domain}/labFix Lab tests: tries with and without the page per engine, where each one is (in review, live, measuring) and the measured result
POST /api/v1/scanStarts a full scan of {"url": "example.com"}

Use the domain without https:// or www., for example /api/v1/sites/example.com.

Examples

Latest results

curl https://shortlistdai.vercel.app/api/v1/sites/example.com \
  -H "Authorization: Bearer sl_your_key"
{
  "domain": "example.com",
  "name": "Example",
  "lastScan": "2026-10-29T14:02:11.000Z",
  "visibility": 34,
  "recommended": 25,
  "scores": { "seo": 71, "aeo": 58, "geo": 49, "answers": 312 },
  "byEngine": { "chatgpt": 31, "claude": 27, "gemini": 40 },
  "competitors": [{ "name": "Rival One", "answers": 140 }],
  "wrongFacts": [{ "said": "starts at $49 a month", "truth": "Plans start at $29/month", "engines": ["ChatGPT"] }],
  "headToHead": [{ "vs": "Rival One", "verdict": "them", "tally": { "you": 1, "them": 4, "depends": 1 }, "whyThem": ["..."], "whyYou": ["..."] }]
}

Visibility and recommended are percentages of AI answers. A head-to-head verdict is you, them or depends.

Visibility history (JavaScript)

const r = await fetch("https://shortlistdai.vercel.app/api/v1/sites/example.com/history", {
  headers: { Authorization: "Bearer " + process.env.SHORTLISTD_KEY },
});
const { points } = await r.json();
console.log(points.at(-1).visibility);

Start a scan

curl -N -X POST https://shortlistdai.vercel.app/api/v1/scan \
  -H "Authorization: Bearer sl_your_key" \
  -H "Content-Type: application/json" \
  -d '{"url": "example.com"}'

The scan uses the settings saved on your account and takes about 4 to 5 minutes. Progress streams back as one JSON object per line. You can disconnect at any time, because the scan finishes on the server and saves to your account. Read the results afterwards with GET /api/v1/sites/{domain}.

Errors and limits

Connector for Claude and ChatGPT

The same key also works as a connector, so Claude, ChatGPT or any app that takes remote MCP servers can read and update your tracked sites. Add this as a custom connector:

https://shortlistdai.vercel.app/api/mcp?key=sl_your_key

Apps that can send a header can use https://shortlistdai.vercel.app/api/mcp with Authorization: Bearer sl_your_key instead, which keeps the key out of the URL. Without a key the connector still works, but only for scans by code.

ToolWhat it does
list_my_sitesYour websites and their latest visibility
get_site_reportVisibility, recommended, each engine, rivals named instead, questions you lose, wrong facts, next fixes
get_historyVisibility over time, with your notes and finished fixes
get_fixesThe numbered fix plan, open or done
write_my_fixThe finished work for one fix, from your own site's facts
mark_fix_doneMarks a fix done so later scans measure it
get_cited_pagesThe outside pages AI cites, who each names, and what changed
get_outreach_pipelinePitched, replied, listed, and whether AI now cites the page
get_ai_trafficVisits, conversions and revenue from AI assistants (needs Google Analytics)
get_fix_labFix Lab tests: with and without the page, where each one is, and the live result
add_chart_notePuts a note on your progress chart

A wrong or deleted key gets a 401, so you never get the anonymous tools by mistake.