На главную

Для разработчиков

API Julia NeuroHR

Всё, что вы видите и настраиваете в кабинете, доступно по HTTP: диалоги с кандидатами, записи на собеседования, AI-рекрутеры и их сценарии, объявления, поиск кандидатов, аналитика, баланс и оплата. Подключайте свою CRM, отчёты или собственного ИИ-агента.

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

  1. 1. Выпустите ключ. Кабинет → раздел «API» → «Выпустить ключ». Ключ показывается один раз — сразу сохраните его. Выпускать ключи может администратор кабинета.
  2. 2. Проверьте ключ. Ответ покажет ваш кабинет и его номер tenant.id — он подставляется во все пути вместо {tenant_id}.
  3. 3. Работайте. Например, заберите ближайшие записи на собеседования.
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 — номер кабинета, который подставляется во все остальные пути.

GET/platform/api/whoamiЧтение

Кабинет, уровень ключа и от чьего имени он действует

GET/platform/configЧтение

Общие параметры платформы (кодовое слово тест-режима)

Площадки и объявления

Аккаунты Avito и HeadHunter и объявления на них. Объявлению назначается AI-рекрутер и включается обслуживание.

GET/platform/tenants/{tenant_id}/accountsЧтение

Подключённые аккаунты площадок и состояние доступа (секреты не отдаются)

POST/platform/tenants/{tenant_id}/accountsПолный

Добавить аккаунт площадки (аккаунт с проверенными доступами в другом кабинете — 409)

platform: avito | hh, account_id

POST/platform/tenants/{tenant_id}/accounts/{account_id}/credentialsПолный

Сохранить доступы площадки: проверяются площадкой и должны быть от этого же аккаунта; хранятся зашифрованными, обратно не отдаются

auth_data: {client_id, client_secret} для Avito

DELETE/platform/tenants/{tenant_id}/accounts/{account_id}Полный

Отключить аккаунт площадки

GET/platform/tenants/{tenant_id}/accounts/{account_id}/listingsЧтение

Объявления аккаунта: обслуживаются ли и какой AI-рекрутер назначен

POST/platform/tenants/{tenant_id}/accounts/{account_id}/listings/syncРабота

Подтянуть объявления с площадки (настройки объявлений сохраняются)

PATCH/platform/tenants/{tenant_id}/accounts/{account_id}/listings/{external_id}Работа

Включить/выключить обслуживание, назначить AI-рекрутера

is_served, assigned_robot_id

POST/platform/tenants/{tenant_id}/accounts/{account_id}/listings/bulkРабота

То же для многих объявлений сразу

external_ids[], is_served, assigned_robot_id

AI-рекрутеры

Робот — настроенный AI-рекрутер: вакансия, критерии отбора, сценарий, напоминания, запись на собеседование. Идентификатор робота — vacancy_external_id.

GET/platform/tenants/{tenant_id}/profilesЧтение

Список AI-рекрутеров: имя, вакансия, работает или на паузе

GET/platform/tenants/{tenant_id}/profiles/{vacancy_external_id}Чтение

Полная настройка робота

PATCH/platform/tenants/{tenant_id}/profiles/{vacancy_external_id}Работа

Изменить робота: пауза, имя, рекрутёр, текст сценария, критерии, напоминания, FAQ, запись

is_active, name, recruiter, generated_prompt, qualification, reminder_settings, scheduling, faq, …

POST/platform/tenants/{tenant_id}/profiles/{vacancy_external_id}/duplicateПолный

Скопировать робота на другую вакансию

new_vacancy_external_id, name

POST/platform/tenants/{tenant_id}/profiles/{vacancy_external_id}/generate-promptПолный

Сгенерировать текст сценария нейросетью заново

GET/platform/tenants/{tenant_id}/profiles/{vacancy_external_id}/logЧтение

Журнал робота: кто и когда брал или не брал новых, отвечал откликнувшимся до включения, менял дневной лимит и отбор (новые сверху)

DELETE/platform/tenants/{tenant_id}/profiles/{vacancy_external_id}Полный

Удалить робота (перестаёт отвечать кандидатам)

GET/platform/tenants/{tenant_id}/profiles/{vacancy_external_id}/calendarЧтение

Какие слоты робот сейчас предложит кандидатам

?days=7

GET/platform/tenants/{tenant_id}/defaultsЧтение

Общие настройки кабинета (персона, напоминания, кому бот пишет первым)

PUT/platform/tenants/{tenant_id}/defaultsРабота

Сохранить общие настройки — их наследуют роботы

Мастер создания робота

Тот же пошаговый мастер, что в кабинете: вопрос — ответ — готовый робот.

POST/onboarding/startРабота

Начать мастер

tenant_id, profile_id (любой ваш идентификатор черновика), name

GET/onboarding/stepЧтение

Текущий вопрос мастера

?tenant_id=&profile_id=

POST/onboarding/answerРабота

Ответить на вопрос

tenant_id, profile_id, step_id, value

GET/onboarding/resultЧтение

Собранная настройка по ответам

?tenant_id=&profile_id=&name=

POST/platform/tenants/{tenant_id}/onboarding/generate-promptПолный

Сгенерировать текст сценария по черновику

profile_id, name

POST/platform/tenants/{tenant_id}/profiles/from-onboardingПолный

Опубликовать робота из мастера

profile_id, vacancy_external_id, name, generated_prompt

Песочница

Тест-диалог: вы пишете как кандидат, робот отвечает по своей настройке. По умолчанию ничего никуда не отправляется.

POST/platform/tenants/{tenant_id}/sandbox/startРабота

Открыть тест-диалог

source: robot | onboarding, ref, prompt_override

POST/platform/tenants/{tenant_id}/sandbox/messageРабота

Реплика кандидата → ответ робота

sandbox_id, text, deliver (true — реально отправить карточку в канал)

Команда и записи

Живые рекрутёры, их часы приёма и записи кандидатов на собеседования.

GET/platform/tenants/{tenant_id}/recruitersЧтение

Рекрутёры

POST/platform/tenants/{tenant_id}/recruitersПолный

Добавить рекрутёра

name

PATCH/platform/tenants/{tenant_id}/recruiters/{recruiter_id}Работа

Переименовать (имя обновится во всех роботах и каналах)

name

DELETE/platform/tenants/{tenant_id}/recruiters/{recruiter_id}Полный

Убрать рекрутёра из справочника

GET/platform/tenants/{tenant_id}/recruiters/{recruiter_id}/scheduleЧтение

График приёма рекрутёра

PUT/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

GET/platform/tenants/{tenant_id}/bookingsЧтение

Записи на собеседования: кто, к кому, когда, телефон, статус

?upcoming=true (false — вся история)

PATCH/platform/tenants/{tenant_id}/bookings/{external_chat_id}Работа

Отметить запись: отменена, не пришёл, пришёл (отмена освобождает слот)

status: cancelled | no_show | attended

GET/platform/tenants/{tenant_id}/bookings/{external_chat_id}/dialogueЧтение

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

Диалоги и аналитика

GET/platform/tenants/{tenant_id}/dialoguesЧтение

Все переписки с фильтрами, поиском и сортировкой; в ответе facets — допустимые значения фильтров

?q=&channel=&direction=in|out&status=&listing=&bot=&unread=&days=&sort=last|created|unread&limit=&offset=

GET/platform/tenants/{tenant_id}/dialogues/{chat_id}Чтение

Одна переписка целиком и собранные данные кандидата (по API прочитанной не отмечается — счётчик людей в кабинете не гаснет)

POST/platform/tenants/{tenant_id}/dialogues/read-allРабота

Отметить все диалоги прочитанными

GET/platform/tenants/{tenant_id}/dialogues-exportПолный

Выгрузка контактов всех кандидатов: имя, телефон, площадка, объявление, статус

GET/platform/tenants/{tenant_id}/analytics/dialoguesЧтение

Воронка и разрезы по площадке, AI-рекрутеру и объявлению

?days=0 (0 — за всё время)

Каналы вывода (Telegram)

Куда уходят карточки кандидатов. Группу привязывают кодом: бота добавляют в группу и отправляют ему код.

GET/platform/tenants/{tenant_id}/output-routesЧтение

Маршруты карточек: группа → вакансия / рекрутёр / исход (tg_topic_title — название темы, если бот его видел)

POST/platform/tenants/{tenant_id}/output-routesПолный

Создать маршрут (все поля области пустые — маршрут по умолчанию; группа другого кабинета — 409)

title, tg_chat_id, tg_topic_id, vacancy_external_id, recruiter, outcome

DELETE/platform/tenants/{tenant_id}/output-routes/{route_id}Полный

Удалить маршрут

GET/platform/tenants/{tenant_id}/destinationsЧтение

Привязанные Telegram-группы

GET/platform/tenants/{tenant_id}/destinations/{chat_id}/topicsЧтение

Темы группы

POST/platform/tenants/{tenant_id}/link-codesПолный

Код привязки новой группы (живёт 15 минут)

POST/platform/tenants/{tenant_id}/destinations/{destination_id}/test-cardРабота

Отправить тестовую карточку в группу

DELETE/platform/tenants/{tenant_id}/destinations/{destination_id}Полный

Убрать группу из справочника

GET/platform/tenants/{tenant_id}/tg-pdn-ackЧтение

Подтверждено ли согласие на передачу данных кандидатов в Telegram

Поиск кандидатов

Исходящий поиск по базе резюме HeadHunter и Авито: задача ищет, вы отбираете, покупка открывает контакт, робот пишет кандидату. Статусы кандидата: pending (на рассмотрении) → shortlisted (отобран) → queued (в очереди на покупку) → processing → purchased (куплен без письма) / contacted (куплен и написали); rejected, failed.

GET/platform/tenants/{tenant_id}/outbound/tasksЧтение

Задачи поиска: критерии, бюджет, воронка

POST/platform/tenants/{tenant_id}/outbound/tasksПолный

Создать задачу поиска

account_id, vacancy_external_id, robot_id, filters, opener_text, reminder_texts, budget_contacts_total, enabled, dry_run

PATCH/platform/tenants/{tenant_id}/outbound/tasks/{task_id}Полный

Изменить задачу: включить/выключить, критерии, тексты, бюджет

POST/platform/tenants/{tenant_id}/outbound/previewРабота

Предпросмотр охвата до запуска — ничего не тратит

account_id, filters

POST/platform/tenants/{tenant_id}/outbound/suggest-areasРабота

Подсказка регионов по названию города

account_id, text

GET/platform/tenants/{tenant_id}/outbound/proposalsЧтение

Найденные кандидаты

?status=pending

GET/platform/tenants/{tenant_id}/outbound/proposals/{proposal_id}/dialogueЧтение

Переписка робота с кандидатом

POST/platform/tenants/{tenant_id}/outbound/proposals/{proposal_id}/approveРабота

Отобрать кандидата (денег не тратит)

POST/platform/tenants/{tenant_id}/outbound/proposals/{proposal_id}/unapproveРабота

Вернуть из отбора на рассмотрение

POST/platform/tenants/{tenant_id}/outbound/proposals/{proposal_id}/rejectРабота

Отклонить (пока контакт не куплен)

POST/platform/tenants/{tenant_id}/outbound/proposals/{proposal_id}/unrejectРабота

Отменить отклонение

POST/platform/tenants/{tenant_id}/outbound/proposals/retryРабота

Вернуть в разбор сорвавшихся не по своей вине

proposal_ids[] или task_id

POST/platform/tenants/{tenant_id}/outbound/proposals/{proposal_id}/buy?confirm=trueПолный

Купить контакт отобранного кандидата

?write=true (false — купить без письма)

POST/platform/tenants/{tenant_id}/outbound/tasks/{task_id}/buy-all?confirm=trueПолный

Купить контакты всех отобранных по задаче

?write=true

POST/platform/tenants/{tenant_id}/outbound/proposals/{proposal_id}/write?confirm=trueПолный

Написать кандидату, купленному без письма (списывает диалог из пакета)

POST/platform/tenants/{tenant_id}/outbound/tasks/{task_id}/write-purchased?confirm=trueПолный

Написать всем купленным без письма по задаче

Баланс и оплата

Оплата создаёт ссылку на страницу ЮKassa — деньги списываются, только когда человек оплатит по ней.

GET/platform/tenants/{tenant_id}/balanceЧтение

Остаток диалогов и уровень (ok / low / critical / empty)

GET/platform/tenants/{tenant_id}/billing/walletЧтение

Кошелёк: баланс, тариф, доп. места, операции (суммы в копейках)

GET/platform/tenants/{tenant_id}/billing/paymentsЧтение

История платежей

GET/platform/billing/packagesЧтение

Прайс пакетов диалогов (без ключа)

GET/platform/tenants/{tenant_id}/billing/contactsЧтение

Заполнены ли контакты для оплаты

POST/platform/tenants/{tenant_id}/billing/contactsПолный

Сохранить телефон и Telegram для оплаты

phone, tg_username

POST/platform/tenants/{tenant_id}/billing/topupПолный

Ссылка на оплату пакета диалогов

dialogs, method: card | sbp, email

POST/platform/tenants/{tenant_id}/billing/wallet/topupПолный

Ссылка на пополнение кошелька

amount_rub, method, email

POST/platform/tenants/{tenant_id}/billing/change-plan?confirm=trueПолный

Подключить или сменить тариф — списание с кошелька

plan: smart | start | team | pro

POST/platform/tenants/{tenant_id}/billing/buy-seats?confirm=trueПолный

Докупить места — списание с кошелька

seats

Доступ: сотрудники, ключи, вебхуки

Управление доступом в кабинет — ключом «Полный доступ». Ключ не может выпустить ключ сильнее себя; ключи, выпущенные ключом, отзываются вместе с ним.

GET/platform/tenants/{tenant_id}/membersЧтение

Кто имеет доступ в кабинет

POST/platform/tenants/{tenant_id}/membersПолный

Добавить сотрудника: вернёт ссылку-приглашение или временный пароль

email, name, role: client | staff

PATCH/platform/tenants/{tenant_id}/members/{member_id}Полный

Сменить роль

role: client | staff

DELETE/platform/tenants/{tenant_id}/members/{member_id}Полный

Убрать доступ (его ключи перестают работать)

GET/platform/tenants/{tenant_id}/seatsЧтение

Места: занято и доступно

GET/platform/tenants/{tenant_id}/api-keysПолный

Ключи кабинета (без секретов)

POST/platform/tenants/{tenant_id}/api-keysПолный

Выпустить ключ — секрет в ответе один раз

name, level: read | work | full, expires_in_days

DELETE/platform/tenants/{tenant_id}/api-keys/{key_id}Полный

Отозвать ключ и все ключи, выпущенные им

GET/platform/tenants/{tenant_id}/webhooksПолный

Вебхуки, каталог событий и текст подтверждения по ПДн

POST/platform/tenants/{tenant_id}/webhooksПолный

Добавить вебхук — секрет подписи в ответе один раз

url (https), events[] (пусто — все), pdn_ack: true

DELETE/platform/tenants/{tenant_id}/webhooks/{webhook_id}Полный

Удалить вебхук

POST/platform/tenants/{tenant_id}/webhooks/{webhook_id}/testПолный

Отправить тестовое событие ping (до 6 раз в минуту)

POST/platform/tenants/{tenant_id}/webhooks/{webhook_id}/rotate-secretПолный

Сменить секрет подписи — новый секрет в ответе один раз

POST/platform/tenants/{tenant_id}/webhooks/{webhook_id}/enableПолный

Включить вебхук, выключенный после серии ошибок

GET/platform/tenants/{tenant_id}/webhooks/{webhook_id}/deliveriesПолный

Последние доставки: статус, ответ, попытки, время следующей

POST/platform/tenants/{tenant_id}/tg-pdn-ackПолный

Подтвердить ответственность за данные кандидатов в своих Telegram-группах

accepted: true

GET/oauth/hh/startПолный

Ссылка на подключение HeadHunter (открывает человек: вход на hh.ru)

?tenant_id=

AI-помощник кабинета

POST/platform/tenants/{tenant_id}/support/askРабота

Задать вопрос помощнику по платформе

question, history

GET/platform/tenants/{tenant_id}/support/hintsЧтение

Подсказки: что сейчас мешает кабинету работать

POST/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"}, ...}}

Проверка подписи (Python)

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)

Примеры

Записанные кандидаты — в свою CRM (Python)

Раз в 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_id

Отметить, что кандидат пришёл

curl -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 — слот освободится

Поставить AI-рекрутера на паузу и включить обратно

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

Обработка 429

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