Tebiz Data

Документация API: REST и MCP

REST API для скриптов и своих систем, MCP для ИИ-агентов. Один ключ на оба. Примеры кода на GitHub ↗.

Быстрый старт

В примере уже стоит демо-ключ. Скопируйте команду в терминал, и API вернёт выручку компаний отрасли связи (ОКВЭД 61) за 2024 год: ИНН, название, код ОКВЭД и строку 2110 отчётности в тыс. руб. Регистрация не нужна.

curl -G "https://api.tebiz.ru/v1/financials" \
  -d "okved=like.61*" \
  -d "year=eq.2024" \
  -d "select=inn,name,okved,2110" \
  -d "limit=5" \
  -H "Authorization: Bearer tbz_live_ItPY9Edf209jODxMstCXtbKsXETPGTJHiNTFf20m"
import requests

r = requests.get(
    "https://api.tebiz.ru/v1/financials",
    headers={"Authorization": "Bearer tbz_live_ItPY9Edf209jODxMstCXtbKsXETPGTJHiNTFf20m"},
    params={"okved": "like.61*", "year": "eq.2024", "select": "inn,name,okved,2110", "limit": 5},
)
print(r.json()["data"])
const r = await fetch(
  "https://api.tebiz.ru/v1/financials?okved=like.61*&year=eq.2024&select=inn,name,okved,2110&limit=5",
  { headers: { Authorization: "Bearer tbz_live_ItPY9Edf209jODxMstCXtbKsXETPGTJHiNTFf20m" } }
);
console.log((await r.json()).data);

Ответ

{
  "data": [
    { "inn": "…", "name": "…", "okved": "61…", "2110": … },
    …
  ],
  "next_cursor": …
}

Демо-ключ работает только на образце данных каждого набора, поэтому в ответ попадут компании отрасли из образца. С ключом платного тарифа тот же запрос вернёт все компании с этим кодом, страницами по курсору. Состав образца описан в DEMO_DATA. Другие примеры кода собраны в репозитории на GitHub ↗. Чтобы работать со всеми данными, выберите тариф в каталоге и выпустите свой ключ.

Доступ по ключу API

Ключ передаётся в заголовке каждого запроса. Выпускается в кабинете после оформления подписки или пробного доступа и показывается один раз. До пяти ключей на аккаунт, лимит строк общий. Потеряли ключ: отзовите его в кабинете и выпустите новый.

Authorization: Bearer tbz_live_...

Получить пробный доступ

Попробовать API без регистрации можно с демо-ключом из раздела «Быстрый старт».

Когда подписка закончится, запросы перестанут проходить; после продления тот же ключ снова заработает.

REST API

Адрес запроса: https://api.tebiz.ru/v1/<набор>. Ответ приходит в JSON: {"data":[...],"next_cursor":...}.

Фильтры

Фильтр записывается как ?поле=оператор.значение, несколько фильтров объединяются по И. Фильтровать можно только поля с меткой «фильтр», а доступные операторы зависят от типа поля: то и другое указано на странице набора.

ОператорСмыслПример
eqравноyear=eq.2024
neне равноokved=ne.62.01
gt · gteбольше · больше или равноyear=gte.2022
lt · lteменьше · меньше или равноyear=lte.2023
likeшаблон, * заменяет любые символыokved=like.62*
inодно из значений списка через запятуюinn=in.7707083893,7708004767
is_nullзначение не заполненоokved=is_null
curl -G "https://api.tebiz.ru/v1/financials" \
  -d "year=eq.2025" \
  -d "select=year,inn,name,okved,2110" \
  -d "limit=5" \
  -H "Authorization: Bearer tbz_live_..."

Выбор полей и лимит

select=a,b,c вернёт только эти поля. limit=N задаёт размер страницы, не больше максимума набора. В одном запросе до 50 фильтров, в списке in до 1000 значений.

Пагинация курсором

API отдаёт данные страницами. Сортировки нет: строки идут по полям курсора, они указаны на странице набора. Если в ответе next_cursor не null, повторите запрос с теми же фильтрами и cursor=<значение>. Повторяйте, пока не придёт null.

Первый запрос к большому набору (больше 2 млн строк) делайте с фильтром, например ?year=eq.2024. Без фильтра и курсора такой запрос вернёт ошибку 400 с подсказкой.

cursor = None
while True:
    params = {"year": "eq.2024", "limit": 500}
    if cursor:
        params["cursor"] = cursor
    body = requests.get(URL, headers=HEADERS, params=params).json()
    process(body["data"])
    cursor = body["next_cursor"]
    if not cursor:            # null: данные закончились
        break

Лимиты в заголовках

ЗаголовокСмысл
X-RateLimit-LimitСколько запросов в минуту разрешено ключу по тарифу
X-RateLimit-RemainingСколько запросов ключ ещё может сделать в текущем окне 60 секунд
X-Quota-Rows-RemainingСколько строк осталось до лимита в текущем месяце
X-Quota-ScopeК какому лимиту строк относится остаток: global общий лимит аккаунта, resource отдельный лимит ключа на этот набор
Retry-AfterЧерез сколько секунд повторить запрос (при 429 и 503)

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

Адрес MCP-сервера: https://api.tebiz.ru/mcp/. Транспорт Streamable HTTP, ключ тот же, что для REST API, в заголовке Authorization: Bearer tbz_live_.... Имя сервера в конфигах: tebiz-data.

Подключение

Команда в терминале. Проверка: claude mcp list.

claude mcp add --transport http tebiz-data https://api.tebiz.ru/mcp/ \
  --header "Authorization: Bearer tbz_live_..."

Файл ~/.cursor/mcp.json (для всех проектов) или .cursor/mcp.json в проекте.

{
  "mcpServers": {
    "tebiz-data": {
      "url": "https://api.tebiz.ru/mcp/",
      "headers": {
        "Authorization": "Bearer tbz_live_..."
      }
    }
  }
}

Файл .vscode/mcp.json в проекте. Ключ VS Code спросит при первом запуске и сохранит в защищённом хранилище.

{
  "servers": {
    "tebiz-data": {
      "type": "http",
      "url": "https://api.tebiz.ru/mcp/",
      "headers": {
        "Authorization": "Bearer ${input:tebiz-key}"
      }
    }
  },
  "inputs": [
    {
      "type": "promptString",
      "id": "tebiz-key",
      "description": "Ключ Tebiz Data",
      "password": true
    }
  ]
}

Файл claude_desktop_config.json (Settings, Developer, Edit Config). Подключение идёт через мост mcp-remote, нужен Node.js 18 или новее. После правки перезапустите Claude Desktop.

{
  "mcpServers": {
    "tebiz-data": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://api.tebiz.ru/mcp/",
        "--header",
        "Authorization:${TEBIZ_AUTH}"
      ],
      "env": {
        "TEBIZ_AUTH": "Bearer tbz_live_..."
      }
    }
  }
}

Свой агент на официальном MCP SDK для Python.

# pip install -U mcp httpx
import asyncio

import httpx
from mcp import ClientSession
from mcp.client.streamable_http import streamable_http_client


async def main():
    headers = {"Authorization": "Bearer tbz_live_..."}
    async with httpx.AsyncClient(headers=headers, timeout=60) as http:
        async with streamable_http_client("https://api.tebiz.ru/mcp/", http_client=http) as (read, write, _):
            async with ClientSession(read, write) as session:
                await session.initialize()
                result = await session.call_tool("list_resources", {})
                print(result.content[0].text)


asyncio.run(main())

Вместо tbz_live_... подставьте свой ключ из кабинета или демо-ключ из быстрого старта.

ChatGPT и веб-версия Claude.ai пока не подключатся: их коннекторы требуют вход через OAuth, а сервер Tebiz Data принимает ключ в заголовке. Используйте клиенты выше или свой агент на MCP SDK.

Инструменты

list_resources
Список наборов, доступных ключу: источник, охват, примерный объём. Вызывается первым.
describe_resource
Поля, их типы и операторы, 3 примера строк.
query
Выборка с параметрами filters, select, limit и cursor. Ответ: список полей columns и строки rows.
Порядок вызовов
list_resources, затем describe_resource("financials"), затем query. Все инструменты только читают данные.

Если не работает

  • [missing_key] или 401: ключ не дошёл до сервера. Проверьте заголовок Authorization: Bearer tbz_live_... и перезапустите клиент после правки конфига.
  • [not_found]: такого набора нет или он не выдан ключу. Вызовите list_resources.
  • Пустой ответ с полем note: ключ видит только образец данных (демо-ключ или пробный доступ), значений из фильтра в нём нет. Это не значит, что данных нет вообще.
  • [bad_request]: фильтр по полю без метки «фильтр» или неподходящий оператор. Поля и операторы показывает describe_resource.

Для ИИ-кодинга: схема REST в формате OpenAPI /openapi.json, документация в Markdown /guide.md, сводка для LLM /llms.txt. Примеры кода и конфиг для Claude Desktop есть в репозитории на GitHub ↗.

Наборы данных

Поля, типы и примеры запросов на странице набора.

НаборРесурсПоля и курсор
Бухгалтерская отчётностьfinancials5 полей · 126 кодов строк · курсор: year, inn
Справочник строк бухгалтерской отчётностиindicators5 полей · курсор: id
Госзакупки (44-ФЗ)zakupki31 поле · курсор: year, id

Коды ошибок

При ошибке API возвращает JSON {"error":"...","detail":"..."}. Поле error стабильно, по нему удобно ветвить код. В detail написано по-русски, что случилось и что сделать, со ссылкой, если нужен кабинет.

HTTPКод ошибкиПричина и что делать
200нетПустой ответ {"data":[]}: запрос верный, но под фильтр ничего не попало. У демо-ключа и пробного доступа так бывает, если запросить данные вне образца: тогда в ответе есть поле note. Это не ошибка.
400bad_requestНеизвестное поле, фильтр по полю без метки «фильтр», неподходящий оператор, неверное значение или cursor: что именно, сказано в detail. Так же API отвечает на первый запрос к большому набору без фильтра: добавьте фильтр.
401unauthorizedПричина в поле reason:
missing_key: нет заголовка Authorization: Bearer tbz_live_...;
malformed_key: ключ записан неверно, в нём 49 символов вместе с tbz_live_;
invalid_key: такого ключа нет, проверьте, что он скопирован целиком;
key_revoked: ключ отозван, выпустите новый в кабинете;
key_expired: закончился срок самого ключа, выпустите новый в кабинете;
subscription_expired: подписка закончилась, дата в expired_at. Продлите её по ссылке из renew_url, тот же ключ снова заработает. У пробного доступа в ответе "trial": true, а ссылка ведёт к выбору тарифа.
403нет, ответ текстомТолько MCP: Invalid Origin header. Запрос пришёл со страницы в браузере с чужого сайта, такие запросы MCP-сервер отклоняет. Подключайтесь из MCP-клиента или со своего сервера.
404not_foundНабора нет или он недоступен вашему ключу. Эти случаи API не различает, чтобы не раскрывать список наборов. Проверьте имя набора в адресе.
429rate_limit_exceededКлюч превысил число запросов в минуту по тарифу (поле limit). Повторите запрос через столько секунд, сколько указано в Retry-After. Больше запросов в минуту дают тарифы выше: ссылка в upgrade_url.
429row_quota_exceededЛимит строк на месяц исчерпан. Запросы снова пройдут 1-го числа в 03:00 МСК (поле reset_at), раньше можно перейти на тариф выше по ссылке из upgrade_url. Если remaining больше нуля, уменьшите limit до этого числа. scope: global общий лимит аккаунта, resource отдельный лимит ключа на набор.
429too_many_requestsС одного IP-адреса пришло больше 600 запросов в минуту. Повторите запрос через минуту.
503service_unavailableСервис временно недоступен. Повторите запрос через столько секунд, сколько указано в Retry-After.
504timeoutЗапрос выполнялся дольше допустимого времени. Сузьте выборку фильтрами, например по году.

Ошибки в MCP

Инструменты MCP возвращают ошибку текстом с тем же кодом в квадратных скобках и тем же объяснением, что поле detail в REST, например:

[subscription_expired] Подписка закончилась 14.10.2026. Продлите её в личном кабинете: https://api.tebiz.ru/account. После продления этот же ключ снова заработает.

Коды те же, что в таблице выше; у ошибок 401 вместо unauthorized стоит причина из reason. Кроме них бывает [not_found]: набора нет или он не выдан ключу, вызовите list_resources.

Написать нам

Опишите, что не получается. Ответим на почту в течение рабочего дня.

К сообщению приложим адрес страницы и номер запроса, чтобы быстрее найти проблему.