API и MCP для ИИ-агентов

Искало — собственный индекс русскоязычного интернета. Поиск отдаёт не только ссылки, но и профиль сайта: телефоны, e-mail, город, соцсети, ИНН и год последнего обновления. Оплата в рублях, без VPN и иностранных карт.

Получить ключ API — в личном кабинете: вход по коду на почту, ключ сразу, без звонков и договоров. Каждый месяц 300 ₽ на запросы — бесплатно, дальше — пополнение картой или СБП. Там же баланс, расход по дням и ключи для каждого проекта.

Цены

ОперацияЦена
Поиск /v1/search, до 50 результатов с профилем сайта0,30 ₽ за запрос
… с полным текстом страниц (include_content)+0,05 ₽ за результат, не больше +0,30 ₽
Профиль сайта /v1/site/{host}0,10 ₽
Текст страницы /v1/contents0,10 ₽ за адрес
Нейроответ с источниками /v1/answer2 ₽
Пачка queries до 20 запросовкак отдельные запросы

Деньги списываются до выполнения и возвращаются, если запрос не выполнился. Ошибки 400, 401, 404 и 429 бесплатны.

Быстрый старт: curl

curl -s https://iskalo.ru/v1/search \
  -H "Authorization: Bearer $ISKALO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "кавер-группа Казань", "limit": 20,
       "filters": {"has_phone": true, "exclude_domains": ["leadbook.ru"]}}'

Ответ (сокращён):

{
  "query": "кавер-группа казань", "mode": "hybrid", "mode_used": "classic",
  "semantic_rerank_used": true, "semantic_rerank_reason": null,
  "semantic_coverage": {"matched_vectors": 72, "candidates": 300},
  "page": 1, "limit": 20, "has_more": true,
  "total_estimate": 214, "total_is_lower_bound": false, "candidates_cap": 300,
  "warnings": ["neural_off"],
  "warning_text": {"neural_off": "векторный отбор кандидатов не использован; смысловая переранжировка показана отдельно"},
  "results": [{
    "title": "Кавер-группа …", "url": "https://example.ru/", "host": "example.ru",
    "snippet": "…", "score": 0.81,
    "profile": {"phones": ["+79870000000"], "emails": ["band@example.ru"],
                "socials": {"vk": "https://vk.com/…"}, "city": "Казань",
                "inn": null, "org": null, "year": 2025}
  }],
  "cost_rub": 0.3
}

Python

Готовый клиент — один файл без зависимостей: tools/iskalo_client.py в репозитории. Кэш ответов на диске, темп, повторы по Retry-After, пачки и обход всех страниц.

from iskalo_client import Iskalo

isk = Iskalo()                      # ключ — из переменной ISKALO_KEY
for hit in isk.search_all("ведущий на свадьбу Пермь", filters={"has_phone": True}):
    print(hit["host"], hit["profile"]["phones"])

for r in isk.batch(["фокусник Омск", "фокусник Тюмень"], limit=50):
    print(r["query"], len(r.get("results", [])))

print(isk.site("av55.ru")["profile"])

Без клиента — обычный httpx или requests:

import httpx
r = httpx.post("https://iskalo.ru/v1/search", json={"query": "фаер-шоу Самара"},
               headers={"Authorization": "Bearer " + KEY}, timeout=60)
if r.status_code == 429:
    time.sleep(int(r.headers["Retry-After"]))

MCP для Claude Code и других агентов

Сервер MCP — https://iskalo.ru/mcp (Streamable HTTP). Подключение в Claude Code:

claude mcp add --transport http iskalo https://iskalo.ru/mcp \
  --header "Authorization: Bearer msk_…"

Или в .mcp.json проекта:

{"mcpServers": {"iskalo": {"type": "http", "url": "https://iskalo.ru/mcp",
  "headers": {"Authorization": "Bearer ${ISKALO_KEY}"}}}}

Инструменты: web_search (те же параметры и фильтры, что у REST), site_profile, get_contents, answer, usage. Ошибка инструмента — например, «пополните баланс» — приходит модели текстом.

Методы

МетодЧто делает
POST /v1/searchПоиск. Один запрос — query, пачка — queries
GET /v1/site/{host}Профиль сайта: контакты, город, соцсети, год, страниц в индексе. 404 — сайта нет в индексе (бесплатно)
POST /v1/contentsТекст страниц из индекса: {"urls": [...]}, до 20 адресов
POST /v1/answerКороткий ответ со ссылками [1], [2]: {"query": "..."} — на платном тарифе (с первого пополнения); на бесплатном — 403 без списания
GET /v1/usageБаланс, бесплатный остаток, расход за месяц — по операциям и по каждому ключу
GET /v1/keys, POST /v1/keys, DELETE /v1/keys/{key_id}Ключи аккаунта с метками: {"label": "katalog-artistov"} выпускает ещё один ключ — отдельный на проект или сессию агента, чтобы видеть, кто сколько потратил
GET /v1/pricesПрайс и лимиты, без ключа
POST /v1/billing/topupПополнение: {"amount_rub": 500} → ссылка на оплату

Параметры поиска

ПолеЗначение
queryЗапрос, до 400 символов
limitРезультатов на странице, 1–50, по умолчанию 10
pageСтраница, 1–30. Есть ли следующая — поле has_more
modehybrid (по умолчанию), neural, classic. Отбор кандидатов — mode_used, смысловая переранжировка — semantic_rerank_used
autocorrectИсправлять опечатки и раскладку, по умолчанию да. Исходный запрос — в corrected_from; с false — подсказка в did_you_mean
include_contentДобавить полный текст страниц (доплата, см. цены)
fieldsКакие поля профиля вернуть: phones, emails, socials, city, inn, org, year. По умолчанию все, [] — без профиля
filters.has_phone, filters.has_emailТолько сайты с телефоном / e-mail
filters.require_any_contactЕсть телефон, e-mail или соцсеть в сохранённом профиле. Это не проверка актуальности или владельца контакта.
filters.provider_typeТип по заголовку и описанию страницы: performer, speaker, talent_agency, venue_operator, event_agency, conference_organizer, costume_shop, education, equipment_vendor, other_business, unknown. Необязательный строгий фильтр: при его включении неизвестные типы отсекаются.
filters.cityГород сайта по профилю: «Казань»
filters.fresh_sinceСайт обновлялся не раньше этого года: 2024
filters.include_domains, filters.exclude_domainsИскать только на этих сайтах / без них, до 100 доменов
filters.site_typedirect — без каталогов и агрегаторов; тип поставщика задаётся отдельно, catalog — только они
Операторы в query"точная фраза", -слово, site:домен, -site:домен
queriesПачка до 20 запросов: строки или объекты с теми же полями. Общие поля запроса действуют на все. Ответ — responses в том же порядке

Что в ответе

Ошибки

КодЧто значит и что делать
400Неверный параметр — текст в error
401Нет ключа или ключ отозван. Перебор ключей блокирует адрес на 30 минут
402Не хватает денег. В теле — balance_rub, free_left_rub, price_rub: пополните баланс
404Сайта нет в индексе (/v1/site)
413Тело запроса больше 64 КБ
429Превышен лимит скорости. Подождите столько секунд, сколько в заголовке Retry-After (то же число — в retry_after), и повторите
501Параметр ещё не включён на сервере
503Поиск временно недоступен — повторите через минуту

Тело ошибки: {"error": "текст", "status": 429, "retry_after": 3}. В пачке queries ошибка одного запроса не отменяет остальные: у него в ответе поля error и status.

Лимиты