Документация Aeris API
Справочник по авторизации, созданию платежей и выплат, webhook-уведомлениям и проверке статусов.
Скачать Postman-документациюОсновные разделы
- Базовый URL
https://aeris-psp.net- Формат данных
application/json
Первый платёж
Пройдите путь от настройки доступа до подтверждённого заказа. Примеры используют демонстрационные данные; отправка с production-ключом создаёт реальную операцию.
Перед началом
- Получите проект и пару public_key / secret_key. Для проверки используйте отдельный тестовый проект.
- Добавьте исходящий IP вашего backend в список API IP. Для виджета отдельно разрешите домен сайта.
- Подготовьте HTTPS-обработчик webhook и страницы возврата. Секретный ключ храните только на backend.
Отправьте запрос с backend. Секретный ключ не передавайте в браузер.
Сохраните id и merchant_order_id. pending означает ожидание оплаты; payment_url открывает платёжное окно.
Передайте покупателю только payment_url. На странице он выбирает банк и подтверждает платёж.
GET использует сохранённый id. Выдавайте заказ только после completed из этого ответа или проверенного webhook.
Как устроена интеграция
Выберите, кто управляет оплатой
- Платёжное окно
- Aeris показывает форму, QR и банковские кнопки. Вы открываете payment_url или встраиваете виджет.
- Host-to-Host
- Ваш интерфейс получает прямую ссылку или next_action. Обработку переходов и 3DS реализуете вы.
- Общее окно
- Покупатель выбирает СБП или SberPay. Ответ с checkout_id описывает сессию выбора; это не подтверждённый платёж.
merchant_order_id- Ваш уникальный номер заказа. Нужен для сопоставления операции и безопасной проверки после потери ответа.
id- Идентификатор транзакции Aeris. Сохраните из ответа и используйте в запросе статуса.
project_url- Адрес сайта или Telegram-бота, для которого создан заказ. Не адрес webhook и не страница возврата.
callback_url- Backend-обработчик уведомления. Входящий запрос от Aeris, а не переход покупателя.
redirect_url_success- Страница возврата покупателя после успешного сценария. Не является подтверждением зачисления.
API-ключи
Основной ключ создаётся вместе с проектом. В кабинете можно выпустить до четырёх дополнительных ключей. Там же задаются адрес для уведомлений, IP/CIDR серверов и HTTPS-домены виджета. Просмотр ключей и сохранение изменений подтверждаются через Telegram или приложение-аутентификатор.
Settings → API keys
Primary key + up to 4 additional keys
Settings → Webhook and access
Webhook URL → default notification endpoint
API IP → server addresses
Checkout origins → website domainsАвторизация
Каждый запрос подписывается HMAC-SHA256. Timestamp передаётся в Unix-секундах и действует в коротком временном окне. JSON сериализуйте компактно, без пробелов. Для GET не отправляйте HTTP-тело, но в подпись включайте {}.
body = compact_json_ascii(request_body) # GET: "{}"
message = body + ":" + unix_timestamp + "++"
signature = hex(hmac_sha256(base64(secret_key), message))
X-API-KEY: <public_key>
X-TIMESTAMP: <unix_seconds>
X-SIGNATURE: <signature>- Для POST подпишите компактное JSON-тело с ASCII-экранированием Unicode (\uXXXX), как json.dumps(..., separators=(",", ":"), ensure_ascii=True). Для GET не отправляйте HTTP-тело, но используйте строку {} при вычислении подписи.
- base64(secret_key) означает Base64-кодирование UTF-8 строки секрета, не декодирование. Timestamp — Unix-секунды, не миллисекунды.
- Для исходящего API-запроса используйте согласованную пару ключей: основной или выпущенный дополнительный. Не смешивайте public_key одной пары с secret_key другой.
Создать платёжСБП, SberPay и банковские карты
Платёжное окно
Aeris показывает покупателю готовую страницу оплаты.
H2H
Ваш backend получает прямую ссылку или next_action и сам управляет интерфейсом.
СБП + SberPay
Одно платёжное окно с доступными покупателю способами. Платёж создаётся после выбора способа.
Backend подписывает запрос и сохраняет id операции.
URL можно открыть как платёжную страницу или передать в JS-виджет.
Desktop: сканирует QR. Mobile: открывает приложение банка.
Заказ выдаётся только после completed из webhook/status API.
Платёжная форма Aeris
Оплата заказа
Demo Store9 000 ₽
Результат появится на этой странице
Рекуррентные платежи СБП
Подписка хранит согласованную сумму и период. Инициатор — Aeris по расписанию или ваш backend; правила списания и история начислений одинаковые.
Все пути ниже начинаются с /api/v1/merchant. Подписывайте запросы как обычные платежи. GET /recurring/capabilities возвращает доступные методы и состояние списаний.
Передайте стабильный merchant_subscription_id, customer_id, телефон плательщика с кодом страны и окончательные условия после скидок. initial_amount — первая оплата (по умолчанию 1 RUB); terms.amount — последующие списания. initiator: aeris запускает их автоматически, merchant — по вашим запросам. План — необязательный шаблон: его изменение не меняет действующие подписки.
Отправьте покупателю confirmation_url из ответа. В окне Aeris он видит первую сумму, цену, период и дату последующих списаний, подтверждает условия и оплачивает через банк. Подписка остаётся awaiting_confirmation до согласия, успешной первой оплаты и активной привязки. Первая оплата не возвращается автоматически.
Сохраните id подписки. Дождитесь status: active через API или подписанное уведомление. Возврат браузера на сайт не подтверждает оплату. payment_token — способ оплаты, а subscription_id — условия и история списаний; это разные идентификаторы.
Ваш backend передаёт subscription_id и merchant_order_id. Сумма и токен берутся из подписки: их нельзя переопределить в этом запросе. Повторы и другие номера заказа относятся к тому же начислению за период. До срока, при паузе или блокировке новое списание не отправляется. При неизвестном результате не создавайте другую подписку или платёж.
Управление и ограничения
Одно начисление за период и одно незавершённое списание. Не более трёх отправленных попыток за 24 часа, с промежутком минимум час; повтор допускается только после подтверждённого отказа. Таймаут не освобождает ограничение. Пропущенные периоды не догоняются. Отключение списаний останавливает и API, и планировщик, но не сверку отправленных платежей.
Для изменения или остановки укажите текущий expected_version. Превышение согласованной цены, изменение периода или продление согласованного срока требуют нового подтверждения. Смена initiator не сбрасывает историю и лимиты. Пауза и отмена не возвращают деньги и не отменяют уже отправленный платёж.
{
"subscription_id": "e5a0c035-bef2-48a5-b59b-035cbd877eaf",
"expected_version": 2,
"action": "pause"
}{
"id": "e5a0c035-bef2-48a5-b59b-035cbd877eaf",
"merchant_subscription_id": "subscription-10001",
"customer_id": "customer-10001",
"name": "Monthly access",
"payment_token": "938b3f2e-5927-4b4e-85d1-1a4b7e0c9040",
"plan_id": null,
"terms": {
"amount": 990,
"currency": "RUB",
"interval": "month",
"period": 1,
"start_at": "2030-01-31T10:00:00+03:00",
"timezone": "Europe/Moscow",
"end_at": null,
"max_payments": 12,
"customer_fee_percent": "0",
"retry_policy": {
"retry_delays_seconds": [
3600,
86400
],
"on_exhausted": "pause"
}
},
"status": "paused",
"reason": "merchant_request",
"version": 3,
"paid_cycles": 0,
"initiator": "merchant",
"confirmation_url": null,
"next_payment_at": null,
"cancel_at": null,
"project_url": "https://merchant.example",
"consent_reference": "consent-10001",
"created_at": "2029-12-31T10:00:00+00:00",
"preview": [
{
"cycle_number": 0,
"payment_at": "2030-01-31T07:00:00+00:00",
"amount": 990,
"currency": "RUB"
},
{
"cycle_number": 1,
"payment_at": "2030-02-28T07:00:00+00:00",
"amount": 990,
"currency": "RUB"
},
{
"cycle_number": 2,
"payment_at": "2030-03-31T07:00:00+00:00",
"amount": 990,
"currency": "RUB"
}
]
}Подписка с первым платёжным запросом
Можно добавить save_payment_method и recurring к POST /payins/sbp. payment_url ведёт на подтверждение условий в Aeris, а subscription содержит идентификатор подписки. Для скидки на первую оплату передайте её итоговую сумму в amount, а обычную цену — в recurring.amount.
Запрос и код
# Set PUBLIC_KEY and SECRET_KEY in your environment first.
: "${PUBLIC_KEY:?Set PUBLIC_KEY}"
: "${SECRET_KEY:?Set SECRET_KEY}"
BODY='{"amount":100,"currency":"RUB","merchant_order_id":"recurring-first-10001","payer_ip":"203.0.113.10","project_url":"https://merchant.example","callback_url":"https://merchant.example/webhooks/payment","redirect_url_success":"https://merchant.example/payment/success","save_payment_method":true,"customer_id":"customer-10001","consent_granted":true,"consent_reference":"consent-10001","subscription_purpose":"Monthly access","payer_phone":"+79991234567","recurring":{"amount":990,"currency":"RUB","interval":"month","period":1,"start_at":"2030-01-31T10:00:00+03:00","timezone":"Europe/Moscow","max_payments":12,"customer_fee_percent":0,"retry_policy":{"retry_delays_seconds":[3600,86400],"on_exhausted":"pause"},"merchant_subscription_id":"subscription-first-10001"}}'
TIMESTAMP=$(date +%s)
HMAC_KEY=$(printf '%s' "$SECRET_KEY" | openssl base64 -A)
SIGNATURE=$(printf '%s' "$BODY:$TIMESTAMP++" | openssl dgst -sha256 -hmac "$HMAC_KEY" -r | cut -d ' ' -f 1)
curl --fail-with-body --request POST \
"https://aeris-psp.net/api/v1/merchant/payins/sbp" \
--header "Content-Type: application/json" \
--header "X-API-KEY: $PUBLIC_KEY" \
--header "X-TIMESTAMP: $TIMESTAMP" \
--header "X-SIGNATURE: $SIGNATURE" \
--data-raw "$BODY"{
"id": "5ce82d35-c78e-4181-b39b-e004421952ef",
"merchant_order_id": "recurring-first-10001",
"amount": 100,
"order_amount": 100,
"customer_fee_amount": 0,
"status": "pending",
"currency": "RUB",
"payment_method": "sbp",
"payment_url": "https://aeris-psp.net/checkout?session=RESPONSE_SESSION",
"next_action": null,
"payment_token": "938b3f2e-5927-4b4e-85d1-1a4b7e0c9040",
"payment_token_status": "pending",
"subscription": {
"id": "e5a0c035-bef2-48a5-b59b-035cbd877eaf",
"merchant_subscription_id": "subscription-first-10001",
"customer_id": "customer-10001",
"name": "",
"payment_token": "938b3f2e-5927-4b4e-85d1-1a4b7e0c9040",
"plan_id": null,
"terms": {
"amount": 990,
"currency": "RUB",
"interval": "month",
"period": 1,
"start_at": "2030-01-31T10:00:00+03:00",
"timezone": "Europe/Moscow",
"end_at": null,
"max_payments": 12,
"customer_fee_percent": "0",
"retry_policy": {
"retry_delays_seconds": [
3600,
86400
],
"on_exhausted": "pause"
}
},
"status": "awaiting_confirmation",
"reason": "",
"version": 1,
"paid_cycles": 0,
"initiator": "aeris",
"confirmation_url": "https://aeris-psp.net/checkout?session=RESPONSE_SESSION",
"next_payment_at": null,
"cancel_at": null,
"project_url": "https://merchant.example",
"consent_reference": "consent-10001",
"created_at": "2029-12-31T10:00:00+00:00",
"preview": [
{
"cycle_number": 0,
"payment_at": "2030-01-31T07:00:00+00:00",
"amount": 990,
"currency": "RUB"
},
{
"cycle_number": 1,
"payment_at": "2030-02-28T07:00:00+00:00",
"amount": 990,
"currency": "RUB"
},
{
"cycle_number": 2,
"payment_at": "2030-03-31T07:00:00+00:00",
"amount": 990,
"currency": "RUB"
}
]
}
}H2H без окна Aeris
Доступен после отдельного одобрения Aeris и принятия условий. В POST /recurring/subscriptions передайте confirmation_mode: merchant, явный consent_granted: true и consent_evidence. consent_reference идентифицирует ваш архив согласия; document_sha256 — SHA-256 полного документа условий, а не произвольная строка. accepted_at — исходное время согласия с часовым поясом; при повторе запроса не меняйте его. Без допуска вернётся HTTP 403.
Покажите покупателю точные суммы, период и срок в своём интерфейсе. Ответ содержит initial_payment_url для первой банковской оплаты и confirmation_url: null. Согласие мерчанта само по себе не активирует подписку: нужны успешная первая оплата СБП и активная привязка. По запросу предоставьте исходные подтверждения согласия на заявленный тариф в течение 24 часов; исключения и последствия определены принятыми условиями.
Запрос и код
# Set PUBLIC_KEY and SECRET_KEY in your environment first.
: "${PUBLIC_KEY:?Set PUBLIC_KEY}"
: "${SECRET_KEY:?Set SECRET_KEY}"
BODY='{"merchant_subscription_id":"subscription-10001","name":"Monthly access","initiator":"merchant","initial_amount":1,"customer_id":"customer-10001","terms":{"amount":990,"currency":"RUB","interval":"month","period":1,"start_at":"2030-01-31T10:00:00+03:00","timezone":"Europe/Moscow","max_payments":12,"customer_fee_percent":0,"retry_policy":{"retry_delays_seconds":[3600,86400],"on_exhausted":"pause"}},"consent_granted":true,"consent_reference":"consent-10001","payer_ip":"203.0.113.10","payer_phone":"+79991234567","project_url":"https://merchant.example","callback_url":"https://merchant.example/webhooks/payment","confirmation_mode":"merchant","consent_evidence":{"accepted_at":"2026-10-19T10:00:00+03:00","document_version":"tariff-1","document_sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}}'
TIMESTAMP=$(date +%s)
HMAC_KEY=$(printf '%s' "$SECRET_KEY" | openssl base64 -A)
SIGNATURE=$(printf '%s' "$BODY:$TIMESTAMP++" | openssl dgst -sha256 -hmac "$HMAC_KEY" -r | cut -d ' ' -f 1)
curl --fail-with-body --request POST \
"https://aeris-psp.net/api/v1/merchant/recurring/subscriptions" \
--header "Content-Type: application/json" \
--header "X-API-KEY: $PUBLIC_KEY" \
--header "X-TIMESTAMP: $TIMESTAMP" \
--header "X-SIGNATURE: $SIGNATURE" \
--data-raw "$BODY"{
"id": "e5a0c035-bef2-48a5-b59b-035cbd877eaf",
"merchant_subscription_id": "subscription-10001",
"customer_id": "customer-10001",
"name": "Monthly access",
"payment_token": "938b3f2e-5927-4b4e-85d1-1a4b7e0c9040",
"plan_id": null,
"terms": {
"amount": 990,
"currency": "RUB",
"interval": "month",
"period": 1,
"start_at": "2030-01-31T10:00:00+03:00",
"timezone": "Europe/Moscow",
"end_at": null,
"max_payments": 12,
"customer_fee_percent": "0",
"retry_policy": {
"retry_delays_seconds": [
3600,
86400
],
"on_exhausted": "pause"
}
},
"status": "awaiting_confirmation",
"reason": "",
"version": 1,
"paid_cycles": 0,
"initiator": "merchant",
"confirmation_url": null,
"next_payment_at": null,
"cancel_at": null,
"project_url": "https://merchant.example",
"consent_reference": "consent-10001",
"created_at": "2029-12-31T10:00:00+00:00",
"preview": [
{
"cycle_number": 0,
"payment_at": "2030-01-31T07:00:00+00:00",
"amount": 990,
"currency": "RUB"
},
{
"cycle_number": 1,
"payment_at": "2030-02-28T07:00:00+00:00",
"amount": 990,
"currency": "RUB"
},
{
"cycle_number": 2,
"payment_at": "2030-03-31T07:00:00+00:00",
"amount": 990,
"currency": "RUB"
}
],
"confirmation_mode": "merchant",
"initial_payment_url": "https://bank.example/sbp/enrollment"
}Уведомления и кабинет
Завершённую оплату подтверждает подписанный платёжный webhook со status: completed. Связанные платежи содержат subscription_id, invoice_id, attempt_id и payment_token. События recurring.subscription.* описывают состояние подписки, а не результат оплаты. Кабинет → Рекуррентные платежи: планы, подписки, начисления и способы оплаты; изменения защищены OTP.
GET /api/v1/merchant/recurring/settings
GET /api/v1/merchant/recurring/plans
GET /api/v1/merchant/recurring/subscriptions
GET /api/v1/merchant/recurring/invoices
GET /api/v1/merchant/recurring/auditСоздать выплатуБанковская карта в RUB и USDT в сети TRON
Метод выплаты
Банковская карта в RUB и USDT в сети TRON
Выплата на банковскую карту
Перевод рублей по номеру карты. Для создания нужны телефон и имя получателя; результат подтверждается статусом выплаты.
Передаёт сумму, уникальный номер заказа и реквизиты получателя.
С баланса резервируются выплата и комиссия. Повтор с тем же merchant_order_id не создаёт дубль.
Первичный pending означает, что запрос принят, но ещё не завершён.
completed списывает резерв окончательно; failed возвращает всю зарезервированную сумму.
failed → возвращено
Webhook
Запрос API и входящий webhook используют одну формулу, но выбор ключа отличается. Уведомления подписываются основной парой ключей проекта, даже если платёж создан дополнительным API-ключом.
- Прочитайте исходное тело запроса до JSON.parse. Не меняйте порядок полей, пробелы или Unicode перед проверкой подписи.
- Сверьте X-API-KEY с основным public_key проекта. HMAC вычисляйте с основным secret_key и X-TIMESTAMP из заголовка.
- Сравнивайте подписи безопасным сравнением. После проверки сохраните X-Event-ID и обработайте событие один раз.
- Ответьте HTTP 2xx после надёжного сохранения события. На повторный X-Event-ID также ответьте 2xx, без повторной выдачи заказа.
body = raw_request_body_utf8
timestamp = header["X-TIMESTAMP"]
message = body + ":" + timestamp + "++"
signature = hex(hmac_sha256(base64(primary_secret_key), message))
X-API-KEY: <primary_public_key>
X-TIMESTAMP: <unix_seconds>
X-SIGNATURE: <signature>
X-Event-ID: <event_id>POST на callback_url заказа или webhook проекта.
Основная пара ключей + исходное тело + X-TIMESTAMP.
X-Event-ID защищает от повторной обработки. completed подтверждает оплату.
Потеря ответа может привести к повторной доставке того же события, не к новой оплате.
Операции
Здесь только чтение общего состояния. Создание платежей и выплат описано в разделах конкретных методов выше.
Платежи
Получить одну операцию, реестр с фильтром или XLSX-выгрузку.
GET /api/v1/merchant/transactions/{transaction_id}
GET /api/v1/merchant/transactions?page_number=1&items_per_page=50&status=completed
GET /api/v1/merchant/transactions/export?status=completedВыплаты
Получить одну выплату по локальному или внешнему ID либо список с фильтром по статусу.
GET /api/v1/merchant/payouts/{payout_id}
GET /api/v1/merchant/payouts?page_number=1&items_per_page=50
GET /api/v1/merchant/payouts?page_number=1&items_per_page=50&status=pendingБаланс и время
Проверить доступный и зарезервированный баланс либо синхронизировать timestamp для подписи.
GET /api/v1/merchant/balance GET /api/v1/merchant/timestamp
Проверка перед запуском
Проверьте оба направления связи до подключения реального трафика.
- Тестовый запрос подписан на backend, ключ не попал в браузер или репозиторий.
- После оплаты заказ подтверждается по completed, а не по redirect_url_success.
- Одинаковый webhook дважды не выдаёт товар и не меняет ваш баланс повторно.
- После таймаута сначала проверяется существующая заявка; новая с другим номером не создаётся вслепую.
- Отклонение, истечение срока и необходимость 3DS обработаны; интерфейс проверен на телефоне.
Если запрос не прошёл
401- Проверьте пару ключей, исходящий IP backend, Unix-секунды и подписанное тело. GET /timestamp тоже требует авторизации.
422- Сверьте названия и форматы полей с выбранным методом. Не копируйте настройки другого сценария.
409 / таймаут- Найдите существующую операцию по вашему номеру заказа. Не создавайте повторное списание до выяснения результата.