Docs menu

AI visibilityGET$0.05/engine

/v1/ai-visibility

Which AI answer engines cite a domain for a prompt — and who they cite instead. Official APIs, never UI scraping.

Priced per engine: $0.05 for each engine you ask, so one engine is $0.05 and all four are $0.20 — the 402 quotes the exact amount for the engines passed.

Asks ChatGPT, Claude, Gemini and Perplexity the prompt through their official APIs with web search on, then parses the citations. For each engine you get whether it cited the domain, its 1-based position in that engine's citation list, and the full deduped list of who was cited — the competitors an agent should study.

The prompt is yours. Citable never writes prompts for you: if you do not know what to ask, /v1/cited-prompts returns the questions the index has already seen a domain cited for.

Parameters#

NameDescription
promptrequiredthe question a buyer would ask (3–400 chars)
domainrequiredhostname to look for in the citations, e.g. example.com (subdomains match)
enginesoptionaloptional comma list of perplexity,gemini,openai,anthropic (default: all configured — GET /api lists them under engines_configured)

Request#

Plain GET. Without a payment header the response is a 402 carrying the price; an x402 client pays and retries on its own — see the quickstart.

request
GET https://citable.run/v1/ai-visibility?prompt=best+pay-per-call+seo+api&domain=citable.run

Response#

200 with the JSON below (trimmed) and the settlement signature in the PAYMENT-RESPONSE header. Every paid response also carries price and cluster.

200 · application/json
{
  "prompt": "best pay-per-call seo api",
  "domain": "citable.run",
  "mentioned": false,
  "engines": [
    { "engine": "perplexity", "ok": true, "mentioned": false, "position": null,
      "cited": [ { "url": "https://yepapi.com/…", "domain": "yepapi.com" }, { "url": "https://serpwatch.io/…", "domain": "serpwatch.io" }, "…" ] },
    { "engine": "gemini", "ok": true, "mentioned": false, "position": null, "cited": [ "…" ] },
    { "engine": "openai", "ok": true, "mentioned": false, "position": null, "cited": [ "…" ] },
    { "engine": "anthropic", "ok": true, "mentioned": false, "position": null, "cited": [ "…" ] }
  ],
  "summary": { "engines_run": 4, "engines_ok": 4, "engines_citing": 0 },
  "note": "One run per engine; answers vary between runs. Citations come from each engine's official API, which can differ from its web UI.",
  "price": "$0.20",
  "cluster": "mainnet"
}

Errors#

Any non-200 cancels the payment — errors are free.

StatusCodeWhen
400invalid_promptprompt missing, under 3 or over 400 chars
400invalid_domaindomain is not a hostname
400invalid_enginesan engine name outside the four
502upstream_failedno engine answered — nothing is charged
503not_configuredno engine is configured on this deployment

MCP tool#

The same call from Claude, Codex or Cursor once citable-mcp is installed. Arguments mirror the parameters above.

mcp
citable_ai_visibility(prompt, domain, engines?)   $0.05/engine

Source & latency#

Data sourceTypical latency
Official engine APIs (direct keys or DataForSEO's LLM-responses proxy)~10–15 s for four engines

Note

One run per engine and answers vary between runs — call two or three times when you need signal rather than a snapshot.

Note

A partial answer still settles: if two of four engines respond, you get those two with ok:false on the rest. Only a total failure is unpaid.

Pairs with#