# Changelog

## Сентябрь 2026

### 10 сентября

**HTML-форма передает подписанный контейнер.** Вместо отдельных полей счета — `data` (base64url от JSON) и `signature` (HMAC-SHA256 от строки `data`). Адрес приема сменился с `invoices/createFromForm` на `invoices/form`. Прежние формы не работают, их нужно пересобрать: раздел «[Подпись HTML-формы](./creating-invoices/html-forms/form-signature.md)».

### 8 сентября

**Числовые поля в теле вебхука стали числами.** Шесть полей раньше передавались строками, теперь передаются числами: `project.commissionRate`, `invoice.commissionFiatUSD`, `invoice.amountFiatUSD`, `invoice.amountFiat`, `invoice.calcAmountFiat`, `payment.amount`. Состав полей, их имена и порядок не изменились.

Что учесть: незначащие нули пропадают, сумма 10.00 придет как 10. Суммы меньше 0.0001 приходят в экспоненциальной записи, например 1.0e-6 — штатный разбор JSON отдаст правильное число, сломается только ручной разбор строки.

Уведомления, собранные до выкатки и еще не доставленные, придут в прежнем формате. Приемник должен принимать оба варианта, пока очередь не опустеет — это занимает не больше двух суток.

### 6 сентября

**Числовые поля в ответах API стали числами.** Затрагивает `invoices/list`, `payments/list` и `invoices/create`.

| Поле                | Было             | Стало  |
| ------------------- | ---------------- | ------ |
| `commissionFiatUSD` | `"0.10"`         | `0.1`  |
| `amountFiatUSD`     | `"10.00"`        | `10`   |
| `amountFiat`        | `"1000.00"`      | `1000` |
| `views`             | `"0"`            | `0`    |
| `payment.amount`    | `"10.500000000"` | `10.5` |

**Ключ, ограниченный проектом, применяет ограничение во всех методах.** Раньше часть методов проект не учитывала. Теперь в методах выдачи это фильтр, а обращение к счету или кошельку чужого проекта отклоняется с ответом `Restricted project`. Метод, который не умеет работать с ограничением по проекту, такому ключу закрыт. Подробности — в разделе «Область действия».

**Список платежей отдает непривязанные платежи.** Раньше метод `payments/list` возвращал только платежи, связанные со счетом. Теперь в выдачу попадают все платежи по вашим кошелькам, у непривязанного отсутствует блок `invoice`. Именно такие платежи нужны для ручной привязки через `invoices/bindPayment`.

**Отмена счета различает причины отказа.** Раньше и на отсутствие счета, и на невыполненные условия приходил общий `Invoice not found`. Теперь `Invoice not found` означает только отсутствие счета, а невыполненные условия дают `Invoice cannot be canceled`.

**Идентификаторы неверного формата отклоняются.** `invoices/list` проверяет `invoiceId`, `invoiceUid` и `projectId`, `payments/list` — `walletId` и `invoiceId`. Не подошедшее значение дает `Parameter is filled in incorrectly` с именем поля. Раньше такой параметр молча отбрасывался, и приходила выдача без фильтра.

**Границы периода включают весь названный день.** `startDate` и `endDate` трактуются от `00:00:00` до `23:59:59`. Раньше конечный день отсекался целиком, и запрос за одни сутки возвращал только записи, созданные ровно в полночь. Затрагивает `invoices/list`, `payments/list`, `statistics/invoices` и `statistics/payments`.

**В историю изменения балансов добавлено поле проекта.** В каждой операции метода `billing/history` появилось поле `projectId`. У операций уровня аккаунта — пополнений и бонусов — оно равно `null`.

### 4 сентября

**Описание и служебные данные возвращаются в исходном виде.** Поля `description` и `serviceData` раньше хранились закодированными, и в ответах API кавычка приходила как `&quot;`, а знак меньше — как `<`. Теперь возвращается ровно то, что передал продавец. При выводе в HTML экранируйте значение на своей стороне.

**HTML-формы принимают только POST.** Создание счета переходом по ссылке с параметрами в адресной строке больше не работает — параметры читаются только из тела запроса. Если вы использовали ссылки, замените их на форму с `method="post"`.

### 3 сентября

**Уведомления вебхука подписываются.** Добавлены заголовки `X-Timestamp` и `X-Signature`, подпись считается алгоритмом HMAC-SHA256 на секрете вебхука. Проверка подписи позволяет отличить настоящее уведомление от подделки. Механика и примеры — в разделе «Проверка подписи вебхука».

Изменение обратно совместимо: если проверку не добавлять, обработчик продолжит работать как раньше.
