Get AI visibility
GET
/sites/{siteId}/ai-visibility- Scope
ai:read- MCP tool
ai_visibility
AI answers to the tracked questions, per week Per sampling week (newest first), per question and model: whether the answer named the website, linked it, and which sites it pointed to. Read from the stored weekly samples (no model is asked on request); the answer text and failed answers are left out.
Parameters
| Name | In | Details |
|---|---|---|
siteIdRequired | path | stringWebsite id, from GET /sites. |
weeks | query | integerdefault 4, min 1, max 12Sampling weeks back from the current one, 1 to 12. |
limit | query | integerdefault 50, min 1, max 1000Questions per week, 1 to 1,000. |
Response
200 · application/json
| Field | Details |
|---|---|
weeks | list of object · required |
weeks[].week | date (YYYY-MM-DD) · required; Monday of the sampling week |
weeks[].answers | integer · required; Answers read this week |
weeks[].mentionRate | integer · required; Percent of answers that named the website |
weeks[].citationRate | integer · required; Percent of answers that linked the website |
weeks[].promptsAsked | integer · required; Questions asked this week |
weeks[].truncated | true or false · required; More questions than limit; the rest are left out |
weeks[].prompts | list of object · required |
weeks[].prompts[].promptId | string · required; Question id |
weeks[].prompts[].prompt | string · required; The question |
weeks[].prompts[].locale | string · required; Language the question was asked in |
weeks[].prompts[].active | true or false · required; Still asked every week |
weeks[].prompts[].answers | list of object · required |
weeks[].prompts[].answers[].model | string · required; Model id, without vendor prefix or date suffix |
weeks[].prompts[].answers[].modelName | string · required; Model name as people know it |
weeks[].prompts[].answers[].provider | anthropic | openai | google | fixture | other · required; The company that makes the model |
weeks[].prompts[].answers[].namedUs | true or false · required; The answer names the website or its brand |
weeks[].prompts[].answers[].citedUs | true or false · required; The answer links a page of the website |
weeks[].prompts[].answers[].citedUrls | list of string · required; Pages of the website the answer links |
weeks[].prompts[].answers[].sourceUrls | list of string · required; Every page the answer cites, on any website |
weeks[].prompts[].answers[].sources | list of string · required; Websites the answer names or links, this one first when cited |
weeks[].prompts[].answers[].answeredAt | string or null · required; When the model answered |
note | string · required; How to read the numbers |
link | address (URL) · required; The AI visibility screen in the app |
Errors
| Status | Meaning |
|---|---|
400 | Bad request. Codes: bad_weeks, bad_limit. |
401 | Missing, unknown or revoked key. Codes: missing_key, invalid_key. |
403 | The key lacks the scope, covers another website, or its owner lost access. Codes: missing_scope, other_site, owner_left, no_owner, forbidden. |
404 | Not found. Codes: not_found. |
429 | Too many requests this hour for this key. Codes: rate_limited. |
503 | Switched off for now. Codes: feature_off. |
Example request
curl \
-H "Authorization: Bearer mr_ws_…" \
"https://app.monoranks.com/api/v1/sites/SITE_ID/ai-visibility"const res = await fetch("https://app.monoranks.com/api/v1/sites/SITE_ID/ai-visibility", {
headers: { Authorization: "Bearer mr_ws_…" },
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import requests
res = requests.get(
"https://app.monoranks.com/api/v1/sites/SITE_ID/ai-visibility",
headers={"Authorization": "Bearer mr_ws_…"},
)
res.raise_for_status()
data = res.json()<?php
$ch = curl_init("https://app.monoranks.com/api/v1/sites/SITE_ID/ai-visibility");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ["Authorization: Bearer mr_ws_…"],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import axios from "axios";
const { data } = await axios.get("https://app.monoranks.com/api/v1/sites/SITE_ID/ai-visibility", { headers: { Authorization: "Bearer mr_ws_…" } });Example response
{
"weeks": [
{
"week": "2026-10-05",
"answers": 6,
"mentionRate": 50,
"citationRate": 33,
"promptsAsked": 2,
"truncated": false,
"prompts": [
{
"promptId": "3e5a7c9e-1a3c-4e5a-8c7e-1a3c5e7a9c1e",
"prompt": "Best place to buy a gravel bike online in the US?",
"locale": "en",
"active": true,
"answers": [
{
"model": "gpt-5.2",
"modelName": "GPT-5.2",
"provider": "openai",
"namedUs": true,
"citedUs": true,
"citedUrls": [
"https://acmebikes.com/gravel-bikes/"
],
"sourceUrls": [
"https://acmebikes.com/gravel-bikes/",
"https://www.rei.com/c/gravel-bikes"
],
"sources": [
"acmebikes.com",
"rei.com"
],
"answeredAt": "2026-10-05T04:12:09.000Z"
},
{
"model": "claude-sonnet-4-6",
"modelName": "Claude Sonnet 4.6",
"provider": "anthropic",
"namedUs": false,
"citedUs": false,
"citedUrls": [],
"sourceUrls": [
"https://www.rei.com/c/gravel-bikes"
],
"sources": [
"rei.com",
"competitivecyclist.com"
],
"answeredAt": "2026-10-05T04:12:31.000Z"
}
]
}
]
}
],
"note": "Sampled weekly from the configured AI models; each answer is one observation. Answer text is not included. Failed answers are left out.",
"link": "https://app.monoranks.com/sites/3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6f4c13/visibility"
}{
"error": {
"code": "bad_weeks",
"message": "weeks must be a whole number from 1 to 12."
}
}{
"error": {
"code": "missing_key",
"message": "Send the key as Authorization: Bearer mr_site_…"
}
}{
"error": {
"code": "missing_scope",
"message": "This key does not have the scope this call needs."
}
}{
"error": {
"code": "not_found",
"message": "Website not found."
}
}{
"error": {
"code": "rate_limited",
"message": "More than 1200 requests this hour for this key."
}
}{
"error": {
"code": "feature_off",
"message": "AI visibility is switched off for now."
}
}The MCP server does the same with the tool ai_visibility.