# Zorkolos Data: full reference for AI agents > Index of the Russian .ru zone: which live websites accept payments online, what they sell, in which niche and at what prices. This file is the complete machine-readable reference: data model, how to connect, every tool with its JSON schema. Short version: https://zorkolos.ru/llms.txt ## What the data is Zorkolos crawls the public pages of every registered .ru domain (about 6 million), keeps the live ones (about 3 million) and looks for money signals in the page code: payment providers (YooKassa, CloudPayments, Robokassa, Prodamus, UnitPay, PayKeeper, Tinkoff, Sber, SBP and 40 more), installment services, ad pixels and site platforms. Sites with money signals go through AI classification that answers one question: do people pay on this site online, and for what. Per site: - domain, title, one-line summary - niche (Russian name) and rubric (top-level category, about 50 of them) - pays_online: yes | no | unclear. Final verdict: AI answer; when unclear, falls back to the detector - basis: kassa (a payment provider is embedded in the page code: script, form or iframe), link (a link to a payment page), intent (no provider in code, verdict rests on indirect signals: prices, public offer, account, payment page), none - kind: shop | service | selfserve (SaaS, online tools, subscriptions) | infobiz (courses) | content | landing | other - sells: list of what the site sells (Russian) - price_min / price_max: entry and top price found, RUB - payments: payment provider codes found in the code - platform: tilda | bitrix | wordpress | insales | ecwid | getcourse | nethouse | wfolio - classified_at: date of the last classification (freshness of the record) Per domain (domain_card, check_domains) there is always a state: ready (classified), unknown (not in the zone), dns_dead, queued (waiting for the crawler), failed, blocked (robots.txt), redirect (alias of another host), refused (server answered 4xx/5xx to the crawler), parsing, parked (registrar or hoster stub), stopped (excluded topic such as gambling), unclassified (no money signals or waiting for AI). Not provided: personal data of any kind, raw HTML, internal confidence numbers, neighbours by IP by name, sites of excluded topics. Limitations to keep in mind: the text index covers what a site says about itself on its home page and on its payment and price pages; about half of classified sites still carry a raw niche name from the model rather than a canonical one (they are counted separately in niche breakdowns); freshness equals the freshness of the crawl. ## Connect Endpoint: https://mcp.zorkolos.ru/mcp (Streamable HTTP, POST, JSON-RPC 2.0). The server speaks both the current protocol revision 2026-07-28 (per-request _meta, server/discover) and the handshake revisions 2025-11-25, 2025-06-18, 2025-03-26 (initialize). No sessions. Auth: none needed for the free tier; an optional API key (Authorization: Bearer or X-Api-Key) raises the limits. Rate limits: 20 requests per minute and 500 per day per IP without a key; 60 per minute and 5000 per day with a key. Page sizes: up to 50 sites per find_sites call (default 20), up to 200 domains per check_domains call. Claude Code: claude mcp add --transport http zorkolos https://mcp.zorkolos.ru/mcp Cursor (.cursor/mcp.json) and other clients with a "url" field: { "mcpServers": { "zorkolos": { "url": "https://mcp.zorkolos.ru/mcp" } } } Clients that only launch stdio servers (bridge through mcp-remote): { "mcpServers": { "zorkolos": { "command": "npx", "args": ["-y", "mcp-remote", "https://mcp.zorkolos.ru/mcp"] } } } Raw request (current revision): curl -s https://mcp.zorkolos.ru/mcp \ -H 'content-type: application/json' \ -H 'accept: application/json, text/event-stream' \ -H 'mcp-protocol-version: 2026-07-28' \ -H 'mcp-method: tools/list' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientCapabilities":{}}}}' Raw request (handshake revision): curl -s https://mcp.zorkolos.ru/mcp \ -H 'content-type: application/json' \ -H 'accept: application/json, text/event-stream' \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1"}}}' ## Tools ### find_sites Find .ru sites by what they sell Search the Zorkolos index of Russian .ru websites that accept payments online. Each site comes with its niche and rubric, the verdict pays_online (yes/no/unclear) and its basis (kassa = a payment provider is embedded in the page code, link = a link to a payment page, intent = indirect signals only such as prices, offer and account), what it sells, the entry price in RUB, platform and payment providers. The free-text "query" matches what sites sell and their niche names; all words must match (Russian stemming), so use 2-3 words in Russian, e.g. "корм для собак", "проверка уникальности", "курсы английского". Combine with filters (verified_only, price_from, kind, platform). The first page also returns a breakdown of the matched sites by niche: pass a niche name back as "niche" to narrow down. Results are paginated: pass next_cursor back as "cursor". At most 50 sites per call. Call list_niches first when you need canonical niche names. Input schema: { "type": "object", "properties": { "query": { "type": "string", "description": "Free-text search, 1-10 words, Russian works best (e.g. \"корм для собак\"). Matches what the site sells and its niche name; all words must match.", "maxLength": 200 }, "niche": { "type": "string", "description": "Exact niche name (as returned by list_niches or in the niche breakdown) or its numeric id. Narrows results to that niche.", "maxLength": 120 }, "rubric": { "type": "string", "description": "Top-level rubric code, name or id from list_niches (e.g. \"education\").", "maxLength": 80 }, "online_payment": { "type": "string", "description": "Verdict filter: yes (default) - sites that take payments online, no, unclear, any.", "enum": [ "yes", "no", "unclear", "any" ], "default": "yes" }, "verified_only": { "type": "boolean", "description": "true - only sites where a payment provider or a payment link was found in the page code (basis kassa or link); excludes verdicts based on indirect signals.", "default": false }, "gateway": { "type": "string", "description": "Payment provider code, e.g. yookassa, cloudpayments, robokassa, prodamus, unitpay, paykeeper, tinkoff_pay, sber_pay, sbp_qr, dolyame.", "maxLength": 32 }, "kind": { "type": "string", "description": "Business type: shop (goods), service, selfserve (SaaS, online tools, subscriptions), infobiz (courses), content, landing, other.", "enum": [ "shop", "service", "selfserve", "infobiz", "content", "landing", "other" ] }, "platform": { "type": "string", "description": "Site platform code: tilda, bitrix, wordpress, insales, ecwid, getcourse, nethouse, wfolio.", "maxLength": 32 }, "price_from": { "type": "integer", "description": "Minimum entry price in RUB (the cheapest offer on the site).", "minimum": 0 }, "price_to": { "type": "integer", "description": "Maximum entry price in RUB.", "minimum": 0 }, "has_price": { "type": "boolean", "description": "true - only sites where a price was found." }, "classified_days": { "type": "integer", "description": "Only sites classified within the last N days (\"what is new since last time\").", "minimum": 1, "maximum": 365 }, "sort": { "type": "string", "description": "default (verified payment first) | fresh (recently classified) | price_asc | price_desc (sites with a price only) | domain.", "enum": [ "default", "fresh", "price_asc", "price_desc", "domain" ], "default": "default" }, "limit": { "type": "integer", "description": "Sites per page, 1-50 (default 20). Keep it small: every row costs tokens.", "minimum": 1, "maximum": 50, "default": 20 }, "cursor": { "type": "string", "description": "Opaque cursor from next_cursor of the previous page.", "maxLength": 400 } }, "additionalProperties": false } ### list_niches List niches with online-payment counters List niches (business categories) of the Zorkolos index with counters: how many classified .ru sites each niche has and how many of them accept payments online (share in percent). Use it to learn canonical niche names before calling find_sites with "niche", or to answer questions like "which niches have the highest share of online payments". Without arguments it also returns the top-level rubrics. Niche names are in Russian; "query" is a substring match, so one Russian word is enough (e.g. "юрид", "корм", "английск"). Input schema: { "type": "object", "properties": { "query": { "type": "string", "description": "Substring of the niche name, Russian (e.g. \"мебел\").", "maxLength": 100 }, "rubric": { "type": "string", "description": "Top-level rubric code, name or id; lists niches of that rubric only.", "maxLength": 80 }, "min_sites": { "type": "integer", "description": "Only niches with at least N classified sites (default 1).", "minimum": 1 }, "min_share": { "type": "number", "description": "Only niches where at least this percent of sites accept payments online (0-100).", "minimum": 0, "maximum": 100 }, "sort": { "type": "string", "description": "paying (default, by number of paying sites) | sites | share | name.", "enum": [ "paying", "sites", "share", "name" ], "default": "paying" }, "limit": { "type": "integer", "description": "Niches to return, 1-100 (default 30).", "minimum": 1, "maximum": 100, "default": 30 }, "offset": { "type": "integer", "description": "Skip the first N niches (paging).", "minimum": 0, "default": 0 } }, "additionalProperties": false } ### domain_card Everything about one .ru domain Everything Zorkolos knows about one .ru domain. Always answers with a "state" that explains why data may be missing: not in the zone, does not resolve, waiting for the crawler, parking page, server refused the crawler, excluded topic, or classified. For classified sites returns the niche and rubric, the verdict pays_online with its basis, what the site sells, prices in RUB, payment providers, platform, the target pages the classifier read (payment and price pages) and hosting facts (ip_kind: own server, shared hosting or cdn; how many other .ru domains sit on the same IP). Pass a bare domain like "example.ru"; scheme, www and path are stripped. Input schema: { "type": "object", "properties": { "domain": { "type": "string", "description": "Domain name in the .ru zone, e.g. \"anexp.ru\".", "maxLength": 253 } }, "required": [ "domain" ], "additionalProperties": false } ### check_domains Check a list of .ru domains Check up to 200 .ru domains in one call. For each domain returns its state (classified, unknown, parked, refused, ...) and, for classified sites, the niche and rubric, the verdict pays_online with its basis, business kind, price range in RUB and a one-line summary. Use it for a customer base or a list of competitors. The answer keeps the input order; unknown domains come back with state "unknown" instead of being dropped. Scheme, www and paths are stripped, duplicates are merged. Input schema: { "type": "object", "properties": { "domains": { "type": "array", "description": "Domain names, up to 200. A single string with domains separated by commas or newlines is accepted too.", "items": { "type": "string", "maxLength": 253 }, "minItems": 1, "maxItems": 200 } }, "required": [ "domains" ], "additionalProperties": false } ## Example Question: "which .ru sites sell dog food and take payments online?" 1. find_sites with query "корм для собак" and verified_only true. 2. Read the niche breakdown in the answer; if the niche is right, repeat with niche set to its name and a larger limit. 3. For a specific site call domain_card to see the payment and price pages the classifier read. ## Links - For AI agents (Russian): https://zorkolos.ru/agents - Server card: https://zorkolos.ru/.well-known/mcp/server-card.json - Crawler policy: https://zorkolos.ru/bot - Contact: team@zorkolos.ru