Быстрый старт
В примере уже стоит демо-ключ. Скопируйте команду в терминал, и 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.
Инструменты
Список наборов, доступных ключу: источник, охват, примерный объём. Вызывается первым.
Поля, их типы и операторы, 3 примера строк.
Выборка с параметрами 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 ↗.
Наборы данных
Поля, типы и примеры запросов на странице набора.
| Набор | Ресурс | Поля и курсор |
|---|---|---|
| Бухгалтерская отчётность | financials | 5 полей · 126 кодов строк · курсор: year, inn |
| Справочник строк бухгалтерской отчётности | indicators | 5 полей · курсор: id |
| Госзакупки (44-ФЗ) | zakupki | 31 поле · курсор: year, id |
Коды ошибок
При ошибке API возвращает JSON {"error":"...","detail":"..."}. Поле error стабильно, по нему удобно ветвить код. В detail написано по-русски, что случилось и что сделать, со ссылкой, если нужен кабинет.
| HTTP | Код ошибки | Причина и что делать |
|---|---|---|
200 | нет | Пустой ответ {"data":[]}: запрос верный, но под фильтр ничего не попало. У демо-ключа и пробного доступа так бывает, если запросить данные вне образца: тогда в ответе есть поле note. Это не ошибка. |
400 | bad_request | Неизвестное поле, фильтр по полю без метки «фильтр», неподходящий оператор, неверное значение или cursor: что именно, сказано в detail. Так же API отвечает на первый запрос к большому набору без фильтра: добавьте фильтр. |
401 | unauthorized | Причина в поле 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-клиента или со своего сервера. |
404 | not_found | Набора нет или он недоступен вашему ключу. Эти случаи API не различает, чтобы не раскрывать список наборов. Проверьте имя набора в адресе. |
429 | rate_limit_exceeded | Ключ превысил число запросов в минуту по тарифу (поле limit). Повторите запрос через столько секунд, сколько указано в Retry-After. Больше запросов в минуту дают тарифы выше: ссылка в upgrade_url. |
429 | row_quota_exceeded | Лимит строк на месяц исчерпан. Запросы снова пройдут 1-го числа в 03:00 МСК (поле reset_at), раньше можно перейти на тариф выше по ссылке из upgrade_url. Если remaining больше нуля, уменьшите limit до этого числа. scope: global общий лимит аккаунта, resource отдельный лимит ключа на набор. |
429 | too_many_requests | С одного IP-адреса пришло больше 600 запросов в минуту. Повторите запрос через минуту. |
503 | service_unavailable | Сервис временно недоступен. Повторите запрос через столько секунд, сколько указано в Retry-After. |
504 | timeout | Запрос выполнялся дольше допустимого времени. Сузьте выборку фильтрами, например по году. |
Ошибки в MCP
Инструменты MCP возвращают ошибку текстом с тем же кодом в квадратных скобках и тем же объяснением, что поле detail в REST, например:
[subscription_expired] Подписка закончилась 14.10.2026. Продлите её в личном кабинете: https://api.tebiz.ru/account. После продления этот же ключ снова заработает.Коды те же, что в таблице выше; у ошибок 401 вместо unauthorized стоит причина из reason. Кроме них бывает [not_found]: набора нет или он не выдан ключу, вызовите list_resources.