Перейти к основному содержимому

API выставления счетов

Invoice API позволяет создать одноразовую или многоразовую ссылку на оплату без перехода покупателя на платежную страницу в момент создания счета.

Обычный сценарий работы выглядит так:

  1. Создайте счет методом CreateInvoice.
  2. Сохраните id, invId и url из ответа.
  3. При необходимости отправьте ссылку покупателю через NotifyCustomer.
  4. Проверяйте счет через GetInvoiceInformation или GetInvoiceInformationList.
  5. Если ссылка больше не нужна, вызовите DeactivateInvoice.

Формат запросов

Все методы Invoice API используют POST. В теле запроса передается подписанный JWT, состоящий из трех частей:

BASE64URL_HEADER.BASE64URL_PAYLOAD.SIGNATURE

Передавайте заголовок Content-Type: application/json. Сам JWT должен быть JSON-строкой, поэтому в HTTP-теле его необходимо заключить в двойные кавычки:

"BASE64URL_HEADER.BASE64URL_PAYLOAD.SIGNATURE"
Проверяйте результат операции

Invoice API может вернуть HTTP 200 как при успешной обработке, так и при прикладной ошибке. Всегда проверяйте поле isSuccess в JSON-ответе.

Header содержит тип токена и алгоритм подписи:

{
"typ": "JWT",
"alg": "MD5"
}

Поддерживаются MD5, RIPEMD160, SHA1 (HS1), SHA256 (HS256), SHA384 (HS384) и SHA512 (HS512). Если alg не передан, используется алгоритм, выбранный в настройках магазина.

Преобразуйте JSON в Base64Url без символов = в конце.

Payload

Payload — JSON с параметрами конкретного метода. Названия полей передаются в регистре, указанном в примерах: MerchantLogin, InvId, InvoiceType и так далее.

Signature

Для формирования подписи:

  1. Преобразуйте Header и Payload в Base64Url.
  2. Соедините результаты точкой: BASE64URL_HEADER.BASE64URL_PAYLOAD.
  3. Рассчитайте HMAC выбранным алгоритмом.
  4. В качестве секретного ключа используйте строку MerchantLogin:Пароль#1.
  5. Преобразуйте подпись в Base64Url и добавьте ее к токену через точку.
Основной и тестовый пароли

Для создания обычного счета используйте основной пароль №1. Если в AdditionalParameters передан IsTest=1, используйте тестовый пароль №1.

Полный пример формирования запроса

Пример на Node.js создает JWT и отправляет его в CreateInvoice. Замените значения merchantLogin и password1 своими реквизитами.

import crypto from "node:crypto";

const merchantLogin = "your-shop-login";
const password1 = "your-password-1";

const header = {
typ: "JWT",
alg: "MD5",
};

const payload = {
MerchantLogin: merchantLogin,
InvId: 1001,
InvoiceType: "OneTime",
Culture: "ru",
OutSum: 245.5,
ExpirationDate: "2026-12-31T23:59:59+03:00",
Description: "Оплата заказа 1001",
MerchantComments: "Доставка после подтверждения оплаты",
UserFields: {
order_source: "website",
},
InvoiceItems: [
{
Name: "Товар",
Quantity: 1,
Cost: 245.5,
Tax: "none",
PaymentMethod: "full_payment",
PaymentObject: "commodity",
},
],
Aliases: ["BankCard", "SBP"],
SuccessUrl2Data: {
Url: "https://merchant.example/success",
Method: "GET",
},
FailUrl2Data: {
Url: "https://merchant.example/fail",
Method: "GET",
},
AdditionalParameters: {
Email: "buyer@example.com",
},
};

function toBase64Url(value) {
return Buffer.from(JSON.stringify(value)).toString("base64url");
}

const encodedHeader = toBase64Url(header);
const encodedPayload = toBase64Url(payload);
const signingInput = `${encodedHeader}.${encodedPayload}`;
const secret = `${merchantLogin}:${password1}`;
const signature = crypto
.createHmac("md5", secret)
.update(signingInput)
.digest("base64url");
const jwt = `${signingInput}.${signature}`;

const response = await fetch(
"https://services.robokassa.ru/InvoiceServiceWebApi/api/CreateInvoice",
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(jwt),
},
);

const result = await response.json();

Обратите внимание: в body передается JSON.stringify(jwt), а не исходный объект payload.

Создание счета

  • Метод: POST
  • Адрес: https://services.robokassa.ru/InvoiceServiceWebApi/api/CreateInvoice

Метод возвращает ссылку на оплату. Для одноразовой ссылки передайте InvoiceType: "OneTime", для многоразовой — InvoiceType: "Reusable".

Параметры создания счета

ПараметрОписание
MerchantLoginОбязательный. Логин магазина.
InvoiceTypeОбязательный. Тип ссылки: OneTime или Reusable.
InvIdНомер счета в системе магазина. Если не передан, Robokassa сформирует его автоматически.
OutSumСумма счета. Можно не передавать, если сумма определяется по InvoiceItems.
CultureЯзык платежной страницы: ru или en.
ExpirationDateДата и время окончания действия счета в формате ISO 8601.
DescriptionОписание заказа для покупателя.
MerchantCommentsВнутренний комментарий, доступный сотрудникам магазина.
InvoiceItemsПозиции заказа для фискализации.
FiscalParentOpIdOpId родительской операции для связанной фискализации, например при зачете аванса и доплате. Подробнее см. в разделе «Связанная фискализация».
UserFieldsПользовательские параметры в формате ключ: значение.
SuccessUrl2DataURL успешной переадресации и HTTP-метод.
FailUrl2DataURL неуспешной переадресации и HTTP-метод.
AliasesСпособы оплаты, доступные для счета.
PaymentsРаспределение суммы по типам платежа для фискализации.
CustomUserPropertyДополнительное свойство с полями Name и Value.
IsWithoutFreeSaleЗапрещает автоматически формировать чек с позицией «Свободная продажа», если номенклатура не передана. После оплаты зарегистрируйте чек отдельным запросом. Подробнее см. в разделе «Регистрация чека после оплаты».
SnoСистема налогообложения.
AdditionalParametersДополнительные параметры платежной формы. Все значения передаются как строки.

Передайте хотя бы один источник суммы: OutSum или InvoiceItems.

Фискализация

Если магазин использует фискализацию, передавайте InvoiceItems. Без номенклатуры касса может создать позицию «Свободная продажа» или не сформировать чек — это зависит от настроек и используемого решения.

Позиции заказа

{
"InvoiceItems": [
{
"Name": "Услуга",
"Quantity": 1,
"Cost": 100,
"Tax": "vat20",
"PaymentMethod": "full_payment",
"PaymentObject": "service"
}
]
}
ПолеОписание
NameНаименование товара или услуги.
QuantityКоличество.
CostЦена одной единицы.
TaxСтавка НДС.
PaymentMethodПризнак способа расчета.
PaymentObjectПризнак предмета расчета.
NomenclatureCodeКод маркировки товара.
AgentInfoДанные агента. Содержит поле Type.
SupplierInfoДанные поставщика: Name, Inn и массив Phones.
IsNonAgentItemПризнак неагентской позиции.

Подробнее о допустимых значениях для чека см. в разделе Фискализация.

Дополнительные параметры

AdditionalParameters принимает объект, в котором все значения являются строками:

{
"AdditionalParameters": {
"Email": "buyer@example.com",
"IncCurrLabel": "BankCard",
"PaymentMethods": "[\"BankCard\",\"SBP\"]"
}
}
КлючНазначение
IsTestВключает тестовый режим при значении 1. JWT необходимо подписать тестовым паролем №1. Подробнее см. в разделе «Тестовый режим».
IncCurrLabelПредпочтительный способ оплаты. Подробнее см. в разделе «Приоритет способов оплаты».
PaymentMethodsСпособы оплаты в виде JSON-строки, например "[\"BankCard\",\"SBP\"]". Подробнее см. в разделе «Приоритет способов оплаты».
EmailEmail покупателя. Передавайте без URL-кодирования.
ResultURL2Дополнительный URL уведомления. Передавайте без URL-кодирования. Подробнее см. в разделе «Дополнительное оповещение об оплате на ResultUrl2».
StepByStepПризнак холдирования. Подробнее см. в разделе «Холдирование средств».
RecurringПризнак рекуррентного платежа. Подробнее см. в разделе «Периодические платежи».
TokenТокен сохраненной карты. Подробнее см. в разделе «Оплата по сохраненной карте».
SplitПараметры сплитования платежа. Подробнее см. в разделе «Сплитование платежей».
CultureЯзык платежной страницы.
SuccessUrl2Дополнительный URL успешной переадресации. Передавайте без URL-кодирования. Подробнее см. в разделе «Дополнительная переадресация».
SuccessUrl2MethodHTTP-метод для SuccessUrl2: GET или POST. Подробнее см. в разделе «Дополнительная переадресация».
FailUrl2Дополнительный URL неуспешной переадресации. Передавайте без URL-кодирования. Подробнее см. в разделе «Дополнительная переадресация».
FailUrl2MethodHTTP-метод для FailUrl2: GET или POST. Подробнее см. в разделе «Дополнительная переадресация».
IsWithoutFreeSaleЗапрещает автоматический чек с позицией «Свободная продажа». Подробнее см. в разделе «Отключение автоматического чека».
FiscalParentOpIdOpId родительской операции для связанной фискализации. Подробнее см. в разделе «Связанная фискализация».
Совместимость параметров

Из StepByStep, Recurring и Token передавайте только один параметр. Split нельзя использовать вместе с IsTest.

Непустое значение из AdditionalParameters заменяет одноименный параметр основного Payload. Неизвестные ключи игнорируются.

Тестовый счет

Для тестового счета добавьте IsTest и подпишите JWT тестовым паролем №1:

{
"AdditionalParameters": {
"IsTest": "1"
}
}

Для обычного счета не передавайте IsTest и используйте основной пароль №1.

Ответ на создание счета

{
"id": "01234567-89ab-4cde-8f01-23456789abcd",
"invId": 1001,
"url": "https://auth.robokassa.ru/merchant/Invoice/AbCdEfGhIjKlMnOpQrStUv",
"isSuccess": true
}

Сохраните значения:

  • id — внутренний UUID счета;
  • invId — номер счета магазина;
  • url — ссылка, которую необходимо открыть или передать покупателю.

Пример прикладной ошибки:

{
"isSuccess": false,
"message": "Некорректно составлен запрос"
}

Получение одного счета

  • Метод: POST
  • Адрес: https://services.robokassa.ru/InvoiceServiceWebApi/api/GetInvoiceInformation

Передайте MerchantLogin и один идентификатор: Id или InvId.

{
"MerchantLogin": "your-shop-login",
"InvId": 1001
}
ПараметрОписание
MerchantLoginОбязательный. Логин магазина.
IdВнутренний UUID из ответа CreateInvoice.
InvIdНомер счета магазина.

Ответ с информацией о счете

{
"invoiceInformation": {
"id": "01234567-89ab-4cde-8f01-23456789abcd",
"invId": 1001,
"invoiceType": "OneTime",
"created": "2026-08-14T10:00:00+00:00",
"modified": "2026-08-14T10:01:00+00:00",
"culture": "ru",
"outSum": 245.5,
"expirationDate": "2026-12-31T20:59:59+00:00",
"description": "Оплата заказа 1001",
"invoiceItems": [],
"isCustomerNotificationEmailSent": false,
"invoiceStatus": "NotPaid",
"invoicePaymentUrl": "https://auth.robokassa.ru/merchant/Invoice/AbCdEfGhIjKlMnOpQrStUv",
"shortInvoicePaymentUrl": "https://auth.robokassa.ru/Merchant/Invoice/AbCdEfGhIjKlMnOpQrStUv",
"aliases": ["BankCard", "SBP"],
"userFields": {
"order_source": "website"
},
"payments": [],
"isWithoutFreeSale": false
},
"isSuccess": true
}

Основные статусы счета:

  • NotPaid — счет не оплачен;
  • Paid — счет оплачен;
  • Expired — срок действия закончился или счет деактивирован.

Получение списка счетов

  • Метод: POST
  • Адрес: https://services.robokassa.ru/InvoiceServiceWebApi/api/GetInvoiceInformationList

Метод возвращает счета, соответствующие заданным фильтрам. В этом запросе используется InvoiceTypes во множественном числе, а при создании счета — InvoiceType.

{
"MerchantLogin": "your-shop-login",
"CurrentPage": 1,
"PageSize": 10,
"InvoiceStatuses": ["NotPaid", "Paid", "Expired"],
"DateFrom": "2026-08-01T00:00:00+00:00",
"DateTo": "2026-08-31T23:59:59+00:00",
"IsAscending": false,
"InvoiceTypes": ["OneTime", "Reusable"],
"Aliases": ["BankCard", "SBP"],
"PaymentAliases": ["BankCard"],
"Keywords": "заказ 1001",
"SumFrom": 1,
"SumTo": 10000
}

Параметры фильтрации

ПараметрОписание
MerchantLoginОбязательный. Логин магазина.
CurrentPageОбязательный. Номер страницы, начиная с 1.
PageSizeОбязательный. Количество записей на странице.
InvoiceStatusesСтатусы: NotPaid, Paid и Expired.
DateFromНачало периода создания счетов в формате ISO 8601.
DateToКонец периода создания счетов в формате ISO 8601.
InvoiceTypesТипы ссылок: OneTime и Reusable.
IsAscendingСортировка по возрастанию.
KeywordsПоиск по сумме, идентификатору, описанию или email.
AliasesСпособы оплаты, разрешенные для счета.
PaymentAliasesСпособы, которые фактически использовались для оплаты.
SumFromМинимальная сумма.
SumToМаксимальная сумма.

Ответ со списком счетов

{
"invoiceInformationList": [
{
"id": "01234567-89ab-4cde-8f01-23456789abcd",
"invId": 1001,
"invoiceType": "OneTime",
"created": "2026-08-14T10:00:00+00:00",
"modified": "2026-08-14T10:01:00+00:00",
"outSum": 245.5,
"description": "Оплата заказа 1001",
"invoiceStatus": "NotPaid",
"invoicePaymentUrl": "https://auth.robokassa.ru/merchant/Invoice/AbCdEfGhIjKlMnOpQrStUv",
"isCustomerNotificationEmailSent": false,
"aliases": ["BankCard", "SBP"],
"invoiceItems": [],
"userFields": {},
"payments": [],
"isWithoutFreeSale": false
}
],
"total": 1,
"isSuccess": true
}

invoiceInformationList содержит счета текущей страницы, а total — общее количество счетов, соответствующих фильтрам.

Отправка уведомления покупателю

  • Метод: POST
  • Адрес: https://services.robokassa.ru/InvoiceServiceWebApi/api/NotifyCustomer

Метод отправляет покупателю email с информацией о счете и ссылкой на оплату.

{
"MerchantLogin": "your-shop-login",
"InvId": 1001,
"CustomerNotificationEmail": "buyer@example.com",
"CustomerNotificationName": "Иван",
"CustomerNotificationPhone": "+79990000000"
}
ПараметрОписание
MerchantLoginОбязательный. Логин магазина.
InvIdОбязательный. Номер счета магазина.
CustomerNotificationEmailEmail покупателя.
CustomerNotificationNameИмя покупателя.
CustomerNotificationPhoneТелефон покупателя.

Успешный ответ:

{
"isSuccess": true
}

После отправки результат можно проверить через GetInvoiceInformation: поле isCustomerNotificationEmailSent изменится на true, а адрес появится в customerNotificationEmail.

Деактивация счета

  • Метод: POST
  • Адрес: https://services.robokassa.ru/InvoiceServiceWebApi/api/DeactivateInvoice

Передайте MerchantLogin и один идентификатор счета: EncodedId, Id или InvId.

{
"MerchantLogin": "your-shop-login",
"InvId": 1001
}
ПараметрОписание
MerchantLoginОбязательный. Логин магазина.
EncodedIdПоследний сегмент ссылки на оплату.
IdВнутренний UUID из ответа CreateInvoice.
InvIdНомер счета магазина.

Например, для ссылки https://auth.robokassa.ru/merchant/Invoice/AbCdEfGhIjKlMnOpQrStUv значением EncodedId будет AbCdEfGhIjKlMnOpQrStUv.

Успешный ответ:

{
"isSuccess": true
}

После деактивации счет больше нельзя оплатить. В GetInvoiceInformation его статус изменится на Expired.