Документация для автоматизации работы с заказами Zenpayments
Для работы с API вам понадобится личный кабинет. Если у вас его ещё нет, зарегистрируйтесь на сайте zenpayments.ru.
API позволяет автоматизировать работу с заказами: создавать, редактировать, проверять статус и удалять.
По всем вопросам работы API обращайтесь в чат поддержки или на почту support@zenpayments.ru.
При создании заказа, вы будете указывать один или несколько платёжных методов, которые будут доступны покупателю. Каждый метод это сочетание трёх параметров: method, gateway, terms. Чтобы разобраться, какие параметры следует использовать в вашем случае, используйте следующую таблицу:
| Платёжный метод | Поле method | Поле gateway | Поле terms |
|---|---|---|---|
| Эквайринг (оплата картой или СБП) | 1 | null | null |
| Банковская рассрочка (Т-Банк) [3 месяца] | 2 | 11 | 1 |
| Банковская рассрочка (Т-Банк) [6 месяцев] | 2 | 11 | 2 |
| Банковская рассрочка (Т-Банк) [10 месяцев] | 2 | 11 | 3 |
| Банковская рассрочка (Т-Банк) [12 месяцев] | 2 | 11 | 4 |
| Банковская рассрочка (Т-Банк) [18 месяцев] | 2 | 11 | 5 |
| Банковская рассрочка (Т-Банк) [24 месяца] | 2 | 11 | 6 |
| Банковская рассрочка (Т-Банк) [36 месяцев] | 2 | 11 | 7 |
| Банковская рассрочка с переплатой на покупателе (Т-Банк) [3 месяца] | 2 | 12 | 8 |
| Банковская рассрочка с переплатой на покупателе (Т-Банк) [6 месяцев] | 2 | 12 | 9 |
| Банковская рассрочка с переплатой на покупателе (Т-Банк) [9 месяцев] | 2 | 12 | 15 |
| Банковская рассрочка с переплатой на покупателе (Т-Банк) [10 месяцев] | 2 | 12 | 10 |
| Банковская рассрочка с переплатой на покупателе (Т-Банк) [12 месяцев] | 2 | 12 | 11 |
| Банковская рассрочка с переплатой на покупателе (Т-Банк) [15 месяцев] | 2 | 12 | 16 |
| Банковская рассрочка с переплатой на покупателе (Т-Банк) [18 месяцев] | 2 | 12 | 12 |
| Банковская рассрочка с переплатой на покупателе (Т-Банк) [24 месяца] | 2 | 12 | 13 |
| Банковская рассрочка с переплатой на покупателе (Т-Банк) [28 месяцев] | 2 | 12 | 17 |
| Банковская рассрочка с переплатой на покупателе (Т-Банк) [30 месяцев] | 2 | 12 | 18 |
| Банковская рассрочка с переплатой на покупателе (Т-Банк) [36 месяцев] | 2 | 12 | 14 |
| Банковская рассрочка (Сбер) [все сроки в одном окне] | 2 | 6 | null |
| Банковская рассрочка (Сбер) [6 месяцев] | 2 | 6 | 2 |
| Банковская рассрочка (Сбер) [10 месяцев] | 2 | 6 | 3 |
| Банковская рассрочка (Сбер) [12 месяцев] | 2 | 6 | 4 |
| Банковская рассрочка (Сбер) [18 месяцев] | 2 | 6 | 5 |
| Банковская рассрочка (Сбер) [24 месяца] | 2 | 6 | 6 |
| Банковская рассрочка (Сбер) [36 месяцев] | 2 | 6 | 7 |
| Банковская рассрочка (Сбер) [все сроки в одном окне, повышенные себестоимость и одобрение] | 2 | 10 | null |
| Банковская рассрочка (Сбер) [6 месяцев] [повышенные себестоимость и одобрение] | 2 | 10 | 2 |
| Банковская рассрочка (Сбер) [10 месяцев] [повышенные себестоимость и одобрение] | 2 | 10 | 3 |
| Банковская рассрочка (Сбер) [12 месяцев] [повышенные себестоимость и одобрение] | 2 | 10 | 4 |
| Банковская рассрочка (Сбер) [18 месяцев] [повышенные себестоимость и одобрение] | 2 | 10 | 5 |
| Банковская рассрочка (Сбер) [24 месяца] [повышенные себестоимость и одобрение] | 2 | 10 | 6 |
| Банковская рассрочка (Сбер) [36 месяцев] [повышенные себестоимость и одобрение] | 2 | 10 | 7 |
| Банковская рассрочка (ОТП) [все сроки в одном окне] | 2 | 9 | null |
| Банковская рассрочка (ОТП) [3 месяца] | 2 | 9 | 1 |
| Банковская рассрочка (ОТП) [6 месяцев] | 2 | 9 | 2 |
| Банковская рассрочка (ОТП) [8 месяцев] | 2 | 9 | 19 |
| Банковская рассрочка (ОТП) [10 месяцев] | 2 | 9 | 3 |
| Банковская рассрочка (ОТП) [12 месяцев] | 2 | 9 | 4 |
| Банковская рассрочка (ОТП) [18 месяцев] | 2 | 9 | 5 |
| Банковская рассрочка (ОТП) [24 месяца] | 2 | 9 | 6 |
| Банковская рассрочка (ОТП) [30 месяцев] | 2 | 9 | 20 |
| Банковская рассрочка (ОТП) [36 месяцев] | 2 | 9 | 7 |
| Оплата в кредит (Т-Банк) | 3 | 11 | 0 |
| Оплата в кредит (Сбер) | 3 | 15 | 0 |
| BNPL (+7pay) | 4 | 5 | null |
| BNPL (Plait) | 4 | 7 | null |
| BNPL (Яндекс.Сплит) | 4 | 8 | null |
| BNPL (Долями) | 4 | 14 | null |
Для создания платёжного метода "Внутренняя рассрочка" или "Подписка" также используется определённый набор параметров. Под внутренней рассрочкой подразумевается небанковская рассрочка, т.е. просто разбиение одного платежа на несколько, с автоматическим списанием с карты.
Под подпиской имеется в виду условно-бесконечные списания с заданной периодичностью. Минимальный период между платежами — 1 день. Максимальный период между платежами — 1 год. Для вашего удобства собрали таблицу с некоторыми популярными сочетаниями настроек:
| Вид рекуррента | method | gateway | terms | is_recurring | is_subscription | custom_first_payment_amount | period | interval | max_payments |
|---|---|---|---|---|---|---|---|---|---|
| Подписка, списание раз в месяц | 1 | null | null | true | true | null | 1 | 5 | null |
| Подписка, списание раз в три месяца | 1 | null | null | true | true | null | 3 | 5 | null |
| Подписка, списание раз в неделю | 1 | null | null | true | true | null | 1 | 4 | null |
| Подписка, списание раз в две недели | 1 | null | null | true | true | null | 2 | 4 | null |
| Подписка, списание раз в сутки | 1 | null | null | true | true | null | 1 | 3 | null |
| Подписка, списание раз в пять дней | 1 | null | null | true | true | null | 5 | 3 | null |
| Подписка, списание раз в год | 1 | null | null | true | true | null | 1 | 6 | null |
| Внутренняя рассрочка, списание раз в месяц, всего 6 платежей | 1 | null | null | true | false | null | 1 | 5 | 6 |
| Внутренняя рассрочка, списание раз в две недели, всего 12 платежей | 1 | null | null | true | false | null | 2 | 4 | 12 |
| Подписка, списание раз в месяц, но первый платёж отличается от последующих | 1 | null | null | true | true | 5000 | 1 | 5 | null |
Чтобы взаимодействовать с API, вам понадобится выпустить токен. Это можно сделать в личном кабинете, кликнув по выпадающему меню в левом нижнем углу и перейдя в раздел API токены.
Количество выпущенных токенов не ограничено. Мы рекомендуем выпускать отдельные токены для разных интеграций. Обратите внимание, что к токену следует относиться как к паролю: не сообщайте его посторонним, т.к. с использованием вашего токена можно вносить изменения в ваш аккаунт.
Выпущенный токен можно протестировать прямо на этом сайте, с помощью кнопок "Отправить запрос".
Мы также сделали отдельную страницу с разными примерами, чтобы упростить вам старт.
Все запросы отправляются по https с использованием одного из следующих методов: GET, POST, PUT, DELETE. API поддерживает запросы с Content-type: application/json. Вот пример запроса с использованием curl:
curl -X GET "https://zenpayments.ru/api/v1/orders/{order_number}" \
-H "Accept: application/json" \
-H "Authorization: Bearer [TOKEN]" \
В этом примере:
GET это http-метод. У каждого эндпоинта в документации указано, какой метод следует использоватьzenpayments.ru это адрес нашего сервера. В будущем мы оставляем за собой право добавлять новые адреса серверов и отключать старыеapi/v1 это префикс, сигнализирующий о том, какую версию API вы используете. В данный момент, доступна только одна версияorders/{order_number} это название метода, который вы вызываете. Названия всех методов есть в соответствующих разделах документации[TOKEN] это токен, сгенерированный в настройках вашей школыВ ответ на любой запрос сервер вернет либо ответ с кодом 200 / 201, либо ошибку с кодами 4xx или 5xx.
У методов API действует ограничение на количество запросов.
В данный момент, ограничение одинаковое для всех методов: 60 запросов в минуту с одного IP-адреса.
Если вы превысите ограничение, на последующие запросы сервер будет возвращать ответ с кодом 429.
Любой запрос может вернуть ошибку. Бывают ошибки общего вида, а бывают специфические для конкретного эндпоинта.
Ошибки с http-кодом 5xx означают, что серверу не удалось обработать запрос. Следует повторить попытку позже.
Ошибки с http-кодом 4xx означают, что запрос обработан успешно, поэтому нужно смотреть на конкретный код и тело ответа, чтобы разобраться, что пошло не так. Типовые причины ошибок это неправильный токен, ошибка в URL или входных параметрах.
// HTTP/1.1 404 Not Found
{
"message": "Not found",
}
// HTTP/1.1 422 Unprocessable Entity
{
"message": "Поле customer last name обязательно. (and 1 more error)",
"errors": {
"customer_last_name": [
"Поле customer last name обязательно."
],
"customer_first_name": [
"Поле customer first name обязательно."
]
}
}
Поле message содержит пояснение ошибки. В зависимости от вида ошибки, в ответе могут содержаться и другие поля.
Мы можем отправлять вебхуки вашим сервисам с целью уведомления о событиях. Ниже описаны технические детали реализации механизма отправки. Чтобы мы отправляли вам вебхуки, заполните поле callback_url при создании заказа.
POST200 OK)200 OK, иначе считается неудачным. Тело ответа может быть любымДля обеспечения идемпотентности в теле запроса передаётся уникальный id события. Получатель может использовать этот идентификатор для предотвращения повторной обработки одного и того же события.
В запросе присутствует заголовок:
Signature — подпись, которую следует использовать для проверки подлинности отправителя и целостности данных.Получив запрос, вы можете проверить, действительно ли отправителем являемся мы. Пример проверки на языке PHP:
function exampleValidator(\Symfony\Component\HttpFoundation\Request $request): bool
{
$signature = $request->headers->get('Signature');
$secret = 'Ваш секретный ключ';
$body = $request->getContent();
$payloadJson = json_encode($body);
$hash = hash_hmac('sha256', $payloadJson, $secret);
return hash_equals($signature, $hash);
}
Мы рекомендуем всегда проверять подлинность запросов, хотя окончательное решение остаётся за вами.
Секретный ключ для проверки подписи можно взять в разделе "Компании", кликнув по конкретному ИНН. Если в вашем аккаунте добавлено несколько компаний, обратите внимание, что у каждой компании будет свой ключ.
POST /webhook-endpoint HTTP/1.1
Host: your-server-example.org
Content-Type: application/json
Signature: abcdef123456...
{
"id": "5aWTnvn70JEEVVLCMNcSwhfbvv8pxj1m",
"timestamp": "1748595629",
"event": "payment.accepted",
"payload": {
"paid_at": 1748595629,
"payment_number": "P-1-20429693492658176",
"amount_paid": 10000,
"amount_commission": 450,
"currency_code": "RUB",
"payment_method": 1,
"payment_gateway": null,
"payment_terms": null,
"order_number": "ZP-1-20429651037913088",
"order_id_client": null,
"invoice_number": "INV-1-20429693375217664",
"next_payment_at": null,
"customer_last_name": "Пушкин",
"customer_first_name": "Александр",
"customer_middle_name": "Сергеевич",
"customer_email": "alex@example.org",
"customer_phone": null,
"order_positions": [
{
"content": "Оплата доступа к курсу",
"quantity": 1,
"vat_code_id": 1,
"price": 10000,
"price_discounted": 10000
}
],
"pan4": "1111"
}
}
| Событие | Описание события |
|---|---|
| payment.proceeded_to_gateway | Покупатель перешёл к оплате |
| payment.accepted | Покупатель успешно оплатил заказ |
| invoice.autopayment_failed | Не удалось списать автоплатёж |
| bank_credit.status_changed | Изменился статус по заявке на кредит/рассрочку |
| order.created | Заказ создан |
| refund.created | Возврат проведён |
Содержимое каждого вебхука есть в примерах на отдельной странице.
Для тестирования оплаты в тестовой среде можно использовать специальную карту, с которой всегда будут успешно "списываться" деньги. Обратите внимание, что это сработает только в тестовой среде по адресу sandbox.zenpayments.ru.
Тестовая карта работает только с платёжным методом "Эквайринг".
Для авторизации, включите в запрос заголовок Authorization со значением "Bearer {YOUR_AUTH_KEY}".
Создать токен можно в личном кабинете, кликнув по выпадающему меню в левом нижнем углу и перейдя в раздел API токены.
ID заказа
curl --request GET \
--get "https://zenpayments.ru/api/v1/orders/ZP-1-17875508976943104" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"order_number": "ZP-1-19320990123163648",
"order_id_client": null,
"checkout_url": "https://zenpayments.ru/orders/ZP-1-19320990123163648/checkout?signature=abcdef123456",
"created_at": "27.05.2025 10:34",
"payment_amount": 10000,
"payment_amount_paid": 0,
"payment_amount_refunded": 0,
"currency_code": "RUB",
"customer_last_name": "Пушкин",
"customer_first_name": "Александр",
"customer_middle_name": null,
"customer_email": "alex@example.org",
"customer_phone": null,
"return_url": null,
"success_url": null,
"fail_url": null,
"callback_url": null,
"status": 1,
"is_subscription": false,
"is_deletable": false,
"team_requisite_id": 1
}
В случае успеха, в ответе вы получите такой же объект, как при просмотре статуса заказа.
curl --request POST \
"https://zenpayments.ru/api/v1/orders/store" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"order_id_client\": \"123\",
\"customer_last_name\": \"Пушкин\",
\"customer_first_name\": \"Александр\",
\"customer_middle_name\": \"Сергеевич\",
\"customer_email\": \"alex@example.org\",
\"customer_phone\": \"+79991111111\",
\"is_subscription\": true,
\"team_requisite_id\": 1,
\"methods\": [
{
\"name\": \"Оплата картой\",
\"method\": 1
}
],
\"return_url\": \"https:\\/\\/example.org\\/return\",
\"success_url\": \"https:\\/\\/example.org\\/success\",
\"fail_url\": \"https:\\/\\/example.org\\/fail\",
\"callback_url\": \"https:\\/\\/example.org\\/callback\",
\"positions\": [
{
\"content\": \"Оплата доступа к курсу\",
\"price\": 1999.99,
\"quantity\": 1,
\"vat_code_id\": 1
}
]
}"
{
"order_number": "ZP-1-19320990123163648",
"order_id_client": null,
"checkout_url": "https://zenpayments.ru/orders/ZP-1-19320990123163648/checkout?signature=abcdef123456",
"created_at": "27.05.2025 10:34",
"payment_amount": 10000,
"payment_amount_paid": 0,
"payment_amount_refunded": 0,
"currency_code": "RUB",
"customer_last_name": "Пушкин",
"customer_first_name": "Александр",
"customer_middle_name": null,
"customer_email": "alex@example.org",
"customer_phone": null,
"return_url": null,
"success_url": null,
"fail_url": null,
"callback_url": null,
"status": 1,
"is_subscription": false,
"is_deletable": false,
"team_requisite_id": 1
}
Метод позволяет отредактировать все, либо некоторые поля заказа. Если заказ находится в статусе "Новый", можно редактировать любые поля. Если заказ находится в статусе "Ожидает оплаты", можно отредактировать только следующие поля: return_url, success_url, fail_url, callback_url. Если заказ уже оплачен, его редактирование недоступно.
ID заказа
curl --request PUT \
"https://zenpayments.ru/api/v1/orders/ZP-1-17875508976943104" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"order_id_client\": \"123\",
\"customer_last_name\": \"Пушкин\",
\"customer_first_name\": \"Александр\",
\"customer_middle_name\": \"Сергеевич\",
\"customer_email\": \"alex@example.org\",
\"customer_phone\": \"+79991111111\",
\"is_subscription\": true,
\"team_requisite_id\": 1,
\"methods\": [
{
\"name\": \"Оплата картой\",
\"method\": 1
}
],
\"return_url\": \"https:\\/\\/example.org\\/return\",
\"success_url\": \"https:\\/\\/example.org\\/success\",
\"fail_url\": \"https:\\/\\/example.org\\/fail\",
\"callback_url\": \"https:\\/\\/example.org\\/callback\",
\"positions\": [
{
\"content\": \"Оплата доступа к курсу\",
\"price\": 1999.99,
\"quantity\": 1,
\"vat_code_id\": 1
}
]
}"
{
"is_updated": true
}
Удаление доступно только для заказов в статусе "Новый".
ID заказа
curl --request DELETE \
"https://zenpayments.ru/api/v1/orders/ZP-1-17875508976943104" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"is_deleted": true
}
В случае успеха, в ответе вы получите список (массив) объектов, по структуре полностью совпадающих с объектом "Инвойс"
ID заказа
curl --request GET \
--get "https://zenpayments.ru/api/v1/orders/ZP-1-17875508976943104/invoices" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" [
{
"invoice_number": "INV-1-64641117273980928",
"created_at": "26.05.2025 11:17",
"has_recurring_cancelled": false,
"has_recurring_failed": false,
"amount": 10000,
"amount_paid": 0,
"currency_code": "RUB",
"payments_count": 0
},
{
"invoice_number": "INV-1-17558155068178432",
"created_at": "27.05.2025 10:34",
"has_recurring_cancelled": false,
"has_recurring_failed": false,
"amount": 10000,
"amount_paid": 10000,
"currency_code": "RUB",
"payments_count": 1
}
]
ID инвойса
curl --request GET \
--get "https://zenpayments.ru/api/v1/invoices/INV-1-17558155068178432" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"invoice_number": "INV-1-17558155068178432",
"created_at": "27.05.2025 10:34",
"has_recurring_cancelled": false,
"has_recurring_failed": false,
"amount": 10000,
"amount_paid": 10000,
"amount_refunded": 0,
"currency_code": "RUB",
"payments_count": 1
}
ID инвойса
curl --request POST \
"https://zenpayments.ru/api/v1/invoices/INV-1-17558155068178432/autopayment-disable" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"message": "OK"
}
ID инвойса
curl --request POST \
"https://zenpayments.ru/api/v1/invoices/INV-1-17558155068178432/autopayment-enable" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"message": "OK"
}
Для оформления возврата вам нужно знать номер платежа и id позиций в чеке. Номер платежа
вы можете узнать в ЛК, либо поймав вебхук payment.accepted.
Список позиций в чеке (и их id) вы можете узнать, выполнив запрос методом "Список возвратов
по платежу". См. поле receipt_positions.
Обратите внимание, что оформление возвратов сейчас работает только для платёжного метода «Эквайринг» и только по платежам, прошедшим менее года назад.
При успешном возврате, покупатель получит средства на карту в течение нескольких дней. Также будет выбит чек возврата прихода.
Используйте метод, чтобы убедиться, что возврат был зарегистрирован, либо что возвратов вы ещё не делали. Также для того, чтобы получить список позиций чека: их id нужны будут при создании возврата.
ID платежа
curl --request GET \
--get "https://zenpayments.ru/api/v1/payments/P-1-17875508976943104/refunds" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"refunds": [
{
"refund_number": "RF-1-103019033699287040",
"created_at": "27.05.2025 10:34",
"amount": 5000,
"currency_code": "RUB"
},
{
"refund_number": "RF-1-103019033703481346",
"created_at": "28.05.2025 21:01",
"amount": 3000,
"currency_code": "RUB"
}
],
"receipt_positions": [
{
"id": 2345,
"content": "Доступ к онлайн-курсу",
"amount_paid": 8000,
"amount_refunded": 8000,
"quantity": 1
}
]
}
curl --request GET \
--get "https://zenpayments.ru/api/v1/refunds/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"refund_number": "RF-1-19320990123163648",
"created_at": "27.05.2025 10:34",
"amount": 10000,
"currency_code": "RUB"
}
В случае успеха, в ответе вы получите такой же объект, как при просмотре статуса возврата.
ID платежа
curl --request POST \
"https://zenpayments.ru/api/v1/payments/P-1-17875508976943104/refund" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"receipt_positions\": [
{
\"id\": 1,
\"amount\": 1999.99
}
]
}"
{
"refund_number": "RF-1-19320990123163648",
"created_at": "27.05.2025 10:34",
"amount": 10000,
"currency_code": "RUB"
}