Документация API Zenpayments

Postman collection → OpenAPI spec →

Документация для автоматизации работы с заказами 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 при создании заказа.

Метод отправки

  • HTTP-метод: POST
  • Таймаут ответа: 5 секунд
  • Количество попыток: до 5 (если не получен ответ с кодом 200 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.

Тестовая карта работает только с платёжным методом "Эквайринг".

  • Номер карты: 4762085995973998
  • Срок: 12/24
  • Код CVC: 111 Код 3DSec: 111111

Авторизация запросов

Для авторизации, включите в запрос заголовок Authorization со значением "Bearer {YOUR_AUTH_KEY}".

Создать токен можно в личном кабинете, кликнув по выпадающему меню в левом нижнем углу и перейдя в раздел API токены.

Заказы

Статус заказа

GET
https://zenpayments.ru
/api/v1/orders/{order_number}
requires authentication

Заголовки

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Параметры URL

order_number
string
required

ID заказа

Example:
ZP-1-17875508976943104

Поля ответа

Пример запроса:
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
}
{
    "message": "Forbidden"
}
{
    "message": "Not found"
}

Создать заказ

POST
https://zenpayments.ru
/api/v1/orders/store
requires authentication

В случае успеха, в ответе вы получите такой же объект, как при просмотре статуса заказа.

Заголовки

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Параметры тела запроса (body)

Пример запроса:
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
}
{
    "message": "Forbidden"
}
{
    "message": "Not found"
}
{
    "message": "Поле customer last name обязательно. (and 1 more error)",
    "errors": {
        "customer_last_name": [
            "Поле customer last name обязательно."
        ],
        "customer_first_name": [
            "Поле customer first name обязательно."
        ]
    }
}

Редактировать заказ

PUT
https://zenpayments.ru
/api/v1/orders/{order_number}
requires authentication

Метод позволяет отредактировать все, либо некоторые поля заказа. Если заказ находится в статусе "Новый", можно редактировать любые поля. Если заказ находится в статусе "Ожидает оплаты", можно отредактировать только следующие поля: return_url, success_url, fail_url, callback_url. Если заказ уже оплачен, его редактирование недоступно.

Заголовки

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Параметры URL

order_number
string
required

ID заказа

Example:
ZP-1-17875508976943104

Параметры тела запроса (body)

Пример запроса:
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
}
{
    "is_updated": false
}
{
    "message": "Forbidden"
}
{
    "message": "Not found"
}
{
    "message": "Поле customer last name обязательно. (and 1 more error)",
    "errors": {
        "customer_last_name": [
            "Поле customer last name обязательно."
        ],
        "customer_first_name": [
            "Поле customer first name обязательно."
        ]
    }
}

Удалить заказ

DELETE
https://zenpayments.ru
/api/v1/orders/{order_number}
requires authentication

Удаление доступно только для заказов в статусе "Новый".

Заголовки

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Параметры URL

order_number
string
required

ID заказа

Example:
ZP-1-17875508976943104
Пример запроса:
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
}
{
    "is_deleted": false
}
{
    "message": "Forbidden"
}
{
    "message": "Not found"
}

Список инвойсов

GET
https://zenpayments.ru
/api/v1/orders/{order_number}/invoices
requires authentication

В случае успеха, в ответе вы получите список (массив) объектов, по структуре полностью совпадающих с объектом "Инвойс"

Заголовки

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Параметры URL

order_number
string
required

ID заказа

Example:
ZP-1-17875508976943104
Пример запроса:
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
    }
]
{
    "message": "Forbidden"
}
{
    "message": "Not found"
}

Инвойсы

Статус инвойса

GET
https://zenpayments.ru
/api/v1/invoices/{invoice_number}
requires authentication

Заголовки

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Параметры URL

invoice_number
string
required

ID инвойса

Example:
INV-1-17558155068178432

Поля ответа

Пример запроса:
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
}
{
    "message": "Forbidden"
}
{
    "message": "Not found"
}

Отключить автоплатёж

POST
https://zenpayments.ru
/api/v1/invoices/{invoice_number}/autopayment-disable
requires authentication

Заголовки

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Параметры URL

invoice_number
string
required

ID инвойса

Example:
INV-1-17558155068178432

Поля ответа

Пример запроса:
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"
}
{
    "message": "Forbidden"
}
{
    "message": "Not found"
}

Включить автоплатёж

POST
https://zenpayments.ru
/api/v1/invoices/{invoice_number}/autopayment-enable
requires authentication

Заголовки

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Параметры URL

invoice_number
string
required

ID инвойса

Example:
INV-1-17558155068178432

Поля ответа

Пример запроса:
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"
}
{
    "message": "Forbidden"
}
{
    "message": "Not found"
}

Возвраты

Для оформления возврата вам нужно знать номер платежа и id позиций в чеке. Номер платежа вы можете узнать в ЛК, либо поймав вебхук payment.accepted.

Список позиций в чеке (и их id) вы можете узнать, выполнив запрос методом "Список возвратов по платежу". См. поле receipt_positions.

Обратите внимание, что оформление возвратов сейчас работает только для платёжного метода «Эквайринг» и только по платежам, прошедшим менее года назад.

При успешном возврате, покупатель получит средства на карту в течение нескольких дней. Также будет выбит чек возврата прихода.

Список возвратов по платежу

GET
https://zenpayments.ru
/api/v1/payments/{payment_number}/refunds
requires authentication

Используйте метод, чтобы убедиться, что возврат был зарегистрирован, либо что возвратов вы ещё не делали. Также для того, чтобы получить список позиций чека: их id нужны будут при создании возврата.

Заголовки

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Параметры URL

payment_number
string
required

ID платежа

Example:
P-1-17875508976943104

Поля ответа

Пример запроса:
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
        }
    ]
}
{
    "message": "Forbidden"
}
{
    "message": "Not found"
}

Статус возврата

GET
https://zenpayments.ru
/api/v1/refunds/{refund_number}
requires authentication

Заголовки

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Параметры URL

refund_number
string
required
Example:
architecto

Поля ответа

Пример запроса:
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"
}
{
    "message": "Forbidden"
}
{
    "message": "Not found"
}

Провести возврат

POST
https://zenpayments.ru
/api/v1/payments/{payment_number}/refund
requires authentication

В случае успеха, в ответе вы получите такой же объект, как при просмотре статуса возврата.

Заголовки

Authorization
Example:
Bearer {YOUR_AUTH_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Параметры URL

payment_number
string
required

ID платежа

Example:
P-1-17875508976943104

Параметры тела запроса (body)

Пример запроса:
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"
}
{
    "message": "Forbidden",
    "explanation": "На балансе недостаточно средств"
}
{
    "message": "Forbidden",
    "explanation": "Функция возврата недоступна для данного платёжного шлюза."
}
{
    "message": "Forbidden",
    "explanation": "Функция возврата недоступна для платежей, совершённых более года назад"
}
{
    "message": "Forbidden"
}
{
    "message": "Not found"
}
{
    "message": "Поле receipt positions обязательно.",
    "errors": {
        "receipt_positions": [
            "Поле receipt positions обязательно."
        ]
    }
}