For developers
A read-only API + MCP server for your AI-visibility data
Pull your visibility score and per-engine mention data into your own dashboards, scripts, or an AI agent (Claude Desktop, Cursor, a custom LangChain agent) — scoped to only the brands your account tracks. Available on every paid plan, no extra add-on.
Quickstart
Three steps
- 1Mint a key on your account page — shown once, copy it immediately.
- 2Send it as Authorization: Bearer <key> on every request — REST or MCP.
- 3Call an endpoint below, or point an MCP client at `/api/mcp`.
REST API
GET /api/v1/visibility
One brand's current score + per-engine breakdown. `domain` must be a brand your account tracks with at least one completed scan.
Request
curl "https://pingmybrand.com/api/v1/visibility?domain=acme.com" \ -H "Authorization: Bearer pmb_live_xxxxxxxxxxxxxxxx"
200 response
{
"domain": "acme.com",
"visibilityScore": 62,
"updatedAt": "2026-07-14T09:02:11.000Z",
"engines": [
{
"engine": "openai",
"status": "measured",
"score": 71,
"mentionRate": 0.68,
"avgPosition": 1.4,
"citationRate": 0.32
},
{
"engine": "anthropic",
"status": "measured",
"score": 58,
"mentionRate": 0.52,
"avgPosition": 2.1,
"citationRate": 0.2
}
// … one entry per engine (openai, anthropic, google, perplexity, grok)
]
}REST API
GET /api/v1/brands
Every brand your account tracks, with each one's latest score (null — never a fabricated number — for a brand with no completed scan yet).
Request
curl "https://pingmybrand.com/api/v1/brands" \ -H "Authorization: Bearer pmb_live_xxxxxxxxxxxxxxxx"
200 response
{
"brands": [
{ "domain": "acme.com", "visibilityScore": 62, "updatedAt": "2026-07-14T09:02:11.000Z" },
{ "domain": "acme-labs.io", "visibilityScore": null, "updatedAt": null }
]
}REST API
Errors & rate limits
Every failure is a real HTTP status with an { error } body — never a fabricated 200 with placeholder data.
| Status | When |
|---|---|
| 401 | the bearer key is missing, malformed, or doesn't match any account |
| 403 | the key's account has no active paid plan (the API is a paid-tier feature) |
| 404 | the domain isn't tracked by this account, or is tracked but has never completed a scan |
| 429 | you've exceeded 120 requests/hour on this key for this endpoint (Retry-After header included) |
120 requests/hour per key, tracked separately for each endpoint — exhausting `/api/v1/visibility` doesn't affect `/api/v1/brands` or the MCP server.
MCP server
POST /api/mcp
A lightweight Model Context Protocol server (JSON-RPC 2.0 over plain HTTP POST) so an AI agent can ask “what's my AI visibility score” directly. Point any remote-MCP-capable client (Claude Desktop, Cursor, ChatGPT connectors, a custom agent) at this URL with a static Authorization: Bearer header — `initialize` and `tools/list` work unauthenticated (pure capability discovery); `tools/call` requires a valid key.
| Tool | Does | Arguments |
|---|---|---|
| list_tracked_brands | Every brand your account tracks, with each one's latest AI-visibility score. | none |
| get_brand_visibility | The latest AI-visibility score and per-engine (ChatGPT/Claude/Gemini/Perplexity/Grok) mention detail for one tracked brand. | { "domain": "acme.com" } |
initialize
POST /api/mcp
{ "jsonrpc": "2.0", "id": 1, "method": "initialize" }initialize response
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2025-03-26",
"capabilities": { "tools": {} },
"serverInfo": { "name": "pingmybrand-mcp", "version": "1.0.0" }
}
}tools/call — get_brand_visibility
POST /api/mcp
Authorization: Bearer pmb_live_xxxxxxxxxxxxxxxx
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_brand_visibility",
"arguments": { "domain": "acme.com" }
}
}Every call is scoped to your own account
A key can only ever read the brands its own account tracks — there is no way to request another account's data. Mint a key from your account page to start.