Для разработчиков
Всё, что вы видите и настраиваете в кабинете, доступно по HTTP: диалоги с кандидатами, записи на собеседования, AI-рекрутеры и их сценарии, объявления, поиск кандидатов, аналитика, баланс и оплата. Подключайте свою CRM, отчёты или собственного ИИ-агента.
tenant.id — он подставляется во все пути вместо {tenant_id}.export NHR_KEY="nhr_live_..." # ключ — из переменной окружения, не из кода
curl https://api.neurohr.za-bota.com/platform/api/whoami -H "Authorization: Bearer $NHR_KEY"
# {"tenant": {"id": 42, "name": "Ромашка", ...}, "key": {"level": "read", ...}, ...}
curl https://api.neurohr.za-bota.com/platform/tenants/42/bookings -H "Authorization: Bearer $NHR_KEY"Адрес API — https://api.neurohr.za-bota.com. Формат — JSON (Content-Type: application/json). Время — unix-секунды, если не сказано иное; суммы кошелька — в копейках.
Каждый запрос — с заголовком Authorization: Bearer nhr_live_…. Ключ действует на весь ваш кабинет. При выпуске выбирается, что ключу можно:
| Уровень | Что можно |
|---|---|
| Чтение | Смотреть всё: диалоги, записи, аналитику, роботов, объявления, поиск, баланс. Ничего не меняет. |
| Работа | Плюс работа сотрудника: статусы записей, графики рекрутёров, объявления, правка роботов, отбор кандидатов, песочница. |
| Полный | Всё управление кабинетом, как у его администратора: площадки, создание и удаление роботов, каналы вывода, задачи поиска и покупка контактов, оплата, сотрудники и их роли, другие ключи, вебхуки, согласия. |
Уровень ключа не может быть выше прав человека, который его выпустил. Если у этого человека забрали доступ в кабинет — его ключи перестают работать.
Ключ работает только внутри своего кабинета — запрос к чужому получит 403. По ключу не работает только механика входа человека: логин, пароль, приглашение, привязка Telegram (403 cookie_session_required); узнать, с чем работает ключ, — GET /platform/api/whoami.
Ключ «Полный доступ» может выпускать другие ключи. Они запоминают, кем выпущены: отзыв ключа сразу гасит и все ключи, которые он успел выпустить, — утёкший ключ не оставит после себя «запасных».
Действия, которые сразу списывают деньги или пишут живым людям (смена тарифа, докупка мест, покупка контактов кандидатов, письмо купленным кандидатам), выполняются только с параметром ?confirm=true. Без него — 400 confirmation_required, ничего не произошло. Так пробный запрос «проверить, есть ли маршрут» не потратит деньги.
| Ответ | Что значит |
|---|---|
401 invalid_api_key | Ключ не найден, отозван или истёк. |
401 key_owner_inactive | У человека, выпустившего ключ, больше нет доступа в кабинет. Выпустите новый. |
401 parent_key_revoked | Ключ выпущен другим ключом, который отозван или истёк. |
403 insufficient_level | Уровня ключа не хватает (в сообщении — какой нужен). |
403 cookie_session_required | Это механика входа человека (логин, пароль) — по ключу не нужна. |
403 | Кабинет в пути — не ваш. |
400 confirmation_required | Действие тратит деньги или пишет кандидатам — добавьте ?confirm=true. |
404 / 409 / 400 / 402 | Ответ самого раздела — как в кабинете: не найдено, конфликт состояния, ошибка данных, не хватает денег на кошельке. |
429 rate_limited | Слишком часто. Подождите столько секунд, сколько в заголовке Retry-After. |
Ошибки доступа приходят объектом {"detail": {"code", "message", "docs"}}, ошибки разделов — строкой {"detail": "текст"}, ошибки формата тела —422 со списком полей.
| Лимит | Значение |
|---|---|
| Чтение (GET) | 300 запросов в минуту на ключ |
| Изменения (POST, PUT, PATCH, DELETE) | 60 запросов в минуту на ключ |
| Тяжёлые операции: песочница, помощник, генерация сценария, предпросмотр и подсказки поиска, переписка исходящего поиска, синхронизация объявлений, тестовая карточка, проверка вебхука | 20 в минуту на ключ и 60 в минуту на кабинет по всем ключам |
| AI-помощник / генерация сценария | по API — 20 / 5 в час на кабинет (остальной часовой лимит оставлен людям в кабинете) |
| Неверные ключи | 10 попыток в минуту с одного адреса |
| Активных ключей | до 10 на кабинет |
Пути даны относительно https://api.neurohr.za-bota.com. Поля тела и ответа — ровно те, что использует кабинет; полная машинная схема каждого запроса — OpenAPI (её можно импортировать в Postman или отдать ИИ-агенту).
Первый запрос любой интеграции: проверить ключ и узнать tenant_id — номер кабинета, который подставляется во все остальные пути.
/platform /api /whoamiЧтениеКабинет, уровень ключа и от чьего имени он действует
/platform /configЧтениеОбщие параметры платформы (кодовое слово тест-режима)
Аккаунты Avito и HeadHunter и объявления на них. Объявлению назначается AI-рекрутер и включается обслуживание.
/platform /tenants /{tenant_id} /accountsЧтениеПодключённые аккаунты площадок и состояние доступа (секреты не отдаются)
/platform /tenants /{tenant_id} /accountsПолныйДобавить аккаунт площадки (аккаунт с проверенными доступами в другом кабинете — 409)
platform: avito | hh, account_id
/platform /tenants /{tenant_id} /accounts /{account_id} /credentialsПолныйСохранить доступы площадки: проверяются площадкой и должны быть от этого же аккаунта; хранятся зашифрованными, обратно не отдаются
auth_data: {client_id, client_secret} для Avito
/platform /tenants /{tenant_id} /accounts /{account_id}ПолныйОтключить аккаунт площадки
/platform /tenants /{tenant_id} /accounts /{account_id} /listingsЧтениеОбъявления аккаунта: обслуживаются ли и какой AI-рекрутер назначен
/platform /tenants /{tenant_id} /accounts /{account_id} /listings /syncРаботаПодтянуть объявления с площадки (настройки объявлений сохраняются)
/platform /tenants /{tenant_id} /accounts /{account_id} /listings /{external_id}РаботаВключить/выключить обслуживание, назначить AI-рекрутера
is_served, assigned_robot_id
/platform /tenants /{tenant_id} /accounts /{account_id} /listings /bulkРаботаТо же для многих объявлений сразу
external_ids[], is_served, assigned_robot_id
Робот — настроенный AI-рекрутер: вакансия, критерии отбора, сценарий, напоминания, запись на собеседование. Идентификатор робота — vacancy_external_id.
/platform /tenants /{tenant_id} /profilesЧтениеСписок AI-рекрутеров: имя, вакансия, работает или на паузе
/platform /tenants /{tenant_id} /profiles /{vacancy_external_id}ЧтениеПолная настройка робота
/platform /tenants /{tenant_id} /profiles /{vacancy_external_id}РаботаИзменить робота: пауза, имя, рекрутёр, текст сценария, критерии, напоминания, FAQ, запись
is_active, name, recruiter, generated_prompt, qualification, reminder_settings, scheduling, faq, …
/platform /tenants /{tenant_id} /profiles /{vacancy_external_id} /duplicateПолныйСкопировать робота на другую вакансию
new_vacancy_external_id, name
/platform /tenants /{tenant_id} /profiles /{vacancy_external_id} /generate-promptПолныйСгенерировать текст сценария нейросетью заново
/platform /tenants /{tenant_id} /profiles /{vacancy_external_id} /logЧтениеЖурнал робота: кто и когда брал или не брал новых, отвечал откликнувшимся до включения, менял дневной лимит и отбор (новые сверху)
/platform /tenants /{tenant_id} /profiles /{vacancy_external_id}ПолныйУдалить робота (перестаёт отвечать кандидатам)
/platform /tenants /{tenant_id} /profiles /{vacancy_external_id} /calendarЧтениеКакие слоты робот сейчас предложит кандидатам
?days=7
/platform /tenants /{tenant_id} /defaultsЧтениеОбщие настройки кабинета (персона, напоминания, кому бот пишет первым)
/platform /tenants /{tenant_id} /defaultsРаботаСохранить общие настройки — их наследуют роботы
Тот же пошаговый мастер, что в кабинете: вопрос — ответ — готовый робот.
/onboarding /startРаботаНачать мастер
tenant_id, profile_id (любой ваш идентификатор черновика), name
/onboarding /stepЧтениеТекущий вопрос мастера
?tenant_id=&profile_id=
/onboarding /answerРаботаОтветить на вопрос
tenant_id, profile_id, step_id, value
/onboarding /resultЧтениеСобранная настройка по ответам
?tenant_id=&profile_id=&name=
/platform /tenants /{tenant_id} /onboarding /generate-promptПолныйСгенерировать текст сценария по черновику
profile_id, name
/platform /tenants /{tenant_id} /profiles /from-onboardingПолныйОпубликовать робота из мастера
profile_id, vacancy_external_id, name, generated_prompt
Тест-диалог: вы пишете как кандидат, робот отвечает по своей настройке. По умолчанию ничего никуда не отправляется.
/platform /tenants /{tenant_id} /sandbox /startРаботаОткрыть тест-диалог
source: robot | onboarding, ref, prompt_override
/platform /tenants /{tenant_id} /sandbox /messageРаботаРеплика кандидата → ответ робота
sandbox_id, text, deliver (true — реально отправить карточку в канал)
Живые рекрутёры, их часы приёма и записи кандидатов на собеседования.
/platform /tenants /{tenant_id} /recruitersЧтениеРекрутёры
/platform /tenants /{tenant_id} /recruitersПолныйДобавить рекрутёра
name
/platform /tenants /{tenant_id} /recruiters /{recruiter_id}РаботаПереименовать (имя обновится во всех роботах и каналах)
name
/platform /tenants /{tenant_id} /recruiters /{recruiter_id}ПолныйУбрать рекрутёра из справочника
/platform /tenants /{tenant_id} /recruiters /{recruiter_id} /scheduleЧтениеГрафик приёма рекрутёра
/platform /tenants /{tenant_id} /recruiters /{recruiter_id} /scheduleРаботаЗадать график: окна по дням недели, длина слота, выходные, место встречи. Окно с vacancies (id объявлений или AI-рекрутеров) бот предлагает только этим вакансиям, пустой список — всем
weekday_windows ({start, end, capacity, vacancies}), slot_minutes, timezone, days_off, location, is_active; необязательно base_updated_at — updated_at графика, с которого начата правка: если график с тех пор изменили, ответ 409
/platform /tenants /{tenant_id} /bookingsЧтениеЗаписи на собеседования: кто, к кому, когда, телефон, статус
?upcoming=true (false — вся история)
/platform /tenants /{tenant_id} /bookings /{external_chat_id}РаботаОтметить запись: отменена, не пришёл, пришёл (отмена освобождает слот)
status: cancelled | no_show | attended
/platform /tenants /{tenant_id} /bookings /{external_chat_id} /dialogueЧтениеПереписка с записанным кандидатом
/platform /tenants /{tenant_id} /dialoguesЧтениеВсе переписки с фильтрами, поиском и сортировкой; в ответе facets — допустимые значения фильтров
?q=&channel=&direction=in|out&status=&listing=&bot=&unread=&days=&sort=last|created|unread&limit=&offset=
/platform /tenants /{tenant_id} /dialogues /{chat_id}ЧтениеОдна переписка целиком и собранные данные кандидата (по API прочитанной не отмечается — счётчик людей в кабинете не гаснет)
/platform /tenants /{tenant_id} /dialogues /read-allРаботаОтметить все диалоги прочитанными
/platform /tenants /{tenant_id} /dialogues-exportПолныйВыгрузка контактов всех кандидатов: имя, телефон, площадка, объявление, статус
/platform /tenants /{tenant_id} /analytics /dialoguesЧтениеВоронка и разрезы по площадке, AI-рекрутеру и объявлению
?days=0 (0 — за всё время)
Куда уходят карточки кандидатов. Группу привязывают кодом: бота добавляют в группу и отправляют ему код.
/platform /tenants /{tenant_id} /output-routesЧтениеМаршруты карточек: группа → вакансия / рекрутёр / исход (tg_topic_title — название темы, если бот его видел)
/platform /tenants /{tenant_id} /output-routesПолныйСоздать маршрут (все поля области пустые — маршрут по умолчанию; группа другого кабинета — 409)
title, tg_chat_id, tg_topic_id, vacancy_external_id, recruiter, outcome
/platform /tenants /{tenant_id} /output-routes /{route_id}ПолныйУдалить маршрут
/platform /tenants /{tenant_id} /destinationsЧтениеПривязанные Telegram-группы
/platform /tenants /{tenant_id} /destinations /{chat_id} /topicsЧтениеТемы группы
/platform /tenants /{tenant_id} /link-codesПолныйКод привязки новой группы (живёт 15 минут)
/platform /tenants /{tenant_id} /destinations /{destination_id} /test-cardРаботаОтправить тестовую карточку в группу
/platform /tenants /{tenant_id} /destinations /{destination_id}ПолныйУбрать группу из справочника
/platform /tenants /{tenant_id} /tg-pdn-ackЧтениеПодтверждено ли согласие на передачу данных кандидатов в Telegram
Исходящий поиск по базе резюме HeadHunter и Авито: задача ищет, вы отбираете, покупка открывает контакт, робот пишет кандидату. Статусы кандидата: pending (на рассмотрении) → shortlisted (отобран) → queued (в очереди на покупку) → processing → purchased (куплен без письма) / contacted (куплен и написали); rejected, failed.
/platform /tenants /{tenant_id} /outbound /tasksЧтениеЗадачи поиска: критерии, бюджет, воронка
/platform /tenants /{tenant_id} /outbound /tasksПолныйСоздать задачу поиска
account_id, vacancy_external_id, robot_id, filters, opener_text, reminder_texts, budget_contacts_total, enabled, dry_run
/platform /tenants /{tenant_id} /outbound /tasks /{task_id}ПолныйИзменить задачу: включить/выключить, критерии, тексты, бюджет
/platform /tenants /{tenant_id} /outbound /previewРаботаПредпросмотр охвата до запуска — ничего не тратит
account_id, filters
/platform /tenants /{tenant_id} /outbound /suggest-areasРаботаПодсказка регионов по названию города
account_id, text
/platform /tenants /{tenant_id} /outbound /proposalsЧтениеНайденные кандидаты
?status=pending
/platform /tenants /{tenant_id} /outbound /proposals /{proposal_id} /dialogueЧтениеПереписка робота с кандидатом
/platform /tenants /{tenant_id} /outbound /proposals /{proposal_id} /approveРаботаОтобрать кандидата (денег не тратит)
/platform /tenants /{tenant_id} /outbound /proposals /{proposal_id} /unapproveРаботаВернуть из отбора на рассмотрение
/platform /tenants /{tenant_id} /outbound /proposals /{proposal_id} /rejectРаботаОтклонить (пока контакт не куплен)
/platform /tenants /{tenant_id} /outbound /proposals /{proposal_id} /unrejectРаботаОтменить отклонение
/platform /tenants /{tenant_id} /outbound /proposals /retryРаботаВернуть в разбор сорвавшихся не по своей вине
proposal_ids[] или task_id
/platform /tenants /{tenant_id} /outbound /proposals /{proposal_id} /buy?confirm=trueПолныйКупить контакт отобранного кандидата
?write=true (false — купить без письма)
/platform /tenants /{tenant_id} /outbound /tasks /{task_id} /buy-all?confirm=trueПолныйКупить контакты всех отобранных по задаче
?write=true
/platform /tenants /{tenant_id} /outbound /proposals /{proposal_id} /write?confirm=trueПолныйНаписать кандидату, купленному без письма (списывает диалог из пакета)
/platform /tenants /{tenant_id} /outbound /tasks /{task_id} /write-purchased?confirm=trueПолныйНаписать всем купленным без письма по задаче
Оплата создаёт ссылку на страницу ЮKassa — деньги списываются, только когда человек оплатит по ней.
/platform /tenants /{tenant_id} /balanceЧтениеОстаток диалогов и уровень (ok / low / critical / empty)
/platform /tenants /{tenant_id} /billing /walletЧтениеКошелёк: баланс, тариф, доп. места, операции (суммы в копейках)
/platform /tenants /{tenant_id} /billing /paymentsЧтениеИстория платежей
/platform /billing /packagesЧтениеПрайс пакетов диалогов (без ключа)
/platform /tenants /{tenant_id} /billing /contactsЧтениеЗаполнены ли контакты для оплаты
/platform /tenants /{tenant_id} /billing /contactsПолныйСохранить телефон и Telegram для оплаты
phone, tg_username
/platform /tenants /{tenant_id} /billing /topupПолныйСсылка на оплату пакета диалогов
dialogs, method: card | sbp, email
/platform /tenants /{tenant_id} /billing /wallet /topupПолныйСсылка на пополнение кошелька
amount_rub, method, email
/platform /tenants /{tenant_id} /billing /change-plan?confirm=trueПолныйПодключить или сменить тариф — списание с кошелька
plan: smart | start | team | pro
/platform /tenants /{tenant_id} /billing /buy-seats?confirm=trueПолныйДокупить места — списание с кошелька
seats
Управление доступом в кабинет — ключом «Полный доступ». Ключ не может выпустить ключ сильнее себя; ключи, выпущенные ключом, отзываются вместе с ним.
/platform /tenants /{tenant_id} /membersЧтениеКто имеет доступ в кабинет
/platform /tenants /{tenant_id} /membersПолныйДобавить сотрудника: вернёт ссылку-приглашение или временный пароль
email, name, role: client | staff
/platform /tenants /{tenant_id} /members /{member_id}ПолныйСменить роль
role: client | staff
/platform /tenants /{tenant_id} /members /{member_id}ПолныйУбрать доступ (его ключи перестают работать)
/platform /tenants /{tenant_id} /seatsЧтениеМеста: занято и доступно
/platform /tenants /{tenant_id} /api-keysПолныйКлючи кабинета (без секретов)
/platform /tenants /{tenant_id} /api-keysПолныйВыпустить ключ — секрет в ответе один раз
name, level: read | work | full, expires_in_days
/platform /tenants /{tenant_id} /api-keys /{key_id}ПолныйОтозвать ключ и все ключи, выпущенные им
/platform /tenants /{tenant_id} /webhooksПолныйВебхуки, каталог событий и текст подтверждения по ПДн
/platform /tenants /{tenant_id} /webhooksПолныйДобавить вебхук — секрет подписи в ответе один раз
url (https), events[] (пусто — все), pdn_ack: true
/platform /tenants /{tenant_id} /webhooks /{webhook_id}ПолныйУдалить вебхук
/platform /tenants /{tenant_id} /webhooks /{webhook_id} /testПолныйОтправить тестовое событие ping (до 6 раз в минуту)
/platform /tenants /{tenant_id} /webhooks /{webhook_id} /rotate-secretПолныйСменить секрет подписи — новый секрет в ответе один раз
/platform /tenants /{tenant_id} /webhooks /{webhook_id} /enableПолныйВключить вебхук, выключенный после серии ошибок
/platform /tenants /{tenant_id} /webhooks /{webhook_id} /deliveriesПолныйПоследние доставки: статус, ответ, попытки, время следующей
/platform /tenants /{tenant_id} /tg-pdn-ackПолныйПодтвердить ответственность за данные кандидатов в своих Telegram-группах
accepted: true
/oauth /hh /startПолныйСсылка на подключение HeadHunter (открывает человек: вход на hh.ru)
?tenant_id=
/platform /tenants /{tenant_id} /support /askРаботаЗадать вопрос помощнику по платформе
question, history
/platform /tenants /{tenant_id} /support /hintsЧтениеПодсказки: что сейчас мешает кабинету работать
/platform /tenants /{tenant_id} /support /feedbackРаботаОценить ответ помощника
question_id, rating: up | down
Вместо опроса API подпишитесь на события: мы сами пришлём POST в вашу систему, как только что-то произошло. Вебхук добавляется в кабинете (раздел «API» → «Вебхуки») или по ключу «Полный доступ» — POST /platform/tenants/{tenant_id}/webhooks.
| Событие | Когда приходит |
|---|---|
candidate.outcome | Исход кандидата: записан на собеседование, передан рекрутёру, отказ или пропал. В data — вакансия, статус, ФИО, телефон, возраст, гражданство, ответы анкеты, запись (дата, время, рекрутёр), площадка и id переписки. Ровно то, что уходит карточкой в Telegram. |
booking.updated | Запись изменена в кабинете или по API: cancelled, no_show, attended. |
ping | Проверка кнопкой «Проверить» или POST …/webhooks/{id}/test. |
POST https://ваша-crm.ru/neurohr/webhook
Content-Type: application/json
X-NeuroHR-Event: candidate.outcome
X-NeuroHR-Delivery: 9f2c… # id события — повторы с тем же id не присылаем
X-NeuroHR-Signature: sha256=<hex HMAC-SHA256(секрет, тело)>
{"event": "candidate.outcome", "event_id": "9f2c…", "tenant_id": 42, "occurred_at": 1789000000,
"data": {"vacancy": "Кассир", "status": "interview", "full_name": "Иван Петров",
"phone": "+79990000000", "booking": {"date": "2026-09-20", "time": "10:00"}, ...}}import hmac, hashlib
def valid(secret: str, body: bytes, header: str) -> bool:
expected = "sha256=" + hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, header)2xx быстро: на весь запрос — 10 секунд. Тяжёлую обработку делайте у себя асинхронно.5xx, 408 или 429 — повторим через 1 мин, 5 мин, 30 мин, 2 ч и 6 ч. На остальные 4xx не повторяем. Статус каждой доставки виден в кабинете («Доставки») и по API: GET …/webhooks/{id}/deliveries.POST …/webhooks/{id}/enable.event_id (заголовок X-NeuroHR-Delivery) — по нему удобно отсекать дубли у себя.POST …/webhooks/{id}/rotate-secret).https, порт 443 или 8443, домен латиницей (кириллический — в виде xn--…), только публичные адреса: внутренние и локальные отклоняются.pdn_ack: true); без этого события с анкетами не отправляются.Раз в 10 минут забирать предстоящие записи и отправлять новые в CRM. Хватит ключа «Чтение».
import os, requests
API = "https://api.neurohr.za-bota.com"
H = {"Authorization": f"Bearer {os.environ['NHR_KEY']}"}
tenant_id = requests.get(f"{API}/platform/api/whoami", headers=H, timeout=30).json()["tenant"]["id"]
bookings = requests.get(f"{API}/platform/tenants/{tenant_id}/bookings",
headers=H, timeout=30).json()
for b in bookings:
if b["status"] != "booked":
continue
# b: external_chat_id, candidate_name, phone, date, time, recruiter_name, vacancy_external_id
send_to_my_crm(b) # ваша функция; дубли отсекайте по external_chat_idcurl -X PATCH https://api.neurohr.za-bota.com/platform/tenants/42/bookings/CHAT_ID \
-H "Authorization: Bearer $NHR_KEY" -H "Content-Type: application/json" \
-d '{"status": "attended"}' # или cancelled / no_show — слот освободитсяcurl -X PATCH https://api.neurohr.za-bota.com/platform/tenants/42/profiles/VACANCY_ID \
-H "Authorization: Bearer $NHR_KEY" -H "Content-Type: application/json" \
-d '{"is_active": false}'curl "https://api.neurohr.za-bota.com/platform/tenants/42/dialogues?unread=true&days=1&sort=last" \
-H "Authorization: Bearer $NHR_KEY"
# items[]: chat_id, candidate, channel, direction, status, listing_title, last_message, ...
# переписка целиком: GET /platform/tenants/42/dialogues/{chat_id}Отбор денег не тратит, покупка — тратит, поэтому нужен ключ «Полный доступ» и?confirm=true.
# кандидаты на рассмотрении curl "https://api.neurohr.za-bota.com/platform/tenants/42/outbound/proposals?status=pending" -H "Authorization: Bearer $NHR_KEY" # отобрать curl -X POST https://api.neurohr.za-bota.com/platform/tenants/42/outbound/proposals/1001/approve -H "Authorization: Bearer $NHR_KEY" # купить контакт и написать кандидату в рабочие часы curl -X POST "https://api.neurohr.za-bota.com/platform/tenants/42/outbound/proposals/1001/buy?confirm=true" \ -H "Authorization: Bearer $NHR_KEY"
Дайте агенту OpenAPI-схему — в ней только то, что доступно по ключу, с уровнем каждой операции в поле x-access-level. Ключ передайте агенту через переменную окружения, а не текстом в промпте. Для агента, который только анализирует, выпустите ключ «Чтение».
curl https://api.neurohr.za-bota.com/platform/api/openapi.json -o julia-neurohr-openapi.json
import time, requests
def call(method, url, **kw):
for _ in range(5):
r = requests.request(method, url, timeout=30, **kw)
if r.status_code != 429:
return r
time.sleep(int(r.headers.get("Retry-After", "5")))
return rВопросы по API: mail@za-bota.com