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

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.