Платежи

Все суммы — целые числа в копейках. Валюта — только RUB.

Создать платёж

POST https://pay.egnetwork.ru/api/v1/payments

ПолеТипОбяз.Описание
amountintegerдаСумма в копейках, от 100 (1 ₽) до 1000000000 (10 млн ₽)
order_idstringдаВаш ID заказа, до 64 символов [A-Za-z0-9._:-]. Уникален в пределах сервиса и режима — это ключ идемпотентности
descriptionstringдаЧто оплачивает пользователь, до 140 символов. Показывается на странице оплаты и в банке
return_urlstring (URL)нетКуда вернуть пользователя после оплаты. https, хост должен быть в allowed_return_hosts сервиса (если список задан)
webhook_urlstring (URL)нетПереопределить URL вебхука для этого платежа (только https). По умолчанию — URL из настроек сервиса
methods("sbp" | "card")[]нетСпособы оплаты. По умолчанию ["sbp","card"]. ["sbp"] — только QR
expires_inintegerнетСколько секунд платёж ждёт оплаты: 300…604800. По умолчанию 3600
customer.emailstringодно из двухEmail покупателя. На него банк отправит чек 54-ФЗ
customer.phonestringодно из двухТелефон покупателя +79991234567. На него банк отправит чек 54-ФЗ
receiptobjectнетЧек 54-ФЗ, см. ниже
metadataobjectнетДо 20 пар string → string (ключ ≤ 40, значение ≤ 500 символов). Возвращается в объекте и вебхуках

Ответ: 201 Created с объектом платежа. Если платёж с этим order_id уже есть и сумма совпадает — 200 OK с существующим платежом (повтор безопасен).

const res = await fetch("https://pay.egnetwork.ru/api/v1/payments", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.EGN_PAY_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    amount: 49900,
    order_id: `order-${order.id}`,
    description: "Подписка Pro на 1 месяц",
    return_url: "https://example.egnetwork.ru/billing/done",
    customer: { email: user.email },
    metadata: { user_id: String(user.id) },
  }),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const payment = await res.json();
return Response.redirect(payment.payment_url, 302);
import os, requests

r = requests.post(
    "https://pay.egnetwork.ru/api/v1/payments",
    headers={"Authorization": f"Bearer {os.environ['EGN_PAY_KEY']}"},
    json={
        "amount": 49900,
        "order_id": f"order-{order.id}",
        "description": "Подписка Pro на 1 месяц",
        "return_url": "https://example.egnetwork.ru/billing/done",
        "customer": {"email": user.email},
    },
    timeout=20,
)
r.raise_for_status()
payment_url = r.json()["payment_url"]

Идемпотентность

order_id гарантирует, что двойной клик или ретрай после таймаута не создаст второй платёж:

СитуацияОтвет
order_id новый201, новый платёж
order_id есть, сумма та же, платёж pending/succeeded/…200, существующий платёж
order_id есть, сумма другая409 order_id_conflict
order_id есть, платёж failed/expired/canceled409 order_closed — создайте платёж с новым order_id, например order-1042-2

Получить платёж

GET https://pay.egnetwork.ru/api/v1/payments/{id}

Используйте как источник правды, если вебхук не дошёл, или для проверки при возврате пользователя на return_url.

Список платежей

GET https://pay.egnetwork.ru/api/v1/payments?order_id=&status=&limit=20&starting_after=

ПараметрОписание
order_idНайти платёж по вашему ID заказа
statusФильтр по статусу
limit1…100, по умолчанию 20
starting_afterID последнего платежа предыдущей страницы
{ "object": "list", "data": [ { "id": "pay_…" } ], "has_more": false }

Отменить платёж

POST https://pay.egnetwork.ru/api/v1/payments/{id}/cancel — только для pending. После отмены QR перестаёт работать, приходит вебхук payment.canceled.

Вернуть деньги

POST https://pay.egnetwork.ru/api/v1/payments/{id}/refund

{ "amount": 10000 }

amount необязателен — без него возвращается весь остаток. Можно делать несколько частичных возвратов. Статус станет partially_refunded или refunded, придёт вебхук с тем же именем. refunded_amount показывает сумму всех возвратов.

Статусы

СтатусФинальныйЗначение
pendingнетОжидает оплаты
succeeded—Оплачен. Можно выдавать товар
failedдаБанк отклонил оплату
expiredдаИстёк expires_in, оплаты не было
canceledдаОтменён через API или админку
partially_refundedнетОплачен, часть суммы возвращена
refundedдаВся сумма возвращена
pending ──▶ succeeded ──▶ partially_refunded ──▶ refunded
   │             └──────────────────────────────▶ refunded
   ├──▶ failed
   ├──▶ expired
   └──▶ canceled

Редкий случай: если банк подтвердит оплату уже после того, как платёж стал expired/failed, статус сменится на succeeded и придёт вебхук payment.succeeded. Деньги важнее таймеров — обработайте такой вебхук как обычную оплату.

Чеки 54-ФЗ

Если к терминалу подключена онлайн-касса, Т-Банк ждёт чек. Два варианта:

Автоматически. Если администратор выбрал систему налогообложения (админка → Терминал), EGN Pay сам сформирует чек из одной позиции: description, amount, предмет расчёта «услуга», способ «полный расчёт». Чек уходит на customer.email или customer.phone — поэтому одно из этих полей обязательно в каждом платеже. Без контакта запрос вернёт 422 validation_error.

Явно — передайте receipt:

{
  "amount": 59800,
  "order_id": "order-77",
  "description": "Заказ №77",
  "customer": { "email": "user@example.com" },
  "receipt": {
    "taxation": "usn_income",
    "items": [
      { "name": "Подписка Pro", "price": 49900, "quantity": 1, "tax": "none" },
      { "name": "Доп. слот", "price": 9900, "quantity": 1, "tax": "none", "payment_object": "service" }
    ]
  }
}
ПолеОписание
taxationosn, usn_income, usn_income_outcome, envd, esn, patent
email / phoneКуда отправить чек. По умолчанию из customer
items[].nameНазвание, до 128 символов
items[].priceЦена за единицу, копейки
items[].quantityКоличество
items[].amountСтоимость позиции. По умолчанию price × quantity
items[].taxnone, vat0, vat5, vat7, vat10, vat20, vat22, vat105, vat107, vat110, vat120, vat122
items[].payment_methodПо умолчанию full_payment
items[].payment_objectПо умолчанию service

Сумма items[].amount должна равняться amount, иначе 422 receipt_mismatch.

Объект платежа

{
  "id": "pay_8fK2mQ1xZbY7cV3nT0aR",
  "object": "payment",
  "livemode": true,
  "status": "succeeded",
  "amount": 49900,
  "refunded_amount": 0,
  "currency": "RUB",
  "description": "Подписка Pro на 1 месяц",
  "order_id": "order-1042",
  "methods": ["sbp", "card"],
  "customer": { "email": "user@example.com", "phone": null },
  "metadata": { "user_id": "u_123" },
  "payment_url": "https://pay.egnetwork.ru/p/pay_8fK2mQ1xZbY7cV3nT0aR",
  "return_url": "https://example.egnetwork.ru/billing/done",
  "expires_at": "2026-10-27T13:00:00.000Z",
  "paid_at": "2026-10-27T12:03:41.512Z",
  "created_at": "2026-10-27T12:00:00.000Z",
  "updated_at": "2026-10-27T12:03:41.512Z"
}

Markdown-версия этой страницы: /docs/payments.md