BotSeen API
The BotSeen API gives you read-only access to your AEO data — projects, AI visibility scores, and the latest answers from ChatGPT, Perplexity, Gemini, Google AI, and Claude. Use it to pull visibility into your own dashboards, BI tools, spreadsheets, or automations (Zapier, Make, n8n).
Base URL
https://www.botseen.com/api/v1- • All responses are JSON, wrapped in a
datafield. - • All REST endpoints are GET — the REST API never modifies your data.
- • Reading the API costs no credits.
- • Want your AI assistant to use BotSeen directly? See the MCP server — same key, works in Claude and Cursor.
Get an API key
- 1. Go to Settings → Developer API in your workspace.
- 2. Click New API key, give it a name (e.g. Zapier or Internal dashboard), and hit Create.
- 3. Copy the key immediately — it starts with
bs_live_and is shown only once. We store a hash, not the key itself.
Authentication
Pass your key in the Authorization header as a Bearer token on every request:
curl https://www.botseen.com/api/v1/projects \ -H "Authorization: Bearer bs_live_your_key_here"
A missing or invalid key returns 401 with { "error": "Invalid or missing API key" }.
MCP — use BotSeen from Claude & Cursor
BotSeen ships a remote MCP server (Model Context Protocol), so AI assistants can read your visibility data and act on it in plain English — “how visible is my brand in AI answers?”, “which sources should I get cited on?”, “run a scan”. Claude.ai and Claude Desktop connect over OAuth (sign in, approve a workspace — no key to paste). Claude Code and Cursor use your bs_live_ API key as a header.
MCP server URL
https://www.botseen.com/api/mcpStreamable HTTP transport · header auth: Authorization: Bearer bs_live_…
Claude Code (CLI)
claude mcp add --transport http botseen https://www.botseen.com/api/mcp \ --header "Authorization: Bearer bs_live_your_key_here"
Claude.ai & Claude Desktop
Go to Settings → Connectors → Add custom connector and paste https://www.botseen.com/api/mcp. Claude signs you in through BotSeen (Google) and asks you to approve the connection — no API key or header to paste. You approve which workspace it can access, and can revoke it anytime in Settings.
Cursor
Add this to ~/.cursor/mcp.json (or the project's .cursor/mcp.json):
{
"mcpServers": {
"botseen": {
"url": "https://www.botseen.com/api/mcp",
"headers": { "Authorization": "Bearer bs_live_your_key_here" }
}
}
}Available tools — explore all 33
33 of 33 tools
list_projectsReadEvery project with its headline AI-visibility metrics.
get_project_visibilityReadShare of voice — you vs each competitor, with deltas since last scan.
get_project_setupReadA project's tracked prompts (with ids), competitors, and engines.
get_scan_resultsReadLatest answer per prompt × engine, with citations and wrong claims.
list_hallucinationsReadFalse claims AI engines made about your brands.
get_citation_mapReadDomains AI cites — where to get mentioned to improve visibility.
get_credit_balanceReadPlan, credit balance, and monthly allowance.
estimate_scan_costReadCredits a scan would cost before you run it.
get_scan_statusReadLive progress of a running scan.
list_schedulesReadAll automated scan schedules.
list_experimentsReadTracked experiment baselines.
get_diagnosisReadRead a completed Answer DNA diagnosis.
get_llms_txtReadRead the latest generated llms.txt.
create_projectProjectsCreate a project with prompts, competitors, and engines.
delete_projectProjectsPermanently delete a project and its data.
generate_buyer_promptsProjectsDraft buyer-intent questions for a site.
add_promptPromptsAdd a tracked buyer prompt.
update_promptPromptsEdit a tracked prompt.
delete_promptPromptsRemove a tracked prompt.
add_competitorCompetitorsAdd a competitor to track against.
delete_competitorCompetitorsRemove a competitor.
set_project_enginesEnginesChoose which AI engines a project scans.
create_scheduleSchedulesCreate a recurring automated scan (paid plans).
update_scheduleSchedulesChange a schedule's cadence, time, or engines.
set_schedule_enabledSchedulesTurn a schedule on or off.
delete_scheduleSchedulesDelete a schedule.
run_scanScansStart a full AI-visibility scan.
cancel_scanScansCancel an in-flight scan; refunds undelivered credits.
run_diagnosisAnswer DNADiagnose exactly why you're losing a prompt, with a fix plan.
run_simulationSimulatorPreview whether a content fix would win the citation.
track_experimentExperimentsSnapshot a prompt's visibility as a baseline.
delete_experimentExperimentsDelete a tracked experiment.
generate_llms_txtllms.txtCrawl the site and write its llms.txt.
List projects
/api/v1/projectsEvery project in the workspace with its headline metrics: current AI visibility (0–100, or null if never scanned), prompt and engine counts, hallucination count, and when it was last scanned.
curl https://www.botseen.com/api/v1/projects \ -H "Authorization: Bearer bs_live_…"
Response · 200
{
"data": [
{
"id": "3f6a1c2e-…",
"name": "Acme",
"brand_url": "https://acme.com",
"category": "Project management software",
"visibility": 62,
"prompt_count": 20,
"engine_count": 5,
"hallucinations": 1,
"last_scanned_at": "2026-07-08T09:00:12.000Z"
}
]
}Get a project
/api/v1/projects/:idOne project in full: its setup (engines, competitors, tracked buyer prompts) plus the latest scan summary.
| Parameter | In | Description |
|---|---|---|
| id | path | The project id (a UUID, from List projects). |
curl https://www.botseen.com/api/v1/projects/3f6a1c2e-… \ -H "Authorization: Bearer bs_live_…"
Response · 200
{
"data": {
"id": "3f6a1c2e-…",
"name": "Acme",
"brand_url": "https://acme.com",
"category": "Project management software",
"icp": "startup founders",
"engines": ["chatgpt", "perplexity", "gemini", "google_ai", "claude"],
"competitors": [
{ "name": "Jira", "url": "https://atlassian.com/jira" }
],
"prompts": [
{
"id": "9b2d4e88-…",
"text": "best project management tool for startups",
"intent": "buying",
"topic": "Project Management"
}
],
"latest_scan": {
"visibility": 62,
"hallucinations": 1,
"scanned_at": "2026-07-08T09:00:12.000Z"
}
}
}Get answer results
/api/v1/projects/:id/resultsThe freshest answer for every prompt × engine pair: whether your brand was mentioned (and at what position), which competitors the engine named, the sources it cited, any wrong claims it made, and the full raw answer text.
| Parameter | In | Description |
|---|---|---|
| id | path | The project id. |
curl https://www.botseen.com/api/v1/projects/3f6a1c2e-…/results \ -H "Authorization: Bearer bs_live_…"
Response · 200
{
"data": [
{
"prompt_id": "9b2d4e88-…",
"engine": "perplexity",
"brand_mentioned": true,
"position": 2,
"competitors": ["Jira", "ClickUp"],
"citations": [
{ "url": "https://reddit.com/r/startups/…", "title": "What PM tool…" }
],
"wrong_claims": [],
"answer": "For startups, the top picks are…",
"model": "sonar-pro"
}
]
}Engine values: chatgpt, perplexity, gemini, google_ai, claude. position is your brand's rank in the answer (1 = first mention), or null.
Errors
| Status | Body | Meaning |
|---|---|---|
| 401 | { "error": "Invalid or missing API key" } | No Bearer header, malformed key, or the key was revoked. |
| 404 | { "error": "Project not found" } | The project id doesn't exist or belongs to another workspace. |
Please keep polling reasonable — a few requests per minute is plenty; scan data changes at most once per scheduled run.
Code examples
JavaScript / Node
const res = await fetch("https://www.botseen.com/api/v1/projects", {
headers: { Authorization: `Bearer ${process.env.BOTSEEN_API_KEY}` }
});
const { data } = await res.json();
for (const project of data) {
console.log(`${project.name}: ${project.visibility ?? "not scanned"}% visible`);
}Python
import os, requests
headers = {"Authorization": f"Bearer {os.environ['BOTSEEN_API_KEY']}"}
projects = requests.get("https://www.botseen.com/api/v1/projects", headers=headers).json()["data"]
for p in projects:
results = requests.get(
f"https://www.botseen.com/api/v1/projects/{p['id']}/results", headers=headers
).json()["data"]
missing = [r for r in results if not r["brand_mentioned"]]
print(f"{p['name']}: missing from {len(missing)} of {len(results)} answers")Google Sheets (Apps Script)
function pullVisibility() {
const res = UrlFetchApp.fetch("https://www.botseen.com/api/v1/projects", {
headers: { Authorization: "Bearer " + PropertiesService
.getScriptProperties().getProperty("BOTSEEN_API_KEY") }
});
const rows = JSON.parse(res.getContentText()).data
.map(p => [p.name, p.visibility, p.hallucinations, p.last_scanned_at]);
const sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(2, 1, rows.length, 4).setValues(rows);
}Security best practices
- • Keep keys server-side. Never ship an
bs_live_key in browser code, a mobile app, or a public repo — anyone with the key can read your whole workspace. - • Use environment variables, not hardcoded strings.
- • One key per integration (Zapier, BI, internal dashboard). The Settings page shows each key's last use, so you can spot and revoke unused ones.
- • Revoke immediately if leaked — revocation is instant, then create a fresh key.
Need something the API doesn't cover?
Triggering scans and generating llms.txt are available today through the MCP server. REST write endpoints and webhooks are on the roadmap — tell us what you need, it shapes what ships next.
