SOV Tracker API
Pull your SOV data into your own dashboards, automation flows, or BI tools. REST endpoints + outgoing webhooks. Pro plan and above.
- GET/api/v1/sov
- GET/api/v1/scans
- POST/api/v1/scans
- GET/api/v1/archive
- MCP/api/mcp
Authentication
All API requests require a Bearer token in the Authorization header. Get your key from /dashboard/settings β API EriΕimi.
Authorization: Bearer avt_live_xxxxxxxxxxxxxxxxxxxxxxxxGET /api/v1/sov
Returns the current SOV score across all platforms based on the most recent completed scan.
Request
curl -H "Authorization: Bearer $SOVTRACKER_KEY" \
https://sovtracker.com/api/v1/sovResponse (200 OK)
{
"scan_id": "scan_abc123",
"completed_at": "2026-05-06T12:34:56Z",
"avg_sov": 42,
"platform_breakdown": {
"chatgpt": 60,
"claude": 35,
"gemini": 50,
"perplexity": 25,
"ai_overviews": 40
}
}GET /api/v1/scans
List recent scans (most recent first). Use limit query param (max 50, default 10).
curl -H "Authorization: Bearer $SOVTRACKER_KEY" \
"https://sovtracker.com/api/v1/scans?limit=20"Response
{
"scans": [
{
"id": "scan_abc123",
"status": "completed",
"scan_type": "manual",
"started_at": "2026-05-06T12:30:00Z",
"completed_at": "2026-05-06T12:34:56Z"
}
]
}POST /api/v1/scans
Trigger a new scan. Counts against your monthly scan quota. Body is optional.
curl -X POST \
-H "Authorization: Bearer $SOVTRACKER_KEY" \
-H "Content-Type: application/json" \
https://sovtracker.com/api/v1/scansResponse (202 Accepted)
{
"scan_id": "scan_xyz789",
"status": "running",
"estimated_seconds": 60
}GET /api/v1/archive
Time Machine: the dated raw AI answer archive. Every scan result is archived with its full raw response β "what did ChatGPT answer for this prompt on July 17, 2026?". This history cannot be backfilled later; it only exists because it was recorded on that day.
Query parameters
keyword_idβ filter by keyword (UUID)platformβchatgpt | claude | gemini | perplexity | ai_overviewsfrom,toβ ISO 8601 date rangelimitβ 1-100, default 50cursorβ pagination: pass meta.next_cursor from the previous response
curl -H "Authorization: Bearer $SOVTRACKER_KEY" \
"https://sovtracker.com/api/v1/archive?platform=chatgpt&from=2026-06-01&limit=25"Response (200 OK)
{
"data": [
{
"id": "9f1c...",
"scan_id": "scan_abc123",
"platform": "chatgpt",
"keyword_id": "kw_123",
"prompt_used": "best crm tools for smb",
"raw_response": "The most recommended CRM tools are...",
"brand_mentioned": true,
"mention_count": 2,
"mention_position": 3,
"sentiment": "positive",
"sov_score": 42.5,
"created_at": "2026-07-17T09:12:00Z"
}
],
"meta": {
"count": 1,
"next_cursor": "MjAyNi0wNy0xN1...",
"plan_window_applied": false,
"window_start": "2026-06-01T00:00:00.000Z"
}
}History depth is plan-enforced server-side, but this only matters in the dashboard: Free (limited to the last 7 days there) and Starter can't call the API at all β API access requires Pro or above, and every plan from Pro up gets the full archive. So in an actual API response, meta.plan_window_applied is effectively always false.
MCP Server (Model Context Protocol)
Connect an AI assistant that supports Streamable HTTP and Authorization headers to your SOV data. The server speaks Streamable HTTP and authenticates with the same API key as the REST API (Pro plan and above). All tools are read-only and scoped to the organization that owns the key.
https://sovtracker.com/api/mcpGet your API key from /dashboard/settings β API Access β the MCP client sends it as an Authorization header on every request.
Available tools
get_visibility_summaryβ latest scan: overall SOV, per-platform score/mentioned, trend vs previous scanlist_keywordsβ tracked keywords with current statusget_scan_resultsβ per-result rows for a scan, filterable by platform/keywordget_answer_archiveβ Time Machine: dated raw AI answers (plan history depth applies)get_business_cardβ entity card status: trust score, field-group freshness, attestation dateget_ai_trafficβ AI referrer signals and AI-tag-only visits, reported separately
No write or scan-trigger tools are exposed β your assistant can read the records available to its organization, scope and plan without spending scan quota.
Claude Code
Add to .mcp.json for Claude Code:
{
"mcpServers": {
"sov-tracker": {
"type": "http",
"url": "https://sovtracker.com/api/mcp",
"headers": {
"Authorization": "Bearer avt_live_xxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
}Cursor supports a remote URL and Authorization header in .cursor/mcp.json. Claude.ai requires an organization administrator with request-header authentication beta access; enter the endpoint and Authorization: Bearer key together. ChatGPT direct connection with this Bearer key is not yet validated.
Generic Streamable HTTP client
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const transport = new StreamableHTTPClientTransport(
new URL("https://sovtracker.com/api/mcp"),
{
requestInit: {
headers: { Authorization: "Bearer avt_live_xxx" },
},
}
);
const client = new Client({ name: "my-agent", version: "1.0.0" });
await client.connect(transport);
const tools = await client.listTools();
const summary = await client.callTool({
name: "get_visibility_summary",
arguments: {},
});Rate limit: 60 requests/min per key. 401 = missing/invalid key or plan below Pro; 429 = rate limited.
Outbound Webhooks
Receive HTTP POST notifications when events fire. Configure URLs and events at /dashboard/settings β Outbound Webhooks.
Available events
scan.completedβ fires when a scan finishessov.droppedβ SOV crossed alert threshold downwardmention.detectedβ new brand mention foundcompetitor.overtakeβ a competitor pulled ahead
Precondition: the last three events are evaluated by the alert engine, so each one fires only while its matching rule is enabled under Settings β Alerts (sov.dropped β SOV Drop, mention.detected β New Mention, competitor.overtake β Competitor Overtake). They are delivered at the same moment as the corresponding alert e-mail. scan.completed has no such precondition.
Payload
{
"event": "scan.completed",
"organization_id": "org_abc",
"timestamp": "2026-05-06T12:34:56Z",
"data": {
"scan_id": "scan_xyz",
"avg_sov": 42,
"results_count": 50,
"mentioned_count": 21
}
}Signature verification
Each request includes an X-Sovtracker-Signature header (HMAC-SHA256 hex of the raw body, signed with your webhook secret).
import crypto from 'crypto';
function verify(rawBody, headerSig, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(headerSig)
);
}Errors
401β Missing or invalid API key403β Plan does not include API access (upgrade to Pro+)429β Monthly scan quota exhausted500β Server error β retry with exponential backoff