Get AI crawler rules
GET
/sites/{siteId}/geo/ai-crawlers- Scope
ai:read- MCP tool
ai_crawler_rules
What robots.txt says to each AI crawler, and the rules MonoRanks wrote robots.txt is fetched on this call, past the website's page cache and CDN.
Parameters
| Name | In | Details |
|---|---|---|
siteIdRequired | path | stringWebsite id, from GET /sites. |
Response
200 · application/json
| Field | Details |
|---|---|
robotsTxt | object · required |
robotsTxt.url | string · required; Address of /robots.txt |
robotsTxt.status | integer or null · required; HTTP status; null when unreachable |
robotsTxt.matchesLastWrite | true or false or null · required; robots.txt does what MonoRanks last wrote; null: nothing to compare |
robotsTxt.notVisibleYet | true or false · required; Rules written in the last 24 hours do not show yet (likely a cache) |
robotsTxt.message | string or null · required; A plain note when a cache holds an older file |
robotsTxt.cached | object or null · required; What the plain address answered when it differs from the fresh read (a cache still holds an older answer); null when both agree |
robotsTxt.cached.status | integer or null · required; HTTP status the plain address answered |
robotsTxt.cached.kind | text | html | empty | missing | error | unreachable · required; What the plain address answered |
robotsTxt.cached.found | true or false · required; A text file was there |
robotsTxt.cached.cache | string or null · required; The cache header that answered, for example cf-cache-status: HIT |
robotsTxt.fetchedAt | string · required; When it was read |
crawlers | list of object · required |
crawlers[].bot | string · required; Crawler user agent |
crawlers[].owner | string · required; Company behind it |
crawlers[].purpose | string · required; What it is used for |
crawlers[].kind | training | search | both · required; What the crawler feeds: model training, AI search answers, or both |
crawlers[].allowed | true or false or null · required; robots.txt lets it read the home page; null when robots.txt could not be read |
crawlers[].source | group | default | none · required; group: a robots.txt rule names this crawler; default: the * rules apply; none: no rule applies |
crawlers[].rule | allow | deny | · required; What MonoRanks last wrote for it; null: no rule |
crawlers[].matches | true or false or null · required; robots.txt does that rule; null when there is no rule or no robots.txt |
rules | object · required; The rules MonoRanks last wrote, by crawler |
rules.<name> | allow | deny |
wordpress | object · required |
wordpress.connected | true or false · required; A WordPress connector is connected |
wordpress.writable | true or false · required; MonoRanks may write through it |
canPublish | true or false · required; connected and writable: a POST can write the change |
lastChange | object or null · required; The last approval and its state; null when there was none |
lastChange.batchId | string · required; Change batch id |
lastChange.status | approved | applying | applied | not_live | failed | refused | stale | reverting | reverted | revert_failed · required; approved and applying: waiting for the worker; applied: written; failed or refused: see error; reverted: undone in the app |
lastChange.value | string · required; The approved rules, as JSON |
lastChange.previous | string · required; The value before (empty: none) |
lastChange.approvedBy | string · required; Email of the person who approved it |
lastChange.approvedAt | string · required; When it was approved |
lastChange.appliedAt | string or null · required; When the worker wrote it |
lastChange.error | string or null · required; Why the write failed or was refused |
note | string · required; How to read the fields |
link | address (URL) · required; The AI readiness screen in the app |
Errors
| Status | Meaning |
|---|---|
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/geo/ai-crawlers"const res = await fetch("https://app.monoranks.com/api/v1/sites/SITE_ID/geo/ai-crawlers", {
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/geo/ai-crawlers",
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/geo/ai-crawlers");
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/geo/ai-crawlers", { headers: { Authorization: "Bearer mr_ws_…" } });Example response
{
"robotsTxt": {
"url": "https://acmebikes.com/robots.txt",
"status": 200,
"matchesLastWrite": true,
"notVisibleYet": false,
"message": null,
"cached": null,
"fetchedAt": "2026-10-06T09:30:12.000Z"
},
"crawlers": [
{
"bot": "GPTBot",
"owner": "OpenAI",
"purpose": "Training data for OpenAI models",
"kind": "training",
"allowed": false,
"source": "group",
"rule": "deny",
"matches": true
},
{
"bot": "OAI-SearchBot",
"owner": "OpenAI",
"purpose": "ChatGPT search results and citations",
"kind": "search",
"allowed": true,
"source": "group",
"rule": "allow",
"matches": true
},
{
"bot": "ChatGPT-User",
"owner": "OpenAI",
"purpose": "Pages a ChatGPT user asks about, fetched live",
"kind": "search",
"allowed": true,
"source": "default",
"rule": null,
"matches": null
},
{
"bot": "ClaudeBot",
"owner": "Anthropic",
"purpose": "Training data for Claude models",
"kind": "training",
"allowed": true,
"source": "default",
"rule": null,
"matches": null
},
{
"bot": "Claude-SearchBot",
"owner": "Anthropic",
"purpose": "Improves the quality of Claude's search results",
"kind": "search",
"allowed": true,
"source": "default",
"rule": null,
"matches": null
},
{
"bot": "Claude-User",
"owner": "Anthropic",
"purpose": "Pages a Claude user asks about, fetched live",
"kind": "search",
"allowed": true,
"source": "default",
"rule": null,
"matches": null
},
{
"bot": "PerplexityBot",
"owner": "Perplexity",
"purpose": "Perplexity search index and citations",
"kind": "search",
"allowed": true,
"source": "default",
"rule": null,
"matches": null
},
{
"bot": "Google-Extended",
"owner": "Google",
"purpose": "Gemini training and grounding (not Google Search)",
"kind": "training",
"allowed": true,
"source": "default",
"rule": null,
"matches": null
},
{
"bot": "Applebot-Extended",
"owner": "Apple",
"purpose": "Apple Intelligence training",
"kind": "training",
"allowed": true,
"source": "default",
"rule": null,
"matches": null
},
{
"bot": "CCBot",
"owner": "Common Crawl",
"purpose": "Open crawl used to train many models",
"kind": "training",
"allowed": true,
"source": "default",
"rule": null,
"matches": null
},
{
"bot": "Bytespider",
"owner": "ByteDance",
"purpose": "ByteDance models",
"kind": "training",
"allowed": true,
"source": "default",
"rule": null,
"matches": null
},
{
"bot": "meta-externalagent",
"owner": "Meta",
"purpose": "Meta AI training and product indexing",
"kind": "both",
"allowed": true,
"source": "default",
"rule": null,
"matches": null
},
{
"bot": "Amazonbot",
"owner": "Amazon",
"purpose": "Improves Amazon products and may train Amazon AI models",
"kind": "both",
"allowed": true,
"source": "default",
"rule": null,
"matches": null
}
],
"rules": {
"GPTBot": "deny",
"OAI-SearchBot": "allow"
},
"wordpress": {
"connected": true,
"writable": true
},
"canPublish": true,
"lastChange": {
"batchId": "f6b8d0f2-4a6c-4e8a-ac2e-6a8cae2a4c6d",
"status": "applied",
"value": "{\"GPTBot\":\"deny\",\"OAI-SearchBot\":\"allow\"}",
"previous": "",
"approvedBy": "owner@acmebikes.com",
"approvedAt": "2026-10-02T14:05:00.000Z",
"appliedAt": "2026-10-02T14:05:41.000Z",
"error": null
},
"note": "allowed: what robots.txt, fetched now, says to that crawler for the home page.",
"link": "https://app.monoranks.com/sites/3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6f4c13/geo"
}{
"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 readiness is switched off for now."
}
}The MCP server does the same with the tool ai_crawler_rules.