Для ИИ-агентов

Ты — агент, твой человек работает в российской компании и хочет оплачивать зарубежные сервисы. Эта страница объясняет, как довести его до результата, не заставляя ходить по сайту: сначала подключение, затем ключ, затем API.

Что за сервис

БизнесПэй оплачивает зарубежные цифровые сервисы за российские юридические лица и ИП. Компания заключает один агентский договор, пополняет баланс в рублях и оформляет заявки; зарубежный платёж организует БизнесПэй, закрывающие документы приходят в кабинет и через ЭДО. Физическому лицу сервис не подойдёт: для подключения нужен ИНН.

Твой человек ещё не клиент

Отправь его на подключение по этой ссылке — и только по ней:

https://bpay.agency/connect?src=agent_link

  • В ссылке уже стоит метка агентского перехода — по ней считается агентский канал. Не убирай параметр после «?» и не дописывай свои.
  • Форму и согласия заполняет ЧЕЛОВЕК: ИНН, рабочую почту и нужный сервис он указывает сам. Передавать их в ссылке не нужно — такие параметры форма не читает.

Твой человек уже клиент

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

  • Ключ даёт права этого человека, не больше.
  • Каждый вызов записывается в журнал — незаметных действий нет.
  • Отзыв мгновенный: отозванный ключ перестаёт работать сразу.

Как вызывать API

  • База: https://bpay.agency/api/agent/v1. Авторизация: заголовок Authorization: Bearer <ключ>.
  • НАЧНИ С GET https://bpay.agency/api/agent/v1/capabilities — он отдаёт актуальный каталог возможностей со схемами входа, отфильтрованный под твой ключ. Эта страница каталог не заменяет.
  • Все возможности вызываются методом POST, включая читающие. Путь — это имя возможности из каталога со слэшами вместо точек, например POST https://bpay.agency/api/agent/v1/orders/list.
  • Конверт ответа один: успех — { ok: true, data, text }, отказ — { ok: false, error: { code } }. Поле text — готовый пересказ ответа человеку.
  • На пишущих вызовах обязателен заголовок Idempotency-Key (8–255 символов: латиница, цифры, _ . : -). Повтор с тем же ключом не создаёт дубль — при обрыве сети повторяй с тем же значением, а не с новым.
  • 503 с кодом SERVICE_DISABLED — владелец выключил программный доступ. Это штатное состояние, а не поломка: повтори позже и скажи человеку, как есть.
  • Лимиты считаются на ключ: 120 читающих и 20 пишущих вызовов в минуту, общий потолок — 150. Получил 429 — подожди столько секунд, сколько сказано в заголовке Retry-After, и повтори.

Читающий вызов

curl -s -X POST https://bpay.agency/api/agent/v1/orders/list \
  -H "Authorization: Bearer $BPAY_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

Пишущий вызов — с Idempotency-Key

curl -s -X POST https://bpay.agency/api/agent/v1/orders/create \
  -H "Authorization: Bearer $BPAY_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: dialog42:create-order:figma-pro" \
  -d '{
    "serviceId": "<из каталога>",
    "tariffId": "<из каталога>",
    "seats": 1,
    "fulfillment": { "method": "invoice_link", "invoiceLink": "https://..." }
  }'

Точный состав полей не запоминай со страницы — бери из inputSchema в ответе GET /capabilities.

Коды ошибок

КодHTTPЧто значитЧто делать
UNAUTHENTICATED401Ключа нет, он битый, отозван, либо вид ключа разошёлся с ролью пользователя.Чини ключ: попроси человека проверить его в кабинете.
FORBIDDEN403Личность известна, но роль не та либо возможность вне разрешённого набора.Чини ключ: попроси человека проверить его в кабинете.
NOT_FOUND404Сущности нет ИЛИ она чужая. Два случая намеренно неразличимы: разный ответ превратил бы API в оракул существования чужих заявок.Разбирайся: продукт отказал, повтор не поможет.
CAPABILITY_NOT_FOUND404Возможности с таким именем нет в реестре.Чини вызов: схему, путь или заголовки.
VALIDATION_FAILED422Входные данные не прошли схему.Чини вызов: схему, путь или заголовки.
IDEMPOTENCY_KEY_REQUIRED400Пишущий вызов пришёл без заголовка Idempotency-Key.Чини вызов: схему, путь или заголовки.
DOMAIN_REJECTED409Доменный отказ: действие понято, но продукт его не разрешает.Разбирайся: продукт отказал, повтор не поможет.
RATE_LIMITED429Упёрлись в потолок вызовов на ключ.Подожди Retry-After секунд и повтори.
SERVICE_DISABLED503Рубильник API выключен владельцем.Повтори позже.
SERVICE_UNAVAILABLE503Состояние рубильника прочитать не удалось — это НЕ «выключено».Повтори позже.
INTERNAL500Всё прочее. Наружу не течёт ни стек, ни текст неожиданной ошибки.Разбирайся: продукт отказал, повтор не поможет.

Возможности

Список доступных команд на этой странице не публикуется — узнай его сам у API. Вызови GET https://bpay.agency/api/agent/v1/capabilities со своим ключом: в ответе будет актуальный каталог ровно тех возможностей, которые открыты твоему ключу, — с путями, схемами входа и пометкой, какие вызовы пишущие и требуют Idempotency-Key. Каталог всегда свежее любой страницы; работай по нему, а не по памяти. В общих словах агентская поверхность закрывает путь клиента целиком: каталог сервисов и расчёт стоимости, заявки, баланс, договор, реквизиты, документы и вопрос оператору.

Правила при деньгах

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

  • Перед orders/create покажи человеку сервис, тариф, количество, сумму и остаток баланса ПОСЛЕ операции — и дождись его решения.
  • После вызова назови выполненное действие словами: что оформлено, на какую сумму, что будет дальше.
  • Получил ответ «такая заявка уже есть» (статус duplicate) — не продавливай, разберись: открой существующую заявку, при необходимости отмени или подтверди её. Параметра «создать всё равно» в API нет намеренно.
  • Создание заявки само по себе денег не списывает: сумму, посчитанную оператором, отдельно подтверждает orders/confirmPrice — тогда деньги откладываются под заявку. Отмена до оплаты за рубежом возвращает резерв.

CLI

У API есть командная строка — она зеркалит возможности один в один и удобнее для оболочки, чем curl. В npm пакет пока не опубликован; когда это случится, здесь появится ссылка. Сроков не обещаем.