diff --git a/_docs/alfabank/payin_and_kyc/API_Key/api-key.md b/_docs/alfabank/payin_and_kyc/API_Key/api-key.md
new file mode 100644
index 0000000..fa9c2ae
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/API_Key/api-key.md
@@ -0,0 +1,61 @@
+Вот преобразованный контент страницы в формате Markdown. Я сохранил структуру, важные пометки (бета-тест, H2H) и все функциональные ссылки.
+
+---
+
+# API Key
+
+**β-ТЕСТ** **H2H**
+
+**API Key** — ключ доступа для упрощённой авторизации запросов по H2H-интеграциям, который не требует аутентификации пользователей. Он выпускается один раз через интерфейс Портала разработчика и действует бессрочно, но будет автоматически отозван, если с момента последнего запроса прошло более 30 дней.
+
+### Сервисы, доступные с использованием `API Key` в H2H-интеграциях:
+
+* [Выписки по счетам юрлиц](/products/alfa-api/documentation/articles/transactions/transactions) (для методов, где `scope=transactions`)
+* [Профиль организации](/products/alfa-api/documentation/articles/customer-info/customer-info)
+* [Электронная подпись](/products/alfa-api/documentation/articles/signature/signature)
+
+Для настройки авторизации по `API Key` необходимо выпустить его на Портале разработчика и добавить его в свои рабочие инструменты. Как это сделать, описано [в статье Управление API Key](/products/alfa-api/documentation/articles/selfservice/articles/api-key/api-key).
+
+### Управление ключами доступа
+Управлять ключами доступа можно также на Портале разработчика. Вы можете:
+
+* **Перевыпустить ключ** в случае потери данных, компрометации ключа или необходимости замены данных для него.
+* **Отозвать ключ**, если больше не хотите использовать упрощённый способ авторизации.
+
+[**Как управлять API Key**](/products/alfa-api/documentation/articles/selfservice/articles/api-key/api-key)
+
+---
+
+## Навигация по разделу
+* ← [Экранирование](/products/alfa-api/documentation/articles/alfa-id/articles/screening/screening)
+* → [Начало работы в песочнице](/products/alfa-api/documentation/articles/sandbox/articles/intro/intro)
+
+---
+
+### Общая информация (Alfa API)
+1. [Общая информация](/products/alfa-api/documentation/articles/specification/specification)
+2. [Подключение к Alfa API](/products/alfa-api/documentation/articles/connection/connection)
+3. [Портал разработчика](/products/alfa-api/documentation/articles/selfservice/selfservice)
+4. [Alfa ID](/products/alfa-api/documentation/articles/alfa-id/alfa-id)
+5. **API Key** (Текущая страница)
+6. [Песочница](/products/alfa-api/documentation/articles/sandbox/sandbox)
+7. [Java SDK](/products/alfa-api/documentation/articles/sdk/sdk)
+8. [Обмен файлами](/products/alfa-api/documentation/articles/secure-file-transfer/secure-file-transfer)
+9. [Транспортная подпись и шифрование](/products/alfa-api/documentation/articles/signature-encryption/signature-encryption)
+10. [Вебхуки](/products/alfa-api/documentation/articles/webhooks/webhooks)
+
+### Продукты и сервисы
+* [Выписки по счетам юрлиц](/products/alfa-api/documentation/articles/transactions/transactions)
+* [Информация по счетам физлиц](/products/alfa-api/documentation/articles/accounts/accounts)
+* [Эскроу-счета 214-ФЗ](/products/alfa-api/documentation/articles/escrow/escrow)
+* [Профиль организации](/products/alfa-api/documentation/articles/customer-info/customer-info)
+* [Платёжные поручения](/products/alfa-api/documentation/articles/payments/payments)
+* [Самозанятые](/products/alfa-api/documentation/articles/selfemployed/selfemployed)
+* [Система быстрых платежей (СБП)](/products/alfa-api/documentation/articles/sbp/sbp)
+* [Кредиты](/products/alfa-api/documentation/articles/scoring/scoring)
+* [Электронная подпись](/products/alfa-api/documentation/articles/signature/signature)
+* [Карты](/products/alfa-api/documentation/articles/cards/cards)
+* [Зарплатный проект](/products/alfa-api/documentation/articles/salary/salary)
+* [Alfa Pay Business](/products/alfa-api/documentation/articles/invoices/invoices)
+* [Факторинг](/products/alfa-api/documentation/articles/factoring/factoring)
+* [Номинальные счета](/products/alfa-api/documentation/articles/nominal-accounts/nominal-accounts)
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow/access_token_refresh_POST.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow/access_token_refresh_POST.md
new file mode 100644
index 0000000..49f7829
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow/access_token_refresh_POST.md
@@ -0,0 +1,114 @@
+# Обновление токена доступа
+
+**Тип интеграции:** B2B, B2C
+
+## Эндпоинты
+
+| Окружение | Метод и URL |
+| :------------ | :-------------------------------------------- |
+| **Песочница** | `POST https://sandbox.alfabank.ru/oidc/token` |
+| **Пром** | `POST https://baas.alfabank.ru/oidc/token` |
+
+---
+
+## Описание
+
+> **Внимание**
+> Токен обновления действует 180 дней и не может быть использован более 2 раз.
+
+> **Внимание**
+> Токен обновления может быть отозван в случае, если:
+>
+> - пользователь сменил пароль;
+> - пользователь превысил допустимое количество попыток ввода пароля;
+> - аккаунт пользователя был заблокирован.
+
+В результате запроса, помимо нового токена доступа, вы также получите новый токен обновления, а старый `refresh_token` станет недействительным.
+
+При использовании `curl` запроса с заголовком `"Content-Type": "application/x-www-form-urlencoded"` необходимо экранировать специальные символы параметра `client_secret`. В то время как `redirect_uri` экранировать не нужно.
+
+Если запрос отправляется через Postman с заголовком `"Content-Type": "application/x-www-form-urlencoded"` и `body` в формате `x-www-form-urlencoded` — нет необходимости экранировать специальные символы.
+
+Подробную информацию по экранированию можно посмотреть [здесь](/products/alfa-api/documentation/articles/alfa-id/articles/screening/screening).
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :--------------- | :----- | :------------- | :---------------------------------- |
+| **Accept** | string | required | `application/json` |
+| **Content-Type** | string | required | `application/x-www-form-urlencoded` |
+
+### BODY
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------- |
+| **grant_type** | string | required | Тип гранта. Возможные значения: `refresh_token` |
+| **refresh_token** | string | required | Токен обновления. Обновить `access_token` через `refresh_token` можно только 2 раза. В дальнейшем необходимо использовать новый `refresh_token` |
+| **client_id** | string | required | Идентификатор партнёрского сервиса |
+| **client_secret** | string | required | Секретный ключ партнёрского сервиса |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location 'https://baas.alfabank.ru/oidc/token' \
+--header 'Content-Type: application/x-www-form-urlencoded' \
+--header 'Accept: application/json' \
+--data-urlencode 'grant_type=refresh_token' \
+--data-urlencode 'refresh_token=13b8230b-b6bf-4bb9-b977-3bc0a988a5fd' \
+--data-urlencode 'client_id=0cee0683-85ae-49f2-a63d-29f97aad1911' \
+--data-urlencode 'client_secret=Qwerty1234567890Qwerty1234567890!'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+**HEADERS**
+
+- **Content-Type**: `application/json`
+- **Cache-Control**: `no-store`
+- **Pragma**: `no-cache`
+
+**BODY**
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **access_token** | string | required | Токен доступа |
+| **refresh_token** | string | required | Токен обновления |
+| **token_type** | string | required | Тип токена (например, `Bearer`) |
+| **expires_in** | integer | optional | Срок жизни токена в секундах |
+
+**Пример JSON-ответа:**
+
+```json
+{
+ "access_token": "eyJraWQiOiJhbGZhLXRlc3Qtand0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ...",
+ "refresh_token": "2cc8d34c-130a-4674-91fa-f9835fff6e88",
+ "token_type": "Bearer",
+ "expires_in": 3600
+}
+```
+
+---
+
+### Ошибка (400 Bad Request)
+
+**BODY**
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **error** | string | required | Код ошибки. Возможные значения: `invalid_request` — неверные входные параметры запроса |
+| **error_description** | string | optional | Описание ошибки |
+
+---
+
+## Навигация
+
+- [← Получение профиля представителя пользователя](/products/alfa-api/documentation/articles/alfa-id/articles/acf/articles/get-profile-info/v1/get-profile-info)
+- [Как использовать ACF для H2H →](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro)
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow/how_to_use_ACF.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow/how_to_use_ACF.md
new file mode 100644
index 0000000..d63050c
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow/how_to_use_ACF.md
@@ -0,0 +1,50 @@
+# Как использовать ACF
+
+**Теги:** `B2B` `B2C`
+
+Вы можете использовать **Authorization Code Flow** в своих приложениях для получения доступа к защищённым ресурсам Alfa API. Доступ осуществляется с помощью `access_token`, который Вы получаете после аутентификации пользователя и подписания им согласия на передачу данных.
+
+Также с помощью полученного `access_token` Вы сможете:
+
+1. **Реализовать процесс бесшовной аутентификации** между партнёром и Банком.
+2. **Получить доступ к операциям или документам других организаций** (при наличии от них согласия) для предоставления услуг B2B / B2C SaaS. Подходит для облачных бухгалтерий, маркетплейсов, CRM и других.
+
+`access_token`, полученный по **Authorization Code Flow**, даёт возможность переходить между банковскими приложениями и приложениями партнёра без дополнительной аутентификации.
+
+В рамках **Authorization Code Flow** доступны все сервисы, реализованные в Alfa API.
+
+---
+
+### Шаги авторизации
+
+1. **Получение кода авторизации**
+2. **Получение токена доступа**
+3. **Получение информации о профиле представителя ЮЛ/ФЛ**
+4. **Проверка подписи**
+5. **Перенаправление авторизованного пользователя на ваш ресурс**
+
+---
+
+### Согласия пользователей
+
+- **Срок жизни согласия:** 365 дней.
+- **Продление:** После истечения срока необходимо заново пройти авторизацию. Для этого в параметре запроса на получение кода авторизации нужно передать параметр `prompt = consent`.
+- **Проверка статуса:** Узнать дату окончания действия согласия можно с помощью метода [Данные по согласиям пользователей](/products/alfa-api/documentation/articles/alfa-id/articles/expansion/articles/client-consents/v1/client-consents).
+
+---
+
+### Дополнительно
+
+При необходимости вы можете:
+
+- [Обновить токен](/products/alfa-api/documentation/articles/alfa-id/articles/acf/articles/token-update/v1/token-update)
+- [Отозвать токен](/products/alfa-api/documentation/articles/alfa-id/articles/expansion/articles/revoke-token/v1/revoke-token)
+
+---
+
+**Навигация:**
+← [Кнопка входа по Alfa ID](/products/alfa-api/documentation/articles/alfa-id/articles/button/button) | [Получение кода авторизации](/products/alfa-api/documentation/articles/alfa-id/articles/acf/articles/get-auth-code/v1/get-auth-code) →
+
+---
+
+_Примечание: В данном документе используются относительные ссылки. Для перехода по ним используйте базовый адрес портала (developers.alfabank.ru)._
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow/obtaining_a_user_representative_profile.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow/obtaining_a_user_representative_profile.md
new file mode 100644
index 0000000..1236508
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow/obtaining_a_user_representative_profile.md
@@ -0,0 +1,80 @@
+# Получение профиля представителя пользователя `B2B` `B2C`
+
+## Эндпоинты
+
+| Среда | Метод и URL |
+| :------------ | :---------------------------------------------- |
+| **Песочница** | `GET https://sandbox.alfabank.ru/oidc/userinfo` |
+| **Пром** | `GET https://baas.alfabank.ru/oidc/userinfo` |
+
+---
+
+## Описание
+
+Для идентификации пользователя выполняется запрос на получение информации о профиле представителя ЮЛ/ФЛ.
+
+- **Входящие параметры:** `access_token`.
+- **Исходящие параметры:** данные пользователя, на передачу которых от пользователя есть разрешение.
+
+> Для каждого Партнёра API перечень допустимых клэймов настраивается индивидуально.
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :-------------------- |
+| **Authorization** | string | required | Bearer {access_token} |
+| **Accept** | string | required | application/jwt |
+
+### Пример запроса (cURL)
+
+```bash
+curl --location 'https://baas.alfabank.ru/oidc/userinfo' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/jwt'
+```
+
+---
+
+## Параметры ответа
+
+### 200 OK
+
+**Headers:**
+
+- `Content-Type: application/jwt` (optional)
+
+**Пример ответа (JWT):**
+
+```text
+eyJraWQiOiJhbGZhLXRlc3Qtand0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJjdXMiOiJVQUFBQUEiLCJzdWIiOiIzMjI4ZTY4ZS1jYzM0LTRiODItYjQzZC00OTExMmI1ZDlkM2UiLCJiaXJ0aGRhdGUiOiIyMDAwLTAyLTIwIiwicm9sZSI6IkFDQ09VTlRBTlQsIE1BTkFHRVIiLCJnZW5kZXIiOiJNQUxFIiwiaWRlbnRpdHlfZG9jdW1lbnRfbmFtZSI6ItCf0LDRgdC_0L7RgNGCINCz0YDQsNC20LTQsNC90LjQvdCwINCg0KQiLCJpZGVudGl0eV9kb2N1bWVudF9udW1iZXIiOjIyMjIyMiwiaXNzIjoiaHR0cHM6XC9cL2JhYXMuYWxmYWJhbmsucnUiLCJpbm4iOjc0MTUxMTExMjIyMiwiZWlvIjp0cnVlLCJnaXZlbl9uYW1lIjoi0KLQtdGB0YIiLCJtaWRkbGVfbmFtZSI6ItCi0LXRgdGC0L7QstC40YciLCJhY3VzIjoiWEFBQUFBIiwiaWRlbnRpdHlfZG9jdW1lbnRfc2VyaWVzIjoxMTExLCJhdWQiOiIwY2VlMDY4My04NWFlLTQ5ZjItYTYzZC0yOWY5N2FhZDE5MTEiLCJhY2xjIjoiWEFBQUExIiwidXBkYXRlZF9hdCI6IjIwMjItMDEtMjAiLCJuYW1lIjoi0KLQtdGB0YLQvtCyINCi0LXRgdGCINCi0LXRgdGC0L7QstC40YciLCJwaG9uZV9udW1iZXIiOjc5MTkxMTEyMjMzLCJjbGMiOiJVQUFBQTEiLCJmYW1pbHlfbmFtZSI6ItCi0LXRgdGC0L7QsiIsImVtYWlsIjoiZW1haWxAZW1haWwucnUifQ.WVr5xkQSEGqpPXN3aIo0zHZLDL0vvtxEEQ83BrgJo7l0BjjALeGDRYENF2bL8j3n1pXRnduiBQcYNV6teBhESI8V_8kd7Kh7LTePkJWadPSvD__KskC69b4XZ-zN-IQ73NmAcBDStnnhSXGKL6xhdRy-TGiAoKPsRWiDVntsDlpCQNHAt3tJk8q_SQS4S1k6qju9eJ2GFkgmd6z8rR2vaBykaOF0K61ltksw6YgXhuek3OlYkqIAivyKYl59uio8zMpJk-YrPlmawwmvWPF0vKhaLj8Mvn4mVMsVSfuVVKP2ksHG0MAlWpO3Sh9GoKO4d6TQplJ4vgIIeNx-44npqw
+```
+
+### 400 Bad Request
+
+**Body:**
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------------------- | :----- | :------------- | :------------------------------------------------------------------------------------- |
+| **error** | string | required | Код ошибки. Принимает значения: `invalid_request` — неверные входные параметры запроса |
+| **error_description** | string | optional | Описание ошибки |
+
+---
+
+## Описание клэймов UserInfo
+
+| Name | Description | Scope |
+| :-------------- | :-------------------------------------------------------------------- | :------------------ |
+| **iss** | URL-адрес Alfa ID по протоколу https (https://id.alfabank.ru/oidc) | openid |
+| **sub** | Уникальный идентификатор Alfa ID пользователя (до 255 символов ASCII) | openid |
+| **aud** | Идентификатор сервиса-партнёра (аудитория токена) | openid |
+| **name** | Полное имя конечного пользователя в отображаемой форме | profile, name |
+| **given_name** | Имя конечного пользователя | profile, givenname |
+| **family_name** | Фамилия конечного пользователя | profile, familyname |
+| **middle_name** | Отчество конечного пользователя | profile, middlename |
+| **email** | Предпочтительный адрес электронной почты | email |
+| **gender** | Пол конечного пользователя | profile, gender |
+| **birthdate** | День рождения в формате `YYYY-MM-DD` | profile, birthdate |
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow/obtaining_an_access_token_POST.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow/obtaining_an_access_token_POST.md
new file mode 100644
index 0000000..0c2dc55
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow/obtaining_an_access_token_POST.md
@@ -0,0 +1,155 @@
+# Получение токена доступа
+
+**Тип интеграции:** B2B, B2C
+**Метод:** `POST`
+
+## Эндпоинты
+
+| Среда | URL |
+| :------------ | :--------------------------------------- |
+| **Песочница** | `https://sandbox.alfabank.ru/oidc/token` |
+| **Пром** | `https://baas.alfabank.ru/oidc/token` |
+
+---
+
+## Описание
+
+В результате выполнения запроса будет получено три токена: `access_token`, `refresh_token`, `id_token`.
+
+> **Внимание**
+>
+> - Токен доступа действует **1 час**.
+> - Токен доступа может быть отозван в случае, если:
+> - пользователь сменил пароль;
+> - пользователь превысил допустимое количество попыток ввода пароля;
+> - аккаунт пользователя был заблокирован;
+> - срок жизни согласия пользователя истёк.
+
+### Особенности передачи параметров
+
+- При использовании `curl` с заголовком `"Content-Type": "application/x-www-form-urlencoded"` необходимо **экранировать** специальные символы параметра `client_secret`. Параметр `redirect_uri` экранировать не нужно.
+- Если запрос отправляется через **Postman** (body в формате `x-www-form-urlencoded`) — экранировать специальные символы не требуется.
+
+Подробную информацию по экранированию можно посмотреть [здесь](/products/alfa-api/documentation/articles/alfa-id/articles/screening/screening).
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обяз. | Описание |
+| :--------------- | :----- | :---- | :---------------------------------- |
+| **Accept** | string | Да | `application/json` |
+| **Content-Type** | string | Да | `application/x-www-form-urlencoded` |
+
+### BODY (x-www-form-urlencoded)
+
+| Атрибут | Тип | Обяз. | Описание |
+| :---------------- | :----- | :---- | :--------------------------------------------------- |
+| **grant_type** | string | Да | Тип гранта. Возможные значения: `authorization_code` |
+| **code** | string | Да | Код авторизации |
+| **client_id** | string | Да | Идентификатор партнёрского сервиса |
+| **client_secret** | string | Да | Секретный ключ партнёрского сервиса |
+| **redirect_uri** | string | Да | URI перенаправления |
+| **code_verifier** | string | Нет | Код верификатор |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location 'https://baas.alfabank.ru/oidc/token' \
+--header 'Content-Type: application/x-www-form-urlencoded' \
+--header 'Accept: application/json' \
+--data-urlencode 'grant_type=authorization_code' \
+--data-urlencode 'code=8962c304-89b1-11ec-a8a3-0242ac120002' \
+--data-urlencode 'client_id=0cee0683-85ae-49f2-a63d-29f97aad1911' \
+--data-urlencode 'client_secret=Qwerty1234567890Qwerty1234567890!' \
+--data-urlencode 'redirect_uri=https://wwww.partner.ru/code' \
+--data-urlencode 'code_verifier=string'
+```
+
+---
+
+## Параметры ответа
+
+### Ответ 200 (OK)
+
+**HEADERS**
+
+- `Content-Type`: `application/json`
+- `Cache-Control`: `no-store`
+- `Pragma`: `no-cache`
+
+**BODY**
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **access_token** | string | Да | Токен доступа |
+| **refresh_token** | string | Да | Токен обновления |
+| **token_type** | string | Да | Тип токена (обычно `Bearer`) |
+| **expires_in** | integer | Нет | Срок жизни токена в секундах |
+| **id_token** | string | Да | Идентификационный токен |
+
+**Пример JSON-ответа:**
+
+```json
+{
+ "access_token": "eyJraWQiOiJhbGZhLXRlc3Qtand0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ...",
+ "refresh_token": "13b8230b-b6bf-4bb9-b977-3bc0a988a5fd",
+ "token_type": "Bearer",
+ "expires_in": 3600,
+ "id_token": "eyJraWQiOiJhbGZhLXRlc3Qtand0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ..."
+}
+```
+
+---
+
+### Ответ 400 (Bad Request)
+
+| Атрибут | Тип | Обяз. | Описание |
+| :-------------------- | :----- | :---- | :--------------------------------------- |
+| **error** | string | Да | Код ошибки (например, `invalid_request`) |
+| **error_description** | string | Нет | Описание ошибки |
+
+---
+
+## Таблица возможных значений параметра error
+
+| Значение | Описание |
+| :----------------------- | :------------------------------------------------------------------------------------------------------------------ |
+| `invalid_request` | Отсутствует обязательный параметр, неподдерживаемое значение, повторение параметра или неправильный формат запроса. |
+| `invalid_client` | Ошибка аутентификации клиента (неизвестный клиент или неподдерживаемый метод). |
+| `invalid_grant` | Недействительный код авторизации, токен обновления или несоответствие URI перенаправления. |
+| `unsupported_grant_type` | Тип `grant_type` не поддерживается сервером. |
+| `internal_error` | Произошла непредвиденная ошибка. |
+
+---
+
+## Описание клэймов (claims)
+
+### access_token
+
+| Значение | Описание |
+| :----------------- | :----------------------------------------------------- |
+| **iss** | URL-адрес Alfa ID (https://id.alfabank.ru/oidc) |
+| **sub** | Уникальный идентификатор Alfa ID пользователя |
+| **aud** | Идентификатор сервиса-партнёра (аудитория токена) |
+| **exp** | Время окончания срока действия токена (Unix timestamp) |
+| **iat** | Время выпуска токена (Unix timestamp) |
+| **scope_claims** | Массив клэймов области применения |
+| **scope_services** | Массив операций области применения |
+
+### id_token
+
+| Значение | Описание | Scope |
+| :------------ | :--------------------------------------- | :----- |
+| **iss** | URL-адрес Alfa ID | openid |
+| **sub** | Уникальный идентификатор пользователя | openid |
+| **aud** | Идентификатор сервиса-партнёра | openid |
+| **exp** | Время окончания срока действия | openid |
+| **iat** | Время выпуска | openid |
+| **auth_time** | Время аутентификации пользователя | openid |
+| **nonce** | Строка для защиты от повторных атак | openid |
+| **acr** | Способ аутентификации пользователя | openid |
+| **azp** | Сторона, которой выдан токен (client_id) | openid |
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow/obtaining_an_authorization_code_GET.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow/obtaining_an_authorization_code_GET.md
new file mode 100644
index 0000000..4f7c390
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow/obtaining_an_authorization_code_GET.md
@@ -0,0 +1,114 @@
+Вот преобразованный в Markdown контент вашего HTML-файла. Я сохранил структуру шагов, таблицы параметров, примеры кода и ссылки на изображения.
+
+---
+
+# Получение кода авторизации
+
+**Теги:** `B2B` `B2C`
+
+Процесс получения кода авторизации в сценарии **Authorization Code Flow** состоит из нескольких шагов.
+
+---
+
+### Краткий обзор шагов
+1. Отобразите пользователю кнопку "Войти по Alfa ID".
+2. Сформируйте ссылку для авторизации.
+3. Переадресуйте пользователя для прохождения аутентификации.
+4. Получите код авторизации в ответе от Alfa ID.
+5. Alfa ID возвращает пользователя на Ваш ресурс по указанному `redirect_uri`.
+
+---
+
+### Шаг 1. Кнопка «Войти по Alfa ID»
+Пользователь переходит по встроенной кнопке на Вашем ресурсе.
+
+
+
+---
+
+### Шаг 2. Формирование ссылки
+
+#### Эндпоинты
+
+* **Песочница:**
+ `GET https://id-sandbox.alfabank.ru/oidc/authorize?response_type=code&client_id={client_id}&redirect_uri={redirect_uri}&scope={scope}&state={state}`
+* **Пром:**
+ `GET https://id.alfabank.ru/oidc/authorize?response_type=code&client_id={client_id}&redirect_uri={redirect_uri}&scope={scope}&state={state}`
+
+> **Важно:** При формировании ссылки указывайте весь доступный `scope` через знак пробела или `%20`. Параметр `prompt=consent` используйте только если нужно, чтобы пользователь повторно подписал согласие.
+
+#### Параметры запроса (QUERY)
+
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| `response_type` | string | Да | Тип ответа. Возможные значения: `code` |
+| `client_id` | string | Да | Идентификатор партнёрского сервиса (выдается банком) |
+| `redirect_uri` | string | Да | URI для перенаправления пользователя после успешной авторизации |
+| `scope` | string | Да | Область применения (информирует, какие данные будут использованы) |
+| `state` | string | Да | Параметр для защиты от CSRF. UUID, 36 символов. |
+| `nonce` | string | Нет | Строка для связи сессии с ID-токеном и защиты от повторных атак |
+| `code_challenge` | string | Нет | Код вызова |
+| `code_challenge_method` | string | Нет | Метод преобразования: `plain` или `S256` |
+| `prompt` | string | Нет | Параметр повторной аутентификации: `none`, `login`, `consent` |
+| `max_age` | string | Нет | Максимальный период аутентификации |
+
+#### Пример запроса
+```bash
+curl -X GET https://id.alfabank.ru/oidc/authorize?response_type=code&client_id=0cee0683-85ae-49f2-a63d-29f97aad1911&redirect_uri=https%3A%2F%2Fwwww.partner.ru%2Fcode&scope=openid&state=abcdef
+```
+
+---
+
+### Шаг 3. Аутентификация пользователя
+
+1. Пользователь проходит процедуру аутентификации.
+
+
+2. Пользователь выбирает организацию (для ЮЛ; для ФЛ шаг пропускается).
+
+
+3. Пользователь подписывает форму согласия.
+
+
+---
+
+### Шаг 4. Получение кода авторизации
+
+Код авторизации получен, если пришел ответ **302 Found**.
+
+> **Внимание:** Код авторизации действует **2 минуты** и может быть использован только **1 раз**.
+
+#### Пример успешного ответа
+```bash
+https://wwww.partner.ru/code?code=8962c304-89b1-11ec-a8a3-0242ac120002&state=abcdef
+-H 'Location: https://wwww.partner.ru/code?code=8962c304-89b1-11ec-a8a3-0242ac120002&state=abcdef'
+-H 'Set-Cookie: ALFASESSIONID=f9e9532f-7b06-4023-83a2-f6cc77a7bfe4'
+```
+
+#### Параметры ответа (302 Found)
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| `Location` | string | Содержит URI перенаправления вида: `redirect_uri?code={code}&state={state}` |
+| `Set-Cookie` | string | Содержит идентификатор сессии |
+
+---
+
+### Ошибки
+
+В случае неуспешного выполнения запроса в заголовке `Location` передаётся строка вида: `redirect_uri_error_page?error={error}`.
+
+#### Таблица возможных значений параметра error
+
+| Значение | Описание |
+| :--- | :--- |
+| `unsupported_response_type` | Сервер не поддерживает получение кода этим методом |
+| `login_required` | Необходима аутентификация (возникает при `prompt=none`) |
+| `invalid_scope` | Недопустимая или неизвестная область применения |
+| `invalid_request` | Отсутствует обязательный параметр или неверный формат запроса |
+| `consent_required` | Необходимо согласие пользователя (возникает при `prompt=none`) |
+| `access_denied` | Владелец ресурса или сервер отклонил запрос |
+| `invalid_operation_response` | Используйте только данные из спецификации ACF |
+| `login_expired` | Пользователь не прошел аутентификацию за 15 минут или сделал logout |
+
+---
+**Далее:** [Получение токена доступа](/products/alfa-api/documentation/articles/alfa-id/articles/acf/articles/get-access-token/v1/get-access-token)
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_H2H_Integrations/How_to_use_ACF_for_H2H.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_H2H_Integrations/How_to_use_ACF_for_H2H.md
new file mode 100644
index 0000000..43cace6
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_H2H_Integrations/How_to_use_ACF_for_H2H.md
@@ -0,0 +1,42 @@
+# Как использовать ACF для H2H
+
+**Тег:** `H2H`
+
+Вы можете использовать **Authorization Code Flow для H2H-интеграций** как канал взаимодействия ваших автоматизированных систем с Банком по операциям Вашей организации.
+
+С помощью `access_token`, полученного по **Authorization Code Flow для H2H-интеграций**, Вы сможете встроить банковские продукты в ERP-систему организации для выполнения запросов и операций только по своей организации.
+
+### Шаги авторизации
+
+1. **Формирование ссылки и редирект сотрудника**
+2. **Получение кода авторизации**
+3. **Получение токена доступа**
+
+### Дополнительно
+
+При необходимости вы можете [обновить](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/token-update/v1/token-update) токен или [отозвать](/products/alfa-api/documentation/articles/alfa-id/articles/expansion/articles/revoke-token/v1/revoke-token) его.
+
+---
+
+#### Навигация по разделу:
+
+- ← [Обновление токена доступа](/products/alfa-api/documentation/articles/alfa-id/articles/acf/articles/token-update/v1/token-update)
+- → [Получение кода авторизации](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/get-auth-code/v1/get-auth-code)
+
+---
+
+### Структура меню (Alfa ID):
+
+- [Что такое Alfa ID](/products/alfa-api/documentation/articles/alfa-id/articles/intro/intro)
+- [Аутентификация](/products/alfa-api/documentation/articles/alfa-id/articles/authentication/authentication)
+- [Кнопка входа по Alfa ID](/products/alfa-api/documentation/articles/alfa-id/articles/button/button)
+- [Authorization Code Flow](/products/alfa-api/documentation/articles/alfa-id/articles/acf/acf)
+- **Authorization Code Flow для H2H-интеграций**
+ - [Как использовать ACF для H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) (Текущая страница)
+ - [Получение кода авторизации](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/get-auth-code/v1/get-auth-code)
+ - [Получение токена доступа](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/get-access-token/v1/get-access-token) `POST`
+ - [Обновление токена доступа](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/token-update/v1/token-update) `POST`
+- [Authorization Code Flow для холдингов](/products/alfa-api/documentation/articles/alfa-id/articles/acf-holding/acf-holding)
+- [Client Credentials Flow](/products/alfa-api/documentation/articles/alfa-id/articles/ccf/ccf)
+- [Расширение сценариев](/products/alfa-api/documentation/articles/alfa-id/articles/expansion/expansion)
+- [Экранирование](/products/alfa-api/documentation/articles/alfa-id/articles/screening/screening)
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_H2H_Integrations/geting_access_token_POST.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_H2H_Integrations/geting_access_token_POST.md
new file mode 100644
index 0000000..c7d60fa
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_H2H_Integrations/geting_access_token_POST.md
@@ -0,0 +1,143 @@
+# Получение токена доступа `H2H` `POST`
+
+### Эндпоинты
+
+| Окружение | Метод и URL |
+| :------------ | :-------------------------------------------- |
+| **Песочница** | `POST https://sandbox.alfabank.ru/oidc/token` |
+| **Пром** | `POST https://baas.alfabank.ru/oidc/token` |
+
+---
+
+### Описание
+
+В результате запроса будет получено три токена: `access_token`, `refresh_token`, `id_token`.
+
+> **Внимание**
+> Токен доступа действует **1 час**.
+
+> **Внимание**
+> Токен доступа может быть отозван в случае, если:
+>
+> - пользователь сменил пароль;
+> - пользователь превысил допустимое количество попыток ввода пароля;
+> - аккаунт пользователя был заблокирован.
+
+При использовании `curl` запроса с заголовком `"Content-Type": "application/x-www-form-urlencoded"` необходимо экранировать специальные символы параметра `client_secret`. В то время как `redirect_uri` экранировать не нужно.
+
+Если запрос отправляется через Postman с заголовком `"Content-Type": "application/x-www-form-urlencoded"` и `body` в формате `x-www-form-urlencoded` — нет необходимости экранировать специальные символы.
+
+Подробную информацию по экранированию можно посмотреть [здесь](/products/alfa-api/documentation/articles/alfa-id/articles/screening/screening).
+
+---
+
+### Параметры запроса
+
+#### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :--------------- | :----- | :------------- | :---------------------------------- |
+| **Accept** | string | required | `application/json` |
+| **Content-Type** | string | required | `application/x-www-form-urlencoded` |
+
+#### BODY
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :--------------------------------------------------- |
+| **grant_type** | string | required | Тип гранта. Возможные значения: `authorization_code` |
+| **code** | string | required | Код авторизации |
+| **client_id** | string | required | Идентификатор партнёрского сервиса |
+| **client_secret** | string | required | Секретный ключ партнёрского сервиса |
+| **redirect_uri** | string | required | URI перенаправления |
+| **code_verifier** | string | optional | Код верификатор |
+
+---
+
+### Пример запроса (cURL)
+
+```bash
+curl --location 'https://baas.alfabank.ru/oidc/token' \
+--header 'Content-Type: application/x-www-form-urlencoded' \
+--header 'Accept: application/json' \
+--data-urlencode 'grant_type=authorization_code' \
+--data-urlencode 'code=8962c304-89b1-11ec-a8a3-0242ac120002' \
+--data-urlencode 'client_id=0cee0683-85ae-49f2-a63d-29f97aad1911' \
+--data-urlencode 'client_secret=Qwerty1234567890Qwerty1234567890!' \
+--data-urlencode 'redirect_uri=https://wwww.partner.ru/code' \
+--data-urlencode 'code_verifier=string'
+```
+
+---
+
+### Параметры ответа
+
+#### Пример ответа 200 (OK)
+
+```json
+{
+ "access_token": "eyJraWQiOiJhbGZhLXRlc3Qtand0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ...",
+ "refresh_token": "13b8230b-b6bf-4bb9-b977-3bc0a988a5fd",
+ "token_type": "Bearer",
+ "expires_in": 3600,
+ "id_token": "eyJraWQiOiJhbGZhLXRlc3Qtand0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ..."
+}
+```
+
+#### Описание полей BODY (200 OK)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :------ | :------------- | :--------------------------- |
+| **access_token** | string | required | Токен доступа |
+| **refresh_token** | string | required | Токен обновления |
+| **token_type** | string | required | Тип токена |
+| **expires_in** | integer | optional | Срок жизни токена в секундах |
+| **id_token** | string | required | Идентификационный токен |
+
+---
+
+### Ошибки (400 Bad Request)
+
+| Значение | Описание |
+| :------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| **invalid_request** | Отсутствует обязательный параметр, неподдерживаемое значение параметра (кроме grant_type), повторение параметра, несколько учётных данных или неправильный формат запроса |
+| **invalid_client** | Ошибка аутентификации клиента (неизвестный клиент, отключенная аутентификация клиента или неподдерживаемый метод аутентификации) |
+| **invalid_grant** | Недействительное разрешение авторизации (недействительный код авторизации, токен обновления или несоответствие URI перенаправления) |
+| **unsupported_grant_type** | Тип разрешения на авторизацию (grant_type) не поддерживается сервером авторизации |
+| **internal_error** | Произошла непредвиденная ошибка |
+
+---
+
+### Описание клэймов access_token
+
+| Значение | Описание |
+| :----------------- | :-------------------------------------------------------------------- |
+| **iss** | URL-адрес Alfa ID по протоколу https (https://id.alfabank.ru/oidc) |
+| **sub** | Уникальный идентификатор Alfa ID пользователя (до 255 символов ASCII) |
+| **aud** | Идентификатор сервиса-партнёра (аудитория токена) |
+| **exp** | Время окончания срока действия токена (Unix timestamp UTC) |
+| **iat** | Время выпуска токена (Unix timestamp UTC) |
+| **scope_claims** | Массив клэймов области применения |
+| **scope_services** | Массив операций области применения |
+
+---
+
+### Описание клэймов ID_TOKEN
+
+| Значение | Описание | Scope |
+| :------------ | :--------------------------------------------------- | :----- |
+| **iss** | URL-адрес Alfa ID | openid |
+| **sub** | Уникальный идентификатор пользователя | openid |
+| **aud** | Идентификатор сервиса-партнёра | openid |
+| **exp** | Время окончания срока действия | openid |
+| **iat** | Время выпуска | openid |
+| **auth_time** | Время аутентификации пользователя | openid |
+| **nonce** | Значение для связи сессии и защиты от повторных атак | openid |
+| **acr** | Способ аутентификации пользователя | openid |
+| **azp** | Сторона, которой выдан токен (client_id) | openid |
+
+---
+
+**Навигация:**
+
+- [← Получение кода авторизации](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/get-auth-code/v1/get-auth-code)
+- [Обновление токена доступа →](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/token-update/v1/token-update)
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_H2H_Integrations/obtaining_an_authorization_code.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_H2H_Integrations/obtaining_an_authorization_code.md
new file mode 100644
index 0000000..13538f9
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_H2H_Integrations/obtaining_an_authorization_code.md
@@ -0,0 +1,59 @@
+# Получение кода авторизации
+
+**Тип интеграции:** `H2H`
+
+### Шаг 1. Формирование ссылки
+
+Для получения кода авторизации необходимо сформировать GET-запрос.
+
+#### Эндпоинты:
+
+- **Песочница:**
+ `GET https://id-sandbox.alfabank.ru/oidc/authorize?response_type=code&client_id={client_id}&redirect_uri={redirect_uri}&scope={scope}&state={state}`
+- **Пром:**
+ `GET https://id.alfabank.ru/oidc/authorize?response_type=code&client_id={client_id}&redirect_uri={redirect_uri}&scope={scope}&state={state}`
+
+#### Параметры:
+
+- `{client_id}` — идентификатор приложения Партнёра API, полученный после регистрации приложения на стороне Банка.
+- `{redirect_uri}` — URI-адрес перенаправления для получения кода авторизации (можно использовать [http://localhost](http://localhost)).
+- `{scope}` — области применения токена доступа, указывают, какие права должен содержать токен доступа (можно указать несколько через пробел), должны быть озвучены при регистрации приложения на стороне Банка. Например, для получения выписки необходимо указать `openid transactions`.
+- `{state}` — любое строковое значение для защиты от CSRF, например `string12345`.
+
+**Пример итоговой ссылки:**
+[https://id.alfabank.ru/oidc/authorize?response_type=code&client_id={client_id}&redirect_uri=http://localhost&scope=openid transactions&state=string12345](https://id.alfabank.ru/oidc/authorize?response_type=code&client_id=%7Bclient_id%7D&redirect_uri=http://localhost&scope=openid%20transactions&state=string12345)
+
+> **Внимание**
+> Не забывайте заменить `{client_id}` на реальное значение, полученное после регистрации приложения на стороне Банка.
+
+---
+
+### Шаг 2. Аутентификация
+
+1. В окне браузера отобразится страница аутентификации Alfa ID для ввода логина/пароля пользователя:
+
+
+
+2. После ввода логина/пароля пользователя отобразится страница второго фактора аутентификации для ввода otp-кода (sms, push):
+
+
+
+3. Необходимо ввести полученный на телефон otp-код (sms, push), и в адресной строке браузера отобразится код авторизации (`code`):
+
+
+
+---
+
+### Шаг 3. Получение кода авторизации
+
+Полученное в браузере **значение кода авторизации** (параметр `code` в URL) необходимо скопировать и **обменять на [токен доступа](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/get-access-token/v1/get-access-token)**.
+
+> **Внимание**
+> Код авторизации по умолчанию действует **2 минуты** и может быть использован только **1 раз**.
+
+---
+
+**Навигация:**
+
+- [← Как использовать ACF для H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro)
+- [Получение токена доступа →](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/get-access-token/v1/get-access-token)
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_H2H_Integrations/refreshing_access_token_POST.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_H2H_Integrations/refreshing_access_token_POST.md
new file mode 100644
index 0000000..3f1a9dd
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_H2H_Integrations/refreshing_access_token_POST.md
@@ -0,0 +1,120 @@
+# Обновление токена доступа
+
+**Тип интеграции:** H2H (Host-to-Host)
+
+## Эндпоинты
+
+| Среда | Метод и URL |
+| :------------ | :-------------------------------------------- |
+| **Песочница** | `POST https://sandbox.alfabank.ru/oidc/token` |
+| **Пром** | `POST https://baas.alfabank.ru/oidc/token` |
+
+## Описание
+
+В результате запроса, помимо нового токена доступа, вы также получите новый токен обновления, а старый `refresh_token` станет недействительным.
+
+> [!IMPORTANT]
+> **Внимание**
+>
+> - Токен обновления действует **180 дней** и не может быть использован более **2 раз**.
+> - Токен обновления может быть отозван, если:
+> - пользователь сменил пароль;
+> - пользователь превысил допустимое количество попыток ввода пароля;
+> - аккаунт пользователя был заблокирован.
+
+### Особенности кодирования
+
+- При использовании `curl` с заголовком `"Content-Type": "application/x-www-form-urlencoded"` необходимо экранировать специальные символы параметра `client_secret`. Параметр `redirect_uri` экранировать не нужно.
+- Если запрос отправляется через **Postman** с телом в формате `x-www-form-urlencoded` — экранировать символы вручную не требуется.
+- Подробную информацию по экранированию можно посмотреть [здесь](/products/alfa-api/documentation/articles/alfa-id/articles/screening/screening).
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :--------------- | :----- | :------------- | :---------------------------------- |
+| **Accept** | string | required | `application/json` |
+| **Content-Type** | string | required | `application/x-www-form-urlencoded` |
+
+### BODY
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :-------------------------------------------------------------------------------------------------------------------- |
+| **grant_type** | string | required | Тип гранта. Возможные значения: `refresh_token` |
+| **refresh_token** | string | required | Токен обновления. Обновить `access_token` можно только 2 раза. В дальнейшем нужно использовать новый `refresh_token`. |
+| **client_id** | string | required | Идентификатор партнёрского сервиса. |
+| **client_secret** | string | required | Секретный ключ партнёрского сервиса. |
+
+### Пример запроса (cURL)
+
+```bash
+curl --location 'https://baas.alfabank.ru/oidc/token' \
+--header 'Content-Type: application/x-www-form-urlencoded' \
+--header 'Accept: application/json' \
+--data-urlencode 'grant_type=refresh_token' \
+--data-urlencode 'refresh_token=13b8230b-b6bf-4bb9-b977-3bc0a988a5fd' \
+--data-urlencode 'client_id=0cee0683-85ae-49f2-a63d-29f97aad1911' \
+--data-urlencode 'client_secret=Qwerty1234567890Qwerty1234567890!'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+**BODY**
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **access_token** | string | required | Новый токен доступа. |
+| **refresh_token** | string | required | Новый токен обновления. |
+| **token_type** | string | required | Тип токена (обычно `Bearer`). |
+| **expires_in** | integer | optional | Срок жизни токена в секундах. |
+
+**Пример ответа:**
+
+```json
+{
+ "access_token": "eyJraWQiOiJhbGZhLXRlc3Qtand0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ...",
+ "refresh_token": "2cc8d34c-130a-4674-91fa-f9835fff6e88",
+ "token_type": "Bearer",
+ "expires_in": 3600
+}
+```
+
+### Ошибка (400 Bad Request)
+
+**BODY**
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **error** | string | required | Код ошибки. Например: `invalid_request` (неверные входные параметры). |
+| **error_description** | string | optional | Текстовое описание ошибки. |
+
+---
+
+## Дополнительная информация
+
+### Таблица возможных значений параметра error
+
+| Значение | Описание |
+| :----------------------- | :---------------------------------------------------------------------------------------------------------- |
+| `invalid_request` | Отсутствует обязательный параметр, неподдерживаемое значение, повторение параметра или неправильный формат. |
+| `invalid_client` | Ошибка аутентификации клиента (неизвестный ID или неверный secret). |
+| `invalid_grant` | Недействительный токен обновления или несоответствие URI. |
+| `unsupported_grant_type` | Тип `grant_type` не поддерживается сервером. |
+| `internal_error` | Внутренняя ошибка сервера. |
+
+### Описание клэймов access_token
+
+| Значение | Описание |
+| :----------------- | :----------------------------------------------- |
+| **iss** | URL-адрес Alfa ID (https://id.alfabank.ru/oidc). |
+| **sub** | Уникальный идентификатор пользователя. |
+| **aud** | Идентификатор сервиса-партнёра (аудитория). |
+| **exp** | Время окончания срока действия (Unix timestamp). |
+| **iat** | Время выпуска токена. |
+| **scope_claims** | Массив клэймов области применения. |
+| **scope_services** | Массив операций области применения. |
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_Holding_Companies/access_token_refresh.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_Holding_Companies/access_token_refresh.md
new file mode 100644
index 0000000..d7f034a
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_Holding_Companies/access_token_refresh.md
@@ -0,0 +1,126 @@
+# Обновление токена доступа
+
+**Типы интеграции:** `B2B`, `H2H`
+
+## Эндпоинты
+
+| Окружение | Метод | URL |
+| :------------ | :----- | :--------------------------------------- |
+| **Песочница** | `POST` | `https://sandbox.alfabank.ru/oidc/token` |
+| **Пром** | `POST` | `https://baas.alfabank.ru/oidc/token` |
+
+---
+
+## Описание
+
+В результате запроса, помимо нового токена доступа, вы также получите новый токен обновления, а старый `refresh_token` станет недействительным.
+
+> **Внимание**
+>
+> - Токен обновления действует **180 дней** и не может быть использован **более 2 раз**.
+> - При использовании `curl` запроса с заголовком `"Content-Type": "application/x-www-form-urlencoded"` необходимо экранировать специальные символы параметра `client_secret`. При этом `redirect_uri` экранировать не нужно.
+> - Если запрос отправляется через **Postman** с телом в формате `x-www-form-urlencoded` — экранировать символы не нужно.
+> - Подробную информацию по экранированию можно посмотреть [здесь](/products/alfa-api/documentation/articles/alfa-id/articles/screening/screening).
+
+### Токен обновления может быть отозван, если:
+
+- пользователь сменил пароль;
+- пользователь превысил допустимое количество попыток ввода пароля;
+- аккаунт пользователя был заблокирован.
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обяз. | Описание |
+| :--------------- | :----- | :---- | :---------------------------------- |
+| **Accept** | string | Да | `application/json` |
+| **Content-Type** | string | Да | `application/x-www-form-urlencoded` |
+
+### BODY (x-www-form-urlencoded)
+
+| Атрибут | Тип | Обяз. | Описание |
+| :---------------- | :----- | :---- | :-------------------------------------------------- |
+| **grant_type** | string | Да | Тип гранта. Значение: `refresh_token` |
+| **refresh_token** | string | Да | Токен обновления. Можно использовать только 2 раза. |
+| **client_id** | string | Да | Идентификатор партнёрского сервиса |
+| **client_secret** | string | Да | Секретный ключ партнёрского сервиса |
+
+### Пример запроса (cURL)
+
+```bash
+curl --location 'https://baas.alfabank.ru/oidc/token' \
+--header 'Content-Type: application/x-www-form-urlencoded' \
+--header 'Accept: application/json' \
+--data-urlencode 'grant_type=refresh_token' \
+--data-urlencode 'refresh_token=13b8230b-b6bf-4bb9-b977-3bc0a988a5fd' \
+--data-urlencode 'client_id=0cee0683-85ae-49f2-a63d-29f97aad1911' \
+--data-urlencode 'client_secret=Qwerty1234567890Qwerty1234567890!'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+| Атрибут | Тип | Описание |
+| :---------------- | :------ | :----------------------------------- |
+| **access_token** | string | Новый токен доступа |
+| **refresh_token** | string | Новый токен обновления |
+| **token_type** | string | Тип токена (обычно `Bearer`) |
+| **expires_in** | integer | Срок жизни токена доступа в секундах |
+
+**Пример ответа 200:**
+
+```json
+{
+ "access_token": "eyJraWQiOiJhbGZhLXRlc3Qtand0...",
+ "refresh_token": "2cc8d34c-130a-4674-91fa-f9835fff6e88",
+ "token_type": "Bearer",
+ "expires_in": 3600
+}
+```
+
+### Ошибка (400 Bad Request)
+
+| Атрибут | Тип | Описание |
+| :-------------------- | :----- | :--------------------------------------- |
+| **error** | string | Код ошибки (например, `invalid_request`) |
+| **error_description** | string | Описание ошибки |
+
+---
+
+## Справочные таблицы
+
+### Возможные значения параметра error
+
+| Значение | Описание |
+| :----------------------- | :-------------------------------------------------------------------------------------------------------------- |
+| `invalid_request` | Отсутствует обязательный параметр, неподдерживаемое значение, повторение параметра или неверный формат запроса. |
+| `invalid_client` | Ошибка аутентификации клиента (неизвестный клиент или неверный `client_secret`). |
+| `invalid_grant` | Недействительный `refresh_token`. |
+| `unsupported_grant_type` | Тип `grant_type` не поддерживается сервером. |
+| `internal_error` | Произошла непредвиденная ошибка на стороне сервера. |
+
+### Описание клэймов access_token
+
+| Клэйм | Описание |
+| :----------------- | :----------------------------------------------------- |
+| **iss** | URL-адрес Alfa ID (https://id.alfabank.ru/oidc) |
+| **sub** | Уникальный идентификатор Alfa ID пользователя |
+| **aud** | Идентификатор сервиса-партнёра (аудитория токена) |
+| **exp** | Время окончания срока действия токена (Unix Timestamp) |
+| **iat** | Время выпуска токена (Unix Timestamp) |
+| **scope_claims** | Массив клэймов области применения |
+| **scope_services** | Массив операций области применения |
+
+---
+
+**Полезные ссылки:**
+
+- [Новости в Telegram](https://t.me/AlfaAPI)
+- [Общая спецификация Alfa API](/products/alfa-api/documentation/articles/specification/specification)
+- [Инструкция по подключению](/products/alfa-api/documentation/articles/connection/connection)
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_Holding_Companies/getting_authorization_token.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_Holding_Companies/getting_authorization_token.md
new file mode 100644
index 0000000..4d2b5af
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_Holding_Companies/getting_authorization_token.md
@@ -0,0 +1,79 @@
+# Получение кода авторизации
+
+**Теги:** `B2B` `H2H`
+
+Процесс получения кода авторизации состоит из трех основных этапов:
+
+1. Сформируйте ссылку.
+2. Переадресация дочерней компании для прохождения аутентификации.
+3. Получение кода авторизации.
+
+---
+
+## Шаг 1. Формирование ссылки
+
+### Эндпоинты
+
+- **Песочница:**
+ `GET https://id-sandbox.alfabank.ru/oidc/authorize?response_type=code&client_id={client_id}&redirect_uri={redirect_uri}&scope={scope}&state={state}`
+- **Пром:**
+ `GET https://id.alfabank.ru/oidc/authorize?response_type=code&client_id={client_id}&redirect_uri={redirect_uri}&scope={scope}&state={state}`
+
+### Описание
+
+Ссылка должна содержать обязательные параметры, указанные ниже в таблице. Также опционально могут быть использованы необязательные параметры.
+
+При формировании ссылки указывайте весь доступный `scope` через знак пробела или (`%20`). Дополнительный параметр `prompt=consent` использовать только в том случае, если необходимо, чтобы дочерняя компания подписала/переподписала новое согласие.
+
+Сформированную ссылку необходимо передать своим дочерним компаниям.
+
+### Параметры запроса (QUERY)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------------------------ | :----- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------- |
+| **response_type** | string | required | Тип ответа. Возможные значения: `code` |
+| **client_id** | string | required | Идентификатор партнёрского сервиса (банк выдает партнёру API) |
+| **redirect_uri** | string | required | URI перенаправления, необходимый для переадресации пользователя после успешной авторизации. На этот URI будет отправлен код авторизации. |
+| **scope** | string | required | Область применения (партнёр API информирует, какой scope будет использован) |
+| **state** | string | required | Параметр для предотвращения межсайтовой подделки запросов. Значение генерирует партнёр (UUID, 36 символов). |
+| **nonce** | string | optional | Строковое значение для связи сессии клиента с ID-токеном и защиты от повторных атак. |
+| **code_challenge** | string | optional | Код вызова. |
+| **code_challenge_method** | string | optional | Метод преобразования кода верификатора. Значения: `plain`, `S256`. |
+| **prompt** | string | optional | Параметр повторной аутентификации/согласия. Значения: `none`, `login`, `consent`. |
+| **max_age** | string | optional | Максимальный период аутентификации. |
+
+### Пример ссылки
+
+```bash
+https://id.alfabank.ru/oidc/authorize?response_type=code&client_id=0cee0683-85ae-49f2-a63d-29f97aad1911&redirect_uri=https%3A%2F%2Fwwww.partner.ru%2Fcode&scope=openid&state=abcdef
+```
+
+---
+
+## Шаг 2. Аутентификация дочерней компании
+
+1. При переходе по ссылке дочерняя компания проходит процедуру аутентификации.
+ 
+
+2. Выбирает необходимую организацию (при работе с несколькими юридическими лицами).
+ 
+
+3. Далее проходит процедуру авторизации, **подписывая форму согласия**.
+ 
+
+4. После прохождения авторизации в адресной строке браузера отобразится код авторизации (`code`). Дочерней компании необходимо скопировать этот код и передать головной компании.
+ 
+
+---
+
+## Шаг 3. Получение кода авторизации
+
+Полученное от дочерней компании **значение кода авторизации** (code) необходимо скопировать и **обменять на [токен доступа](/products/alfa-api/documentation/articles/alfa-id/articles/acf-holding/articles/get-access-token/v1/get-access-token)**.
+
+> **Внимание**
+> Код авторизации по умолчанию действует **2 минуты** и может быть использован только **1 раз**.
+
+---
+
+**Далее:** [Получение токена доступа](/products/alfa-api/documentation/articles/alfa-id/articles/acf-holding/articles/get-access-token/v1/get-access-token)
+**Назад:** [Как использовать ACF для холдингов](/products/alfa-api/documentation/articles/alfa-id/articles/acf-holding/articles/intro/intro)
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_Holding_Companies/how_to_use_acf_for_holdings.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_Holding_Companies/how_to_use_acf_for_holdings.md
new file mode 100644
index 0000000..32a90df
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_Holding_Companies/how_to_use_acf_for_holdings.md
@@ -0,0 +1,34 @@
+Вот преобразованный в Markdown контент страницы. Я очистил его от лишнего программного кода и навигационных элементов портала, оставив только суть документации, ссылки и структуру.
+
+---
+
+# Как использовать ACF для холдингов
+
+**Теги:** `B2B` `H2H`
+
+Холдинги представляют собой интеграцию, которая включает в себя использования двух сценариев: партнёрские сервисы и прямая интеграция.
+
+С помощью одного `client_id` вы сможете выполнять запросы и операции по своей организации. Для этого необходимо получить `access_token` для прямой интеграции по [Authorization Code Flow для H2H-интеграций](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/acf-h2h).
+
+С помощью второго `client_id` вы сможете выполнять операции по своим дочерним компаниям.
+
+### Видео-инструкция
+[Скачать или посмотреть видео](/assets/developers-portal.docs.alfa-api/articles/alfa-id/articles/acf-holding/articles/intro/files/acf-holding.mp4)
+
+### Шаги авторизации
+1. **Формирование ссылки**
+2. **Получение кода авторизации**
+3. **Получение токена доступа**
+
+### Согласия пользователей
+Срок жизни согласия пользователя – **365 дней**, после его истечения необходимо заново пройти авторизацию. Для этого в ссылке на получение кода авторизации необходимо передать параметр `prompt = consent`.
+
+Узнать дату окончания действия согласия можно с помощью метода [Данные по согласиям пользователей](/products/alfa-api/documentation/articles/alfa-id/articles/expansion/articles/client-consents/v1/client-consents).
+
+### Дополнительно
+При необходимости вы можете [обновить](/products/alfa-api/documentation/articles/alfa-id/articles/acf-holding/articles/token-update/v1/token-update) токен или [отозвать](/products/alfa-api/documentation/articles/alfa-id/articles/expansion/articles/revoke-token/v1/revoke-token) его.
+
+---
+
+**Навигация:**
+← [Обновление токена доступа](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/token-update/v1/token-update) | [Получение кода авторизации](/products/alfa-api/documentation/articles/alfa-id/articles/acf-holding/articles/get-auth-code/v1/get-auth-code) →
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_Holding_Companies/obtaining_an_access_token.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_Holding_Companies/obtaining_an_access_token.md
new file mode 100644
index 0000000..e96a530
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/Authorization_Code_Flow_for_Holding_Companies/obtaining_an_access_token.md
@@ -0,0 +1,139 @@
+# Получение токена доступа
+
+### Эндпоинты
+
+| Окружение | Метод | URL |
+| :------------ | :----- | :--------------------------------------- |
+| **Песочница** | `POST` | `https://sandbox.alfabank.ru/oidc/token` |
+| **Пром** | `POST` | `https://baas.alfabank.ru/oidc/token` |
+
+---
+
+### Описание
+
+В результате запроса будет получено три токена: `access_token`, `refresh_token`, `id_token`.
+
+> **⚠️ Внимание**
+>
+> - Токен доступа действует **1 час**.
+> - Токен доступа может быть отозван, если:
+> - пользователь сменил пароль;
+> - пользователь превысил допустимое количество попыток ввода пароля;
+> - аккаунт пользователя был заблокирован;
+> - срок жизни согласия пользователя истёк.
+
+#### Особенности кодирования:
+
+- При использовании `curl` с заголовком `"Content-Type": "application/x-www-form-urlencoded"` необходимо **экранировать** специальные символы параметра `client_secret`. Параметр `redirect_uri` экранировать не нужно.
+- Если запрос отправляется через **Postman** (формат `x-www-form-urlencoded`) — экранировать символы вручную не требуется.
+- Подробную информацию по экранированию можно посмотреть [здесь](/products/alfa-api/documentation/articles/alfa-id/articles/screening/screening).
+
+---
+
+### Параметры запроса
+
+#### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :--------------- | :----- | :------------- | :---------------------------------- |
+| **Accept** | string | required | `application/json` |
+| **Content-Type** | string | required | `application/x-www-form-urlencoded` |
+
+#### BODY
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :--------------------------------------------------- |
+| **grant_type** | string | required | Тип гранта. Возможные значения: `authorization_code` |
+| **code** | string | required | Код авторизации |
+| **client_id** | string | required | Идентификатор партнёрского сервиса |
+| **client_secret** | string | required | Секретный ключ партнёрского сервиса |
+| **redirect_uri** | string | required | URI перенаправления |
+| **code_verifier** | string | optional | Код верификатор |
+
+---
+
+### Пример запроса (cURL)
+
+```bash
+curl --location 'https://baas.alfabank.ru/oidc/token' \
+--header 'Content-Type: application/x-www-form-urlencoded' \
+--header 'Accept: application/json' \
+--data-urlencode 'grant_type=authorization_code' \
+--data-urlencode 'code=8962c304-89b1-11ec-a8a3-0242ac120002' \
+--data-urlencode 'client_id=0cee0683-85ae-49f2-a63d-29f97aad1911' \
+--data-urlencode 'client_secret=Qwerty1234567890Qwerty1234567890!' \
+--data-urlencode 'redirect_uri=https://wwww.partner.ru/code' \
+--data-urlencode 'code_verifier=string'
+```
+
+---
+
+### Параметры ответа
+
+#### Пример ответа 200 (OK)
+
+```json
+{
+ "access_token": "eyJraWQiOiJhbGZhLXRlc3Qtand0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ...",
+ "refresh_token": "13b8230b-b6bf-4bb9-b977-3bc0a988a5fd",
+ "token_type": "Bearer",
+ "expires_in": 3600,
+ "id_token": "eyJraWQiOiJhbGZhLXRlc3Qtand0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ..."
+}
+```
+
+#### Описание полей ответа (BODY)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :------ | :------------- | :--------------------------- |
+| **access_token** | string | required | Токен доступа |
+| **refresh_token** | string | required | Токен обновления |
+| **token_type** | string | required | Тип токена (Bearer) |
+| **expires_in** | integer | optional | Срок жизни токена в секундах |
+| **id_token** | string | required | Идентификационный токен |
+
+---
+
+### Таблица возможных значений параметра error (400 Bad Request)
+
+| Значение | Описание |
+| :----------------------- | :---------------------------------------------------------------------------------------------------------- |
+| `invalid_request` | Отсутствует обязательный параметр, неподдерживаемое значение, повторение параметра или неправильный формат. |
+| `invalid_client` | Ошибка аутентификации клиента (неизвестный клиент или неверный метод). |
+| `invalid_grant` | Недействительный код авторизации, токен обновления или несоответствие URI. |
+| `unsupported_grant_type` | Тип `grant_type` не поддерживается сервером. |
+| `internal_error` | Произошла непредвиденная ошибка. |
+
+---
+
+### Описание клэймов access_token
+
+| Значение | Описание |
+| :----------------- | :------------------------------------------------ |
+| **iss** | URL-адрес Alfa ID (https://id.alfabank.ru/oidc) |
+| **sub** | Уникальный идентификатор пользователя Alfa ID |
+| **aud** | Идентификатор сервиса-партнёра (аудитория токена) |
+| **exp** | Время окончания срока действия (Unix timestamp) |
+| **iat** | Время выпуска токена |
+| **scope_claims** | Массив клэймов области применения |
+| **scope_services** | Массив операций области применения |
+
+---
+
+### Описание клэймов ID_TOKEN
+
+| Значение | Описание | Scope |
+| :------------ | :-------------------------------------------------- | :----- |
+| **iss** | URL-адрес Alfa ID | openid |
+| **sub** | Уникальный идентификатор пользователя | openid |
+| **aud** | Идентификатор сервиса-партнёра | openid |
+| **exp** | Время окончания срока действия | openid |
+| **iat** | Время выпуска JWT | openid |
+| **auth_time** | Время аутентификации пользователя | openid |
+| **nonce** | Значение для связи сессии (если передавалось ранее) | openid |
+| **acr** | Способ аутентификации пользователя | openid |
+| **azp** | Сторона, которой выдан токен (client_id) | openid |
+
+---
+
+_Документация Alfa API_
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/alfa_id_login_button.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/alfa_id_login_button.md
new file mode 100644
index 0000000..17d394d
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/alfa_id_login_button.md
@@ -0,0 +1,48 @@
+# Кнопка входа по Alfa ID
+
+**Теги:** `B2B` `B2C` `H2H`
+
+Для того чтобы Ваши пользователи могли аутентифицироваться через Alfa ID, вы можете добавить кнопку **«Войти по Alfa ID»**, реализовав её в соответствии с требованиями, указанными на официальной странице руководства:
+
+🔗 [https://alfabank.ru/sme/guide-alfaid](https://alfabank.ru/sme/guide-alfaid)
+
+### Исходные файлы
+
+Вы можете импортировать макет кнопки для использования в своем дизайне из следующего файла:
+📥 [Скачать button.fig](https://developers.alfabank.ru/assets/developers-portal.docs.alfa-api/articles/alfa-id/articles/button/files/button.fig)
+
+---
+
+## Общая информация об Alfa ID
+
+_(Данные из справочного раздела системы)_
+
+**Alfa ID** — единая учётная запись пользователя ЮЛ (юридического лица) / ФЛ (физического лица), которая помогает пользователям входить на ваш сайт или в приложение, а также в продукты и сервисы Альфа-Банка.
+
+### Преимущества для пользователей
+
+- Простая и быстрая аутентификация на сайтах и в приложениях;
+- Единый и безопасный аккаунт;
+- Упрощение процесса покупки или подачи заявки;
+- Безопасность персональных данных;
+- Не нужно запоминать множество паролей.
+
+### Преимущества для партнёров
+
+- Простая и быстрая аутентификация, выше конверсия на вход;
+- Быстрое получение актуальных данных пользователя от Банка;
+- Автозаполнение форм и заявок;
+- Проверка реальности пользователя;
+- Индустриальные стандарты защиты данных и персональной информации;
+- Отсутствие необходимости хранить персональные данные на своей стороне.
+
+### Рекомендуемые браузеры
+
+- **Яндекс Браузер:** версии 21 и выше;
+- **Safari:** версии 16 и выше;
+- **Google Chrome:** версии 117 и выше.
+
+---
+
+**Навигация:**
+← [Аутентификация](/products/alfa-api/documentation/articles/alfa-id/articles/authentication/authentication) | [Как использовать ACF](/products/alfa-api/documentation/articles/alfa-id/articles/acf/articles/intro/intro) →
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/authentication.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/authentication.md
new file mode 100644
index 0000000..835b0e3
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/authentication.md
@@ -0,0 +1,92 @@
+# Аутентификация
+
+**Теги:** `B2B` `B2C` `H2H`
+
+При входе через Alfa ID для вашего пользователя доступны следующие способы аутентификации:
+
+- логин и пароль;
+- QR-код;
+- электронная подпись;
+- биометрия.
+
+---
+
+### Логин и пароль
+
+Аутентификация по логину и паролю — пользователь вводит свой логин и пароль. После успешной аутентификации пользователь получает доступ к защищённым ресурсам.
+
+**Процесс аутентификации:**
+
+1. Введите свои учётные данные на странице входа.
+2. Введите код из СМС.
+
+---
+
+### QR-код
+
+Аутентификация по QR-коду — это технология, которая позволяет пользователям быстро и безопасно подтверждать свою личность путём сканирования QR-кода.
+
+**Процесс аутентификации:**
+
+1. Отсканируйте QR-код камерой мобильного устройства.
+2. Подтвердите вход через приложение Альфа-Бизнес Мобайл (АБМ).
+3. Введите код из СМС.
+
+> **Примечание**
+> Наличие приложения Альфа-Бизнес Мобайл (АБМ) является условием входа по QR-коду.
+
+---
+
+### Электронная подпись
+
+Аутентификация с помощью электронной подписи (ЭП) — это технология, основанная на применении средств криптографической защиты информации, для использования которой необходимо наличие токена (USB-носитель) с сертификатом и специализированного программного обеспечения на компьютере.
+
+Для аутентификации используются следующие виды ЭП:
+
+- квалифицированная электронная подпись (КЭП);
+- сертификат Альфа-Банка (неквалифицированная электронная подпись, НЭП).
+
+#### Квалифицированная электронная подпись (КЭП)
+
+**Процесс аутентификации:**
+
+1. Вставить токен с сертификатом КЭП в компьютер.
+2. Нажать на кнопку «Войти по токену».
+3. Нажать на кнопку «С сертификатом КЭП».
+4. Выбрать необходимый сертификат из списка.
+5. Ввести пароль (при его наличии) от сертификата.
+6. Ввести пароль от учётной записи Банка.
+
+#### Сертификат Альфа-Банка (НЭП)
+
+**Процесс аутентификации:**
+
+1. Вставить токен с сертификатом Альфа-Банка (НЭП) в компьютер.
+2. Нажать на кнопку «Войти по токену».
+3. Нажать на кнопку «С сертификатом Альфа-Банка».
+4. Выбрать необходимый сертификат из списка.
+5. Ввести пароль от токена.
+6. Ввести пароль от учётной записи Банка.
+
+---
+
+### Биометрия
+
+Аутентификация с помощью биометрических данных является одним из наиболее надёжных методов защиты информации. Она позволяет идентифицировать пользователя на основе его уникальных физических характеристик (отпечаток пальца, лицо).
+
+**Процесс аутентификации:**
+
+1. Выберите «Быстрый вход».
+2. Приложите палец или отсканируйте лицо.
+
+> **Примечание**
+>
+> 1. Данный способ аутентификации работает на устройствах, поддерживающих работу с биометрическими данными.
+> 2. Для того чтобы использовать данный способ аутентификации, необходимо предварительно пройти регистрацию биометрических данных при входе через логин и пароль.
+
+---
+
+### Навигация
+
+- [← Что такое Alfa ID](/products/alfa-api/documentation/articles/alfa-id/articles/intro/intro)
+- [Кнопка входа по Alfa ID →](/products/alfa-api/documentation/articles/alfa-id/articles/button/button)
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/client_credentials_flow/how_to_use_ccf.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/client_credentials_flow/how_to_use_ccf.md
new file mode 100644
index 0000000..ebc8dc2
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/client_credentials_flow/how_to_use_ccf.md
@@ -0,0 +1,114 @@
+# Как использовать CCF (Client Credentials Flow)
+
+**Теги:** `B2B` `B2C` `H2H`
+
+Вы можете использовать **Client Credentials Flow** в своих приложениях для получения доступа к определённому числу сервисов Alfa API. Доступ осуществляется с помощью `access_token`, который Вы получаете без участия пользователя.
+
+### Доступные методы
+
+Методы, доступные с помощью `access_token`, полученного по Client Credentials Flow:
+
+- [Платежи через СБП](/products/alfa-api/documentation/articles/sbp/articles/sbp-b2c/articles/intro/intro)
+- [Кредиты](/products/alfa-api/documentation/articles/scoring/scoring)
+- [Оплата покупок через СБП](/products/alfa-api/documentation/articles/sbp/articles/sbp-c2b/articles/intro/intro)
+- [Операции СБП для юрлиц](/products/alfa-api/documentation/articles/sbp/articles/sbp-b2b/articles/intro/intro)
+- [Дебетовая анкета](/products/alfa-api/documentation/articles/debit-cards/articles/intro/intro)
+- [Цифровые финансовые активы (ЦФА)](/products/alfa-api/documentation/articles/dfa/dfa)
+
+> **Важно:** Client Credentials Flow не позволяет использовать методы, которые содержат персональные данные пользователя или банковскую тайну. В соответствии с регуляторными требованиями, Банк обязан проверить полномочия представителя на получение такой информации.
+
+---
+
+## Шаги авторизации
+
+1. **Получение токена доступа** (см. детали ниже).
+
+### Дополнительно
+
+При необходимости вы можете [отозвать токен](/products/alfa-api/documentation/articles/alfa-id/articles/expansion/articles/revoke-token/v1/revoke-token).
+
+---
+
+## Техническая спецификация API
+
+### Получение токена доступа
+
+**Endpoint:** `POST https://baas.alfabank.ru/oidc/token`
+
+#### Заголовки (Headers)
+
+| Название | Обязательно | Значение |
+| :------------- | :---------- | :---------------------------------- |
+| `Content-Type` | Да | `application/x-www-form-urlencoded` |
+| `Accept` | Да | `application/json` |
+
+#### Параметры тела запроса (Request Body)
+
+| Параметр | Тип | Описание |
+| :-------------- | :----- | :---------------------------------------------------------------------------------------------------------- |
+| `grant_type` | string | Тип гранта. Для CCF обычно используется `client_credentials` (в данном примере указан `authorization_code`) |
+| `client_id` | uuid | Идентификатор партнёрского сервиса |
+| `client_secret` | string | Секретный ключ партнёрского сервиса |
+| `code` | uuid | Код авторизации |
+| `redirect_uri` | string | URI перенаправления |
+
+---
+
+## Примеры кода
+
+### cURL
+
+```bash
+curl --location 'https://baas.alfabank.ru/oidc/token' \
+--header 'Content-Type: application/x-www-form-urlencoded' \
+--header 'Accept: application/json' \
+--data-urlencode 'grant_type=authorization_code' \
+--data-urlencode 'code=8962c304-89b1-11ec-a8a3-0242ac120002' \
+--data-urlencode 'client_id=0cee0683-85ae-49f2-a63d-29f97aad1911' \
+--data-urlencode 'client_secret=Qwerty1234567890Qwerty1234567890!' \
+--data-urlencode 'redirect_uri=https://wwww.partner.ru/code'
+```
+
+### Python
+
+```python
+import requests
+
+url = "https://baas.alfabank.ru/oidc/token"
+payload = 'grant_type=authorization_code&code=8962c304-89b1-11ec-a8a3-0242ac120002&client_id=0cee0683-85ae-49f2-a63d-29f97aad1911&client_secret=Qwerty1234567890Qwerty1234567890!&redirect_uri=https%3A%2F%2Fwwww.partner.ru%2Fcode'
+headers = {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ 'Accept': 'application/json'
+}
+
+response = requests.request("POST", url, headers=headers, data=payload)
+print(response.text)
+```
+
+---
+
+## Возможные ошибки (параметр `error`)
+
+| Значение | Описание |
+| :----------------------- | :------------------------------------------------------------------ |
+| `invalid_request` | Отсутствует обязательный параметр или неверный формат запроса. |
+| `invalid_client` | Ошибка аутентификации клиента (неизвестный ID или неверный secret). |
+| `invalid_grant` | Недействительный код авторизации или несоответствие redirect_uri. |
+| `unsupported_grant_type` | Тип grant_type не поддерживается сервером. |
+| `internal_error` | Внутренняя ошибка сервера. |
+
+---
+
+## Структура ответа (Success 200 OK)
+
+При успешном запросе возвращается JSON со следующими полями:
+
+- `access_token`: Токен доступа (JWT). Действует 1 час.
+- `refresh_token`: Токен для обновления access_token.
+- `id_token`: Идентификационный токен.
+- `expires_in`: Срок жизни токена в секундах (3600).
+- `token_type`: Тип токена (Bearer).
+
+---
+
+_Документация Alfa API. [Портал разработчика](https://developers.alfabank.ru)_
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/client_credentials_flow/obteining_access_token_POST.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/client_credentials_flow/obteining_access_token_POST.md
new file mode 100644
index 0000000..e69de29
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/expansion/client-consents_GET.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/expansion/client-consents_GET.md
new file mode 100644
index 0000000..7a9b960
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/expansion/client-consents_GET.md
@@ -0,0 +1,119 @@
+# Данные по согласиям пользователей
+
+**Теги:** `B2B` `B2C` `H2H`
+
+## Эндпоинты
+
+### Песочница
+
+`GET https://sandbox.alfabank.ru/oidc/client-consents`
+
+### Пром
+
+`GET https://baas.alfabank.ru/oidc/client-consents`
+
+---
+
+## Описание
+
+Данный метод можно включать в `scope` с типом гранта [Client Credentials Flow](/products/alfa-api/documentation/articles/alfa-id/articles/ccf/articles/intro/intro) или с типом гранта [Authorization Code Flow](/products/alfa-api/documentation/articles/alfa-id/articles/acf/acf).
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :-------------------- |
+| **Authorization** | string | required | Bearer {access_token} |
+| **Accept** | string | required | application/json |
+
+### QUERY
+
+| Атрибут | Тип | Обязательность | Описание |
+| :--------------------- | :------ | :------------- | :------------------------------------------------------------------------------------ |
+| **clientId** | string | optional | Идентификатор партнёрского сервиса |
+| **sub** | string | optional | Идентификатор субъекта (пользователя) |
+| **organizationIdHash** | string | optional | Хэш идентификатора ЮЛ (организации) |
+| **isActive** | boolean | optional | Признак активного согласия |
+| **limit** | integer | optional | Количество объектов на одной странице. Значение по умолчанию: 1000 |
+| **offset** | integer | optional | Количество объектов в списке, которые необходимо пропустить. Значение по умолчанию: 0 |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/oidc/client-consents?clientId={clientId}&sub={sub}&organizationIdHash={organizationIdHash}&isActive={isActive}&limit={limit}&offset={offset}' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### 200 OK
+
+**HEADERS**
+
+- **Content-Type**: `application/json` (optional)
+
+**BODY**
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **pagination** | object | Данные пагинации |
+| ∟ **limit** | number | Количество записей на одной странице |
+| ∟ **offset** | number | Количество записей в списке, которые были пропущены |
+| ∟ **totalCount** | number | Общее количество записей |
+| **items** | array of objects | Массив объектов результата |
+| ∟ **createDateTime** | string | Дата и время создания (required) |
+| ∟ **sub** | string | Идентификатор субъекта (пользователя) (required) |
+| ∟ **organizationIdHash** | string | Хэш идентификатора ЮЛ (организации) (optional) |
+| ∟ **clientId** | string | Идентификатор партнёрского сервиса (required) |
+| ∟ **isActive** | boolean | Признак активного согласия (required) |
+| ∟ **expireDate** | string | Дата окончания действия (required) |
+
+#### Пример ответа 200
+
+```json
+{
+ "pagination": {
+ "limit": 1,
+ "offset": 0,
+ "totalCount": 1000
+ },
+ "items": [
+ {
+ "createDateTime": "2022-10-10T12:15:10",
+ "sub": "3228e68e-cc34-4b82-b43d-49112b5d9d3e",
+ "organizationIdHash": "665f4c5837ea35d1b081f4feb05de61522b6854c2268583f3f5865a0981f9268",
+ "clientId": "0cee0683-85ae-49f2-a63d-29f97aad1911",
+ "isActive": true,
+ "expireDate": "2023-04-10"
+ }
+ ]
+}
+```
+
+---
+
+### Ошибки
+
+| Код | Описание | Возможные значения `error` |
+| :------ | :-------------------- | :------------------------------------------------------------ |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры запроса |
+| **401** | Unauthorized | `invalid_token` — токен просрочен, отозван или недействителен |
+| **500** | Internal Server Error | `internal_error` — внутренняя ошибка сервиса |
+
+---
+
+## Навигация
+
+- ← [Отзыв токена доступа](/products/alfa-api/documentation/articles/alfa-id/articles/expansion/articles/revoke-token/v1/revoke-token)
+- → [Экранирование](/products/alfa-api/documentation/articles/alfa-id/articles/screening/screening)
+
+---
+
+_Документация Alfa API. [Официальный портал](https://developers.alfabank.ru/)_
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/expansion/revoke-token_POST.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/expansion/revoke-token_POST.md
new file mode 100644
index 0000000..438e7ae
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/expansion/revoke-token_POST.md
@@ -0,0 +1,76 @@
+# Отзыв токена доступа
+
+**Теги:** `B2B` `B2C` `H2H`
+
+## Эндпоинты
+
+| Окружение | Метод и URL |
+| :------------ | :--------------------------------------------- |
+| **Песочница** | `POST https://sandbox.alfabank.ru/oidc/revoke` |
+| **Пром** | `POST https://baas.alfabank.ru/oidc/revoke` |
+
+## Описание
+
+Данный метод используется для отзыва `access_token` и `refresh_token`.
+В случае отзыва `refresh_token`, `access_token` будет также отозван.
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :--------------- | :----- | :------------- | :---------------------------------- |
+| **Content-Type** | string | required | `application/x-www-form-urlencoded` |
+
+### BODY
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------------------ | :----- | :------------- | :----------------------------------------------------------------------------------------------------------------------- |
+| **client_id** | string | required | Идентификатор партнёрского сервиса |
+| **client_secret** | string | required | Секретный ключ партнёрского сервиса |
+| **token** | string | required | Отзываемый токен |
+| **token_type_hint** | string | optional | Тип отзываемого токена. Возможные значения: • `access_token` — токен доступа; • `refresh_token` — токен обновления |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location 'https://baas.alfabank.ru/oidc/revoke' \
+--header 'Content-Type: application/x-www-form-urlencoded' \
+--data-urlencode 'client_id=0cee0683-85ae-49f2-a63d-29f97aad1911' \
+--data-urlencode 'client_secret=Qwerty1234567890Qwerty1234567890!' \
+--data-urlencode 'token=string' \
+--data-urlencode 'token_type_hint=refresh_token'
+```
+
+---
+
+## Параметры ответа
+
+### 200 OK
+
+Нет тела ответа.
+
+### 400 Bad Request
+
+**Headers:**
+
+- `Content-Type: application/json` (optional)
+
+**Body:**
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **error** | string | required | Код ошибки. Возможные значения: • `invalid_request` — неверные входные параметры запроса |
+| **error_description** | string | optional | Описание ошибки |
+
+---
+
+## Навигация
+
+- [← Проверка подписи](/products/alfa-api/documentation/articles/alfa-id/articles/expansion/articles/signature-checking/signature-checking)
+- [Данные по согласиям пользователей →](/products/alfa-api/documentation/articles/alfa-id/articles/expansion/articles/client-consents/v1/client-consents)
+
+---
+
+_Документация Alfa ID / Расширение сценариев_
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/expansion/signature-checking.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/expansion/signature-checking.md
new file mode 100644
index 0000000..625b7be
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/expansion/signature-checking.md
@@ -0,0 +1,155 @@
+# Проверка подписи
+
+Проверить подпись можно для трех сущностей:
+
+- `id_token`;
+- `access_token`;
+- `userinfo`.
+
+Партнёр API получает ответ в формате сформированного токена **JWS**, который состоит из:
+
+- **Заголовка (Header)**, содержащего алгоритм подписи, идентификатор ключа и тип токена;
+- **JSON-объекта (Payload)**, в котором перечислены клэймы полезной нагрузки;
+- **Электронной подписи (Signature)**, содержащей подпись данных секретным ключом, парным открытому ключу, выпущенному для Alfa ID.
+
+### Декодирование компактной сериализации JWS
+
+JWS формируется из трех составляющих и представляет структуру вида:
+`Base64URL(Header).Base64URL(Payload).Base64URL(Signature)`
+
+---
+
+#### Пример access_token
+
+**Закодированный токен:**
+`eyJraWQiOiJhbGZhLXRlc3Qtand0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiIzMjI4ZTY4ZS1jYzM0LTRiODItYjQzZC00OTExMmI1ZDlkM2UiLCJhdWQiOiIwY2VlMDY4My04NWFlLTQ5ZjItYTYzZC0yOWY5N2FhZDE5MTEiLCJpc3MiOiJodHRwczpcL1wvaWQuYWxmYWJhbmsucnUiLCJleHAiOjE2MzE2NjY2NjMsInNjb3BlX3NlcnZpY2VzIjpbInBheW1lbnQiLCJzdGF0ZW1lbnQiXSwiaWF0IjoxNjMxNjYzMDYzLCJzY29wZV9jbGFpbXMiOlsibmFtZSIsImdpdmVuX25hbWUiLCJmYW1pbHlfbmFtZSIsIm1pZGRsZV9uYW1lIiwiZW1haWwiLCJwaG9uZV9udW1iZXIiXX0.WVr5xkQSEGqpPXN3aIo0zHZLDL0vvtxEEQ83BrgJo7l0BjjALeGDRYENF2bL8j3n1pXRnduiBQcYNV6teBhESI8V_8kd7Kh7LTePkJWadPSvD__KskC69b4XZ-zN-IQ73NmAcBDStnnhSXGKL6xhdRy-TGiAoKPsRWiDVntsDlpCQNHAt3tJk8q_SQS4S1k6qju9eJ2GFkgmd6z8rR2vaBykaOF0K61ltksw6YgXhuek3OlYkqIAivyKYl59uio8zMpJk-YrPlmawwmvWPF0vKhaLj8Mvn4mVMsVSfuVVKP2ksHG0MAlWpO3Sh9GoKO4d6TQplJ4vgIIeNx-44npqw`
+
+**Раскодированные данные:**
+
+**Header**
+
+```json
+{
+ "kid": "alfa-test-jwt",
+ "typ": "JWT",
+ "alg": "RS256"
+}
+```
+
+**Payload**
+
+```json
+{
+ "sub": "3228e68e-cc34-4b82-b43d-49112b5d9d3e",
+ "aud": "0cee0683-85ae-49f2-a63d-29f97aad1911",
+ "iss": "https://id.alfabank.ru",
+ "exp": 1631666663,
+ "scope_services": ["payment", "statement"],
+ "iat": 1631663063,
+ "scope_claims": [
+ "name",
+ "given_name",
+ "family_name",
+ "middle_name",
+ "email",
+ "phone_number"
+ ]
+}
+```
+
+**Signature**
+
+```javascript
+RSASHA256(
+ base64UrlEncode(header) + "." + base64UrlEncode(payload),
+ your - 256 - bit - secret,
+); // secret base64 encoded
+```
+
+---
+
+#### Пример JWS идентификационного токена id_token
+
+Каждая часть, разделённая точкой, должна декодироваться отдельно с использованием алгоритма Base64URL Encoding.
+
+**Закодированный токен:**
+`eyJraWQiOiJhbGZhLXRlc3Qtand0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ .eyJzdWIiOiIzMjI4ZTY4ZS1jYzM0LTRiODItYjQzZC00OTExMmI1ZDlkM2UiLCJhdWQiOiIwY2VlMDY4My04NWFlLTQ5ZjItYTYzZC0yOWY5N2FhZDE5MTEiLCJhY3IiOiJMb0EzIiwiYXpwIjoiMGNlZTA2ODMtODVhZS00OWYyLWE2M2QtMjlmOTdhYWQxOTExIiwiYXV0aF90aW1lIjoxNjMxNjYzMDUzLCJpc3MiOiJodHRwczpcL1wvaWQuYWxmYWJhbmsucnUiLCJleHAiOjE2MzE2NjY2NjMsImlhdCI6MTYzMTY2MzA2Mywibm9uY2UiOiJuLTBTNl9XekEyTWoifQ .xBE6LEUxOKleHCZVQacldJfKr5KtyyvJKCCmInqapmRJ_aRF-cEoVfpJd_kxlNmJYT7AcjMMppovNkmhB49VL5DK8FhF0fvRgLskKR9Eohy4eiC8ued03Z1LyLz1H7EcKSkusaCIajzIvxxZfVtSHI4jmgLg6ItXPdZgIDUWINgESkl6I7IP5CbfONHweNnbkWEOEzxDgGGnxxtPxrWVoPVP-ijUeUSH_iESHfrhY_ePRMYi2If62IsKX_0GT5BHRYOhXVDZ9fyn5fRCvg8_QoCykDVIOZMtWQ3w4TadqS0dfMlsLBxkVbVftzH2fWRLTCX3SJ5AXiytHkpow8V45w`
+
+**Раскодированные данные:**
+
+**Header**
+
+```json
+{
+ "kid": "alfa-test-jwt",
+ "typ": "JWT",
+ "alg": "RS256"
+}
+```
+
+**Payload**
+
+```json
+{
+ "sub": "3228e68e-cc34-4b82-b43d-49112b5d9d3e",
+ "aud": "0cee0683-85ae-49f2-a63d-29f97aad1911",
+ "acr": "LoA3",
+ "azp": "0cee0683-85ae-49f2-a63d-29f97aad1911",
+ "auth_time": 1631663053,
+ "iss": "https://id.alfabank.ru",
+ "exp": 1631666663,
+ "iat": 1631663063,
+ "nonce": "n-0S6_WzA2Mj"
+}
+```
+
+---
+
+#### Пример userinfo
+
+**Закодированный токен:**
+`eyJraWQiOiJhbGZhLXRlc3Qtand0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJjdXMiOiJVQUFBQUEiLCJzdWIiOiIzMjI4ZTY4ZS1jYzM0LTRiODItYjQzZC00OTExMmI1ZDlkM2UiLCJiaXJ0aGRhdGUiOiIyMDAwLTAyLTIwIiwicm9sZSI6IkFDQ09VTlRBTlQsIE1BTkFHRVIiLCJnZW5kZXIiOiJNQUxFIiwiaWRlbnRpdHlfZG9jdW1lbnRfbmFtZSI6ItCf0LDRgdC_0L7RgNGCINCz0YDQsNC20LTQsNC90LjQvdCwINCg0KQiLCJpZGVudGl0eV9kb2N1bWVudF9udW1iZXIiOjIyMjIyMiwiaXNzIjoiaHR0cHM6XC9cL2JhYXMuYWxmYWJhbmsucnUiLCJpbm4iOjc0MTUxMTExMjIyMiwiZWlvIjp0cnVlLCJnaXZlbl9uYW1lIjoi0KLQtdGB0YIiLCJtaWRkbGVfbmFtZSI6ItCi0LXRgdGC0L7QstC40YciLCJhY3VzIjoiWEFBQUFBIiwiaWRlbnRpdHlfZG9jdW1lbnRfc2VyaWVzIjoxMTExLCJhdWQiOiIwY2VlMDY4My04NWFlLTQ5ZjItYTYzZC0yOWY5N2FhZDE5MTEiLCJhY2xjIjoiWEFBQUExIiwidXBkYXRlZF9hdCI6IjIwMjItMDEtMjAiLCJuYW1lIjoi0KLQtdGB0YLQvtCyINCi0LXRgdGCINCi0LXRgdGC0L7QstC40YciLCJwaG9uZV9udW1iZXIiOjc5MTkxMTEyMjMzLCJjbGMiOiJVQUFBQTEiLCJmYW1pbHlfbmFtZSI6ItCi0LXRgdGC0L7QsiIsImVtYWlsIjoiZW1haWxAZW1haWwucnUifQ.WVr5xkQSEGqpPXN3aIo0zHZLDL0vvtxEEQ83BrgJo7l0BjjALeGDRYENF2bL8j3n1pXRnduiBQcYNV6teBhESI8V_8kd7Kh7LTePkJWadPSvD__KskC69b4XZ-zN-IQ73NmAcBDStnnhSXGKL6xhdRy-TGiAoKPsRWiDVntsDlpCQNHAt3tJk8q_SQS4S1k6qju9eJ2GFkgmd6z8rR2vaBykaOF0K61ltksw6YgXhuek3OlYkqIAivyKYl59uio8zMpJk-YrPlmawwmvWPF0vKhaLj8Mvn4mVMsVSfuVVKP2ksHG0MAlWpO3Sh9GoKO4d6TQplJ4vgIIeNx-44npqw`
+
+**Payload (раскодированный)**
+
+```json
+{
+ "cus": "UAAAAA",
+ "sub": "3228e68e-cc34-4b82-b43d-49112b5d9d3e",
+ "birthdate": "2000-02-20",
+ "role": "ACCOUNTANT, MANAGER",
+ "gender": "MALE",
+ "identity_document_name": "Паспорт гражданина РФ",
+ "identity_document_number": 222222,
+ "iss": "https://baas.alfabank.ru",
+ "inn": 741511112222,
+ "eio": true,
+ "given_name": "Тест",
+ "middle_name": "Тестович",
+ "acus": "XAAAAA",
+ "identity_document_series": 1111,
+ "aud": "0cee0683-85ae-49f2-a63d-29f97aad1911",
+ "aclc": "XAAAA1",
+ "updated_at": "2022-01-20",
+ "name": "Тестов Тест Тестович",
+ "phone_number": 79191112233,
+ "clc": "UAAAA1",
+ "family_name": "Тестов",
+ "email": "email@email.ru"
+}
+```
+
+---
+
+### Алгоритм проверки подписи
+
+1. Вычислите хэш-функцию **SHA256** от данных `Base64URL(Header).Base64URL(Payload)`.
+2. Дешифруйте данные `Base64URL(Signature)`, используя алгоритм **RS256** и открытый ключ с идентификатором, переданным в Заголовке (Header) в клэйме `kid` (в приведенном выше примере это `alfa-test-jwt`).
+3. Сравните вычисленный хэш из 1 шага и дешифрованные данные из 2 шага. Если значения равны, значит, подпись верна.
+
+**Сертификат для проверки электронной подписи:** [certificate-prod](/assets/developers-portal.docs.alfa-api/articles/alfa-id/articles/expansion/articles/signature-checking/files/cert.cer)
+
+---
+
+_Навигация:_
+[← Получение токена доступа](/products/alfa-api/documentation/articles/alfa-id/articles/ccf/articles/get-access-token/v1/get-access-token) | [Отзыв токена доступа →](/products/alfa-api/documentation/articles/alfa-id/articles/expansion/articles/revoke-token/v1/revoke-token)
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/screening_eg_character_shielding.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/screening_eg_character_shielding.md
new file mode 100644
index 0000000..103288c
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/screening_eg_character_shielding.md
@@ -0,0 +1,70 @@
+Вот преобразованный контент страницы в формат Markdown. Я сохранил структуру, иерархию заголовков, примеры кода и таблицу кодировки.
+
+---
+
+# Экранирование
+
+**Теги:** `B2B` `B2C` `H2H`
+
+**Путь:** [Главная](https://developers.alfabank.ru/) / Alfa ID / Экранирование
+
+---
+
+**Экранирование специальных символов** — это процесс преобразования специальных символов (например, кавычек, пробелов, знаков препинания) в их соответствующие эквиваленты для передачи данных через различные протоколы и форматы.
+
+Процентное кодирование или кодирование URI-адресов представляет собой метод кодирования произвольных данных с использованием ограниченных символов US-ASCII, разрешённых в URI.
+
+Синтаксис URI содержит зарезервированные символы (двух типов) и незарезервированные символы.
+
+### Зарезервированные символы
+
+* **gen-delims**: `":"`, `"/"`, `"?"`, `"# "`, `"["`, `"]"`, `"@"` — символы, разделяющие URI на крупные компоненты.
+* **sub-delims**: `"!"`, `"$ "`, `"&"`, `"' "`, `"("`, `")"`, `"* "`, `"+"`, `","`, `";"`, `"="` — символы, разделяющие крупный компонент на более мелкие составляющие.
+
+### Незарезервированные символы
+
+В общем случае незарезервированные символы — это `ALPHA`, `DIGIT`, `"-"`, `"."`, `"_"`, `"~"`, где `ALPHA` — это буквы, а `DIGIT` — десятичные цифры.
+
+Если символ из набора зарезервированных символов используется в другом контексте, то он должен быть закодирован в процентах. Процентное кодирование зарезервированного символа представляет собой замену/преобразование символа в соответствующее ему значение.
+
+Например, зарезервированный символ `"/"` может быть заменен следующими символами: `%2F`.
+
+---
+
+### Примеры запросов
+
+#### Пример запроса без экранирования
+```bash
+https://id.alfabank.ru/oidc/authorize?response_type=code&client_id=0cee0683-85ae-49f2-a63d-29f97aad1911&redirect_uri=https://wwww.partner.ru/code&scope=openid&state=abcdef
+```
+
+#### Пример запроса с экранированием
+```bash
+https://id.alfabank.ru/oidc/authorize?response_type=code&client_id=0cee0683-85ae-49f2-a63d-29f97aad1911&redirect_uri=https%3A%2F%2Fwwww.partner.ru%2Fcode&scope=openid&state=abcdef
+```
+
+---
+
+### Таблица кодирования символов
+
+| Символ | ANSI (Percent-encoding) |
+| :--- | :--- |
+| `~` | `%7E` |
+| `` ` `` | `%60` |
+| `'` | `%27` |
+| `"` | `%22` |
+| `@` | `%40` |
+| `?` | `%3F` |
+| `!` | `%21` |
+| `#` | `%23` |
+| `№` | `%B9` |
+| `$` | `%24` |
+
+---
+
+### Навигация
+* ← [Данные по согласиям пользователей](/products/alfa-api/documentation/articles/alfa-id/articles/expansion/articles/client-consents/v1/client-consents)
+* [API Key](/products/alfa-api/documentation/articles/api-key/api-key) →
+
+---
+*Документация Alfa API*
diff --git a/_docs/alfabank/payin_and_kyc/Alfa_ID/what_is_alfa_id.md b/_docs/alfabank/payin_and_kyc/Alfa_ID/what_is_alfa_id.md
new file mode 100644
index 0000000..99b09ef
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Alfa_ID/what_is_alfa_id.md
@@ -0,0 +1,83 @@
+# Что такое Alfa ID
+
+**Alfa ID** — единая учётная запись пользователя ЮЛ (юридического лица) / ФЛ (физического лица), которая помогает пользователям входить на ваш сайт или в приложение, а также в продукты и сервисы Альфа-Банка.
+
+### Преимущества для пользователей
+
+- Простая и быстрая аутентификация на сайтах и в приложениях;
+- Единый и безопасный аккаунт;
+- Упрощение процесса покупки или подачи заявки;
+- Безопасность персональных данных;
+- Не нужно запоминать множество паролей.
+
+### Преимущества для партнёров
+
+- Простая и быстрая аутентификация, выше конверсия на вход;
+- Быстрое получение актуальных данных пользователя от Банка;
+- Автозаполнение форм и заявок;
+- Проверка реальности пользователя;
+- Индустриальные стандарты защиты данных и персональной информации;
+- Отсутствие необходимости хранить персональные данные на своей стороне.
+
+### Рекомендуемые браузеры для работы с Alfa ID
+
+- **Яндекс Браузер** версии 21 и выше;
+- **Safari** версии 16 и выше;
+- **Google Chrome** версии 117 и выше.
+
+---
+
+## Инструкция: Настройка прав доступа
+
+По умолчанию доступ к Порталу разработчика имеет только руководитель вашей организации. Для предоставления доступа другим пользователям (например, разработчикам), необходимо создать соответствующую роль в «Альфа-Бизнес».
+
+> **Внимание для ИП:**
+> Права разработчика можно назначить от имени самого ИП (роль «Руководитель») или от имени любого другого сотрудника с ролью «Руководитель» (потребуется подтверждение от владельца ИП).
+
+### Шаг 1. Перейдите в раздел «Пользователи и роли»
+
+На главном экране Альфа-Бизнес перейдите в настройки компании.
+
+
+В разделе **Моя компания** выберите карточку **Пользователи и роли**.
+
+
+### Шаг 2. Создайте новую роль
+
+Нажмите **Создать роль**.
+
+Укажите название роли (например, «Разработчик API»).
+
+
+Далее настройте права. Рекомендуется создавать роль на основании прав руководителя, сбросив лишнее:
+
+1. Нажмите **Снять все**, чтобы сбросить права руководителя.
+ 
+2. В разделе **Обслуживание бизнеса** выберите **Alfa API**, указав необходимые права.
+ 
+3. Нажмите **Создать роль** для сохранения.
+
+### Шаг 3. Назначьте роль разработчику
+
+В разделе **Пользователи** нажмите на три точки справа от нужного сотрудника и выберите **Сменить роль**.
+
+
+Выберите созданную роль и нажмите **Сменить**.
+
+
+Подтвердите смену роли кодом из СМС.
+
+
+После успешной смены в записи пользователя отобразится статус **Подключён**. Теперь пользователь может работать с Порталом разработчика.
+
+
+---
+
+## Требования к полномочиям для авторизации
+
+Для корректной работы H2H-интеграций ключ доступа (`access_token` / `API Key`) должен получать пользователь, обладающий правами на конкретные сервисы:
+
+- **При использовании ACF H2H:** Авторизацию в Alfa ID должен проходить пользователь, у которого в Альфа-Бизнес настроены полномочия на использование выбранных `scopes`.
+- **При использовании API Key:** Выпускать ключ должен пользователь, имеющий права на те продукты, которые выбраны при выпуске ключа.
+
+**Пример:** Если у разработчика есть права на редактирование интеграций, но нет прав на «Просмотр выписки», то выпущенный им API Key для сервиса `transactions` работать не будет.
diff --git a/_docs/alfabank/payin_and_kyc/Вебхуки/create-webhook.md b/_docs/alfabank/payin_and_kyc/Вебхуки/create-webhook.md
new file mode 100644
index 0000000..48b4bed
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Вебхуки/create-webhook.md
@@ -0,0 +1,120 @@
+# Создание вебхука
+
+**Типы интеграции:** `B2B` `B2C` `H2H`
+**Метод:** `POST`
+
+Сервис информирования при наступлении в системе события, на которое подписан Партнёр API.
+
+## Эндпоинты
+
+| Окружение | URL |
+| :------------ | :------------------------------------------------- |
+| **Песочница** | `POST https://sandbox.alfabank.ru/api/v1/webhooks` |
+| **Пром** | `POST https://baas.alfabank.ru/api/v1/webhooks` |
+
+---
+
+## Scope
+
+`scope` события, на которое подписываетесь, с допустимыми значениями можно посмотреть [здесь](/products/alfa-api/documentation/articles/webhooks/webhooks).
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | `string` | **required** | Bearer {access_token}, полученный по [Authorization Code Flow](/products/alfa-api/documentation/articles/alfa-id/articles/acf/articles/intro/intro) / [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | `string` | **required** | `application/json` |
+| **Content-Type** | `string` | **required** | `application/json` |
+
+### BODY
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :---------------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **object** | `string` | **required** | Объект/сущность, на который партнёр API хочет подписаться. Возможные значения: • `ul_transaction_default` — получение выписки; • `jp_sbp_incoming_payments` — получение входящих платежей. |
+| **data** | `object` | optional | Дополнительные данные по вебхукам. Список полей зависит от события. Для `jp_sbp_incoming_payments` не заполняется. |
+| **data.accounts** | `array of string` | optional | Список счетов. Заполняется при `object: ul_transaction_default`. Если не переданы, вебхук создается на все доступные счета. |
+| **callbackUri** | `string` | **required** | URL партнёра. Должен соответствовать хосту `redirect_uri` из настроек Alfa ID (проверка по домену второго уровня). |
+| **version** | `integer` | optional | Версия формата данных. Для текущих объектов возможное значение — `1`. |
+
+---
+
+## Пример запроса
+
+```bash
+curl -X POST https://baas.alfabank.ru/api/v1/webhooks \
+ -H 'Authorization: Bearer {token}' \
+ -H 'Accept: application/json' \
+ -H 'Content-Type: application/json' \
+ -d '{
+ "object": "ul_transaction_default",
+ "data": {
+ "accounts": [
+ "40702810800000000001",
+ "40702810800000000004",
+ "40702810800000000007"
+ ]
+ },
+ "callbackUri": "https://webhook.partner.ru/api/v1/webhook-events",
+ "version": 1
+ }'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (201 Created)
+
+| Атрибут | Тип | Описание |
+| :-------------- | :-------- | :------------------------------------------------------------------------ |
+| **id** | `uuid` | Идентификатор записи вебхука. |
+| **object** | `string` | Сущность подписки (`ul_transaction_default`, `jp_sbp_incoming_payments`). |
+| **enabled** | `boolean` | Статус вебхука (`true` — включён, `false` — выключен). |
+| **data** | `object` | Дополнительные данные (например, список `accounts`). |
+| **callbackUri** | `string` | URL партнёра, на который будет отправлен вебхук. |
+| **version** | `integer` | Версия формата данных. |
+
+**Пример JSON ответа:**
+
+```json
+{
+ "id": "f9f8c674-7a2a-4297-bdb8-ddd3013de3a3",
+ "object": "ul_transaction_default",
+ "enabled": true,
+ "data": {
+ "accounts": [
+ "40702810800000000001",
+ "40702810800000000004",
+ "40702810800000000007"
+ ]
+ },
+ "callbackUri": "https://webhook.partner.ru/api/v1/webhook-events",
+ "version": 1
+}
+```
+
+---
+
+## Ошибки
+
+| Код | Описание (error) | Описание ошибки (error_description) |
+| :------ | :------------------------ | :-------------------------------------------------------------- |
+| **400** | `invalid_request` | Неверные входные параметры запроса. |
+| **401** | `invalid_token` | Токен просрочен, отозван или имеет неправильный формат. |
+| **403** | `insufficient_scope` | Нет прав на использование сервиса (настройки scope). |
+| **403** | `insufficient_privileges` | Нет доступа к `callbackUri` или вебхуки выключены для партнёра. |
+| **404** | `unknown_route` | Эндпоинт не найден или неактивен. |
+| **429** | — | Too Many Requests (превышение лимита запросов). |
+| **500** | `internal_error` | Внутренняя ошибка сервиса. |
+| **503** | — | Service Unavailable (сервис временно недоступен). |
+
+> **Примечание:** Значения параметров ошибок могут изменяться. Рекомендуем предусмотреть стандартную обработку ошибок, не описанных выше.
+
+---
+
+**Навигация:**
+← [Как подключить](/products/alfa-api/documentation/articles/webhooks/articles/intro/intro) | [Редактирование вебхука](/products/alfa-api/documentation/articles/webhooks/articles/edit-webhook/v1/edit-webhook) →
diff --git a/_docs/alfabank/payin_and_kyc/Вебхуки/delete-webhook.md b/_docs/alfabank/payin_and_kyc/Вебхуки/delete-webhook.md
new file mode 100644
index 0000000..56396b6
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Вебхуки/delete-webhook.md
@@ -0,0 +1,98 @@
+Ниже представлен сконвертированный из HTML текст документации в формате Markdown. Все ссылки сохранены, структура таблиц и примеров кода приведена к удобному для чтения виду.
+
+---
+
+# Удаление вебхука
+
+**Теги:** `B2B` `B2C` `H2H`
+
+## Эндпоинты
+
+| Среда | Метод и URL |
+| :--- | :--- |
+| **Песочница** | `DELETE https://sandbox.alfabank.ru/api/v1/webhooks/{id}` |
+| **Пром** | `DELETE https://baas.alfabank.ru/api/v1/webhooks/{id}` |
+
+### Scope
+`scope` события, на которое подписываетесь, с допустимыми значениями можно посмотреть [здесь](https://developers.alfabank.ru/products/alfa-api/documentation/articles/webhooks/webhooks).
+
+---
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | string | **required** | Bearer {access_token}, полученный по [Authorization Code Flow](https://developers.alfabank.ru/products/alfa-api/documentation/articles/alfa-id/articles/acf/articles/intro/intro) / [Authorization Code Flow H2H](https://developers.alfabank.ru/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | **required** | `application/json` |
+| **Content-Type** | string | optional | `application/json` |
+
+### PATH
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **id** | uuid | **required** | Идентификатор вебхука |
+
+### QUERY
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **object** | string | **required** | Объект/сущность, на который партнёр API хочет подписаться. Возможные значения: • `ul_transaction_default` — получение выписки; • `jp_sbp_incoming_payments` — получение входящих платежей. |
+
+---
+
+## Пример запроса
+
+```bash
+curl -X DELETE https://baas.alfabank.ru/api/v1/webhooks/f9f8c674-7a2a-4297-bdb8-ddd3013de3a3?object=ul_transaction_default \
+ -H 'Authorization: Bearer {token}' \
+ -H 'Accept: application/json' \
+ -H 'Content-Type: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### 200 — OK
+Нет тела ответа.
+
+### 400 — Bad Request
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **error** | string | required | Код ошибки: `invalid_request` — неверные входные параметры запроса |
+| **error_description** | string | optional | Описание ошибки |
+
+### 401 — Unauthorized
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **error** | string | required | Код ошибки: `invalid_token` — предоставленный токен просрочен, отозван или недействителен |
+| **error_description** | string | optional | Описание ошибки |
+
+### 403 — Forbidden
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **error** | string | required | Код ошибки: • `insufficient_scope` — нет прав (настройки scope); • `insufficient_privileges` — вебхуки выключены для клиента или сервиса |
+| **error_description** | string | optional | Описание ошибки |
+
+### 404 — Not Found
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **error** | string | required | Код ошибки: `unknown_route` — эндпоинт не найден или неактивен |
+| **error_description** | string | optional | Описание ошибки |
+
+### 429 — Too Many Requests
+Нет тела ответа.
+
+### 500 — Internal Server Error
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **error** | string | required | Код ошибки: `internal_error` — внутренняя ошибка сервиса |
+| **error_description** | string | optional | Описание ошибки |
+
+### 503 — Service Unavailable
+Нет тела ответа.
+
+> **Примечание:** Значения параметров ошибок могут изменяться. Рекомендуем предусмотреть стандартную обработку ошибок, не описанных в данной документации.
+
+---
+**Навигация:**
+[← Редактирование вебхука](https://developers.alfabank.ru/products/alfa-api/documentation/articles/webhooks/articles/edit-webhook/v2/edit-webhook) | [Получение вебхука →](https://developers.alfabank.ru/products/alfa-api/documentation/articles/webhooks/articles/get-webhook/v1/get-webhook)
diff --git a/_docs/alfabank/payin_and_kyc/Вебхуки/edit-webhook.md b/_docs/alfabank/payin_and_kyc/Вебхуки/edit-webhook.md
new file mode 100644
index 0000000..1404ba8
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Вебхуки/edit-webhook.md
@@ -0,0 +1,132 @@
+Ниже представлено содержимое документа, преобразованное в структурированный Markdown.
+
+---
+
+# Редактирование вебхука
+
+**Теги:** `B2B` `B2C` `H2H`
+**Версия:** Последняя версия v2
+
+## Эндпоинты
+
+| Окружение | Метод и URL |
+| :--- | :--- |
+| **Песочница** | `PUT https://sandbox.alfabank.ru/api/v2/webhooks/{id}` |
+| **Пром** | `PUT https://baas.alfabank.ru/api/v2/webhooks/{id}` |
+
+### Scope
+`scope` события, на которое подписываетесь, с допустимыми значениями можно посмотреть [здесь](/products/alfa-api/documentation/articles/webhooks/webhooks).
+
+---
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | `string` | **required** | Bearer {access_token}, полученный по [Authorization Code Flow](/products/alfa-api/documentation/articles/alfa-id/articles/acf/articles/intro/intro) / [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | `string` | **required** | `application/json` |
+| **Content-Type** | `string` | **required** | `application/json` |
+
+### PATH
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **id** | `uuid` | **required** | Идентификатор вебхука |
+
+### BODY
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **object** | `string` | **required** | Объект/сущность для подписки: • `ul_transaction_default` — получение выписки; • `jp_sbp_incoming_payments` — получение входящих платежей |
+| **enabled** | `boolean` | optional | Статус: `true` (включён), `false` (выключен) |
+| **organizationIdHash** | `string` | optional | Хэш идентификатора организации |
+| **data** | `object` | optional | Дополнительные данные. Для `jp_sbp_incoming_payments` не заполняется. |
+| **data.accounts** | `array of string`| optional | Список счетов. При `object: ul_transaction_default` — **обязательно** (передавать все счета). Пустой массив = вебхук на все счета. |
+| **callbackUri** | `string` | optional | URL партнёра. Можно менять только `path`, менять `host` нельзя. |
+| **version** | `integer` | optional | Версия формата данных. Допустимое значение — `1`. |
+
+---
+
+## Пример запроса
+
+```bash
+curl -X PUT https://baas.alfabank.ru/api/v2/webhooks/f9f8c674-7a2a-4297-bdb8-ddd3013de3a3 \
+ -H 'Authorization: Bearer {token}' \
+ -H 'Accept: application/json' \
+ -H 'Content-Type: application/json' \
+ -H 'X-Request-ID: {uuid}' \
+ -d '{
+ "object": "ul_transaction_default",
+ "enabled": true,
+ "data": {
+ "accounts": [
+ "40802810401300015422",
+ "40802810401300015422"
+ ]
+ },
+ "callbackUri": "https://webhook.partner.ru/api/v1/webhook-events",
+ "version": 1
+ }'
+```
+
+---
+
+## Параметры ответа
+
+### Пример ответа 200 (ОК)
+
+```json
+{
+ "id": "f9f8c674-7a2a-4297-bdb8-ddd3013de3a3",
+ "object": "ul_transaction_default",
+ "enabled": true,
+ "organizationIdHash": "ff22df927f36344155f7075fae297541fcfca87e3dabef5aa9c951a21c4f072c",
+ "data": {
+ "accounts": [
+ "40702810800000000001",
+ "40702810800000000004",
+ "40702810800000000007"
+ ]
+ },
+ "callbackUri": "https://webhook.partner.ru/api/v1/webhook-events",
+ "version": 1,
+ "statusDescriptions": [
+ {
+ "cause": "Revocation of agreement",
+ "description": "The webhook is disabled due to the agreement being revoked in Alfa ID"
+ },
+ {
+ "cause": "Disabled by administrator",
+ "description": "Webhook disabled by administrator"
+ }
+ ]
+}
+```
+
+### Описание полей ответа (200 OK)
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **id** | `uuid` | Идентификатор записи |
+| **object** | `string` | Сущность подписки (`ul_transaction_default` или `jp_sbp_incoming_payments`) |
+| **enabled** | `boolean` | Статус активации |
+| **data.accounts** | `array` | Список счетов (для выписок) |
+| **callbackUri** | `string` | URL получения уведомлений |
+| **statusDescriptions** | `array` | Причины выключения вебхука (если есть) |
+
+---
+
+## Коды ошибок
+
+| Код | Описание | Возможные значения `error` |
+| :--- | :--- | :--- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры |
+| **401** | Unauthorized | `invalid_token` — токен просрочен или недействителен |
+| **403** | Forbidden | `insufficient_scope` — нет прав доступа; `insufficient_privileges` — нет доступа к callbackUri |
+| **404** | Not Found | `unknown_route` — эндпоинт не найден |
+| **429** | Too Many Requests | Нет тела ответа |
+| **500** | Internal Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа |
+
+> **Рекомендация:** Значения параметров ошибок могут изменяться. Рекомендуем предусмотреть стандартную обработку ошибок, не описанных в текущей версии документации.
+
+---
+[← Назад к списку: Редактирование вебхука v1](/products/alfa-api/documentation/articles/webhooks/articles/edit-webhook/v1/edit-webhook) | [Вперёд: Удаление вебхука →](/products/alfa-api/documentation/articles/webhooks/articles/delete-webhook/v1/delete-webhook)
diff --git a/_docs/alfabank/payin_and_kyc/Вебхуки/get-webhook.md b/_docs/alfabank/payin_and_kyc/Вебхуки/get-webhook.md
new file mode 100644
index 0000000..8d8fe50
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Вебхуки/get-webhook.md
@@ -0,0 +1,124 @@
+# Получение вебхука
+
+**Типы интеграции:** `B2B`, `B2C`, `H2H`
+**Версия API:** `v2` (Последняя)
+
+Метод позволяет получить информацию о конкретном вебхуке по его идентификатору.
+
+---
+
+## Эндпоинты
+
+| Среда | Метод и URL |
+| :------------ | :----------------------------------------------------- |
+| **Песочница** | `GET https://sandbox.alfabank.ru/api/v2/webhooks/{id}` |
+| **Пром** | `GET https://baas.alfabank.ru/api/v2/webhooks/{id}` |
+
+### Scope
+
+`scope` события, на которое подписываетесь, с допустимыми значениями можно посмотреть [здесь](/products/alfa-api/documentation/articles/webhooks/webhooks).
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обяз. | Описание |
+| :---------------- | :----- | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string | required | `Bearer {access_token}`, полученный по [Authorization Code Flow](/products/alfa-api/documentation/articles/alfa-id/articles/acf/articles/intro/intro) / [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | `application/json` |
+| **Content-Type** | string | optional | `application/json` |
+
+### PATH (Параметры пути)
+
+| Атрибут | Тип | Обяз. | Описание |
+| :------ | :--- | :------- | :-------------------- |
+| **id** | uuid | required | Идентификатор вебхука |
+
+### QUERY (Параметры строки запроса)
+
+| Атрибут | Тип | Обяз. | Описание |
+| :--------- | :----- | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **object** | string | required | Объект/сущность, на который партнер хочет подписаться: • `ul_transaction_default` — получение выписки; • `jp_sbp_incoming_payments` — получение входящих платежей. |
+
+---
+
+## Пример запроса
+
+```bash
+curl -X GET https://baas.alfabank.ru/api/v2/webhooks/f9f8c674-7a2a-4297-bdb8-ddd3013de3a3?object=ul_transaction_default \
+ -H 'Authorization: Bearer {token}' \
+ -H 'Accept: application/json' \
+ -H 'Content-Type: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+| Атрибут | Тип | Описание |
+| :--------------------- | :------------ | :------------------------------------------------------------------------ |
+| **id** | uuid | Идентификатор записи |
+| **object** | string | Объект подписки (`ul_transaction_default` или `jp_sbp_incoming_payments`) |
+| **enabled** | boolean | Статус вебхука: `true` — включен, `false` — выключен |
+| **organizationIdHash** | string | Хэш идентификатора организации |
+| **data** | object | Дополнительные данные. Список полей зависит от события. |
+| └ **accounts** | array[string] | Список счетов (для `ul_transaction_default`) |
+| **callbackUri** | string | URL партнёра, на который отправляется вебхук |
+| **version** | integer | Версия формата данных. Для текущих объектов значение — `1`. |
+| **statusDescriptions** | array[object] | Описание статуса выключения вебхука |
+| └ **cause** | string | Причина выключения |
+| └ **description** | string | Описание причины |
+
+#### Пример ответа 200:
+
+```json
+{
+ "id": "f9f8c674-7a2a-4297-bdb8-ddd3013de3a3",
+ "object": "ul_transaction_default",
+ "enabled": true,
+ "organizationIdHash": "ff22df927f36344155f7075fae297541fcfca87e3dabef5aa9c951a21c4f072c",
+ "data": {
+ "accounts": [
+ "40702810800000000001",
+ "40702810800000000004",
+ "40702810800000000007"
+ ]
+ },
+ "callbackUri": "https://webhook.partner.ru/api/v1/webhook-events",
+ "version": 1,
+ "statusDescriptions": [
+ {
+ "cause": "Revocation of agreement",
+ "description": "The webhook is disabled due to the agreement being revoked in Alfa ID"
+ },
+ {
+ "cause": "Disabled by administrator",
+ "description": "Webhook disabled administrator"
+ }
+ ]
+}
+```
+
+---
+
+## Коды ошибок
+
+| Код | Описание | Ошибка (`error`) |
+| :------ | :------------------ | :--------------------------------------------------------------- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры |
+| **401** | Unauthorized | `invalid_token` — токен просрочен, отозван или недействителен |
+| **403** | Forbidden | `insufficient_scope` — нет прав на использование сервиса (scope) |
+| **404** | Not Found | `unknown_route` — эндпоинт не найден или неактивен |
+| **429** | Too Many Requests | Нет тела ответа |
+| **500** | Internal Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа |
+
+> **Рекомендация:** Значения параметров ошибок могут изменяться. Рекомендуем предусмотреть стандартную обработку ошибок, не описанных в текущей версии документации.
+
+---
+
+_Документация Alfa API_
diff --git a/_docs/alfabank/payin_and_kyc/Вебхуки/get-webhooks-list.md b/_docs/alfabank/payin_and_kyc/Вебхуки/get-webhooks-list.md
new file mode 100644
index 0000000..94fd957
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Вебхуки/get-webhooks-list.md
@@ -0,0 +1,131 @@
+# Получение списка вебхуков
+
+`B2B` `B2C` `H2H`
+
+Метод позволяет получить список всех настроенных вебхуков для конкретного объекта подписки.
+
+### Эндпоинты
+
+| Окружение | Метод | URL |
+| :------------ | :---- | :-------------------------------------------- |
+| **Песочница** | `GET` | `https://sandbox.alfabank.ru/api/v2/webhooks` |
+| **Пром** | `GET` | `https://baas.alfabank.ru/api/v2/webhooks` |
+
+### Scope
+
+`scope` события, на которое подписываетесь, с допустимыми значениями можно посмотреть [здесь](/products/alfa-api/documentation/articles/webhooks/webhooks).
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обяз. | Описание |
+| :---------------- | :----- | :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow](/products/alfa-api/documentation/articles/alfa-id/articles/acf/articles/intro/intro) / [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | `application/json` |
+| **Content-Type** | string | optional | `application/json` |
+
+### QUERY
+
+| Атрибут | Тип | Обяз. | Описание |
+| :--------- | :------ | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **object** | string | required | Объект/сущность, на который партнёр API хочет подписаться. Возможные значения: • `ul_transaction_default` — получение выписки; • `jp_sbp_incoming_payments` — получение входящих платежей. |
+| **offset** | integer | optional | Смещение в результатах поиска. |
+| **limit** | integer | optional | Количество элементов на странице. |
+
+### Пример запроса
+
+```bash
+curl -X GET https://baas.alfabank.ru/api/v2/webhooks?offset=20&limit=10&object=ul_transaction_default \
+ -H 'Authorization: Bearer {token}' \
+ -H 'Accept: application/json' \
+ -H 'Content-Type: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+#### Тело ответа (JSON)
+
+| Атрибут | Тип | Описание |
+| :----------------------- | :------ | :---------------------------------------------------------------------------------------------------------- |
+| **pagination** | object | Данные пагинации |
+| ∟ **limit** | number | Количество объектов на одной странице |
+| ∟ **offset** | number | Количество объектов в списке, которые необходимо пропустить |
+| ∟ **totalCount** | number | Общее количество записей |
+| **items** | array | Массив объектов результата |
+| ∟ **id** | uuid | Идентификатор записи |
+| ∟ **object** | string | Объект/сущность подписки (`ul_transaction_default`, `jp_sbp_incoming_payments`) |
+| ∟ **enabled** | boolean | Статус вебхука: `true` — включён, `false` — выключен |
+| ∟ **organizationIdHash** | string | Хэш идентификатора организации |
+| ∟ **data** | object | Дополнительные данные. Поле **accounts** (array of string) заполняется при `object: ul_transaction_default` |
+| ∟ **callbackUri** | string | URL партнёра, на который отправляется вебхук |
+| ∟ **version** | integer | Версия формата данных (возможные значения — `1`) |
+| ∟ **statusDescriptions** | array | Описание причин выключения вебхука |
+| ∟∟ **cause** | string | Причина выключения |
+| ∟∟ **description** | string | Описание причины |
+
+#### Пример ответа 200
+
+```json
+{
+ "pagination": {
+ "offset": 45,
+ "limit": 10,
+ "totalCount": 100
+ },
+ "items": [
+ {
+ "id": "f9f8c674-7a2a-4297-bdb8-ddd3013de3a3",
+ "object": "ul_transaction_default",
+ "enabled": true,
+ "organizationIdHash": "ff22df927f36344155f7075fae297541fcfca87e3dabef5aa9c951a21c4f072c",
+ "data": {
+ "accounts": [
+ "40702810800000000001",
+ "40702810800000000004",
+ "40702810800000000007"
+ ]
+ },
+ "callbackUri": "https://webhook.partner.ru/api/v1/webhook-events",
+ "version": 1,
+ "statusDescriptions": [
+ {
+ "cause": "Revocation of agreement",
+ "description": "The webhook is disabled due to the agreement being revoked in Alfa ID"
+ },
+ {
+ "cause": "Disabled by administrator",
+ "description": "Webhook disabled administrator"
+ }
+ ]
+ }
+ ]
+}
+```
+
+---
+
+## Ошибки
+
+| Код | Описание | Возможные `error` |
+| :------ | :------------------ | :--------------------------------------------------- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры |
+| **401** | Unauthorized | `invalid_token` — токен просрочен или недействителен |
+| **403** | Forbidden | `insufficient_scope` — недостаточно прав (scope) |
+| **404** | Not Found | `unknown_route` — эндпоинт не найден |
+| **429** | Too Many Requests | Нет тела ответа (превышен лимит запросов) |
+| **500** | Internal Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа (сервис временно недоступен) |
+
+> Значения параметров ошибок могут изменяться. Рекомендуем предусмотреть стандартную обработку ошибок, не описанных в текущей версии документации.
+
+---
+
+**Навигация:**
+← [Получение вебхука](/products/alfa-api/documentation/articles/webhooks/articles/get-webhook/v2/get-webhook) | [Партнёрский метод для получения вебхуков](/products/alfa-api/documentation/articles/webhooks/articles/partner-webhook/v1/partner-webhook) →
diff --git a/_docs/alfabank/payin_and_kyc/Вебхуки/partner-webhook.md b/_docs/alfabank/payin_and_kyc/Вебхуки/partner-webhook.md
new file mode 100644
index 0000000..2193e0c
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Вебхуки/partner-webhook.md
@@ -0,0 +1,136 @@
+# Партнёрский метод для получения вебхуков
+
+На стороне партнёра должен быть реализован метод **POST** с URL, на который будет отправляться вебхук. Важно, чтобы второй уровень домена совпадал со вторым уровнем домена, который указывали в качестве `redirect_uri` при интеграции с Alfa ID. Подробнее [в инструкции по подключению вебхуков](/products/alfa-api/documentation/articles/webhooks/webhooks).
+
+### **Авторизация**
+
+Реализованный метод может быть как открытым, так и закрыт авторизацией. В случае, если метод закрыт авторизацией, необходимо отправить письмо на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru) с данными, как авторизоваться в методе. Для авторизации запросов может использоваться:
+
+- **Client Credentials Flow** ([RFC 6749](https://datatracker.ietf.org/doc/html/rfc6749))
+- **Basic Authentication** ([RFC 7617](https://datatracker.ietf.org/doc/html/rfc7617))
+
+### **Время ответа**
+
+Метод партнёра должен возвращать ответ не более чем за **300 миллисекунд**. Это оптимальная скорость ответа для обеспечения стабильной работы интеграции и оперативной обработки событий.
+
+### **Retry-запросы**
+
+Если метод партнёра отвечает с ошибкой, превышает сконфигурированное время ожидания или Банку не удаётся отправить запрос, то банк отправляет retry-запросы на доставку вебхука.
+
+**Интервалы повторной отправки:** 30 секунд, 5 минут, 30 минут, 1 час, 3 часа, 6 часов, 12 часов, 24 часа, 48 часов, 72 часа.
+
+**Возможные причины отправки retry-запроса:**
+
+- был получен ответ с одним из следующих статусов: 401, 408, 409, 429, 500, 502, 503, 504, 507, 508, 509;
+- ответ на запрос не был получен в пределах сконфигурированного времени ожидания (5 секунд);
+- не удалось установить TCP-соединение;
+- хост недоступен или не отвечает.
+
+> **Важно:** Для предотвращения отправки Банком лишних retry-запросов необходимо возвращать коды, отличные от 2xx, только при возникновении технических сбоев на стороне партнёра.
+
+### **Выписки**
+
+В сервисе ["Выписки по счетам юрлиц"](/products/alfa-api/documentation/articles/transactions/transactions) в методах есть уникальный идентификатор транзакции (`transactionId`). Важно, чтобы партнёр на своей стороне игнорировал задублированные сообщения по этому идентификатору, возвращая код успешной обработки (2xx).
+
+### **Входящие платежи по СБП для юрлиц**
+
+В методе ["Получение входящих платежей"](/products/alfa-api/documentation/articles/sbp/articles/sbp-b2b/articles/incoming-payments/v1/incoming-payments) есть уникальный идентификатор операции НСПК (`nspkTransactionId`). Важно игнорировать задублированные сообщения по этому идентификатору, возвращая код успешной обработки (2xx).
+
+---
+
+## Параметры запроса (BODY)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :----------------- | :----- | :------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **actionType** | string | required | Действие над объектом. Возможные значения: `create` (создание), `update` (обновление), `delete` (удаление). |
+| **eventTime** | string | required | Время, когда произошло событие. |
+| **object** | string | required | Объект/сущность подписки: `ul_transaction_default` (выписка), `jp_sbp_incoming_payments` (входящие платежи СБП). |
+| **data** | object | required | Данные по вебхукам. Поля зависят от объекта (см. методы [«Получение выписки»](/products/alfa-api/documentation/articles/transactions/articles/statement/v1/statement) или [«Получение входящих платежей»](/products/alfa-api/documentation/articles/sbp/articles/sbp-b2b/articles/incoming-payments/v1/incoming-payments)). |
+| **organizationId** | string | optional | Идентификатор организации. |
+| **sub** | string | optional | Идентификатор субъекта. |
+
+---
+
+## Пример запроса
+
+```bash
+curl -X POST https://webhook.partner.ru/api/v1/webhook-events \
+-H "Content-Type: application/json" \
+-d '[
+ {
+ "actionType": "create",
+ "eventTime": "2022-01-12T00:00:00",
+ "object": "ul_transaction_default",
+ "organizationId": "vvvvvv",
+ "sub": "f7490296-1ae1-11ec-9621-0242ac130002",
+ "data": {
+ "amount": {
+ "amount": 1.00,
+ "currencyName": "RUR"
+ },
+ "amountRub": {
+ "amount": 1.00,
+ "currencyName": "RUR"
+ },
+ "correspondingAccount": "30101810200000000593",
+ "direction": "CREDIT",
+ "documentDate": "2022-01-12",
+ "filial": "АО \"АЛЬФА-БАНК\" г Москва",
+ "number": "178",
+ "operationCode": "01",
+ "operationDate": "2022-01-12T00:00:00",
+ "paymentPurpose": "Перевод собственных средств. НДС не облагается.",
+ "priority": "5",
+ "revaln": null,
+ "uuid": "9084d309-b30b-5083-9a54-d4522472e11a",
+ "transactionId": "1220112MOCO#DS4001415",
+ "rurTransfer": {
+ "cartInfo": {
+ "documentCode": null,
+ "documentContent": null,
+ "documentDate": null,
+ "documentNumber": null,
+ "paymentNumber": null,
+ "restAmount": null
+ },
+ "deliveryKind": "электронно",
+ "departmentalInfo": {
+ "uip": "1",
+ "drawerStatus101": "01",
+ "kbk": "18210102010011000110",
+ "oktmo": "12301000",
+ "reasonCode106": "ТП",
+ "taxPeriod107": "ГД.01.2022",
+ "docNumber108": "123",
+ "docDate109": "12.01.2022",
+ "paymentKind110": "1"
+ },
+ "payeeAccount": "40702810301300000763",
+ "payeeBankBic": "044525593",
+ "payeeBankCorrAccount": "30101810200000000593",
+ "payeeBankName": "АО \"АЛЬФА-БАНК\" г Москва",
+ "payeeInn": "0140237176",
+ "payeeKpp": "770801001",
+ "payeeName": "Полное наименование Орг № 11329",
+ "payerAccount": "40702810701300000761",
+ "payerBankBic": "044525593",
+ "payerBankCorrAccount": "30101810200000000593",
+ "payerBankName": "АО \"АЛЬФА-БАНК\" г Москва",
+ "payerInn": "0140237176",
+ "payerKpp": "770801001",
+ "payerName": "Полное наименование Орг № 11329",
+ "payingCondition": null,
+ "purposeCode": "2",
+ "receiptDate": "2022-01-12",
+ "valueDate": "2022-01-12"
+ }
+ }
+ }
+]'
+```
+
+---
+
+## Параметры ответа
+
+В случае успешной обработки ответа на стороне клиента необходимо вернуть любой код успешной обработки (**2xx**).
diff --git a/_docs/alfabank/payin_and_kyc/Вебхуки/webhooks_intro.md b/_docs/alfabank/payin_and_kyc/Вебхуки/webhooks_intro.md
new file mode 100644
index 0000000..aab1806
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Вебхуки/webhooks_intro.md
@@ -0,0 +1,57 @@
+# Как подключить вебхуки
+
+**Теги:** `B2B` `B2C` `H2H`
+
+Вебхук — это механизм информирования при наступлении в системе события, на которое подписан партнёр API.
+
+Вебхуки повышают эффективность рабочих процессов. Для получения новой информации достаточно будет создать вебхук, и Банк сам будет отправлять информацию по изменениям состояния системы.
+
+Используется токен доступа, полученный по [Authorization Code Flow](/products/alfa-api/documentation/articles/alfa-id/articles/acf/acf) для партнёрских сервисов или по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/acf-h2h) для прямой интеграции.
+
+---
+
+### Инструкция по подключению
+
+1. **Отправить письмо** на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru) с указанием `callbackUri` и события, на которое хотите подписаться.
+2. **Реализовать метод:** Партнёру API на своей стороне необходимо реализовать открытый [Партнёрский метод для получения вебхуков](/products/alfa-api/documentation/articles/webhooks/articles/partner-webhook/v1/partner-webhook).
+3. **Подписаться на событие** с помощью метода [«Создание вебхука»](/products/alfa-api/documentation/articles/webhooks/articles/create-webhook/v1/create-webhook).
+4. **Управлять вебхуками**, используя следующие методы:
+ - [Редактирование вебхука](/products/alfa-api/documentation/articles/webhooks/articles/edit-webhook/v2/edit-webhook)
+ - [Удаление вебхука](/products/alfa-api/documentation/articles/webhooks/articles/delete-webhook/v1/delete-webhook)
+ - [Получение вебхука](/products/alfa-api/documentation/articles/webhooks/articles/get-webhook/v2/get-webhook)
+ - [Получение списка вебхуков](/products/alfa-api/documentation/articles/webhooks/articles/get-lists-webhooks/v2/get-lists-webhooks)
+
+Инструкция по тестированию вебхуков представлена [здесь](/products/alfa-api/documentation/articles/sandbox/articles/check-webhook/articles/intro/intro).
+
+---
+
+### Требования к полю callbackUri
+
+В поле `callbackUri` необходимо указывать хост, который указывали в качестве `redirect_uri` при интеграции с Alfa ID. Проверка будет проводиться только на соответствие домена второго уровня.
+
+Это позволяет расширить возможные варианты для `callbackUri`. Например, если в качестве `redirect_uri` был указан [https://partner.ru](https://partner.ru), то можно создать следующие `callbackUri`:
+
+- [https://partner.ru](https://partner.ru)
+- [https://webhook.alfa.partner.ru](https://webhook.alfa.partner.ru)
+- [https://webhook.partner.ru](https://webhook.partner.ru)
+- [https://webhook.partner.partner.partner.ru](https://webhook.partner.partner.partner.ru)
+
+> **Важно**
+> Для создания вебхука с другим хостом необходимо удалить уже существующий вебхук.
+
+---
+
+### Допустимые значения scope
+
+| Событие | scope |
+| :-------------------------------- | :------------- |
+| Операции по счетам | `transactions` |
+| Входящие платежи по СБП для юрлиц | `b2b-sbp` |
+
+---
+
+**Дополнительные материалы:**
+
+- **Предыдущая тема:** [Шифрование TXT ГОСТ-сертификатом](/products/alfa-api/documentation/articles/signature-encryption/articles/encryption/articles/text-gost/text-gost)
+- **Следующая тема:** [Создание вебхука](/products/alfa-api/documentation/articles/webhooks/articles/create-webhook/v1/create-webhook)
+- **Видео-инструкция:** [Смотреть MP4](/assets/developers-portal.docs.alfa-api/articles/webhooks/articles/intro/files/webhooks.mp4)
diff --git a/_docs/alfabank/payin_and_kyc/Обмен_файлами/download.md b/_docs/alfabank/payin_and_kyc/Обмен_файлами/download.md
new file mode 100644
index 0000000..1a3977e
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Обмен_файлами/download.md
@@ -0,0 +1,114 @@
+# Скачивание файла
+
+**Метки:** `B2B` `B2C` `H2H`
+
+## Этапы процесса
+
+1. **Получите ссылку для скачивания файла.** Подробнее в пункте «Получение ссылки».
+2. **Выполните запрос на скачивание файла.** Подробнее в пункте «Запрос на скачивание».
+3. **Скачивание файла.**
+
+---
+
+## Получение ссылки
+
+Первым шагом необходимо получить ссылку на скачивание файла в рамках Вашего взаимодействия. Ниже приведен пример получаемой Вами ссылки для скачивания файла с описанием параметров.
+
+### Атрибуты тела ответа (BODY)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------------------------------------ | :-------------- | :------------- | :------------------------------------------- |
+| **downloadFileLinks** | array of object | optional | Ссылка для скачивания файла из Банка |
+| └─ **url** | string | optional | Ссылка для скачивания файла |
+| └─ **method** | string | optional | Метод, используемый для скачивания файла |
+| └─ **detachedSignatureLink** | object | optional | Открепленная ЭЦП содержимого файла |
+| └─ **url** | string | optional | Ссылка для скачивания файла открепленной ЭЦП |
+| └─ **method** | string | optional | Метод для скачивания открепленной ЭЦП |
+
+### Пример ссылок на скачивание
+
+```json
+{
+ "downloadFileLinks": [
+ {
+ "url": "https://baas.alfabank.ru/filebox/secure-file-transfer.incoming-files.to-processing/12345678-90ab-cdef-1234-1234567890ab?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20230608T152952Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Credential=secure-file-transfer%2F20230608%2Fdev%2Fs3%2Faws4_request&X-Amz-Signature=e78c051fcff1017a68795620c20e50db33126ab8374c2ee9644ef4743b3625c6",
+ "method": "GET",
+ "detachedSignatureLink": {
+ "url": "https://baas.alfabank.ru/filebox/secure-file-transfer.incoming-files.to-processing/12345678-90ab-cdef-1234-1234567890ab.sign?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20230608T152952Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Credential=secure-file-transfer%2F20230608%2Fdev%2Fs3%2Faws4_request&X-Amz-Signature=36ef1ccf28bdf6e54710fc3c1dd235c8f383275c2bbb0c9db365da272d3c24a8",
+ "method": "GET"
+ }
+ },
+ {
+ "url": "https://baas.alfabank.ru/filebox/secure-file-transfer.incoming-files.to-processing/12345678-90ab-cdef-1234-1234567890ac?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20230608T152952Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Credential=secure-file-transfer%2F20230608%2Fdev%2Fs3%2Faws4_request&X-Amz-Signature=e78c051fcff1017a68795620c20e50db33126ab8374c2ee9644ef4743b3625c6",
+ "method": "GET",
+ "detachedSignatureLink": {
+ "url": "https://baas.alfabank.ru/filebox/secure-file-transfer.incoming-files.to-processing/12345678-90ab-cdef-1234-1234567890ac.sign?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20230608T152952Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Credential=secure-file-transfer%2F20230608%2Fdev%2Fs3%2Faws4_request&X-Amz-Signature=36ef1ccf28bdf6e54710fc3c1dd235c8f383275c2bbb0c9db365da272d3c24a8",
+ "method": "GET"
+ }
+ }
+ ]
+}
+```
+
+---
+
+## Запрос на скачивание
+
+Для скачивания файла по полученной ссылке необходимо выполнить `http` запрос методом, указанным в параметре `method`, и полученной в параметре `url` ссылкой `https://baas.alfabank.ru/filebox/{bucketName}/{objectKey}` с параметрами запроса.
+
+### Параметры запроса
+
+#### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :----------------- | :----- | :------------- | :------------------------- |
+| **Accept** | string | required | `*/*` |
+| **Content-Length** | string | required | 1024 |
+| **Content-Type** | string | optional | `application/octet-stream` |
+
+#### PATH
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------------- | :----- | :------------- | :-------------------------------- |
+| **bucketName** | string | required | Имя bucket'а для сохранения файла |
+| **objectKey** | string | required | Имя файла |
+
+#### QUERY
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------------------- | :------ | :------------- | :------------------------------------------------------- |
+| **X-Amz-Date** | string | required | Дата и время генерации ссылки |
+| **X-Amz-Expires** | integer | required | TTL ссылки (в секундах) относительно времени её создания |
+| **X-Amz-Credential** | string | required | Данные об учётной записи s3 и подписи запроса |
+| **X-Amz-Algorithm** | string | required | Алгоритм подписи запроса |
+| **X-Amz-Signature** | string | required | Подпись запроса |
+| **Content-Length** | integer | required | Размер содержимого файла |
+
+### Пример запроса
+
+```bash
+curl -X GET https://baas.alfabank.ru/filebox/secure-file-transfer.incoming-files.to-processing/12345678-90ab-cdef-1234-1234567890ab?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20230608T152952Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Credential=secure-file-transfer%2F20230608%2Fdev%2Fs3%2Faws4_request&X-Amz-Signature=e78c051fcff1017a68795620c20e50db33126ab8374c2ee9644ef4743b3625c6 \
+ -H 'Accept: */*' \
+ -H 'Content-Length: 1024' \
+ -H 'Content-Type: application/octet-stream'
+```
+
+---
+
+## Параметры ответа
+
+| Код | Описание | Тело ответа |
+| :---------------------------- | :------------------------ | :---------------------------------------------------------------------------------------------- |
+| **200 OK** | Успешное скачивание | Нет тела ответа |
+| **400 Bad Request** | Ошибка в запросе | `{"error": "Код ошибки"}` |
+| **403 Forbidden** | Доступ запрещен | `{"error": "Время жизни ссылки истекло / Используется некорректный метод или ссылка изменена"}` |
+| **404 Not Found** | Файл не найден | `{"error": "Код ошибки"}` |
+| **500 Internal Server Error** | Внутренняя ошибка сервера | `{"error": "Код ошибки"}` |
+
+---
+
+### См. также:
+
+- [Требования и ограничения](/products/alfa-api/documentation/articles/secure-file-transfer/articles/intro/intro)
+- [Загрузка файла](/products/alfa-api/documentation/articles/secure-file-transfer/articles/upload/v1/upload)
+- [Официальный портал разработчиков Alfa-Bank](https://developers.alfabank.ru/)
diff --git a/_docs/alfabank/payin_and_kyc/Обмен_файлами/requirements_and_restrictions.md b/_docs/alfabank/payin_and_kyc/Обмен_файлами/requirements_and_restrictions.md
new file mode 100644
index 0000000..8819299
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Обмен_файлами/requirements_and_restrictions.md
@@ -0,0 +1,44 @@
+# Требования и ограничения
+
+**Область применения:** `B2B`, `B2C`, `H2H`
+**Раздел:** Обмен файлами
+
+Механизм для загрузки и скачивания файлов. В рамках продуктового метода API, который предполагает загрузку или скачивание файлов, Вы получите атрибут `downloadFileLinks`, который используется для скачивания файла, или атрибут `uploadFileLinks`, который используется для загрузки файла.
+
+### Ограничения
+
+1. По одной ссылке можно загрузить только один файл.
+2. Для загрузки нескольких файлов необходимо поместить их в архив формата `.zip` (без пароля), либо загружать файлы отдельными загрузками (каждая в рамках своей задачи, переиспользовать ссылку нельзя).
+
+### Форматы и размеры файлов
+
+1. Для файлов, чей `MIME-тип = text/plain`, максимальный размер одного файла — **250 Мбайт**.
+2. Для файлов, чей `MIME-тип ≠ text/plain`, максимальный размер одного файла — **60 Мбайт**.
+
+### Время жизни ссылки
+
+Ссылка содержит в себе параметр с датой и временем генерации ссылки `X-Amz-Date`.
+
+- **Формат параметра:** `YYYYMMDDTHHMISSZ`.
+- **Длительность:** Время жизни ссылки указывается в секундах параметром `X-Amz-Expires`.
+
+Отсчёт времени жизни идет от времени генерации ссылки.
+
+---
+
+## Навигация
+
+- [← SDK для подписи](/products/alfa-api/documentation/articles/sdk/articles/signature/v1/signature)
+- [Скачивание файла →](/products/alfa-api/documentation/articles/secure-file-transfer/articles/download/v1/download)
+
+---
+
+### Структура раздела «Обмен файлами»
+
+- **Требования и ограничения** (текущая страница)
+- [Скачивание файла](/products/alfa-api/documentation/articles/secure-file-transfer/articles/download/v1/download)
+- [Загрузка файла](/products/alfa-api/documentation/articles/secure-file-transfer/articles/upload/v1/upload)
+
+---
+
+_Документация Alfa-Bank (Alfa API)_
diff --git a/_docs/alfabank/payin_and_kyc/Обмен_файлами/upload.md b/_docs/alfabank/payin_and_kyc/Обмен_файлами/upload.md
new file mode 100644
index 0000000..51f7c11
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Обмен_файлами/upload.md
@@ -0,0 +1,124 @@
+# Загрузка файла
+
+**Теги:** `B2B` `B2C` `H2H`
+
+Процесс загрузки файла состоит из трех основных этапов:
+
+1. **Получите ссылку для загрузки файла** (Подробнее в пункте «Получение ссылки»)
+2. **Выполните запрос на загрузку файла** (Подробнее в пункте «Запрос на загрузку»)
+3. **Загрузка файла**
+
+---
+
+## Получение ссылки
+
+Первым шагом необходимо получить ссылку на загрузку файла в рамках Вашего взаимодействия. Ниже приведен пример получаемой Вами ссылки для загрузки файла с описанием параметров.
+
+### Атрибуты ответа (BODY)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------------------ | :---------------- | :------------- | :------------------------------------- |
+| **uploadFileLinks** | `array of object` | optional | Ссылка для загрузки файла в Банк |
+| ↳ **url** | `string` | optional | Ссылка для загрузки файла |
+| ↳ **method** | `string` | optional | Метод, используемый для загрузки файла |
+
+### Пример ссылок на загрузку
+
+```json
+{
+ "uploadFileLinks": [
+ {
+ "url": "https://baas.alfabank.ru/filebox/secure-file-transfer.incoming-files.to-processing/12345678-90ab-cdef-1234-1234567890ab?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20230608T152952Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Credential=secure-file-transfer%2F20230608%2Fdev%2Fs3%2Faws4_request&X-Amz-Signature=36ef1ccf28bdf6e54710fc3c1dd235c8f383275c2bbb0c9db365da272d3c24a8",
+ "method": "PUT"
+ },
+ {
+ "url": "https://baas.alfabank.ru/filebox/secure-file-transfer.incoming-files.to-processing/12345678-90ab-cdef-1234-1234567890ac?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20230608T152952Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Credential=secure-file-transfer%2F20230608%2Fdev%2Fs3%2Faws4_request&X-Amz-Signature=36ef1ccf28bdf6e54710fc3c1dd235c8f383275c2bbb0c9db365da272d3c24a8",
+ "method": "PUT"
+ }
+ ]
+}
+```
+
+---
+
+## Запрос на загрузку
+
+Для загрузки файла по полученной ссылке необходимо выполнить `http` запрос методом, указанным в параметре `method`, и полученной в параметре `url` ссылкой:
+`https://baas.alfabank.ru/filebox/{bucketName}/{objectKey}` с параметрами запроса.
+
+### Параметры запроса
+
+#### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :----------------- | :------- | :------------- | :------------------------- |
+| **Accept** | `string` | **required** | `*/*` |
+| **Content-Length** | `string` | **required** | Например: `1024` |
+| **Content-Type** | `string` | optional | `application/octet-stream` |
+
+#### PATH
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------------- | :------- | :------------- | :-------------------------------- |
+| **bucketName** | `string` | **required** | Имя bucket'а для сохранения файла |
+| **objectKey** | `string` | **required** | Имя файла |
+
+#### QUERY
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------------------- | :-------- | :------------- | :------------------------------------------------------- |
+| **X-Amz-Date** | `string` | **required** | Дата и время генерации ссылки |
+| **X-Amz-Expires** | `integer` | **required** | TTL ссылки (в секундах) относительно времени её создания |
+| **X-Amz-Credential** | `string` | **required** | Данные об учётной записи s3 и подписи запроса |
+| **X-Amz-Algorithm** | `string` | **required** | Алгоритм подписи запроса |
+| **X-Amz-Signature** | `string` | **required** | Подпись запроса |
+| **Content-Length** | `integer` | **required** | Размер содержимого файла |
+
+### Пример запроса
+
+```bash
+curl -X PUT https://baas.alfabank.ru/filebox/secure-file-transfer.incoming-files.to-processing/12345678-90AB-CDEF-1234-1234567890AB?X-Amz-Date=20230608T152952Z&X-Amz-Expires=3600&X-Amz-Credential=secure-file-transfer%2F20230608%2Fbaas%2Fs3%2Faws4_request&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Signature=36ef1ccf28bdf6e54710fc3c1dd235c8f383275c2bbb0c9db365da272d3c24a8 \
+ -H 'Accept: */*' \
+ -H 'Content-Length: 1024' \
+ -H 'Content-Type: application/octet-stream' \
+ --data-binary 'Выписка по счету.pdf'
+```
+
+---
+
+## Параметры ответа
+
+### 200 OK
+
+_Нет тела ответа_
+
+### 400 Bad Request
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------- | :------- | :------------- | :--------- |
+| **error** | `string` | **required** | Код ошибки |
+
+### 403 Forbidden
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------- | :------- | :------------- | :------------------------------------------------------------------------------------------- |
+| **error** | `string` | **required** | Код ошибки. Время жизни ссылки истекло / Используется некорректный метод или ссылка изменена |
+
+### 404 Not Found
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------- | :------- | :------------- | :--------- |
+| **error** | `string` | **required** | Код ошибки |
+
+### 500 Internal Server Error
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------- | :------- | :------------- | :--------- |
+| **error** | `string` | **required** | Код ошибки |
+
+---
+
+**Навигация:**
+
+- [← Скачивание файла](/products/alfa-api/documentation/articles/secure-file-transfer/articles/download/v1/download)
+- [Для чего это нужно →](/products/alfa-api/documentation/articles/signature-encryption/articles/intro/intro)
diff --git a/_docs/alfabank/payin_and_kyc/Общая_информация/authorization.md b/_docs/alfabank/payin_and_kyc/Общая_информация/authorization.md
new file mode 100644
index 0000000..629327e
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Общая_информация/authorization.md
@@ -0,0 +1,32 @@
+# Авторизация
+
+Теги: `B2B` `B2C` `H2H`
+
+---
+
+Получить доступ к продуктам и сервисам Alfa API можно двумя способами: с помощью Alfa ID или API Key.
+
+Выбор способа авторизации зависит от типа интеграции, используемых вами продуктов и сервисов, требований безопасности и настроек вашей интеграции.
+
+## Alfa ID
+
+`B2B` `B2C` `H2H`
+
+Этот способ подходит для любого типа интеграций и позволяет работать со всеми продуктами и сервисами Alfa API. Контроль безопасности обеспечивается за счёт использования токенов с коротким сроком действия и проведения аутентификации пользователей.
+
+Подойдёт вам в следующих случаях:
+
+•вы хотите выполнять операции по другим организациям (партнёрская интеграция);•вы хотите выполнять операции по своей организации (H2H-интеграция) и вам необходимо, чтобы ваши сотрудники проходили аутентификацию для получения доступа к продуктам и сервисам Alfa API.
+## API Key
+
+`H2H`
+
+Это упрощённый способ авторизации запросов без аутентификации сотрудников вашей организации, который не требует регулярного обновления ключа доступа. Подходит для выполнения операций по своей организации. Контроль безопасности обеспечивается за счёт того, что запросы принимаются только с ваших доверенных серверов.
+
+Доступные с помощью этого способа авторизации продукты и сервисы можно посмотреть [здесь](https://developers.alfabank.ru/products/alfa-api/documentation/articles/selfservice/articles/api-key/api-key).
+
+Использование упрощённого способа авторизации будет оптимальным вариантом, если у вас H2H-интеграция, использующая продукты и сервисы, доступные с помощью `API Key` , и вам не требуется аутентификация сотрудников для доступа к продуктам и сервисам Alfa API.
+
+Подробнее о способах авторизации можно прочитать в статьях ниже.
+
+[Alfa ID](https://developers.alfabank.ru/products/alfa-api/documentation/articles/alfa-id/articles/intro/intro)[API Key](https://developers.alfabank.ru/products/alfa-api/documentation/articles/api-key/api-key)
diff --git a/_docs/alfabank/payin_and_kyc/Общая_информация/channel_protection.md b/_docs/alfabank/payin_and_kyc/Общая_информация/channel_protection.md
new file mode 100644
index 0000000..59877f2
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Общая_информация/channel_protection.md
@@ -0,0 +1,17 @@
+# Защита канала
+
+Теги: `B2B` `B2C` `H2H`
+
+---
+
+## Введение
+
+Защита данных с применением криптографических преобразований - одно из решений проблем информационной безопасности. Механизмы шифрования и дешифрования канала обеспечивает надёжность передачи информации. Защитить канал можно, используя асимметричные алгоритмы шифрования данных (RSA-сертификат) и транспортную подпись.
+
+## Шифрование канала
+
+Шифрование канала происходит исходя из выбора метода шифрования. Это может быть:
+
+•шифрование с применением сертификата RSA (как применить RSA-сертификат смотрите в разделе [Требования к сертификату](https://developers.alfabank.ru/products/alfa-api/documentation/articles/connection/articles/tls/tls));•шифрование с применением сертификатов ГОСТ (раздел в подготовке).Выбор того или иного метода шифрования канала определяется критичностью данных:
+
+•если персональные данные не передаются, то TLS RSA будет самым простым, дешёвым и гибким инструментом интеграции;•если персональные данные передаются, то обязательно использование сертификата ГОСТ. Партнёр API может выбирать, что использовать - TLS ГОСТ или вариант с ФПСУ ГОСТ.
diff --git a/_docs/alfabank/payin_and_kyc/Общая_информация/check-list.md b/_docs/alfabank/payin_and_kyc/Общая_информация/check-list.md
new file mode 100644
index 0000000..fd2f5cb
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Общая_информация/check-list.md
@@ -0,0 +1,32 @@
+## Чек-лист готовности к тестовой интеграции
+
+1. **Заключите соглашение и договор**
+ Заключите соглашение о конфиденциальности и неразглашении информации, договор на информационно-технологическое взаимодействие с банком и подпишите приложения к нему. Подробнее в шаге 1 [инструкции по подключению](https://developers.alfabank.ru/products/alfa-api/documentation/articles/connection/articles/instruction/instruction).
+
+2. **Получите тестовые client_id и scope**
+ Подробнее в шаге 2 [инструкции по подготовке к работе с песочницей](https://developers.alfabank.ru/products/alfa-api/documentation/articles/connection/articles/instruction/instruction).
+
+3. **Установите тестовый TLS-сертификат, сертификаты Минцифры и проверьте доступ до Swagger UI**
+ Подробнее в шагах 3-5 [инструкции по подготовке к работе с песочницей](https://developers.alfabank.ru/products/alfa-api/documentation/articles/sandbox/sandbox).
+
+4. **Получите тестовый client_secret**
+ Подробнее [на странице Client secret](https://developers.alfabank.ru/products/alfa-api/documentation/articles/connection/articles/clientsecret/clientsecret).
+
+5. **Реализуйте и протестируйте интеграцию Alfa ID и Alfa API в песочнице**
+
+
+## Чек-лист готовности к промышленной интеграции
+
+1. **Выполните все пункты из подраздела «Проверьте готовность к тестовой интеграции»**
+
+
+2. **Создайте интеграцию в проме на Портале разработчика**
+ Подробнее [на странице Создание интеграции в проме](https://developers.alfabank.ru/products/alfa-api/documentation/articles/selfservice/articles/prod/prod)
+
+3. **Выпустите TLS-сертификат**
+ Подробнее [на странице TLS-сертификат](https://developers.alfabank.ru/products/alfa-api/documentation/articles/connection/articles/tls/tls)
+
+4. **Получите client_secret**
+ Подробнее [на странице Client secret](https://developers.alfabank.ru/products/alfa-api/documentation/articles/connection/articles/clientsecret/clientsecret)
+
+5. **Начните использовать Alfa ID и Alfa API**
diff --git a/_docs/alfabank/payin_and_kyc/Общая_информация/introduction.md b/_docs/alfabank/payin_and_kyc/Общая_информация/introduction.md
new file mode 100644
index 0000000..fea4849
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Общая_информация/introduction.md
@@ -0,0 +1,40 @@
+`B2B` `B2C` `H2H`
+
+# Введение
+
+Добро пожаловать в документацию для разработчиков!
+
+Мы рады приветствовать вас на нашем портале, где вы найдёте исчерпывающую информацию об Alfa API и все необходимые инструменты для успешного и безопасного использования наших услуг.
+
+Перед началом работы рекомендуем внимательно ознакомиться с нашей документацией, которая содержит всю необходимую информацию для успешной интеграции.
+
+[Подключение к Alfa API](https://developers.alfabank.ru/products/alfa-api/documentation/articles/connection/connection)
+
+[Песочница](https://developers.alfabank.ru/products/alfa-api/documentation/articles/sandbox/sandbox)
+
+## Преимущества
+
+Alfa API предоставляет ряд преимуществ для наших клиентов и партнёров, включая:
+
+- быстрый и безопасный доступ к нашим банковским услугам;
+- простоту интеграции с вашими приложениями и сервисами;
+- возможность управления счетами, переводами и другими банковскими операциями;
+- доступ к актуальным данным о состоянии счетов и истории операций.
+
+## Типы интеграций
+
+`B2B` `B2C`
+
+**Партнёрские сервисы** — при данном типе интеграции предоставляется возможность выполнять операции по другим организациям (при наличии от них согласия) для предоставления им услуг. В рамках этой интеграции можно выполнять операции по юридическим лицам (другие компании), взаимодействие бизнеса с бизнесом. А также можно выполнять операции, где конечным потребителем услуг является физическое лицо.
+
+`H2H`
+
+**H2H-интеграции (Host-to-Host)** — при данном типе интеграции предоставляется возможность встроить банковские продукты в ERP-систему для выполнения операций по своей организации.
+
+**Холдинги** — при данном типе интеграции предоставляется возможность для головной организации выполнять казначейские функции по своим дочерним компаниям.
+
+Поможем выбрать интеграцию за 15 секунд — **[Пройдите опрос]**
+
+При создании Alfa API и Alfa ID использовались спецификации: [OAuth 2.0](https://datatracker.ietf.org/doc/html/rfc6749); [OIDC 1.0](https://openid.net/specs/openid-connect-core-1_0.html); [формат JSON](https://www.json.org/json-en.html); RESTful архитектура и синхронный обмен данными.
+
+Обновления по релизам публикуются в [Телеграм-канал](https://t.me/AlfaAPI)
diff --git a/_docs/alfabank/payin_and_kyc/Общая_информация/pagination.md b/_docs/alfabank/payin_and_kyc/Общая_информация/pagination.md
new file mode 100644
index 0000000..c41c898
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Общая_информация/pagination.md
@@ -0,0 +1,85 @@
+[](https://developers.alfabank.ru/) / Общая информация / Пагинация
+
+`B2B` `B2C` `H2H`
+
+# Пагинация
+
+---
+
+Пагинация - разделение ответа на несколько страниц. Механизм пагинации может быть использован в REST-запросах GET.
+
+## Параметры запроса
+
+**Пример запроса**
+```bash
+1curl -X GET '{host}/claims?limit=5&offset=5'
+ -H 'Content-Type: application/json'
+```
+
+### QUERY
+
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **limit** | `NUMBER` _(optional)_ | Количество объектов на одной странице. Значение по умолчанию: 1000. Максимальное значение: 1000 |
+| **offset** | `NUMBER` _(optional)_ | Количество объектов в списке, которые необходимо пропустить. Значение по умолчанию: 0 |
+
+Количество объектов на одной странице. Значение по умолчанию: 1000. Максимальное значение: 1000
+
+Количество объектов в списке, которые необходимо пропустить. Значение по умолчанию: 0
+
+## Параметры ответа
+
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **limit** | `NUMBER` _(optional)_ | Количество объектов на одной странице |
+| **offset** | `NUMBER` _(optional)_ | Количество объектов в списке, которые необходимо пропустить |
+| **totalCount** | `NUMBER` _(optional)_ | Общее количество записей |
+
+#### Ответ: 200 OK
+
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **limit** | `NUMBER` _(optional)_ | Количество объектов на одной странице |
+| **offset** | `NUMBER` _(optional)_ | Количество объектов в списке, которые необходимо пропустить |
+| **totalCount** | `NUMBER` _(optional)_ | Общее количество записей |
+
+
+
+Количество объектов на одной странице
+
+Количество объектов в списке, которые необходимо пропустить
+
+Общее количество записей
+
+
+
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **error** | `STRING` **(required)** | Код ошибки. Принимает возможные значения: invalid_request - неверные входные параметры запроса |
+| **error_description** | `STRING` _(optional)_ | Описание ошибки |
+
+#### Ответ: 400 Bad Request
+
+```json
+invalid_request
+```
+
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **error** | `STRING` **(required)** | Код ошибки. Принимает возможные значения: invalid_request - неверные входные параметры запроса |
+| **error_description** | `STRING` _(optional)_ | Описание ошибки |
+
+Код ошибки. Принимает возможные значения: invalid_request - неверные входные параметры запроса
+
+Описание ошибки
+
+## Алгоритм работы пагинации
+
+Пример 1: Если клиент запрашивает limit = 100, offset = 0, то клиенту вернётся с 1-ой по 100-ую запись.
+
+Пример 2: Если клиент запрашивает limit = 100, offset = 1000, то клиенту вернётся с 1001-ой по 1100-ую запись.
+
+Сортировка в пагинации происходит следующим образом: вверху списка возвращаются новые записи, внизу - старые записи.
+
+---
+[Версионирование](https://developers.alfabank.ru/products/alfa-api/documentation/articles/specification/articles/version/version) | [Термины и определения](https://developers.alfabank.ru/products/alfa-api/documentation/articles/specification/articles/terms/terms)
diff --git a/_docs/alfabank/payin_and_kyc/Общая_информация/scopes.md b/_docs/alfabank/payin_and_kyc/Общая_информация/scopes.md
new file mode 100644
index 0000000..038e1b6
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Общая_информация/scopes.md
@@ -0,0 +1,49 @@
+* / Общая информация / Scopes (области применения)*
+
+`B2B` `B2C` `H2H`
+
+# Scopes (области применения)
+
+| SCOPE | DESCRIPTION | RESOURSES |
+| --- | --- | --- |
+| transactions | Выписки по счетам юрлиц | `GET /jp/v1/statement/transactions` `GET /jp/v2/accounts/{accountNumber}/transactions/1C` `GET /jp/v1/accounts/{accountNumber}/transactions/MT940` `GET /jp/v1/correspondent-accounts/{accountNumber}/transactions` `GET /jp/v1/statement/summary` `POST /jp/v1/accounts/{accountNumber}/transactions/files/requests` `GET /jp/v1/accounts/transactions/files/requests/{requestId}` |
+| escrow | Эскроу-счета 214-ФЗ. Резервирование | `GET /build-projects` `POST /escrow-orders` `GET /jp/v1/escrow-orders/{referenceID}` `GET /jp/v1/escrow-orders` `PATCH /escrow-orders/{referenceID}/execute` `DELETE /escrow-orders/{referenceID}` `POST /jp/v1/escrow-orders/{referenceID}/cancel` `POST /jp/v1/escrow-orders-full` |
+| escrow-reports | Эскроу-счета 214-ФЗ. Формирование отчётов | `GET /jp/v1/escrow-reports/developers/build-projects` `POST /jp/v1/escrow-reports` |
+| customer | Профиль организации | `GET /jp/v2/customer-info` |
+| payment | Платёжные поручения | `POST /jp/v2/payments` `GET /jp/v2/payments/{externalId}/state` `GET /jp/v1/payments/{externalId}` `GET /jp/v1/payments/{externalId}/print-form` `GET /jp/v1/payments/{externalId}/print-form/download` `PATCH /jp/v2/payments/{externalId}/state` |
+| as-operation-with-selfemployed | Добавление самозанятых, получение справочных данных | `POST /semp/v1/agreement-pages` `POST /semp/v1/selfemployed/registries/add-selfemployed` `GET /semp/v1/selfemployed/registries/add-selfemployed/{requestId}` `GET /semp/v1/dictionary/activities` `GET /semp/v1/dictionary/regions` `GET /semp/v1/selfemployed/lists` `GET /semp/v1/selfemployed/{vatin}` `PUT /semp/v1/selfemployed/{vatin}` |
+| as-selfemployed-fts-status | Статус самозанятого | `POST /semp/v1/selfemployed/taxpayer-statuses` `GET /semp/v1/selfemployed/taxpayer-statuses/{requestId}` |
+| as-accrual-and-debt | Налоговые начисления, задолженности и пени самозанятого | `POST /semp/v1/selfemployed/accruals-and-debts` `GET /semp/v1/selfemployed/accruals-and-debts/{requestId}` `POST /semp/v1/selfemployed/payment-documents` `GET /semp/v1/selfemployed/payment-documents/{requestId}` `POST /semp/v1/selfemployed/income-for-period` `GET /semp/v1/selfemployed/income-for-period/{requestId}` `POST /semp/v1/selfemployed/income` `GET /semp/v1/selfemployed/income/{requestId}` `POST /semp/v1/selfemployed/taxpayer-account-info` `GET /semp/v1/selfemployed/taxpayer-account-info/{requestId}` |
+| as-receipt-and-payout | Проведение выплат и формирование чеков, список банков-участников СБП | `POST /semp/v1/payouts/registries/receipts-and-payouts` `GET /semp/v1/payouts/registries/{requestId}` `GET /semp/v1/payouts` `GET /semp/v1/dictionary/sbp-banks` `GET /semp/v1/payouts/lists` `GET /semp/v1/payouts/selfemployed/{vatin}` `POST /semp/v1/payouts/registries/cancel-receipts` `POST /semp/v1/payouts/registries/accept/{requestId}` |
+| as-receipt | Декларация доходов, аннулирование чеков | `POST /semp/v1/payouts/registries/receipts` `POST /semp/v1/payouts/registries/cancel-receipts` `GET /semp/v1/payouts/registries/cancel-receipts/{requestId}` `GET /semp/v1/payouts/registries/{requestId}` `GET /semp/v1/payouts` `GET /semp/v1/payouts/lists` `GET /semp/v1/payouts/selfemployed/{vatin}` `POST /semp/v1/payouts/registries/accept/{requestId}` |
+| as-payout-with-check-status | Проведение выплат самозанятым, список банков-участников СБП | `POST /semp/v1/payouts/registries/with-selfemployed-check-status` `GET /semp/v1/payouts/registries/{requestId}` `GET /semp/v1/payouts` `GET /semp/v1/dictionary/sbp-banks` `GET /semp/v1/payouts/lists` `GET /semp/v1/payouts/selfemployed/{vatin}` `POST /semp/v1/payouts/registries/accept/{requestId}` |
+| as-payout | Осуществление выплат самозанятым | `POST /semp/v1/payouts/registries/payouts` `GET /semp/v1/payouts/registries/{requestId}` `GET /semp/v1/payouts` `GET /semp/v1/dictionary/sbp-banks` `GET /semp/v1/payouts/lists` `GET /semp/v1/payouts/selfemployed/{vatin}` `POST /semp/v1/payouts/registries/accept/{requestId}` |
+| sbp_terminals_reg | Приём оплаты через СБП | `GET /jp/v1/legal` `GET /jp/v1/merchants/{merchantId}` `POST /jp/v1/terminals` |
+| loan-applications | Кредиты | `POST /smart-loans/jp/v1/loan-applications` `POST /loan-applications` `GET /smart-loans/jp/v1/loan-applications/{dealId}/status` |
+| signature | Электронная подпись | `GET /jp/v3/signature/dn` `GET /jp/v3/signature/dn/file` `POST /jp/v3/signature/rsa-certificates/requests/issue` `POST /jp/v3/signature/requests/{id}/operations` `PUT /jp/v3/signature/requests/operations/{id}` `GET /jp/v3/signature/requests/{id}` `GET /jp/v3/signature/rsa-certificates/{id}` `POST /jp/v3/signature/rsa-certificates/{id}/requests/activation` `PUT /jp/v3/signature/sign-settings` `POST /jp/v3/signature/rsa-certificates/{Id}/requests/switch` `POST /jp/v3/signature/rsa-certificates/{Id}/requests/reissue` `POST /jp/v3/signature/rsa-certificates/{Id}/requests/revocation` `POST /jp/v3/signature/qes/requests` `POST /jp/v3/signature/qes/requests/{Id}` `PATCH /jp/v3/signature/qes/requests/{Id}` `POST /jp/v3/signature/powers-of-attorney/requests` `GET /jp/v3/signature/powers-of-attorney/requests/{id}/status` `GET /jp/v3/signature/powers-of-attorney/requests/{id}` |
+| accounts | Счета | `GET /pp/v1/accounts` `GET /pp/v1/accounts/{accountNumber}` `GET /pp/v1/accounts/{accountNumber}/requisites` `GET /jp/open-banking/v1.3/accounts` `GET /jp/open-banking/v1.3/accounts/{accountId}/statements` `POST /jp/open-banking/v1.3/statements` `GET /jp/open-banking/v1.3/statements/{statementId}` |
+| cards | Карты | `GET /pp/v1/cards` `GET /pp/v1/cards/{cardId}/tariffs` `GET /pp/v1/cards/{cardId}/subscriptions` |
+| card-sec-actions | Тарифы и операции по карте | `GET /pp/v1/cards/{cardId}/actions` `POST /pp/v1/cards/{cardId}/actions` `PUT /pp/v1/cards/{cardId}/actions` |
+| operations-history | Истории операций | `GET /pp/v1/operations` `GET /pp/v1/operations/{id}` |
+| reports-downloading | Получение документов | `GET /pp/v1/reports` `GET /pp/v1/reports/{reportId}/body` |
+| debit-statements | Выписки по счёту | `POST /pp/v1/reports/type/account` `POST /pp/v1/reports/type/account/balance/eng` `POST /pp/v1/reports/type/account/balance/rus` |
+| credit-statements | Справки по кредитам | `POST /pp/v1/reports/type/credit/closed` `POST /pp/v1/reports/type/credit/info` `POST /pp/v1/reports/type/credit/statement` |
+| deposit-statements | Справка по депозиту | `POST /pp/v1/reports/type/deposit` |
+| limits-control | Лимиты по операциям | `GET /pp/v1/limits/general` `GET /pp/v1/cards/{cardId}/user-limits` `POST /pp/v1/cards/{cardId}/user-limits` `DELETE /pp/v1/cards/{cardId}/user-limits/{limitId}` |
+| loyalty | Программа лояльности | `POST /pp/v1/bonus-accounts-transactions` `GET /pp/v1/bonus-accounts` `GET /pp/v1/bonus-accounts/{accountNumber}` |
+| b2c_sbp_payments | Платежи через СБП | `POST /b2cpay/jp/v1/payments` `GET /b2cpay/jp/v1/payments` `GET /b2cpay/jp/v1/payments/packages/{packageId}` `POST /b2cpay/jp/v1/clients/checks` `GET /b2cpay/jp/v1/clients/checks/{checkId}` `GET /b2cpay/jp/v1/clients/info` `GET /b2cpay/jp/v1/banks` `GET /b2cpay/jp/v1/payments/download/{transactionId}` |
+| credit | Кредитные предложения | `GET /pp/v1/credit-offers` |
+| c2b-sbp | Оплата покупок через СБП | `POST /sbp/jp/v1/qrcs` `POST /sbp/jp/v1/subscriptions` `GET /sbp/jp/v1/qrc-status` `POST /sbp/jp/v1/petitions` `POST /sbp/jp/v1/terminals/{termNo}/cash-qrcs` `POST /sbp/jp/v1/terminals/{termNo}/cash-qrcs/{qrcId}/activation` `DELETE /sbp/jp/v1/terminals/{termNo}/cash-qrcs/{qrcId}/activation` `POST /sbp/jp/v1/refund` `GET /sbp/jp/v1/refund/status` |
+| b2b-sbp | Операции СБП для юрлиц | `POST /sbp/jp/v1/payment-urls/one-time-use` `POST /sbp/jp/v1/payment-urls/reusable` `GET /sbp/jp/v1/payment-urls` `GET /sbp/jp/v1/payment-urls/{qrcId}/data` `GET /sbp/jp/v1/incoming-payments` `POST /sbp/jp/v1/outgoing-payments/one-pay` `GET /sbp/jp/v1/outgoing-payments` `GET /sbp/jp/v1/outgoing-payments/{outgoingPaymentId}/status` `POST /sbp/jp/v1/payment-urls/batch` `GET /sbp/jp/v1/payment-urls/batch/{batchId}` `PATCH /sbp/jp/v1/payment-urls` |
+| digital-tariff | Дебетовая анкета | `POST /pp/v1/debit-cards/forms` `POST /pp/v1/debit-cards/forms/{formId}/verification-sms` `POST /pp/v1/debit-cards/forms/{formId}/resending-sms` `POST /pp/v1/debit-cards/forms/{formId}/verification-passport` |
+| plastic-delivery | Доставка дебетовой карты | `POST /pp/v1/debit-cards/forms/{formId}/verification-sms` `POST /pp/v1/debit-cards/forms/{formId}/resending-sms` `GET /pp/v1/debit-cards/forms/{formId}/draft` `GET /pp/v1/debit-cards/forms/{formId}/delivery-type` `GET /pp/v1/debit-cards/forms/{formId}/time-slots` `POST /pp/v1/debit-cards/forms/{formId}/time-slots` `POST /pp/v1/debit-cards/forms/{formId}/confirmation` |
+| dfa | Цифровые финансовые активы (ЦФА) | `GET /dfa/gd/v1/dfa-profile/initial-placement-list` |
+| salary-project | Зарплатный проект | `POST /jp/v1/salary-project/accounts/applications` `GET /jp/v1/salary-project/accounts/applications/{applicationId}` `POST /jp/v1/salary-project/payroll/applications` `GET /jp/v1/salary-project/payroll/applications/{applicationId}` |
+| loyalty-program | Получение бонусных номеров | `GET /pp/v1/bonus-numbers` |
+| payment-registries | Реестры рублёвых платежей | `POST /jp/v2/payments/registries` `GET /jp/v2/payments/registries/{registryId}` |
+| invoices | Выставление счёта клиенту | `POST /jp/v1/payments/from-invoice` `POST /jp/v2/payments/from-invoice-budget` |
+| factoring | Факторинг | `GET /aff/jp/v1/creditors/compliance` `POST /aff/jp/v1/payments` `POST /aff/jp/v1/registers` `POST /aff/jp/v1/registers/sign` `GET /aff/jp/v1/payments/{paymentId}` `GET /aff/jp/v1/registers/{registerId}` `GET /aff/jp/v1/registers/{registerId}/documents` |
+| beneficiaries | Информация о номинальных счетах и их контрагенты | `GET /na/jp/v1/nominal-accounts` `GET /na/jp/v1/beneficiaries/requests/{requestId}/status` `POST /na/jp/v1/beneficiaries` `GET /na/jp/v1/beneficiaries` `GET /na/jp/v1/beneficiaries/{beneficiaryId}` `PUT /na/jp/v1/beneficiaries/{beneficiaryId}` `POST /na/jp/v1/beneficiaries/{beneficiaryId}/scoring` `POST /na/jp/v1/beneficiaries/{beneficiaryId}/requisites` `GET /na/jp/v1/beneficiaries/{beneficiaryId}/requisites` `PATCH /na/jp/v1/beneficiaries/{beneficiaryId}/requisites/{requisiteId}` `GET /na/jp/v1/beneficiaries/{beneficiaryId}/balance` `GET /na/jp/v1/beneficiaries/{beneficiaryId}/transactions` `POST /na/jp/v1/universal-recipients` `GET /na/jp/v1/universal-recipients` `GET/na/jp/v1/universal-recipients/{universalRecipientId}` `POST /na/jp/v1/universal-recipients/{universalRecipientId}/requisites` `GET /na/jp/v1/universal-recipients/{universalRecipientId}/requisites` `PATCH /na/jp/v1/universal-recipients/{universalRecipientId}/requisites/{requisiteId}` |
+| deals | Безопасные сделки | `POST /na/jp/v1/deals` `GET /na/jp/v1/deals` `GET /na/jp/v1/deals/{dealId}` `PATCH /na/jp/v1/deals/{dealId}/is-valid` `GET /na/jp/v1/deals/{dealId}/payoffs` `PATCH /na/jp/v1/deals/action` `POST /na/jp/v1/deals/steps` `GET /na/jp/v1/deals/{dealId}/requests/{requestId}/status` `GET /na/jp/v1/deals/{dealId}/steps` `GET /na/jp/v1/deals/{dealId}/steps/{stepId}` `PATCH /na/jp/v1/deals/steps/contractors` `GET /na/jp/v1/deals/{dealId}/steps/{stepId}/contractors` |
+| beneficiary-payments | Идентификация пополнений номинального счёта и выплаты с него | `GET /na/jp/v1/unidentified-transactions` `POST /na/jp/v1/unidentified-transactions/{id}/identify` `GET /na/jp/v1/unidentified-transactions/{id}/identify/{identifyId}` `POST /na/jp/v1/unidentified-transactions/{id}/refunds` `GET /na/jp/v1/unidentified-transactions/{id}/refunds/{refundId}` `POST /na/jp/v1/payoffs` `GET /na/jp/v1/payoffs/{payoffId}/status` `PATCH /na/jp/v1/payoffs/{payoffId}/accept` `GET /na/jp/v1/payoffs/{payoffId}` `POST /na/jp/v1/tax-refund` `GET /na/jp/v1/tax-refund/{taxRefundId}/status` `PATCH /na/jp/v1/tax-refund/{taxRefundId}/accept` |
+
diff --git a/_docs/alfabank/payin_and_kyc/Общая_информация/terms_and_definitions.md b/_docs/alfabank/payin_and_kyc/Общая_информация/terms_and_definitions.md
new file mode 100644
index 0000000..8d2daed
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Общая_информация/terms_and_definitions.md
@@ -0,0 +1,65 @@
+[](https://developers.alfabank.ru/) / Общая информация / Термины и определения
+
+`B2B` `B2C` `H2H`
+
+# Термины и определения
+
+---
+
+**Аутентификация** – процедура проверки данных пользователя, обратившегося для доступа к информационному ресурсу Партнёра API.
+
+
+
+**Банк** – Акционерное общество «Альфа-банк».
+
+
+
+**Грант** – вид сценария интеграции, такие как Authorization Code Flow или Client Credentials Flow.
+
+
+
+Партнёр API – клиент Банка, использующий канал Alfa API для проведения интеграции своей системы и системы/сервисов Банка. Для Партнёра API необходимо заключить Договор на информационно-технологическое взаимодействие в целях использования канала Alfa API.
+
+
+
+**Сервис** – набор методов API, доступ к которым от имени пользователя Вы можете получить.
+
+
+
+**Alfa API** – это канал предоставления банковских продуктов и услуг, а также инструмент их безопасной интеграции в бизнес-процессы Партнёров API.
+
+
+
+**Alfa ID** – единая учётная запись пользователя ЮЛ (юридического лица) / ФЛ (физического лица), используемая для регистрации и входа пользователей в продукты и сервисы Банка и Партнёров API.
+
+
+
+**Access token** – токен доступа, который формируется на основе согласия пользователя на взаимодействие от его имени Партнёра с Банком.
+
+
+
+**Claims** – набор данных пользователя, доступ к которым Вы можете получить.
+
+
+
+**Client ID** – уникальный идентификатор Партнёра API, который Вы получаете при регистрации.
+
+
+
+**Client secret** – секретный ключ партнёрского сервиса.
+
+
+
+**Redirect URI** – URL, на который сервер авторизации будет отправлять пользователя после успешной авторизации приложения и которому будет предоставляться код авторизации. Необходим при использовании типа гранта Authorization Code Flow.
+
+
+
+**Refresh token** - токен, который даёт возможность получить новый токен доступа взамен истекшего.
+
+
+
+**Scopes** – это общий набор операций и/или клэймов.
+
+---
+[Пагинация](https://developers.alfabank.ru/products/alfa-api/documentation/articles/specification/articles/pagination/pagination) | [Что это и для чего нужно](https://developers.alfabank.ru/products/alfa-api/documentation/articles/specification/articles/certificate/articles/intro/intro)
+
diff --git a/_docs/alfabank/payin_and_kyc/Общая_информация/vensioning.md b/_docs/alfabank/payin_and_kyc/Общая_информация/vensioning.md
new file mode 100644
index 0000000..ec04ce7
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Общая_информация/vensioning.md
@@ -0,0 +1,29 @@
+# Версионирование
+
+Теги: `B2B` `B2C` `H2H`
+
+---
+
+Версии методов/эндпоинтов обозначаются как `v1` , `v2` , `v3` и так далее. Это позволяет явно указать, какую версию API использует клиент.
+
+## Мажорные изменения
+
+Мажорные изменения подразумевают выпуск новой версии API. Они включают изменения, которые приводят к обратной несовместимости.
+
+Примеры мажорных изменений:
+
+•добавление обязательных параметров в запрос;•удаление обязательных параметров из запроса или ответа;•трансформация необязательных параметров в обязательные;•изменение типа параметра в запросе или ответе.
+## Минорные изменения
+
+Минорные изменения не требуют выпуска новой версии API. Они не нарушают обратную совместимость.
+
+Примеры минорных изменений:
+
+•добавление новой функциональности без нарушения обратной совместимости;•исправление ошибок;•улучшение производительности;•дополнительные необязательные параметры в запросе или ответе.
+## Поддержание старой версии
+
+Срок поддержки работы старой версии составляет от двух до шести месяцев. После этого срока Банк оставляет за собой право прекратить поддержку старой версии. При этом будет добавлено уведомление о прекращении поддержки старой версии эндпоинта.
+
+## Тестирование в песочнице
+
+Переход на новую версию обязательно должен включать тестирование в песочнице (тестовой среде).
diff --git a/_docs/alfabank/payin_and_kyc/Общая_информация/Сертификаты_Минцифры/for_android.md b/_docs/alfabank/payin_and_kyc/Общая_информация/Сертификаты_Минцифры/for_android.md
new file mode 100644
index 0000000..a083f21
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Общая_информация/Сертификаты_Минцифры/for_android.md
@@ -0,0 +1,60 @@
+*Общая информация / Сертификаты для Android*
+
+B2BB2CH2H# Сертификаты для Android
+
+Инструкция по установке сертификатов на телефон или планшет с системой Android. Для корректной работы нужно два сертификата - корневой и выпускающий.
+
+## Установка корневого сертификата
+
+1. **Скачайте корневой сертификат**
+1.Скачайте корневой сертификат [Russian Trusted Root CA](https://developers.alfabank.ru/assets/developers-portal.docs.alfa-api/articles/specification/articles/certificate/articles/android/files/russian_trusted_root_ca.cer).2.Перейдите в «Настройки».3.В поиске введите «Сертификат».4.Выберите «Сертификат CA».5.Если появится окно «Укажите название сертификата», введите «Russian Trusted Root CA».6.Выберите «VPN и приложения» и нажмите «ОК».
+
+
+2. **Установите сертификат**
+Если откроется предупреждение, нажмите «Всё равно установить» или «Установить в любом случае».
+
+
+
+3. **Введите пароль**
+1.Введите код-пароль от устройства.2.Нажмите «Подтвердить».3.В загрузках выберите «Russian Trusted Root CA.cer».
+
+
+4. **Сертификат установлен**
+После установки в нижней части экрана появится уведомление «Сертификат ЦС установлен».
+
+
+
+## Установка выпускающего сертификата
+
+1. **Скачайте выпускающий сертификат**
+1.Скачайте выпускающий сертификат [Russian Trusted Sub CA](https://developers.alfabank.ru/assets/developers-portal.docs.alfa-api/articles/specification/articles/certificate/articles/android/files/russian_trusted_sub_ca.cer).2.Перейдите в «Настройки».3.В поиске введите «Сертификат».4.Выберите «Сертификат CA».5.В предупреждении нажмите «Всё равно установить» или «Установить в любом случае».6.Если появится окно «Укажите название сертификата», введите «Russian Trusted Sub CA».7.Выберите «VPN и приложения» и нажмите «ОК».
+
+
+2. **Установите сертификат**
+Если откроется предупреждение, нажмите «Всё равно установить» или «Установить в любом случае».
+
+
+
+3. **Введите пароль**
+1.Введите код-пароль от устройства.2.Нажмите «Подтвердить».3.В загрузках выберите «Russian Trusted Sub CA.cer».
+
+
+4. **Сертификат установлен**
+После установки в нижней части экрана появится уведомление «Сертификат ЦС установлен».
+
+## Проверка установки сертификатов
+
+Проверьте, что сертификаты успешно установлены:
+
+1. **Перейдите в «Настройки»**
+
+2. **В поиске введите «Надёжные сертификаты» или «Надёжные учётные данные»**
+
+3. **Перейдите во вкладку «Пользователь»**
+При успешной установке сертификатов в списке должно отобразиться два установленных сертификата Минцифры: «Russian Trusted Root CA» и «Russian Trusted Sub CA».
+
+
+
+Очистите кэш вашего браузераОчистите кэш браузера на устройстве, с которого осуществляется доступ. Это необходимо для корректной работы с ресурсами, защищёнными сертификатами безопасности Минцифры.
+
+[Что это и для чего нужно](https://developers.alfabank.ru/products/alfa-api/documentation/articles/specification/articles/certificate/articles/intro/intro)[Сертификаты для iOS](https://developers.alfabank.ru/products/alfa-api/documentation/articles/specification/articles/certificate/articles/ios/ios)
\ No newline at end of file
diff --git a/_docs/alfabank/payin_and_kyc/Общая_информация/Сертификаты_Минцифры/for_linux.md b/_docs/alfabank/payin_and_kyc/Общая_информация/Сертификаты_Минцифры/for_linux.md
new file mode 100644
index 0000000..ac9c0e8
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Общая_информация/Сертификаты_Минцифры/for_linux.md
@@ -0,0 +1,81 @@
+*Общая информация / Сертификаты для Linux*
+
+B2BB2CH2H# Сертификаты для Linux
+
+Инструкция по установке сертификатов для владельцев ноутбуков и компьютеров с операционной системой Linux. Для корректной работы нужно два сертификата - корневой и выпускающий.
+
+Процедура установки сертификатов зависит от используемого браузера.
+
+## Red Hat Enterprise Linux
+
+1. **Скачайте сертификаты**
+Скачайте [корневой сертификат](https://developers.alfabank.ru/assets/developers-portal.docs.alfa-api/articles/specification/articles/certificate/articles/linux/files/russian_trusted_root_ca_pem.crt) и [выпускающий сертификат](https://developers.alfabank.ru/assets/developers-portal.docs.alfa-api/articles/specification/articles/certificate/articles/linux/files/russian_trusted_sub_ca_pem.crt). Загрузите сертификаты в папку «Downloads».
+
+2. **Установите сертификаты Удостоверяющего Центра Минцифры**
+1. Нажмите на «Activities» -> «Terminal», чтобы открыть терминал.
+
+
+
+2. Убедитесь, что файлы сертификатов «russian_trusted_root_ca_pem.crt» и «russian_trusted_sub_ca_pem.crt» находятся в директории «Downloads». Для проверки перейдите в неё с помощью `cd` и вызовите команду `ls` для отображения списка файлов.
+
+
+
+3. Скопируйте корневой сертификат в каталог `/usr/share/pki/ca-trust-source/anchors/` . Выполните команду `sudo cp russian_trusted_root_ca_pem.crt /usr/share/pki/ca-trust-source/anchors` .
+
+4. Введите пароль суперпользователя.
+
+
+
+5. Cкопируйте в этот же каталог выпускающий сертификат. Выполните команду `sudo cp russian_trusted_sub_ca_pem.crt /usr/share/pki/ca-trust-source/anchors` .
+
+6. Обновите общесистемное хранилище сертификатов командой `sudo update-ca-trust` .
+
+
+
+7. Проверьте хранилище доверенных сертификатов. Воспользуйтесь командой `trust list` . В конце списка должны появиться сертификаты «Russian Trusted Root CA» и «Russian Trusted Sub CA».
+
+Очистите кэш вашего браузераОчистите кэш браузера на устройстве, с которого осуществляется доступ. Это необходимо для корректной работы с ресурсами, защищёнными сертификатами безопасности Минцифры.
+
+## Mozilla Firefox
+
+1. **Скачайте сертификаты**
+Скачайте [«корневой сертификат»](https://developers.alfabank.ru/assets/developers-portal.docs.alfa-api/articles/specification/articles/certificate/articles/linux/files/russian_trusted_root_ca_pem.crt) и [«выпускающий сертификат»](https://developers.alfabank.ru/assets/developers-portal.docs.alfa-api/articles/specification/articles/certificate/articles/linux/files/russian_trusted_sub_ca_pem.crt). Загрузите сертификаты в папку «Downloads».
+
+2. **Установите сертификаты Удостоверяющего Центра Минцифры**
+1. Откройте браузер Firefox → перейдите в «Настройки» → в поиске введите «Сертификат» → выберите «Просмотр сертификатов…».
+
+2. В открывшемся окне «Управление сертификатами» нажмите на «Импортировать…».
+
+3. Перейдите в папку со скачанными сертификатами. Дважды кликните по сертификату «russian_trusted_root_ca_pem.crt» → установите флажок «Доверять при идентификации веб-сайтов» → нажмите «ОК».
+
+4. В открывшемся окне «Управление сертификатами» нажмите «Импортировать».
+
+5. Вернитесь в папку со скачанными сертификатами. Дважды кликните по сертификату «russian_trusted_sub_ca_pem.crt» → установите флажок «Доверять при идентификации веб-сайтов» → нажмите «ОК».
+
+6. Проверьте список сертификатов. Найдите в нём «The Ministry of Digital Development and Communications». Внутри должны находиться сертификаты «Russian Trusted Root CA» и «Russian Trusted Sub CA».
+
+
+
+Очистите кэш вашего браузераОчистите кэш браузера на устройстве, с которого осуществляется доступ. Это необходимо для корректной работы с ресурсами, защищёнными сертификатами безопасности Минцифры.
+
+## Chromium
+
+1. **Скачайте сертификаты**
+Скачайте [](https://developers.alfabank.ru/assets/developers-portal.docs.alfa-api/articles/specification/articles/certificate/articles/linux/files/russian_trusted_root_ca_pem.crt) и [](https://developers.alfabank.ru/assets/developers-portal.docs.alfa-api/articles/specification/articles/certificate/articles/linux/files/russian_trusted_sub_ca_pem.crt). Загрузите сертификаты в папку «Downloads».
+
+2. **Установите сертификаты Удостоверяющего Центра Минцифры**
+1. Откройте браузер Chromium → перейдите в «Настройки» → в строке поиска введите «Сертификат» → нажмите на «Безопасность» в разделе «Конфиденциальность и безопасность» → выберите «Настроить сертификаты».
+
+2. Перейдите во вкладку «Центры сертификации» → выберите «Импорт».
+
+3. Перейдите в папку со скачанными сертификатами. Дважды кликните по сертификату «russian_trusted_root_ca_pem.crt» → установите флажок «Доверять этому сертификату при идентификации сайтов» → нажмите «ОК».
+
+4. Во вкладке «Центры сертификации» снова выберите кнопку «Импорт» → дважды кликните по сертификату «russian_trusted_sub_ca_pem.crt» → установите флажок «Доверять этому сертификату при идентификации сайтов» → нажмите «ОК».
+
+5. Проверьте список сертификатов. Найдите «org-The Ministry of Digital Development and Communications» и раскройте список. Внутри должны находиться сертификаты «Russian Trusted Root CA» и «Russian Trusted Sub CA».
+
+
+
+Очистите кэш вашего браузераОчистите кэш браузера на устройстве, с которого осуществляется доступ. Это необходимо для корректной работы с ресурсами, защищёнными сертификатами безопасности Минцифры.
+
+[Сертификаты для MacOS](https://developers.alfabank.ru/products/alfa-api/documentation/articles/specification/articles/certificate/articles/macos/macos)[Как подключить](https://developers.alfabank.ru/products/alfa-api/documentation/articles/connection/articles/instruction/instruction)
\ No newline at end of file
diff --git a/_docs/alfabank/payin_and_kyc/Общая_информация/Сертификаты_Минцифры/what_it_is_and_what_it_is_for.md b/_docs/alfabank/payin_and_kyc/Общая_информация/Сертификаты_Минцифры/what_it_is_and_what_it_is_for.md
new file mode 100644
index 0000000..b7cb330
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Общая_информация/Сертификаты_Минцифры/what_it_is_and_what_it_is_for.md
@@ -0,0 +1,22 @@
+[](https://developers.alfabank.ru/) / Общая информация / ... / Что это и для чего нужно
+
+`B2B` `B2C` `H2H`
+
+# Что это и для чего нужно
+
+---
+
+Установка сертификата Министерства цифрового развития, связи и массовых коммуникаций Российской Федерации (Минцифры) необходима для подтверждения личности и безопасности пользователя при работе с определёнными типами данных и сервисов.
+
+Этот сертификат используется для шифрования данных, аутентификации пользователя и защиты от мошенничества и кибератак.
+
+Кроме того, он может потребоваться для доступа к некоторым государственным услугам и сервисам, связанным с электронной подписью и документооборотом.
+
+Для получения защищённого доступа ко всем сайтам и онлайн-сервисам используйте браузеры с поддержкой российских сертификатов: Яндекс Браузер или Атом.
+
+Альтернативный способ - установка корневого сертификата. Если Вы привыкли работать в других браузерах или возникли проблемы с работой сторонних программ, Вы можете установить корневой сертификат в операционную систему.
+
+Ответы на часто задаваемые вопросы можно посмотреть здесь.
+
+---
+[Термины и определения](https://developers.alfabank.ru/products/alfa-api/documentation/articles/specification/articles/terms/terms) | [Сертификаты для Android](https://developers.alfabank.ru/products/alfa-api/documentation/articles/specification/articles/certificate/articles/android/android)
diff --git a/_docs/alfabank/payin_and_kyc/Песочница/check-webhook/check-webhook_intro.md b/_docs/alfabank/payin_and_kyc/Песочница/check-webhook/check-webhook_intro.md
new file mode 100644
index 0000000..bf1aaa4
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Песочница/check-webhook/check-webhook_intro.md
@@ -0,0 +1,138 @@
+# Инструкция по тестированию
+
+**Теги:** `B2B` `B2C` `H2H`
+
+1. Отправьте письмо на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru) с указанием, что хотите подключить вебхуки.
+2. На своей стороне реализуйте открытый [Партнёрский метод для получения вебхуков](/products/alfa-api/documentation/articles/webhooks/articles/partner-webhook/v1/partner-webhook).
+3. Создайте вебхук в песочнице с помощью метода [«Создание вебхука»](/products/alfa-api/documentation/articles/webhooks/articles/create-webhook/v1/create-webhook).
+4. Вызовите метод [«Проверка работы вебхука»](/products/alfa-api/documentation/articles/sandbox/articles/check-webhook/articles/transactions/v1/transactions).
+ - В результате успешного запроса для `object = ul_transaction_default` создаются тестовые транзакции для следующих счетов:
+ - `40702810102300000001`
+ - `40702810402300000002`
+ - `40702810002300000003`
+ - `40702978902300000004`
+ - В результате успешного запроса для `object = jp_sbp_incoming_payments` будет создан тестовый платёж для счёта:
+ - `40702810100010000000`
+5. После создания транзакций на ваш метод будет отправлен вебхук. Примеры форматов представлены ниже.
+
+### Пример формата вебхука для выписки
+
+```json
+[
+ {
+ "actionType": "update",
+ "eventTime": "2022-01-12T00:00:00",
+ "object": "ul_transaction_default",
+ "organizationId": "vvvvvv",
+ "data": {
+ "amount": {
+ "amount": 1.0,
+ "currencyName": "RUR"
+ },
+ "amountRub": {
+ "amount": 1.0,
+ "currencyName": "RUR"
+ },
+ "correspondingAccount": "30101810200000000593",
+ "direction": "CREDIT",
+ "documentDate": "2022-01-12",
+ "filial": "АО \"АЛЬФА-БАНК\" г Москва",
+ "number": "178",
+ "operationCode": "01",
+ "operationDate": "2022-01-12T00:00:00",
+ "paymentPurpose": "Перевод собственных средств. НДС не облагается.",
+ "priority": "5",
+ "revaln": null,
+ "uuid": "9084d309-b30b-5083-9a54-d4522472e11a",
+ "transactionId": "1220112MOCO#DS4001415",
+ "rurTransfer": {
+ "cartInfo": {
+ "documentCode": null,
+ "documentContent": null,
+ "documentDate": null,
+ "documentNumber": null,
+ "paymentNumber": null,
+ "restAmount": null
+ },
+ "deliveryKind": "электронно",
+ "departmentalInfo": {
+ "uip": "1",
+ "drawerStatus101": "01",
+ "kbk": "18210102010011000110",
+ "oktmo": "12301000",
+ "reasonCode106": "ТП",
+ "taxPeriod107": "ГД.01.2022",
+ "docNumber108": "123",
+ "docDate109": "12.01.2022",
+ "paymentKind110": "1"
+ },
+ "payeeAccount": "40702810301300000763",
+ "payeeBankBic": "044525593",
+ "payeeBankCorrAccount": "30101810200000000593",
+ "payeeBankName": "АО \"АЛЬФА-БАНК\" г Москва",
+ "payeeInn": "0140237176",
+ "payeeKpp": "770801001",
+ "payeeName": "Полное наименование Орг № 11329",
+ "payerAccount": "40702810701300000761",
+ "payerBankBic": "044525593",
+ "payerBankCorrAccount": "30101810200000000593",
+ "payerBankName": "АО \"АЛЬФА-БАНК\" г Москва",
+ "payerInn": "0140237176",
+ "payerKpp": "770801001",
+ "payerName": "Полное наименование Орг № 11329",
+ "payingCondition": null,
+ "purposeCode": "2",
+ "receiptDate": "2022-01-12",
+ "valueDate": "2022-01-12"
+ }
+ }
+ }
+]
+```
+
+### Пример формата вебхука для входящих платежей
+
+```json
+[
+ {
+ "actionType": "update",
+ "eventTime": "2022-01-12T00:00:00",
+ "object": "jp_sbp_incoming_payments",
+ "organizationId": "vvvvvv",
+ "data": {
+ "qrcId": "AD1000038AQ1FG409KGACUQU5QRSH3FM",
+ "nspkTransactionId": "B467FC50C59A469A9898AB7B05EE3F07",
+ "amount": 1000000,
+ "taxAmount": 200000,
+ "paymentPurpose": "Оплата по договору №123456789 от 01.09.2001",
+ "payeeAccount": "40702810100010000000",
+ "payerAccount": null,
+ "currency": "RUR",
+ "timestamp": "2024-11-26T09:09:32Z",
+ "payerInfo": {
+ "name": "ИП Викулин",
+ "inn": "911006876365",
+ "bik": "044525593",
+ "accountType": "BBAN",
+ "bankName": "АО \"АЛЬФА-БАНК\"",
+ "bankCorrAccount": "30101810200000000593"
+ },
+ "recipientInfo": {
+ "name": "OOO Ромашка",
+ "inn": "8110068763612",
+ "bik": "044625503",
+ "accountType": null,
+ "bankName": "БАНК",
+ "bankCorrAccount": "30101810200000000522"
+ }
+ }
+ }
+]
+```
+
+---
+
+**Навигация:**
+
+- ← [Начало работы в песочнице](/products/alfa-api/documentation/articles/sandbox/articles/intro/intro)
+- [Проверка работы вебхука](/products/alfa-api/documentation/articles/sandbox/articles/check-webhook/articles/transactions/v1/transactions) →
diff --git a/_docs/alfabank/payin_and_kyc/Песочница/check-webhook/checking_the_webhook_eg_transactions.md b/_docs/alfabank/payin_and_kyc/Песочница/check-webhook/checking_the_webhook_eg_transactions.md
new file mode 100644
index 0000000..a18eae4
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Песочница/check-webhook/checking_the_webhook_eg_transactions.md
@@ -0,0 +1,101 @@
+# Проверка работы вебхука
+
+**Теги:** `B2B` `B2C` `H2H`
+
+### Эндпоинт для Песочницы
+
+`POST https://sandbox.alfabank.ru/api/v1/webhooks-events`
+
+### Scope
+
+`transactions` `b2b-sbp`
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow](/products/alfa-api/documentation/articles/alfa-id/articles/acf/articles/intro/intro) / [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | application/json |
+| **Content-Type** | string | required | application/json |
+
+### BODY
+
+| Атрибут | Тип | Обязательность | Описание |
+| :--------- | :----- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **object** | string | required | Объект/сущность, на который партнёр API хочет подписаться. Возможные значения: • `ul_transaction_default` — получение выписки; • `jp_sbp_incoming_payments` — получение входящих платежей |
+
+### Пример запроса
+
+```bash
+curl -X POST https://sandbox.alfabank.ru/api/v1/webhooks-events \
+ -H 'Authorization: Bearer {token}' \
+ -H 'Accept: application/json' \
+ -H 'Content-Type: application/json' \
+ -d '{
+ "object": "ul_transaction_default"
+ }'
+```
+
+---
+
+## Параметры ответа
+
+### 201 Created
+
+Нет тела ответа.
+
+### 400 Bad Request
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------------------- | :----- | :------------- | :--------------------------------------------------------------------------- |
+| **error** | string | required | Код ошибки. Значение: `invalid_request` — неверные входные параметры запроса |
+| **error_description** | string | optional | Описание ошибки |
+
+### 401 Unauthorized
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------------------- | :----- | :------------- | :----------------------------------------------------------------------------------------------------------------------------- |
+| **error** | string | required | Код ошибки. Значение: `invalid_token` — предоставленный токен просрочен, отозван, имеет неправильный формат или недействителен |
+| **error_description** | string | optional | Описание ошибки |
+
+### 403 Forbidden
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------------------- | :----- | :------------- | :----------------------------------------------------------------------------------------------------------- |
+| **error** | string | required | Код ошибки. Значение: `insufficient_scope` — у пользователя нет прав на использование запрашиваемого сервиса |
+| **error_description** | string | optional | Описание ошибки |
+
+### 404 Not Found
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------------------- | :----- | :------------- | :----------------------------------------------------------------------- |
+| **error** | string | required | Код ошибки. Значение: `unknown_route` — эндпоинт не найден или неактивен |
+| **error_description** | string | optional | Описание ошибки |
+
+### 429 Too Many Requests
+
+Нет тела ответа.
+
+### 500 Internal Server Error
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------------------- | :----- | :------------- | :----------------------------------------------------------------- |
+| **error** | string | required | Код ошибки. Значение: `internal_error` — внутренняя ошибка сервиса |
+| **error_description** | string | optional | Описание ошибки |
+
+### 503 Service Unavailable
+
+Нет тела ответа.
+
+> **Примечание:** Значения параметров ошибок могут изменяться. Рекомендуем предусмотреть стандартную обработку ошибок, не описанных в текущей версии документации.
+
+---
+
+## Навигация
+
+- ← [Инструкция по тестированию](/products/alfa-api/documentation/articles/sandbox/articles/check-webhook/articles/intro/intro)
+- [Тестирование электронной подписи](/products/alfa-api/documentation/articles/sandbox/articles/check-signature/check-signature) →
diff --git a/_docs/alfabank/payin_and_kyc/Песочница/managing-certificates.md b/_docs/alfabank/payin_and_kyc/Песочница/managing-certificates.md
new file mode 100644
index 0000000..44334af
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Песочница/managing-certificates.md
@@ -0,0 +1,26 @@
+# Управление сертификатами для подписи и шифрования
+
+**Теги:** `B2B` `B2C` `H2H`
+
+### RSA
+
+Для тестирования подписи и шифрования сообщений с помощью RSA-сертификата Вам будет необходимо выпустить сертификат в УЦ Альфа-Банка с помощью сервиса [«Электронная подпись»](/products/alfa-api/documentation/articles/signature/signature).
+
+Первым шагом инструкции на выпуск RSA-сертификата выполняется запрос на сертификат. Для получения тестового сертификата на втором пункте с созданием закрытого ключа необходимо воспользоваться тестовым закрытым ключом [key-encrypted.zip](/assets/developers-portal.docs.alfa-api/articles/sandbox/articles/managing-certificates/files/sandbox_alfa_test_jwt_2026.zip) (пароль для архива уточняйте у персонального менеджера).
+
+Для проверки подписи необходимо использовать тестовый [сертификат](/assets/developers-portal.docs.alfa-api/articles/sandbox/articles/managing-certificates/files/sandbox_alfa_test_jwt_2026.cer) ключа проверки подписи.
+
+### ГОСТ
+
+Для тестирования подписи и шифрования сообщений с помощью ГОСТ-сертификата Вам будет необходимо выпустить сертификат в любом специализированном [государственном УЦ](https://digital.gov.ru/ru/activity/govservices/certification_authority/?utm_referrer=https%3a%2f%2fwww.google.com%2f). Далее сертификат необходимо загрузить в Банк с помощью метода [«Добавление сертификата»](/products/alfa-api/documentation/articles/signature-encryption/articles/managing-certificates/articles/post-certificates/post-certificates), указав при этом в поле `type` тип этого сертификата.
+
+Для тестирования методов необходимо использовать URL [https://sandbox.alfabank.ru/api](https://sandbox.alfabank.ru/api).
+
+Для проверки подписи необходимо использовать тестовый сертификат ключа проверки подписи. Для получения сертификата напишите на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru).
+
+---
+
+#### Навигация
+
+- ← [Тестирование электронной подписи](/products/alfa-api/documentation/articles/sandbox/articles/check-signature/check-signature)
+- [Формат исходного сообщения JSON](/products/alfa-api/documentation/articles/sandbox/articles/signature/articles/jws/v1/jws) →
diff --git a/_docs/alfabank/payin_and_kyc/Песочница/payments.md b/_docs/alfabank/payin_and_kyc/Песочница/payments.md
new file mode 100644
index 0000000..e6ee837
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Песочница/payments.md
@@ -0,0 +1,80 @@
+# Тестирование платёжных поручений
+
+**Теги:** `B2B` `H2H`
+
+Для тестирования метода [«Создание рублёвого платёжного поручения»](/products/alfa-api/documentation/articles/payments/articles/create/v2/create) в песочнице необходимо сгенерировать уникальный идентификатор для передачи в параметре `externalId`.
+
+При создании рублёвого платёжного поручения **с подписью** в параметре `certificateUuid` необходимо передать серийный номер RSA-сертификата:
+`61000366d11e143acbc03a56d70001000366d1`
+
+### Значения БИК банка для тестирования
+
+Эти значения передаются в полях `payerBankBic` и `payeeBankBic`:
+
+- `040173745`
+- `044525593`
+
+---
+
+### Пример тестового запроса
+
+```bash
+curl --location --request POST 'https://sandbox.alfabank.ru/api/jp/v2/payments' \
+ --header 'Authorization: Bearer {access-token}' \
+ --header 'Content-Type: application/json' \
+ --header 'Accept: application/json' \
+ --data-raw '{
+ "amount": 1.00,
+ "date": "2022-10-11",
+ "deliveryKind": "электронно",
+ "departmentalInfo": {
+ "uip": "0",
+ "drawerStatus101": "01",
+ "kbk": "18210102010011000110",
+ "oktmo": "45902000",
+ "reasonCode106": "ТП",
+ "taxPeriod107": "МС.02.2022",
+ "docNumber108": "000000000000001",
+ "docDate109": "2022-05-25"
+ },
+ "digestSignatures": [
+ {
+ "base64Encoded": "HlaeIHXXEcGT1bFxo1NlpAzpr+kJ2IQrcxVdvDTep6xjsmD1FDb+6NIyLT+/T24S0mPfVCU75sieOMt71TBS7w==",
+ "certificateUuid": "61000366d11e143acbc03a56d70001000366d1"
+ }
+ ],
+ "externalId": "22a6dd81-103a-4d3a-8e9b-0ba4b527f5f6",
+ "number": "1047",
+ "operationCode": "01",
+ "payeeAccount": "40702810564564564531",
+ "payeeBankBic": "040173745",
+ "payeeBankCorrAccount": "30101810800000000745",
+ "payeeInn": "7723870785",
+ "payeeKpp": "553453453",
+ "payeeName": "Общество с ограниченной ответственностью \"Центр \"ИННОВАЦИЯ\"",
+ "payerAccount": "40702810102300000001",
+ "payerBankBic": "044525593",
+ "payerBankCorrAccount": "30101810200000000593",
+ "payerInn": "0453438040",
+ "payerKpp": "046773311",
+ "payerName": "Общество с ограниченной ответственностью \"Клиент\"",
+ "priority": "5",
+ "purpose": "Оплата заказа №1. НДС не облагается",
+ "urgencyCode": "NORMAL",
+ "vat": {
+ "rate": "0",
+ "type": "NO_VAT"
+ }
+}'
+```
+
+---
+
+### Навигация
+
+- ← [Формат исходного сообщения TXT](/products/alfa-api/documentation/articles/sandbox/articles/signature/articles/text/v1/text)
+- [Для чего нужен SDK](/products/alfa-api/documentation/articles/sdk/articles/intro/intro) →
+
+---
+
+_Примечание: Данный документ предназначен для работы в среде **Песочница**._
diff --git a/_docs/alfabank/payin_and_kyc/Песочница/sandbox_intro.md b/_docs/alfabank/payin_and_kyc/Песочница/sandbox_intro.md
new file mode 100644
index 0000000..ebb8e86
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Песочница/sandbox_intro.md
@@ -0,0 +1,142 @@
+# Начало работы в песочнице
+
+**Теги:** `B2B` `B2C` `H2H`
+
+**Песочница API** — это среда, которую партнёры API могут использовать для имитации промышленной среды и получения смоделированных ответов по всем API.
+
+Песочница позволяет пройти аутентификацию в Alfa ID и вызвать методы Alfa API в тестовом режиме, не воздействуя на реальные данные.
+
+> **Внимание**
+> Обработка негативных сценариев (например, ошибки валидации или доступа) **в песочнице** может отличаться от обработки в промышленной среде и спецификации тестируемого метода.
+
+---
+
+## Подготовка к работе в песочнице
+
+Для начала работы в песочнице пройдите следующие шаги:
+
+1. **Заключите договор о техническо-информационном взаимодействии**
+ Подробнее [на странице Подписание договора](/products/alfa-api/documentation/articles/connection/articles/onboarding/onboarding).
+
+2. **Получите тестовый `client_id` и `scope`**
+ Получите `client_id` и доступные `scope` [на Портале разработчика](/products/alfa-api/documentation/articles/selfservice/articles/test/test). Также эти данные можно найти в письме, отправленном банком вам на почту после подписания договора.
+
+3. **Установите тестовый TLS-сертификат**
+ Для получения доступа к тестовой среде необходимо установить тестовый TLS-сертификат – [test_cert.zip](/assets/developers-portal.docs.alfa-api/articles/sandbox/articles/intro/files/test_cert.zip) – пароль для архива уточняйте у персонального менеджера.
+
+ **Архив состоит из файлов:**
+ - `sandbox_cert_2026.cer` – сертификат для клиента (открытый ключ);
+ - `sandbox_key_2026.key` – закрытый ключ;
+ - `apica_2022_chain.cer` – цепочка сертификатов УЦ (содержит в себе `root_apica_2022.cer` и `sub_root_apica_2022.cer`);
+ - `root_apica_2022.cer` – корневой сертификат УЦ;
+ - `sub_root_apica_2022.cer` – промежуточный сертификат УЦ;
+ - `baas_swagger_2026.p12` – контейнер p12, содержащий вышеперечисленные файлы.
+
+ Для доступа к Swagger UI можно использовать следующие комбинации (в зависимости от выбора Вашего ПО для работы с API):
+ - открытый ключ + закрытый ключ + цепочка сертификатов УЦ;
+ - открытый ключ + закрытый ключ + корневой сертификат УЦ + промежуточный сертификат УЦ;
+ - контейнер p12 (`baas_swagger_2026.p12`) – самый простой способ.
+
+ **Важно!** Корневой сертификат УЦ необходимо добавить в доверенные сертификаты на своей стороне.
+
+ Для вызова методов можно использовать стандартные программные средства для работы с API: Postman, SoapUI, JMeter, curl или использовать самописные программные средства или встроенные возможности ERP-системы.
+
+4. **Установите сертификаты Минцифры**
+ Для корректной работы песочницы необходимо установить [сертификаты Минцифры](/products/alfa-api/documentation/articles/specification/articles/certificate/articles/intro/intro).
+
+5. **Проверьте тестовый Swagger UI**
+ Тестовый Swagger UI находится по адресу [https://sandbox.alfabank.ru/swagger-ui/](https://sandbox.alfabank.ru/swagger-ui/)
+
+6. **Получите тестовый `client_secret`**
+ Подробнее [на странице Client secret](/products/alfa-api/documentation/articles/connection/articles/clientsecret/clientsecret).
+
+---
+
+## Особенности вызовов
+
+После выполнения указанных шагов вы можете приступать к тестированию запросов в песочнице.
+
+При использовании песочницы все вызовы API должны осуществляться с установкой mTLS-соединения. В зависимости от требований используемого вами клиента при отправке запросов вам может понадобиться сертификат и закрытый ключ. Рекомендуем ознакомиться с документацией используемого клиента.
+
+### Пример запроса (cURL)
+
+```bash
+curl -X GET https://sandbox.alfabank.ru/api/v1/endpoint \
+ -v --cert test_certificate.cer \
+ --key test_key.key \
+ --header 'accept: application/json' \
+ --header 'content-type: application/json'
+```
+
+---
+
+## Как сообщить об ошибке
+
+Отправьте письмо на [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru), указав следующие данные:
+
+1. `client_id`.
+2. Дата и время запроса с указанием часового пояса.
+3. Метод и URI запроса.
+4. Заголовки и тело запроса.
+5. Полученная ошибка и заголовки ответа, включая `X-TraceId`.
+6. IP-адрес, с которого был отправлен запрос.
+
+---
+
+## Адреса для тестирования
+
+- **Получение кода авторизации:** [https://id-sandbox.alfabank.ru/oidc/authorize?response_type=code&client_id={client_id}&redirect_uri={redirect_uri}&scope={scope}&state={state}](https://id-sandbox.alfabank.ru/oidc/authorize?response_type=code&client_id=%7Bclient_id%7D&redirect_uri=%7Bredirect_uri%7D&scope=%7Bscope%7D&state=%7Bstate%7D)
+- **Другие запросы в Alfa ID:** [https://sandbox.alfabank.ru/oidc](https://sandbox.alfabank.ru/oidc)
+- **Запросы в Alfa API:** [https://sandbox.alfabank.ru/api](https://sandbox.alfabank.ru/api)
+
+---
+
+## Счета для тестирования
+
+**Номера счетов:**
+
+- `40702810102300000001`
+- `40702810402300000002`
+- `40702810002300000003`
+- `40702810002300000004`
+
+**Номер корреспондентского счёта:**
+
+- `30102810102300000593`
+
+---
+
+## Рекомендации по тестированию Alfa ID ЮЛ (Юридические лица)
+
+Для прохождения процедуры аутентификации используйте тестовые данные:
+
+- **Login:** `SomeDifficultLogin`
+- **Password:** `1qaz!QAZ`
+- **One-Time Password (OTP):** `000000`
+
+Для подписания формы согласия используйте:
+
+- **One-Time Password:** `111111`
+
+Подробнее [в разделе Alfa ID](/products/alfa-api/documentation/articles/alfa-id/alfa-id).
+
+---
+
+## Рекомендации по тестированию Alfa ID ФЛ (Физические лица)
+
+Для прохождения процедуры аутентификации используйте тестовые данные:
+
+- **Номер телефона:** `71111111111`
+- **Login:** `SomeDifficultLogin`
+- **Password:** `000000`
+- **One-Time Password (OTP):** `000000`
+
+Для подписания формы согласия используйте:
+
+- **One-Time Password:** `000000`
+
+Подробнее [в разделе Alfa ID](/products/alfa-api/documentation/articles/alfa-id/alfa-id).
+
+---
+
+[← API Key](/products/alfa-api/documentation/articles/api-key/api-key) | [Инструкция по тестированию вебхуков →](/products/alfa-api/documentation/articles/sandbox/articles/check-webhook/articles/intro/intro)
diff --git a/_docs/alfabank/payin_and_kyc/Песочница/signature-checking.md b/_docs/alfabank/payin_and_kyc/Песочница/signature-checking.md
new file mode 100644
index 0000000..dfbcb00
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Песочница/signature-checking.md
@@ -0,0 +1,40 @@
+# Тестирование электронной подписи
+
+**Теги:** `B2B` `H2H`
+
+Во втором шаге инструкции на [выпуск RSA-сертификата](/products/alfa-api/documentation/articles/signature/articles/intro/intro) выполняется запрос на сертификат. Для тестирования в песочнице необходимо использовать приложенный ниже `pkcs10Content` при вызове метода ["Заявка на выпуск RSA-сертификата"](/products/alfa-api/documentation/articles/signature/articles/issue-rsa/v1/issue-rsa).
+
+### Содержимое pkcs10Content (Certificate Request)
+
+```text
+-----BEGIN CERTIFICATE REQUEST-----
+MIIC/DCCAeQCAQAwgacxJTAjBgkqhkiG9w0BCQEWFlVzZXI1MDRAcG9jaHRvY2hr
+YS5jb20xOzA5BgNVBAMMMtCa0YPQtNGA0Y/QstGG0LXQsiDQldGA0LzQvtC70LDQ
+nuSDQmNCz0L7RgNC10LLQuNGHMQswCQYDVQQGEwJSVTEbMBkGA1UEBAwS0JrRg9C0
+0YDRj9Cy0YbQtdCyMRcwFQYDVQQqDA7QldGA0LzQvtC70LDQuTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANGTN2bX/kaOHuuEfMiOKg1f8y3SY1AseVjQ
+ceoHKdaSeLoUIscPgEsuDsbtF6ezsZqV7bwyRYuJK+kMprczDWKiQNxmZPOafiKG
+5MKOcxysgX9LV+R8JhVoycfQqmSqfImQBcPZ6s9bqq6J8cs04FCzy+nhPYoFUs2l
+X+ZrFfLF135fO4LlRxfj4dfIbHZ4NVogiezIteBE3SPTtEeXiYj2c7SyB0Z17gbQ
+dTmtWIolrb5GTZ6SyjjcMZY3U2ZR+4eyn2l1MFt5F/K9Ke47zu4DYTF7zkitST11
+nr5gR64zjVZRtmrVqMU9iB7NmQ8/gS8YEsC3PTSECvqioSDHwNcCAwEAAaAPMA0G
+CSqGSIb3DQEJDjEAMA0GCSqGSIb3DQEBCwUAA4IBAQBazGrfYMfeUdJ7ofbQ5lom
+EsHO/cA312QUpyzFEsHbjYhy9OZTjiVXLfVExf8QrcRchi4/6IECp01S2Ed+nfMm
+E/MtD3rtE2oBtH6FjA9APtZb9NZuiSYCzl7nL3rd0ui+F32Dy/JNkudktn64jsMH
+YVt5u8Ik0dtxl0axa3E5RUkpJTTl7iIOWD+P8UkOOpa9EMPA2hrtrZvPr8xr60IS
+d2t4vKFcHIdgdI2Qe5ATvaYfbccLGjxdWm05lXVuxRjpEOXjuhc5mRkEj06bPavD
+9k7h/Tsz4Jb9gNKDZ3TEzfynQkDFFse8in6IDDkwPO21J6onTMd7KOP1gqMSYjrh
+-----END CERTIFICATE REQUEST-----
+```
+
+### Данные для подтверждения
+
+Для шага с подписанием заявки с помощью кода из СМС использовать:
+**One-Time Password: 11111111**
+
+---
+
+#### Навигация
+
+- ← [Проверка работы вебхука](/products/alfa-api/documentation/articles/sandbox/articles/check-webhook/articles/transactions/v1/transactions)
+- [Управление сертификатами для подписи и шифрования](/products/alfa-api/documentation/articles/sandbox/articles/managing-certificates/managing-certificates) →
diff --git a/_docs/alfabank/payin_and_kyc/Песочница/signature-encryption-tests/jws_POST.md b/_docs/alfabank/payin_and_kyc/Песочница/signature-encryption-tests/jws_POST.md
new file mode 100644
index 0000000..9568239
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Песочница/signature-encryption-tests/jws_POST.md
@@ -0,0 +1,102 @@
+# Формат исходного сообщения JSON
+
+**Метод:** `POST`
+**Эндпоинт (Песочница):** `https://sandbox.alfabank.ru/api/signature-encryption-tests/json`
+
+---
+
+### Описание
+
+С помощью данного метода можно протестировать подпись и шифрование сообщения в формате JSON с использованием ГОСТ- или RSA-сертификата.
+
+- Процесс формирования и подписания сообщения с использованием RSA-сертификата описан [здесь](/products/alfa-api/documentation/articles/signature-encryption/articles/signature/articles/json-rsa/json-rsa).
+- Процесс формирования и шифрования сообщения RSA описан [здесь](/products/alfa-api/documentation/articles/signature-encryption/articles/encryption/articles/json-rsa/json-rsa).
+- Подписание запроса и дешифрование ответа происходит с использованием закрытого ключа сертификата. Для тестирования необходимо использовать тестовый [закрытый ключ](/assets/developers-portal.docs.alfa-api/articles/sandbox/articles/signature/articles/jws/v1/files/sandbox_alfa_test_jwt_2026.zip) (пароль уточняйте у персонального менеджера).
+- Процесс формирования и подписания сообщения с использованием ГОСТ-сертификата описан [здесь](/products/alfa-api/documentation/articles/signature-encryption/articles/signature/articles/json-gost/json-gost).
+- Процесс формирования и шифрования сообщения ГОСТ описан [здесь](/products/alfa-api/documentation/articles/signature-encryption/articles/encryption/articles/json-gost/json-gost).
+
+> **Внимание**
+> Способ защиты данных определяется настройками интеграции. Для уточнения информации по настройке Вашей интеграции или запроса для установления нужных настроек необходимо написать на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru). При запросе установления настроек необходимо сообщить способ защиты (подпись или подпись с шифрованием), а также алгоритм (RSA или ГОСТ).
+
+---
+
+### Параметры запроса
+
+#### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :----------------------------- | :----- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------ |
+| **Authorization** | string | required | Bearer {access_token} |
+| **Accept** | string | required | application/jose |
+| **Content-Type** | string | required | application/jose |
+| **X-Request-ChannelSecurity** | string | optional | Тип защиты канала для запроса. Значения: `NO` (без защиты), `SIGNATURE` (проверка подписи), `ENCRYPTION` (дешифрование и проверка подписи). |
+| **X-Response-ChannelSecurity** | string | optional | Тип защиты канала для ответа. Значения: `NO` (без защиты), `SIGNATURE` (подписание ответа), `ENCRYPTION` (подписание и шифрование ответа). |
+
+#### BODY
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------ | :----- | :------------- | :-------------------------------- |
+| (root) | string | required | Тело подписи в виде base64-строки |
+
+---
+
+### Пример запроса
+
+```bash
+curl -X POST https://sandbox.alfabank.ru/api/signature-encryption-tests/json \
+ -H 'Authorization: Bearer {access-token}' \
+ -H 'Accept: application/jose' \
+ -H 'Content-Type: application/jose' \
+ -H 'X-Request-ChannelSecurity: SIGNATURE' \
+ -H 'X-Response-ChannelSecurity: SIGNATURE' \
+ -d 'eyJraWQiOiI2MTAwMDM4YWFhYTAxZTRkN2YzOTM5OGQ4NDAwMDEwMDAzOGFhYSIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0.eyJjb3VudCI6MTAwLCJzb21lRmllbGQiOiJzb21lVmFsdWUiLCJpZCI6IjNiNzk1YTBlLTFjOTctNDIxMi05YTI4LWYyODJkODAxNWI1YSIsImNyZWF0aW9uRGF0ZSI6IjIwMjItMDUtMThUMTA6Mjc6MDkuNzEyWiIsInN0YXR1cyI6ImFjdGl2ZSJ9.WYQKfllUHfs7IN0DdujjKlqpnThfJZgY_A6CZN-ghFohTYbDiRAJBAk4IxIkRfj2Hxcz4rR5DEKX8remdXEOHGrBpNf4okOob0bfIutNRhaeaZAIMFKjungALPRBmMhAiU0t5-Vp3ImUwhidSnSSP08gCHrTD1by5zYrzzYBB6tyikf8lNwYJQKRxscZcXqwOU9gAWBuV4rteClIbDCeTwkx5ci6WKWAq8bv7RDuwU_1KPjh6upJmwJ1g1epmvPdaFOQq5uf9NhAxomeeptmJoBOm3c8ZSYASYMno8KNWxr94B2xAhD7NCakfFCiQZjSH9b6MjM2aJEBhDyKYo2IGw'
+```
+
+---
+
+### Параметры ответа
+
+#### 201 Created
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------ | :----- | :------------- | :---------- |
+| (root) | string | optional | Тело ответа |
+
+#### 400 Bad Request
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------------------- | :----- | :------------- | :----------------------------------------------------------------- |
+| **error** | string | required | Код ошибки: `invalid_request` — неверные входные параметры запроса |
+| **error_description** | string | optional | Описание ошибки |
+
+#### 401 Unauthorized
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------------------- | :----- | :------------- | :------------------------------------------------------------------------ |
+| **error** | string | required | Код ошибки: `invalid_token` — токен просрочен, отозван или недействителен |
+| **error_description** | string | optional | Описание ошибки |
+
+#### 404 Not Found
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------------------- | :----- | :------------- | :---------------------------------------------------------------- |
+| **error** | string | required | Код ошибки: `unknown_endpoint` — эндпоинт не найден или неактивен |
+| **error_description** | string | optional | Описание ошибки |
+
+#### 500 Internal Server Error
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------------------- | :----- | :------------- | :------------------------------------------------------- |
+| **error** | string | required | Код ошибки: `internal_error` — внутренняя ошибка сервиса |
+| **error_description** | string | optional | Описание ошибки |
+
+---
+
+_Значения параметров ошибок могут изменяться. Рекомендуем предусмотреть стандартную обработку ошибок, не описанных в текущей версии документации._
+
+---
+
+**Навигация:**
+
+- [← Управление сертификатами для подписи и шифрования](/products/alfa-api/documentation/articles/sandbox/articles/managing-certificates/managing-certificates)
+- [Формат исходного сообщения XML →](/products/alfa-api/documentation/articles/sandbox/articles/signature/articles/xmldsig/v1/xmldsig)
diff --git a/_docs/alfabank/payin_and_kyc/Песочница/signature-encryption-tests/text_POST.md b/_docs/alfabank/payin_and_kyc/Песочница/signature-encryption-tests/text_POST.md
new file mode 100644
index 0000000..ae734af
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Песочница/signature-encryption-tests/text_POST.md
@@ -0,0 +1,72 @@
+Вот преобразованный в Markdown формат документации для метода тестирования подписи и шифрования TXT-сообщений.
+
+---
+
+# Формат исходного сообщения TXT
+
+Метод позволяет протестировать подпись и шифрование сообщения в формате TXT с использованием ГОСТ- или RSA-сертификата.
+
+### Эндпоинт (Песочница)
+`POST https://sandbox.alfabank.ru/api/signature-encryption-tests/text`
+
+---
+
+### Описание процесса
+* **RSA-сертификат:** Процесс формирования и подписания описан [здесь](https://developers.alfabank.ru/products/alfa-api/documentation/articles/signature-encryption/articles/signature/articles/text-rsa/text-rsa), а шифрования — [здесь](https://developers.alfabank.ru/products/alfa-api/documentation/articles/signature-encryption/articles/encryption/articles/text-rsa/text-rsa).
+* **ГОСТ-сертификат:** Процесс формирования и подписания описан [здесь](https://developers.alfabank.ru/products/alfa-api/documentation/articles/signature-encryption/articles/signature/articles/text-gost/text-gost), а шифрования — [здесь](https://developers.alfabank.ru/products/alfa-api/documentation/articles/signature-encryption/articles/encryption/articles/text-gost/text-gost).
+* **Тестирование:** Подписание запроса и дешифрование ответа происходит с использованием закрытого ключа. Для тестов используйте [закрытый ключ](https://developers.alfabank.ru/assets/developers-portal.docs.alfa-api/articles/sandbox/articles/signature/articles/text/v1/files/sandbox_alfa_test_jwt_2026.zip) (пароль уточняйте у персонального менеджера).
+
+> **⚠️ Внимание**
+> Способ защиты данных определяется настройками интеграции. Для уточнения настроек или их изменения напишите на [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru), указав способ защиты (подпись или подпись с шифрованием) и алгоритм (RSA или ГОСТ).
+
+---
+
+### Параметры запроса
+
+#### HEADERS
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | string | required | Bearer {access_token} |
+| **Accept** | string | required | text/plain |
+| **Content-Type** | string | required | text/plain |
+| **X-Request-ChannelSecurity** | string | optional | Тип защиты запроса. Значения: `NO` (без защиты), `SIGNATURE` (подпись), `ENCRYPTION` (дешифрование и подпись). |
+| **X-Response-ChannelSecurity** | string | optional | Тип защиты ответа. Значения: `NO` (без защиты), `SIGNATURE` (подпись), `ENCRYPTION` (подпись и шифрование). |
+
+#### BODY
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| — | string | required | Тело подписи в виде base64-строки |
+
+#### Пример запроса
+```bash
+curl -X POST https://sandbox.alfabank.ru/api/signature-encryption-tests/text \
+ -H 'Authorization: Bearer {access-token}' \
+ -H 'Accept: text/plain' \
+ -H 'Content-Type: text/plain' \
+ -H 'X-Request-ChannelSecurity: SIGNATURE' \
+ -H 'X-Response-ChannelSecurity: SIGNATURE' \
+ -d 'eyJraWQiOiI2MTAwMDM4YWFhYTAxZTRkN2YzOTM5OGQ4NDAwMDEwMDAzOGFhYSIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0.eyJjb3VudCI6MTAwLCJzb21lRmllbGQiOiJzb21lVmFsdWUiLCJpZCI6IjNiNzk1YTBlLTFjOTctNDIxMi05YTI4LWYyODJkODAxNWI1YSIsImNyZWF0aW9uRGF0ZSI6IjIwMjItMDUtMThUMTA6Mjc6MDkuNzEyWiIsInN0YXR1cyI6ImFjdGl2ZSJ9.WYQKfllUHfs7IN0DdujjKlqpnThfJZgY_A6CZN-ghFohTYbDiRAJBAk4IxIkRfj2Hxcz4rR5DEKX8remdXEOHGrBpNf4okOob0bfIutNRhaeaZAIMFKjungALPRBmMhAiU0t5-Vp3ImUwhidSnSSP08gCHrTD1by5zYrzzYBB6tyikf8lNwYJQKRxscZcXqwOU9gAWBuV4rteClIbDCeTwkx5ci6WKWAq8bv7RDuwU_1KPjh6upJmwJ1g1epmvPdaFOQq5uf9NhAxomeeptmJoBOm3c8ZSYASYMno8KNWxr94B2xAhD7NCakfFCiQZjSH9b6MjM2aJEBhDyKYo2IGw'
+```
+
+---
+
+### Параметры ответа
+
+#### 201 Created
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **responseTextFiled** | string | optional | Тело ответа |
+
+**Пример ответа:**
+```text
+responseTextFiled:responseTextValue
+```
+
+#### Ошибки (400, 401, 404, 500)
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **error** | string | required | Код ошибки (например, `invalid_request`, `invalid_token`, `unknown_endpoint`, `internal_error`) |
+| **error_description** | string | optional | Детальное описание ошибки |
+
+---
+*Примечание: Значения параметров ошибок могут изменяться. Рекомендуется предусмотреть стандартную обработку ошибок.*
diff --git a/_docs/alfabank/payin_and_kyc/Песочница/signature-encryption-tests/xmldsig_POST.md b/_docs/alfabank/payin_and_kyc/Песочница/signature-encryption-tests/xmldsig_POST.md
new file mode 100644
index 0000000..a50fa4f
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Песочница/signature-encryption-tests/xmldsig_POST.md
@@ -0,0 +1,133 @@
+# Формат исходного сообщения XML
+
+**Теги:** `B2B` `B2C` `H2H`
+
+### Эндпоинт для тестирования (Песочница)
+
+`POST https://sandbox.alfabank.ru/api/signature-encryption-tests/xml`
+
+---
+
+### Описание
+
+С помощью данного метода можно протестировать подпись и шифрование сообщения в формате XML с использованием RSA-сертификата.
+
+Процесс формирования и подписания сообщения с использованием RSA-сертификата описан [здесь](/products/alfa-api/documentation/articles/signature-encryption/articles/signature/articles/xml-rsa/xml-rsa), а процесс формирования и шифрования сообщения описан [здесь](/products/alfa-api/documentation/articles/signature-encryption/articles/encryption/articles/xml-rsa/xml-rsa). Подписание запроса и дешифрование ответа происходит с использованием закрытого ключа сертификата. Для тестирования необходимо использовать тестовый [закрытый ключ](/assets/developers-portal.docs.alfa-api/articles/sandbox/articles/signature/articles/xmldsig/v1/files/sandbox_alfa_test_jwt_2026.zip) (пароль уточняйте у персонального менеджера).
+
+Процесс формирования и подписания сообщения с использованием ГОСТ-сертификата описан [здесь](/products/alfa-api/documentation/articles/signature-encryption/articles/signature/articles/xml-gost/xml-gost), а процесс формирования и шифрования сообщения описан [здесь](/products/alfa-api/documentation/articles/signature-encryption/articles/encryption/articles/xml-gost/xml-gost).
+
+> **Внимание**
+> Способ защиты данных определяется настройками интеграции. Для уточнения информации по настройке вашей интеграции или запроса для установления нужных настроек необходимо написать на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru). При запросе установления настроек необходимо сообщить способ защиты (подпись или подпись с шифрованием), а также алгоритм (RSA или ГОСТ).
+
+---
+
+### Параметры запроса
+
+#### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :----------------------------- | :----- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------ |
+| **Authorization** | string | required | Bearer {access_token} |
+| **Accept** | string | required | application/xml |
+| **Content-Type** | string | required | application/xml |
+| **X-Request-ChannelSecurity** | string | optional | Тип защиты канала для запроса. Значения: `NO` — без защиты; `SIGNATURE` — проверка подписи; `ENCRYPTION` — дешифрование и проверка подписи. |
+| **X-Response-ChannelSecurity** | string | optional | Тип защиты канала для ответа. Значения: `NO` — без защиты; `SIGNATURE` — подписание ответа; `ENCRYPTION` — подписание и шифрование. |
+
+#### BODY
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------------- | :----- | :------------- | :-------------------------------- |
+| (тело запроса) | string | required | Тело подписи в виде base64-строки |
+
+#### Пример запроса
+
+```bash
+curl -X POST https://sandbox.alfabank.ru/api/signature-encryption-tests/xml \
+ -H 'Authorization: Bearer {access-token}' \
+ -H 'Accept: application/xml' \
+ -H 'Content-Type: application/xml' \
+ -H 'X-Request-ChannelSecurity: SIGNATURE' \
+ -H 'X-Response-ChannelSecurity: SIGNATURE' \
+ -d 'eyJraWQiOiI2MTAwMDM4YWFhYTAxZTRkN2YzOTM5OGQ4NDAwMDEwMDAzOGFhYSIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0.eyJjb3VudCI6MTAwLCJzb21lRmllbGQiOiJzb21lVmFsdWUiLCJpZCI6IjNiNzk1YTBlLTFjOTctNDIxMi05YTI4LWYyODJkODAxNWI1YSIsImNyZWF0aW9uRGF0ZSI6IjIwMjItMDUtMThUMTA6Mjc6MDkuNzEyWiIsInN0YXR1cyI6ImFjdGl2ZSJ9.WYQKfllUHfs7IN0DdujjKlqpnThfJZgY_A6CZN-ghFohTYbDiRAJBAk4IxIkRfj2Hxcz4rR5DEKX8remdXEOHGrBpNf4okOob0bfIutNRhaeaZAIMFKjungALPRBmMhAiU0t5-Vp3ImUwhidSnSSP08gCHrTD1by5zYrzzYBB6tyikf8lNwYJQKRxscZcXqwOU9gAWBuV4rteClIbDCeTwkx5ci6WKWAq8bv7RDuwU_1KPjh6upJmwJ1g1epmvPdaFOQq5uf9NhAxomeeptmJoBOm3c8ZSYASYMno8KNWxr94B2xAhD7NCakfFCiQZjSH9b6MjM2aJEBhDyKYo2IGw'
+```
+
+---
+
+### Параметры ответа
+
+#### Успешный ответ (201 Created)
+
+| Атрибут | Тип | Описание |
+| :---------------------------- | :----- | :---------------------------------------------------------------- |
+| **ds:Signature** | string | Корневой элемент XML Signature |
+| **ds:SignedInfo** | string | Содержит информацию об алгоритме канонизации, подписи и дайджесте |
+| **ds:CanonicalizationMethod** | string | Алгоритм канонизации (атрибут `Algorithm`) |
+| **ds:SignatureMethod** | string | Алгоритм подписи (атрибут `Algorithm`) |
+| **ds:DigestMethod** | string | Алгоритм дайджеста (атрибут `Algorithm`) |
+| **ds:SignatureValue** | string | Значение тела подписи в кодировке base64 |
+| **ds:KeyInfo** | string | Информация о ключах и сертификатах для проверки подписи |
+| **ds:X509Data** | string | Информация о сертификатах |
+| **ds:X509Certificate** | string | Сертификат, которым подписано тело, в base64 |
+
+#### Пример ответа 201
+
+```xml
+
+
+ XmlElementValue2
+
+ H6jGW+bKLwvQ9xxbhZ6jNYRHtupT4aJ4jjlLh4W8svK0w5G7ZXf4OxqRR0t2l6aYOpNBdN2Q0+2T
+1LXyadtnz7XJ7QYXNXrnWNcq7mOxM5Lj5bBQa2JPZSiMkp1lsnAV/LFDAJ+Uhruj3mFQxjiFpJLR
+W/vRJzmRv925xXWopb94PFvP9mjtAwPXtBGEL5rqJICabzVo8+1BfPwFF5+8sqYzT74mmJIQmeFm
+FiYVMNive5lRxlt7nXEgS4iENF1dXq5+prCPloms8hIX6I4HQo3Jn+G37Os57nv8g61gk4jnu2OK
+bOsZasIzXSLVG2GrCbDQ+HFjWs3Fgg4JOkULfw==
+
+
+
+
+
+ xgVcc1UZhuWRp4/8K0OAVLuQUhySUtJg7mYo78Od+WWidnIZr2XZUvPqwxOpFwRY
+
+
+
+
+
+
+
+
+
+
+
+
+ MIIGATCCBLWgAwIBAgITYQADiqqgHk1/OTmNhAABAAOKqjBBBgkqhkiG9w0BAQowNKAPMA0GCWCG... (урезано для краткости)
+
+
+
+ XmlElementValue1
+
+```
+
+---
+
+### Ошибки
+
+| Код | Описание | Возможные значения `Error` |
+| :------ | :-------------------- | :------------------------------------------------------------ |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры |
+| **401** | Unauthorized | `invalid_token` — токен просрочен, отозван или недействителен |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден или неактивен |
+| **500** | Internal Server Error | `internal_error` — внутренняя ошибка сервиса |
+
+#### Пример ошибки 400
+
+```xml
+
+
+ invalid_request
+ Authorization header is not present in request headers
+
+```
+
+---
+
+_Значения параметров ошибок могут изменяться. Рекомендуем предусмотреть стандартную обработку ошибок, не описанных в текущей версии документации._
diff --git a/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/client_id.md b/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/client_id.md
new file mode 100644
index 0000000..f2063cc
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/client_id.md
@@ -0,0 +1,32 @@
+# Client ID
+
+**B2B** **B2C** **H2H**
+
+Тестовый `client_id` и доступный для использования `scope` будут отправлены на почту, указанную [при подписании договора](/products/alfa-api/documentation/articles/connection/articles/onboarding/onboarding), сразу после его подписания. Также тестовые учётные данные будут доступны [на Портале разработчика](/products/alfa-api/documentation/articles/selfservice/articles/intro/intro).
+
+Для получения промышленного `client_id` необходимо [создать интеграцию в проме](/products/alfa-api/documentation/articles/selfservice/articles/prod/prod) на Портале разработчика. `client_id` будет указан в карточке интеграции.
+
+У вас может быть несколько `client_id` в случаях, если:
+
+- вы интегрируете Alfa API / Alfa ID в свой сервис, используя разные точки входа для пользователей-физических лиц и пользователей-юридических лиц;
+- вы планируете предоставлять разные сервисы своим пользователям;
+- вам требуется получение данных по своей организации, а также использование партнёрского сервиса (если есть прямая интеграция банка и ERP-системы пользователя и есть отдельная интеграция продукта пользователя с Alfa API / Alfa ID).
+
+Для получения нескольких `client_id` вам необходимо запросить у сотрудников Банка отдельный `client_id` для каждой интеграции, а также учитывать наличие нескольких `client_id` при реализации интеграции.
+
+---
+
+### Навигация
+
+[← Отзыв договора](/products/alfa-api/documentation/articles/connection/articles/revoke/revoke) | [TLS-сертификат →](/products/alfa-api/documentation/articles/connection/articles/tls/tls)
+
+---
+
+### Содержание раздела «Подключение к Alfa API»
+
+- [Как подключить](/products/alfa-api/documentation/articles/connection/articles/instruction/instruction)
+- [Подписание договора](/products/alfa-api/documentation/articles/connection/articles/onboarding/onboarding)
+- [Отзыв договора](/products/alfa-api/documentation/articles/connection/articles/revoke/revoke)
+- **Client ID** (текущая страница)
+- [TLS-сертификат](/products/alfa-api/documentation/articles/connection/articles/tls/tls)
+- [Client secret (POST)](/products/alfa-api/documentation/articles/connection/articles/clientsecret/clientsecret)
diff --git a/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/client_secret.md b/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/client_secret.md
new file mode 100644
index 0000000..451258b
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/client_secret.md
@@ -0,0 +1,88 @@
+# Client secret
+
+**Типы интеграции:** `B2B` | `B2C` | `H2H`
+**Метод:** `POST`
+
+> [!IMPORTANT]
+> **Внимание**
+> Получить и заменить `client_secret` можно двумя способами:
+>
+> 1. С помощью кнопки в карточке интеграции на **Портале разработчика**.
+> 2. С помощью описанного ниже API-метода.
+
+---
+
+## Эндпоинты
+
+| Среда | URL |
+| :------------ | :----------------------------------------------------------------------- |
+| **Песочница** | `POST https://sandbox.alfabank.ru/oidc/clients/{clientId}/client-secret` |
+| **Пром** | `POST https://baas.alfabank.ru/oidc/clients/{clientId}/client-secret` |
+
+---
+
+## Описание
+
+`client_secret` представляет собой уникальную строку символов, которая генерируется один раз и не меняется в процессе работы. Достаточно получить его **один раз** и **не менять** в дальнейшем.
+
+При необходимости вы можете использовать этот метод для замены `client_secret` или в случае его компрометации для получения нового.
+
+Если оперативная замена `client_secret` невозможна, необходимо уведомить Банк о факте компрометации по адресу: [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru).
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :--------- | :----- | :------------- | :----------------------------- |
+| **Accept** | string | required | Должен быть `application/json` |
+
+### PATH (Путь)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :----------- | :----- | :------------- | :--------------------------------- |
+| **clientId** | string | optional | Идентификатор партнёрского сервиса |
+
+### Пример запроса (cURL)
+
+```bash
+curl --location --globoff --request POST 'https://baas.alfabank.ru/oidc/clients/{clientId}/client-secret' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+| Атрибут | Тип | Описание |
+| :--------------- | :----- | :---------------------------------------- |
+| **clientId** | string | Идентификатор партнёрского сервиса |
+| **clientSecret** | string | Новый секретный ключ партнёрского сервиса |
+
+**Пример ответа:**
+
+```json
+{
+ "clientId": "0cee0683-85ae-49f2-a63d-29f97aad1911",
+ "clientSecret": "Qwerty1234567890Qwerty1234567890!"
+}
+```
+
+---
+
+## Коды ошибок
+
+| Код | Описание | Возможные значения `error` |
+| :------ | :------------- | :---------------------------------------------------------------------------------- |
+| **400** | Bad Request | `invalid_request` — неверный формат запроса или отсутствуют обязательные параметры. |
+| **401** | Unauthorized | `invalid_token` — ошибка авторизации. |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден или неактивен. |
+| **500** | Internal Error | `internal_error` — внутренняя ошибка сервиса. |
+
+---
+
+_Документация Alfa API_
diff --git a/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/contract_signing.md b/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/contract_signing.md
new file mode 100644
index 0000000..8629fb0
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/contract_signing.md
@@ -0,0 +1,78 @@
+Вот очищенная и структурированная версия документа в формате Markdown.
+
+---
+
+# Подписание договора
+
+**Теги:** `B2B` `B2C` `H2H`
+
+Для подписания договора на информационно–технологическое взаимодействие посредством Alfa API необходимо выполнить следующие шаги:
+
+### 1. Зайдите в Альфа-Бизнес
+Зайдите в Альфа-Бизнес любым удобным для вас способом.
+
+
+Далее на странице второго фактора аутентификации введите полученный на телефон otp-ĸод (sms, push).
+
+
+Вы зашли в Альфа-Бизнес.
+
+
+---
+
+### 2. Перейдите во «Все сервисы и продукты»
+Перейдите на страницу **Все сервисы и продукты** и выберите **Alfa API** в разделе **Обслуживание бизнеса**.
+
+
+При отсутствии на странице пункта «Alfa API» отправьте письмо на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru).
+
+---
+
+### 3. Подключите Alfa API
+На открывшемся лендинге нажмите на кнопку **Подключить Alfa API**.
+
+
+Выберите необходимую организацию (при наличии нескольких организаций).
+
+
+---
+
+### 4. Подпишите договор
+Внимательно ознакомьтесь с текстом договора. При необходимости введите e-mail для технических и для иных запросов. Нажмите на кнопку **Подписать**.
+
+
+Далее на странице введите полученный на телефон otp-ĸод (sms, push).
+
+
+Или подпишите договор при помощи усиленной квалифицированной электронной подписи (**УКЭП**). *Обратите внимание, что данный функционал доступен не всем пользователям.*
+
+Вы успешно подключили Alfa API.
+
+
+---
+
+### 5. Просмотрите подписанный договор
+Для просмотра договора необходимо нажать в верхнем правом углу на наименование компании. В появившейся боковой панели выберите **Настройки**.
+
+
+Далее необходимо выбрать карточку **Управление согласиями**.
+
+
+В разделе **Alfa API** будет отображаться подписанный вами договор. Для просмотра нажмите **Прочитать согласие**.
+
+
+В открывшемся окне вы сможете прочитать договор и скачать его в формате **PDF**.
+
+
+---
+
+### 6. Приступайте к тестированию Alfa API
+После успешного подписания договора вы можете:
+* Получить тестовые учётные данные [на Портале разработчика](/products/alfa-api/documentation/articles/sandbox/sandbox).
+* Приступить к тестированию Alfa API [в Песочнице](/products/alfa-api/documentation/articles/sandbox/sandbox).
+
+Для работы с Порталом вашему разработчику предварительно необходимо получить права на управление настройками Alfa API. Как их назначить, описано [на странице Права доступа](/products/alfa-api/documentation/articles/selfservice/articles/access-rights/access-rights).
+
+---
+**Навигация:**
+← [Как подключить](/products/alfa-api/documentation/articles/connection/articles/instruction/instruction) | [Отзыв договора](/products/alfa-api/documentation/articles/connection/articles/revoke/revoke) →
diff --git a/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/contract_termination.md b/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/contract_termination.md
new file mode 100644
index 0000000..7af8406
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/contract_termination.md
@@ -0,0 +1,55 @@
+# Отзыв договора
+
+**Теги:** `B2B` `B2C` `H2H`
+
+Для отзыва договора на информационно–технологическое взаимодействие посредством Alfa API необходимо выполнить следующие шаги:
+
+### 1. Зайдите в Альфа-Бизнес
+
+Зайдите в [Альфа-Бизнес](https://link.alfabank.ru) любым удобным для вас способом.
+
+
+Далее на странице второго фактора аутентификации введите полученный на телефон otp-ĸод (sms, push).
+
+
+Вы зашли в Альфа-Бизнес.
+
+
+### 2. Перейдите в «Управление согласиями»
+
+Нажмите в верхнем правом углу на наименование компании. В появившейся боковой панели выберите **Настройки**.
+
+
+Выберите карточку **Управление согласиями**.
+
+
+### 3. Отзовите договор
+
+В разделе **Alfa API** будет отображаться подписанный вами договор на информационно–технологическое взаимодействие посредством Alfa API. Для отзыва договора необходимо нажать на кнопку **Отозвать**.
+
+
+Подтвердите своё намерение, нажав на кнопку **Да, расторгнуть**.
+
+
+### 4. Подпишите уведомление
+
+Внимательно ознакомьтесь с текстом уведомления. Нажмите на кнопку **Подписать уведомление**.
+
+
+Далее на странице введите полученный на телефон otp-ĸод (sms, push).
+
+
+Договор отозван.
+
+
+### 5. Просмотрите отозванный договор
+
+Для просмотра отозванного договора необходимо выбрать вкладку **Отозванные согласия**.
+
+
+---
+
+**Навигация:**
+
+- ← [Подписание договора](/products/alfa-api/documentation/articles/connection/articles/onboarding/onboarding)
+- → [Client ID](/products/alfa-api/documentation/articles/connection/articles/clientid/clientid)
diff --git a/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/how_to_connect.md b/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/how_to_connect.md
new file mode 100644
index 0000000..894e053
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/how_to_connect.md
@@ -0,0 +1,26 @@
+*Подключение к Alfa API / Как подключить*
+
+`POST` `B2B` `B2C` `H2H`
+
+# Как подключить
+
+> ### Внимание
+> Если вы ещё не являетесь клиентом Альфа-Банка, то для подключения к Alfa API вам необходимо открыть [счёт](https://alfabank.ru/sme/quick/docstariffs/), оформить [расчётно-кассовое обслуживание](https://alfabank.ru/sme/) и подключить [Альфа-Бизнес](https://alfabank.ru/corporate/rko/internet-bank/#form).
+
+1. **Подпишите договор**
+ [Подпишите договор](https://developers.alfabank.ru/products/alfa-api/documentation/articles/connection/articles/onboarding/onboarding).
+
+ Комиссия за подключение и использование не взимается. Вопросы по заключению договора можно направлять на почту [alfa_api@alfabank.ru](https://developers.alfabank.rumailto:alfa_api@alfabank.ru).
+
+2. **Проверьте тестовую интеграцию**
+ Получите тестовые учётные данные и настройте тестовую интеграцию [на Портале разработчика](https://developers.alfabank.ru/products/alfa-api/documentation/articles/selfservice/articles/test/test), реализуйте и протестируйте аутентификацию в Alfa ID и вызов методов Alfa API [в песочнице](https://developers.alfabank.ru/products/alfa-api/documentation/articles/sandbox/sandbox).
+
+3. **Подготовьтесь к промышленной интеграции**
+ Создайте интеграцию в проме, выпустите TLS-сертификат и `client_secret` . Подробнее [в инструкции](https://developers.alfabank.ru/products/alfa-api/documentation/articles/selfservice/articles/prod/prod).
+
+4. **Используйте Alfa API**
+
+Если вы ещё не являетесь клиентом Альфа-Банка, то для подключения к Alfa API вам необходимо открыть [счёт](https://alfabank.ru/sme/quick/docstariffs/), оформить [расчётно-кассовое обслуживание](https://alfabank.ru/sme/) и подключить [Альфа-Бизнес](https://alfabank.ru/corporate/rko/internet-bank/#form).
+
+---
+[← Сертификаты для Linux](https://developers.alfabank.ru/products/alfa-api/documentation/articles/specification/articles/certificate/articles/linux/linux) [← Подписание договора](https://developers.alfabank.ru/products/alfa-api/documentation/articles/connection/articles/onboarding/onboarding)
diff --git a/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/tls-cert.md b/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/tls-cert.md
new file mode 100644
index 0000000..ab3e290
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Подключение_к_Alfa_API/tls-cert.md
@@ -0,0 +1,154 @@
+# TLS-сертификат
+
+`B2B` `B2C` `H2H`
+
+Взаимодействие между вами и Банком реализовано с использованием двухстороннего TLS-соединения (поддерживаемая версия TLS 1.2), для которого необходимо выпустить сертификат.
+
+---
+
+## Инструкция по выпуску сертификата
+
+Для выпуска сертификата необходимо сгенерировать закрытый ключ и запрос на сертификат в OpenSSL, получить выпущенный сертификат и установить в своей системе:
+
+### 1. Используйте готовый файл конфигурации
+
+Воспользуйтесь заранее подготовленным конфигурационным файлом: [openssl_INNLE.cnf](/assets/developers-portal.docs.alfa-api/articles/connection/articles/tls/files/openssl_INNLE.cnf).
+
+> **Внимание**
+> Данный файл уже содержит все необходимые атрибуты и не требует внесения изменений. Все остальные параметры будут введены вручную через терминал в процессе генерации закрытого ключа и запроса на сертификат.
+
+> **Важно**
+> Если возникает ошибка `object identifier routines:OBJ_create:oid exists`, необходимо закомментировать строку с объявлением этого OID в начале файла: `INNLE=1.2.643.100.4`.
+
+### 2. Сгенерируйте закрытый ключ
+
+1. Откройте терминал и перейдите в папку с файлом. Если это «Загрузки»:
+ `cd ~/Downloads`
+2. Убедитесь, что файл на месте командой `ls`.
+3. Сгенерируйте закрытый ключ:
+ `openssl genrsa -des3 -out Company.key 2048`
+4. Задайте пароль для ключа (**PEM pass phrase**) и запомните его.
+5. В папке появится файл `Company.key`.
+
+> **Рекомендация для Mac OS**
+> Введите дважды пароль от вашего Mac OS, когда терминал запросит подтверждение действий.
+
+### 3. Сгенерируйте запрос на сертификат (CSR)
+
+1. Введите команду:
+ `openssl req -utf8 -config openssl_INNLE.cnf -key Company.key -new -sha256 -out Company.csr`
+2. Атрибут `CLIENT_ID`, а также поля `An optional company name` и `A challenge password` являются опциональными (можно оставить пустыми).
+3. Введите данные организации (название, ФИО, ИНН), когда терминал их запросит.
+
+> **Рекомендации для заполнения полей**
+> Поля `OrganizationName` и `CommonName` можно заполнять транслитом или кириллицей (UTF-8).
+> **ИНН:** строго 10 цифр для ЮЛ и 12 цифр для ИП (без пробелов).
+> Поля `CountryName` и `INNLE` формируют имя профиля в LDAP и должны быть точными.
+
+### 4. Проверьте атрибуты в subject
+
+Проверьте созданный запрос командой:
+`openssl req -config openssl_INNLE.cnf -noout -text -in Company.csr`
+
+**Пример корректного ответа:**
+
+```text
+Subject: C=RU, L=Moscow, O=Company Name, CN=Ivanov Ivan Ivanovich/emailAddress=example@company.ru/INNLE=01234567890/CLIENT_ID=b95e04ed-91fe-430a-a101-894f06f3ab2a
+```
+
+### 5. Отправьте запрос в Банк
+
+Отправьте файл `Company.csr` на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru).
+
+- **Тема:** «Запрос на сертификат».
+- **Отправитель:** почта, указанная в Договоре.
+- **Имя файла:** название организации на латинице.
+- **В письме:** укажите e-mail для уведомлений об истечении срока сертификата.
+
+> **Важно!** Никому и никогда не передавайте файл закрытого ключа (`.key`).
+
+### 6. Получите сертификат
+
+Банк пришлет сертификат с адреса `alfa_api@alfabank.ru`.
+
+- **Срок действия:** 375 дней. По истечении нужно выпустить новый.
+
+### 7. Сборка файла контейнера pfx
+
+Для установки в систему соберите контейнер командой:
+`openssl pkcs12 -export -out Company.pfx -inkey Company.key -in Company.cer -certfile keys\root_apica_2022.cer -certfile keys\sub_root_apica_2022.cer`
+
+### 8. Действия при компрометации
+
+Если закрытый ключ был украден или утерян, немедленно напишите на [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru) для отзыва и перевыпуска.
+
+---
+
+## Требования к сертификату
+
+### Global Subject (Обязательные поля)
+
+| Атрибут | Значение |
+| :------------------- | :--------------------------------- |
+| **CountryName** | Код страны (ISO). Для России: `RU` |
+| **OrganizationName** | Название организации |
+| **CommonName** | ФИО представителя организации |
+| **EmailAddress** | Служебный адрес для связи |
+
+### Variable Subject (Зависит от формы собственности)
+
+| Атрибут | Значение |
+| :------------------------ | :------------------------------------ |
+| Для ЮЛ в России | `INNLE = 1.2.643.100.4` |
+| Для иностранных партнёров | `FOREIGNID = 1.3.6.1.4.1.16745.100.1` |
+| Идентификатор сервиса | `CLIENT_ID = 1.3.6.1.4.1.16745.100.2` |
+
+---
+
+## Настройка UTF-8 для кириллицы
+
+### Windows
+
+1. **Панель управления** > **Часы и регион** > **Регион**.
+2. Вкладка **Дополнительно** > **Изменить язык системы**.
+3. Включите чекбокс: «Бета-версия: Использовать Юникод (UTF-8) для поддержки языка во всем мире».
+4. Перезагрузите ПК.
+
+### MacOS
+
+1. Откройте **Терминал**.
+2. В меню: **Terminal** > **Настройки**.
+3. Вкладка **Кодировки**: убедитесь, что выбрана «Unicode (UTF-8)».
+
+---
+
+## Использование сертификата
+
+Использование TLS-сертификата обязательно для установки mTLS-соединения. Пример запроса через **cURL**:
+
+```bash
+curl -X GET https://baas.alfabank.ru/api/endpoint \
+ -v --cert Company.cer \
+ --key Company.key \
+ -H 'Accept: application/json' \
+ -H 'Authorization: Bearer {access-token}' \
+ -H 'Content-Type: application/json'
+```
+
+---
+
+## Повторный выпуск сертификата
+
+За **1 месяц** до истечения срока вам придет уведомление. Необходимо сформировать новый запрос по инструкции выше.
+
+> **Внимание**
+> При перевыпуске рекомендуем:
+>
+> - Установить защиту на удаление закрытого ключа.
+> - Перезаписать старый закрытый ключ на новый.
+
+_В случае утери сертификата или несвоевременного обновления, ответственность за простой API возлагается на сторону клиента._
+
+---
+
+← [Client ID](/products/alfa-api/documentation/articles/connection/articles/clientid/clientid) | [Client secret](/products/alfa-api/documentation/articles/connection/articles/clientsecret/clientsecret) →
diff --git a/_docs/alfabank/payin_and_kyc/Портал_разработчика/access_rights.md b/_docs/alfabank/payin_and_kyc/Портал_разработчика/access_rights.md
new file mode 100644
index 0000000..324e802
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Портал_разработчика/access_rights.md
@@ -0,0 +1,57 @@
+# Права доступа
+
+По умолчанию доступ к Порталу разработчика имеет только руководитель вашей организации.
+
+Для предоставления доступа к Порталу разработчика другим пользователям руководителю необходимо в **Альфа-Бизнес** создать роль с правами на управление настройками Alfa API и присвоить её пользователю.
+
+> **Внимание**
+> В случае если у вас ИП, права разработчика можно назначить:
+>
+> - от имени самого индивидуального предпринимателя с ролью «Руководитель»;
+> - от имени любого другого сотрудника ИП с ролью «Руководитель». В таком случае потребуется подтверждение назначения от владельца ИП. Подробнее в инструкции ниже.
+
+---
+
+## Инструкция по настройке прав
+
+### Шаг 1. Перейдите в раздел «Пользователи и роли»
+
+1. На главном экране Альфа-Бизнес перейдите в настройки компании.
+2. В разделе **Моя компания** выберите карточку **Пользователи и роли**.
+
+### Шаг 2. Создайте новую роль
+
+> **Внимание:** Если ранее вы уже создавали роль с правами на управление Alfa API, этот шаг можно пропустить.
+
+1. Нажмите **Создать роль**.
+2. Укажите название роли.
+3. Настройте права: новую роль рекомендуется создавать на основании прав руководителя, сбросив лишнее.
+4. Нажмите **Снять все**, чтобы сбросить текущие права.
+5. В разделе **Обслуживание бизнеса** выберите **Alfa API** и укажите необходимые полномочия.
+6. При необходимости добавьте права из других разделов.
+7. Нажмите **Создать роль** для сохранения.
+
+### Шаг 3. Назначьте роль разработчику
+
+> **Примечание:** Если пользователь еще не подключен к компании, нажмите «Подключить пользователя», заполните данные и выберите созданную роль.
+
+1. В разделе **Пользователи** нажмите на три точки справа от нужного сотрудника.
+2. Выберите **Сменить роль**.
+3. В открывшейся форме выберите созданную роль и нажмите **Сменить**.
+4. Подтвердите смену роли кодом из СМС.
+ - _Для ИП:_ Если роль назначает не сам владелец, будет создано заявление, которое владелец должен подписать в своем личном кабинете.
+5. После успешного назначения статус пользователя изменится на **Подключён**.
+
+---
+
+## Требования к полномочиям для корректной авторизации
+
+Для корректной работы H2H-интеграций ключ доступа (`access_token` / `API Key`) должен получать пользователь, у которого есть полномочия на использование выбранных сервисов и продуктов.
+
+### Особенности способов авторизации:
+
+- **При использовании ACF H2H:** Авторизацию в Alfa ID должен проходить пользователь, у которого в Альфа-Бизнес настроены соответствующие полномочия на использование выбранных `scopes`. Если вы хотите использовать учетные данные разработчика, руководитель должен выдать ему соответствующие права в разделе «Пользователи и роли».
+- **При использовании авторизации по API Key:** Выпускать ключ должен пользователь, имеющий права на выбранные продукты. Если у пользователя нет прав (например, на просмотр выписок), то выпущенный им `API Key` не будет работать для этого сервиса.
+
+**Пример:**
+Если вы выдали разработчику права на _редактирование интеграций_, но не дали прав на _просмотр выписки_, то созданный им `API Key` для сервиса выписок (`transactions`) работать не будет. Ключ должен выпускать либо руководитель, либо сотрудник с полным доступом к нужным данным.
diff --git a/_docs/alfabank/payin_and_kyc/Портал_разработчика/api_key_managment.md b/_docs/alfabank/payin_and_kyc/Портал_разработчика/api_key_managment.md
new file mode 100644
index 0000000..5db627a
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Портал_разработчика/api_key_managment.md
@@ -0,0 +1,81 @@
+# Управление API Key
+
+Портал разработчика позволяет управлять `API Key` – ключами доступа для упрощённой авторизации запросов в H2H-интеграциях. Подробнее о ключе и доступных по нему сервисах [на странице API Key](/products/alfa-api/documentation/articles/api-key/api-key).
+
+Для настройки авторизации с помощью `API Key` вам необходимо выпустить ключ для H2H-интеграции, скопировать его и вручную добавить в свои рабочие инструменты. Значение ключа передаётся в заголовке: `Authorization: ApiKey {API Key}`:
+
+### Пример запроса с использованием API Key
+
+```bash
+curl -X GET https://baas.alfabank.ru/api/endpoint \
+ -H 'Authorization: ApiKey akytnps_YfSpCMb0_Uat5NX4p3c7A50hf27Qapk7nXYQ81h659tSwKml87xA5IhpBXXnpKSVypV60dI2l_2918090335' \
+ -H 'Accept: application/json' \
+ -H 'Content-Type: application/json'
+```
+
+---
+
+## Выпуск API Key для прома
+
+Перед выпуском `API Key` для промышленной H2H-интеграции рекомендуется сначала пройти описанные ниже шаги для тестовой H2H-интеграции в рабочей среде «Песочница» и протестировать ключ, и только после этого приступать к выпуску ключа для промышленной H2H-интеграции.
+
+> **Важно**
+> Выпускать `API Key` необходимо пользователю, у которого в Альфа-Бизнес настроены соответствующие полномочия на использование выбранных при выпуске ключа продуктов и сервисов. Если у пользователя отсутствуют эти полномочия, руководителю организации необходимо выдать их пользователю в Альфа-Бизнес (в разделе **Профиль** – **Пользователи и роли**) или выпустить ключ самому.
+
+### Шаг 1. Нажмите "Выпустить API Key"
+
+Нажмите **Выпустить ключ** в правой части карточки H2H-интеграции.
+
+
+### Шаг 2. Заполните данные для API Key
+
+Укажите IP-адреса, с которых будут отправляться запросы с использованием `API Key`. Отправка запросов с использованием `API Key` будет доступна только с указанных IP-адресов.
+
+Для одного API Key вы можете указать не более 20 IP-адресов.
+
+
+Укажите сервисы и продукты, доступ к которым вы хотите получать с помощью `API Key`. Вам будут доступны сервисы и продукты из набора `scopes` редактируемой H2H-интеграции, доступ к которым возможен с помощью `API Key`.
+
+Далее проверьте и сохраните внесённые изменения.
+
+### Шаг 3. Скопируйте и сохраните API Key
+
+После завершения выпуска `API Key` вы получите уведомление. Скопируйте его и вручную добавьте в ваши рабочие инструменты так, чтобы при отправке запросов по H2H-интеграции в запросах передавался заголовок `Authorization: ApiKey {API Key}`.
+
+
+**Срок действия:** Срок действия `API Key` неограничен, но ключ будет автоматически отозван, если с момента последнего запроса прошло более **30 дней**.
+
+В случае потери данных либо компрометации ключа вы можете перевыпустить его. Также вы всегда можете отозвать `API Key`, если больше не хотите использовать упрощённый способ авторизации.
+
+---
+
+## Перевыпуск API Key
+
+### Шаг 1. Нажмите "Перевыпустить API Key"
+
+Нажмите на три точки в правом верхнем углу карточки H2H-интеграции и выберите **Перевыпустить API Key**.
+
+
+### Шаг 2. Отредактируйте данные для API Key
+
+При необходимости отредактируйте данные для `API Key`.
+
+Далее проверьте внесённые изменения и нажмите «Перевыпустить».
+
+### Шаг 3. Скопируйте и сохраните API Key
+
+После перевыпуска `API Key` вы получите уведомление. Вам будет необходимо скопировать его и заменить в ваших рабочих инструментах. При перевыпуске `API Key` старый ключ, привязанный к этой интеграции, будет автоматически отозван.
+
+Срок действия `API Key` неограничен, но ключ будет автоматически отозван, если с момента последнего запроса прошло более 30 дней.
+
+
+---
+
+## Отзыв API Key
+
+Для отзыва ключа доступа нажмите на три точки в правом верхнем углу карточки интеграции, выберите **Отозвать API Key** и подтвердите свои действия.
+
+
+
+
+В результате отзыва ключа упрощённая авторизация будет недоступна. При необходимости вы всегда можете выпустить новый `API Key`.
diff --git a/_docs/alfabank/payin_and_kyc/Портал_разработчика/creating_prod_integration.md b/_docs/alfabank/payin_and_kyc/Портал_разработчика/creating_prod_integration.md
new file mode 100644
index 0000000..81343ca
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Портал_разработчика/creating_prod_integration.md
@@ -0,0 +1,85 @@
+# Создание интеграции в проме
+
+**Метки:** `β-ТЕСТ` `B2B` `B2C` `H2H`
+
+После успешного тестирования продуктов и сервисов в песочнице вам станет доступно создание интеграций в проме.
+
+## Создание промышленной интеграции
+
+### Шаг 1. Нажмите «Создать интеграцию»
+
+> **Внимание**
+> Одновременно у вас может быть не более 5 промышленных интеграций.
+
+Нажмите **Создать интеграцию** в степпере или в списке интеграций, находясь в рабочей среде «Пром» (для выбора рабочей среды используйте переключатель в правом верхнем углу Портала разработчика).
+
+**Важно!** В случае если вы работаете в режиме группы компаний, перед созданием новой интеграции необходимо перейти в профиль пользователя и выбрать компанию, для которой вы хотите создать интеграцию.
+
+
+
+---
+
+### Шаг 2. Выберите тип интеграции
+
+
+
+---
+
+### Шаг 3. Заполните основную информацию
+
+Укажите название интеграции (рекомендуется использовать то же название, что и у соответствующей тестовой интеграции), `redirect_uri` и тип клиентов (выбор типа клиентов доступен только для партнёрских интеграций).
+
+В одной интеграции вы можете указать не более 20 `redirect_uri`.
+
+
+
+---
+
+### Шаг 4. Выберите сервисы и продукты
+
+> **Важно**
+> Вам будут доступны сервисы и продукты, по которым при тестировании было выполнено не менее одного успешного запроса в песочнице.
+
+
+
+---
+
+### Шаг 5. Завершите создание промышленной интеграции
+
+Проверьте параметры интеграции перед её сохранением.
+
+Для создания интеграции потребуется некоторое время. После завершения создания промышленной интеграции вы получите уведомление:
+
+
+
+---
+
+### Шаг 6. Разблокируйте промышленную интеграцию
+
+После создания интеграция отображается в статусе **«Заблокирована»**.
+
+Для разблокирования интеграции создайте запрос на TLS-сертификат и отправьте его на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru). Подробнее [на странице TLS-сертификат](/products/alfa-api/documentation/articles/connection/articles/tls/tls).
+
+Если вы уже выпускали сертификат, повторно выпускать его не нужно. Вместо этого необходимо сообщить о готовности к промышленной интеграции на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru). После этого интеграция будет разблокирована и перейдёт в статус **«Новая»**.
+
+---
+
+### Шаг 7. Активируйте промышленную интеграцию
+
+Чтобы активировать интеграцию, необходимо получить `client_secret`. Для этого нажмите на иконку в карточке интеграции:
+
+
+
+Скопируйте `client_secret` и добавьте его в ваши рабочие инструменты. Получить его можно также с помощью [метода](/products/alfa-api/documentation/articles/connection/articles/clientsecret/clientsecret).
+
+
+
+После того как вы получите `client_secret`, интеграция перейдет в статус **«Активна»** и будет доступна к использованию в промышленной среде.
+
+---
+
+## Подключение новых продуктов к текущей промышленной интеграции
+
+Для подключения новых продуктов и сервисов к промышленной интеграции сначала добавьте новые `scopes` в режиме редактирования тестовой интеграции и протестируйте их в песочнице.
+
+После успешного тестирования отредактируйте промышленную интеграцию, добавив новые `scopes`. После этого новые продукты или сервисы будут доступны в промышленной среде.
diff --git a/_docs/alfabank/payin_and_kyc/Портал_разработчика/testing.md b/_docs/alfabank/payin_and_kyc/Портал_разработчика/testing.md
new file mode 100644
index 0000000..b208df8
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Портал_разработчика/testing.md
@@ -0,0 +1,55 @@
+# Тестирование
+
+**Метки:** `β-ТЕСТ` `B2B` `B2C` `H2H`
+
+Перед созданием первой промышленной интеграции или подключением новых продуктов и сервисов к текущей промышленной интеграции необходимо проверить работу интеграций в песочнице.
+
+При входе на Портал разработчика вы увидите две тестовые интеграции: одна для тестирования партнёрской интеграции, другая — для тестирования H2H-интеграции. В зависимости от ваших целей вы редактируете нужную интеграцию в рабочей среде «Песочница» и тестируете её.
+
+---
+
+### Шаг 1. Настройте тестовую интеграцию
+
+Для редактирования тестовой интеграции нажмите на три точки в правом верхнем углу карточки и выберите **Редактировать интеграцию**.
+
+
+
+1. **Вкладка «Информация»**:
+ - При необходимости отредактируйте название интеграции.
+ - Укажите необходимые `redirect_uri` для переадресации пользователя после авторизации через Alfa ID.
+ - _Пример redirect_uri:_ [https://romashka.ru](https://romashka.ru).
+ - **Важно:** В одной интеграции вы можете указать не более 20 `redirect_uri`.
+
+
+
+2. **Вкладка «Scopes»**:
+ - Выберите продукты и сервисы, которые вы хотите подключить в Alfa API.
+ - Если вы не нашли нужные `scopes`, напишите на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru).
+
+
+
+3. **Сохранение**:
+ - После завершения редактирования тестовой интеграции необходимо сохранить внесённые изменения.
+
+
+
+---
+
+### Шаг 2. Протестируйте интеграцию
+
+Выполните запросы по выбранным `scopes` в тестовой среде в соответствии с [инструкцией по тестированию](/products/alfa-api/documentation/articles/sandbox/sandbox), используя учётные данные тестовой интеграции.
+
+После успешного тестирования в песочнице вам станет доступно создание промышленной интеграции со `scopes`, по которым было выполнено не менее одного успешного запроса в песочнице.
+
+---
+
+### Дополнительная информация
+
+Вы можете использовать текущие интеграции в песочнице для тестирования новых сервисов и продуктов, добавляя новые `scopes` в режиме редактирования тестовой интеграции. После успешного тестирования в песочнице вы сможете добавить новые `scopes` в промышленную интеграцию и использовать их в своих сервисах.
+
+---
+
+**Навигация:**
+
+- [← Права доступа](/products/alfa-api/documentation/articles/selfservice/articles/access-rights/access-rights)
+- [Создание интеграции в проме →](/products/alfa-api/documentation/articles/selfservice/articles/prod/prod)
diff --git a/_docs/alfabank/payin_and_kyc/Портал_разработчика/what_is_for.md b/_docs/alfabank/payin_and_kyc/Портал_разработчика/what_is_for.md
new file mode 100644
index 0000000..aa5d1b1
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Портал_разработчика/what_is_for.md
@@ -0,0 +1,64 @@
+# Для чего нужен Портал разработчика
+
+**Портал разработчика** предназначен для управления интеграциями Alfa API. С помощью него вы можете создавать новые и редактировать текущие интеграции, подключать новые продукты и сервисы, а также активировать упрощённую авторизацию запросов с помощью API Key.
+
+Портал разработчика станет доступен после того, как вы [подключите Alfa API](/products/alfa-api/documentation/articles/connection/articles/onboarding/onboarding).
+
+> **Внимание**
+> Для работы с порталом вашему разработчику необходимо получить права на управление интеграциями Alfa API. Как их назначить, описано [в статье Права доступа](/products/alfa-api/documentation/articles/selfservice/articles/access-rights/access-rights).
+
+---
+
+## Запуск первой промышленной интеграции
+
+1. **Войдите на Портал разработчика**
+ Вход осуществляется через Портал документации по кнопке **Войти** и возможен только под учётной записью сотрудника организации, подключённой к Alfa API.
+ 
+
+2. **Проверьте тестовую интеграцию**
+ [Как настроить интеграцию в песочнице и протестировать её](/products/alfa-api/documentation/articles/selfservice/articles/test/test)
+
+3. **Создайте интеграцию в проме**
+ [Как создать промышленную интеграцию](/products/alfa-api/documentation/articles/selfservice/articles/prod/prod)
+
+4. **Выпустите промышленный TLS-сертификат**
+ [Как выпустить TLS-сертификат](/products/alfa-api/documentation/articles/connection/articles/tls/tls)
+
+5. **Используйте промышленную интеграцию в своих сервисах**
+
+При необходимости вы можете подключать новые продукты и сервисы к текущей интеграции и создавать новые интеграции на Портале разработчика. Также вы можете настроить упрощённую авторизацию по H2H-интеграциям с помощью [API Key](/products/alfa-api/documentation/articles/selfservice/articles/api-key/api-key).
+
+---
+
+## Выбор рабочей среды
+
+На Портале разработчика предусмотрены две рабочие среды:
+
+- **«Песочница»** — для редактирования тестовых интеграций.
+- **«Пром»** — для управления промышленными интеграциями.
+
+Выбор рабочей среды осуществляется с помощью переключателя в правом верхнем углу портала.
+
+
+
+---
+
+## Работа с группой компаний
+
+Пользователи с доступом к интеграциям нескольких компаний могут работать в двух режимах: группы компаний или одной выбранной компании. Это позволяет работать с интеграциями всех доступных компаний в едином окне.
+
+### Как переключить режим:
+
+1. Перейдите в профиль пользователя в правом верхнем углу Портала разработчика.
+ 
+
+2. Выберите режим отображения компаний:
+ - Карточка **Все компании** — чтобы работать с интеграциями всех компаний одновременно. В этом режиме доступна единая таблица со всеми интеграциями.
+ - Карточка **конкретной компании** — чтобы работать только с интеграциями выбранной организации.
+
+
+
+
+---
+
+**Далее:** [Права доступа](/products/alfa-api/documentation/articles/selfservice/articles/access-rights/access-rights) | [Client secret](/products/alfa-api/documentation/articles/connection/articles/clientsecret/clientsecret)
diff --git a/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/encription/json-ghost.md b/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/encription/json-ghost.md
new file mode 100644
index 0000000..14cf4f8
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/encription/json-ghost.md
@@ -0,0 +1,109 @@
+# Шифрование JSON ГОСТ-сертификатом
+
+Способ защиты данных определяется настройками интеграции. Для уточнения информации по настройке вашей интеграции или запроса для установления нужных настроек необходимо написать на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru). При запросе установления настроек необходимо сообщить способ защиты (подпись или подпись с шифрованием), а также алгоритм (RSA или ГОСТ).
+
+> [!IMPORTANT]
+> **Внимание**
+> Для шифрования и подписания сообщения необходимо предварительно загрузить сертификат, используя следующий [метод](/products/alfa-api/documentation/articles/signature-encryption/articles/managing-certificates/articles/post-certificates/post-certificates). Если вы уже загружали сертификат, используя данный метод — повторно выполнять эту операцию не нужно.
+
+---
+
+## Подпись и шифрование JSON
+
+### 1. Подготовить сообщение в формате JSON
+
+**Пример сообщения:**
+
+```json
+{
+ "sub": "1234567890",
+ "name": "John Doe",
+ "admin": true,
+ "iat": 1657882689,
+ "exp": 1657886289
+}
+```
+
+### 2. Подписать запрос
+
+Тело запроса сформировать алгоритмом **ГОСТ Р 34.10-2012 256 бит** в виде компактной сериализации в соответствии с [JSON Web Signature](https://www.rfc-editor.org/rfc/rfc7515#section-3.1) и подписать тело запроса закрытым ключом сертификата.
+
+**Формат JWS:**
+`BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload) || '.' || BASE64URL(JWS Signature)`
+
+**Структура тела запроса (Header):**
+
+- `"alg": "GOST3410_2012_256"`
+- `"typ": "JWT"`
+- `"cty": "JWS"`
+- `"kid": "серийный номер сертификата"`
+- `"b64": true`
+
+**Пример JWS:**
+
+```text
+ewogICJhbGciIDogIkdPU1QzNDEwXzIwMTJfMjU2IiwKICAidHlwIiA6ICJKV1QiLAogICJjdHkiIDogIkpXUyIsCiAgImtpZCIgOiAiNmQzOGI4ZTAwNjFiMGY5YTk0ZjEwNGJlNTdlNzdhYTE4IiwKICAiYjY0IiA6IHRydWUKfQ.eyJkZWJpdFR1cm5vdmVyIjp7ImFtb3VudCI6MCwiY3VycmVuY3lOYW1lIjoiUlVSIn19.ByCkNenTTtZQrnZplNOo9WyqPTxb6vFq0iExNHpuPCV6LUeXDFTe8tNBZCy1WvpdUCQBrKK447s3NJCC5hNLhA
+```
+
+Для тестовой проверки можно использовать [https://token.dev/](https://token.dev/).
+
+### 3. Зашифровать запрос
+
+Зашифруйте полученный на шаге два JWS-контейнер алгоритмом **ГОСТ 34.12.2015** (блочный шифр с длиной блока n = 64 бит «Магма») открытым ключом сертификата Альфа-Банка, чтобы получился **PKCS7-контейнер**, и передайте его в теле запроса. Для получения сертификата напишите на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru).
+
+**Информация об используемых стандартах ТК 26:**
+
+- **Алгоритм экспорта ключей KExp15** на основе симметричного блочного шифра "Магма". OID: `1.2.643.7.1.1.7.1.1`
+- **Алгоритм шифрования послания "Магма"** в режиме гаммирования CTR с механизмом преобразования ключа ACPKM с вычислением имитовставки. OID: `1.2.643.7.1.1.5.1.2`
+
+**Пример PKCS7:**
+
+```text
+MIITdQYJKoZIhvcNAQcDoIITZjCCE2ICAQAxggIAMIIB/AIBADCCASIwggELMRgwFgYFKoUDZAESDTEwMjc3MDAwNjczMjgxGjAYBggqhQMDgQMBARIMMDA3NzI4MTY4OTcxMQswCQYDVQQGEwJSVTEYMBYGA1UECAwPNzcg0JzQvtGB0LrQstCwMRUwEwYDVQQHDAzQnNC+0YHQutCy0LAxKjAoBgNVBAkMIdCj0LsuINCa0LDQu9Cw0L3Rh9C10LLRgdC60LDRjyAyNzEPMA0GA1UECwwG0KPQmNCRMSEwHwYDVQQKDBjQkNCeINCQ0JvQrNCk0JAt0JHQkNCd0JoxNTAzBgNVBAMMLNCi0JXQodCiINCj0KYgMi4wINCQ0J4gItCQ0JvQrNCk0JAt0JHQkNCd0JoiAhEG04uOAGGw+alPEEvlfneqGDAXBgkqhQMHAQEHAQEwCgYIKoUDBwEBBgEEgbcwgbQEKLyfbBL4H33ZmcqKiO1B85UCDlnD2qk05vlU+4dEg34KWZLsLQv05MYwZjAfBggqhQMHAQEBATATBgcqhQMCAiQABggqhQMHAQECAgNDAARAMyQte/ak3j94OBDlA+o+CC/y4VldsMsFTA0z9zqXFR5LFLmyVop7VDJkzeXwk/BM+YIXwbWG0GnbebS3ZjuP/wQgKo8O42NksPcsAGvRWKaYYtk3RQfL9zrMZwdBtDroNjIwghE8BgkqhkiG9w0BBwEwGwYJKoUDBwEBBQECMA4EDJzOZEVIxIU3bLczkICCERA02+pMp1hYBL6KVvGmWD7NOqN0kOF5lrhPg+4Jwk2hbQiod2WFOmK0jOf3wUwF549eNMCRP5Clkz61K9b4p8CEFuodPJ65fetCUi7t1+EmSNwzBKRNzB8gNM4M12KIIJbCGpDAxyWHWe98ZgqDgCe7d/u8Lh5lqKrfrXrwHwqi+Ivdqe5ubpU37jZr1QvoWdyLocdBBoz3musKUDfuwM+tFoEydK9gK86knMXsD7ZJ3LJngy4ztGGdjBRjbF+Pg+RmR1UhCnDLEtCiJnMNN75735pXpFAgLVcUo2oexLRGh8Jw3Uh9+UthY2tRt11/e6iyrkGPmrMlcHd1poj/XC0bsIP6+kNwHMxITO2lkEKIL3B3CRZlNKMPx4dfnLt4u+cMCm+qyLqtXilxSDZp0yETzHy76ee+UdXr0kb3eGPcBidHPNpeb2EqjAE8UCuwmVfOpznl4kioEUNfCcrnPZDqHQTpNs35lQlQocyWPQOugP0OB6BC5/9kXKf5VPHcIMLeWzvor3cuac+nBaRNB4PzvwiAdBvwKp4asbvZak/MPf8I23gpdXGVtMajbUzJUlGd6Bz+G6Kz4vpUUW8IoVwXL/vPU+3N1jKbNyGvrPFrdaIoUJHu+9B92/LlmOpcxF5GssrM9MsC9e6cEl4Cq82QQn3w7AJCdHMDzgANk04cmNKDTl5DPL2YNjcmirXaVXKzO7W4Oa4PIyKAaR811tT9kKAxsJvAWODjM1wdDMSCUlK1C1DHfJdZneXY61sbbpYQoHGuC/Uo+5Z1xdLTYjjVMY5mJ/444zdWGY0Aa2BiS+vd28hx/uSlg0T93eLpJcuWvT5B5aDuBrSFPpMRCeC/VCpwfSbAAekVHGjMb1B/ABLLgbPGnTLH5RCJOUiImihn7LPhlGSop705d9TSwvItP4XO3xebqd0vpr0YvTXy8VRTzSI8UGAs+lzoGbDnqYdPYND5XR+P0vpPA3m5Yd2kBCJJoU9Z8Clzw5+Q/6X3bsa/aLmT4V3L5TZWX169gIip77EqtLUPEGEFHVUE+rmBWKcx6IBDazEsxJ4OAHkRZq7Ls6k5g3P30fwhHmXaTWGTIjRr78LHFPN15MbTthakEoAD4sMnXCmOnZtSskGyNY1U1C1Al0REql4U2dpUDebNcmTqAqwv6rPLCCA69brcXQ8ZFbyuWq39Fz4oN6OulVNNtQ6lhuTOyPCRiEIRWdW5bIROuWs1BD9M/xZOzCIJxuA/t5xusCk1BYx1D4e6cqiwpbPSAJZMDnWlNu1WT1QPEk55ihbTYGwfUmP4SUIJL8DWJvZgs7aD1ZZq5LxjZoghem8TlpwB+dlZ96geD1T6qez0DFSSL6NJkjFGkH1WYYZcTtomUrwg4yqjDlWbZOzSPAWcKwd1vkEruViOOH892FbxRUMC9EXRg4fTaRIfcgtfEO3fGAeB6fJv1pZMdNdLUOOHViuAZrhNDgBnWblqlIbl6HMmiWCoW7JryN2WXl/L1RybXO9QALAaNCmyN0zk+baqXz2ipne3CFkohucv1T++iC+SwQ+iNoxb3DfkRdBQfXPbdY75od4+g0YPN68XW3nAze1NT8kZw7Z5/bs+ZStilJTCfKx9VZaeHF+N7k4J9ll683UYp64gtxVcNx/1MQYkf6hgesh0YRtcf35HBUAilaF+1EStQHdN6tlfaB9rNwAehoHIegset/NeWBekVpo3DKLKX0qf3+J1qBr2q3nYKdApYJwgLRCtR46b865tu8puZAPLTqCk0gp0ay52kHsYxGPAeTyQsygMCQxGjcHsHJEJCEa+NvPNkBsYfick9PKe4gFJPyDiaM4yPPk6YE755Ow8OByHbSE6c4scL1CtinWIQWZJMdtN+77au7nyDwfVvIrQehnT0gWAiTZJcwsJjxpnhdhAsGkm7j1VeT4yCAAX0OvV55LVmGVVBINAJObCsybLuKA0MIPeLH4BPa/aMBGM/XigYPFVbW01PQheuWMTkGF1ru2gc2aqGKbiFY2XSbJ3u14fPUiTpLzV9bdyi15XDpVe9T4b6ioEAHzOjsTlMpwvQZOgyKw8KAyiJ1H+S8DzNlTrbzmpJyVYw8iiLceXepHMToFLnCnmey244g2dOKmMKHZT+xyMjSgiKQ8bNI7hIPhymjeQxxmYfwmfmXxSXX5bfjDuKo7Upt0GnbfKRUGKpJnm0bsK084Lxxy4XBrFQt0aNPTfAyhEylqhkctdpteIMM7gdWwQZrLhrKxJdFaU5HK0aFaIMfE4ANSC93Grpz31NgWlTKd1ZeTbnbP3vRE9wS6N+i/xI6Vmn0v928h/DPMDoiWkCx11+Ey1fAnR3inBTmVnM3j9+SIuo1tNaX2Xq4zoHXTMr5yaY9pvPPMCYrCLxX8J28bUmqR/cA5b+ot4fWyQDh0ascRk2wB2PptjcjQjxWED4vRWj/2oDNMx1lCuwPmagXAYWbDUql4LyknJUZGjePhP+7mDX6AtTtX+70jltAUlC5orD8L+IDKeRU2y+lCvdV8OfrE892XiFfOvPd6t+Pal0a0ML/Kbp7ZH642L5I73RyTFzAv06UPybwdpvEa8rssicVd3sjI5BJnJ2x3Jkl7QcSUqkk28Werjl0+/5F6C+xlJOgZ2tEX4SyiNxfVGd7dn0jsFzAzrfVqFp5tJ3f6IZ3hG4MetoQS2R3PXfETAoHz4qUE0XJ95OTxY9DCmDXtR5ce/5BC0EaJLnAexxwe+TC/kMjqUZTCKla3hhfZCG0ylGc4u8d6MtijTzkKZNiC9ww5q4T392uzltL4jp/YiHGNSvQMtgfjOeFKtNWHGMWJ/8hjYqTG5jEPWNnYwCNmxCW9Ut7jZPAnKomRiO4+cIEavgKiyiYqTBGHMDV6PZ5SvKOTATr3swLHBzSgqoczp992fWocAD9MSc+CK5oULQs2oduBWFJ5zQRuRGpjxqTjh64m1w0Ci2imHX9AY30ccpNjp/g5znWUexmioupdnZGMchy2RnFNMpflGrTGiyXgqsSSykwCLqB56pF/Qqg1v3Eq0NCWt9VKkFIi27SXfPW/jXTBs/r1EkZu2C8DqaTynjWmlo3L1yTrs1ZyXTDSiuQCzLKPEJoYHVIboZ8za1C6oVEnluh7b4rn5DLAgTgHcU2oZbu2qVePSCZwXj6tz9d74dU8DBbowTn33443YAC04VeSA8A+jsT4YKMdhCK8AkTQSAEtUjBj3Mb++T3XKEVth639oEfZ6mioIcjQ8ePu2|... (длинная строка сокращена)
+```
+
+### 4. Выполнить запрос
+
+- Если добавить заголовки `Content-Type: application/json` + `X-Request-ChannelSecurity: NO` и отправить запрос, то запрос **не будет** расшифрован и подпись запроса не будет проверяться.
+- Если добавить заголовки `Content-Type: application/jose` + `X-Request-ChannelSecurity: ENCRYPTION` и отправить запрос, то запрос **будет** расшифрован и подпись будет проверяться.
+
+Банк дешифрует запрос и проверяет подпись. Если подпись валидна — запрос обрабатывается, если невалидна — Банк определяет запрос как неподлинный и возвращает ошибку. Ошибка также будет подписана и зашифрована. Любые другие комбинации заголовков приведут к ошибке.
+
+---
+
+## Дешифрование и проверка подписи JSON
+
+### 1. Дешифровать ответ
+
+- При заголовках `Accept: application/json` + `X-Response-ChannelSecurity: NO` ответ **не будет** подписан и зашифрован.
+- При заголовках `Accept: application/jose` + `X-Response-ChannelSecurity: ENCRYPTION` ответ (включая ошибки) **будет** подписан и зашифрован.
+
+Полученный ответ будет в виде PKCS7-контейнера. Расшифруйте его с использованием вашего закрытого ключа. Используются те же стандарты ТК 26 (Магма, OID: `1.2.643.7.1.1.7.1.1` и `1.2.643.7.1.1.5.1.2`).
+
+### 2. Обработать дешифрованный ответ
+
+Полученный ответ будет представлен в виде компактной сериализации JWS (три части через точку): `Base64URL(Header)`, `Base64URL(Payload)`, `Base64URL(Signature)`.
+
+**Пример декодированного JWS:**
+
+| Закодированный | Раскодированный |
+| :------------------------- | :------------------------------------------------------------------------------------------------------------------------------ |
+| `ewogICJhbGciIDog...` | **Header:** `{"alg": "GOST3410_2012_256", "typ": "JWT", "cty": "JWS", "kid": "6d38b8e0061b0f9a94f104be57e77aa18", "b64": true}` |
+| `eyJkZWJpdFR1cm5vdmVyI...` | **Payload:** `{"debitTurnover": {"amount": 0, "currencyName": "RUR"}}` |
+
+### 3. Проверить подпись ответа от Банка
+
+Используйте открытый ключ сертификата Банка для проверки подписи. Для получения сертификата напишите на [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru). В поле `kid` заголовка JWS будет указан серийный номер сертификата Банка.
+
+### 4. Обработать ответ в формате JSON
+
+**Пример итогового ответа:**
+
+```json
+{
+ "debitTurnover": {
+ "amount": 0,
+ "currencyName": "RUR"
+ }
+}
+```
diff --git a/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/encription/json-rsa.md b/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/encription/json-rsa.md
new file mode 100644
index 0000000..9b6431a
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/encription/json-rsa.md
@@ -0,0 +1,147 @@
+# Шифрование JSON RSA-сертификатом
+
+**Метки:** `B2B` `B2C` `H2H`
+
+Способ защиты данных определяется настройками интеграции. Для уточнения информации по настройке Вашей интеграции или запроса для установления нужных настроек необходимо написать на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru). При запросе установления настроек необходимо сообщить способ защиты (подпись или подпись с шифрованием), а также алгоритм (RSA или ГОСТ).
+
+> [!IMPORTANT]
+> **Внимание**
+> Для шифрования сообщения необходимо предварительно выпустить сертификат в УЦ Альфа-Банка, используя сервис [«Электронная подпись»](/products/alfa-api/documentation/articles/signature/signature). Если Вы уже выпускали сертификат — повторно выпускать не нужно.
+
+---
+
+## Подписание и шифрование JSON
+
+### 1. Подготовить сообщение в формате JSON
+
+**Пример сообщения:**
+
+```json
+{
+ "sub": "1234567890",
+ "name": "John Doe",
+ "admin": true,
+ "iat": 1657882689,
+ "exp": 1657886289
+}
+```
+
+### 2. Подписать запрос
+
+Тело запроса сформировать алгоритмом **RS256** в виде компактной сериализации в соответствии с [JSON Web Signature](https://www.rfc-editor.org/rfc/rfc7515#section-3.1) и подписать тело запроса закрытым ключом сертификата.
+
+**Формат JWS:**
+`BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload) || '.' || BASE64URL(JWS Signature)`
+
+**Структура тела запроса:**
+
+- **Заголовок (Header):**
+ - `"kid"`: "серийный номер сертификата"
+ - `"typ"`: "JWT"
+ - `"alg"`: "RS256"
+- **JSON-документ (Payload)**
+- **Подпись запроса (Signature)**
+
+**Пример JWS:**
+`eyJhbGciOiJSUzI1NiIsImtpZCI6IjYxMDAwMzYzY2NiNzU5Y2I0NDg2MDc4NjVkMDAwMTAwMDM2M2NjIn0.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTY1Nzg4MjY4OSwiZXhwIjoxNjU3ODg2Mjg5fQ.ApKNzZ9kLMtBY3LzReSHQ7_AyDnzocGo9GTQFRmxTiRS7Lj7a55Kr4ziwZAmmwloF1063JJMOaU0lS947q6_hSct9pxzPdZ9tTmpIDGnQL-ks0oB7zz9vUSUd3G00UZXSYnuhI9BBRXvmmTaue5Y2j5zVZofLdO2dqPWCnsQULyLn_vYf8PeABhnAQ29z1Bq42uxfRFTM35cF40Tp4VBSqXDI1vxfleLusQlOZM-5Sk7O3Vy4Sf-UB03RrRGSBerZjdoMRh7dgEyoYAXS6c4MejCm2vmXKqSd7pu2V2TxOM9UTchkCS16DL-RIJtnfMjznmznU5SoMCpncvs6gRNeQ`
+
+Для тестовой проверки можно использовать [https://token.dev/](https://token.dev/).
+
+### 3. Зашифровать запрос
+
+Преобразуйте полученный JWS-контейнер алгоритмом **RS256** в соответствии с [JSON Web Encryption](https://datatracker.ietf.org/doc/html/rfc7516) и зашифруйте [открытым ключом](/assets/developers-portal.docs.alfa-api/articles/signature-encryption/articles/encryption/articles/json-rsa/files/cert.cer) сертификата.
+
+**Формат JWE:**
+`BASE64URL(UTF8(JWE Protected Header)) || '.' || BASE64URL(JWE Encrypted Key) || '.' || BASE64URL(JWE Initialization Vector) || '.' || BASE64URL(JWE Ciphertext) || '.' || BASE64URL(JWE Authentication Tag)`
+
+**Структура заголовка (Protected Header):**
+
+- `"kid"`: "серийный номер сертификата"
+- `"enc"`: "A256GCM"
+- `"alg"`: "RSA-OAEP-256"
+
+**Пример JWE:**
+`eyJlbmiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.eFcY1Fv_xN6cFDNxnMoxCjEpVTmAjhrHuB2oW1hYapBXE02qOtdKrC3W7FGVjLFlgV3... (урезано для краткости) ...ZfAY-M8w-t9l9gErE1vQFg`
+
+### 4. Выполнить запрос
+
+Необходимо передать специфические HTTP-заголовки:
+
+- **Без шифрования:**
+ `Content-Type: application/json` + `X-Request-ChannelSecurity: NO`
+- **С шифрованием:**
+ `Content-Type: application/jose` + `X-Request-ChannelSecurity: ENCRYPTION`
+
+Банк дешифрует запрос и проверяет подпись. Любые другие комбинации заголовков приведут к ошибке.
+
+---
+
+## Дешифрование и проверка подписи JSON
+
+### 1. Дешифровать ответ
+
+Для получения зашифрованного ответа используйте заголовки:
+`Accept: application/jose` + `X-Response-ChannelSecurity: ENCRYPTION`
+
+Необходимо дешифровать ответ с помощью вашего закрытого ключа.
+
+**Структура JWE (компактная сериализация):**
+
+1. **Protected Header** (не зашифровано)
+2. **Encrypted Key** (зашифровано)
+3. **Initialization Vector** (зашифровано)
+4. **Ciphertext** (зашифровано)
+5. **Authentication Tag** (зашифровано)
+
+| Закодированный JWE (пример) | Раскодированный (Protected Header) |
+| :------------------------------------------------------- | :-------------------------------------------- |
+| `eyJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0...` | `{ "enc": "A256GCM", "alg": "RSA-OAEP-256" }` |
+
+### 2. Обработать дешифрованный ответ
+
+После дешифрования JWE вы получите компактную сериализацию **JWS**, состоящую из трех частей:
+`Base64URL(Header) . Base64URL(Payload) . Base64URL(Signature)`
+
+**Пример раскодированного JWS:**
+
+- **Header:**
+ ```json
+ {
+ "kid": "alfa-test-jwt",
+ "typ": "JWT",
+ "alg": "RS256"
+ }
+ ```
+- **Payload:**
+ ```json
+ {
+ "debitTurnover": {
+ "amount": 0,
+ "currencyName": "RUR"
+ }
+ }
+ ```
+
+### 3. Проверить подпись ответа от Банка
+
+Используйте [открытый ключ](/assets/developers-portal.docs.alfa-api/articles/signature-encryption/articles/encryption/articles/json-rsa/files/cert.cer) сертификата Банка для проверки подписи. Серийный номер сертификата Банка указан в поле `kid` заголовка JWS.
+
+### 4. Обработать ответ в формате JSON
+
+Итоговый результат:
+
+```json
+{
+ "debitTurnover": {
+ "amount": 0,
+ "currencyName": "RUR"
+ }
+}
+```
+
+---
+
+**Ссылки для навигации:**
+
+- ← [Подписание TXT ГОСТ-сертификатом](/products/alfa-api/documentation/articles/signature-encryption/articles/signature/articles/text-gost/text-gost)
+- → [Шифрование JSON ГОСТ-сертификатом](/products/alfa-api/documentation/articles/signature-encryption/articles/encryption/articles/json-gost/json-gost)
diff --git a/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/managing-certificates/get-certificates.md b/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/managing-certificates/get-certificates.md
new file mode 100644
index 0000000..eba20de
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/managing-certificates/get-certificates.md
@@ -0,0 +1,103 @@
+# Получение сертификатов
+
+**Теги:** `B2B` `B2C` `H2H`
+
+## Эндпоинты
+
+### Песочница
+
+`GET https://sandbox.alfabank.ru/api/gd/v1/crypto-service/certificates`
+
+### Пром
+
+`GET https://baas.alfabank.ru/api/gd/v1/crypto-service/certificates`
+
+---
+
+## Описание
+
+Метод позволяет получить информацию по всем сертификатам, выпущенным вне УЦ Альфа-Банка и далее загруженным с помощью метода [«Добавление нового сертификата»](/products/alfa-api/documentation/articles/signature-encryption/articles/managing-certificates/articles/post-certificates/post-certificates).
+
+> **Внимание**
+> Для получения сертификата, выпущенного через сервис [«Электронная подпись»](/products/alfa-api/documentation/articles/signature/signature), используйте метод [«Получение RSA-сертификата»](/products/alfa-api/documentation/articles/signature/articles/get-rsa/v2/get-rsa).
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обяз. | Описание |
+| :---------------- | :------- | :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | `string` | required | Bearer {access_token}, полученный по [Authorization Code Flow](/products/alfa-api/documentation/articles/alfa-id/articles/acf/articles/intro/intro) / [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | `string` | required | `application/json` |
+| **Content-Type** | `string` | optional | `application/json` |
+
+### Пример запроса
+
+```bash
+curl -X GET https://baas.alfabank.ru/api/gd/v1/crypto-service/certificates \
+ -H 'Authorization: Bearer {access-token}' \
+ -H 'Accept: application/json' \
+ -H 'Content-Type: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+| Атрибут | Тип | Обяз. | Описание |
+| :------------------- | :------------- | :------- | :--------------------------------------------------------------------------------------------------------- |
+| **id** | `string(uuid)` | required | ID сертификата |
+| **clientId** | `string(uuid)` | required | Идентификатор партнёрского сервиса |
+| **ownerName** | `string` | required | Имя владельца |
+| **fingerprint** | `string` | required | Отпечаток сертификата |
+| **organizationName** | `string` | optional | Наименование организации |
+| **beginDateTime** | `string` | required | Дата начала действия сертификата |
+| **expireDateTime** | `string` | required | Дата окончания действия сертификата |
+| **status** | `string` | optional | Статус. Возможные значения: • `ACTIVE` - активен; • `REVOKED` - аннулирован; • `DELETED` - удалён |
+| **certificateBody** | `string` | required | Тело сертификата в виде base64-строки |
+| **type** | `string` | required | Тип сертификата. Возможные значения: • `SIGNATURE` - для подписи; • `ENCRYPTION` - для шифрования |
+| **algorithm** | `string` | required | Алгоритм сертификата |
+| **serialNumber** | `string` | required | Серийный номер сертификата |
+
+### Пример ответа 200 (OK)
+
+```json
+[
+ {
+ "id": "9610bc6b-f06b-41b6-bae9-6bb5b06a54dd",
+ "clientId": "4aa56f35-abb1-4ebe-9697-389cca4a4475",
+ "ownerName": "Кудрявцев Ермолай Игоревич",
+ "fingerprint": "333773d77ef05aa9f7b7bae8e2779418b2aedb6a",
+ "organizationName": "ООО 'Ромашка'",
+ "beginDateTime": "2023-07-28T15:11:14Z",
+ "expireDateTime": "2025-06-19T11:48:06Z",
+ "status": "ACTIVE",
+ "certificateBody": "MIIGATCCBLWgAwIBAgITYQADiqqgHk1/OTmNhAABAAOKqjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAwUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUAwWzELMAkGA1UEBhMCUlUxEjAQBgNVBAoTCUFsZmEtQmFuazELMAkGA1UECxMCSVQxKzApBgNVBAMTIkFsZmEtQmFuayBJc3N1aW5nIFN1Ym9yZGluYXRlIENBIDEwHhcNMjMwNzI4MTUxMTE0WhcNMjUwNjE5MTE0ODA2WjCBpzEXMBUGA1UEKgwO0JXRgNC80L7Qu9Cw0LkxGzAZBgNVBAQMEtCa0YPQtNGA0Y/QstGG0LXQsjELMAkGA1UEBhMCUlUxOzA5BgNVBAMMMtCa0YPQtNGA0Y/QstGG0LXQsiDQldGA0LzQvtC70LDQuSDQmNCz0L7RgNC10LLQuNGHMSUwIwYJKoZIhvcNAQkBFhZVc2VyNTA0QHBvY2h0b2Noa2EuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ZM3Ztf+Ro4e64R8yI4qDV/zLdJjUCx5WNBx6gcp1pJ4uhQixw+ASy4Oxu0Xp7OxmpXtvDJFi4kr6QymtzMNYqJA3GZk85p+Iobkwo5zHKyBf0tX5HwmFWjJx9CqZKp8iZAFw9nqz1uqronxyzTgULPL6eE9igVSzaVf5msV8sXXfl87guVHF+Ph18hsdng1WiCJ7Mi14ETdI9O0R5eJiPZztLIHRnXuBtB1Oa1YiiWtvkZNnpLKONwxljdTZlH7h7KfaXUwW3kX8r0p7jvO7gNhMXvOSK1JPXWevmBHrjONVlG2atWoxT2IHs2ZDz+BLxgSwLc9NIQK+qKhIMfA1wIDAQABo4ICBzCCAgMwJQYDVR0RBB4wHIILZXhhbXBsZS5jb22CDSouZXhhbXBsZS5jb20wHQYDVR0OBBYEFGbczU3B6IZhHwKsC8ODg8r4xi3nMB8GA1UdIwQYMBaAFMkXMx6bqZSglhhLbnFMgdvpc/5lMIG7BgNVHR8EgbMwgbAwga2ggaqggaeGOWh0dHBzOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNybIYwaHR0cDovL3Zsa3dzNjo5MDgxL2Rpc3RycG9pbnQvQWxmYS1CYW5rX1NDQTEuY3JshjhodHRwOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNybDCB2wYIKwYBBQUHAQEEgc4wgcswRQYIKwYBBQUHMAKGOWh0dHBzOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNydDA8BggrBgEFBQcwAoYwaHR0cDovL3Zsa3dzNjo5MDgxL2Rpc3RycG9pbnQvQWxmYS1CYW5rX1NDQTEuY3J0MEQGCCsGAQUFBzAChjhodHRwOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNydDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAwUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUADggEBAHTjDmxldqWkRgpT5gXKuIzyqIHjlDZMMfahcWBxqWV9XC46bcPx8gvlpzb8N+oK+X6AqDt3+vneAiGQn8iNs9ajDKtes9ulZzMUJBwzwv26DsiI3s4/0phypAcqQVHJQxvU+rdrh5FgqJcNZsuOtOaJhiO/i/3J7hoL/oxVwSk+lX4m+X5u76/Vdqk9ydKXNNnzMi12F4FvD+igTrezzLjPHQRx5vLY0cWwLEdBxLJmBwd1u7EBT3j+v9Pyh0pTzXsJC0BY1BIt6VOh6QGKGTKT3cBB6zbIOrY7UTOkYdCqtyB9vhayAyti3aO37PANUQ7dUwUEZyf64/D4/HRlhqI=",
+ "type": "ENCRYPTION",
+ "algorithm": "RS256",
+ "serialNumber": "2163173489423972678179275487230070851350268586"
+ }
+]
+```
+
+---
+
+## Ошибки
+
+| Код | Описание | Возможные значения `error` |
+| :------ | :------------- | :------------------------------------------------------------------------- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры запроса |
+| **401** | Unauthorized | `invalid_token` — токен просрочен, отозван или недействителен |
+| **403** | Forbidden | `insufficient_scope` — нет прав на использование сервиса (настройки scope) |
+| **500** | Internal Error | `internal_error` — внутренняя ошибка сервиса |
+
+_Значения параметров ошибок могут изменяться. Рекомендуем предусмотреть стандартную обработку ошибок._
+
+---
+
+**Навигация:**
+[← Добавление нового сертификата](/products/alfa-api/documentation/articles/signature-encryption/articles/managing-certificates/articles/post-certificates/post-certificates) | [Обновление сертификата →](/products/alfa-api/documentation/articles/signature-encryption/articles/managing-certificates/articles/patch-certificates/patch-certificates)
diff --git a/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/managing-certificates/patch-certificates.md b/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/managing-certificates/patch-certificates.md
new file mode 100644
index 0000000..726a4c3
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/managing-certificates/patch-certificates.md
@@ -0,0 +1,131 @@
+# Обновление сертификата
+
+**Метки:** `B2B` | `B2C` | `H2H`
+
+## Эндпоинты
+
+| Окружение | Метод и URL |
+| :------------ | :----------------------------------------------------------------------------- |
+| **Песочница** | `PATCH https://sandbox.alfabank.ru/api/gd/v1/crypto-service/certificates/{id}` |
+| **Пром** | `PATCH https://baas.alfabank.ru/api/gd/v1/crypto-service/certificates/{id}` |
+
+## Описание
+
+Метод позволяет отозвать или активировать ранее отозванный сертификат, выпущенный вне УЦ Альфа-Банка. Отозванный сертификат не может использоваться для криптографических операций.
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Описание |
+| :---------------- | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | `string` | **Required**. Bearer {access_token}, полученный по [Authorization Code Flow](/products/alfa-api/documentation/articles/alfa-id/articles/acf/articles/intro/intro) / [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | `string` | **Required**. `application/json` |
+| **Content-Type** | `string` | **Required**. `application/json` |
+
+### PATH
+
+| Атрибут | Тип | Описание |
+| :------ | :------- | :--------------------------- |
+| **id** | `string` | **Required**. ID сертификата |
+
+### BODY
+
+| Атрибут | Тип | Описание |
+| :-------- | :------- | :----------------------------------------------------------------------------------------------------------------------------- |
+| **op** | `string` | **Optional**. Тип операции. Возможные значения: `replace` — замена |
+| **path** | `string` | **Optional**. Путь до изменяемого параметра. Возможные значения: `/status` |
+| **value** | `string` | **Optional**. Новое значение. Возможные значения: • `ACTIVE` — сертификат активен; • `REVOKED` — сертификат аннулирован |
+
+### Пример запроса
+
+```bash
+curl -X PATCH https://baas.alfabank.ru/api/gd/v1/crypto-service/certificates/{id} \
+ -H 'Authorization: Bearer {access-token}' \
+ -H 'Accept: application/json' \
+ -H 'Content-Type: application/json' \
+ -d '{
+ "op": "replace",
+ "path": "/status",
+ "value": "ACTIVE"
+ }'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+| Атрибут | Тип | Описание |
+| :------------------- | :------------- | :-------------------------------------------------------------------------- |
+| **id** | `string(uuid)` | **Required**. ID сертификата |
+| **clientId** | `string(uuid)` | **Required**. Идентификатор партнёрского сервиса |
+| **ownerName** | `string` | **Required**. Имя владельца |
+| **fingerprint** | `string` | **Required**. Отпечаток сертификата |
+| **organizationName** | `string` | **Optional**. Наименование организации |
+| **beginDateTime** | `string` | **Required**. Дата начала действия сертификата |
+| **expireDateTime** | `string` | **Required**. Дата окончания действия сертификата |
+| **status** | `string` | **Required**. Статус: `ACTIVE` (активен), `REVOKED` (аннулирован) |
+| **certificateBody** | `string` | **Required**. Тело сертификата в виде base64-строки |
+| **type** | `string` | **Required**. Тип: `SIGNATURE` (для подписи), `ENCRYPTION` (для шифрования) |
+| **algorithm** | `string` | **Required**. Алгоритм сертификата |
+| **serialNumber** | `string` | **Required**. Серийный номер сертификата |
+
+#### Пример ответа 200
+
+```json
+{
+ "id": "9610bc6b-f06b-41b6-bae9-6bb5b06a54dd",
+ "clientId": "4aa56f35-abb1-4ebe-9697-389cca4a4475",
+ "ownerName": "Кудрявцев Ермолай Игоревич",
+ "fingerprint": "333773d77ef05aa9f7b7bae8e2779418b2aedb6a",
+ "organizationName": "ООО 'Ромашка'",
+ "beginDateTime": "2023-07-28T15:11:14Z",
+ "expireDateTime": "2025-06-19T11:48:06Z",
+ "status": "ACTIVE",
+ "certificateBody": "MIIGATCCBLWgAwIBAgITYQADiqqgHk1/OTmNhAABAAOKqjBB...",
+ "type": "ENCRYPTION",
+ "algorithm": "RS256",
+ "serialNumber": "2163173489423972678179275487230070851350268586"
+}
+```
+
+---
+
+## Ошибки
+
+| Код | Описание | Код ошибки (`error`) |
+| :------ | :------------- | :------------------------------------------------------------ |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры |
+| **401** | Unauthorized | `invalid_token` — токен просрочен, отозван или недействителен |
+| **403** | Forbidden | `insufficient_scope` — недостаточно прав для вызова сервиса |
+| **500** | Internal Error | `internal_error` — внутренняя ошибка сервиса |
+
+### Примеры сообщений об ошибках
+
+**400 Bad Request**
+
+```json
+{
+ "error": "invalid_request",
+ "error_description": "Authorization header is not present in request headers"
+}
+```
+
+**401 Unauthorized**
+
+```json
+{
+ "error": "invalid_token",
+ "error_description": "The access token provided is expired, revoked, malformed, or invalid for other reasons"
+}
+```
+
+> **Важно:** Значения параметров ошибок могут изменяться. Рекомендуем предусмотреть стандартную обработку ошибок, не описанных в текущей версии документации.
+
+---
+
+_Документация Alfa API_
diff --git a/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/managing-certificates/post-certificates.md b/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/managing-certificates/post-certificates.md
new file mode 100644
index 0000000..c63bddd
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/managing-certificates/post-certificates.md
@@ -0,0 +1,108 @@
+# Добавление нового сертификата
+
+**Теги:** `B2B` `B2C` `H2H`
+
+## Эндпоинты
+
+### Песочница
+
+`POST https://sandbox.alfabank.ru/api/gd/v1/crypto-service/certificates`
+
+### Пром
+
+`POST https://baas.alfabank.ru/api/gd/v1/crypto-service/certificates`
+
+## Описание
+
+Метод позволяет загрузить сертификат, выпущенный вне УЦ Альфа-Банка, для проверки подписи запроса Банком и шифрования ответа от Банка.
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow](/products/alfa-api/documentation/articles/alfa-id/articles/acf/articles/intro/intro) / [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | `application/json` |
+| **Content-Type** | string | required | `application/json` |
+
+### BODY
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------------------ | :----- | :------------- | :------------------------------------------------------------------------------------------------------- |
+| **type** | string | required | Тип сертификата. Возможные значения: • `SIGNATURE` — для подписи; • `ENCRYPTION` — для шифрования. |
+| **certificateBody** | string | required | Тело сертификата в виде base64-строки. |
+
+### Пример запроса
+
+```bash
+curl -X POST https://baas.alfabank.ru/api/gd/v1/crypto-service/certificates \
+ -H 'Authorization: Bearer {access-token}' \
+ -H 'Accept: application/json' \
+ -H 'Content-Type: application/json' \
+ -d '{
+ "type": "ENCRYPTION",
+ "certificateBody": "MIIGATCCBLWgAwIBAgITYQADiqqgHk1/OTmNhAABAAOKqjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAwUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUAwWzELMAkGA1UEBhMCUlUxEjAQBgNVBAoTCUFsZmEtQmFuazELMAkGA1UECxMCSVQxKzApBgNVBAMTIkFsZmEtQmFuayBJc3N1aW5nIFN1Ym9yZGluYXRlIENBIDEwHhcNMjMwNzI4MTUxMTE0WhcNMjUwNjE5MTE0ODA2WjCBpzEXMBUGA1UEKgwO0JXRgNC80L7Qu9Cw0LkxGzAZBgNVBAQMEtCa0YPQtNGA0Y/QstGG0LXQsjELMAkGA1UEBhMCUlUxOzA5BgNVBAMMMtCa0YPQtNGA0Y/QstGG0LXQsiDQldGA0LzQvtC70LDQuSDQmNCz0L7RgNC10LLQuNGHMSUwIwYJKoZIhvcNAQkBFhZVc2VyNTA0QHBvY2h0b2Noa2EuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ZM3Ztf+Ro4e64R8yI4qDV/zLdJjUCx5WNBx6gcp1pJ4uhQixw+ASy4Oxu0Xp7OxmpXtvDJFi4kr6QymtzMNYqJA3GZk85p+Iobkwo5zHKyBf0tX5HwmFWjJx9CqZKp8iZAFw9nqz1uqronxyzTgULPL6eE9igVSzaVf5msV8sXXfl87guVHF+Ph18hsdng1WiCJ7Mi14ETdI9O0R5eJiPZztLIHRnXuBtB1Oa1YiiWtvkZNnpLKONwxljdTZlH7h7KfaXUwW3kX8r0p7jvO7gNhMXvOSK1JPXWevmBHrjONVlG2atWoxT2IHs2ZDz+BLxgSwLc9NIQK+qKhIMfA1wIDAQABo4ICBzCCAgMwJQYDVR0RBB4wHIILZXhhbXBsZS5jb22CDSouZXhhbXBsZS5jb20wHQYDVR0OBBYEFGbczU3B6IZhHwKsC8ODg8r4xi3nMB8GA1UdIwQYMBaAFMkXMx6bqZSglhhLbnFMgdvpc/5lMIG7BgNVHR8EgbMwgbAwga2ggaqggaeGOWh0dHBzOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNybIYwaHR0cDovL3Zsa3dzNjo5MDgxL2Rpc3RycG9pbnQvQWxmYS1CYW5rX1NDQTEuY3JshjhodHRwOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNybDCB2wYIKwYBBQUHAQEEgc4wgcswRQYIKwYBBQUHMAKGOWh0dHBzOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNydDA8BggrBgEFBQcwAoYwaHR0cDovL3Zsa3dzNjo5MDgxL2Rpc3RycG9pbnQvQWxmYS1CYW5rX1NDQTEuY3J0MEQGCCsGAQUFBzAChjhodHRwOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNydDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAwUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUADggEBAHTjDmxldqWkRgpT5gXKuIzyqIHjlDZMMfahcWBxqWV9XC46bcPx8gvlpzb8N+oK+X6AqDt3+vneAiGQn8iNs9ajDKtes9ulZzMUJBwzwv26DsiI3s4/0phypAcqQVHJQxvU+rdrh5FgqJcNZsuOtOaJhiO/i/3J7hoL/oxVwSk+lX4m+X5u76/Vdqk9ydKXNNnzMi12F4FvD+igTrezzLjPHQRx5vLY0cWwLEdBxLJmBwd1u7EBT3j+v9Pyh0pTzXsJC0BY1BIt6VOh6QGKGTKT3cBB6zbIOrY7UTOkYdCqtyB9vhayAyti3aO37PANUQ7dUwUEZyf64/D4/HRlhqI="
+ }'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ: 201 Created
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------------------- | :----------- | :------------- | :---------------------------------------------------------------------- |
+| **id** | string(uuid) | required | ID сертификата |
+| **clientId** | string | required | Идентификатор партнёрского сервиса |
+| **ownerName** | string | required | Имя владельца |
+| **fingerprint** | string | required | Отпечаток сертификата |
+| **organizationName** | string | optional | Наименование организации |
+| **beginDateTime** | string | required | Дата начала действия сертификата |
+| **expireDateTime** | string | required | Дата окончания действия сертификата |
+| **status** | string | required | Статус: `ACTIVE` (активен), `REVOKED` (аннулирован), `DELETED` (удалён) |
+| **certificateBody** | string | required | Тело сертификата в виде base64-строки |
+| **type** | string | required | Тип сертификата (`SIGNATURE` или `ENCRYPTION`) |
+| **algorithm** | string | required | Алгоритм сертификата |
+| **serialNumber** | string | required | Серийный номер сертификата |
+
+#### Пример ответа 201
+
+```json
+{
+ "id": "9610bc6b-f06b-41b6-bae9-6bb5b06a54dd",
+ "clientId": "4aa56f35-abb1-4ebe-9697-389cca4a4475",
+ "ownerName": "Кудрявцев Ермолай Игоревич",
+ "fingerprint": "333773d77ef05aa9f7b7bae8e2779418b2aedb6a",
+ "organizationName": "ООО 'Ромашка'",
+ "beginDateTime": "2023-07-28T15:11:14Z",
+ "expireDateTime": "2025-06-19T11:48:06Z",
+ "status": "ACTIVE",
+ "certificateBody": "MIIGATCCBLWgAwIBAgITYQADiqqgHk1/OTmNhAABAAOKqjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAwUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUAwWzELMAkGA1UEBhMCUlUxEjAQBgNVBAoTCUFsZmEtQmFuazELMAkGA1UECxMCSVQxKzApBgNVBAMTIkFsZmEtQmFuayBJc3N1aW5nIFN1Ym9yZGluYXRlIENBIDEwHhcNMjMwNzI4MTUxMTE0WhcNMjUwNjE5MTE0ODA2WjCBpzEXMBUGA1UEKgwO0JXRgNC80L7Qu9Cw0LkxGzAZBgNVBAQMEtCa0YPQtNGA0Y/QstGG0LXQsjELMAkGA1UEBhMCUlUxOzA5BgNVBAMMMtCa0YPQtNGA0Y/QstGG0LXQsiDQldGA0LzQvtC70LDQuSDQmNCz0L7RgNC10LLQuNGHMSUwIwYJKoZIhvcNAQkBFhZVc2VyNTA0QHBvY2h0b2Noa2EuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ZM3Ztf+Ro4e64R8yI4qDV/zLdJjUCx5WNBx6gcp1pJ4uhQixw+ASy4Oxu0Xp7OxmpXtvDJFi4kr6QymtzMNYqJA3GZk85p+Iobkwo5zHKyBf0tX5HwmFWjJx9CqZKp8iZAFw9nqz1uqronxyzTgULPL6eE9igVSzaVf5msV8sXXfl87guVHF+Ph18hsdng1WiCJ7Mi14ETdI9O0R5eJiPZztLIHRnXuBtB1Oa1YiiWtvkZNnpLKONwxljdTZlH7h7KfaXUwW3kX8r0p7jvO7gNhMXvOSK1JPXWevmBHrjONVlG2atWoxT2IHs2ZDz+BLxgSwLc9NIQK+qKhIMfA1wIDAQABo4ICBzCCAgMwJQYDVR0RBB4wHIILZXhhbXBsZS5jb22CDSouZXhhbXBsZS5jb20wHQYDVR0OBBYEFGbczU3B6IZhHwKsC8ODg8r4xi3nMB8GA1UdIwQYMBaAFMkXMx6bqZSglhhLbnFMgdvpc/5lMIG7BgNVHR8EgbMwgbAwga2ggaqggaeGOWh0dHBzOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNybIYwaHR0cDovL3Zsa3dzNjo5MDgxL2Rpc3RycG9pbnQvQWxmYS1CYW5rX1NDQTEuY3JshjhodHRwOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNybDCB2wYIKwYBBQUHAQEEgc4wgcswRQYIKwYBBQUHMAKGOWh0dHBzOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNydDA8BggrBgEFBQcwAoYwaHR0cDovL3Zsa3dzNjo5MDgxL2Rpc3RycG9pbnQvQWxmYS1CYW5rX1NDQTEuY3J0MEQGCCsGAQUFBzAChjhodHRwOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNybDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAwUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUADggEBAHTjDmxldqWkRgpT5gXKuIzyqIHjlDZMMfahcWBxqWV9XC46bcPx8gvlpzb8N+oK+X6AqDt3+vneAiGQn8iNs9ajDKtes9ulZzMUJBwzwv26DsiI3s4/0phypAcqQVHJQxvU+rdrh5FgqJcNZsuOtOaJhiO/i/3J7hoL/oxVwSk+lX4m+X5u76/Vdqk9ydKXNNnzMi12F4FvD+igTrezzLjPHQRx5vLY0cWwLEdBxLJmBwd1u7EBT3j+v9Pyh0pTzXsJC0BY1BIt6VOh6QGKGTKT3cBB6zbIOrY7UTOkYdCqtyB9vhayAyti3aO37PANUQ7dUwUEZyf64/D4/HRlhqI=",
+ "type": "ENCRYPTION",
+ "algorithm": "RS256",
+ "serialNumber": "2163173489423972678179275487230070851350268586"
+}
+```
+
+---
+
+## Ошибки
+
+| Код | Описание | Код ошибки (в теле) |
+| :------ | :-------------------- | :--------------------------------------------------------- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры |
+| **401** | Unauthorized | `invalid_token` — токен просрочен или недействителен |
+| **403** | Forbidden | `insufficient_scope` — недостаточно прав (настройки scope) |
+| **500** | Internal Server Error | `internal_error` — внутренняя ошибка сервиса |
+
+> Значения параметров ошибок могут изменяться. Рекомендуем предусмотреть стандартную обработку ошибок, не описанных в текущей версии документации.
+
+---
+
+### Навигация
+
+← [Для чего это нужно](/products/alfa-api/documentation/articles/signature-encryption/articles/intro/intro) | [Получение сертификатов](/products/alfa-api/documentation/articles/signature-encryption/articles/managing-certificates/articles/get-certificates/get-certificates) →
diff --git a/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/signature-encryption-intro.md b/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/signature-encryption-intro.md
new file mode 100644
index 0000000..c7c8a70
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/signature-encryption-intro.md
@@ -0,0 +1,42 @@
+# Для чего это нужно
+
+**Теги:** `B2B` `B2C` `H2H`
+
+Использование транспортной подписи и шифрования с использованием ГОСТ- или RSA-сертификата даёт следующие возможности:
+
+### **Конфиденциальность**
+
+Шифрование сообщений обеспечивает защиту данных от посторонних глаз. Это важно, так как в API могут передаваться конфиденциальные данные, такие как номера счетов или личная информация.
+
+### **Безопасность**
+
+Подписание сообщений подтверждает подлинность и целостность информации. Если сообщение было изменено или подделано, подпись становится недействительной.
+
+### **Доверие**
+
+Подписание и шифрование помогают укрепить доверие между сторонами API, поскольку они подтверждают, что данные не были изменены или подделаны во время передачи.
+
+### **Соответствие требованиям**
+
+В некоторых отраслях, таких как финансовые услуги, подписание и шифрование являются обязательными требованиями для соблюдения регуляторных норм и защиты данных.
+
+### **Аутентификация**
+
+Подписание сообщения может также использоваться для аутентификации источника данных, тем самым предотвращая фальсификацию или манипуляции с данными.
+
+---
+
+## Навигация по разделу
+
+- ← [Загрузка файла](/products/alfa-api/documentation/articles/secure-file-transfer/articles/upload/v1/upload)
+- → [Добавление нового сертификата](/products/alfa-api/documentation/articles/signature-encryption/articles/managing-certificates/articles/post-certificates/post-certificates)
+
+---
+
+### Справочная информация (из структуры документа)
+
+Данная статья является частью раздела **Транспортная подпись и шифрование**. В этом разделе также доступны:
+
+1. [Управление сертификатами для подписи и шифрования](/products/alfa-api/documentation/articles/signature-encryption/articles/managing-certificates/managing-certificates)
+2. [Транспортная подпись](/products/alfa-api/documentation/articles/signature-encryption/articles/signature/signature)
+3. [Шифрование](/products/alfa-api/documentation/articles/signature-encryption/articles/encryption/encryption)
diff --git a/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/transport-signature/json-ghost.md b/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/transport-signature/json-ghost.md
new file mode 100644
index 0000000..b75ded3
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/transport-signature/json-ghost.md
@@ -0,0 +1,105 @@
+# Подписание JSON ГОСТ-сертификатом
+
+**B2B | B2C | H2H**
+
+Способ защиты данных определяется настройками интеграции. Для уточнения информации по настройке Вашей интеграции или запроса для установления нужных настроек необходимо написать на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru). При запросе установления настроек необходимо сообщить способ защиты (подпись или подпись с шифрованием), а также алгоритм (RSA или ГОСТ).
+
+> **Внимание**
+> Для подписания сообщения необходимо предварительно загрузить сертификат, используя следующий [метод](/products/alfa-api/documentation/articles/signature-encryption/articles/managing-certificates/articles/post-certificates/post-certificates). Если Вы уже загружали сертификат, используя данный метод — повторно выполнять эту операцию не нужно.
+
+## Подписание JSON
+
+### 1. Подготовить сообщение в формате JSON
+
+**Пример сообщения:**
+
+```json
+{
+ "sub": "1234567890",
+ "name": "John Doe",
+ "admin": true,
+ "iat": 1657882689,
+ "exp": 1657886289
+}
+```
+
+### 2. Подписать запрос
+
+Тело запроса сформировать алгоритмом ГОСТ Р 34.10-2012 256 бит в виде компактной сериализации в соответствии с [JSON Web Signature](https://www.rfc-editor.org/rfc/rfc7515#section-3.1) и подписать тело запроса закрытым ключом сертификата.
+
+**Формат JWS:**
+`BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload) || '.' || BASE64URL(JWS Signature)`
+
+**Структура тела запроса:**
+
+- **Заголовок (Header)**
+ - `"alg": "GOST3410_2012_256"`
+ - `"typ": "JWT"`
+ - `"cty": "JWS"`
+ - `"kid": "серийный номер сертификата"`
+ - `"b64": true`
+- **JSON-документ (Payload)**
+- **Подпись запроса (Signature)**
+
+**Пример JWS:**
+
+```text
+ewogICJhbGciIDogIkdPU1QzNDEwXzIwMTJfMjU2IiwKICAidHlwIiA6ICJKV1QiLAogICJjdHkiIDogIkpXUyIsCiAgImtpZCIgOiAiNmQzOGI4ZTAwNjFiMGY5YTk0ZjEwNGJlNTdlNzdhYTE4IiwKICAiYjY0IiA6IHRydWUKfQ.eyJkZWJpdFR1cm5vdmVyIjp7ImFtb3VudCI6MCwiY3VycmVuY3lOYW1lIjoiUlVSIn19.ByCkNenTTtZQrnZplNOo9WyqPTxb6vFq0iExNHpuPCV6LUeXDFTe8tNBZCy1WvpdUCQBrKK447s3NJCC5hNLhA
+```
+
+Для тестовой проверки можно использовать [https://token.dev/](https://token.dev/).
+
+### 3. Выполнить запрос
+
+- Если добавить заголовки `Content-Type: application/json` + `X-Request-ChannelSecurity: NO` и отправить запрос, то подпись запроса не будет проверяться.
+- Если добавить заголовки `Content-Type: application/jose` + `X-Request-ChannelSecurity: SIGNATURE` и отправить запрос, то подпись запроса будет проверяться.
+- Если подпись валидна — запрос обрабатывается, если невалидна — Банк определяет запрос как неподлинный и возвращает ошибку.
+
+Любые другие комбинации заголовков `Content-Type + X-Request-ChannelSecurity` приведут к ошибке.
+
+---
+
+## Проверка подписи JSON
+
+### 1. Получить ответ
+
+- Если добавить заголовки `Accept: application/json` + `X-Response-ChannelSecurity: NO`, то ответ не будет подписан.
+- Если добавить заголовки `Accept: application/jose` + `X-Response-ChannelSecurity: SIGNATURE`, то полученный ответ (в том числе ошибки) будет подписан и представлен в виде компактной сериализации.
+
+Любые другие комбинации заголовков `Accept + X-Response-ChannelSecurity` приведут к ошибке.
+
+**Декодирование компактной сериализации JWS**
+JWS формируется из трёх составляющих и представляет структуру вида:
+
+1. Base64URL(Header);
+2. Base64URL(Payload);
+3. Base64URL(Signature).
+
+**Пример JWS:**
+
+| Закодированный | Раскодированный |
+| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `ewogICJhbGciIDogIkdPU1QzNDEwXzIwMTJfMjU2IiwKICAidHlwIiA6ICJKV1QiLAogICJjdHkiIDogIkpXUyIsCiAgImtpZCIgOiAiNmQzOGI4ZTAwNjFiMGY5YTk0ZjEwNGJlNTdlNzdhYTE4IiwKICAiYjY0IiA6IHRydWUKfQ.eyJkZWJpdFR1cm5vdmVyIjp7ImFtb3VudCI6MCwiY3VycmVuY3lOYW1lIjoiUlVSIn19.ByCkNenTTtZQrnZplNOo9WyqPTxb6vFq0iExNHpuPCV6LUeXDFTe8tNBZCy1WvpdUCQBrKK447s3NJCC5hNLhA` | **header** `json { "alg": "GOST3410_2012_256", "typ": "JWT", "cty": "JWS", "kid": "6d38b8e0061b0f9a94f104be57e77aa18", "b64": true } ` **payload** `json { "debitTurnover": { "amount": 0, "currencyName": "RUR" } } ` **verify signature** `text HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), ) ` |
+
+### 2. Проверить подпись ответа от Банка
+
+Используйте открытый ключ сертификата Банка для проверки подписи. Для получения сертификата напишите на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru).
+
+Проверьте подпись в соответствии с данными, указанными в Заголовке (Header). В поле `kid` заголовка JWS будет записан серийный номер сертификата Банка.
+
+### 3. Обработать ответ в формате JSON
+
+**Пример ответа:**
+
+```json
+{
+ "debitTurnover": {
+ "amount": 0,
+ "currencyName": "RUR"
+ }
+}
+```
+
+---
+
+[← Подписание JSON RSA-сертификатом](/products/alfa-api/documentation/articles/signature-encryption/articles/signature/articles/json-rsa/json-rsa) | [Подписание XML RSA-сертификатом →](/products/alfa-api/documentation/articles/signature-encryption/articles/signature/articles/xml-rsa/xml-rsa)
diff --git a/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/transport-signature/json-rsa.md b/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/transport-signature/json-rsa.md
new file mode 100644
index 0000000..0e2ee2f
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/Транспортная_подпись_и_шифрование/transport-signature/json-rsa.md
@@ -0,0 +1,104 @@
+# Подписание JSON RSA-сертификатом
+
+**B2B** | **B2C** | **H2H**
+
+Способ защиты данных определяется настройками интеграции. Для уточнения информации по настройке Вашей интеграции или запроса для установления нужных настроек необходимо написать на почту [alfa_api@alfabank.ru](mailto:alfa_api@alfabank.ru). При запросе установления настроек необходимо сообщить способ защиты (подпись или подпись с шифрованием), а также алгоритм (RSA или ГОСТ).
+
+> **Внимание**
+> Для подписания сообщения необходимо предварительно выпустить сертификат в УЦ Альфа-Банка, используя сервис ["Электронная подпись"](/products/alfa-api/documentation/articles/signature/signature). Если Вы уже выпускали сертификат - повторно выпускать не нужно.
+
+---
+
+## Подписание JSON
+
+### 1. Подготовить сообщение в формате JSON
+
+**Пример сообщения**
+
+```json
+{
+ "sub": "1234567890",
+ "name": "John Doe",
+ "admin": true,
+ "iat": 1657882689,
+ "exp": 1657886289
+}
+```
+
+### 2. Подписать запрос
+
+Тело запроса сформировать алгоритмом **RS256** в виде компактной сериализации в соответствии с [JSON Web Signature](https://www.rfc-editor.org/rfc/rfc7515#section-3.1) и подписать тело запроса закрытым ключом сертификата, выпущенным в сервисе "Электронная подпись".
+
+**Формат JWS**
+`BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload) || '.' || BASE64URL(JWS Signature)`
+
+**Структура тела запроса**
+
+- **Заголовок (Header)**
+ - `"kid"`: "серийный номер сертификата"
+ - `"typ"`: "JWT"
+ - `"alg"`: "RS256"
+- **JSON-документ (Payload)**
+- **Подпись запроса (Signature)**
+
+**Пример JWS**
+
+```text
+eyJhbGciOiJSUzI1NiIsImtpZCI6IjYxMDAwMzYzY2NiNzU5Y2I0NDg2MDc4NjVkMDAwMTAwMDM2M2NjIn0.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTY1Nzg4MjY4OSwiZXhwIjoxNjU3ODg2Mjg5fQ.ApKNzZ9kLMtBY3LzReSHQ7_AyDnzocGo9GTQFRmxTiRS7Lj7a55Kr4ziwZAmmwloF1063JJMOaU0lS947q6_hSct9pxzPdZ9tTmpIDGnQL-ks0oB7zz9vUSUd3G00UZXSYnuhI9BBRXvmmTaue5Y2j5zVZofLdO2dqPWCnsQULyLn_vYf8PeABhnAQ29z1Bq42uxfRFTM35cF40Tp4VBSqXDI1vxfleLusQlOZM-5Sk7O3Vy4Sf-UB03RrRGSBerZjdoMRh7dgEyoYAXS6c4MejCm2vmXKqSd7pu2V2TxOM9UTchkCS16DL-RIJtnfMjznmznU5SoMCpncvs6gRNeQ
+```
+
+Для тестовой проверки можно использовать [https://token.dev/](https://token.dev/).
+
+### 3. Выполнить запрос
+
+- Если добавить заголовки `Content-Type: application/json` + `X-Request-ChannelSecurity: NO` и отправить запрос, то подпись запроса **не будет** проверяться.
+- Если добавить заголовки `Content-Type: application/jose` + `X-Request-ChannelSecurity: SIGNATURE` и отправить запрос, то подпись запроса **будет** проверяться.
+
+Если подпись валидна — запрос обрабатывается, если невалидна — Банк определяет запрос как неподлинный и возвращает ошибку. Любые другие комбинации заголовков `Content-Type + X-Request-ChannelSecurity` приведут к ошибке.
+
+---
+
+## Проверка подписи JSON
+
+### 1. Получить ответ
+
+- Если добавить заголовки `Accept: application/json` + `X-Response-ChannelSecurity: NO`, то ответ **не будет** подписан.
+- Если добавить заголовки `Accept: application/jose` + `X-Response-ChannelSecurity: SIGNATURE`, то полученный ответ (в том числе ошибки) **будет подписан** и представлен в виде компактной сериализации.
+
+Любые другие комбинации заголовков `Accept + X-Response-ChannelSecurity` приведут к ошибке.
+
+**Декодирование компактной сериализации JWS**
+JWS формируется из трёх составляющих:
+
+- Base64URL(Header);
+- Base64URL(Payload);
+- Base64URL(Signature).
+
+**Пример JWS**
+
+| ЗАКОДИРОВАННЫЙ | РАСКОДИРОВАННЫЙ |
+| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `eyJraWQiOiJhbGZhLXRlc3Qtand0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.` `eyJkZWJpdFR1cm5vdmVyIjp7ImFtb3VudCI6MCwiY3VycmVuY3lOYW1lIjoiUlVSIn19.` `Y1NqCkRjjtJ2GrVsW-a627g6ObfpEaKw-H92QVgVWqL9i7d1SHyaXVghF4ZNZAlrFasKySnKYZf2Ik8zVIlLN7hqeYxoeTdE2OLbiQdvPrD-JnI2Qzh0K32vcImwgGcpq2lt_QKx1f_YmaSRhH9O3xZePVcmFGCqhl_0prQSwcR4g-yuhidvspaF48QlUHcEaZ65Cr8hdyc6g9HPZDy7ipU-zCAZGgK0enxfWn4Osyqch8RRDIsfLG7OJ4wbYwYB22LYO5UaxX8Zy_R2jSnKlNghxQwSqJGxizMFhFhdCrATGTo-ysI-7OtfremD8YNj7z_iYciyYbtAgV0ZodEvMA` | **header** `{"kid": "alfa-test-jwt", "typ": "JWT", "alg": "RS256"}`
**verify signature** `RSASHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload))` |
+
+### 2. Проверить подпись ответа от Банка
+
+Используйте [открытый ключ](/assets/developers-portal.docs.alfa-api/articles/signature-encryption/articles/signature/articles/json-rsa/files/cert.cer) сертификата для проверки подписи.
+
+Проверьте подпись в соответствии с данными, указанными в Заголовке (Header). В поле `kid` заголовка JWS будет записан серийный номер сертификата Банка.
+
+### 3. Обработать ответ в формате JSON
+
+**Пример ответа**
+
+```json
+{
+ "debitTurnover": {
+ "amount": 0,
+ "currencyName": "RUR"
+ }
+}
+```
+
+---
+
+**← [Обновление сертификата](/products/alfa-api/documentation/articles/signature-encryption/articles/managing-certificates/articles/patch-certificates/patch-certificates)** | **[Подписание JSON ГОСТ-сертификатом](/products/alfa-api/documentation/articles/signature-encryption/articles/signature/articles/json-gost/json-gost) →**
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/get-nominal-accounts.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/get-nominal-accounts.md
new file mode 100644
index 0000000..7083605
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/get-nominal-accounts.md
@@ -0,0 +1,113 @@
+# Получение списка номинальных счетов
+
+**H2H**
+
+## Эндпоинты
+
+| Среда | Метод и URL |
+| :------------ | :-------------------------------------------------------------- |
+| **Песочница** | `GET https://sandbox.alfabank.ru/api/na/jp/v1/nominal-accounts` |
+| **Пром** | `GET https://baas.alfabank.ru/api/na/jp/v1/nominal-accounts` |
+
+## Scope
+
+`beneficiaries`
+
+## Описание
+
+Метод позволяет получить список номинальных счетов, зарегистрированных в системе.
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Описание |
+| :---------------- | :------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | `string` (required) | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | `string` (required) | application/json |
+
+### Пример запроса (cURL)
+
+```bash
+curl --location 'https://baas.alfabank.ru/api/na/jp/v1/nominal-accounts' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### 200 (OK)
+
+#### Пример ответа
+
+```json
+[
+ {
+ "accountNumber": "40817810306050000000",
+ "isActive": true
+ }
+]
+```
+
+#### Тело ответа (BODY)
+
+| Атрибут | Тип | Описание |
+| :---------------- | :------------------- | :------------------------------------------------------------------------------------------------------------- |
+| **accountNumber** | `string` (required) | Номер номинального счёта |
+| **isActive** | `boolean` (required) | Статус активности номинального счёта. Принимает значения: • `true` — активен; • `false` — деактивирован. |
+
+---
+
+### Ошибки
+
+#### 400 (Bad Request)
+
+| Атрибут | Тип | Описание |
+| :-------------------- | :------------------ | :------------------------------------------------------------------------- |
+| **error** | `string` (required) | Код ошибки. Значения: • `invalid_request` — неверные параметры запроса. |
+| **error_description** | `string` (optional) | Описание ошибки. |
+
+#### 401 (Unauthorized)
+
+| Атрибут | Тип | Описание |
+| :-------------------- | :------------------ | :----------------------------------------------------------------------------------------------- |
+| **error** | `string` (required) | Код ошибки. Значения: • `invalid_token` — токен просрочен, отозван или имеет неверный формат. |
+| **error_description** | `string` (optional) | Описание ошибки. |
+
+#### 403 (Forbidden)
+
+| Атрибут | Тип | Описание |
+| :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------- |
+| **error** | `string` (required) | Код ошибки. Значения: • `insufficient_scope` — недостаточно прав (несоответствие настроек scope). |
+| **error_description** | `string` (optional) | Описание ошибки. |
+
+#### 404 (Not Found)
+
+| Атрибут | Тип | Описание |
+| :-------------------- | :------------------ | :-------------------------------------------------------------------------------- |
+| **error** | `string` (required) | Код ошибки. Значения: • `unknown_endpoint` — эндпоинт не найден или неактивен. |
+| **error_description** | `string` (optional) | Описание ошибки. |
+
+#### 429 (Too Many Requests)
+
+_Нет тела ответа._
+
+#### 500 (Internal Server Error)
+
+| Атрибут | Тип | Описание |
+| :-------------------- | :------------------ | :----------------------------------------------------------------------- |
+| **error** | `string` (required) | Код ошибки. Значения: • `internal_error` — внутренняя ошибка сервиса. |
+| **error_description** | `string` (optional) | Описание ошибки. |
+
+#### 503 (Service Unavailable)
+
+_Нет тела ответа._
+
+---
+
+## Навигация
+
+- ← [Как сформировать подпись](/products/alfa-api/documentation/articles/nominal-accounts/articles/signature/signature)
+- → [Контрагенты: Как это работает](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/intro/intro)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/how-to-encrypt-your-card-number-eg-cardtoken.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/how-to-encrypt-your-card-number-eg-cardtoken.md
new file mode 100644
index 0000000..133bba6
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/how-to-encrypt-your-card-number-eg-cardtoken.md
@@ -0,0 +1,86 @@
+Вот преобразованный контур документа в формате Markdown. Я сохранил структуру, технические подробности и примеры кода, очистив их от лишней разметки и служебных скриптов.
+
+---
+
+# Номинальные счета / Как зашифровать номер карты
+
+**H2H**
+
+## Как зашифровать номер карты
+
+При проведении выплат по номеру карты в поле `pan` необходимо передавать токен номера карты. Для этого номер карты необходимо зашифровать с помощью алгоритма `RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING`.
+
+### Примеры шифрования
+
+#### Python с использованием Crypto.Cipher в PyCryptodome
+```python
+import sys
+from Crypto.Hash import SHA256, SHA1
+from Crypto.PublicKey import RSA
+from Crypto.Cipher import PKCS1_OAEP
+from base64 import b64decode, b64encode
+from Crypto.Signature import pss
+
+pubkey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwj9k2lFfc/EE2zYdRoRLZF5B42V6n8OHKfxLBLMk/0qpP2ZEYYoCqgbD9xsmLbQMTCxQ8JWj/V08JGpFjuNKJ2hRfRzLUfjTm5ReZJVPDhJa4B0QtUEvCS2R4aMqMpnQ1a1aywGAJoM5ift0apCNGKuZZYrGuFkQXeBw85lSYYNwrVmNUm55RI+tcb'
+msg = "4779642610000010"
+keyDER = b64decode(pubkey)
+keyPub = RSA.importKey(keyDER)
+cipher = PKCS1_OAEP.new(keyPub, SHA256, mgfunc=lambda x,y: pss.MGF1(x,y, SHA1))
+cipher_text = cipher.encrypt(msg.encode())
+encodedCard = b64encode(cipher_text)
+sys.stdout.buffer.write(encodedCard)
+```
+
+#### C# с использованием библиотеки Chilkat .NET for the 4.8.* Frameworks
+```csharp
+Chilkat.Rsa rsa = new Chilkat.Rsa();
+Chilkat.PublicKey pubkey = new Chilkat.PublicKey();
+pubkey.LoadFromFile("C://cardbankkey-sandbox.pub");
+string cardNumber = "4779642610000010";
+rsa.ImportPublicKeyObj(pubkey);
+rsa.OaepPadding = true;
+rsa.OaepHash = "sha256";
+string encCard = rsa.EncryptStringENC(cardNumber, false);
+Console.WriteLine(encCard);
+```
+
+#### Java с базовыми библиотеками crypto
+```java
+import lombok.SneakyThrows;
+import ru.alfabank.csp.api.decryptor.properties.CryptoServiceProperties;
+import javax.crypto.Cipher;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.PublicKey;
+
+public class CryptoServiceImpl {
+ private KeyStore keyStore;
+ private CryptoServiceProperties properties;
+
+ private PublicKey getPublicKey() throws KeyStoreException {
+ return keyStore.getCertificate(properties.getAlias()).getPublicKey();
+ }
+
+ @SneakyThrows
+ public byte[] encrypt(byte[] data) {
+ var rsaCipher = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
+ rsaCipher.init(Cipher.ENCRYPT_MODE, getPublicKey());
+ return rsaCipher.doFinal(data);
+ }
+}
+```
+
+#### PHP
+```php
+public function createCypher(string $pan): FunctionResult {
+ $publicKey = PublicKeyLoader::load(file_get_contents($this->cardBankKey));
+ $algo = $publicKey->withPadding(RSA::ENCRYPTION_OAEP)->withHash('sha256')->withMGFHash('sha1');
+ return FunctionResult::success(base64_encode($algo->encrypt($pan)));
+}
+```
+
+---
+
+### Навигация
+* ← [Введение](/products/alfa-api/documentation/articles/nominal-accounts/articles/intro/intro)
+* → [Как сформировать подпись](/products/alfa-api/documentation/articles/nominal-accounts/articles/signature/signature)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/intro.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/intro.md
new file mode 100644
index 0000000..8aee968
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/intro.md
@@ -0,0 +1,50 @@
+# Номинальные счета: Введение
+
+**Метка документа:** `H2H`
+
+> **Внимание**
+> Для использования сервиса у вас должен быть открыт номинальный счёт в Альфа-Банке.
+
+Сервис позволяет владельцам номинального счета совершать операции с денежными средствами, права на которые принадлежат другому лицу — бенефициару.
+
+### Кому подойдёт сервис
+
+- Финансовым и инвестиционным платформам;
+- Маркетплейсам;
+- Платформам, работающим с самозанятыми и фрилансерами;
+- Для индивидуальных проектов, где требуется обеспечить безопасность проведения расчётов между участниками сделки.
+
+### Как это работает
+
+Владелец счёта добавляет сведения о бенефициарах номинального счёта и универсальных реципиентах — [раздел Контрагенты](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/intro/intro), после чего может совершать операции с денежными средствами номинального счёта:
+
+- Идентифицировать поступаемые на номинальный счёт денежные средства — раздел [Идентификация пополнений номинального счёта](/products/alfa-api/documentation/articles/nominal-accounts/articles/identify-transactions/articles/intro/intro).
+- Осуществлять выплаты с номинального счёта удобным ему способом:
+ - [Безопасные сделки](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/intro/intro): деньги перейдут получателю только после выполнения условий сделки.
+ - [Прямые выплаты](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/intro/intro): выплаты без создания сделки – с биллингом (например, вывод средств бенефициара или уплата налога за исполнителя), или без биллинга (например, перевод зарегистрированному контрагенту).
+
+> **Важно**
+> Для работы с сервисом необходимо использовать электронную подпись. Допускается использование сертификата, выпущенного с помощью [сервиса Электронная подпись](/products/alfa-api/documentation/articles/signature/articles/intro/intro), или сертификата УКЭП, выпущенного в любом аккредитованном УЦ. Процесс формирования подписи описан [в статье Как сформировать подпись](/products/alfa-api/documentation/articles/nominal-accounts/articles/signature/signature).
+
+### Термины и определения
+
+**Номинальный счёт** — это специальный банковский счёт, открытый владельцем номинального счёта для совершения операций с денежными средствами, права на которые принадлежат другому лицу – бенефициару.
+
+**Владелец номинального счёта (клиент банка)** — лицо, которое открыло номинальный счёт и имеет право распоряжаться денежными средствами, получать информацию о движении денежных средств и закрыть номинальный счёт.
+
+**Бенефициар** — лицо, которому принадлежат права на денежные средства, находящиеся на номинальном счёте. У одного номинального счёта может быть как один, так и несколько бенефициаров, но каждый из них имеет права только на свою часть денежных средств.
+
+**Универсальный реципиент** — лицо, которое не является бенефициаром и не имеет права на денежные средства, находящиеся на номинальном счёте. Может выступать только в качестве реципиента (получателя) в безопасных сделках и при выплатах с номинального счёта.
+
+---
+
+### Навигация
+
+- ← [Получение подписанного реестра](/products/alfa-api/documentation/articles/factoring/articles/documents/v1/documents)
+- → [Как зашифровать номер карты](/products/alfa-api/documentation/articles/nominal-accounts/articles/cardtoken/cardtoken)
+
+---
+
+_Медиа-материалы:_
+
+- [Видео-презентация сервиса](/assets/developers-portal.docs.alfa-api/articles/nominal-accounts/articles/intro/files/nominal-accounts.mp4)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/signature.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/signature.md
new file mode 100644
index 0000000..d1c9c92
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/signature.md
@@ -0,0 +1,179 @@
+# Как сформировать подпись
+
+**H2H**
+
+### Подписание алгоритмом RSA
+
+> **Внимание**
+> Для подписания необходимо использовать RSA-сертификат, выпущенный с помощью [сервиса Электронная подпись](/products/alfa-api/documentation/articles/signature/signature).
+
+Для подписания алгоритмом RSA необходимо выполнить следующие шаги:
+
+#### 1. Подготовьте данные для подписи в формате JSON
+
+Подписываться должен весь блок данных тела запроса, исключая `digestSignatures`.
+
+#### 2. Выполните каноникализацию JSON-данных
+
+Используйте правила [RFC 8785](https://datatracker.ietf.org/doc/html/rfc8785).
+
+**Пример каноникализированного JSON-сообщения:**
+
+```json
+{
+ "company": { "accountNumber": "40702810201400022055" },
+ "externalId": "eb19f3ef-ca6a-4f84-a28f-c6e7b469b486",
+ "requisite": [
+ {
+ "payoutId": "b766f52d-f6e6-4a47-bd71-ab332bd0d314",
+ "payoutRequisite": {
+ "byPan": {
+ "comment": "Курьерские услуги за период с 1.12.2020-20.12.2020",
+ "pan": "JSv++SDzmKNPIBrLc0G2k3W8lx6DjsHwSFptBCGvUAkq7hVe7KWeACIjjTOAeFKujHQguSIKcqmX93rakldGsTa6c5iZTEAsyhBp5dcPLti8F9x90iXNvCUgvPEXGclqBNvTCuVGaNbmAWrGbogHTn4LKmxxrmzeMIL+e51/YFdTpTnJ384xhiYzAzX4XxFY2CsgNOlyN5xCesOjgeYz+UBlW0MCcY9c8AJBh7+DwU09+zlS0GNtpti7GoETeQrjUv6aPqqu2IMGfO116/xVheUdwLNhcDCT2uvbRpmk9B7pMuLuekGhaA1odvoTghjvY1d1RWnjyO4ZrHpBMpVesg=="
+ },
+ "payoutTotalAmount": "24.00",
+ "payoutType": "CARD"
+ },
+ "selfemployed": {
+ "name": "Диогенович",
+ "patronymic": "Камень",
+ "surname": "Безукоризненный"
+ }
+ }
+ ]
+}
+```
+
+#### 3. Сформируйте контейнер электронной подписи в формате PKCS#7 (CMS)
+
+Контейнер в виде структуры `ContentInfo` должен соответствовать стандарту [RFC 5652](https://www.ietf.org/rfc/rfc5652.txt).
+
+Для создания структуры, вычисления хэша и подписи используйте криптографические провайдеры (например, Bouncy Castle или OpenSSL).
+
+**Технические требования:**
+
+1. **Тип:** Рекомендуется присоединённая подпись.
+2. **Формат:** [RFC 5652](https://www.ietf.org/rfc/rfc5652.txt) (PKCS#7/CMS).
+3. **Алгоритм хэш-функции:** SHA-256 (OID 2.16.840.1.101.3.4.2.1).
+4. **Алгоритм подписи:** `sha256WithRSAEncryption`.
+
+Структура `SignedData`:
+
+```asn1
+SignedData ::= SEQUENCE {
+ version CMSVersion,
+ digestAlgorithms DigestAlgorithmIdentifiers,
+ encapContent Info EncapsulatedContentInfo,
+ certificates [0] IMPLICIT CertificateSet OPTIONAL,
+ crls [1] IMPLICIT Revocation InfoChoices OPTIONAL,
+ signerInfos SignerInfos
+}
+```
+
+Структура `SignerInfo`:
+
+```asn1
+SignerInfo ::= SEQUENCE {
+ version CMSVersion,
+ sid SignerIdentifier,
+ digestAlgorithm DigestAlgorithmIdentifier,
+ signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
+ signatureAlgorithm SignatureAlgorithmIdentifier,
+ signature SignatureValue,
+ unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL
+}
+```
+
+**Обязательные атрибуты в `signedAttrs`:**
+
+- ContentType = OID 1.2.840.113549.1.7.1
+- SigningTime = OID 1.2.840.113549.1.9.5
+- CMSAlgorithmProtection = OID 1.2.840.113549.1.9.52 (RFC 6211)
+- messageDigest = OID 1.2.840.113549.1.9.4
+
+_Примечание: Атрибут `unsignedAttrs` не используется._
+
+#### 4. Закодируйте контейнер и передайте подпись в запросе
+
+Полученный PKCS#7-контейнер закодируйте в `base64` и передайте в параметре `base64Encoded` массива `digestSignatures` в теле запроса.
+
+---
+
+### Примеры кода
+
+#### Пример формирования подписи на Java
+
+```java
+@Override
+public RsaSignResponse sign(RsaSignRequest request) throws Exception {
+ Security.addProvider(new BouncyCastleProvider());
+ BouncyCastleProvider provider = (BouncyCastleProvider) Security.getProvider("BC");
+ PrivateKey key = (PrivateKey) keyStore.getKey(KEYSTORE_ALIAS, KEYSTORE_PWD.toCharArray());
+ X509Certificate cert = (X509Certificate) keyStore.getCertificate(KEYSTORE_ALIAS);
+ CMSTypedData msg = new CMSProcessableByteArray(request.getDataToSign().getBytes());
+ CMSSignedDataGenerator signedDataGen = new CMSSignedDataGenerator();
+ X509CertificateHolder signCert = new X509CertificateHolder(cert.getEncoded());
+ ContentSigner signer = new JcaContentSignerBuilder("sha256WithRSAEncryption")
+ .setProvider(provider)
+ .build(key);
+ signedDataGen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(
+ new JcaDigestCalculatorProviderBuilder().setProvider(provider).build()
+ ).setDirectSignature(true).build(signer, signCert));
+ // добавляем сертификат в подпись
+ JcaCertStore certs = new JcaCertStore(Collections.singletonList(cert));
+ signedDataGen.addCertificates(certs);
+ CMSSignedData signedData = signedDataGen.generate(msg, true);
+ byte[] signatureBytes = signedData.getEncoded("DER");
+ MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
+ byte[] hashedString = messageDigest.digest(request.getDataToSign().getBytes());
+ return new RsaSignResponse()
+ .base64Encoded(new String(Base64.getEncoder().encode(signatureBytes)));
+}
+```
+
+#### Пример формирования подписи на PHP
+
+```php
+public function sign(string $data, string $password = null): string
+{
+ $key = file_get_contents($this->private_key);
+ $cert = file_get_contents($this->certificate);
+ $privateKey = openssl_pkey_get_private($key, $password ?: $this->private_key_password);
+ $certid = openssl_x509_read($cert);
+ $inputTmpFile = tmpfile();
+ fwrite($inputTmpFile, $data);
+ fseek($inputTmpFile, 0);
+ $outputTmpFile = tmpfile();
+ openssl_pkcs7_sign(
+ stream_get_meta_data($inputTmpFile)['uri'],
+ stream_get_meta_data($outputTmpFile)['uri'],
+ $certid,
+ $privateKey,
+ [],
+ PKCS7_ATTACHED
+ );
+ fseek($outputTmpFile, 0);
+ $signature = fread($outputTmpFile, filesize(stream_get_meta_data($outputTmpFile)['uri']));
+ $signature = trim(explode("\n\n", $signature, 2)[1]);
+ fclose($inputTmpFile);
+ fclose($outputTmpFile);
+ return str_replace("\n", '', $signature);
+}
+```
+
+---
+
+### Подписание алгоритмом ГОСТ с использованием сертификата УКЭП
+
+Для подписания может использоваться сертификат УКЭП, выпущенный любым аккредитованным УЦ. Если сертификат выдан уполномоченному лицу (не руководителю по уставу), дополнительно потребуется машиночитаемая доверенность (МЧД).
+
+1. Сформируйте электронную подпись с использованием криптопровайдера **КриптоПро CSP**.
+2. Закодируйте полученное значение **отсоединённой** электронной подписи в формат `base64`.
+3. Передайте значение в параметре `base64Encoded` массива `digestSignatures`.
+
+---
+
+**Навигация:**
+
+- [Как зашифровать номер карты](/products/alfa-api/documentation/articles/nominal-accounts/articles/cardtoken/cardtoken)
+- [Получение списка номинальных счетов](/products/alfa-api/documentation/articles/nominal-accounts/articles/get-accounts/v1/get-accounts)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/add-deal.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/add-deal.md
new file mode 100644
index 0000000..907cf40
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/add-deal.md
@@ -0,0 +1,106 @@
+# Регистрация сделки
+
+**Тип интеграции:** H2H
+
+## Эндпоинты
+
+- **Песочница:** `POST https://sandbox.alfabank.ru/api/na/jp/v1/deals`
+- **Пром:** `POST https://baas.alfabank.ru/api/na/jp/v1/deals`
+
+## Scope
+
+`deals`
+
+## Описание
+
+Метод позволяет зарегистрировать новую сделку в статусе `DRAFT`.
+
+> **Важно:** Для создания сделки необходимо наличие открытого номинального счёта в Банке.
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | application/json |
+| **Content-Type** | string | required | application/json |
+
+### BODY
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------------------- | :----- | :------------- | :----------------------------------------------- |
+| **accountNumber** | string | required | Номер номинального счёта |
+| **expireDate** | string | required | Дата истечения сделки |
+| **digestSignatures** | array | required | Электронная подпись УЛ клиента (массив объектов) |
+| — **base64Encoded** | string | required | Значение электронной подписи в Base64 |
+| — **signatureType** | string | required | Тип подписи: `rsa` (RSA) или `kep` (КЭП) |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location 'https://baas.alfabank.ru/api/na/jp/v1/deals' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json' \
+--data '{
+ "accountNumber": "40817810306050000000",
+ "expireDate": "2032-03-02",
+ "digestSignatures": [
+ {
+ "base64Encoded": "SEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDICExIAVH4YMX0u3fEONSkAAQBUfhgwCgYIKoUDBwEBAQEEQBU0EntPGWz8EfJ5CFL2m10xeBrkAEeWDglGQDZWLKQ0ff4TyBT9X1NhG/+ETj4TcQhExy6k+WZ9w/CpF5FjyyA=",
+ "signatureType": "rsa"
+ }
+ ]
+}'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------------- | :------ | :------------- | :--------------------------------------------- |
+| **dealId** | string | required | Идентификатор сделки |
+| **status** | string | required | Статус сделки: `DRAFT` (принята для обработки) |
+| **expireDate** | string | required | Дата истечения сделки |
+| **isValid** | boolean | required | Флаг валидности сделки |
+
+**Пример JSON:**
+
+```json
+{
+ "dealId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "status": "DRAFT",
+ "expireDate": "2032-03-02",
+ "isValid": false
+}
+```
+
+---
+
+## Коды ошибок
+
+| Код | Ошибка | Описание |
+| :------ | :------------------- | :------------------------------------------------------------ |
+| **400** | `invalid_request` | Неверные входные параметры запроса |
+| **401** | `invalid_token` | Токен просрочен, отозван или недействителен |
+| **403** | `insufficient_scope` | Нет прав на использование сервиса (ошибка в настройках scope) |
+| **404** | `unknown_endpoint` | Эндпоинт не найден или неактивен |
+| **429** | — | Слишком много запросов (Too Many Requests) |
+| **500** | `internal_error` | Внутренняя ошибка сервиса |
+| **503** | — | Сервис временно недоступен |
+
+---
+
+**Навигация:**
+
+- [← Как это работает](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/intro/intro)
+- [Получение списка сделок →](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/get-deals/v1/get-deals)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/add-step.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/add-step.md
new file mode 100644
index 0000000..428adb5
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/add-step.md
@@ -0,0 +1,136 @@
+# Выполнение действия по этапам сделки
+
+tags: `H2H`
+
+### Эндпоинты
+
+- **Песочница:** `POST https://sandbox.alfabank.ru/api/na/jp/v1/deals/steps`
+- **Пром:** `POST https://baas.alfabank.ru/api/na/jp/v1/deals/steps`
+
+### Scope
+
+`deals`
+
+### Описание
+
+> **Важно**
+>
+> - Создание этапа сделки происходит в синхронном режиме.
+> - Завершение этапа сделки происходит в асинхронном режиме.
+
+Метод позволяет создать и завершить этап сделки.
+
+#### Создание этапа сделки
+
+После [регистрации сделки](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/add-deal/v1/add-deal) необходимо создать этапы сделки для совершения финансовых операций. Этап сделки можно создать только для сделок в статусе `DRAFT`.
+
+- Если сделка предполагает совершение переводов денежных средств одновременно всем реципиентам, то достаточно создать один этап сделки.
+- Если переводы денежных средств должны совершаться последовательно в несколько этапов, то следует создать соответствующее количество этапов сделки.
+
+#### Завершение этапа сделки
+
+При наступлении момента проведения расчётов по этапу сделки необходимо инициировать завершение этапа сделки. При завершении этапа сделки происходят все финансовые операции между участниками этапа сделки, и он переходит в статус `COMPLETED`.
+
+- Если при [добавлении реципиента](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/step-contractors/v1/step-contractors) в этап сделки был проставлен признак `keepOnNominalAccount = false`, то денежные средства переводятся с захолдированного кошелька депонента на основной и налоговый кошельки реципиента, холдируются там, а затем производится выплата по реквизитам реципиента с номинального счёта.
+- Если был проставлен признак `keepOnNominalAccount = true`, то денежные средства переводятся на кошельки реципиента внутри системы без фактического перевода с номинального счёта.
+
+Завершить этап сделки можно только после [подтверждения сделки](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/deal-actions/v1/deal-actions).
+
+---
+
+### Параметры запроса
+
+#### Headers
+
+| Атрибут | Описание | Тип | Обязательность |
+| :---------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- | :----- | :------------- |
+| **Authorization** | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) | string | required |
+| **Accept** | application/json | string | required |
+| **Content-Type** | application/json | string | required |
+
+#### Body
+
+| Атрибут | Описание | Тип | Обязательность |
+| :------------------- | :------------------------------------------------------------------- | :--------------- | :------------- |
+| **dealId** | Идентификатор сделки | string | required |
+| **stepId** | Идентификатор этапа сделки | string | optional |
+| **action** | Действие по этапу сделки: `CREATE` (создать), `COMPLETE` (завершить) | string | required |
+| **description** | Описание этапа сделки (при создании) | string | optional |
+| **digestSignatures** | Массив объектов: Электронная подпись УЛ клиента | array of objects | required |
+| └ **base64Encoded** | Значение электронной подписи в Base64 | string | required |
+| └ **signatureType** | Тип подписи: `rsa` или `kep` | string | required |
+
+---
+
+### Пример запроса (cURL)
+
+```bash
+curl --location 'https://baas.alfabank.ru/api/na/jp/v1/deals/steps' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json' \
+--data '{
+ "dealId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "stepId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "action": "CREATE",
+ "description": "Этап 1",
+ "digestSignatures": [
+ {
+ "base64Encoded": "SEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDICExIAVH4YMX0u3fEONSkAAQBUfhgwCgYIKoUDBwEBAQEEQBU0EntPGWz8EfJ5CFL2m10xeBrkAEeWDglGQDZWLKQ0ff4TyBT9X1NhG/+ETj4TcQhExy6k+WZ9w/CpF5FjyyA=",
+ "signatureType": "rsa"
+ }
+ ]
+}'
+```
+
+---
+
+### Параметры ответа
+
+#### Успешное создание (200 OK)
+
+| Атрибут | Описание | Тип |
+| :-------------- | :------------------------- | :------ |
+| **dealId** | Идентификатор сделки | string |
+| **stepId** | Идентификатор этапа сделки | string |
+| **stepNumber** | Порядковый номер этапа | integer |
+| **description** | Описание этапа | string |
+
+**Пример ответа 200:**
+
+```json
+{
+ "dealId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "stepId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "stepNumber": 1,
+ "description": "Этап 1"
+}
+```
+
+#### Запрос принят (202 Accepted) — при завершении этапа
+
+| Атрибут | Описание | Тип |
+| :------------ | :----------------------------------------------------------------------------------------------- | :----- |
+| **status** | Статус запроса: `FAILED`, `TIMEOUT`, `PENDING`, `PAYMENT_FAILED`, `TRANSFER_FAILED`, `COMPLETED` | string |
+| **requestId** | Идентификатор запроса | string |
+
+---
+
+### Ошибки
+
+| Код | Описание (error / error_description) |
+| :-------------------------- | :------------------------------------------------------- |
+| **400 Bad Request** | `invalid_request` — неверные входные параметры |
+| **401 Unauthorized** | `invalid_token` — токен просрочен или недействителен |
+| **403 Forbidden** | `insufficient_scope` — нет прав на использование сервиса |
+| **404 Not Found** | `unknown_endpoint` — эндпоинт не найден |
+| **429 Too Many Requests** | Превышен лимит запросов (тело ответа отсутствует) |
+| **500 Internal Error** | `internal_error` — внутренняя ошибка сервиса |
+| **503 Service Unavailable** | Сервис недоступен (тело ответа отсутствует) |
+
+---
+
+**Навигация:**
+
+- Предыдущий раздел: [Выполнение действия по сделке](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/deal-actions/v1/deal-actions)
+- Следующий раздел: [Получение статуса запроса на завершение этапа сделки](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/get-deal-request-status/v1/get-deal-request-status)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/deal-actions.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/deal-actions.md
new file mode 100644
index 0000000..d3f4307
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/deal-actions.md
@@ -0,0 +1,126 @@
+# Выполнение действия по сделке
+
+tags: **H2H**
+
+### Эндпоинты
+
+- **Песочница:** `PATCH https://sandbox.alfabank.ru/api/na/jp/v1/deals/action`
+- **Пром:** `PATCH https://baas.alfabank.ru/api/na/jp/v1/deals/action`
+
+---
+
+### Scope
+
+`deals`
+
+### Описание
+
+Метод позволяет подтвердить, отменить или завершить сделку.
+
+#### Подтверждение сделки
+
+При успешном подтверждении сделки денежные средства депонентов холдируются в сумме, необходимой для проведения расчётов в рамках текущей сделки для каждого этапа сделки, и сделка переходит из статуса `DRAFT` в статус `ACTIVE`.
+
+#### Отмена сделки
+
+При успешной отмене сделки ранее захолдированные денежные средства депонентов расхолдируются и становятся доступны для использования в расчётах (если сделка была ранее подтверждена), и сделка переходит в статус `CLOSED`.
+
+#### Завершение сделки
+
+При успешном завершении сделка переходит в статус `COMPLETED`.
+
+> **Важно**
+> Завершить сделку можно, только если все [этапы сделки завершены](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/add-step/v1/add-step).
+
+---
+
+### Параметры запроса
+
+#### HEADERS
+
+| Атрибут | Описание |
+| :---------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** _string, required_ | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** _string, required_ | application/json |
+| **Content-Type** _string, required_ | application/json |
+
+#### BODY
+
+| Атрибут | Описание |
+| :----------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| **dealId** _string, required_ | Идентификатор сделки |
+| **action** _string, required_ | Действие по сделке. Возможные значения:
`ACCEPT` — подтвердить сделку;
`COMPLETE` — завершить сделку;
`CANCEL` — отменить сделку.
|
+| **digestSignatures** _array of objects, required_ | Электронная подпись УЛ клиента |
+| **└ base64Encoded** _string, required_ | Значение электронной подписи, закодированное в Base64 |
+| **└ signatureType** _string, required_ | Тип электронной подписи. Возможные значения:
`rsa` — RSA;
`kep` — КЭП.
|
+
+---
+
+### Пример запроса
+
+```bash
+curl --location --request PATCH 'https://baas.alfabank.ru/api/na/jp/v1/deals/action' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json' \
+--data '{
+ "dealId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "action": "ACCEPT",
+ "digestSignatures": [
+ {
+ "base64Encoded": "SEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDICExIAVH4YMX0u3fEONSkAAQBUfhgwCgYIKoUDBwEBAQEEQBU0EntPGWz8EfJ5CFL2m10xeBrkAEeWDglGQDZWLKQ0ff4TyBT9X1NhG/+ETj4TcQhExy6k+WZ9w/CpF5FjyyA=",
+ "signatureType": "rsa"
+ }
+ ]
+}'
+```
+
+---
+
+### Параметры ответа
+
+**204 No Content**
+_Нет тела ответа_
+
+**400 Bad Request**
+| Атрибут | Описание |
+| :--- | :--- |
+| **error** _string, required_ | Код ошибки: `invalid_request` — неверные входные параметры запроса |
+| **error_description** _string, optional_ | Описание ошибки |
+
+**401 Unauthorized**
+| Атрибут | Описание |
+| :--- | :--- |
+| **error** _string, required_ | Код ошибки: `invalid_token` — токен просрочен, отозван или недействителен |
+| **error_description** _string, optional_ | Описание ошибки |
+
+**403 Forbidden**
+| Атрибут | Описание |
+| :--- | :--- |
+| **error** _string, required_ | Код ошибки: `insufficient_scope` — нет прав на использование сервиса (настройки scope) |
+| **error_description** _string, optional_ | Описание ошибки |
+
+**404 Not Found**
+| Атрибут | Описание |
+| :--- | :--- |
+| **error** _string, required_ | Код ошибки: `unknown_endpoint` — эндпоинт не найден или неактивен |
+| **error_description** _string, optional_ | Описание ошибки |
+
+**429 Too Many Requests**
+_Нет тела ответа_
+
+**500 Internal Server Error**
+| Атрибут | Описание |
+| :--- | :--- |
+| **error** _string, required_ | Код ошибки: `internal_error` — внутренняя ошибка сервиса |
+| **error_description** _string, optional_ | Описание ошибки |
+
+**503 Service Unavailable**
+_Нет тела ответа_
+
+---
+
+### Навигация
+
+- [← Получение списка платежей по сделке](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/get-deal-payoffs/v1/get-deal-payoffs)
+- [Выполнение действия по этапам сделки →](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/add-step/v1/add-step)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/deal-is-valid.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/deal-is-valid.md
new file mode 100644
index 0000000..ce18ed5
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/deal-is-valid.md
@@ -0,0 +1,97 @@
+# Проверка возможности осуществления выплат по сделке
+
+tags: `H2H`
+
+## Эндпоинты
+
+**Песочница**
+`PATCH https://sandbox.alfabank.ru/api/na/jp/v1/deals/{dealId}/is-valid`
+
+**Пром**
+`PATCH https://baas.alfabank.ru/api/na/jp/v1/deals/{dealId}/is-valid`
+
+## Scope
+
+`deals`
+
+## Описание
+
+Метод позволяет проверить возможность осуществления платежей по сделке по `dealId`:
+
+- проверяет правильность формирования сделки;
+- проверяет балансы бенефициаров;
+- сверяет суммы участников сделки.
+
+> **Важно**
+> Проверка доступна только для сделок в статусе `DRAFT`.
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Описание |
+| :---------------- | :---------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string (required) | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string (required) | application/json |
+
+### PATH
+
+| Атрибут | Тип | Описание |
+| :--------- | :---------------- | :------------------- |
+| **dealId** | string (required) | Идентификатор сделки |
+
+### Пример запроса (cURL)
+
+```bash
+curl --location --globoff --request PATCH 'https://baas.alfabank.ru/api/na/jp/v1/deals/{dealId}/is-valid' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### 200 OK
+
+**Пример ответа:**
+
+```json
+{
+ "dealId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "isValid": true,
+ "description": [
+ "Неверная сумма депонированных средств по этапу сделки ab9cbb96-360a-4462-a683-955cc29f7f54;"
+ ]
+}
+```
+
+**Структура тела (BODY):**
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **dealId** | string (required) | Идентификатор сделки |
+| **isValid** | boolean (required) | Результат прохождения проверки: `true` — сделка прошла валидацию; `false` — сделка не прошла валидацию. |
+| **description** | array of strings (optional) | Описание ошибок. Возвращается при неудачном прохождении валидации. |
+
+---
+
+### Коды ошибок
+
+| Код | Описание | Атрибуты ответа |
+| :------ | :------------------ | :-------------------------------------------------------------------------- |
+| **400** | Bad Request | `error`: `invalid_request` — неверные входные параметры запроса. |
+| **401** | Unauthorized | `error`: `invalid_token` — токен просрочен, отозван или недействителен. |
+| **403** | Forbidden | `error`: `insufficient_scope` — недостаточно прав на использование сервиса. |
+| **404** | Not Found | `error`: `unknown_endpoint` — эндпоинт не найден или неактивен. |
+| **429** | Too Many Requests | Нет тела ответа. |
+| **500** | Internal Error | `error`: `internal_error` — внутренняя ошибка сервиса. |
+| **503** | Service Unavailable | Нет тела ответа. |
+
+---
+
+## Навигация
+
+- **Назад:** [Получение информации о сделке](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/get-deal/v1/get-deal)
+- **Вперед:** [Получение списка платежей по сделке](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/get-deal-payoffs/v1/get-deal-payoffs)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-contractors.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-contractors.md
new file mode 100644
index 0000000..25fc6f9
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-contractors.md
@@ -0,0 +1,105 @@
+# Получение информации об участниках этапа сделки
+
+tags: `H2H`
+
+Метод позволяет получить информацию об участниках этапа сделки по `dealId` и `stepId`.
+
+## Эндпоинты
+
+| Окружение | Метод и URL |
+| :------------ | :--------------------------------------------------------------------------------------- |
+| **Песочница** | `GET https://sandbox.alfabank.ru/api/na/jp/v1/deals/{dealId}/steps/{stepId}/contractors` |
+| **Пром** | `GET https://baas.alfabank.ru/api/na/jp/v1/deals/{dealId}/steps/{stepId}/contractors` |
+
+**Scope:** `deals`
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Описание | Тип | Обязательность |
+| :---------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- | :----- | :------------- |
+| **Authorization** | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) | string | required |
+| **Accept** | application/json | string | required |
+
+### QUERY
+
+| Атрибут | Описание | Тип | Обязательность |
+| :--------------- | :----------------------------------------------------------------------------------------------------------- | :----- | :------------- |
+| **contractorId** | Идентификатор участника сделки | string | optional |
+| **role** | Роль участника этапа сделки. Возможные значения: • `DEPONENT` — плательщик; • `RECIPIENT` — получатель | string | optional |
+
+### PATH
+
+| Атрибут | Описание | Тип | Обязательность |
+| :--------- | :------------------------- | :----- | :------------- |
+| **dealId** | Идентификатор сделки | string | required |
+| **stepId** | Идентификатор этапа сделки | string | required |
+
+---
+
+## Пример запроса
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/deals/{dealId}/steps/{stepId}/contractors?contractorId=ab9cbb96-360a-4462-a683-955cc29f7f54&role={role}' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### Пример ответа 200 (OK)
+
+```json
+[
+ {
+ "beneficiaryId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "role": "DEPONENT",
+ "amount": "10.00",
+ "purpose": "Назначение платежа",
+ "requisiteId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "keepOnNominalAccount": true,
+ "amounts": [
+ {
+ "walletType": "MAIN",
+ "amount": "10.00"
+ }
+ ]
+ }
+]
+```
+
+### BODY (Успешный ответ)
+
+| Атрибут | Описание | Тип | Обязательность |
+| :----------------------- | :----------------------------------------------------------------------------------------------------------------------------------- | :--------------- | :------------- |
+| **beneficiaryId** | Идентификатор бенефициара или универсального реципиента | string | optional |
+| **role** | Роль участника этапа сделки: `DEPONENT` (плательщик), `RECIPIENT` (получатель) | string | optional |
+| **amount** | Сумма депонирования в рублях | string | optional |
+| **purpose** | Назначение платежа реципиента | string | optional |
+| **requisiteId** | Идентификатор платёжного реквизита реципиента | string | optional |
+| **keepOnNominalAccount** | Признак вывода денег на виртуальный счёт: • `true` — оставить в рамках номинального счёта; • `false` — вывести по ID реквизита | boolean | optional |
+| **amounts** | Массив объектов: Суммы реципиента | array of objects | optional |
+
+**Вложенные поля `amounts`:**
+
+- **walletType** (string, optional): Тип суммы (`MAIN` — основная, `TAX` — налоговая).
+- **amount** (string, optional): Сумма в рублях.
+
+---
+
+## Коды ошибок
+
+| Код | Описание | Возможные значения `error` |
+| :------ | :------------------ | :------------------------------------------------------- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры |
+| **401** | Unauthorized | `invalid_token` — токен просрочен или недействителен |
+| **403** | Forbidden | `insufficient_scope` — нет прав на использование сервиса |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден |
+| **429** | Too Many Requests | Нет тела ответа |
+| **500** | Internal Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа |
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-deal-payoffs.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-deal-payoffs.md
new file mode 100644
index 0000000..a3aa811
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-deal-payoffs.md
@@ -0,0 +1,94 @@
+# Получение списка платежей по сделке
+
+tags: `H2H`
+
+Метод позволяет получить список выплат по сделке по идентификатору `dealId`.
+
+## Эндпоинты
+
+- **Песочница:** `GET https://sandbox.alfabank.ru/api/na/jp/v1/deals/{dealId}/payoffs`
+- **Пром:** `GET https://baas.alfabank.ru/api/na/jp/v1/deals/{dealId}/payoffs`
+
+## Scope
+
+`deals`
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | `application/json` |
+
+### PATH
+
+| Атрибут | Тип | Обязательность | Описание |
+| :--------- | :----- | :------------- | :------------------- |
+| **dealId** | string | required | Идентификатор сделки |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/deals/{dealId}/payoffs' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа (200 OK)
+
+### BODY (JSON)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------------- | :----- | :------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **stepId** | string | required | Идентификатор этапа сделки |
+| **payoffId** | string | required | Идентификатор платежа |
+| **payoffType** | string | required | Тип платежа: • `EXTERNAL` — внешний (выплата с номинального счёта) • `INTERNAL` — внутренний (выплата внутри номинального счёта) |
+| **deponentId** | string | required | Идентификатор депонента |
+| **recipientId** | string | required | Идентификатор реципиента |
+| **amount** | string | required | Сумма в рублях |
+| **status** | string | required | Статус запроса: • `PENDING` — запрос в процессе обработки • `MANUAL_ACCEPTANCE` — ожидание ручного подтверждения запроса-дубля • `AWAIT_EXTERNAL` — ожидание исполнения внешнего платежа • `FAILED` — ошибка обработки • `FAILED_DUPLICATE` — дубль отклонен • `COMPLETE` — успешно завершено |
+
+### Пример ответа 200
+
+```json
+[
+ {
+ "stepId": "f099f9dd-d5e7-4ab3-89f5-24932aa808ad",
+ "payoffId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "payoffType": "EXTERNAL",
+ "deponentId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "recipientId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "amount": "100.00",
+ "status": "PENDING"
+ }
+]
+```
+
+---
+
+## Коды ошибок
+
+| Код | Описание | Тело ответа (основные атрибуты) |
+| :------ | :------------------ | :---------------------------------------------------- |
+| **400** | Bad Request | `error`: `invalid_request` — неверные параметры |
+| **401** | Unauthorized | `error`: `invalid_token` — токен недействителен |
+| **403** | Forbidden | `error`: `insufficient_scope` — нет прав доступа |
+| **404** | Not Found | `error`: `unknown_endpoint` — эндпоинт не найден |
+| **429** | Too Many Requests | Нет тела ответа |
+| **500** | Internal Error | `error`: `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа |
+
+---
+
+**Навигация:**
+
+- Предыдущий метод: [Проверка возможности осуществления выплат по сделке](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/deal-is-valid/v1/deal-is-valid)
+- Следующий метод: [Выполнение действия по сделке](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/deal-actions/v1/deal-actions)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-deal-request-status.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-deal-request-status.md
new file mode 100644
index 0000000..b64df6a
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-deal-request-status.md
@@ -0,0 +1,116 @@
+# Получение статуса запроса на завершение этапа сделки
+
+tags: **H2H**
+
+## Эндпоинты
+
+| Среда | Метод и URL |
+| :------------ | :---------------------------------------------------------------------------------------- |
+| **Песочница** | `GET https://sandbox.alfabank.ru/api/na/jp/v1/deals/{dealId}/requests/{requestId}/status` |
+| **Пром** | `GET https://baas.alfabank.ru/api/na/jp/v1/deals/{dealId}/requests/{requestId}/status` |
+
+## Scope
+
+`deals`
+
+## Описание
+
+Метод позволяет получить статус запроса на завершение этапа сделки по `requestId`.
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | application/json |
+
+### PATH
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------------ | :----- | :------------- | :-------------------- |
+| **dealId** | string | required | Идентификатор сделки |
+| **requestId** | string | required | Идентификатор запроса |
+
+## Пример запроса
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/deals/{dealId}/requests/{requestId}/status' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+## Параметры ответа
+
+### 200 (OK)
+
+**Пример тела ответа:**
+
+```json
+{
+ "requestId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "status": "COMPLETE",
+ "description": "Произошла техническая ошибка. Обратитесь в службу поддержки и сообщите код ошибки afc9b019-77ac-49ef-afb9-688b38b74cc2"
+}
+```
+
+**Описание полей (BODY):**
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **requestId** | string | required | Идентификатор запроса |
+| **status** | string | required | Статус запроса. Возможные значения:
+`FAILED` — ошибка обработки;
+`TIMEOUT` — превышено время ожидания;
+`PENDING` — в процессе обработки;
+`PAYMENT_FAILED` — неудача внешнего платежа;
+`TRANSFER_FAILED` — неудача внутреннего платежа (внутри НС);
+`COMPLETED` — успешно завершено. |
+| **description** | string | optional | Описание причины, по которой запрос завершился неудачей. Возвращается, если статус равен `FAILED`. |
+
+---
+
+### Ошибки
+
+#### 400 Bad Request
+
+| Атрибут | Тип | Описание |
+| :-------------------- | :----- | :----------------------------------------------------- |
+| **error** | string | `invalid_request` — неверные входные параметры запроса |
+| **error_description** | string | Описание ошибки |
+
+#### 401 Unauthorized
+
+| Атрибут | Тип | Описание |
+| :-------------------- | :----- | :------------------------------------------------------------ |
+| **error** | string | `invalid_token` — токен просрочен, отозван или недействителен |
+| **error_description** | string | Описание ошибки |
+
+#### 403 Forbidden
+
+| Атрибут | Тип | Описание |
+| :-------------------- | :----- | :----------------------------------------------------------------------------- |
+| **error** | string | `insufficient_scope` — нет прав на использование сервиса (недостаточный scope) |
+| **error_description** | string | Описание ошибки |
+
+#### 404 Not Found
+
+| Атрибут | Тип | Описание |
+| :-------------------- | :----- | :---------------------------------------------------- |
+| **error** | string | `unknown_endpoint` — эндпоинт не найден или неактивен |
+| **error_description** | string | Описание ошибки |
+
+#### 429 Too Many Requests
+
+Нет тела ответа. Превышен лимит запросов.
+
+#### 500 Internal Server Error
+
+| Атрибут | Тип | Описание |
+| :-------------------- | :----- | :------------------------------------------- |
+| **error** | string | `internal_error` — внутренняя ошибка сервиса |
+| **error_description** | string | Описание ошибки |
+
+#### 503 Service Unavailable
+
+Нет тела ответа. Сервис временно недоступен.
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-deal.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-deal.md
new file mode 100644
index 0000000..9a9b175
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-deal.md
@@ -0,0 +1,100 @@
+Приношу извинения, в предыдущем ответе могли проскочить остаточные элементы структуры. Вот полностью очищенный от HTML-тегов, спецсимволов и лишней разметки текст в формате Markdown.
+
+---
+
+# Получение информации о сделке
+
+**Тип интеграции:** H2H
+**Scope:** `deals`
+
+## Эндпоинты
+
+* **Песочница:** `GET https://sandbox.alfabank.ru/api/na/jp/v1/deals/{dealId}`
+* **Пром:** `GET https://baas.alfabank.ru/api/na/jp/v1/deals/{dealId}`
+
+## Описание
+Метод позволяет получить детальную информацию о сделке по идентификатору `dealId`.
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| Authorization | string | Да | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| Accept | string | Да | application/json |
+
+### PATH
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| dealId | string | Да | Идентификатор сделки |
+
+## Пример запроса
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/deals/{dealId}' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа (200 OK)
+
+### Пример тела ответа
+```json
+{
+ "dealId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "status": "DRAFT",
+ "expireDate": "2032-03-02",
+ "isValid": false,
+ "steps": [
+ {
+ "id": "f099f9dd-d5e7-4ab3-89f5-24932aa808ad",
+ "description": "Этап 1",
+ "stepNumber": 1,
+ "status": "NEW",
+ "isValid": false
+ }
+ ]
+}
+```
+
+### Структура ответа (BODY)
+
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **dealId** | string | Да | Идентификатор сделки |
+| **status** | string | Да | Статус сделки. Возможные значения: `DRAFT` (принята), `ACTIVE` (успешно обработана), `BLOCKED` (ошибка обработки), `PAYMENT_FAILED` (ошибка платежа), `CLOSED` (отменена), `COMPLETED` (успешно завершена) |
+| **expireDate** | string | Да | Дата истечения сделки |
+| **isValid** | boolean | Да | Флаг валидности сделки |
+| **steps** | array | Нет | Данные об этапах сделки (список объектов) |
+
+### Параметры этапа сделки (внутри массива steps)
+
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **id** | string | Да | Идентификатор этапа |
+| **description** | string | Да | Описание этапа |
+| **stepNumber** | integer | Да | Порядковый номер этапа |
+| **status** | string | Да | Статус этапа: `NEW` (принят), `IN_PROGRESS` (в обработке), `PAYMENT_FAILED` (ошибка платежа), `COMPLETED` (завершен) |
+| **isValid** | string | Да | Флаг валидности этапа |
+
+---
+
+## Коды ответов и ошибок
+
+| Код | Описание | Значение error / error_description |
+| :--- | :--- | :--- |
+| **200** | OK | Успешное получение информации |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры |
+| **401** | Unauthorized | `invalid_token` — токен просрочен, отозван или неверный формат |
+| **403** | Forbidden | `insufficient_scope` — нет прав на использование сервиса (проверьте scope) |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден или неактивен |
+| **429** | Too Many Requests | Превышено количество запросов (без тела ответа) |
+| **500** | Internal Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Сервис временно недоступен (без тела ответа) |
+
+---
+**Навигация:**
+[← Получение списка сделок](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/get-deals/v1/get-deals) | [Проверка возможности выплат →](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/deal-is-valid/v1/deal-is-valid)
+
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-deals.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-deals.md
new file mode 100644
index 0000000..11550c1
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-deals.md
@@ -0,0 +1,111 @@
+# Получение списка сделок
+**H2H**
+
+Метод позволяет получить список всех сделок (независимо от статуса) по номинальному счёту с момента его открытия.
+
+## Эндпоинты
+
+| Окружение | Метод | URL |
+| :--- | :--- | :--- |
+| **Песочница** | `GET` | `https://sandbox.alfabank.ru/api/na/jp/v1/deals` |
+| **Пром** | `GET` | `https://baas.alfabank.ru/api/na/jp/v1/deals` |
+
+**Scope:** `deals`
+
+---
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | application/json |
+
+### QUERY
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **accountNumber** | string | required | Номер номинального счёта |
+| **limit** | integer | optional | Количество объектов на одной странице |
+| **offset** | integer | optional | Количество объектов в списке, которые необходимо пропустить |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/deals?accountNumber={accountNumber}&limit=100&offset={offset}' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### 200 OK
+Пример тела ответа:
+```json
+{
+ "pagination": {
+ "limit": 100,
+ "offset": 0,
+ "totalCount": 1
+ },
+ "deals": [
+ {
+ "dealId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "status": "DRAFT",
+ "expireDate": "2032-03-02",
+ "isValid": false,
+ "steps": [
+ {
+ "id": "f099f9dd-d5e7-4ab3-89f5-24932aa808ad",
+ "description": "Этап 1",
+ "stepNumber": 1,
+ "status": "NEW",
+ "isValid": false
+ }
+ ]
+ }
+ ]
+}
+```
+
+#### Описание полей ответа (200 OK)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **pagination** | object | optional | Данные пагинации |
+| ∟ **limit** | number | optional | Количество записей на одной странице |
+| ∟ **offset** | number | optional | Количество записей в списке, которые были пропущены |
+| ∟ **totalCount** | number | optional | Общее количество записей |
+| **deals** | array | optional | Данные о сделках |
+| ∟ **dealId** | string | required | Идентификатор сделки |
+| ∟ **status** | string | required | Статус сделки: `DRAFT`, `ACTIVE`, `BLOCKED`, `PAYMENT_FAILED`, `CLOSED`, `COMPLETED` |
+| ∟ **expireDate** | string | required | Дата истечения сделки |
+| ∟ **isValid** | boolean | required | Флаг валидности сделки |
+| ∟ **steps** | array | optional | Данные об этапах сделки |
+| ∟ ∟ **id** | string | required | Идентификатор этапа сделки |
+| ∟ ∟ **description** | string | required | Описание этапа сделки |
+| ∟ ∟ **stepNumber** | integer | required | Порядковый номер этапа сделки |
+| ∟ ∟ **status** | string | required | Статус этапа: `NEW`, `IN_PROGRESS`, `PAYMENT_FAILED`, `COMPLETED` |
+| ∟ ∟ **isValid** | boolean | required | Флаг валидности этапа сделки |
+
+---
+
+## Ошибки
+
+| Код | Описание (error) | error_description |
+| :--- | :--- | :--- |
+| **400** | `invalid_request` | Неверные входные параметры запроса |
+| **401** | `invalid_token` | Токен просрочен, отозван или имеет неправильный формат |
+| **403** | `insufficient_scope` | Нет прав на использование сервиса (настройки scope) |
+| **404** | `unknown_endpoint` | Эндпоинт не найден или неактивен |
+| **429** | — | Слишком много запросов (нет тела ответа) |
+| **500** | `internal_error` | Внутренняя ошибка сервиса |
+| **503** | — | Сервис недоступен (нет тела ответа) |
+
+---
+**Навигация:**
+[← Регистрация сделки](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/add-deal/v1/add-deal) | [Получение информации о сделке →](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/get-deal/v1/get-deal)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-step.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-step.md
new file mode 100644
index 0000000..470c1c9
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-step.md
@@ -0,0 +1,98 @@
+# Получение информации об этапе сделки
+
+**Тип интеграции:** H2H
+**Scope:** `deals`
+
+Метод позволяет получить детальную информацию об этапе сделки по `dealId` и `stepId`.
+
+---
+
+## Эндпоинты
+
+| Среда | Метод и URL |
+| :------------ | :--------------------------------------------------------------------------- |
+| **Песочница** | `GET https://sandbox.alfabank.ru/api/na/jp/v1/deals/{dealId}/steps/{stepId}` |
+| **Пром** | `GET https://baas.alfabank.ru/api/na/jp/v1/deals/{dealId}/steps/{stepId}` |
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](https://developers.alfabank.ru/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | application/json |
+
+### PATH (Путь)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :--------- | :----- | :------------- | :------------------------- |
+| **dealId** | string | required | Идентификатор сделки |
+| **stepId** | string | required | Идентификатор этапа сделки |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/deals/{dealId}/steps/{stepId}' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+**Пример тела ответа:**
+
+```json
+{
+ "stepId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "stepNumber": 1,
+ "description": "Этап 1",
+ "status": "DRAFT",
+ "isValid": false
+}
+```
+
+**Описание полей:**
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **stepId** | string | required | Идентификатор этапа сделки |
+| **stepNumber** | integer | required | Порядковый номер этапа сделки |
+| **description** | string | required | Описание этапа сделки |
+| **status** | string | required | Статус этапа сделки (см. ниже) |
+| **isValid** | boolean | required | Флаг валидности этапа сделки |
+
+#### Возможные значения статуса (`status`):
+
+- `DRAFT` — принят для последующей обработки;
+- `ACTIVE` — успешно обработан;
+- `BLOCKED` — ошибка в процессе обработки;
+- `IN_PROGRESS` — в процессе обработки;
+- `PAYMENT_FAILED` — платёж завершился неудачей;
+- `CLOSED` — отменен;
+- `COMPLETED` — успешно завершен.
+
+---
+
+## Ошибки
+
+| Код | Описание (error) | Детали (error_description) |
+| :------ | :------------------- | :-------------------------------------------- |
+| **400** | `invalid_request` | Неверные входные параметры запроса |
+| **401** | `invalid_token` | Токен просрочен, отозван или недействителен |
+| **403** | `insufficient_scope` | У пользователя нет прав (недостаточный scope) |
+| **404** | `unknown_endpoint` | Эндпоинт не найден или неактивен |
+| **429** | — | Слишком много запросов (нет тела ответа) |
+| **500** | `internal_error` | Внутренняя ошибка сервиса |
+| **503** | — | Сервис недоступен (нет тела ответа) |
+
+---
+
+_Документация Alfa API_
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-steps.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-steps.md
new file mode 100644
index 0000000..f57a5fe
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/get-steps.md
@@ -0,0 +1,98 @@
+# Получение списка этапов сделки
+
+**Тип интеграции:** H2H
+**Scope:** `deals`
+
+Метод позволяет получить список этапов сделки по `dealId`.
+
+---
+
+## Эндпоинты
+
+| Среда | Метод и URL |
+| :------------ | :------------------------------------------------------------------ |
+| **Песочница** | `GET https://sandbox.alfabank.ru/api/na/jp/v1/deals/{dealId}/steps` |
+| **Пром** | `GET https://baas.alfabank.ru/api/na/jp/v1/deals/{dealId}/steps` |
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Описание |
+| :---------------- | :---------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string (required) | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string (required) | `application/json` |
+
+### QUERY
+
+| Атрибут | Тип | Описание |
+| :--------- | :----------------- | :--------------------------------------------------------------------------------------- |
+| **offset** | integer (optional) | Количество элементов в списке, которое необходимо пропустить. Значение по умолчанию: `0` |
+| **limit** | integer (optional) | Количество элементов в списке, которое необходимо вывести. Значение по умолчанию: `50` |
+
+### PATH
+
+| Атрибут | Тип | Описание |
+| :--------- | :---------------- | :------------------- |
+| **dealId** | string (required) | Идентификатор сделки |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/deals/{dealId}/steps?offset={offset}&limit={limit}' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### Пример ответа 200 (OK)
+
+```json
+[
+ {
+ "stepId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "stepNumber": 1,
+ "description": "Этап 1",
+ "status": "DRAFT",
+ "isValid": false
+ }
+]
+```
+
+### BODY (200 OK)
+
+| Атрибут | Тип | Описание |
+| :-------------- | :----------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **stepId** | string (required) | Идентификатор этапа сделки |
+| **stepNumber** | integer (required) | Порядковый номер этапа сделки |
+| **description** | string (required) | Описание этапа сделки |
+| **status** | string (required) | Статус этапа сделки. Возможные значения: • `DRAFT` — принят для последующей обработки; • `ACTIVE` — успешно обработан; • `BLOCKED` — ошибка в процессе обработки; • `IN_PROGRESS` — в процессе обработки; • `PAYMENT_FAILED` — платёж завершился неудачей; • `CLOSED` — отменен; • `COMPLETED` — успешно завершен |
+| **isValid** | boolean (required) | Флаг валидности этапа сделки |
+
+---
+
+## Ошибки
+
+| Код | Описание | Тело ответа (error) |
+| :------ | :-------------------- | :----------------------------------------------------------------------------- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры запроса |
+| **401** | Unauthorized | `invalid_token` — токен просрочен, отозван или недействителен |
+| **403** | Forbidden | `insufficient_scope` — нет прав на использование сервиса (недостаточный scope) |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден или неактивен |
+| **429** | Too Many Requests | Нет тела ответа |
+| **500** | Internal Server Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа |
+
+---
+
+**Навигация:**
+
+- Предыдущий метод: [Получение статуса запроса на завершение этапа сделки](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/get-deal-request-status/v1/get-deal-request-status)
+- Следующий метод: [Получение информации об этапе сделки](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/get-step/v1/get-step)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/intro.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/intro.md
new file mode 100644
index 0000000..493ef4d
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/intro.md
@@ -0,0 +1,87 @@
+# Как это работает
+
+**Теги:** H2H
+
+> **Примечание**
+> Депонент — это участник сделки, который выступает в качестве плательщика, реципиент — это получатель денежных средств.
+
+Механизм безопасных сделок используется для осуществления расчётов, при которых средства депонента временно холдируются и переходят к реципиенту только после выполнения условия сделки. При этом Банк ведет учёт (биллинг) денежных средств каждого бенефициара.
+
+Для работы с безопасными сделками предварительно необходимо:
+
+1. [Зарегистрировать контрагентов, участвующих в сделке, и их платёжные реквизиты](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/intro/intro).
+2. [Идентифицировать денежные средства, поступившие на номинальный счёт](/products/alfa-api/documentation/articles/nominal-accounts/articles/identify-transactions/articles/intro/intro).
+
+> **Важно**
+> В рамках этапа сделки выполнять платежи от бенефициара самому себе нельзя. Совершить такой перевод можно напрямую без создания сделки, используя метод [«Создание запроса на выплату с номинального счёта»](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/payoff/v1/payoff).
+
+---
+
+### Механизм работы сделок
+
+1. **Зарегистрируйте сделку**
+ Создайте черновик сделки для дальнейшего её наполнения этапами и участниками с помощью метода [«Регистрация сделки»](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/add-deal/v1/add-deal).
+
+2. **Создайте этапы сделки**
+ Используйте метод [«Выполнение действия по этапам сделки»](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/add-step/v1/add-step).
+ _Внимание!_ Каждая сделка должна содержать не менее одного этапа.
+
+3. **Добавьте депонента в этапы сделки**
+ Добавьте информацию о бенефициаре (плательщике) этапа с помощью метода [«Выполнение действия по участникам этапа сделки»](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/step-contractors/v1/step-contractors).
+ _Внимание!_ В одном этапе сделки может быть указан только один депонент (плательщик).
+
+4. **Добавьте реципиентов в этапы сделки**
+ Добавьте информацию о получателях денежных средств с помощью метода [«Выполнение действия по участникам этапа сделки»](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/step-contractors/v1/step-contractors). Реципиентами могут быть бенефициары или универсальные реципиенты.
+ _Внимание!_ В одном этапе сделки может быть несколько реципиентов.
+
+5. **Проверьте возможность выплат по сформированной сделке**
+ Проверьте правильность наполнения с помощью метода [«Проверка возможности осуществления выплат по сделке»](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/deal-is-valid/v1/deal-is-valid). Для перехода к следующему шагу необходимо получить в ответе `isValid = true`.
+
+6. **Подтвердите сделку**
+ Подтвердите создание с помощью метода [«Выполнение действия по сделке»](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/deal-actions/v1/deal-actions). Статус изменится с `DRAFT` на `ACTIVE`.
+ _Внимание!_ При подтверждении сделки денежные средства депонентов холдируются.
+
+7. **Завершите этапы сделки**
+ Для проведения расчётов инициируйте завершение этапа через метод [«Выполнение действия по этапам сделки»](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/add-step/v1/add-step).
+ Для контроля используйте метод [«Получение статуса запроса на завершение этапа сделки»](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/get-deal-request-status/v1/get-deal-request-status). При завершении этапа осуществляются выплаты.
+
+8. **Завершите сделку**
+ Используйте метод [«Выполнение действия по сделке»](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/deal-actions/v1/deal-actions). Статус изменится с `ACTIVE` на `COMPLETED`.
+
+---
+
+### Отмена сделки
+
+Для отмены используйте метод [«Выполнение действия по сделке»](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/deal-actions/v1/deal-actions).
+
+> **Важно**
+> Отменить сделку можно только при условии, что ни один из её этапов не был завершён. При отмене ранее захолдированные средства депонентов будут расхолдированы.
+
+---
+
+### Информация о сделках и выплатах по ним
+
+**По сделкам:**
+
+- [Получение информации о сделке](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/get-deal/v1/get-deal)
+- [Получение списка сделок](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/get-deals/v1/get-deals)
+
+**По этапам:**
+
+- [Получение информации об этапе сделки](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/get-step/v1/get-step)
+- [Получение списка этапов сделки](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/get-steps/v1/get-steps)
+
+**По участникам:**
+
+- [Получить информацию об участниках этапа сделки](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/get-contractors/v1/get-contractors)
+
+**По переводам (платежам):**
+
+- [Получение списка платежей по сделке](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/get-deal-payoffs/v1/get-deal-payoffs)
+
+---
+
+**Навигация:**
+
+- Назад: [Получение статуса запроса на возврат неидентифицированного пополнения](/products/alfa-api/documentation/articles/nominal-accounts/articles/identify-transactions/articles/get-transaction-refund-request-status/v1/get-transaction-refund-request-status)
+- Вперед: [Регистрация сделки](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/add-deal/v1/add-deal)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/step-contractors.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/step-contractors.md
new file mode 100644
index 0000000..55bd166
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Безопасные_сделки/step-contractors.md
@@ -0,0 +1,137 @@
+# Выполнение действия по участникам этапа сделки
+
+**Метка:** `H2H`
+
+## Эндпоинты
+
+| Среда | Метод и URL |
+| :------------ | :----------------------------------------------------------------------- |
+| **Песочница** | `PATCH https://sandbox.alfabank.ru/api/na/jp/v1/deals/steps/contractors` |
+| **Пром** | `PATCH https://baas.alfabank.ru/api/na/jp/v1/deals/steps/contractors` |
+
+**Scope:** `deals`
+
+## Описание
+
+> **Внимание**
+> Действия с участниками сделки возможны только для сделки в статусе `DRAFT`.
+
+Метод позволяет добавить, изменить или удалить участника сделки.
+
+### Добавление участника сделки
+
+Каждый этап сделки должен содержать участников. При добавлении необходимо учитывать:
+
+- В рамках одного этапа может быть добавлен только один депонент, реципиентов может быть несколько.
+- В качестве депонента может выступать только бенефициар, в качестве реципиента – бенефициар или универсальный реципиент.
+- При добавлении универсального реципиента необходимо передавать его идентификатор `universalRecipientId` в параметр `beneficiaryId`.
+- Если не указан идентификатор платёжного реквизита `requisiteId`, система будет использовать [ранее зарегистрированный платёжный реквизит](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/add-requisites/v1/add-requisites), который считается основным (`isMain = true`).
+
+### Изменение участника сделки
+
+- **Для депонента:** можно изменить сумму депонированных средств.
+- **Для реципиента:** можно изменить суммы, назначение платежа, признак вывода денег на виртуальный счёт и идентификатор платёжных реквизитов.
+
+### Удаление участника сделки
+
+Позволяет удалить депонента или реципиента из этапа сделки.
+
+---
+
+## Параметры запроса
+
+### Headers
+
+| Атрибут | Тип | Описание |
+| :---------------- | :------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | `string` (required) | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | `string` (required) | application/json |
+| **Content-Type** | `string` (required) | application/json |
+
+### Body
+
+| Атрибут | Тип | Описание |
+| :----------------------- | :---------------------------- | :-------------------------------------------------------------------------------------------------------------------------- |
+| **action** | `string` (required) | Тип действия: `ADD_DEPONENT`, `ADD_RECIPIENT`, `DELETE_DEPONENT`, `DELETE_RECIPIENT`, `UPDATE_DEPONENT`, `UPDATE_RECIPIENT` |
+| **dealId** | `string` (required) | Идентификатор сделки |
+| **stepId** | `string` (required) | Идентификатор этапа сделки |
+| **beneficiaryId** | `string` (required) | Идентификатор бенефициара или универсального реципиента |
+| **amount** | `string` (optional) | Сумма депонирования в рублях. Доступно только для депонента |
+| **purpose** | `string` (optional) | Назначение платежа реципиента. Доступно только для реципиента |
+| **amounts** | `array of objects` (optional) | Суммы реципиента. Доступно только для реципиента (см. ниже) |
+| **keepOnNominalAccount** | `boolean` (optional) | Признак вывода на вирт. счёт: `true` — оставить на ном. счёте; `false` — вывести на реквизиты |
+| **requisiteId** | `string` (optional) | Идентификатор платёжного реквизита контрагента |
+| **digestSignatures** | `array of objects` (required) | Электронная подпись УЛ Клиента (см. ниже) |
+
+#### Объект `amounts` (внутри Body)
+
+| Атрибут | Тип | Описание |
+| :------------- | :------------------ | :------------------------------------------------- |
+| **walletType** | `string` (optional) | Тип кошелька: `MAIN` (основной), `TAX` (налоговый) |
+| **amount** | `string` (optional) | Сумма в рублях |
+
+#### Объект `digestSignatures` (внутри Body)
+
+| Атрибут | Тип | Описание |
+| :---------------- | :------------------ | :------------------------------------ |
+| **base64Encoded** | `string` (required) | Значение подписи в Base64 |
+| **signatureType** | `string` (required) | Тип подписи: `rsa` (RSA), `kep` (КЭП) |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --request PATCH 'https://baas.alfabank.ru/api/na/jp/v1/deals/steps/contractors' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json' \
+--data '{
+ "action": "ADD_DEPONENT",
+ "dealId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "stepId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "beneficiaryId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "amount": "10.00",
+ "purpose": "Назначение платежа",
+ "amounts": [
+ {
+ "walletType": "MAIN",
+ "amount": "10.00"
+ }
+ ],
+ "keepOnNominalAccount": true,
+ "requisiteId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "digestSignatures": [
+ {
+ "base64Encoded": "SEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDICExIAVH4YMX0u3fEONSkAAQBUfhgwCgYIKoUDBwEBAQEEQBU0EntPGWz8EfJ5CFL2m10xeBrkAEeWDglGQDZWLKQ0ff4TyBT9X1NhG/+ETj4TcQhExy6k+WZ9w/CpF5FjyyA=",
+ "signatureType": "rsa"
+ }
+ ]
+}'
+```
+
+---
+
+## Параметры ответа
+
+| Код | Статус | Описание |
+| :------ | :-------------------- | :-------------------------------------------- |
+| **204** | No Content | Успешное выполнение. Тело ответа отсутствует. |
+| **400** | Bad Request | Неверные входные параметры. |
+| **401** | Unauthorized | Токен просрочен или недействителен. |
+| **403** | Forbidden | Недостаточно прав (insufficient_scope). |
+| **404** | Not Found | Эндпоинт не найден. |
+| **429** | Too Many Requests | Слишком много запросов. |
+| **500** | Internal Server Error | Внутренняя ошибка сервиса. |
+| **503** | Service Unavailable | Сервис временно недоступен. |
+
+### Структура ошибки (400, 401, 403, 404, 500)
+
+| Атрибут | Тип | Описание |
+| :-------------------- | :------- | :------------------------------------------------------------------------------ |
+| **error** | `string` | Код ошибки (например, `invalid_request`, `invalid_token`, `insufficient_scope`) |
+| **error_description** | `string` | Подробное описание ошибки |
+
+---
+
+_Документация Alfa API_
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/get-payoff-request-status.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/get-payoff-request-status.md
new file mode 100644
index 0000000..43cecab
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/get-payoff-request-status.md
@@ -0,0 +1,87 @@
+# Получение статуса запроса на выплату с номинального счёта
+
+**Тип интеграции:** H2H
+**Scope:** `beneficiary-payments`
+
+## Описание
+Метод позволяет получить статус запроса на выплату с номинального счёта по идентификатору `payoffId`.
+
+---
+
+## Эндпоинты
+
+| Окружение | Метод | URL |
+| :--- | :--- | :--- |
+| **Песочница** | `GET` | `https://sandbox.alfabank.ru/api/na/jp/v1/payoffs/{payoffId}/status` |
+| **Пром** | `GET` | `https://baas.alfabank.ru/api/na/jp/v1/payoffs/{payoffId}/status` |
+
+---
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | `string` | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | `string` | required | `application/json` |
+
+### PATH
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **payoffId** | `string` | required | Идентификатор запроса, полученный с помощью метода [«Создание запроса на выплату с номинального счёта»](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/payoff/v1/payoff) |
+
+### Пример запроса (cURL)
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/payoffs/{payoffId}/status' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+**Пример тела ответа:**
+```json
+{
+ "payoffId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "status": "PENDING",
+ "description": "Произошла техническая ошибка. Обратитесь в службу поддержки и сообщите код ошибки afc9b019-77ac-49ef-afb9-688b38b74cc2"
+}
+```
+
+**Описание полей BODY:**
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **payoffId** | `string` | required | Идентификатор запроса |
+| **status** | `string` | required | Статус запроса (см. ниже) |
+| **description** | `string` | optional | Описание причины, по которой запрос завершился неудачей. Возвращается, если статус равен `FAILED` |
+
+#### Возможные значения поля `status`:
+* `PENDING` — запрос в процессе обработки;
+* `MANUAL_ACCEPTANCE` — ожидание ручного подтверждения отправки запроса-дубля на обработку;
+* `AWAIT_EXTERNAL` — ожидание исполнения внешнего платежа;
+* `FAILED` — обработка запроса завершилась ошибкой;
+* `FAILED_DUPLICATE` — обработка запроса-дубля отклонена;
+* `COMPLETE` — обработка запроса завершилась успешно.
+
+---
+
+## Коды ошибок
+
+| Код | Описание | Возможные значения `error` / Примечание |
+| :--- | :--- | :--- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры запроса |
+| **401** | Unauthorized | `invalid_token` — токен просрочен, отозван или недействителен |
+| **403** | Forbidden | `insufficient_scope` — нет прав (scope) на использование сервиса |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден или неактивен |
+| **429** | Too Many Requests | Нет тела ответа. Превышен лимит запросов |
+| **500** | Internal Server Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа. Сервис временно недоступен |
+
+---
+
+## Дополнительные ссылки
+* [Предыдущий шаг: Создание запроса на выплату](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/payoff/v1/payoff)
+* [Следующий шаг: Подтверждение или отклонение запроса-дубля](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/payoff-accept/v1/payoff-accept)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/get-payoff.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/get-payoff.md
new file mode 100644
index 0000000..07315ab
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/get-payoff.md
@@ -0,0 +1,125 @@
+# Получение информации о платеже
+
+**Контекст:** Номинальные счета / Выплаты
+**Тип интеграции:** H2H
+**Scope:** `beneficiary-payments`
+
+## Эндпоинты
+
+| Окружение | Метод | URL |
+| :------------ | :---- | :------------------------------------------------------------ |
+| **Песочница** | `GET` | `https://sandbox.alfabank.ru/api/na/jp/v1/payoffs/{payoffId}` |
+| **Пром** | `GET` | `https://baas.alfabank.ru/api/na/jp/v1/payoffs/{payoffId}` |
+
+## Описание
+
+Метод позволяет получить информацию о платеже по его идентификатору `payoffId`.
+
+---
+
+## Параметры запроса
+
+### Headers
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | `application/json` |
+
+### Path
+
+| Атрибут | Тип | Обязательность | Описание |
+| :----------- | :----- | :------------- | :-------------------- |
+| **payoffId** | string | required | Идентификатор платежа |
+
+### Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/payoffs/{payoffId}' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+#### Тело ответа (JSON)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :---------------------------------------------------------------------------------- |
+| **dealId** | string | optional | Идентификатор сделки |
+| **stepId** | string | optional | Идентификатор этапа |
+| **paymentType** | string | optional | Тип платежа: `REGULAR` (обычный), `DEAL` (выплата внутри сделки), `TAX` (налоговый) |
+| **requisiteType** | string | optional | Тип реквизита: `ACCOUNT` (счёт), `CARD` (токен карты), `PHONE` (номер телефона) |
+| **payer** | object | optional | Информация о плательщике (см. ниже) |
+| **recipient** | object | optional | Информация о получателе (см. ниже) |
+| **amount** | string | optional | Сумма в рублях |
+| **purpose** | string | optional | Назначение платежа |
+| **status** | string | optional | Статус: `IN_PROGRESS` (в обработке), `FAILED` (ошибка), `READY` (успешно завершён) |
+
+#### Объект `payer` (Плательщик)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :----------------------- |
+| **accountNumber** | string | required | Номер счёта |
+| **name** | string | required | Наименование организации |
+| **inn** | string | required | ИНН |
+| **kpp** | string | required | КПП |
+
+#### Объект `recipient` (Получатель)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :------------------------ |
+| **beneficiaryId** | string | optional | Идентификатор бенефициара |
+| **accountNumber** | string | optional | Номер счёта |
+| **bik** | string | optional | БИК банка |
+| **name** | string | optional | ФИО реципиента |
+| **inn** | string | optional | ИНН |
+
+### Пример успешного ответа
+
+```json
+{
+ "dealId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "stepId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "paymentType": "REGULAR",
+ "requisiteType": "ACCOUNT",
+ "payer": {
+ "accountNumber": "40817810306050000000",
+ "name": "Акционерное общество «Ромашка»",
+ "inn": "1122334455",
+ "kpp": "123456789"
+ },
+ "recipient": {
+ "beneficiaryId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "accountNumber": "40817810306050000000",
+ "bik": "044525593",
+ "name": "Иванов Иван Иванович",
+ "inn": "112233445566"
+ },
+ "amount": "10.00",
+ "purpose": "Назначение платежа",
+ "status": "IN_PROGRESS"
+}
+```
+
+---
+
+## Коды ошибок
+
+| Код | Описание | Возможные значения `error` |
+| :------ | :-------------------- | :--------------------------------------------------------- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры |
+| **401** | Unauthorized | `invalid_token` — токен просрочен или недействителен |
+| **403** | Forbidden | `insufficient_scope` — недостаточно прав (проверьте scope) |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден |
+| **429** | Too Many Requests | Нет тела ответа (превышен лимит запросов) |
+| **500** | Internal Server Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа (сервис временно недоступен) |
+
+---
+
+_Документация Alfa API_
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/get-tax-refund-request-status.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/get-tax-refund-request-status.md
new file mode 100644
index 0000000..e951e2d
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/get-tax-refund-request-status.md
@@ -0,0 +1,96 @@
+# Получение статуса запроса на возврат налоговых денежных средств
+
+**Тип интеграции:** H2H
+**Продукт:** Номинальные счета
+**Scope:** `beneficiary-payments`
+
+## Эндпоинты
+
+| Среда | Метод | URL |
+| :------------ | :---- | :------------------------------------------------------------------------- |
+| **Песочница** | `GET` | `https://sandbox.alfabank.ru/api/na/jp/v1/tax-refund/{taxRefundId}/status` |
+| **Пром** | `GET` | `https://baas.alfabank.ru/api/na/jp/v1/tax-refund/{taxRefundId}/status` |
+
+---
+
+## Описание
+
+Метод позволяет получить статус запроса на возврат бенефициару его денежных средств с налогового кошелька по идентификатору `taxRefundId`.
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | `application/json` |
+
+### PATH
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------------- | :----- | :------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **taxRefundId** | string | required | Идентификатор запроса, полученный с помощью метода [«Создание запроса на возврат денежных средств с налогового виртуального кошелька»](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/tax-refund/v1/tax-refund) |
+
+### Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/tax-refund/{taxRefundId}/status' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+**Пример тела ответа:**
+
+```json
+{
+ "taxRefundId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "status": "FAILED",
+ "description": "Произошла техническая ошибка. Обратитесь в службу поддержки и сообщите код ошибки afc9b019-77ac-49ef-afb9-688b38b74cc2"
+}
+```
+
+**Описание полей BODY:**
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **taxRefundId** | string | required | Идентификатор запроса |
+| **status** | string | required | Статус запроса (см. ниже) |
+| **description** | string | optional | Описание причины неудачи. Возвращается только при статусе `FAILED` |
+
+#### Возможные значения статуса (`status`):
+
+- `PENDING` — запрос в процессе обработки;
+- `MANUAL_ACCEPTANCE` — ожидание ручного подтверждения отправки запроса-дубля на обработку;
+- `AWAIT_EXTERNAL` — ожидание исполнения внешнего платежа;
+- `FAILED` — обработка запроса завершилась ошибкой;
+- `FAILED_DUPLICATE` — обработка запроса-дубля отклонена;
+- `COMPLETE` — обработка запроса завершилась успешно.
+
+---
+
+## Ошибки
+
+| Код | Описание | Тело ответа (error) |
+| :------ | :-------------------- | :------------------------------------------------------------------- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры запроса |
+| **401** | Unauthorized | `invalid_token` — токен просрочен, отозван или недействителен |
+| **403** | Forbidden | `insufficient_scope` — недостаточно прав (проверьте настройки scope) |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден или неактивен |
+| **429** | Too Many Requests | Нет тела ответа |
+| **500** | Internal Server Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа |
+
+---
+
+## Навигация
+
+- **Предыдущий метод:** [Создание запроса на возврат налоговых денежных средств](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/tax-refund/v1/tax-refund)
+- **Следующий метод:** [Подтверждение или отклонение запроса-дубля на возврат налоговых денежных средств](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/tax-refund-accept/v1/tax-refund-accept)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/intro.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/intro.md
new file mode 100644
index 0000000..c5db172
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/intro.md
@@ -0,0 +1,65 @@
+# Как это работает
+
+_Номинальные счета / Выплаты / Как это работает_
+
+Для осуществления выплат с номинального счёта предварительно необходимо [зарегистрировать контрагента](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/intro/intro), участвующего в выплате.
+
+## Общий механизм выплат с номинального счёта
+
+1. **Создайте запрос на выплату**
+ Метод [«Создание запроса на выплату с номинального счёта»](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/payoff/v1/payoff)
+
+2. **Получите статус запроса на выплату**
+ Метод [«Получение статуса запроса на выплату с номинального счёта»](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/get-payoff-request-status/v1/get-payoff-request-status)
+
+3. **Подтвердите или отклоните обработку запроса-дубля на выплату**
+ В случае, если статус запроса на выплату уже был создан ранее, он примет статус `MANUAL_ACCEPTANCE` и его нужно будет подтвердить или отклонить.
+ Метод [«Подтвердить или отклонить запрос-дубль на выплату»](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/payoff-accept/v1/payoff-accept)
+
+4. **Получите информацию о платеже по его идентификатору**
+ Метод [«Получение информации о платеже»](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/get-payoff/v1/get-payoff)
+
+---
+
+Выплаты с номинального счёта делятся на два типа:
+
+- выплаты без биллинга на стороне Банка;
+- выплаты с биллингом на стороне Банка.
+
+## Выплаты без биллинга на стороне Банка
+
+Данный тип выплаты позволяет произвести выплату с номинального счёта в пользу зарегистрированного контрагента без создания сделки.
+
+Необходимо учитывать:
+
+- На номинальном счёте должен быть положительный баланс.
+- Если выплата производится в пользу универсального реципиента, то для него предварительно необходимо зарегистрировать платёжные реквизиты с помощью метода [«Добавление платёжных реквизитов универсального реципиента»](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/universal-recipients/articles/add-requisites/v1/add-requisites).
+
+В качестве платёжных реквизитов получателя могут быть указаны:
+
+- реквизиты счёта;
+- номер телефона (СБП);
+- зашифрованный номер карты (как зашифровать номер карты, описано [здесь](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/cardtoken/cardtoken));
+- идентификатор платёжных реквизитов контрагента.
+
+## Выплаты с биллингом на стороне Банка
+
+> **Важно**
+>
+> У бенефициара должен быть положительный баланс на налоговом виртуальном счёте.
+
+- **Вывод собственных средств бенефициара с номинального счёта.** Позволяет вывести с номинального счёта денежные средства бенефициара без создания сделки.
+- **Выплата с целью уплаты налога на профессиональный доход за исполнителя.** Позволяет аккумулировать денежные средства на виртуальном налоговом счёте исполнителя и перевести денежные средства бенефициара, задепонированные с целью уплаты налога на профессиональный доход за исполнителя, на счёт в управление казначейства.
+- **Возврат денежных средств с налогового виртуального кошелька.** Позволяет вернуть денежные средства бенефициара, задепонированные с целью уплаты налога на профессиональный доход за исполнителя, если оплата налога не потребовалась.
+
+### Механизм возврата денежных средств с налогового виртуального кошелька
+
+1. **Создайте запрос на возврат денежных средств с налогового виртуального кошелька**
+ Метод [«Создание запроса на возврат денежных средств с налогового виртуального кошелька»](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/tax-refund/v1/tax-refund)
+
+2. **Получите статус запроса на возврат налоговых денежных средств**
+ Метод [«Получение статуса запроса на возврат налоговых денежных средств»](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/get-tax-refund-request-status/v1/get-tax-refund-request-status)
+
+3. **Подтвердите или отклоните обработку запроса-дубля на возврат денежных средств с налогового виртуального кошелька**
+ В случае, если статус запроса на выплату уже был создан ранее, он примет статус `MANUAL_ACCEPTANCE` и его нужно будет подтвердить или отклонить.
+ Метод [«Подтверждение или отклонение запроса-дубля на возврат денежных средств с налогового виртуального кошелька»](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/tax-refund-accept/v1/tax-refund-accept)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/payoff-accept.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/payoff-accept.md
new file mode 100644
index 0000000..8317f80
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/payoff-accept.md
@@ -0,0 +1,87 @@
+Ниже представлен очищенный и структурированный анализ документа в формате Markdown.
+
+---
+
+# Подтверждение или отклонение запроса-дубля на выплату
+
+**Тип интеграции:** H2H
+**Продукт:** Номинальные счета / Выплаты
+**Метод:** `PATCH`
+
+## Эндпоинты
+
+| Среда | URL |
+| :--- | :--- |
+| **Песочница** | `https://sandbox.alfabank.ru/api/na/jp/v1/payoffs/{payoffId}/accept` |
+| **Пром** | `https://baas.alfabank.ru/api/na/jp/v1/payoffs/{payoffId}/accept` |
+
+## Scope
+`beneficiary-payments`
+
+## Описание
+Метод позволяет подтвердить или отклонить запрос на создание выплаты, находящийся в статусе `MANUAL_ACCEPTANCE`, по идентификатору `payoffId`. Это необходимо для обработки ситуаций, когда система зафиксировала потенциальный дубль запроса.
+
+---
+
+## Параметры запроса
+
+### Headers (Заголовки)
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | string | Да | `Bearer {access_token}`, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | Да | `application/json` |
+| **Content-Type** | string | Да | `application/json` |
+
+### Path (Путь)
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **payoffId** | string | Да | Идентификатор запроса, полученный методом [«Создание запроса на выплату с номинального счёта»](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/payoff/v1/payoff) |
+
+### Body (Тело запроса)
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **accept** | boolean | Да | Флаг обработки запроса-дубля: • `true` – продолжить обработку; • `false` – завершить (отклонить) обработку. |
+
+### Пример запроса (cURL)
+```bash
+curl --location --globoff --request PATCH 'https://baas.alfabank.ru/api/na/jp/v1/payoffs/{payoffId}/accept' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json' \
+--data '{
+ "accept": true
+}'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **result** | boolean | Да | Статус обработки: • `true` – обработка продолжена; • `false` – обработка завершена. |
+
+**Пример JSON:**
+```json
+{
+ "result": true
+}
+```
+
+### Ошибки
+| Код | Описание (error) | Описание (error_description) |
+| :--- | :--- | :--- |
+| **400** | `invalid_request` | Неверные входные параметры запроса. |
+| **401** | `invalid_token` | Токен просрочен, отозван или имеет неверный формат. |
+| **403** | `insufficient_scope` | Нет прав на использование сервиса (недостаточный scope). |
+| **404** | `unknown_endpoint` | Эндпоинт не найден или неактивен. |
+| **429** | — | Too Many Requests (слишком много запросов). Тело ответа отсутствует. |
+| **500** | `internal_error` | Внутренняя ошибка сервиса. |
+| **503** | — | Service Unavailable (сервис недоступен). Тело ответа отсутствует. |
+
+---
+
+## Навигация
+* **Назад:** [Получение статуса запроса на выплату с номинального счёта](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/get-payoff-request-status/v1/get-payoff-request-status)
+* **Вперед:** [Получение информации о платеже](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/get-payoff/v1/get-payoff)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/payoff.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/payoff.md
new file mode 100644
index 0000000..b6f1849
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/payoff.md
@@ -0,0 +1,157 @@
+Вот очищенная и структурированная версия документа в формате Markdown.
+
+---
+
+# Создание запроса на выплату с номинального счёта
+
+**Тип интеграции:** H2H
+**Scope:** `beneficiary-payments`
+
+## Эндпоинты
+
+* **Песочница:** `POST https://sandbox.alfabank.ru/api/na/jp/v1/payoffs`
+* **Пром:** `POST https://baas.alfabank.ru/api/na/jp/v1/payoffs`
+
+## Описание
+Метод позволяет вывести собственные средства бенефициара с номинального счёта по заранее зарегистрированным платёжным реквизитам (с биллингом) или осуществить выплату зарегистрированным контрагентам (без биллинга).
+
+> [!IMPORTANT]
+> **Важно**
+> Если идентичный запрос на выплату уже был создан ранее, то текущий запрос примет статус `MANUAL_ACCEPTANCE`. Его нужно будет подтвердить или отклонить с помощью метода [«Подтверждение или отклонение запроса-дубля на выплату»](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/payoff-accept/v1/payoff-accept).
+
+---
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | string | Да | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | Да | `application/json` |
+| **Content-Type** | string | Да | `application/json` |
+
+### BODY
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **type** | string | Да | Тип платежа: `REGULAR` (обычный), `TAX` (налоговый) |
+| **accountNumber** | string | Да | Номер номинального счёта |
+| **deponent** | string | Нет | Идентификатор бенефициара-плательщика |
+| **recipient** | object | Да | **Получатель** (см. ниже) |
+| **payoutRequisite** | object | Да | **Реквизиты обычного платежа** (см. ниже) |
+| **requisites** | object | Нет | **Реквизиты для налогового платежа** (см. ниже) |
+| **amount** | string | Да | Сумма в рублях |
+| **purpose** | string | Да | Назначение платежа |
+| **tax** | object | Нет | **Параметры для налогового платежа** (см. ниже) |
+| **digestSignatures** | array | Да | **Электронная подпись УЛ клиента** (см. ниже) |
+
+#### Вложенный объект: recipient (Получатель)
+* **type** (string, обязат.): Тип получателя. Значения: `BENEFICIARY` (контрагент), `SIMPLE_PAYEE` (простой получатель).
+* **name** (string, опц.): Наименование (ФИО для ФЛ, название для ЮЛ/ИП). Обязательно для `SIMPLE_PAYEE`.
+* **inn** (string, опц.): ИНН (12 цифр для ФЛ/ИП, 10 для ЮЛ). Обязательно для `SIMPLE_PAYEE`.
+* **kpp** (string, опц.): КПП получателя.
+* **beneficiaryId** (string, опц.): Идентификатор контрагента. Обязательно для `BENEFICIARY`.
+
+#### Вложенный объект: payoutRequisite (Реквизиты выплаты)
+* **type** (string, обязат.): Тип реквизита: `ACCOUNT`, `CARD`, `PHONE`, `BENEFICIARY_REQUISITE`.
+* **requisiteId** (string, опц.): ID реквизитов контрагента. Обязательно для `BENEFICIARY_REQUISITE`.
+* **pan** (string, опц.): Токен номера карты. Обязательно для `CARD`. [Инструкция по токенизации](/products/alfa-api/documentation/articles/nominal-accounts/articles/cardtoken/cardtoken).
+* **phoneNumber** (string, опц.): Номер телефона. Обязательно для `PHONE`.
+* **bankId** (string, опц.): ID банка получателя. Обязательно для `PHONE`.
+* **accountNumber** (string, опц.): Номер счёта. Обязательно для `ACCOUNT`.
+* **bik** (string, опц.): БИК банка. Обязательно для `ACCOUNT`.
+
+#### Вложенный объект: tax (Налоговые параметры)
+* **uin** (string, обязат.): УИН (поле 22).
+* **payerStatus** (string, обязат.): Статус составителя (поле 101). Примеры: `01`, `02`, `08`, `13` и др.
+* **kbk** (string, обязат.): КБК (поле 104).
+* **oktmo** (string, обязат.): ОКТМО (поле 105).
+* **reason** (string, обязат.): Основание платежа (поле 106). Примеры: `ТП`, `ЗД`, `0`.
+* **period** (string, обязат.): Налоговый период (поле 107). Формат ДД.ММ.ГГГГ или `0`.
+* **docNumber** (string, обязат.): Номер документа (поле 108).
+* **docDate** (string, обязат.): Дата документа (поле 109).
+* **paymentKind** (string, опц.): Код типа платежа (поле 110). `ПЕ`, `ПЦ` или `0`.
+
+#### Вложенный объект: digestSignatures (Подписи)
+* **base64Encoded** (string, обязат.): Значение подписи в Base64.
+* **signatureType** (string, обязат.): Тип подписи: `rsa` или `kep`.
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location 'https://baas.alfabank.ru/api/na/jp/v1/payoffs' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json' \
+--data '{
+ "type": "REGULAR",
+ "accountNumber": "40817810306050000000",
+ "deponent": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "recipient": {
+ "type": "BENEFICIARY",
+ "name": "Иванов Иван Иванович",
+ "inn": "112233445566",
+ "kpp": "123456789",
+ "beneficiaryId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
+ },
+ "payoutRequisite": {
+ "type": "ACCOUNT",
+ "requisiteId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "pan": "wS7fElYo8VWeJ8KelaJ0XA==",
+ "phoneNumber": "79130000011",
+ "bankId": "012345678910",
+ "accountNumber": "40817810306050000000",
+ "bik": "044525593"
+ },
+ "amount": "10.00",
+ "purpose": "Назначение платежа",
+ "digestSignatures": [
+ {
+ "base64Encoded": "SEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDICExIAVH4YMX0u3fEONSkAAQBUfhgwCgYIKoUDBwEBAQEEQBU0EntPGWz8EfJ5CFL2m10xeBrkAEeWDglGQDZWLKQ0ff4TyBT9X1NhG/+ETj4TcQhExy6k+WZ9w/CpF5FjyyA=",
+ "signatureType": "rsa"
+ }
+ ]
+}'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (202 Accepted)
+```json
+{
+ "payoffId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "status": "PENDING"
+}
+```
+
+**Описание полей ответа:**
+* **payoffId** (string): Уникальный идентификатор платежа.
+* **status** (string): Статус запроса. Возможные значения:
+ * `PENDING` — в процессе обработки.
+ * `MANUAL_ACCEPTANCE` — ожидание ручного подтверждения (для дублей).
+ * `AWAIT_EXTERNAL` — ожидание исполнения внешнего платежа.
+ * `FAILED` — ошибка обработки.
+ * `FAILED_DUPLICATE` — запрос-дубль отклонен.
+ * `COMPLETE` — успешно завершено.
+
+---
+
+## Коды ошибок
+
+| Код | Описание | Тело ответа (error) |
+| :--- | :--- | :--- |
+| **400** | Bad Request | `invalid_request` — неверные параметры |
+| **401** | Unauthorized | `invalid_token` — токен недействителен |
+| **403** | Forbidden | `insufficient_scope` — нет прав доступа |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден |
+| **429** | Too Many Requests | Нет тела ответа |
+| **500** | Internal Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа |
+
+---
+**Навигация:**
+* [Как это работает](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/intro/intro)
+* [Получение статуса запроса на выплату](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/get-payoff-request-status/v1/get-payoff-request-status)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/tax-refund-accept.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/tax-refund-accept.md
new file mode 100644
index 0000000..7d70d45
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/tax-refund-accept.md
@@ -0,0 +1,94 @@
+# Подтверждение или отклонение запроса-дубля на возврат налоговых денежных средств
+
+Данный метод API предназначен для управления запросами на возврат налоговых средств, которые получили статус `MANUAL_ACCEPTANCE` (требуют ручного подтверждения из-за обнаружения дубликата).
+
+## Общая информация
+
+- **Тип документа:** H2H
+- **Метод:** `PATCH`
+- **Scope:** `beneficiary-payments`
+
+## Эндпоинты
+
+| Среда | URL |
+| :------------ | :------------------------------------------------------------------------- |
+| **Песочница** | `https://sandbox.alfabank.ru/api/na/jp/v1/tax-refund/{taxRefundId}/accept` |
+| **Пром** | `https://baas.alfabank.ru/api/na/jp/v1/tax-refund/{taxRefundId}/accept` |
+
+## Описание
+
+Метод позволяет подтвердить или отклонить запрос на возврат налоговых денежных средств, находящийся в статусе `MANUAL_ACCEPTANCE`, используя уникальный идентификатор `taxRefundId`.
+
+---
+
+## Параметры запроса
+
+### Headers (Заголовки)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](https://developers.alfabank.ru/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | `application/json` |
+
+### PATH (Путь)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------------- | :----- | :------------- | :------------------------------- |
+| **taxRefundId** | string | required | Идентификатор запроса на возврат |
+
+### QUERY (Параметры строки)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :--------- | :------ | :------------- | :-------------------------------------------------------------------------------------------------------- |
+| **accept** | boolean | required | Флаг обработки дубля: • `true` – продолжить обработку; • `false` – завершить (отклонить) обработку. |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff --request PATCH \
+'https://baas.alfabank.ru/api/na/jp/v1/tax-refund/{taxRefundId}/accept?accept={accept}' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+**Тело ответа (JSON):**
+
+```json
+{
+ "result": true
+}
+```
+
+**Описание полей:**
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **result** | boolean | required | Статус обработки: `true` — продолжена, `false` — завершена. |
+
+---
+
+## Коды ошибок
+
+| Код | Статус | Ошибка (`error`) | Описание |
+| :------ | :------------------ | :------------------- | :----------------------------------------------------- |
+| **400** | Bad Request | `invalid_request` | Неверные входные параметры запроса. |
+| **401** | Unauthorized | `invalid_token` | Токен просрочен, отозван или имеет неверный формат. |
+| **403** | Forbidden | `insufficient_scope` | Нет прав на использование сервиса (не настроен scope). |
+| **404** | Not Found | `unknown_endpoint` | Эндпоинт не найден или неактивен. |
+| **429** | Too Many Requests | — | Слишком много запросов (нет тела ответа). |
+| **500** | Internal Error | `internal_error` | Внутренняя ошибка сервиса. |
+| **503** | Service Unavailable | — | Сервис временно недоступен (нет тела ответа). |
+
+---
+
+## Навигация
+
+- **Предыдущий шаг:** [Получение статуса запроса на возврат налоговых денежных средств](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/get-tax-refund-request-status/v1/get-tax-refund-request-status)
+- **Раздел:** Номинальные счета / Выплаты
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/tax-refund.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/tax-refund.md
new file mode 100644
index 0000000..da1b258
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Выплаты/tax-refund.md
@@ -0,0 +1,121 @@
+# Создание запроса на возврат налоговых денежных средств
+
+**Продукт:** Alfa API / Номинальные счета / Выплаты
+**Тип интеграции:** H2H
+**Scope:** `beneficiary-payments`
+
+## Эндпоинты
+
+| Окружение | Метод | URL |
+| :------------ | :----- | :---------------------------------------------------- |
+| **Песочница** | `POST` | `https://sandbox.alfabank.ru/api/na/jp/v1/tax-refund` |
+| **Пром** | `POST` | `https://baas.alfabank.ru/api/na/jp/v1/tax-refund` |
+
+## Описание
+
+Метод позволяет создать запрос на возврат бенефициару его денежных средств с налогового кошелька, если оплата налога не потребовалась.
+
+- Если нужно вернуть налоговые средства на основной виртуальный счёт бенефициара без вывода с номинального счёта, передавайте `keepOnNominalAccount = true`.
+- Если нужно вернуть налоговые средства бенефициару с выводом с номинального счёта, передавайте `keepOnNominalAccount = false`.
+
+> [!IMPORTANT]
+> **Важно**
+> Если идентичный запрос на возврат налоговых денежных средств уже был создан ранее, то текущий запрос примет статус `MANUAL_ACCEPTANCE`. Его нужно будет подтвердить или отклонить с помощью метода [«Подтверждение или отклонение запроса-дубля на возврат налоговых денежных средств»](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/tax-refund-accept/v1/tax-refund-accept).
+
+## Параметры запроса
+
+### Заголовки (Headers)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | `application/json` |
+| **Content-Type** | string | required | `application/json` |
+
+### Тело запроса (Body)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :----------------------- | :------ | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **beneficiaryId** | string | required | Идентификатор бенефициара |
+| **amount** | string | required | Сумма |
+| **purpose** | string | required | Назначение платежа |
+| **keepOnNominalAccount** | boolean | required | Признак вывода денег на основной виртуальный счёт. • `true` — оставить в рамках номинального счёта; • `false` — вывести по идентификатору платёжного реквизита бенефициара. |
+| **requisiteId** | string | optional | Идентификатор платёжного реквизита бенефициара для вывода. Если не заполнено, используются основные реквизиты. |
+| **digestSignatures** | array | required | Массив объектов электронной подписи УЛ клиента. |
+
+**Объект в digestSignatures:**
+
+- **base64Encoded** (string, required): Значение электронной подписи в Base64.
+- **signatureType** (string, required): Тип подписи: `rsa` (RSA) или `kep` (КЭП).
+
+### Пример запроса (cURL)
+
+```bash
+curl --location 'https://baas.alfabank.ru/api/na/jp/v1/tax-refund' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json' \
+--data '{
+ "beneficiaryId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "amount": "10.00",
+ "purpose": "Назначение платежа",
+ "keepOnNominalAccount": false,
+ "requisiteId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "digestSignatures": [
+ {
+ "base64Encoded": "SEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDICExIAVH4YMX0u3fEONSkAAQBUfhgwCgYIKoUDBwEBAQEEQBU0EntPGWz8EfJ5CFL2m10xeBrkAEeWDglGQDZWLKQ0ff4TyBT9X1NhG/+ETj4TcQhExy6k+WZ9w/CpF5FjyyA=",
+ "signatureType": "rsa"
+ }
+ ]
+}'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (202 Accepted)
+
+| Атрибут | Тип | Обязательность | Описание |
+| :-------------- | :----- | :------------- | :--------------------------------------- |
+| **taxRefundId** | string | required | Идентификатор возврата налоговых средств |
+| **status** | string | required | Статус запроса (см. ниже) |
+
+**Возможные значения статуса:**
+
+- `PENDING` — запрос в процессе обработки;
+- `MANUAL_ACCEPTANCE` — ожидание ручного подтверждения запроса-дубля;
+- `AWAIT_EXTERNAL` — ожидание исполнения внешнего платежа;
+- `FAILED` — ошибка обработки;
+- `FAILED_DUPLICATE` — запрос-дубль отклонен;
+- `COMPLETE` — успешно завершено.
+
+**Пример ответа 202:**
+
+```json
+{
+ "taxRefundId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "status": "PENDING"
+}
+```
+
+---
+
+## Ошибки
+
+| Код | Описание | Тело ответа (error) |
+| :------ | :------------------ | :---------------------------------------------------- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры |
+| **401** | Unauthorized | `invalid_token` — токен недействителен или просрочен |
+| **403** | Forbidden | `insufficient_scope` — нет прав (недостаточный scope) |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден |
+| **429** | Too Many Requests | Нет тела ответа |
+| **500** | Internal Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа |
+
+---
+
+**Связанные методы:**
+
+- [Получение информации о платеже](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/get-payoff/v1/get-payoff)
+- [Получение статуса запроса на возврат налоговых денежных средств](/products/alfa-api/documentation/articles/nominal-accounts/articles/na-payments/articles/get-tax-refund-request-status/v1/get-tax-refund-request-status)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/get-identify-request-status.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/get-identify-request-status.md
new file mode 100644
index 0000000..cc9caf3
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/get-identify-request-status.md
@@ -0,0 +1,96 @@
+# Получение статуса запроса на идентификацию пополнения номинального счёта
+
+**Тип интеграции:** H2H
+
+---
+
+### Эндпоинты
+
+**Песочница**
+`GET https://sandbox.alfabank.ru/api/na/jp/v1/unidentified-transactions/{id}/identify/{identifyId}`
+
+**Пром**
+`GET https://baas.alfabank.ru/api/na/jp/v1/unidentified-transactions/{id}/identify/{identifyId}`
+
+---
+
+### Scope
+
+`beneficiary-payments`
+
+---
+
+### Описание
+
+Метод позволяет получить статус запроса на идентификацию операции пополнения по `identifyId`.
+
+---
+
+### Параметры запроса
+
+#### HEADERS
+
+| Атрибут | Описание |
+| :----------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** _string, required_ | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** _string, required_ | application/json |
+
+#### PATH
+
+| Атрибут | Описание |
+| :-------------------------------- | :--------------------------------------------------------- |
+| **id** _string, required_ | Идентификатор операции пополнения |
+| **identifyId** _string, required_ | Идентификатор запроса на идентификацию операции пополнения |
+
+---
+
+### Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/unidentified-transactions/{id}/identify/{identifyId}' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+### Параметры ответа
+
+#### 200 (OK) — BODY
+
+| Атрибут | Описание |
+| :--------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **identifyId** _string, required_ | Идентификатор запроса на идентификацию операции пополнения |
+| **status** _string, required_ | Статус запроса. Возможные значения: `PENDING` - в процессе обработки;`VALIDATED` - провалидирован;`FAILED` - возникла ошибка;`COMPLETE` - обработан успешно |
+| **description** _string, optional_ | Описание причины, по которой запрос завершился неудачей. Возвращается, если статус запроса равен `FAILED` |
+
+#### Пример ответа 200 (OK)
+
+```json
+{
+ "identifyId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "status": "PENDING",
+ "description": "Произошла техническая ошибка. Обратитесь в службу поддержки и сообщите код ошибки afc9b019-77ac-49ef-afb9-688b38b74cc2"
+}
+```
+
+---
+
+### Ошибки
+
+| Код | Описание |
+| :-------------------------- | :------------------------------------------------------------------- |
+| **400 Bad Request** | `invalid_request` — неверные входные параметры запроса |
+| **401 Unauthorized** | `invalid_token` — предоставленный токен просрочен или недействителен |
+| **403 Forbidden** | `insufficient_scope` — недостаточно прав (не настроен scope) |
+| **404 Not Found** | `unknown_endpoint` — эндпоинт не найден или неактивен |
+| **429 Too Many Requests** | Превышен лимит запросов (тело ответа отсутствует) |
+| **500 Internal Error** | `internal_error` — внутренняя ошибка сервиса |
+| **503 Service Unavailable** | Сервис временно недоступен (тело ответа отсутствует) |
+
+---
+
+**Навигация:**
+
+- [Предыдущий метод: Создание запроса на идентификацию](/products/alfa-api/documentation/articles/nominal-accounts/articles/identify-transactions/articles/identify/v1/identify)
+- [Следующий метод: Создание запроса на возврат](/products/alfa-api/documentation/articles/nominal-accounts/articles/identify-transactions/articles/transaction-refund/v1/transaction-refund)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/get-transaction-refund-request-status.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/get-transaction-refund-request-status.md
new file mode 100644
index 0000000..f10c359
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/get-transaction-refund-request-status.md
@@ -0,0 +1,78 @@
+# Получение статуса запроса на возврат неидентифицированного пополнения
+
+**Тип интеграции:** H2H
+
+## Эндпоинты
+
+**Песочница**
+`GET https://sandbox.alfabank.ru/api/na/jp/v1/unidentified-transactions/{id}/refunds/{refundId}`
+
+**Пром**
+`GET https://baas.alfabank.ru/api/na/jp/v1/unidentified-transactions/{id}/refunds/{refundId}`
+
+## Scope
+`beneficiary-payments`
+
+## Описание
+Метод позволяет получить статус запроса на возврат неидентифицированного пополнения по `refundId`.
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Описание |
+| :--- | :--- |
+| **Authorization** `string`, required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** `string`, required | application/json |
+
+### PATH
+| Атрибут | Описание |
+| :--- | :--- |
+| **id** `string`, required | Идентификатор операции пополнения, по которой необходимо вернуть денежные средства |
+| **refundId** `string`, required | Идентификатор запроса на возврат неидентифицированного пополнения, полученный с помощью метода [«Создание запроса на возврат неидентифицированного пополнения»](/products/alfa-api/documentation/articles/nominal-accounts/articles/identify-transactions/articles/transaction-refund/v1/transaction-refund) |
+
+### Пример запроса (cURL)
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/unidentified-transactions/{id}/refunds/{refundId}' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### 200 (OK)
+**BODY**
+| Атрибут | Описание |
+| :--- | :--- |
+| **refundId** `string`, required | Уникальный идентификатор запроса на возврат неидентифицированного пополнения |
+| **status** `string`, required | Статус запроса. Принимает возможные значения: • `PENDING` - запрос в процессе обработки; • `FAILED` - обработка запроса завершилась ошибкой; • `COMPLETE` - обработка запроса завершилась успешно |
+| **description** `string`, optional | Описание причины, по которой запрос завершился ошибкой. **Примечание:** поле доступно только при статусе запроса `FAILED` |
+
+#### Пример ответа 200 (OK)
+```json
+{
+ "refundId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "status": "FAILED",
+ "description": "Произошла техническая ошибка. Обратитесь в службу поддержки и сообщите код ошибки afc9b019-77ac-49ef-afb9-688b38b74cc2"
+}
+```
+
+---
+
+## Коды ошибок
+
+| Код | Описание | Возможные значения `error` |
+| :--- | :--- | :--- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры запроса |
+| **401** | Unauthorized | `invalid_token` — токен просрочен, отозван или недействителен |
+| **403** | Forbidden | `insufficient_scope` — нет прав (отсутствует нужный scope) |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден или неактивен |
+| **429** | Too Many Requests | Нет тела ответа |
+| **500** | Internal Server Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа |
+
+---
+**Навигация:**
+* Предыдущий метод: [Создание запроса на возврат неидентифицированного пополнения](/products/alfa-api/documentation/articles/nominal-accounts/articles/identify-transactions/articles/transaction-refund/v1/transaction-refund)
+* Следующий раздел: [Безопасные сделки: Как это работает](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/intro/intro)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/get-unidentified-transactions.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/get-unidentified-transactions.md
new file mode 100644
index 0000000..555517c
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/get-unidentified-transactions.md
@@ -0,0 +1,123 @@
+# Получение списка неидентифицированных пополнений номинального счёта
+
+**Тип интеграции:** H2H
+
+Метод позволяет получить информацию о транзакциях пополнения номинального счёта, которые не проходили процедуру идентификации.
+
+---
+
+## Эндпоинты
+
+### Песочница
+`GET https://sandbox.alfabank.ru/api/na/jp/v1/unidentified-transactions`
+
+### Пром
+`GET https://baas.alfabank.ru/api/na/jp/v1/unidentified-transactions`
+
+---
+
+## Scope
+`beneficiary-payments`
+
+---
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | application/json |
+
+### QUERY
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **accountNumber** | string | required | Номер номинального счёта |
+| **limit** | integer | optional | Количество объектов на одной странице |
+| **offset** | integer | optional | Количество объектов в списке, которые необходимо пропустить |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/unidentified-transactions?accountNumber=40817810306050000000&limit=100&offset={offset}' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### Ответ 200 (OK) — BODY
+
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **offset** | integer | required | Порядковый номер первого неидентифицированного пополнения в списке |
+| **limit** | integer | required | Порядковый номер последнего неидентифицированного пополнения в списке |
+| **totalCount** | integer | required | Всего неидентифицированных пополнений |
+| **unidentifiedTransactions** | array of objects | optional | Список неидентифицированных пополнений |
+
+#### Объект unidentifiedTransactions:
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **id** | string | required | ID операции пополнения |
+| **documentNumber** | string | optional | Номер платёжного поручения |
+| **date** | string | optional | Дата и время пополнения по МСК |
+| **amount** | string | required | Сумма пополнения в рублях |
+| **purpose** | string | optional | Назначение платежа |
+| **payer** | object | optional | Информация о плательщике |
+
+#### Объект payer:
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **inn** | string | optional | ИНН плательщика |
+| **kpp** | string | optional | КПП плательщика |
+| **accountNumber** | string | optional | Номер счёта плательщика |
+| **name** | string | optional | Имя плательщика |
+| **bankAccount** | string | optional | Номер счёта банка плательщика |
+| **bankBik** | string | optional | БИК банка плательщика |
+| **bankName** | string | optional | Наименования банка плательщика |
+
+### Пример ответа 200
+
+```json
+{
+ "offset": 0,
+ "limit": 100,
+ "totalCount": 1,
+ "unidentifiedTransactions": [
+ {
+ "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "documentNumber": "Номер платёжного поручения",
+ "date": "2025-04-08T10:47:17.927Z",
+ "amount": "10.00",
+ "purpose": "Назначение платежа",
+ "payer": {
+ "inn": "221284672706",
+ "kpp": "641914992",
+ "accountNumber": "87149728127096890679",
+ "name": "Имя плательщика",
+ "bankAccount": "3932755239052037086628",
+ "bankBik": "108997635",
+ "bankName": "Наименования банка плательщика"
+ }
+ }
+ ]
+}
+```
+
+---
+
+## Ошибки
+
+| Код | Описание (error) | error_description / Комментарий |
+| :--- | :--- | :--- |
+| **400** | `invalid_request` | неверные входные параметры запроса |
+| **401** | `invalid_token` | предоставленный токен просрочен, отозван или недействителен |
+| **403** | `insufficient_scope` | у пользователя нет прав на использование сервиса (настройки scope) |
+| **404** | `unknown_endpoint` | эндпоинт не найден или неактивен |
+| **429** | — | Too Many Requests (Нет тела ответа) |
+| **500** | `internal_error` | внутренняя ошибка сервиса |
+| **503** | — | Service Unavailable (Нет тела ответа) |
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/how_it_works_intro.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/how_it_works_intro.md
new file mode 100644
index 0000000..826983d
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/how_it_works_intro.md
@@ -0,0 +1,23 @@
+# Как это работает
+
+**Теги:** `H2H`
+
+Депонент (бенефициар) может пополнить номинальный счёт удобным ему способом, после чего владелец номинального счёта должен идентифицировать поступившие денежные средства.
+
+Для этого владельцу счёта необходимо:
+
+1. **Получить информацию обо всех неидентифицированных пополнениях**
+ - Метод [«Получение списка неидентифицированных пополнений номинального счёта»](/products/alfa-api/documentation/articles/nominal-accounts/articles/identify-transactions/articles/get-unidentified-transactions/v1/get-unidentified-transactions)
+
+2. **Создать запрос на идентификацию денежных средств**
+ - Метод [«Создание запроса на идентификацию пополнения номинального счёта»](/products/alfa-api/documentation/articles/nominal-accounts/articles/identify-transactions/articles/identify/v1/identify)
+
+3. **Получить статус запроса на идентификацию денежных средств**
+ - Метод [«Получение статуса запроса на идентификацию пополнения номинального счёта»](/products/alfa-api/documentation/articles/nominal-accounts/articles/identify-transactions/articles/get-identify-request-status/v1/get-identify-request-status)
+
+---
+
+### Навигация
+
+- ← [Изменение признаков платёжных реквизитов универсального реципиента](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/universal-recipients/articles/change-requisites/v1/change-requisites)
+- → [Получение списка неидентифицированных пополнений номинального счёта](/products/alfa-api/documentation/articles/nominal-accounts/articles/identify-transactions/articles/get-unidentified-transactions/v1/get-unidentified-transactions)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/identify.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/identify.md
new file mode 100644
index 0000000..1efcda2
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/identify.md
@@ -0,0 +1,108 @@
+Вот очищенная и структурированная версия документации в формате Markdown:
+
+# Создание запроса на идентификацию пополнения номинального счёта
+
+**Тип интеграции:** H2H
+
+## Эндпоинты
+
+**Песочница:**
+`POST https://sandbox.alfabank.ru/api/na/jp/v1/unidentified-transactions/{id}/identify`
+
+**Пром:**
+`POST https://baas.alfabank.ru/api/na/jp/v1/unidentified-transactions/{id}/identify`
+
+---
+
+## Scope
+`beneficiary-payments`
+
+## Описание
+Метод позволяет создать запрос на идентификацию одной из операций пополнения с помощью распределения суммы по бенефициарам.
+
+---
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | string | Да | Bearer {access_token}, полученный по [Authorization Code Flow H2H](https://developers.alfabank.ru/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | Да | application/json |
+| **Content-Type** | string | Да | application/json |
+
+### PATH
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **id** | string | Да | Идентификатор операции пополнения, которую необходимо распределить между бенефициарами |
+
+### BODY
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **transactionId** | string | Да | Идентификатор операции пополнения |
+| **accountNumber** | string | Да | Номер номинального счёта |
+| **amountDistribution** | array of objects | Да | Распределение денежных средств (список бенефициаров) |
+| └─ **beneficiaryId** | string | Да | Идентификатор бенефициара |
+| └─ **amount** | string | Да | Сумма пополнения в рублях |
+| **digestSignatures** | array of objects | Да | Электронная подпись УЛ клиента |
+| └─ **base64Encoded** | string | Да | Значение электронной подписи в Base64 |
+| └─ **signatureType** | string | Да | Тип подписи: `rsa` (RSA) или `kep` (КЭП) |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/unidentified-transactions/{id}/identify' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json' \
+--data '{
+ "transactionId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "accountNumber": "40817810306050000000",
+ "amountDistribution": [
+ {
+ "beneficiaryId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "amount": "10.00"
+ }
+ ],
+ "digestSignatures": [
+ {
+ "base64Encoded": "SEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDICExIAVH4YMX0u3fEONSkAAQBUfhgwCgYIKoUDBwEBAQEEQBU0EntPGWz8EfJ5CFL2m10xeBrkAEeWDglGQDZWLKQ0ff4TyBT9X1NhG/+ETj4TcQhExy6k+WZ9w/CpF5FjyyA=",
+ "signatureType": "rsa"
+ }
+ ]
+}'
+```
+
+---
+
+## Параметры ответа
+
+### 202 Accepted (Успешно принято)
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **identifyId** | string | Идентификатор созданного запроса |
+| **status** | string | Статус запроса: `PENDING` (в процессе), `VALIDATED` (провалидирован), `FAILED` (ошибка), `COMPLETE` (успешно) |
+
+**Пример ответа 202:**
+```json
+{
+ "identifyId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "status": "PENDING"
+}
+```
+
+### Ошибки
+* **400 Bad Request:** `invalid_request` — неверные входные параметры.
+* **401 Unauthorized:** `invalid_token` — токен просрочен или недействителен.
+* **403 Forbidden:** `insufficient_scope` — нет прав на использование сервиса.
+* **404 Not Found:** `unknown_endpoint` — эндпоинт не найден.
+* **429 Too Many Requests:** Превышен лимит запросов (тело ответа отсутствует).
+* **500 Internal Server Error:** `internal_error` — внутренняя ошибка сервиса.
+* **503 Service Unavailable:** Сервис временно недоступен (тело ответа отсутствует).
+
+---
+**Навигация:**
+* [Предыдущая: Получение списка неидентифицированных пополнений](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/identify-transactions/articles/get-unidentified-transactions/v1/get-unidentified-transactions)
+* [Следующая: Получение статуса запроса на идентификацию](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/identify-transactions/articles/get-identify-request-status/v1/get-identify-request-status)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/transaction-refund.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/transaction-refund.md
new file mode 100644
index 0000000..6490927
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Идентификация_пополнений/transaction-refund.md
@@ -0,0 +1,112 @@
+# Создание запроса на возврат неидентифицированного пополнения
+
+**Тип интеграции:** H2H
+**Продукт:** Номинальные счета
+
+## Эндпоинты
+
+| Окружение | Метод и URL |
+| :--- | :--- |
+| **Песочница** | `POST https://sandbox.alfabank.ru/api/na/jp/v1/unidentified-transactions/{id}/refunds` |
+| **Пром** | `POST https://baas.alfabank.ru/api/na/jp/v1/unidentified-transactions/{id}/refunds` |
+
+## Scope
+`beneficiary-payments`
+
+## Описание
+Метод позволяет создать запрос на возврат неидентифицированного пополнения.
+
+---
+
+## Параметры запроса
+
+### Headers
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | application/json |
+| **Content-Type** | string | required | application/json |
+
+### PATH
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **id** | string | required | Идентификатор операции пополнения, по которой необходимо вернуть денежные средства |
+
+### BODY
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **accountNumber** | string | required | Номер номинального счета |
+| **id** | string | required | Идентификатор операции пополнения, по которой необходимо вернуть денежные средства |
+| **digestSignatures** | array of objects | required | Электронная подпись УЛ клиента (см. детали ниже) |
+
+#### Детали объекта digestSignatures
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **base64Encoded** | string | required | Значение электронной подписи, закодированное в Base64 |
+| **certificateUuid** | string | optional | Идентификатор сертификата, использованного при создании электронной подписи |
+| **signatureType** | string | required | Тип электронной подписи. Возможные значения: `rsa` (RSA), `kep` (КЭП) |
+| **poaNumber** | string | optional | Номер машиночитаемой доверенности |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/unidentified-transactions/{id}/refunds' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json' \
+--data '{
+ "accountNumber": "40817810306050000000",
+ "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+ "digestSignatures": [
+ {
+ "base64Encoded": "SEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDICExIAVH4YMX0u3fEONSkAAQBUfhgwCgYIKoUDBwEBAQEEQBU0EntPGWz8EfJ5CFL2m10xeBrkAEeWDglGQDZWLKQ0ff4TyBT9X1NhG/+ETj4TcQhExy6k+WZ9w/CpF5FjyyA=",
+ "certificateUuid": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "signatureType": "rsa",
+ "poaNumber": "DOVER_CBR_7702235133_20211102_1"
+ }
+ ]
+}'
+```
+
+---
+
+## Параметры ответа
+
+### 202 (Accepted)
+Запрос успешно принят в обработку.
+
+**Пример тела ответа:**
+```json
+{
+ "refundId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "status": "PENDING"
+}
+```
+
+**Описание полей:**
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **refundId** | string | required | Уникальный идентификатор запроса на возврат неидентифицированного пополнения |
+| **status** | string | required | Статус запроса: `PENDING` (в процессе), `FAILED` (ошибка), `COMPLETE` (успешно) |
+
+---
+
+## Коды ошибок
+
+| Код | Описание | Тело ответа (error) |
+| :--- | :--- | :--- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры |
+| **401** | Unauthorized | `invalid_token` — токен просрочен или недействителен |
+| **403** | Forbidden | `insufficient_scope` — нет прав на использование сервиса |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден |
+| **429** | Too Many Requests | Превышено количество запросов (нет тела ответа) |
+| **500** | Internal Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Сервис недоступен (нет тела ответа) |
+
+---
+
+**Следующие шаги:**
+* [Получение статуса запроса на возврат неидентифицированного пополнения](/products/alfa-api/documentation/articles/nominal-accounts/articles/identify-transactions/articles/get-transaction-refund-request-status/v1/get-transaction-refund-request-status)
+* [Получение статуса запроса на идентификацию пополнения](/products/alfa-api/documentation/articles/nominal-accounts/articles/identify-transactions/articles/get-identify-request-status/v1/get-identify-request-status)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/get-request-status.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/get-request-status.md
new file mode 100644
index 0000000..c33a8f6
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/get-request-status.md
@@ -0,0 +1,96 @@
+# Получение статуса запроса
+
+**Тип интеграции:** H2H
+**Scope:** `beneficiaries`
+
+Метод позволяет получить статус запроса на регистрацию, изменение или проверку контрагента (бенефициара или универсального реципиента) по идентификатору соответствующего запроса.
+
+---
+
+## Эндпоинты
+
+### Песочница
+
+`GET https://sandbox.alfabank.ru/api/na/jp/v1/beneficiaries/requests/{requestId}/status`
+
+### Пром
+
+`GET https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/requests/{requestId}/status`
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | `application/json` |
+
+### PATH
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------------ | :----- | :------------- | :-------------------------------------------------------------------------------------------------------- |
+| **requestId** | string | required | Идентификатор запроса, полученный при создании запроса на регистрацию, изменение или проверку контрагента |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/requests/{requestId}/status' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+**Пример тела ответа:**
+
+```json
+{
+ "requestId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "status": "COMPLETE",
+ "beneficiaryId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "universalRecipientId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "description": "Произошла техническая ошибка. Обратитесь в службу поддержки и сообщите код ошибки afc9b019-77ac-49ef-afb9-688b38b74cc2",
+ "resultData": "Данные субъекта не прошли проверку: N05 PBS0023\nСубъект не прошел скоринг и деактивирован в системе.\n"
+}
+```
+
+**Описание полей BODY:**
+
+| Атрибут | Тип | Обязательность | Описание |
+| :----------------------- | :----- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **requestId** | string | required | Идентификатор запроса |
+| **status** | string | required | Статус запроса. Возможные значения: • `PENDING` – запрос в процессе обработки; • `FAILED` – обработка запроса завершилась ошибкой; • `COMPLETE` – обработка запроса завершилась успешно |
+| **beneficiaryId** | string | optional | Идентификатор бенефициара. Возвращается при получении статуса запроса на регистрацию бенефициара |
+| **universalRecipientId** | string | optional | Идентификатор универсального реципиента. Возвращается при получении статуса запроса на регистрацию универсального реципиента |
+| **description** | string | optional | Описание причины, по которой запрос завершился неудачей. Возвращается, если статус запроса равен `FAILED` |
+| **resultData** | string | optional | Результаты прохождения проверки. Возвращается при получении статуса запроса на проверку бенефициара |
+
+---
+
+## Ошибки
+
+| Код | Описание | Ошибка (`error`) | Детали |
+| :------ | :-------------------- | :------------------- | :--------------------------------------------------- |
+| **400** | Bad Request | `invalid_request` | Неверные входные параметры запроса |
+| **401** | Unauthorized | `invalid_token` | Токен просрочен, отозван или недействителен |
+| **403** | Forbidden | `insufficient_scope` | Нет прав на использование сервиса (настройки scope) |
+| **404** | Not Found | `unknown_endpoint` | Эндпоинт не найден или неактивен |
+| **429** | Too Many Requests | — | Превышен лимит запросов (тело ответа отсутствует) |
+| **500** | Internal Server Error | `internal_error` | Внутренняя ошибка сервиса |
+| **503** | Service Unavailable | — | Сервис временно недоступен (тело ответа отсутствует) |
+
+---
+
+**Навигация:**
+
+- [← Как это работает](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/intro/intro)
+- [Создание запроса на регистрацию бенефициара →](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/add-beneficiary/v1/add-beneficiary)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/intro.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/intro.md
new file mode 100644
index 0000000..b8cca14
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/intro.md
@@ -0,0 +1,81 @@
+Вот преобразованный текст из HTML-файла в формат Markdown. Я сохранил структуру, иерархию заголовков, важные примечания и все ссылки.
+
+---
+
+# Как это работает
+
+При проведении расчётов через номинальные счета необходимо обмениваться информацией о контрагентах: бенефициарах и универсальных реципиентах. Для этого необходимо предварительно зарегистрировать контрагентов и их платёжные реквизиты.
+
+## Регистрация контрагентов и платёжных реквизитов
+
+Перед проведением расчётов через номинальные счета пройдите следующие шаги:
+
+### 1. Зарегистрируйте контрагентов
+
+**Бенефициары**
+До совершения расчётов с участием бенефициара необходимо предоставить в Банк сведения о бенефициаре и зарегистрировать его в системе.
+Каждому бенефициару в рамках номинального счёта будет присвоен уникальный идентификатор — `beneficiaryId`.
+
+Для этого используются методы:
+* [«Создание запроса на регистрацию бенефициара»](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/add-beneficiary/v1/add-beneficiary)
+* [«Получение статуса запроса»](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/get-request-status/v1/get-request-status)
+
+**Универсальные реципиенты**
+При осуществлении переводов с номинального счёта, помимо бенефициаров, получателем денежных средств может быть универсальный реципиент. Для участия универсального реципиента в сделке его также необходимо зарегистрировать.
+Каждому универсальному реципиенту в рамках номинального счёта будет присвоен уникальный идентификатор — `universalRecipientId`.
+
+Для этого используются методы:
+* [«Создание запроса на регистрацию универсального реципиента»](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/universal-recipients/articles/add-ur/v1/add-ur)
+* [«Получение статуса запроса»](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/get-request-status/v1/get-request-status)
+
+### 2. Зарегистрируйте платёжные реквизиты контрагентов
+
+После регистрации бенефициара или универсального реципиента необходимо указать платёжные реквизиты, на которые он будет получать денежные средства.
+
+Для этого используются методы:
+* [«Добавление платёжных реквизитов бенефициара»](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/add-requisites/v1/add-requisites)
+* [«Добавление платёжных реквизитов универсального реципиента»](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/universal-recipients/articles/add-requisites/v1/add-requisites)
+
+---
+
+## Изменение информации о бенефициаре
+
+Изменить данные о бенефициаре можно с помощью методов:
+* [«Создание запроса на изменение информации о бенефициаре»](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/change-beneficiary/v1/change-beneficiary)
+* [«Получение статуса запроса»](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/get-request-status/v1/get-request-status)
+
+В случае, если бенефициар больше не является участником расчётов и на его виртуальных счетах не осталось денежных средств, необходимо направить запрос на деактивацию бенефициара. Если в дальнейшем на номинальный счёт деактивированного бенефициара снова поступят денежные средства, его необходимо будет активировать.
+
+## Проверка актуальности данных бенефициара
+
+Проверить актуальность ранее зарегистрированных данных о бенефициаре можно с помощью методов:
+* [«Создание запроса на проверку бенефициара»](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/beneficiary-scoring/v1/beneficiary-scoring)
+* [«Получение статуса запроса»](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/get-request-status/v1/get-request-status)
+
+## Изменение признаков платёжных реквизитов контрагентов
+
+Изменить признаки платёжных реквизитов контрагентов можно с помощью методов:
+* [«Изменение признаков платёжных реквизитов бенефициара»](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/change-requisites/v1/change-requisites)
+* [«Изменение признаков платёжных реквизитов универсального реципиента»](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/universal-recipients/articles/change-requisites/v1/change-requisites)
+
+---
+
+## Учёт денежных средств бенефициара
+
+> **Важно**
+> Биллинг для универсальных реципиентов не проводится, поскольку они не являются бенефициарами и не могут иметь собственных средств на номинальном счёте.
+
+> **Внимание**
+> Учёт денежных средств на виртуальных счетах бенефициаров будет вестись корректно только при условии, что владелец номинального счёта не использует другие каналы вывода средств (банк-клиент, бумажные поручения и др.).
+
+Для учёта денежных средств бенефициара — биллинга на стороне Банка — используются **виртуальные счета**.
+
+При регистрации бенефициара по умолчанию создается **основной виртуальный счёт**. На нём учитываются денежные средства, права на которые принадлежат бенефициару. В случае необходимости уплаты налога (при [добавлении бенефициара в качестве реципиента в этап сделки](/products/alfa-api/documentation/articles/nominal-accounts/articles/deals/articles/step-contractors/v1/step-contractors)) дополнительно создаётся **налоговый виртуальный счёт**.
+
+Виртуальный счёт состоит из доступных и захолдированных денежных средств:
+* **Доступные денежные средства** не обременены обязательствами, их можно использовать при проведении расчётов или вывести с номинального счёта.
+* **Захолдированные денежные средства** — деньги, которые уже участвуют в незавершенной сделке, их нельзя использовать для других целей или вывести.
+
+### Информация о балансе и операциях бенефициара
+* Узнать балансы по виртуальным счетам можно с помощью метода [«Получение информации о балансе бенефициара»](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/get-balance/v1/get-balance).
+* Получить список денежных операций бенефициара можно с помощью метода [«Получение списка денежных операций бенефициара»](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/get-transactions/v1/get-transactions).
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/add-beneficiary.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/add-beneficiary.md
new file mode 100644
index 0000000..d6ab987
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/add-beneficiary.md
@@ -0,0 +1,186 @@
+# Создание запроса на регистрацию бенефициара
+
+**H2H**
+
+### Эндпоинты
+
+| Среда | Метод и URL |
+| :------------ | :------------------------------------------------------------ |
+| **Песочница** | `POST https://sandbox.alfabank.ru/api/na/jp/v1/beneficiaries` |
+| **Пром** | `POST https://baas.alfabank.ru/api/na/jp/v1/beneficiaries` |
+
+### Scope
+
+`beneficiaries`
+
+### Описание
+
+Метод позволяет зарегистрировать бенефициара (контрагента с признаком `isBeneficiary = TRUE`) в системе.
+
+> **Важно**
+> В зависимости от типа бенефициара необходимо по-разному заполнять поля запроса.
+
+---
+
+### Параметры запроса
+
+#### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :----- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | application/json |
+| **Content-Type** | string | required | application/json |
+
+#### BODY
+
+| Атрибут | Тип | Обязательность | Описание |
+| :------------------------ | :------ | :------------- | :------------------------------------------------------------------------------------------------------------------------------------- |
+| **accountNumber** | string | required | Номер номинального счёта |
+| **type** | string | required | Тип бенефициара. Возможные значения: `FL_RESIDENT`, `FL_NONRESIDENT`, `UL_RESIDENT`, `UL_NONRESIDENT`, `IP_RESIDENT`, `IP_NONRESIDENT` |
+| **taxResidentUS** | boolean | required | Признак налогового резидента США |
+| **foreignTaxResident** | boolean | required | Признак иностранного налогового резидента |
+| **financialActivities** | boolean | optional | Признак осуществления финансовой деятельности. Обязательно для `UL_RESIDENT` и `UL_NONRESIDENT` |
+| **countryOfTaxResidence** | string | required | Страна налогового резидентства (ISO 3166-1 alpha-2) |
+| **name** | string | optional | Наименование организации. Обязательно для `UL_RESIDENT` и `UL_NONRESIDENT` |
+| **registrationDate** | string | optional | Дата регистрации. Обязательно для `UL_RESIDENT` и `UL_NONRESIDENT` |
+| **inn** | string | optional | ИНН. Обязательно для `UL_RESIDENT` и `UL_NONRESIDENT`. Для ФЛ/ИП указывается в `personalInformation` |
+| **kpp** | string | optional | КПП. Обязательно для `UL_RESIDENT` |
+| **ogrn** | string | optional | ОГРН. Обязательно для `UL_RESIDENT` |
+| **personalInformation** | object | optional | Персональные данные. Заполняется только для ФЛ и ИП |
+| **phoneNumber** | string | optional | Телефон |
+| **email** | string | optional | Адрес электронной почты |
+| **addresses** | array | required | Список адресов бенефициара |
+| **documents** | array | optional | Документы (подробнее ниже) |
+| **digestSignatures** | array | required | Электронная подпись УЛ клиента |
+
+---
+
+### Детальное описание объектов
+
+#### personalInformation (для ФЛ и ИП)
+
+| Атрибут | Тип | Описание |
+| :-------------- | :----- | :------------------------------------------------ |
+| **inn** | string | ИНН. Обязательно для резидентов и нерезидентов ИП |
+| **firstName** | string | Имя |
+| **middleName** | string | Отчество (optional) |
+| **lastName** | string | Фамилия |
+| **citizenship** | string | Гражданство: `RU`, `BY`, `AM`, `KZ`, `KG` |
+| **birthDate** | string | Дата рождения |
+| **birthPlace** | string | Место рождения |
+| **snils** | string | СНИЛС. Обязательно для резидентов |
+
+#### addresses
+
+| Атрибут | Тип | Описание |
+| :---------- | :----- | :------------------------------------------------------------------ |
+| **type** | string | `REGISTRATION_ADDRESS`, `RESIDENCE_ADDRESS`, `LEGAL_ENTITY_ADDRESS` |
+| **address** | string | Текстовый адрес |
+| **country** | string | Код страны (ISO 3166-1 alpha-2) |
+
+#### documents
+
+_Для резидентов обязателен `PASSPORT`. Для граждан РБ — `FOREIGN_PASSPORT`. Для остальных нерезидентов — не менее 2 документов._
+
+| Атрибут | Тип | Описание |
+| :--------------- | :----- | :------------------------------------------------------------------------------------------------------------------------------------ |
+| **type** | string | `PASSPORT`, `FOREIGN_PASSPORT`, `RESIDENCE_PERMIT`, `STATELESS_RESIDENCE_CERTIFICATE`, `TEMPORARY_RESIDENCE_PERMIT`, `MIGRATION_CARD` |
+| **serial** | string | Серия (optional) |
+| **number** | string | Номер |
+| **issueDate** | string | Дата выдачи |
+| **expireDate** | string | Дата истечения (optional) |
+| **division** | string | Код подразделения (optional) |
+| **organization** | string | Орган, выдавший документ |
+
+---
+
+### Пример запроса (cURL)
+
+```bash
+curl --location 'https://baas.alfabank.ru/api/na/jp/v1/beneficiaries' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json' \
+--data-raw '{
+ "accountNumber": "40817810306050000000",
+ "type": "FL_RESIDENT",
+ "taxResidentUS": false,
+ "foreignTaxResident": false,
+ "financialActivities": false,
+ "countryOfTaxResidence": "RU",
+ "name": "Акционерное общество «Ромашка»",
+ "registrationDate": "2025-12-18",
+ "inn": "0123456789",
+ "kpp": "0123456789",
+ "ogrn": "0123456789101",
+ "personalInformation": {
+ "inn": "112233445566",
+ "firstName": "Иван",
+ "middleName": "Иванoвич",
+ "lastName": "Иванов",
+ "citizenship": "RU",
+ "birthDate": "2000-03-02",
+ "birthPlace": "Г. Иркутск",
+ "snils": "12345678910"
+ },
+ "phoneNumber": "79130000011",
+ "email": "IvanovIvan@mail.ru",
+ "addresses": [
+ {
+ "type": "REGISTRATION_ADDRESS",
+ "address": "ул. Максима Горького 55",
+ "country": "RU"
+ }
+ ],
+ "documents": [
+ {
+ "type": "PASSPORT",
+ "serial": "6953",
+ "number": "987435",
+ "issueDate": "2022-03-02",
+ "expireDate": "2022-03-02",
+ "division": "123-321",
+ "organization": "ОВД Иркутской области по Г. Иркутску по Октябрьскому району"
+ }
+ ],
+ "digestSignatures": [
+ {
+ "base64Encoded": "SEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDICExIAVH4YMX0u3fEONSkAAQBUfhgwCgYIKoUDBwEBAQEEQBU0EntPGWz8EfJ5CFL2m10xeBrkAEeWDglGQDZWLKQ0ff4TyBT9X1NhG/+ETj4TcQhExy6k+WZ9w/CpF5FjyyA=",
+ "signatureType": "rsa"
+ }
+ ]
+}'
+```
+
+---
+
+### Параметры ответа
+
+#### 202 Accepted
+
+Запрос принят в обработку.
+
+| Атрибут | Тип | Описание |
+| :------------ | :----- | :---------------------------------------------------------------------- |
+| **requestId** | string | Идентификатор запроса |
+| **status** | string | Статус: `PENDING` (в процессе), `FAILED` (ошибка), `COMPLETE` (успешно) |
+
+**Пример ответа 202:**
+
+```json
+{
+ "requestId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "status": "COMPLETE"
+}
+```
+
+#### Коды ошибок
+
+- **400 Bad Request**: `invalid_request` — неверные параметры.
+- **401 Unauthorized**: `invalid_token` — токен недействителен.
+- **403 Forbidden**: `insufficient_scope` — нет прав доступа (недостаточный scope).
+- **404 Not Found**: `unknown_endpoint` — эндпоинт не найден.
+- **429 Too Many Requests**: Превышен лимит запросов.
+- **500 Internal Server Error**: `internal_error` — внутренняя ошибка сервера.
+- **503 Service Unavailable**: Сервис временно недоступен.
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/add-requisites.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/add-requisites.md
new file mode 100644
index 0000000..dcecf15
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/add-requisites.md
@@ -0,0 +1,129 @@
+# Добавление платёжных реквизитов бенефициара
+
+tags: `H2H`
+
+## Эндпоинты
+
+| Среда | Метод и URL |
+| :------------ | :--------------------------------------------------------------------------------------- |
+| **Песочница** | `POST https://sandbox.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/requisites` |
+| **Пром** | `POST https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/requisites` |
+
+## Scope
+
+`beneficiaries`
+
+## Описание
+
+Метод позволяет добавить платёжные реквизиты бенефициара по `beneficiaryId`.
+
+> **Важно**
+> Первые добавленные реквизиты автоматически назначаются основными для бенефициара.
+
+---
+
+## Параметры запроса
+
+### Headers
+
+| Атрибут | Тип | Обяз. | Описание |
+| :---------------- | :----- | :---- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string | Да | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | Да | `application/json` |
+| **Content-Type** | string | Да | `application/json` |
+
+### Path
+
+| Атрибут | Тип | Обяз. | Описание |
+| :---------------- | :----- | :---- | :------------------------ |
+| **beneficiaryId** | string | Да | Идентификатор бенефициара |
+
+### Body
+
+| Атрибут | Тип | Обяз. | Описание |
+| :------------------- | :------ | :---- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **beneficiaryId** | string | Нет | Идентификатор бенефициара |
+| **type** | string | Да | Тип платёжного реквизита. Возможные значения: • `ACCOUNT` — реквизиты счёта; • `CARD` — номер карты (токен); • `PHONE` — номер телефона |
+| **pan** | string | Нет | Токен номера карты. Поле обязательно при типе `CARD`. [Как сформировать токен](/products/alfa-api/documentation/articles/nominal-accounts/articles/cardtoken/cardtoken) |
+| **phoneNumber** | string | Нет | Номер телефона. Поле обязательно при типе `PHONE` |
+| **bankId** | string | Нет | Идентификатор банка контрагента-получателя. Поле обязательно при типе `PHONE` |
+| **accountNumber** | string | Нет | Номер счёта. Поле обязательно при типе `ACCOUNT` |
+| **bik** | string | Нет | БИК банка. Поле обязательно при типе `ACCOUNT` |
+| **name** | string | Нет | Тип контрагента |
+| **inn** | string | Нет | ИНН организации или физического лица |
+| **kpp** | string | Нет | КПП организации (только для юридических лиц) |
+| **isMain** | boolean | Нет | Признак основных реквизитов. По умолчанию для первых — `true`, для следующих — `false` |
+| **digestSignatures** | array | Да | Электронная подпись УЛ клиента (список объектов) |
+| └ **base64Encoded** | string | Да | Значение электронной подписи в Base64 |
+| └ **signatureType** | string | Да | Тип подписи: `rsa` или `kep` |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/requisites' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json' \
+--data '{
+ "beneficiaryId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "type": "ACCOUNT",
+ "pan": "wS7fElYo8VWeJ8KelaJ0XA==",
+ "phoneNumber": "79130000011",
+ "bankId": "012345678910",
+ "accountNumber": "40817810306050000000",
+ "bik": "044525593",
+ "name": "ООО Ромашка",
+ "inn": "1234567890",
+ "kpp": "123456789",
+ "isMain": true,
+ "digestSignatures": [
+ {
+ "base64Encoded": "SEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDICExIAVH4YMX0u3fEONSkAAQBUfhgwCgYIKoUDBwEBAQEEQBU0EntPGWz8EfJ5CFL2m10xeBrkAEeWDglGQDZWLKQ0ff4TyBT9X1NhG/+ETj4TcQhExy6k+WZ9w/CpF5FjyyA=",
+ "signatureType": "rsa"
+ }
+ ]
+}'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+| Атрибут | Тип | Обяз. | Описание |
+| :----------- | :------ | :---- | :-------------------------------------------- |
+| **id** | string | Да | Идентификатор платёжного реквизита |
+| **isMain** | boolean | Да | Признак основного реквизита (`true`/`false`) |
+| **isActive** | boolean | Да | Признак активности реквизита (`true`/`false`) |
+
+**Пример ответа:**
+
+```json
+{
+ "id": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "isMain": true,
+ "isActive": true
+}
+```
+
+---
+
+## Ошибки
+
+| Код | Описание | Тело ответа (error) |
+| :------ | :------------------ | :------------------------------------------------------- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры |
+| **401** | Unauthorized | `invalid_token` — токен просрочен или недействителен |
+| **403** | Forbidden | `insufficient_scope` — нет прав на использование сервиса |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден |
+| **429** | Too Many Requests | Нет тела ответа |
+| **500** | Internal Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа |
+
+---
+
+**Навигация:**
+← [Создание запроса на проверку бенефициара](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/beneficiary-scoring/v1/beneficiary-scoring) | [Получение платёжных реквизитов бенефициара](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/get-requisites/v1/get-requisites) →
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/beneficiary-scoring.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/beneficiary-scoring.md
new file mode 100644
index 0000000..d4bd53b
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/beneficiary-scoring.md
@@ -0,0 +1,90 @@
+# Создание запроса на проверку бенефициара
+
+**Метка:** `H2H`
+
+## Эндпоинты
+
+| Окружение | Метод и URL |
+| :------------ | :------------------------------------------------------------------------------------ |
+| **Песочница** | `POST https://sandbox.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/scoring` |
+| **Пром** | `POST https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/scoring` |
+
+## Scope
+
+`beneficiaries`
+
+## Описание
+
+Метод позволяет проверить актуальность данных бенефициара по `beneficiaryId`.
+
+> **Важно**
+> Если бенефициар не пройдет проверку, он будет деактивирован в системе.
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :------- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | `string` | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](https://developers.alfabank.ru/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | `string` | required | `application/json` |
+
+### PATH
+
+| Атрибут | Тип | Обязательность | Описание |
+| :---------------- | :------- | :------------- | :------------------------ |
+| **beneficiaryId** | `string` | required | Идентификатор бенефициара |
+
+### Пример запроса (cURL)
+
+```bash
+curl --location --globoff --request POST 'https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/scoring' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### 202 (Accepted)
+
+Успешное принятие запроса в обработку.
+
+**BODY**
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **requestId** | `string` | required | Идентификатор запроса |
+| **status** | `string` | required | Статус запроса. Возможные значения: • `PENDING` – запрос в процессе обработки; • `FAILED` – обработка запроса завершилась ошибкой; • `COMPLETE` – обработка запроса завершилась успешно |
+
+**Пример ответа:**
+
+```json
+{
+ "requestId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "status": "COMPLETE"
+}
+```
+
+---
+
+## Ошибки
+
+| Код | Описание | Тело ответа (error) |
+| :------ | :------------------ | :------------------------------------------- |
+| **400** | Bad Request | `invalid_request` — неверные параметры |
+| **401** | Unauthorized | `invalid_token` — токен недействителен |
+| **403** | Forbidden | `insufficient_scope` — нет прав (scope) |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден |
+| **429** | Too Many Requests | Нет тела ответа |
+| **500** | Internal Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа |
+
+---
+
+## Навигация
+
+- **Предыдущий метод:** [Создание запроса на изменение информации о бенефициаре](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/change-beneficiary/v1/change-beneficiary)
+- **Следующий метод:** [Добавление платёжных реквизитов бенефициара](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/add-requisites/v1/add-requisites)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/change-beneficiary.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/change-beneficiary.md
new file mode 100644
index 0000000..a298ee9
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/change-beneficiary.md
@@ -0,0 +1,151 @@
+# Создание запроса на изменение информации о бенефициаре
+
+**H2H**
+
+## Эндпоинты
+
+| Окружение | Метод и URL |
+| :------------ | :--------------------------------------------------------------------------- |
+| **Песочница** | `PUT https://sandbox.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}` |
+| **Пром** | `PUT https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}` |
+
+### Scope
+
+`beneficiaries`
+
+### Описание
+
+Метод позволяет изменить информацию о бенефициаре по `beneficiaryId`.
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Описание |
+| :---------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** _string, required_ | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** _string, required_ | `application/json` |
+| **Content-Type** _string, required_ | `application/json` |
+
+### PATH
+
+| Атрибут | Описание |
+| :---------------------------------------- | :------------------------ |
+| **beneficiaryId** _string, required_ | Идентификатор бенефициара |
+
+### BODY
+
+| Атрибут | Тип | Описание |
+| :---------------------- | :--------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **type** | _string, required_ | Тип контрагента. Возможные значения:
`FL_RESIDENT` — физ. лицо, резидент;
`UL_RESIDENT` — юр. лицо, резидент.
|
+| **name** | _string, optional_ | Наименование организации. Поле обязательно для бенефициаров с типом `UL_RESIDENT`. |
+| **registrationDate** | _string, optional_ | Дата регистрации. Поле обязательно для бенефициаров с типом `UL_RESIDENT`. |
+| **personalInformation** | _object, optional_ | Обновленные персональные данные. Заполняется для бенефициаров с типом `FL_RESIDENT`. |
+| ∟ **firstName** | _string, optional_ | Имя |
+| ∟ **middleName** | _string, optional_ | Отчество |
+| ∟ **lastName** | _string, optional_ | Фамилия |
+| ∟ **birthDate** | _string, optional_ | Дата рождения |
+| ∟ **birthPlace** | _string, optional_ | Место рождения |
+| **phoneNumber** | _string, optional_ | Телефон |
+| **email** | _string, optional_ | Адрес электронной почты |
+| **addresses** | _array of objects, optional_ | Адрес бенефициара |
+| ∟ **type** | _string, required_ | Тип адреса: `REGISTRATION_ADDRESS` (адрес регистрации) или `LEGAL_ENTITY_ADDRESS` (адрес юр. лица). |
+| ∟ **address** | _string, required_ | Строка адреса |
+| **documents** | _array of objects, optional_ | Документы. Заполняется, если `citizenship` равен `RU`. |
+| ∟ **type** | _string, required_ | Тип документа: `PASSPORT`, `FOREIGN_PASSPORT`, `RESIDENCE_PERMIT`, `STATELESS_RESIDENCE_CERTIFICATE`, `TEMPORARY_RESIDENCE_PERMIT`, `MIGRATION_CARD`. |
+| ∟ **serial** | _string, required_ | Серия документа |
+| ∟ **number** | _string, required_ | Номер документа |
+| ∟ **issueDate** | _string, required_ | Дата выдачи |
+| ∟ **division** | _string, required_ | Код подразделения |
+| ∟ **organization** | _string, required_ | Орган, выдавший документ |
+| **isActive** | _boolean, optional_ | Статус активности бенефициара |
+| **digestSignatures** | _array of objects, required_ | Электронная подпись УЛ клиента |
+| ∟ **base64Encoded** | _string, required_ | Значение электронной подписи в Base64 |
+| ∟ **signatureType** | _string, required_ | Тип подписи: `rsa` или `kep`. |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff --request PUT 'https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json' \
+--data-raw '{
+ "type": "FL_RESIDENT",
+ "name": "Акционерное общество «Ромашка»",
+ "registrationDate": "2025-12-23",
+ "personalInformation": {
+ "firstName": "Иван",
+ "middleName": "Иванoвич",
+ "lastName": "Иванов",
+ "birthDate": "2000-03-02",
+ "birthPlace": "Г. Иркутск"
+ },
+ "phoneNumber": "79130000011",
+ "email": "IvanovIvan@mail.ru",
+ "addresses": [
+ {
+ "type": "REGISTRATION_ADDRESS",
+ "address": "ул. Максима Горького 55"
+ }
+ ],
+ "documents": [
+ {
+ "type": "PASSPORT",
+ "serial": "6953",
+ "number": "987435",
+ "issueDate": "2022-03-02",
+ "division": "123-321",
+ "organization": "ОВД Иркутской области по Г. Иркутску по Октябрьскому району"
+ }
+ ],
+ "isActive": true,
+ "digestSignatures": [
+ {
+ "base64Encoded": "SEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDICExIAVH4YMX0u3fEONSkAAQBUfhgwCgYIKoUDBwEBAQEEQBU0EntPGWz8EfJ5CFL2m10xeBrkAEeWDglGQDZWLKQ0ff4TyBT9X1NhG/+ETj4TcQhExy6k+WZ9w/CpF5FjyyA=",
+ "signatureType": "rsa"
+ }
+ ]
+}'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (202 Accepted)
+
+```json
+{
+ "requestId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "status": "COMPLETE"
+}
+```
+
+| Атрибут | Тип | Описание |
+| :------------ | :----------------- | :----------------------------------------------------------------------------------------------------------------------------------------------- |
+| **requestId** | _string, required_ | Идентификатор запроса |
+| **status** | _string, required_ | Статус запроса:
`PENDING` — в процессе обработки;
`FAILED` — ошибка обработки;
`COMPLETE` — успешно завершено.
|
+
+### Коды ошибок
+
+| Код | Описание | Тело ответа (основные атрибуты) |
+| :------ | :------------------ | :------------------------------ |
+| **400** | Bad Request | `error`: `invalid_request` |
+| **401** | Unauthorized | `error`: `invalid_token` |
+| **403** | Forbidden | `error`: `insufficient_scope` |
+| **404** | Not Found | `error`: `unknown_endpoint` |
+| **429** | Too Many Requests | Нет тела ответа |
+| **500** | Internal Error | `error`: `internal_error` |
+| **503** | Service Unavailable | Нет тела ответа |
+
+---
+
+### Навигация
+
+- [← Получение информации о бенефициаре](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/get-beneficiary/v1/get-beneficiary)
+- [Создание запроса на проверку бенефициара →](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/beneficiary-scoring/v1/beneficiary-scoring)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/change-requisites.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/change-requisites.md
new file mode 100644
index 0000000..4881052
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/change-requisites.md
@@ -0,0 +1,134 @@
+# Изменение признаков платёжных реквизитов бенефициара
+
+**H2H**
+
+### Эндпоинты
+
+**Песочница**
+`PATCH https://sandbox.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/requisites/{requisiteId}`
+
+**Пром**
+`PATCH https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/requisites/{requisiteId}`
+
+---
+
+### Scope
+
+`beneficiaries`
+
+### Описание
+
+Метод позволяет изменить признаки платёжных реквизитов бенефициара по `beneficiaryId` и `requisiteId`.
+
+> **Важно**
+> Необходимо, чтобы хотя бы один из активных реквизитов бенефициара был основным.
+
+---
+
+### Параметры запроса
+
+#### HEADERS
+
+| Атрибут | Тип | Описание |
+| :---------------- | :---------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** | string (required) | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Content-Type** | string (required) | application/json |
+
+#### PATH
+
+| Атрибут | Тип | Описание |
+| :---------------- | :---------------- | :--------------------------------- |
+| **beneficiaryId** | string (required) | Идентификатор бенефициара |
+| **requisiteId** | string (required) | Идентификатор платёжного реквизита |
+
+#### BODY
+
+| Атрибут | Тип | Описание |
+| :------------------- | :-------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **pan** | string (optional) | Токен номера карты контрагента. [Как сформировать токен номера карты](/products/alfa-api/documentation/articles/nominal-accounts/articles/cardtoken/cardtoken) |
+| **keyId** | string (optional) | Идентификатор публичного ключа для расшифровки токена номера карты |
+| **phoneNumber** | string (optional) | Номер телефона контрагента |
+| **bankId** | string (optional) | Идентификатор банка контрагента |
+| **accountNumber** | string (optional) | Номер счёта контрагента |
+| **bik** | string (optional) | БИК банка контрагента |
+| **isMain** | boolean (optional) | Признак основного платёжного реквизита. • `true` - основной; • `false` - неосновной |
+| **isActive** | boolean (optional) | Признак активности платёжного реквизита. • `true` - активен; • `false` - деактивирован |
+| **digestSignatures** | array of objects (required) | Электронная подпись УЛ клиента |
+
+**Объект digestSignatures:**
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **base64Encoded** | string (required) | Значение электронной подписи, закодированное в Base64 |
+| **signatureType** | string (required) | Тип электронной подписи: • `rsa` - RSA; • `kep` - КЭП |
+
+---
+
+### Пример запроса (cURL)
+
+```bash
+curl --location --globoff --request PATCH 'https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/requisites/{requisiteId}' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Content-Type: application/json' \
+--data '{
+ "pan": "wS7fElYo8VWeJ8KelaJ0XA==",
+ "keyId": "1",
+ "phoneNumber": "79130000011",
+ "bankId": "012345678910",
+ "accountNumber": "40817810306050000000",
+ "bik": "044525593",
+ "isMain": true,
+ "isActive": true,
+ "digestSignatures": [
+ {
+ "base64Encoded": "SEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDICExIAVH4YMX0u3fEONSkAAQBUfhgwCgYIKoUDBwEBAQEEQBU0EntPGWz8EfJ5CFL2m10xeBrkAEeWDglGQDZWLKQ0ff4TyBT9X1NhG/+ETj4TcQhExy6k+WZ9w/CpF5FjyyA=",
+ "signatureType": "rsa"
+ }
+ ]
+}'
+```
+
+---
+
+### Параметры ответа
+
+**204 No Content**
+_Нет тела ответа_
+
+**400 Bad Request**
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **error** | string (required) | `invalid_request` — неверные входные параметры запроса |
+| **error_description** | string (optional) | Описание ошибки |
+
+**401 Unauthorized**
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **error** | string (required) | `invalid_token` — токен просрочен, отозван или недействителен |
+
+**403 Forbidden**
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **error** | string (required) | `insufficient_scope` — у пользователя нет прав на использование сервиса |
+
+**404 Not Found**
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **error** | string (required) | `unknown_endpoint` — эндпоинт не найден или неактивен |
+
+**429 Too Many Requests**
+_Превышен лимит запросов. Нет тела ответа._
+
+**500 Internal Server Error**
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **error** | string (required) | `internal_error` — внутренняя ошибка сервиса |
+
+**503 Service Unavailable**
+_Сервис временно недоступен._
+
+---
+
+**Навигация:**
+
+- Предыдущая статья: [Получение платёжных реквизитов бенефициара](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/get-requisites/v1/get-requisites)
+- Следующая статья: [Получение информации о балансе бенефициара](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/get-balance/v1/get-balance)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/get-balance.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/get-balance.md
new file mode 100644
index 0000000..713021f
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/get-balance.md
@@ -0,0 +1,139 @@
+# Получение информации о балансе бенефициара
+
+**Метка:** `H2H`
+
+## Эндпоинты
+
+### Песочница
+
+`GET https://sandbox.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/balance`
+
+### Пром
+
+`GET https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/balance`
+
+---
+
+## Scope
+
+`beneficiaries`
+
+## Описание
+
+Метод позволяет получить баланс счёта бенефициара по `beneficiaryId` на определённую дату.
+
+---
+
+## Параметры запроса
+
+### HEADERS
+
+| Атрибут | Описание | Тип | Обязательность |
+| :---------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- | :----- | :------------- |
+| **Authorization** | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) | string | required |
+| **Accept** | application/json | string | required |
+
+### QUERY
+
+| Атрибут | Описание | Тип | Обязательность |
+| :---------------- | :----------------------- | :----- | :------------- |
+| **accountNumber** | Номер номинального счёта | string | required |
+| **date** | Дата | string | required |
+
+### PATH
+
+| Атрибут | Описание | Тип | Обязательность |
+| :---------------- | :------------------------ | :----- | :------------- |
+| **beneficiaryId** | Идентификатор бенефициара | string | required |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/balance?accountNumber=40817810306050000000&date=2024-01-01' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### 200 (OK) — Тело ответа (BODY)
+
+| Атрибут | Описание | Тип | Обязательность |
+| :---------------- | :------------------------ | :--------------- | :------------- |
+| **beneficiaryId** | Идентификатор бенефициара | string | required |
+| **accountNumber** | Номер счёта | string | required |
+| **date** | Дата | string | required |
+| **balances** | Балансы бенефициара | array of objects | optional |
+
+#### Вложенные атрибуты `balances`:
+
+- **walletType** (string, optional): Тип кошелька. Принимает значения:
+ - `MAIN` — основной кошелек;
+ - `TAX` — налоговый кошелек.
+- **freeBalance** (string, optional): Свободные денежные средства в рублях.
+- **heldBalance** (string, optional): Захолдированные денежные средства в рублях.
+
+#### Пример ответа 200:
+
+```json
+{
+ "beneficiaryId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "accountNumber": "40817810306050000000",
+ "date": "2024-01-01",
+ "balances": [
+ {
+ "walletType": "MAIN",
+ "freeBalance": "10.00",
+ "heldBalance": "10.00"
+ }
+ ]
+}
+```
+
+---
+
+## Ошибки
+
+### 400 (Bad Request)
+
+- **error** (string): `invalid_request` — неверные входные параметры запроса.
+- **error_description** (string, optional): Описание ошибки.
+
+### 401 (Unauthorized)
+
+- **error** (string): `invalid_token` — предоставленный токен просрочен, отозван или недействителен.
+- **error_description** (string, optional): Описание ошибки.
+
+### 403 (Forbidden)
+
+- **error** (string): `insufficient_scope` — у пользователя нет прав на использование запрашиваемого сервиса.
+- **error_description** (string, optional): Описание ошибки.
+
+### 404 (Not Found)
+
+- **error** (string): `unknown_endpoint` — эндпоинт не найден или неактивен.
+- **error_description** (string, optional): Описание ошибки.
+
+### 429 (Too Many Requests)
+
+- Тело ответа отсутствует.
+
+### 500 (Internal Server Error)
+
+- **error** (string): `internal_error` — внутренняя ошибка сервиса.
+- **error_description** (string, optional): Описание ошибки.
+
+### 503 (Service Unavailable)
+
+- Тело ответа отсутствует.
+
+---
+
+**Навигация:**
+
+- Предыдущий метод: [Изменение признаков платёжных реквизитов бенефициара](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/change-requisites/v1/change-requisites)
+- Следующий метод: [Получение списка денежных операций бенефициара](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/get-transactions/v1/get-transactions)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/get-beneficiaries.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/get-beneficiaries.md
new file mode 100644
index 0000000..4747031
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/get-beneficiaries.md
@@ -0,0 +1,120 @@
+Вот обновленное, максимально полное и структурированное описание API в формате Markdown. Я добавил детали из всех скриншотов, расширил описание ошибок и структурировал данные для лучшей читаемости.
+
+---
+
+# Получение списка бенефициаров номинального счёта
+
+**Тип интеграции:** H2H (Host-to-Host)
+**Раздел:** [Номинальные счета](#) / Получение списка бенефициаров номинального счёта
+
+## 1. Общая информация
+
+Метод позволяет получить подробный список всех бенефициаров, привязанных к конкретному номинальному счёту, с возможностью фильтрации и пагинации.
+
+### Конечные точки (Endpoints)
+
+| Среда | Метод | URL |
+| :--- | :--- | :--- |
+| **Песочница** | `GET` | `https://sandbox.alfabank.ru/api/na/jp/v1/beneficiaries` |
+| **Пром** | `GET` | `https://baas.alfabank.ru/api/na/jp/v1/beneficiaries` |
+
+**Требуемый Scope:** `beneficiaries`
+
+---
+
+## 2. Параметры запроса
+
+### Заголовки (Headers)
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | `STRING` | Да | `Bearer {access_token}`, полученный по схеме Authorization Code Flow H2H. |
+| **Accept** | `STRING` | Да | Должен быть `application/json`. |
+
+### Параметры строки запроса (Query)
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **accountNumber** | `STRING` | **Да** | Номер номинального счёта (20 знаков). |
+| **type** | `STRING` | **Да** | Тип бенефициара: `FL_RESIDENT`, `FL_NONRESIDENT`, `UL_RESIDENT`, `UL_NONRESIDENT`, `IP_RESIDENT`, `IP_NONRESIDENT`. |
+| **limit** | `INTEGER` | Нет | Кол-во объектов на странице (по умолчанию обычно 100). |
+| **offset** | `INTEGER` | Нет | Смещение (кол-во пропускаемых объектов). |
+| **inn** | `STRING` | Нет | ИНН (10 цифр для ЮЛ, 12 — для ФЛ/ИП). |
+| **lastName** | `STRING` | Нет | Фамилия (для ФЛ и ИП). |
+| **firstName** | `STRING` | Нет | Имя (для ФЛ и ИП). |
+| **middleName** | `STRING` | Нет | Отчество (для ФЛ и ИП). |
+| **kpp** | `STRING` | Нет | КПП (только для `UL_RESIDENT`). |
+| **name** | `STRING` | Нет | Название организации (для ЮЛ). |
+| **ogrn** | `STRING` | Нет | ОГРН (только для `UL_RESIDENT`). |
+| **isVpr** | `BOOLEAN` | Нет | `true` — является выгодоприобретателем, `false` — нет. |
+| **isActive** | `BOOLEAN` | Нет | Статус: `true` — активен, `false` — деактивирован. |
+| **date** | `STRING` | Нет | Дата выборки. |
+
+**Пример вызова (cURL):**
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/beneficiaries?accountNumber=40817810306050000000&type=FL_RESIDENT' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## 3. Параметры ответа (200 OK)
+
+В случае успеха возвращается объект со списком бенефициаров и данными пагинации.
+
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **pagination** | `OBJECT` | Информация о страницах: `limit`, `offset`, `totalCount`. |
+| **accountNumber**| `STRING` | Номер счёта, по которому сделан запрос. |
+| **beneficiaries** | `ARRAY` | Массив объектов бенефициаров (включает ФИО, ИНН, адреса, документы и балансы). |
+
+---
+
+## 4. Обработка ошибок
+
+Ниже приведен полный перечень возможных ошибок с описанием их причин.
+
+### Сводная таблица кодов
+| Код | Описание | Тело ответа |
+| :--- | :--- | :--- |
+| **400** | Bad Request | Ошибка в параметрах запроса. |
+| **401** | Unauthorized | Проблемы с токеном доступа. |
+| **403** | Forbidden | Недостаточно прав (Scope). |
+| **404** | Not Found | Ресурс или эндпоинт не найден. |
+| **429** | Too Many Requests | Превышен лимит запросов (без тела). |
+| **500** | Internal Server Error | Внутренняя ошибка сервера. |
+| **503** | Service Unavailable | Сервис временно недоступен (без тела). |
+
+---
+
+### Детальное описание бизнес-ошибок
+
+#### 400 Bad Request
+Возникает при передаче невалидных данных (например, неверный формат номера счета).
+* `error`: `invalid_request`
+* `error_description`: Описание конкретной ошибки валидации.
+
+#### 401 Unauthorized
+Проблема с авторизационным заголовком или самим токеном.
+* `error`: `invalid_token`
+* `error_description`: Предоставленный токен просрочен, отозван, имеет неправильный формат или недействителен.
+
+#### 403 Forbidden
+Доступ к методу ограничен настройками безопасности.
+* `error`: `insufficient_scope`
+* `error_description`: У пользователя нет прав на использование сервиса (отсутствует нужный scope в токене).
+
+#### 404 Not Found
+Запрашиваемый адрес API не существует или отключен.
+* `error`: `unknown_endpoint`
+* `error_description`: Эндпоинт не найден или неактивен.
+
+#### 500 Internal Server Error
+Непредвиденная ошибка на стороне банка.
+* `error`: `internal_error`
+* `error_description`: Внутренняя ошибка сервиса при выполнении обработки запроса.
+
+---
+
+## 5. Навигация
+
+← [Создание запроса на регистрацию бенефициара](#) | [Получение информации о бенефициаре](#) →
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/get-beneficiary.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/get-beneficiary.md
new file mode 100644
index 0000000..407a223
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/get-beneficiary.md
@@ -0,0 +1,178 @@
+Вот преобразованная документация в формате Markdown. Я сохранил структуру, таблицы параметров, примеры кода и ссылки.
+
+---
+
+# Получение информации о бенефициаре `H2H`
+
+Метод позволяет получить информацию о бенефициаре по `beneficiaryId`.
+
+## Эндпоинты
+
+| Окружение | Метод и URL |
+| :--- | :--- |
+| **Песочница** | `GET https://sandbox.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}` |
+| **Пром** | `GET https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}` |
+
+## Scope
+`beneficiaries`
+
+---
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | string | Да | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | Да | application/json |
+
+### PATH
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **beneficiaryId** | string | Да | Идентификатор бенефициара |
+
+### Пример запроса (cURL)
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+#### Пример тела ответа
+```json
+{
+ "beneficiaryId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "type": "FL_RESIDENT",
+ "personalInformation": {
+ "inn": "112233445566",
+ "firstName": "Иван",
+ "middleName": "Иванoвич",
+ "lastName": "Иванов",
+ "citizenship": "RU",
+ "birthDate": "2000-03-02",
+ "birthPlace": "Г. Иркутск",
+ "snils": 12345678910
+ },
+ "countryOfTaxResidence": "RU",
+ "phoneNumber": "79130000011",
+ "email": "IvanovIvan@mail.ru",
+ "addresses": [
+ {
+ "type": "REGISTRATION_ADDRESS",
+ "address": "ул. Пушкина 55",
+ "index": "123456",
+ "region_code": "77",
+ "uin": "550e8400-e29b-41d4-a716-446655440000",
+ "municipal_district": {
+ "type_code": 1,
+ "name": "Ленинский муниципальный район"
+ },
+ "settlement": {
+ "type_code": 1,
+ "name": "Городское поселение Ленинское"
+ },
+ "locality": {
+ "type": "город",
+ "name": "Ленинск"
+ },
+ "planning_structure": {
+ "type": "микрорайон",
+ "name": "Центральный"
+ },
+ "street_network": {
+ "type": "улица",
+ "name": "Ленина"
+ },
+ "buildings": [
+ {
+ "type": "дом",
+ "name": "3"
+ }
+ ],
+ "building_premises": {
+ "type": "квартира",
+ "name": "42"
+ },
+ "flat_premises": {
+ "type": "комната",
+ "name": "гостиная"
+ }
+ }
+ ],
+ "documents": [
+ {
+ "type": "PASSPORT",
+ "serial": "6953",
+ "number": "987435",
+ "issueDate": "2022-03-02",
+ "expireDate": "2022-03-02",
+ "division": "123-321",
+ "organization": "ОВД Иркутской области по Г. Иркутску по Октябрьскому району"
+ }
+ ],
+ "name": "Акционерное общество «Ромашка»",
+ "registrationDate": "2025-12-18",
+ "inn": "0123456789",
+ "kpp": "0123456789",
+ "ogrn": "0123456789101",
+ "isActive": true,
+ "actualizationDateExpire": "2025-12-18",
+ "balances": [
+ {
+ "walletType": "MAIN",
+ "freeBalance": "10.00",
+ "heldBalance": "10.00"
+ }
+ ],
+ "isBeneficiary": true,
+ "isVpr": true
+}
+```
+
+#### Описание полей (BODY)
+
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **beneficiaryId** | string | Идентификатор бенефициара |
+| **type** | string | Тип контрагента: `FL_RESIDENT`, `FL_NONRESIDENT`, `UL_RESIDENT`, `UL_NONRESIDENT`, `IP_RESIDENT`, `IP_NONRESIDENT` |
+| **personalInformation** | object | Персональные данные (только для ФЛ и ИП) |
+| ∟ **inn** | string | ИНН |
+| ∟ **firstName** | string | Имя |
+| ∟ **lastName** | string | Фамилия |
+| ∟ **citizenship** | string | Гражданство: `RU`, `BY`, `AM`, `KZ`, `KG` |
+| **countryOfTaxResidence**| string | Страна налогового резидентства (ISO 3166-1 alpha-2) |
+| **addresses** | array | Список адресов |
+| ∟ **type** | string | `REGISTRATION_ADDRESS`, `RESIDENCE_ADDRESS`, `LEGAL_ENTITY_ADDRESS` |
+| **documents** | array | Список документов (Для резидентов обязателен `PASSPORT`) |
+| **name** | string | Наименование организации (для UL) |
+| **isActive** | boolean | Статус активности бенефициара (`true`/`false`) |
+| **balances** | array | Балансы бенефициара |
+| ∟ **walletType** | string | Тип кошелька: `MAIN` (основной), `TAX` (налоговый) |
+| **isBeneficiary** | boolean | `true` — бенефициар, `false` — универсальный реципиент |
+| **isVpr** | boolean | Признак выгодоприобретателя (ВПР) |
+
+---
+
+## Ошибки
+
+| Код | Описание | Возможные причины (`error`) |
+| :--- | :--- | :--- |
+| **400** | Bad Request | `invalid_request` — неверные параметры запроса |
+| **401** | Unauthorized | `invalid_token` — токен просрочен или недействителен |
+| **403** | Forbidden | `insufficient_scope` — недостаточно прав (проверьте scope) |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден |
+| **429** | Too Many Requests | Превышен лимит запросов (нет тела ответа) |
+| **500** | Internal Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Сервис временно недоступен |
+
+---
+
+**Навигация:**
+* [← Получение списка бенефициаров номинального счёта](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/get-beneficiaries/v1/get-beneficiaries)
+* [Создание запроса на изменение информации о бенефициаре →](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/change-beneficiary/v1/change-beneficiary)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/get-requisites.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/get-requisites.md
new file mode 100644
index 0000000..79916b2
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/get-requisites.md
@@ -0,0 +1,108 @@
+# Получение платёжных реквизитов бенефициара
+
+tags: `H2H`
+
+**Продукт:** Номинальные счета / Бенефициары
+**Scope:** beneficiaries
+
+---
+
+## Эндпоинты
+
+**Песочница:**
+`GET https://sandbox.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/requisites`
+
+**Пром:**
+`GET https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/requisites`
+
+---
+
+## Описание
+
+Метод позволяет получить платёжные реквизиты бенефициара по идентификатору `beneficiaryId`.
+
+---
+
+## Параметры запроса
+
+### Заголовки (Headers)
+
+| Атрибут | Описание |
+| :----------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Authorization** (string, required) | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** (string, required) | application/json |
+
+### Путь (PATH)
+
+| Атрибут | Описание |
+| :----------------------------------- | :------------------------ |
+| **beneficiaryId** (string, required) | Идентификатор бенефициара |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/requisites' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ: 200 (OK)
+
+**Пример тела ответа:**
+
+```json
+[
+ {
+ "Id": "cba2888c-71ad-4211-9420-a85f6e4c10f9",
+ "type": "ACCOUNT",
+ "pan": "wS7fElYo8VWeJ8KelaJ0XA==",
+ "phoneNumber": "79130000011",
+ "bankId": "012345678910",
+ "accountNumber": "40817810306050000000",
+ "bik": "044525593",
+ "isMain": true,
+ "isActive": true
+ }
+]
+```
+
+**Описание полей (BODY):**
+
+| Атрибут | Тип | Описание |
+| :---------------- | :----------------- | :----------------------------------------------------------------------------------------- |
+| **Id** | string (required) | Идентификатор платёжного реквизита |
+| **type** | string (required) | Тип платёжного реквизита: ACCOUNT (счёт), CARD (номер карты/токен), PHONE (номер телефона) |
+| **pan** | string (optional) | Токен номера карты. Заполняется при типе CARD |
+| **phoneNumber** | string (optional) | Номер телефона. Заполняется при типе PHONE |
+| **bankId** | string (optional) | Идентификатор банка контрагента-получателя. Заполняется при типе PHONE |
+| **accountNumber** | string (optional) | Номер счёта. Заполняется при типе ACCOUNT |
+| **bik** | string (optional) | БИК банка. Заполняется при типе ACCOUNT |
+| **isMain** | boolean (required) | Признак основного реквизита: true — основной, false — неосновной |
+| **isActive** | boolean (required) | Признак активности: true — активен, false — деактивирован |
+
+---
+
+## Ошибки
+
+| Код | Статус | Код ошибки (error) и описание |
+| :------ | :------------------ | :------------------------------------------------------ |
+| **400** | Bad Request | invalid_request — неверные входные параметры |
+| **401** | Unauthorized | invalid_token — токен недействителен или просрочен |
+| **403** | Forbidden | insufficient_scope — нет прав доступа к сервису (scope) |
+| **404** | Not Found | unknown_endpoint — эндпоинт не найден |
+| **429** | Too Many Requests | Превышено количество запросов (без тела ответа) |
+| **500** | Internal Error | internal_error — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Сервис временно недоступен (без тела ответа) |
+
+---
+
+**Навигация:**
+
+- [Добавление платёжных реквизитов бенефициара](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/add-requisites/v1/add-requisites)
+- [Изменение признаков платёжных реквизитов бенефициара](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/change-requisites/v1/change-requisites)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/get-transactions.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/get-transactions.md
new file mode 100644
index 0000000..f35c5af
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Бенефициары/get-transactions.md
@@ -0,0 +1,109 @@
+# Получение списка денежных операций бенефициара
+
+**Тип интеграции:** H2H
+**Scope:** `beneficiaries`
+
+## Описание
+Метод позволяет получить список денежных операций бенефициара за заданный период по `beneficiaryId`.
+
+---
+
+## Эндпоинты
+
+| Среда | URL |
+| :--- | :--- |
+| **Песочница** | `GET https://sandbox.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/transactions` |
+| **Пром** | `GET https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/transactions` |
+
+---
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | `application/json` |
+
+### QUERY
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **limit** | integer | required | Количество объектов на одной странице |
+| **offset** | integer | required | Количество объектов в списке, которые необходимо пропустить |
+| **dateFrom** | string | required | Дата начала выборки (ГГГГ-ММ-ДД) |
+| **dateTo** | string | required | Дата конца выборки (ГГГГ-ММ-ДД) |
+
+### PATH
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **beneficiaryId** | string | required | Идентификатор бенефициара |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/beneficiaries/{beneficiaryId}/transactions?limit=100&offset={offset}&dateFrom=2024-01-01&dateTo=2024-01-01' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### 200 OK
+#### BODY (Object)
+* **pagination** (object, optional): Данные пагинации
+ * **limit** (number, optional): Количество записей на одной странице
+ * **offset** (number, optional): Количество записей в списке, которые были пропущены
+ * **totalCount** (number, optional): Общее количество записей
+* **transactionsList** (array of objects, optional): Список операций
+ * **type** (string, required): Тип операции. Возможные значения:
+ * `Пополнение` — увеличение денежных средств бенефициара на номинальном счёте;
+ * `Вывод` — уменьшение денежных средств бенефициара на номинальном счёте;
+ * `Заморозка` — холдирование денежных средств бенефициара на номинальном счёте;
+ * `Разморозка` — расхолдирование замороженных денежных средств бенефициара на номинальном счёте;
+ * `Исходящий перевод` — перевод денежных средств другому бенефициару;
+ * `Входящий перевод` — поступление денежных средств от другого бенефициара.
+ * **amount** (string, required): Сумма операции в рублях.
+ * **comment** (string, optional): Комментарий к операции.
+
+### Пример ответа 200
+
+```json
+{
+ "pagination": {
+ "limit": 100,
+ "offset": 0,
+ "totalCount": 10000
+ },
+ "transactionsList": [
+ {
+ "type": "Пополнение",
+ "amount": "10.00",
+ "comment": "Ручное выравнивание баланса"
+ }
+ ]
+}
+```
+
+---
+
+## Коды ошибок
+
+| Код | Описание | Тело ответа (error / error_description) |
+| :--- | :--- | :--- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры запроса |
+| **401** | Unauthorized | `invalid_token` — токен просрочен, отозван или недействителен |
+| **403** | Forbidden | `insufficient_scope` — нет прав (не настроен scope) |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден или неактивен |
+| **429** | Too Many Requests | Нет тела ответа |
+| **500** | Internal Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа |
+
+---
+
+**Навигация:**
+* Предыдущий метод: [Получение информации о балансе бенефициара](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/get-balance/v1/get-balance)
+* Следующий раздел: [Создание запроса на регистрацию универсального реципиента](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/universal-recipients/articles/add-ur/v1/add-ur)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/add-requisites.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/add-requisites.md
new file mode 100644
index 0000000..8f76bd4
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/add-requisites.md
@@ -0,0 +1,117 @@
+# Добавление платёжных реквизитов универсального реципиента
+
+**Тип интеграции:** H2H
+
+## Эндпоинты
+
+| Окружение | Метод и URL |
+| :--- | :--- |
+| **Песочница** | `POST https://sandbox.alfabank.ru/api/na/jp/v1/universal-recipients/{universalRecipientId}/requisites` |
+| **Пром** | `POST https://baas.alfabank.ru/api/na/jp/v1/universal-recipients/{universalRecipientId}/requisites` |
+
+## Scope
+`beneficiaries`
+
+## Описание
+Метод позволяет добавить платёжные реквизиты универсального реципиента по `universalRecipientId`.
+
+> **Важно**
+> Первые добавленные реквизиты автоматически назначаются основными для универсального реципиента.
+
+---
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **Authorization** | `string` (required) | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | `string` (required) | application/json |
+| **Content-Type** | `string` (required) | application/json |
+
+### PATH
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **universalRecipientId** | `string` (required) | Идентификатор универсального реципиента |
+
+### BODY
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **type** | `string` (required) | Тип платёжного реквизита. Возможные значения: • `ACCOUNT` — реквизиты счёта; • `CARD` — номер карты (токен); • `PHONE` — номер телефона |
+| **pan** | `string` (optional) | Токен номера карты. Поле обязательно при типе реквизитов `CARD`. [Как сформировать токен номера карты](/products/alfa-api/documentation/articles/nominal-accounts/articles/cardtoken/cardtoken) |
+| **phoneNumber** | `string` (optional) | Номер телефона. Поле обязательно при типе реквизитов `PHONE` |
+| **bankId** | `string` (optional) | Идентификатор банка контрагента-получателя. Поле обязательно при типе реквизитов `PHONE` |
+| **accountNumber** | `string` (optional) | Номер счёта. Поле обязательно при типе реквизитов `ACCOUNT` |
+| **bik** | `string` (optional) | БИК банка. Поле обязательно при типе реквизитов `ACCOUNT` |
+| **name** | `string` (required) | Наименование получателя. Наименование организации (для юр. лиц), либо ФИО (для физ. лиц и ИП) |
+| **inn** | `string` (required) | ИНН получателя. 10 цифр — для юр.лиц, 12 цифр — для физ.лиц и ИП |
+| **kpp** | `string` (optional) | КПП получателя. Поле обязательно, если тип универсального реципиента `UL_RESIDENT` |
+| **isMain** | `boolean` (optional) | Признак основных платежных реквизитов. По умолчанию для первых реквизитов — `true`, для последующих — `false`. |
+| **digestSignatures** | `array of objects` (required) | Электронная подпись УЛ клиента |
+| **└ base64Encoded** | `string` (required) | Значение электронной подписи, закодированное в Base64 |
+| **└ signatureType** | `string` (required) | Тип электронной подписи: `rsa` (RSA) или `kep` (КЭП) |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/universal-recipients/{universalRecipientId}/requisites' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json' \
+--data '{
+ "type": "ACCOUNT",
+ "pan": "wS7fElYo8VWeJ8KelaJ0XA==",
+ "phoneNumber": "79130000011",
+ "bankId": "012345678910",
+ "accountNumber": "40817810306050000000",
+ "bik": "044525593",
+ "name": "Иванов Иван Иванович",
+ "inn": "112233445566",
+ "kpp": "123456789",
+ "isMain": true,
+ "digestSignatures": [
+ {
+ "base64Encoded": "SEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDICExIAVH4YMX0u3fEONSkAAQBUfhgwCgYIKoUDBwEBAQEEQBU0EntPGWz8EfJ5CFL2m10xeBrkAEeWDglGQDZWLKQ0ff4TyBT9X1NhG/+ETj4TcQhExy6k+WZ9w/CpF5FjyyA=",
+ "signatureType": "rsa"
+ }
+ ]
+}'
+```
+
+---
+
+## Параметры ответа
+
+### 200 (OK)
+| Атрибут | Тип | Описание |
+| :--- | :--- | :--- |
+| **id** | `string` (required) | Идентификатор платёжного реквизита |
+| **isMain** | `boolean` (required) | Признак основного платёжного реквизита (`true` — основной, `false` — неосновной) |
+| **isActive** | `boolean` (required) | Признак активности платёжного реквизита (`true` — активен, `false` — деактивирован) |
+
+**Пример ответа 200:**
+```json
+{
+ "id": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "isMain": true,
+ "isActive": true
+}
+```
+
+### Ошибки
+| Код | Описание | Текст ошибки (error) |
+| :--- | :--- | :--- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры |
+| **401** | Unauthorized | `invalid_token` — токен просрочен или недействителен |
+| **403** | Forbidden | `insufficient_scope` — нет прав на использование сервиса (scope) |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден или неактивен |
+| **429** | Too Many Requests | Нет тела ответа |
+| **500** | Internal Server Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа |
+
+---
+**Навигация:**
+* [Предыдущая: Получение информации об универсальном реципиенте](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/universal-recipients/articles/get-ur/v1/get-ur)
+* [Следующая: Получение платёжных реквизитов универсального реципиента](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/universal-recipients/articles/get-requisites/v1/get-requisites)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/add-universal_recipient.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/add-universal_recipient.md
new file mode 100644
index 0000000..607293b
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/add-universal_recipient.md
@@ -0,0 +1,103 @@
+# Создание запроса на регистрацию универсального реципиента
+
+**Тип интеграции:** H2H
+
+## Эндпоинты
+
+| Окружение | Метод и URL |
+| :--- | :--- |
+| **Песочница** | `POST https://sandbox.alfabank.ru/api/na/jp/v1/universal-recipients` |
+| **Пром** | `POST https://baas.alfabank.ru/api/na/jp/v1/universal-recipients` |
+
+### Scope
+`beneficiaries`
+
+---
+
+## Описание
+Метод позволяет зарегистрировать универсального реципиента (контрагента с признаком `isBeneficiary = FALSE`) в системе.
+
+---
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | string | Да | Bearer {access_token}, полученный по [Authorization Code Flow H2H](https://developers.alfabank.ru/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | Да | `application/json` |
+| **Content-Type** | string | Да | `application/json` |
+
+### BODY
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **accountNumber** | string | Да | Номер номинального счёта |
+| **type** | string | Да | Тип универсального реципиента. Возможные значения: • `FL_RESIDENT` — физ. лицо, резидент; • `UL_RESIDENT` — юр. лицо, резидент |
+| **digestSignatures** | array of objects | Да | Электронная подпись УЛ клиента |
+
+**Объект digestSignatures:**
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **base64Encoded** | string | Да | Значение электронной подписи, закодированное в Base64 |
+| **signatureType** | string | Да | Тип электронной подписи. Возможные значения: • `rsa` — RSA; • `kep` — КЭП |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location 'https://baas.alfabank.ru/api/na/jp/v1/universal-recipients' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json' \
+--data '{
+ "accountNumber": "40817810306050000000",
+ "type": "FL_RESIDENT",
+ "digestSignatures": [
+ {
+ "base64Encoded": "SEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDICExIAVH4YMX0u3fEONSkAAQBUfhgwCgYIKoUDBwEBAQEEQBU0EntPGWz8EfJ5CFL2m10xeBrkAEeWDglGQDZWLKQ0ff4TyBT9X1NhG/+ETj4TcQhExy6k+WZ9w/CpF5FjyyA=",
+ "signatureType": "rsa"
+ }
+ ]
+}'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ: 202 (Accepted)
+
+**Пример тела ответа:**
+```json
+{
+ "requestId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "status": "COMPLETE"
+}
+```
+
+**Описание атрибутов:**
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **requestId** | string | Да | Идентификатор запроса |
+| **status** | string | Да | Статус запроса. Принимает значения: • `PENDING` – запрос в процессе обработки; • `FAILED` – ошибка обработки; • `COMPLETE` – успешно завершено |
+
+---
+
+## Коды ошибок
+
+| Код | Описание | Тело ответа (error) |
+| :--- | :--- | :--- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры |
+| **401** | Unauthorized | `invalid_token` — токен просрочен или недействителен |
+| **403** | Forbidden | `insufficient_scope` — нет прав (недостаточный scope) |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден |
+| **429** | Too Many Requests | Нет тела ответа |
+| **500** | Internal Server Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа |
+
+---
+
+**Навигация:**
+* Предыдущая статья: [Получение списка денежных операций бенефициара](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/beneficiaries/articles/get-transactions/v1/get-transactions)
+* Следующая статья: [Получение списка универсальных реципиентов номинального счёта](https://developers.alfabank.ru/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/universal-recipients/articles/get-urs/v1/get-urs)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/change-requisites.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/change-requisites.md
new file mode 100644
index 0000000..a6ba329
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/change-requisites.md
@@ -0,0 +1,127 @@
+# Изменение признаков платёжных реквизитов универсального реципиента
+
+**Тип интеграции:** H2H
+
+---
+
+## Эндпоинты
+
+| Окружение | Метод и URL |
+| :--- | :--- |
+| **Песочница** | `PATCH https://sandbox.alfabank.ru/api/na/jp/v1/universal-recipients/{universalRecipientId}/requisites/{requisiteId}` |
+| **Пром** | `PATCH https://baas.alfabank.ru/api/na/jp/v1/universal-recipients/{universalRecipientId}/requisites/{requisiteId}` |
+
+---
+
+## Общая информация
+
+* **Scope:** `beneficiaries`
+* **Описание:** Метод позволяет изменить признаки платёжных реквизитов универсального реципиента по `universalRecipientId` и `requisiteId`.
+
+> **Важно:** Необходимо, чтобы хотя бы один из активных реквизитов универсального реципиента был основным.
+
+---
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Content-Type** | string | required | `application/json` |
+
+### PATH
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **universalRecipientId** | string | required | Идентификатор универсального реципиента |
+| **requisiteId** | string | required | Идентификатор платёжного реквизита |
+
+### BODY
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **pan** | string | optional | Токен номера карты контрагента. [Как сформировать токен номера карты](/products/alfa-api/documentation/articles/nominal-accounts/articles/cardtoken/cardtoken) |
+| **keyId** | string | optional | Идентификатор публичного ключа для расшифровки токена номера карты |
+| **phoneNumber** | string | optional | Номер телефона контрагента |
+| **bankId** | string | optional | Идентификатор банка контрагента |
+| **accountNumber** | string | optional | Номер счета контрагента |
+| **bik** | string | optional | БИК банка контрагента |
+| **name** | string | optional | Наименование получателя |
+| **inn** | string | optional | ИНН получателя |
+| **kpp** | string | optional | КПП получателя |
+| **isMain** | boolean | optional | Признак основного платёжного реквизита: `true` — основной; `false` — неосновной |
+| **isActive** | boolean | optional | Признак активности платёжного реквизита: `true` — активен; `false` — деактивирован |
+| **digestSignatures** | array of objects | **required** | Электронная подпись УЛ клиента (см. ниже) |
+
+#### Струтура объекта digestSignatures:
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **base64Encoded** | string | required | Значение электронной подписи, закодированное в Base64 |
+| **signatureType** | string | required | Тип электронной подписи: `rsa` (RSA) или `kep` (КЭП) |
+
+---
+
+## Пример запроса
+
+```bash
+curl --location --globoff --request PATCH 'https://baas.alfabank.ru/api/na/jp/v1/universal-recipients/{universalRecipientId}/requisites/{requisiteId}' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Content-Type: application/json' \
+--data '{
+ "pan": "wS7fElYo8VWeJ8KelaJ0XA==",
+ "keyId": "1",
+ "phoneNumber": "79130000011",
+ "bankId": "012345678910",
+ "accountNumber": "40817810306050000000",
+ "bik": "044525593",
+ "name": "Иванов Иван Иванович",
+ "inn": "112233445566",
+ "kpp": "123456789",
+ "isMain": true,
+ "isActive": true,
+ "digestSignatures": [
+ {
+ "base64Encoded": "SEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDICExIAVH4YMX0u3fEONSkAAQBUfhgwCgYIKoUDBwEBAQEEQBU0EntPGWz8EfJ5CFL2m10xeBrkAEeWDglGQDZWLKQ0ff4TyBT9X1NhG/+ETj4TcQhExy6k+WZ9w/CpF5FjyyA=",
+ "signatureType": "rsa"
+ }
+ ]
+}'
+```
+
+---
+
+## Параметры ответа
+
+### 204 No Content
+Успешное выполнение запроса. Тело ответа отсутствует.
+
+### 400 Bad Request
+| Атрибут | Описание |
+| :--- | :--- |
+| **error** | `invalid_request` — неверные входные параметры запроса |
+| **error_description** | Описание ошибки |
+
+### 401 Unauthorized
+| Атрибут | Описание |
+| :--- | :--- |
+| **error** | `invalid_token` — токен просрочен, отозван или недействителен |
+
+### 403 Forbidden
+| Атрибут | Описание |
+| :--- | :--- |
+| **error** | `insufficient_scope` — нет прав (проверьте настройки scope) |
+
+### 404 Not Found
+| Атрибут | Описание |
+| :--- | :--- |
+| **error** | `unknown_endpoint` — эндпоинт не найден или неактивен |
+
+### 429 Too Many Requests
+Превышен лимит запросов. Тело ответа отсутствует.
+
+### 500 Internal Server Error
+| Атрибут | Описание |
+| :--- | :--- |
+| **error** | `internal_error` — внутренняя ошибка сервиса |
+
+### 503 Service Unavailable
+Сервис временно недоступен. Тело ответа отсутствует.
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/get-requisites.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/get-requisites.md
new file mode 100644
index 0000000..ffc68af
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/get-requisites.md
@@ -0,0 +1,88 @@
+# Получение платёжных реквизитов универсального реципиента
+
+**H2H**
+
+## Эндпоинты
+
+| Среда | Метод и URL |
+| :--- | :--- |
+| **Песочница** | `GET https://sandbox.alfabank.ru/api/na/jp/v1/universal-recipients/{universalRecipientId}/requisites` |
+| **Пром** | `GET https://baas.alfabank.ru/api/na/jp/v1/universal-recipients/{universalRecipientId}/requisites` |
+
+## Scope
+`beneficiaries`
+
+## Описание
+Метод позволяет получить платёжные реквизиты универсального реципиента по `universalRecipientId`.
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Описание | Тип | Обязательность |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) | string | required |
+| **Accept** | application/json | string | required |
+
+### PATH
+| Атрибут | Описание | Тип | Обязательность |
+| :--- | :--- | :--- | :--- |
+| **universalRecipientId** | Идентификатор универсального реципиента | string | required |
+
+### Пример запроса (cURL)
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/universal-recipients/{universalRecipientId}/requisites' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### 200 OK (Пример тела ответа)
+```json
+[
+ {
+ "type": "ACCOUNT",
+ "pan": "wS7fElYo8VWeJ8KelaJ0XA==",
+ "phoneNumber": "79130000011",
+ "bankId": "012345678910",
+ "accountNumber": "40817810306050000000",
+ "bik": "044525593",
+ "name": "Иванов Иван Иванович",
+ "inn": "112233445566",
+ "kpp": "123456789",
+ "isMain": true,
+ "isActive": true
+ }
+]
+```
+
+### BODY (Описание полей)
+| Атрибут | Описание | Тип | Обязательность |
+| :--- | :--- | :--- | :--- |
+| **type** | Тип платёжного реквизита. Возможные значения: • `ACCOUNT` — реквизиты счёта; • `CARD` — номер карты (токен); • `PHONE` — номер телефона | string | required |
+| **pan** | Токен номера карты. Возвращается, если тип реквизитов `CARD` | string | optional |
+| **phoneNumber** | Номер телефона. Возвращается, если тип реквизитов `PHONE` | string | optional |
+| **bankId** | Идентификатор банка контрагента-получателя. Возвращается, если тип реквизитов `PHONE` | string | optional |
+| **accountNumber** | Номер счёта. Возвращается, если тип реквизитов `ACCOUNT` | string | optional |
+| **bik** | БИК банка. Возвращается, если тип реквизитов `ACCOUNT` | string | optional |
+| **name** | Наименование получателя. Наименование организации (для ЮЛ), либо ФИО (для ФЛ и ИП) | string | required |
+| **inn** | ИНН получателя (10 цифр для ЮЛ, 12 цифр для ФЛ и ИП) | string | required |
+| **kpp** | КПП получателя. Возвращается, если тип универсального реципиента `UL_RESIDENT` | string | optional |
+| **isMain** | Признак основного платёжного реквизита: • `true` — основной; • `false` — неосновной | boolean | required |
+| **isActive** | Признак активности платёжного реквизита: • `true` — активен; • `false` — деактивирован | boolean | required |
+
+---
+
+## Ошибки
+
+| Код | Описание | Тело ответа (error) |
+| :--- | :--- | :--- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры запроса |
+| **401** | Unauthorized | `invalid_token` — токен просрочен, отозван или недействителен |
+| **403** | Forbidden | `insufficient_scope` — нет прав на использование сервиса (недостаточный scope) |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден или неактивен |
+| **429** | Too Many Requests | Нет тела ответа |
+| **500** | Internal Server Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Нет тела ответа |
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/get-universal_recipient.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/get-universal_recipient.md
new file mode 100644
index 0000000..4ac79da
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/get-universal_recipient.md
@@ -0,0 +1,115 @@
+# Получение информации об универсальном реципиенте
+
+**Тип интеграции:** H2H
+**Продукт:** Номинальные счета
+
+---
+
+## Эндпоинты
+
+| Среда | URL |
+| :--- | :--- |
+| **Песочница** | `GET https://sandbox.alfabank.ru/api/na/jp/v1/universal-recipients/{universalRecipientId}` |
+| **Пром** | `GET https://baas.alfabank.ru/api/na/jp/v1/universal-recipients/{universalRecipientId}` |
+
+---
+
+## Scope
+`beneficiaries`
+
+---
+
+## Описание
+Метод позволяет получить информацию об универсальном реципиенте по `universalRecipientId`.
+
+---
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | string | Да | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | Да | application/json |
+
+### PATH
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **universalRecipientId** | string | Да | Идентификатор универсального реципиента |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/universal-recipients/{universalRecipientId}' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### 200 (OK) — Тело ответа (BODY)
+
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **universalRecipientId** | string | Да | Идентификатор универсального реципиента |
+| **accountNumber** | string | Да | Номер номинального счёта |
+| **isBeneficiary** | boolean | Да | Признак бенефициара: • `true` — является бенефициаром; • `false` — является универсальным реципиентом. |
+| **type** | string | Да | Тип контрагента: • `FL_RESIDENT` — физ. лицо, резидент; • `UL_RESIDENT` — юр. лицо, резидент. |
+| **isActive** | boolean | Да | Признак активности бенефициара: • `true` — активен; • `false` — деактивирован. |
+
+**Пример успешного ответа:**
+```json
+{
+ "universalRecipientId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "accountNumber": "40817810306050000000",
+ "isBeneficiary": false,
+ "type": "FL_RESIDENT",
+ "isActive": true
+}
+```
+
+---
+
+## Ошибки
+
+### 400 — Bad Request
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **error** | string | Да | `invalid_request` — неверные входные параметры запроса |
+| **error_description** | string | Нет | Описание ошибки |
+
+### 401 — Unauthorized
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **error** | string | Да | `invalid_token` — токен просрочен, отозван или неверный формат |
+
+### 403 — Forbidden
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **error** | string | Да | `insufficient_scope` — нет прав на использование сервиса (настройки scope) |
+
+### 404 — Not Found
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **error** | string | Да | `unknown_endpoint` — эндпоинт не найден или неактивен |
+
+### 429 — Too Many Requests
+Нет тела ответа. Слишком много запросов.
+
+### 500 — Internal Server Error
+| Атрибут | Тип | Обяз. | Описание |
+| :--- | :--- | :--- | :--- |
+| **error** | string | Да | `internal_error` — внутренняя ошибка сервиса |
+
+### 503 — Service Unavailable
+Нет тела ответа. Сервис временно недоступен.
+
+---
+
+## Навигация
+* **Назад:** [Получение списка универсальных реципиентов номинального счёта](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/universal-recipients/articles/get-urs/v1/get-urs)
+* **Вперед:** [Добавление платёжных реквизитов универсального реципиента](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/universal-recipients/articles/add-requisites/v1/add-requisites)
diff --git a/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/get-universal_recipients_list.md b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/get-universal_recipients_list.md
new file mode 100644
index 0000000..54d7a36
--- /dev/null
+++ b/_docs/alfabank/payin_and_kyc/продукты_и_сервисы/Номинальные_счета/Контрагенты/Универсальные_реципиенты/get-universal_recipients_list.md
@@ -0,0 +1,110 @@
+# Получение списка универсальных реципиентов номинального счёта
+
+**Тип интеграции:** H2H
+
+---
+
+## Конечные точки (Endpoints)
+
+| Окружение | Метод и URL |
+| :--- | :--- |
+| **Песочница** | `GET https://sandbox.alfabank.ru/api/na/jp/v1/universal-recipients` |
+| **Пром** | `GET https://baas.alfabank.ru/api/na/jp/v1/universal-recipients` |
+
+---
+
+## Scope
+`beneficiaries`
+
+## Описание
+Метод позволяет получить список универсальных реципиентов номинального счёта.
+
+---
+
+## Параметры запроса
+
+### HEADERS
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **Authorization** | string | required | Bearer {access_token}, полученный по [Authorization Code Flow H2H](/products/alfa-api/documentation/articles/alfa-id/articles/acf-h2h/articles/intro/intro) |
+| **Accept** | string | required | application/json |
+
+### QUERY
+| Атрибут | Тип | Обязательность | Описание |
+| :--- | :--- | :--- | :--- |
+| **limit** | integer | optional | Количество объектов на одной странице |
+| **offset** | integer | optional | Количество объектов в списке, которые необходимо пропустить |
+| **accountNumber** | string | required | Номер номинального счёта |
+| **type** | string | required | Тип универсального реципиента. Возможные значения: `FL_RESIDENT` (физ. лицо), `UL_RESIDENT` (юр. лицо), `IP_RESIDENT` (ИП) |
+| **isActive** | boolean | optional | Признак активности: `true` — активен; `false` — деактивирован |
+| **date** | string | optional | Дата выборки |
+
+---
+
+## Пример запроса (cURL)
+
+```bash
+curl --location --globoff 'https://baas.alfabank.ru/api/na/jp/v1/universal-recipients?limit=100&offset={offset}&accountNumber=40817810306050000000&type={type}&isActive={isActive}&date=2024-01-01' \
+--header 'Authorization: Bearer {access-token}' \
+--header 'Accept: application/json'
+```
+
+---
+
+## Параметры ответа
+
+### Успешный ответ (200 OK)
+
+**Пример тела ответа:**
+```json
+{
+ "pagination": {
+ "limit": 100,
+ "offset": 0,
+ "totalCount": 1
+ },
+ "accountNumber": "40817810306050000000",
+ "date": "2024-01-01",
+ "universalRecipients": [
+ {
+ "universalRecipientId": "ab9cbb96-360a-4462-a683-955cc29f7f54",
+ "isBeneficiary": false,
+ "type": "FL_RESIDENT",
+ "isActive": true
+ }
+ ]
+}
+```
+
+**Описание полей BODY:**
+* **pagination** (object, optional): Данные пагинации.
+ * `limit` (number): Количество записей на странице.
+ * `offset` (number): Количество пропущенных записей.
+ * `totalCount` (number): Общее количество записей.
+* **accountNumber** (string, required): Номер номинального счёта.
+* **date** (string, optional): Дата.
+* **universalRecipients** (array of objects, required): Информация об универсальных реципиентах.
+ * `universalRecipientId` (string): Идентификатор реципиента.
+ * `isBeneficiary` (boolean): `true` — бенефициар, `false` — универсальный реципиент.
+ * `type` (string): Тип контрагента (`FL_RESIDENT`, `UL_RESIDENT`).
+ * `isActive` (boolean): Статус активности.
+
+---
+
+## Ошибки
+
+| Код | Описание | Код ошибки (error) |
+| :--- | :--- | :--- |
+| **400** | Bad Request | `invalid_request` — неверные входные параметры |
+| **401** | Unauthorized | `invalid_token` — токен просрочен или недействителен |
+| **403** | Forbidden | `insufficient_scope` — недостаточно прав (scope) |
+| **404** | Not Found | `unknown_endpoint` — эндпоинт не найден |
+| **429** | Too Many Requests | Превышен лимит запросов (нет тела ответа) |
+| **500** | Internal Error | `internal_error` — внутренняя ошибка сервиса |
+| **503** | Service Unavailable | Сервис временно недоступен (нет тела ответа) |
+
+---
+
+## Навигация по разделу
+* **Назад:** [Создание запроса на регистрацию универсального реципиента](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/universal-recipients/articles/add-ur/v1/add-ur)
+* **Далее:** [Получение информации об универсальном реципиенте](/products/alfa-api/documentation/articles/nominal-accounts/articles/counterparties/articles/universal-recipients/articles/get-ur/v1/get-ur)
diff --git a/_docs/alfabank/qr_payout/0_full.md b/_docs/alfabank/qr_payout/0_full.md
new file mode 100644
index 0000000..8f62cd6
--- /dev/null
+++ b/_docs/alfabank/qr_payout/0_full.md
@@ -0,0 +1,1462 @@
+## Главная
+### Инструкция по интеграции СБП C2B (Альфа-Банк)
+
+Добро пожаловать в руководство по прямой интеграции с платежным шлюзом (ПШ) Альфа-Банка для реализации сервиса СБП C2B.
+
+---
+
+### ⚠️ Важное объявление (Изменение адресов)
+С **01.11.2024** адрес тестового стенда изменен. Старые адреса недоступны.
+
+* **Новый URL тестового стенда:** `https://217.12.103.132:2443/fsCryptoProxy`
+* **Условие доступа:** Обязательное установление **MTLS соединения**.
+
+---
+
+### 1. Обзор API
+
+Взаимодействие с платежным шлюзом Альфа-Банка строится на следующих принципах:
+
+| Параметр | Описание |
+| :--- | :--- |
+| **Протокол** | HTTPS |
+| **Архитектура** | REST |
+| **Методы** | POST |
+| **Формат данных** | JSON (аргументы и ответы) |
+| **Кодировка текста** | urlencoded (внутри JSON ответов) |
+| **Поддержка** | [acquiring@alfabank.ru](mailto:acquiring@alfabank.ru) |
+
+#### Особенности обработки ошибок
+* Каждый ответ содержит поле `ErrorCode`.
+* При возникновении логической ошибки описание возвращается в поле `message`.
+
+---
+
+## 2. Процесс аутентификации
+
+Для работы со шлюзом (и на тестовой, и на промышленной среде) используется двусторонняя аутентификация **MTLS** и подпись тела запроса.
+
+### 2.1. Генерация сертификатов (Self-signed)
+Клиент должен самостоятельно сгенерировать ключевую пару RSA для подписи запросов.
+
+**Команда OpenSSL:**
+```bash
+openssl req -x509 -newkey rsa:4096 -keyout private.key -out client.crt -nodes -days 3650
+```
+
+**Рекомендуемые параметры заполнения:**
+* **Country (RU)**, **City (Moscow)**, **Organization (Ваша компания)**.
+* **Common Name:** Company Pay C2B.
+* **Срок действия:** не менее 10 лет.
+* **Длина ключа:** 2048 или 4096 бит.
+
+### 2.2. Регистрация в банке
+Файл `client.crt` необходимо отправить на [acquiring@alfabank.ru](mailto:acquiring@alfabank.ru).
+
+**Шаблон письма:**
+> **Тема:** Регистрация сертификата на [тестовом/промышленном] стенде СБП C2B
+>
+> **Тело:**
+> Просим зарегистрировать сертификат для работы с СБП C2B.
+> * **Тип регистрации:** Впервые / Повторно (взамен истёкшего alias...)
+> * **Организация:** [Название]
+> * **ИНН:** [Номер]
+> * **Вложение:** client.crt (в архиве без пароля)
+
+### 2.3. Что вы получите от банка
+После регистрации банк предоставит:
+1. **Alias** — имя вашего сертификата (передается в заголовке `key-name`).
+2. **Клиентский сертификат RSA/TLS** — для поднятия MTLS-соединения.
+3. **Корневые сертификаты банка** — для проверки серверного сертификата.
+4. **TermNo** — тестовый номер терминала.
+5. **Эндпойнт** — для промышленной среды.
+
+---
+
+## 3. Техническая реализация запроса
+
+### 3.1. Формирование заголовков (Headers)
+При каждом запросе необходимо передавать следующие заголовки:
+
+| Заголовок | Значение |
+| :--- | :--- |
+| `Content-Type` | `application/x-www-form-urlencoded` |
+| `Authorization` | Base64-строка зашифрованного хеша (см. ниже) |
+| `key-name` | Ваш **Alias**, полученный от банка |
+
+### 3.2. Подпись сообщения (Security)
+Процесс формирования заголовка `Authorization`:
+
+1. **Подготовка данных:** Сформируйте JSON-тело запроса. Исключите все пробелы, табуляции и переносы строк между ключами и значениями.
+2. **Вычисление хеша и подпись:**
+ ```bash
+ # Расчет SHA256 и подпись приватным ключом
+ openssl dgst -sha256 -sign client.key -out signature.txt block.txt
+ ```
+3. **Кодирование в Base64:**
+ ```bash
+ # Получение строки для заголовка Authorization
+ base64 signature.txt > signature64.txt
+ ```
+
+---
+
+## 4. Тестирование
+
+### 4.1. Эндпойнт тестовой среды
+`https://217.12.103.132:2443/fsCryptoProxy`
+
+### 4.2. Пример запроса (GetQRCd)
+**Body:**
+```json
+{
+ "command":"GetQRCd",
+ "TermNo":"90080567",
+ "qrcType":"01",
+ "amount":"100",
+ "currency":"RUB",
+ "paymentPurpose":"Назначение платежа"
+}
+```
+
+> **Важно по полю `paymentPurpose`:**
+> * Макс. длина: 140 символов.
+> * Допустимы: Латиница, Кириллица (кроме Ё/ё), цифры и спецсимволы.
+> * Перенос строки передается как `\\n` (двойной слэш для JSON).
+
+### 4.3. Как провести тестовую оплату
+1. Сгенерируйте QR-код через API.
+2. Откройте на смартфоне: [testpay.alfabank.ru/sbp-page](https://testpay.alfabank.ru/sbp-page).
+3. Нажмите **"Сканировать QR"** и наведите камеру на код.
+4. Нажмите **"Произвести оплату"**. Выбор банка не требуется.
+
+---
+
+## 5. Статусы и уведомления
+
+### Получение статуса платежа
+Существует два способа:
+1. **Запрос `GetQRCstatus`:** Опрос шлюза клиентом.
+2. **Callback-уведомления:** ПШ банка отправляет POST-запрос на ваш сервер.
+
+### Настройка Callback
+* Сервер ТСП должен быть публичным (HTTPS, порт 443).
+* IP-адреса банка для белого списка: `217.12.97.124`, `217.12.101.32`.
+* Для включения отправьте URL обработчика на [acquiring@alfabank.ru](mailto:acquiring@alfabank.ru).
+
+### Лимиты на тестовой среде (`GetQRCstatus`)
+* **Лимит ТСП:** не более 4 запросов в минуту.
+* **Общий лимит НСПК:** 60 запросов в минуту на весь банк.
+* При превышении возвращается ошибка `429 Too Many Requests`.
+
+---
+
+## 6. Переход в промышленную среду (Production)
+
+Для выхода в "бой" необходимо:
+1. Заключить договор по СБП с Альфа-Банком.
+2. Сгенерировать новую ключевую пару для промышленной среды.
+3. Направить письмо на регистрацию (аналогично тестовой, но с пометкой "промышленный стенд").
+4. Срок предоставления доступов — **до 3 рабочих дней**.
+
+## Общие положения
+
+### Техническая документация СБП: Общие положения
+
+Данный документ описывает принципы взаимодействия, идентификации и основные бизнес-сценарии при работе с Системой Быстрых Платежей (СБП) через хост Альфа-Банка.
+
+---
+
+## 1. Каналы взаимодействия и безопасность
+
+Взаимодействие осуществляется по протоколу **HTTP(S)** с обязательной двусторонней аутентификацией.
+
+### Требования к сертификатам
+* **Тип:** Клиентские сертификаты RSA/TLS.
+* **Управление:** Порядок выпуска и установки определяется Удостоверяющим Центром Заказчика.
+* **Именование (Alias):** На прокси-сервере Заказчика должны соблюдаться строгие правила именования:
+
+| Параметр | Требование к имени (алиасу) |
+| :--- | :--- |
+| **Обычный запрос** | Должно соответствовать коду терминала и реквизиту заголовка `key-name`. |
+| **Проверка соединения** | Должно быть равно параметру `TermNo` в теле запроса и заголовку `key-name`. |
+
+---
+
+## 2. Идентификация Виртуального терминала
+
+Для работы в системе каждому терминалу присваивается уникальный идентификатор — **TermNo**.
+
+* **Назначение:** Определение конкретного виртуального терминала, кассы или системы.
+* **Привязка:** TermNo определяет принадлежность к Юридическому лицу (ЮЛ), конкретной точке продаж (ТСП) и расчетному счету, на который будут поступать средства.
+* **Лимиты:** Минимум 1 терминал на адрес ТСП, максимум — по запросу.
+* **Применение:**
+ * Сохраняется в настройках терминала.
+ * Используется на прикладном уровне протокола совместно с сертификатом.
+ * **Обязателен** для генерации динамических QR-кодов и проверки статуса оплаты.
+
+---
+
+## 3. Общий порядок работы
+
+### 3.1. Оплата покупки (C2B)
+Процесс проведения оплаты через динамический QR-код:
+
+1. **Инициация:** Кассир вводит сумму (валюта и назначение платежа обычно подставляются автоматически).
+2. **Запрос QR:** ТСП запрашивает динамический QR-код у Банка.
+3. **Отображение:** ТСП выводит QR на экран или печатает пре-чек.
+4. **Действия клиента:**
+ * Сканирует QR через банковское приложение.
+ * Подтверждает оплату.
+5. **Проверка:** ТСП запрашивает подтверждение статуса платежа.
+6. **Фискализация:** При получении статуса «Оплачено» ТСП печатает чек.
+
+**Обязательные реквизиты в чеке оплаты:**
+* `qrcId` (Идентификатор QR-кода)
+* Код транзакции СБП
+* Дата и время операции
+
+---
+
+### 3.2. Возврат покупки
+Возврат средств имеет ряд технологических особенностей.
+
+> [!IMPORTANT]
+> **Ограничения возврата:**
+> * Возможен только при наличии чека и кода транзакции СБП.
+> * Осуществляется только по номеру телефона плательщика.
+> * Средства возвращаются только в тот же Банк-участник СБП, с которого была оплата.
+
+**Параметры для инициации возврата:**
+* Сумма (полная или частичная) и валюта.
+* Данные из чека: `qrcId`, Код транзакции, Дата оплаты.
+
+**Процесс подтверждения:**
+1. Хост Банка проверяет наличие исходной операции.
+2. Кассир проходит аутентификацию (ввод одноразового кода SMS/Push или иная проверка полномочий).
+3. ТСП отправляет финальный запрос на возврат.
+
+**Реквизиты в чеке возврата:**
+* Код транзакции `payrrn`
+* Сумма возврата
+
+---
+
+## 4. Работа с кассовыми ссылками
+
+Кассовая ссылка — это многоразовый QR-код, который активируется под конкретную покупку.
+
+### Жизненный цикл ссылки
+1. **Регистрация:** ТСП через Агента регистрирует ссылку в ОПКЦ СБП. QR-код размещается в кассовой зоне.
+2. **Активация:** В момент покупки ТСП отправляет запрос на активацию ссылки, передавая `сумму`, `валюту` и `назначение платежа`.
+ * *Совет:* Для получения уведомлений передавайте адрес `callback-url`.
+3. **Оплата:** Клиент считывает статическую ссылку, которая после активации ведет на оплату конкретного счета.
+4. **Деактивация:** Если оплата не состоялась, ТСП отправляет запрос на деактивацию.
+5. **Изменение счета:** ТСП может изменить расчетный счет, привязанный к ссылке, через запрос к Агенту ТСП (автоматические уведомления об изменении не поддерживаются).
+
+---
+
+## 5. Привязка счета и рекуррентные платежи
+
+Сценарии для реализации оплат «в один клик» или подписок.
+
+### Сценарии регистрации привязки
+| Тип сценария | Описание |
+| :--- | :--- |
+| **Чистая привязка** | Регистрация QR-кода типа `03`. Клиент сканирует код только для привязки счета без оплаты. |
+| **Оплата + Привязка** | При регистрации обычного QR на оплату передается параметр `subscriptionPurpose`. После оплаты банк предлагает клиенту привязать счет. |
+
+### Оплата по инициативе ТСП (Списание без участия клиента)
+1. ТСП регистрирует QR для оплаты с привязанного счета.
+2. ТСП направляет запрос на оплату в НСПК.
+3. НСПК запрашивает подтверждение у Банка Плательщика.
+4. При положительном ответе инициируется C2B операция, и Агент ТСП получает уведомление о финальном статусе.
+
+---
+
+## Справочник параметров (Сниппеты данных)
+
+При формировании запросов используйте следующие ключевые поля:
+
+```json
+// Пример ключевых полей для активации кассовой ссылки / оплаты
+{
+ "TermNo": "12345678", // Номер терминала
+ "amount": 10000, // Сумма в копейках/единицах
+ "currency": "RUB", // Валюта
+ "qrcId": "AD100000...", // ID QR-кода
+ "payrrn": "3021...", // Код транзакции (для возвратов)
+ "callbackUrl": "https://..." // Адрес для уведомлений
+}
+```
+
+# Статический QR-код (СБП)
+
+Статический QR-код — это инструмент безналичной оплаты через Систему быстрых платежей (СБП), являющийся альтернативой эквайрингу. Изображение QR-кода остается неизменным, его можно распечатать и разместить в кассовой зоне.
+
+### Особенности
+* **Варианты реализации:**
+ * С открытой суммой (вводит покупатель).
+ * С фиксированной суммой (задает продавец при генерации).
+* **Способы оплаты:** Сканирование камерой смартфона или использование NFC-метки.
+* **Скорость:** Средства поступают на счет продавца мгновенно.
+* **Оборудование:** Терминал не требуется.
+
+---
+
+## 1. Регистрация статического QR-кода
+
+Метод `GetQRCd` используется для формирования платежной ссылки и получения изображения QR-кода.
+
+### Параметры запроса
+| Параметр | Тип данных | Обяз. | Назначение |
+| :--- | :--- | :---: | :--- |
+| `command` | String | Y | Константа `GetQRCd`. |
+| `TermNo` | String(20) | Y | Уникальный идентификатор терминала. |
+| `qrcType` | String(2) | Y | Тип QR-кода. Для статического — `01`. |
+| `amount` | Number | O | Сумма в копейках. Если не указана — сумма открытая. |
+| `currency` | String(3) | O | Код валюты (например, `RUB`). |
+| `paymentPurpose` | String(140) | O | Назначение платежа. |
+| `width` / `height` | String | O | Размеры изображения QR-кода в пикселях. |
+| `redirectUrl` | String(1024)| O | Ссылка для возврата клиента в приложение/на сайт ТСП. |
+| `messageID` | String(1024)| O | Уникальный ID сообщения (GUID). Только латиница. |
+| `queryData.notificationUrl` | String(512) | O | URL для получения уведомления о статусе оплаты. |
+
+### Пример запроса
+```json
+{
+ "command": "GetQRCd",
+ "TermNo": "90080567",
+ "qrcType": "01",
+ "width": "600",
+ "height": "600",
+ "amount": 10000,
+ "currency": "RUB",
+ "paymentPurpose": "Оплата заказа №123",
+ "messageID": "550e8400-e29b-41d4-a716-446655440000",
+ "queryData": {
+ "notificationUrl": "https://yourserver.com/sbp/notify"
+ },
+ "redirectUrl": "https://yourshop.ru/success"
+}
+```
+
+### Параметры ответа
+| Параметр | Тип данных | Назначение |
+| :--- | :--- | :--- |
+| `ErrorCode` | String | Код ответа (0 — успех). |
+| `image` | String | Изображение QR-кода в формате BASE64. |
+| `payload` | String | Платежная ссылка (содержимое QR-кода). |
+| `qrcId` | String | Уникальный идентификатор QR-кода. |
+| `status` | String | Статус регистрации ссылки (например, `CREATED`). |
+
+---
+
+## 2. Нотификация о статусе оплаты
+
+После успешной оплаты Банк отправляет POST-запрос на `notificationUrl`, указанный при регистрации.
+
+### Параметры уведомления
+| Параметр | Тип данных | Назначение |
+| :--- | :--- | :--- |
+| `qrcId` | String | Идентификатор QR-кода. |
+| `trxId` | String | Уникальный ID платежа в НСПК. |
+| `status` | String | `ACWP` — успех, `RJCT` — отклонено. |
+| `amount` | Number | Сумма платежа в копейках. |
+| `timestamp` | String | Время операции по Гринвичу (GMT). |
+| `payerId` | String | Маскированный номер телефона плательщика. |
+
+### Пример уведомления
+```json
+{
+ "command": "qrc/notification",
+ "qrcId": "AS10000NJTDV88TN82CRT8CG1AU690OF",
+ "trxId": "A31040920067662400000550448AD7B3",
+ "status": "ACWP",
+ "amount": 10000,
+ "timestamp": "2023-04-14T09:20:06.000Z",
+ "payrrn": "000051992395",
+ "TermNo": "90080567"
+}
+```
+*ТСП должно ответить HTTP-кодом `200 OK`.*
+
+---
+
+## 3. Проведение возврата
+
+Возврат средств выполняется в два этапа.
+
+### 3.1. Проверка возможности возврата (`GetQRCreversalData`)
+Используется для получения данных о плательщике и проверки доступности операции.
+
+**Запрос:**
+| Параметр | Обяз. | Описание |
+| :--- | :---: | :--- |
+| `qrcId` | Y | ID QR-кода из оригинального платежа. |
+| `trxId` | Y | ID транзакции НСПК. |
+| `amount` | O | Сумма возврата. Если пусто — полный возврат. |
+
+**Пример ответа:**
+```json
+{
+ "ErrorCode": 0,
+ "payerBnkName": "Альфа-Банк",
+ "payerId": "*1779",
+ "trxDT": "20230414062006",
+ "message": "OK"
+}
+```
+
+### 3.2. Выполнение возврата (`QRCreversal`)
+Непосредственная инициация перевода средств клиенту.
+
+**Запрос:**
+| Параметр | Обяз. | Описание |
+| :--- | :---: | :--- |
+| `messageID` | Y | GUID, полученный в ответе `GetQRCreversalData`. |
+| `queryData.notificationUrl` | O | URL для уведомления о статусе возврата. |
+
+---
+
+## 4. Запрос статуса возврата
+
+Метод `GetQRCreversalStatus` используется для уточнения финального статуса операции возврата (B2C).
+
+### Параметры запроса
+Для поиска операции необходимо передать одну из пар:
+1. `payrrn` ИЛИ `originalTrxId` (для поиска исходного платежа).
+2. `trxId` ИЛИ `messageID` (для идентификации самого возврата).
+
+### Статусы возврата в ответе
+* `ACWP` — Возврат успешно завершен.
+* `RJCT` — Операция отклонена.
+* `NTST` — Статус неизвестен (в обработке).
+
+### Пример ответа
+```json
+{
+ "ErrorCode": 0,
+ "amount": 10000,
+ "status": "ACWP",
+ "originalTrxId": "A31040920067662400000550448AD7B3",
+ "trxId": "B31071502287201D00001650448AD7B3"
+}
+```
+
+---
+*Примечание: Все текстовые данные в запросах должны передаваться в кодировке UTF-8, формат передачи данных — JSON.*
+
+# Интеграция динамических QR-кодов (СБП)
+
+Оплата по динамическому QR-коду — это способ безналичной оплаты через Систему Быстрых Платежей (СБП). QR-код создается отдельно под каждую покупку, содержит сумму и реквизиты. Средства мгновенно поступают на счёт продавца.
+
+## 1. Регистрация динамического QR-кода
+**Метод:** `GetQRCd`
+
+Используется для генерации QR-кода под конкретный заказ.
+
+### Параметры запроса
+| Код ключа | Тип данных | Обяз. | Назначение |
+| :--- | :--- | :---: | :--- |
+| `command` | String | Y | Константа `GetQRCd` |
+| `TermNo` | String(20) | Y | Уникальный идентификатор терминала |
+| `qrcType` | String(2) | Y | Тип QR-кода. Для динамического — `02` |
+| `amount` | Number | Y | Сумма в минорных единицах (копейках) |
+| `currency` | String(3) | Y | Код валюты (для рублей — `RUB`) |
+| `OrderNumber` | String(1000)| O | Номер заказа (только латиница и цифры) |
+| `paymentPurpose`| String(140) | O | Назначение платежа |
+| `qrTtl` | String(6) | O | Срок жизни ссылки в минутах (мин. 1, рек. от 5) |
+| `queryData.notificationUrl` | String(512) | O | URL для уведомления о статусе оплаты |
+| `redirectUrl` | String(1024)| O | Ссылка для возврата клиента в приложение/сайт |
+| `extJsonParams` | Object | O | Блок дополнительных параметров (JsonParam1-10) |
+
+**Для подписок (рекуррентных платежей):**
+* `subscriptionServiceId`: Идентификатор привязки.
+* `subscriptionServiceName`: Наименование привязки.
+
+### Пример запроса
+```json
+{
+ "command": "GetQRCd",
+ "TermNo": "90080567",
+ "amount": "10000",
+ "currency": "RUB",
+ "qrcType": "02",
+ "qrTtl": "5",
+ "OrderNumber": "FYI123456",
+ "queryData": {
+ "notificationUrl": "https://sbp-payments.your-site.com/callback"
+ }
+}
+```
+
+### Параметры ответа
+| Код ключа | Тип данных | Обяз. | Назначение |
+| :--- | :--- | :---: | :--- |
+| `ErrorCode` | String | Y | Код ответа (0 — успех) |
+| `image` | String | Y | Изображение QR-кода в формате Base64 |
+| `payload` | String | Y | Платежная ссылка СБП |
+| `qrcId` | String | Y | Уникальный идентификатор QR-кода |
+| `status` | String | Y | Статус регистрации (например, `CREATED`) |
+
+---
+
+## 2. Запрос статуса оплаты
+**Метод:** `GetQRCstatus`
+
+Направляется кассой/терминалом для проверки факта оплаты.
+> **Важно:** Запрос следует направлять не ранее, чем через 10 секунд после формирования QR, и не чаще чем раз в 3 секунды.
+
+### Параметры запроса
+| Код ключа | Тип данных | Обяз. | Назначение |
+| :--- | :--- | :---: | :--- |
+| `command` | String | Y | Константа `GetQRCstatus` |
+| `TermNo` | String | Y | Идентификатор терминала |
+| `qrcId` | String | Y/O | ID QR-кода (обязательно, если нет payrrn) |
+| `payrrn` | String | Y/O | Референс запроса в системе Банка |
+
+### Возможные статусы (`status`)
+1. `ACWP` (ACCEPTED) — Операция завершена успешно.
+2. `RJCT` (REJECTED) — Операция отклонена.
+3. `NTST` (NOT_STARTED) — Операция не найдена (нужен повтор запроса).
+4. `RCVD` (RECEIVED) — Операция в обработке.
+
+### Пример ответа (Успех)
+```json
+{
+ "ErrorCode": 0,
+ "status": "ACWP",
+ "qrcId": "AD100026KQ0ESJBV8OFPCG0U9K1H52UM",
+ "trxId": "A3013090427361010000057B3DA2D4A7",
+ "amount": 10000,
+ "payerId": "*********1234"
+}
+```
+
+---
+
+## 3. Нотификация о финальном статусе
+**Метод:** `qrc/notification`
+
+Запрос отправляется со стороны Банка на `notificationUrl` ТСП.
+
+### Формат уведомления
+```json
+{
+ "command": "qrc/notification",
+ "qrcId": "AD100026KQ0ESJBV8OFPCG0U9K1H52UM",
+ "status": "ACWP",
+ "amount": "10000",
+ "trxId": "A3013090427361010000057B3DA2D4A7",
+ "timestamp": "2022-10-27T14:33:49.000Z"
+}
+```
+*ТСП должно ответить HTTP-кодом `200`.*
+
+---
+
+## 4. Проведение возврата
+Возврат может быть выполнен в два этапа (проверка + выполнение) или в один этап (при передаче `messageID`).
+
+### 4.1 Проверка возможности возврата (`GetQRCreversalData`)
+Используется для получения данных о плательщике и проверки доступного остатка.
+
+### 4.2 Выполнение возврата (`QRCreversal`)
+**Параметры запроса:**
+| Код ключа | Тип данных | Обяз. | Назначение |
+| :--- | :--- | :---: | :--- |
+| `command` | String | Y | Константа `QRCreversal` |
+| `amount` | Number | O | Сумма возврата (если не указана — полный возврат) |
+| `qrcId`/`trxId` | String | Y | Идентификаторы оригинальной операции |
+| `ReturnRestAmount`| Boolean| O | Вернуть остаток доступных средств в ответе |
+
+### Пример ответа на возврат
+```json
+{
+ "ErrorCode": 0,
+ "message": "Возврат проведен",
+ "amount": 10000,
+ "trxId": "A3024113609260070000086B8426B817",
+ "restAmount": "99.87"
+}
+```
+
+---
+
+## 5. История и статусы возвратов
+
+### Запрос истории (`GetQRCreversalHistory`)
+Позволяет получить список всех попыток возврата по одной транзакции оплаты.
+
+**Пример структуры массива `refunds` в ответе:**
+```json
+"refunds": [
+ {
+ "status": "ACWP",
+ "amount": 10000,
+ "trxId": "B51390823097450W0000180011510503",
+ "trxDT": "20250519082345"
+ },
+ {
+ "status": "RJCT",
+ "amount": 10000,
+ "trxId": "A4327120041167130000020011381101"
+ }
+]
+```
+
+---
+
+## 6. Нотификация о возврате
+**Метод:** `b2c-refund/notification`
+
+Банк уведомляет систему ТСП о финальном статусе операции возврата.
+
+### Пример уведомления
+```json
+{
+ "command": "b2c-refund/notification",
+ "status": "ACWP",
+ "amount": "10000",
+ "originalTrxId": "X1A2S3D5F6G7H8J9K0C4S5C6D7V5D1K2",
+ "trxId": "A3024113609260070000086B8426B817"
+}
+```
+
+---
+
+## Примечания
+* **Формат данных:** Все текстовые данные в ответах передаются в формате `urlencoded`.
+* **Суммы:** Все суммы в запросах передаются как целые числа в копейках.
+* **Ошибки:** Список кодов ошибок приведен в Приложении №2 (согласно основной документации Банка).
+* **Успешная оплата:** Считается подтвержденной только при получении статуса `ACWP` и наличии `trxId`.
+
+# Кассовая платёжная ссылка СБП: Техническая документация
+
+**Кассовая платёжная ссылка** — это гибридное решение, объединяющее преимущества статического и динамического QR-кодов. QR-код остается неизменным (его можно распечатать один раз), но сумма оплаты передается с кассы в момент покупки, что исключает ошибки ручного ввода со стороны клиента.
+
+## Общие положения
+* Для каждой кассы/терминала создается уникальная ссылка.
+* Сумма передается в **минорных единицах** (копейках).
+* Текстовые данные в ответах передаются в формате `urlencoded`.
+
+---
+
+## 1. Регистрация кассовой платёжной ссылки
+Метод `RegCashQRc` используется для генерации постоянного QR-кода для терминала.
+
+### Параметры запроса
+| Параметр | Тип | Обяз. | Назначение |
+| :--- | :--- | :---: | :--- |
+| `command` | String | Y | Константа `RegCashQRc` |
+| `TermNo` | String | Y | Уникальный ID терминала (до 20 симв.) |
+| `mediaType` | String | N | Тип картинки (напр., `image/png`) |
+| `width` | String | N | Ширина изображения |
+| `height` | String | N | Высота изображения |
+| `redirectUrl` | String | N | Ссылка для возврата клиента в приложение ТСП |
+| `qrcId` | String | N | ID для привязки предвыпущенных NFC-табличек |
+
+**Пример запроса:**
+```json
+{
+ "command": "RegCashQRc",
+ "TermNo": "90080567",
+ "mediaType": "image/png",
+ "width": "600",
+ "height": "600",
+ "redirectUrl": "https://exampletsp.io/callback"
+}
+```
+
+---
+
+## 2. Активация ссылки (Передача суммы)
+Метод `ActivateCashQRc` вызывается кассой в момент совершения покупки для установки суммы и параметров платежа.
+
+### Параметры запроса
+| Параметр | Тип | Обяз. | Назначение |
+| :--- | :--- | :---: | :--- |
+| `command` | String | Y | Константа `ActivateCashQRc` |
+| `TermNo` | String | Y | ID терминала |
+| `qrcId` | String | Y | ID QR-кода |
+| `amount` | Number | Y | Сумма в копейках |
+| `currency` | String | N | Валюта (по умолчанию `RUB`) |
+| `qrTtl` | String | N | Срок жизни активации (5–20 мин) |
+| `queryData.notificationUrl` | String | N | URL для уведомления об оплате |
+
+**Пример запроса:**
+```json
+{
+ "command": "ActivateCashQRc",
+ "TermNo": "90080567",
+ "qrcId": "BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+ "amount": 10000,
+ "currency": "RUB",
+ "qrTtl": "5",
+ "queryData": {
+ "notificationUrl": "https://sbp-payments.your-site.ru"
+ }
+}
+```
+
+---
+
+## 3. Проверка статуса оплаты
+Метод `GetQRCstatus` используется для получения финального статуса транзакции. Рекомендуется запрашивать не ранее 10 сек. после активации и не чаще раза в 3 сек.
+
+### Статусы оплаты (поле `status`)
+* **ACWP** (ACCEPTED) — Оплата успешно завершена.
+* **RJCT** (REJECTED) — Операция отклонена.
+* **NTST** (NOT_STARTED) — Оплата еще не инициирована.
+* **RCVD** (RECEIVED) — В обработке.
+
+**Пример ответа (Успех):**
+```json
+{
+ "ErrorCode": 0,
+ "status": "ACWP",
+ "trxId": "A30180803159571F0000097B3DA2D4A7",
+ "amount": 10000,
+ "payerId": "*********1234",
+ "payrrn": "000056251465"
+}
+```
+
+---
+
+## 4. Деактивация ссылки
+Метод `DelCashQRc` используется для досрочной отмены ожидания оплаты (например, если клиент отказался от покупки).
+
+**Пример запроса:**
+```json
+{
+ "command": "DelCashQRc",
+ "TermNo": "90080567",
+ "qrcId": "BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9"
+}
+```
+
+---
+
+## 5. Возврат платежа
+Возврат по СБП выполняется в два этапа (или в один при наличии `messageID`).
+
+### Этап 1: Проверка возможности возврата (`GetQRCreversalData`)
+Позволяет узнать доступный остаток и получить данные для проведения возврата.
+
+### Этап 2: Проведение возврата (`QRCreversal`)
+**Пример запроса на возврат:**
+```json
+{
+ "command": "QRCreversal",
+ "TermNo": "90080567",
+ "payrrn": "000056251465",
+ "amount": 10000,
+ "messageID": "f9aa54ff-a615-44b8-aa6c-acab655c89f8"
+}
+```
+
+---
+
+## 6. Нотификации (Webhooks)
+Банк отправляет POST-запросы на ваш `notificationUrl` при изменении статуса оплаты или возврата.
+
+### Уведомление об оплате (`qrc/notification`)
+```json
+{
+ "command": "qrc/notification",
+ "qrcId": "BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+ "status": "ACWP",
+ "amount": 10000,
+ "trxId": "A30180803159571F0000097B3DA2D4A7"
+}
+```
+
+---
+
+## 7. Изменение параметров ссылки
+Метод `ChangeAccForCashQRc` позволяет перепривязать QR-код к другому счету, терминалу или изменить `redirectUrl`.
+
+| Параметр | Назначение |
+| :--- | :--- |
+| `NewTermNo` | Перенос на новый ID терминала |
+| `NewMerchantId` | Перенос на другую торговую точку |
+| `account` | Смена расчетного счета |
+
+---
+
+## Приложение: Коды ошибок (ErrorCode)
+| Код | Описание |
+| :--- | :--- |
+| `0` | Успешно |
+| `3` | Не передан обязательный параметр |
+| `16` | Некорректный TermNo |
+| `41` | Некорректный qrcId |
+| `301` | Превышен временной диапазон поиска |
+| `RQ05019` | Не передан параметр amount при активации |
+
+> **Примечание:** При получении статуса `NTST` необходимо продолжать опрос статуса до получения финального результата (`ACWP` или `RJCT`).
+
+# Привязка счёта и подписки СБП: Техническая документация
+
+Данный функционал позволяет ТСП (Торгово-сервисным предприятиям) выполнять привязку банковского счёта клиента для проведения последующих платежей без участия плательщика (рекуррентные платежи, оплата в один клик).
+
+---
+
+## 1. Привязка счёта без оплаты
+Используется для регистрации QR-кода, целью которого является только установление связки между счётом клиента и ТСП.
+
+### 1.1. Метод `RegQRcSub`
+
+**Параметры запроса:**
+
+| Параметр | Тип | Обяз. | Описание |
+| :--- | :--- | :---: | :--- |
+| `command` | String | Да | Тип запроса. Константа: `RegQRcSub`. |
+| `TermNo` | String | Да | Уникальный идентификатор терминала. |
+| `qrcType` | String | Да | Тип QR-кода. Константа: `03`. |
+| `subscriptionPurpose` | String | Да | Цель привязки. Отображается клиенту в приложении банка. |
+| `queryData.notificationUrl` | String | Да | URL для получения уведомления о результате привязки. |
+| `qrTtl` | String | Нет | Срок жизни ссылки в минутах (1 — 129 600). По умолчанию: 4320 (3 суток). |
+| `redirectUrl` | String | Нет | Ссылка для возврата клиента в приложение/на сайт ТСП. |
+| `subscriptionServiceId` | String(32) | Нет | Идентификатор сервиса подписки (используется с `subscriptionServiceName`). |
+| `subscriptionServiceName`| String(70) | Нет | Наименование сервиса подписки. |
+
+**Пример запроса:**
+```json
+{
+ "command": "RegQRcSub",
+ "TermNo": "90080567",
+ "qrTtl": "10",
+ "qrcType": "03",
+ "subscriptionPurpose": "Подписка на оплату услуг Интернет 500р./мес.",
+ "queryData": {
+ "notificationUrl": "https://sbp-subscription.example.com"
+ },
+ "redirectUrl": "https://exampletsp.io/callback"
+}
+```
+
+**Параметры ответа:**
+
+| Параметр | Описание |
+| :--- | :--- |
+| `ErrorCode` | Код ответа (0 или RQ00000 — успех). |
+| `qrcId` | Идентификатор QR-кода. |
+| `payload` | Платежная ссылка для формирования QR или перехода. |
+| `payrrn` | Референс запроса в системе Банка. |
+
+---
+
+### 1.2. Нотификация о результате привязки (`subscription/notification`)
+Банк отправляет POST-запрос на `notificationUrl` ТСП.
+
+**Параметры нотификации:**
+* `status`: `ACWP` (оформлено) или `RJCT` (отказ).
+* `subscriptionToken`: Уникальный токен привязки (необходим для будущих оплат).
+* `memberId`: Идентификатор банка плательщика.
+
+> **Важно:** Значения `subscriptionToken` и `memberId` необходимо сохранить. Без них проведение платежей по инициативе ТСП невозможно.
+
+---
+
+## 2. Оплата с последующей привязкой счёта
+Позволяет клиенту совершить первую покупку и одновременно разрешить ТСП списывать средства в будущем.
+
+### 2.1. Метод `GetQRCd` (Тип 02)
+
+Для этого сценария используется стандартный метод генерации QR, но с обязательным заполнением поля `subscriptionPurpose`.
+
+**Ключевые параметры:**
+* `qrcType`: `02` (динамический QR).
+* `amount`: Сумма первого платежа в копейках.
+* `subscriptionPurpose`: Описание подписки (наличие этого поля активирует сценарий привязки).
+* `queryData.notificationUrl_sub`: (Опционально) Отдельный URL для уведомления именно о привязке.
+
+**Логика уведомлений:**
+1. При успешной операции ТСП получает **два** callback-уведомления:
+ - О статусе платежа (`qrc/notification`).
+ - О статусе привязки (`subscription/notification`).
+2. Если платеж прошел, но клиент отказался от привязки — придет уведомление об успехе оплаты и уведомление об отказе в подписке.
+
+---
+
+## 3. Оплата с привязанного счёта (по инициативе ТСП)
+Сценарий "бесшовной" оплаты без участия клиента. Проводится в два этапа.
+
+### Этап 1: Генерация ссылки через `GetQRCd`
+Создается технический QR-код (тип `02`), к которому будет "привязан" платеж.
+* `paymentPurpose`: Обязательно для заполнения.
+* `amount`: Сумма списания.
+
+### Этап 2: Запрос на списание `QRCSubPayPetition`
+ТСП отправляет команду банку на исполнение платежа, используя полученный ранее токен.
+
+**Параметры запроса:**
+| Параметр | Обяз. | Описание |
+| :--- | :---: | :--- |
+| `command` | Да | `QRCSubPayPetition` |
+| `subscriptionToken` | Да | Токен, полученный при регистрации привязки. |
+| `SenderMemberId` | Да | Идентификатор банка плательщика (`memberId`). |
+| `qrcId` | Да | ID QR-кода, созданного на Этапе 1. |
+
+**Пример запроса:**
+```json
+{
+ "command": "QRCSubPayPetition",
+ "TermNo": "90080567",
+ "subscriptionToken": "70LSS7DN18SJQRS10006DNPKLJL24B05",
+ "SenderMemberId": "100000000008",
+ "qrcId": "AD10000BBJKO23GB98LA1FGBRIHH3K89"
+}
+```
+
+### 3.1. Статусы решения банка (`resolution/notification`)
+После запроса на списание банк присылает уведомление с результатом:
+
+| Код | Описание |
+| :--- | :--- |
+| `RQ00030` | **Успех.** Согласие на проведение платежа. |
+| `RQ05031` | Отказ: Привязка не найдена (клиент мог её удалить). |
+| `RQ05060` | Отказ: Недостаточно средств. |
+| `RQ05061` | Отказ: Превышен лимит СБП. |
+| `RQ05063` | Отказ: Подозрение на мошенничество. |
+
+---
+
+## 4. Запрос статуса привязки
+Если ТСП не получило callback, можно запросить статус привязки вручную.
+
+### Метод `GetQRCSubStatus`
+
+**Запрос:**
+```json
+{
+ "command": "GetQRCSubStatus",
+ "TermNo": "90080567",
+ "qrcId": "BB1S002PRSK6SR3E9R7P0H077UKN1QVF"
+}
+```
+
+**Ответ (успешная привязка):**
+```json
+{
+ "ErrorCode": 0,
+ "status": "ACWP",
+ "subscriptionToken": "70LSS7DN18SJQRS10006DNPKLJLAGT77",
+ "memberId": "600000000015",
+ "message": "OK"
+}
+```
+
+---
+
+## Важные примечания для разработчиков
+
+1. **Лимиты:** Оплата с привязанного счета возможна на сумму до **1 000 000 руб.** за одну операцию.
+2. **Кодировка:** Текстовые данные в ответах могут передаваться в формате `urlencoded` (например, `%u0423%u0441%u043F%u0435%u0445` для слова "Успех").
+3. **Безопасность:** Система ТСП должна игнорировать неизвестные дополнительные параметры в уведомлениях от НСПК/Банка, не считая их ошибкой.
+4. **Хранение данных:** Потеря `subscriptionToken` делает невозможным рекуррентное списание. В этом случае потребуется повторная привязка через QR-код.
+
+# Цифровой рубль: Техническая документация по интеграции
+
+Цифровой рубль (ЦР) — это третья форма национальной валюты, дополняющая наличные и безналичные средства. Счета цифрового рубля открываются на платформе Центрального банка, а доступ к ним осуществляется через мобильные приложения и интернет-банки коммерческих банков.
+
+Прием платежей в ЦР осуществляется в рамках **Универсального платёжного кода (УПК)**.
+
+---
+
+## 1. Динамический QR-код (Одноразовый УПК)
+
+Динамический код формируется под конкретную операцию с фиксированной суммой.
+
+### 1.1. Регистрация динамического УПК
+Для генерации кода можно использовать существующий метод `GetQRCd` или специализированный метод `ReqUniQr`.
+
+#### Метод `ReqUniQr`
+Запрос направляется ТСП в Банк для регистрации универсальной платёжной ссылки в API СБП.
+
+**Параметры запроса:**
+
+| Код ключа | Тип данных | Обяз. | Назначение |
+| :--- | :--- | :---: | :--- |
+| `command` | String | Y | Константа `ReqUniQr` |
+| `TermNo` | String | Y | Уникальный идентификатор терминала |
+| `amount` | Number | O* | Сумма в копейках (обязательна для `uniQrType = 02`) |
+| `uniQrType` | String | Y | Тип ссылки: `01` — многоразовая, `02` — одноразовая |
+| `mediaType` | String | O | Расширение QR-кода (напр., `image/png`) |
+| `width` / `height` | String | O | Размеры изображения в пикселях |
+| `paymentPurpose` | String | O | Назначение платежа |
+| `redirectUrl` | String | O | URL для возврата в приложение ТСП (ASCII/RFC3986) |
+| `messageID` | String | O | Уникальный GUID сообщения |
+| `qrTtl` | String | O | Срок жизни ссылки в минутах |
+| `queryData.notificationUrl` | String | O | URL для уведомления о статусе оплаты |
+
+**Пример запроса:**
+```json
+{
+ "command": "ReqUniQr",
+ "TermNo": "90080567",
+ "amount": "10000",
+ "uniQrType": "02",
+ "redirectUrl": "https://alfabank.ru/sme/payservice/sbp/",
+ "mediaType": "image/png",
+ "width": "600",
+ "height": "600",
+ "messageID": "f9aa54ff-a615-44b8-aa6c-acab655c89f8",
+ "queryData": {
+ "notificationUrl": "https://sbp-payments",
+ "SenderFIO": "Иванов Иван Иванович"
+ }
+}
+```
+
+**Параметры ответа:**
+- `ErrorCode`: `0` — успех.
+- `payload`: Платёжная ссылка.
+- `image`: Изображение QR-кода в Base64.
+- `uniQrId`: Идентификатор ссылки.
+- `status`: Статус (обычно `CREATED`).
+
+---
+
+### 1.2. Проверка статуса оплаты динамического УПК
+Используется метод `GetUniQrStatus`.
+
+**Специфические статусы для Цифрового рубля:**
+* `ENDD`: Платёж в ЦР обработан, но финальный результат (успех/отказ) пока неизвестен.
+* `ACDR`: Платёж в ЦР успешно выполнен (аналог `ACWP` для СБП).
+
+**Структура блока `data` (массив Record) в ответе:**
+
+| Ключ | Описание |
+| :--- | :--- |
+| `paymentServiceId` | `PS0000000001` (СБП) или `PS0000000002` (ЦР) |
+| `status` | `NTST` (не начат), `RCVD` (в процессе), `ACWP` (успех СБП), `RJCT` (отказ), `ENDD` (ЦР в обработке), `ACDR` (успех ЦР) |
+
+---
+
+## 2. Кассовая платёжная ссылка (Многоразовый УПК)
+
+Многоразовый код, который обычно размещается в кассовой зоне.
+
+### 2.1. Регистрация кассового УПК
+Метод: `RegCashUniQr`.
+
+**Особенности:**
+* Позволяет привязать конкретный `qrcId`.
+* В настройках ТСП на стороне Банка должен быть обязательно указан счет ЦР (`accountDR`).
+
+**Пример ответа:**
+```json
+{
+ "ErrorCode": "0",
+ "message": "OK",
+ "TermNo": "90080567",
+ "payload": "https://qr.nspk.ru/BS2R003FS8EFGAVM852PQS13N894HDLU?type=01...",
+ "image": "iVBORw0KGgoAAAANSUhEUgAAAlg...",
+ "qrcId": "BS2R003FS8EFGAVM852PQS13N894HDLU",
+ "status": "CREATED"
+}
+```
+
+---
+
+### 2.2. Изменение параметров кассового УПК
+Метод `ChangeAccForCashUniQr` позволяет обновить привязанные счета или параметры терминала без смены самого QR-кода.
+
+**Ключевые параметры для изменения:**
+* `account`: Новый счет для СБП.
+* `accountDR`: Новый счет для Цифрового рубля (строго 55 символов).
+* `NewTermNo`: Смена ID терминала.
+* `NewMerchantId`: Смена ID мерчанта в НСПК.
+
+---
+
+### 2.3. Проверка статуса кассового УПК
+Метод: `GetCashUniQrStatus`.
+
+**Важные поля ответа:**
+* `paymentServiceId`: Определяет, как заплатил клиент (`PS0000000002` — Цифровой рубль).
+* `cashRegisterQrcStatus`: Статус самой ссылки (`WAITING_PAYMENT`, `IN_PROGRESS`, `DEACTIVATED`).
+
+---
+
+## 3. Нотификация об исполнении перевода (C2B)
+
+Сообщение отправляется со стороны Банка на сервер ТСП при получении финального статуса платежа.
+
+**Метод:** `paymentDR/notification` (POST запрос)
+
+**Параметры запроса:**
+
+| Код ключа | Тип данных | Назначение |
+| :--- | :--- | :--- |
+| `command` | String | `paymentDR/notification` |
+| `uniQrId` | String | Идентификатор платежа |
+| `operationId` | String | ID операции на платформе ЦР |
+| `status` | String | Статус (напр. `ACWP` или `RCVD`) |
+| `amount` | String | Сумма в рублях (с разделителем-точкой) |
+| `timestamp` | ISO8601 | Дата и время операции |
+| `payrrn` | String | Референс платежа |
+
+**Пример нотификации:**
+```json
+{
+ "command": "paymentDR/notification",
+ "uniQrId": "AD2000670LSS7DN18SJQDNP4B05KLJL1",
+ "operationId": "546464AX45546",
+ "status": "ACWP",
+ "amount": "10241.21",
+ "timestamp": "2024-08-01T10:15:00.000Z",
+ "payrrn": "102345678912",
+ "TermNo": "90080567",
+ "merchantName": "Рога и Копыта",
+ "purpose": "Кофе и булочка"
+}
+```
+
+**Ожидаемый ответ от ТСП:**
+* `HTTP 200 OK` — уведомление успешно принято.
+* `HTTP 500` — внутренняя ошибка (будет произведена повторная попытка).
+
+---
+
+## Приложение: Справочник статусов (status)
+
+| Код | Описание | Применимость |
+| :--- | :--- | :--- |
+| **NTST** | Платёж не начат | СБП / ЦР |
+| **RCVD** | Платёж инициирован / в обработке | СБП / ЦР |
+| **ACWP** | Платёж успешно выполнен | СБП |
+| **RJCT** | Платёж отклонён | СБП |
+| **ENDD** | Платёж обработан (результат уточняется) | **ЦР** |
+| **ACDR** | Платёж успешно выполнен | **ЦР** |
+
+# Дополнительные методы API СБП (Альфа-Банк)
+
+Данный документ содержит описание дополнительных методов API для работы с Системой Быстрых Платежей (СБП) через платежный шлюз (ПШ) Альфа-Банка.
+
+> **Примечание:** Таблицы кодов ответов (`ErrorCode`) и их расшифровок приведены в Приложении №2 к основной документации.
+
+---
+
+## 1. Запрос списка банков-участников СБП (`GetBankList`)
+
+Метод используется ТСП для получения актуального списка банков, поддерживающих оплату через СБП.
+
+### 1.1. Параметры запроса
+| Код ключа | Тип данных | Обяз. | Назначение |
+| :--- | :--- | :---: | :--- |
+| `command` | String (an-1..50) | **Y** | Тип запроса. Константа: `GetBankList` |
+| `messageID` | String (ans-1..1024) | N | Уникальный идентификатор сообщения (GUID) |
+| `BankMemberIdFilter` | String (n-11) | N | Фильтр по ID участника СБП (если нужен только один банк) |
+
+**Пример запроса:**
+```json
+{
+ "command": "GetBankList"
+}
+```
+
+### 1.2. Параметры ответа
+| Код ключа | Тип данных | Обяз. | Назначение |
+| :--- | :--- | :---: | :--- |
+| `ErrorCode` | String (an-20) | **Y** | Код ответа |
+| `message` | String (ans-1024) | **Y** | Расшифровка кода ответа |
+| `BankList` | Array | N | Коллекция банков-участников |
+| `BankList.BankName` | String (an-50) | N | Наименование банка |
+| `BankList.BankID` | String (an-12) | N | Идентификатор участника СБП в НСПК |
+| `BankList.BankBIK` | String (n-9) | N | БИК банка (если передан из НСПК) |
+
+**Пример успешного ответа:**
+```json
+{
+ "ErrorCode": 0,
+ "message": "Запрос обработан успешно",
+ "BankList": [
+ {
+ "BankName": "Наименование банка 1",
+ "BankID": "10000001100",
+ "BankBIK": "044525823"
+ },
+ {
+ "BankName": "Наименование банка N",
+ "BankID": "10000001145",
+ "BankBIK": "044525829"
+ }
+ ]
+}
+```
+
+---
+
+## 2. Блокирование QR-кода (`BlockQRcId`)
+
+Запрос направляется для блокировки ранее сгенерированного QR-кода любого типа.
+
+### 2.1. Параметры запроса
+| Код ключа | Тип данных | Обяз. | Назначение |
+| :--- | :--- | :---: | :--- |
+| `command` | String (an-1..50) | **Y** | Тип запроса. Константа: `BlockQRcId` |
+| `TermNo` | String (an-20) | **Y** | Уникальный идентификатор терминала |
+| `qrcId` | String (an-32) | **Y** | Идентификатор QR-кода |
+| `reason` | String (ans-1024) | N | Причина блокировки |
+
+**Пример запроса:**
+```json
+{
+ "command": "BlockQRcId",
+ "TermNo": "90080567",
+ "qrcId": "BS1R003FN6RS6HL48QMBFVO5C4K9GQRV",
+ "reason": "Заказ 12345 направлен в стоп-лист"
+}
+```
+
+### 2.2. Параметры ответа
+| Код ключа | Тип данных | Обяз. | Назначение |
+| :--- | :--- | :---: | :--- |
+| `ErrorCode` | String (an-20) | **Y** | Код ответа |
+| `TermNo` | String (an-20) | **Y** | Уникальный идентификатор терминала |
+| `message` | String (ans-1024) | **Y** | Расшифровка кода ответа |
+
+**Пример успешного ответа (200 OK):**
+```json
+{
+ "ErrorCode": 0,
+ "TermNo": "90080567",
+ "message": "OK"
+}
+```
+
+---
+
+## 3. Разблокирование QR-кода (`UnblockQRcId`)
+
+Запрос используется для восстановления активности ранее заблокированного QR-кода.
+
+### 3.1. Параметры запроса
+| Код ключа | Тип данных | Обяз. | Назначение |
+| :--- | :--- | :---: | :--- |
+| `command` | String (an-1..50) | **Y** | Тип запроса. Константа: `UnblockQRcId` |
+| `TermNo` | String (an-20) | **Y** | Уникальный идентификатор терминала |
+| `qrcId` | String (an-32) | **Y** | Идентификатор QR-кода |
+
+**Пример запроса:**
+```json
+{
+ "command": "UnblockQRcId",
+ "TermNo": "90080567",
+ "qrcId": "BS1R003FN6RS6HL48QMBFVO5C4K9GQRV"
+}
+```
+
+### 3.2. Параметры ответа
+| Код ключа | Тип данных | Обяз. | Назначение |
+| :--- | :--- | :---: | :--- |
+| `ErrorCode` | String (an-20) | **Y** | Код ответа |
+| `TermNo` | String (an-20) | **Y** | Уникальный идентификатор терминала |
+| `message` | String (ans-1024) | **Y** | Расшифровка кода ответа |
+
+**Пример успешного ответа:**
+```json
+{
+ "ErrorCode": 0,
+ "TermNo": "90080567",
+ "message": "OK"
+}
+```
+
+---
+
+## 4. Список заблокированных QR-кодов (`GetBlockedQRcIdList`)
+
+Запрос позволяет получить перечень всех заблокированных QR-кодов по конкретному терминалу или кассе.
+
+### 4.1. Параметры запроса
+| Код ключа | Тип данных | Обяз. | Назначение |
+| :--- | :--- | :---: | :--- |
+| `command` | String (an-1..50) | **Y** | Тип запроса. Константа: `GetBlockedQRcIdList` |
+| `TermNo` | String (an-20) | **Y** | Уникальный идентификатор терминала |
+
+**Пример запроса:**
+```json
+{
+ "command": "GetBlockedQRcIdList",
+ "TermNo": "90080567"
+}
+```
+
+### 4.2. Параметры ответа
+| Код ключа | Тип данных | Обяз. | Назначение |
+| :--- | :--- | :---: | :--- |
+| `ErrorCode` | String (an-20) | **Y** | Код ответа |
+| `message` | String (ans-1024) | **Y** | Расшифровка кода ответа |
+| `TermNo` | String (an-20) | **Y** | Уникальный идентификатор терминала |
+| `QRcIdList` | Collection | N | Список заблокированных QR-кодов |
+| `QRcIdList.qrcId` | String (an-32) | **Y** | Идентификатор QR-кода |
+| `QRcIdList.reason` | String (ans-1024) | N | Причина блокировки |
+| `QRcIdList.date` | String (an-20) | **Y** | Дата и время блокировки |
+
+**Пример успешного ответа:**
+```json
+{
+ "ErrorCode": 0,
+ "TermNo": "90080567",
+ "message": "OK",
+ "QRcIdList": [
+ {
+ "date": "2024-04-18 17:17:45",
+ "qrcId": "BD100000K5II0G369JHR3KBA6SM3FD3V",
+ "reason": "Заказ 12345 направлен в стоп-лист"
+ },
+ {
+ "date": "2024-05-01 19:07:15",
+ "qrcId": "BD100002JN871TSC9SJB7HPVRFD3HQ8T",
+ "reason": "Заказ 96780 направлен в стоп-лист"
+ }
+ ]
+}
+```
+
+---
+
+## Обработка ошибок (Общий формат)
+
+В случае ошибки (например, `400 Bad Request`), шлюз возвращает JSON следующего вида:
+
+```json
+{
+ "ErrorCode": "Код ошибки",
+ "message": "Расшифровка причины ошибки"
+}
+```
+
+# Приложения к технической спецификации СБП
+
+## Приложение 1. Формат Payload
+
+В Системе быстрых платежей (СБП) используется формат двухмерного кода **QR Code (ISO/IEC 18004-2015)**. Payload (полезная нагрузка) может быть представлен в двух вариантах.
+
+### Варианты Payload
+* **Короткий вариант:** `https://{HOST}/{QR_ID}`
+* **Длинный вариант:** `https://{HOST}/{QR_ID}?type={QR_TYPE}&bank={MEMBER_ID}&sum={SUM}&cur={CUR}&crc={CRC}`
+
+### Описание параметров URL-based payload
+
+| Параметр | Описание | Обяз. | Формат |
+| :--- | :--- | :---: | :--- |
+| **HOST** | `qr.nspk.ru` — для QR_TYPE 01 и 02 `sub.nspk.ru` — для QR_TYPE 03 | y | String |
+| **QR_ID** | Идентификатор зарегистрированного QR-кода в СБП | y | String (32 симв.) |
+| **QR_TYPE** | Тип QR-кода: 01 — QR Static (наклейка) 02 — QR Dynamic (на кассе) 03 — QR-Subscription (привязка счета) | y | String (2 цифры) |
+| **MEMBER_ID** | Идентификатор Банка Получателя (ТСП) | y | String (12 симв.) |
+| **SUM** | Сумма в копейках. Обязательна для типа 02. Отсутствует для типа 03. | y/o | String (до 12 цифр) |
+| **CUR** | Валюта операции (обязательна, если присутствует SUM) | y/o | String (3 симв.) |
+| **CRC** | Значение контрольной суммы | y | String (4 симв.) |
+
+---
+
+## Приложение 2. Описание кодов ответа
+
+Полный перечень кодов представлен на сайте НСПК. Коды, не описанные ниже, следует обрабатывать как **техническую (системную) ошибку**.
+
+### Общие коды ошибок системы
+
+| Код | Сообщение / Описание |
+| :--- | :--- |
+| **0** | **OK** (Успешно) |
+| **-999** | Прочее сообщение FSCryptoProxy |
+| **-71** | Неверные данные Basic-авторизации запроса |
+| **-9** | Система перегружена. Повторите запрос позже |
+| **-7** | Неверная подпись сообщения (ошибка ключей) |
+| **-6** | Не передана подпись в заголовке Authorization |
+| **-1** | Возникли проблемы при обработке запроса |
+| **1** | Внутренняя ошибка |
+| **2** | Терминал не обнаружен |
+| **8** | Таймаут ответа |
+| **25** | Терминал заблокирован |
+| **1001** | Сервис временно недоступен |
+
+### Коды ОПКЦ СБП (RQ-серия)
+
+| Код | Описание |
+| :--- | :--- |
+| **RQ00000** | Запрос обработан успешно |
+| **RQ03001** | Ошибка валидации. Неверный формат запроса |
+| **RQ05002** | Участник (memberId) не найден в СБП |
+| **RQ05005** | ТСП (merchantId) не зарегистрировано в СБП |
+| **RQ05009** | Сумма (amount) меньше минимально допустимой |
+| **RQ05010** | Сумма (amount) больше максимально допустимой |
+| **RQ05014** | Идентификатор qrcId не найден |
+| **RQ05032** | Отказ Банка Плательщика в выполнении платежа |
+| **RQ05040** | Сумма возврата превышает сумму исходной операции |
+| **RQ07999** | Техническая ошибка |
+
+---
+
+### Ошибки по конкретным методам
+
+#### Метод `GetQRCd` (Запрос QR-кода)
+| Код | Описание |
+| :--- | :--- |
+| **3** | Не заполнены данные запроса |
+| **28** | Запрос QR-кода не удался, не получен QR_ID |
+| **301** | Некорректно заполнены данные |
+| **999*** | Неизвестная ошибка. Требуется уточнение статуса |
+
+#### Метод `GetQRCstatus` (Статус платежа)
+| Код | Описание |
+| :--- | :--- |
+| **4** | Не передан qrcId или payrrn |
+| **5** | Не получены данные от СБП |
+| **18** | Платеж не найден в запросах B07, B23 |
+
+#### Методы возврата (`GetQRCreversalData`, `QRCreversal`)
+| Код | Описание |
+| :--- | :--- |
+| **12** | Не найдены данные для возврата |
+| **20** | Получен отказ на запрос возврата |
+| **22** | Несоответствие payrrn и qrcId в запросе |
+| **27** | Возврат невозможен: счет зачисления не равен счету списания |
+| **121** | Операция оплаты еще не имеет финального статуса |
+| **201** | Отказ: Недостаточно средств на счете для возврата |
+
+---
+
+### Коды callback-уведомлений (Оплата с привязанного счета)
+
+Используются в методе `resolution/notification`.
+
+| Код | Описание |
+| :--- | :--- |
+| **RQ05060** | Недостаточно денежных средств |
+| **RQ05061** | Превышен лимит по сумме операций СБП |
+| **RQ05063** | Подозрение в мошенничестве (Anti-fraud) |
+| **RQ05065** | Счет заблокирован |
+| **RQ05067** | Запрещено по требованию законодательства |
+
+> **Примечание:** Использование кода `RQ05032` допускается не более чем в 20% случаев от общего числа отказов Банка Плательщика.
+
+---
+
+## Приложение 3. Пояснение для колонки «Required»
+
+| Метка | Значение |
+| :---: | :--- |
+| **y** | **Yes** — обязательное поле |
+| **o** | **Optional** — опциональное поле |
+| **y/o** | **Conditional** — условно обязательное (зависит от условий запроса) |
+
+---
+
+## Приложение 4. Типы данных
+
+| Нотация | Описание |
+| :--- | :--- |
+| **a** | Символы латинского (A-Z, a-z) и русского (А-Я, а-я) алфавитов. |
+| **n** | Цифры 0-9. |
+| **an** | Буквенно-цифровой формат (смесь **a** и **n**). |
+| **ans** | Буквенно-цифровой формат со спецсимволами (пробел, пунктуация, знаки `№`, `%` и т.д.). |
+
+**Кодировка:** Все данные передаются в кодировке **UTF-8**.
diff --git a/_docs/alfabank/qr_payout/1_main.md b/_docs/alfabank/qr_payout/1_main.md
new file mode 100644
index 0000000..bd2852c
--- /dev/null
+++ b/_docs/alfabank/qr_payout/1_main.md
@@ -0,0 +1,430 @@
+Главная
+
+Добро пожаловать на портал с инструкцией по интеграции СБП C2B
+
+Здесь есть вся необходимая информация, которая поможет успешно провести прямую интеграцию с платёжным шлюзом Альфа-Ба
+
+Важное объявление
+С 1.11.2024 адрес тестового стенда будет изменён на новый URL — https://217.12.103.132:2443/fsCryptoProxy
+Старые адреса http://217.12.103.147:9914/fsCryptoProxy и https://217.12.103.147:443/fsCryptoProxy станут недоступны
+В случае если ваши запросы перестанут успешно отрабатываться ПШ банка до 1.11.2024, необходимо заменить URL на новый, не д
+Для направления запросов на новый URL обязательно устанавливается MTLS соединение
+В случае если у вас нет ключевой пары для поднятия MTLS соединения на тестовой среде, вам необходимо обратиться в банк по
+Информация о том, как направлять запросы с установлением MTLS соединения на тестовой среде, находится по ссылке в разделе
+
+Обзор API
+
+• API позволяет направлять запросы на платёжный шлюз Альфа-Банка (далее — ПШ), чтобы совершать операции с помощью сервис
+
+• Взаимодействие с платёжным шлюзом Альфа-Банка происходит по протоколу HTTPS
+
+• API использует REST-архитектуру, методы POST
+
+• POST-запросы используют JSON-аргументы
+
+• API всегда возвращает ответ в формате JSON
+
+• Ответ от платежного шлюза всегда содержит код ответа — ErrorCode
+
+• Если в процессе обработки запроса произойдёт логическая ошибка, API вернёт её описание в поле message
+
+• Текстовые данные возвращаются в ответе на запрос в формате urlencoded
+
+• Все вопросы по процессу имплементации через данный протокол API можно направлять на адрес сопровождения — acquiring@alfa
+
+Процесс аутентификации
+
+Аутентификация на тестовой среде
+
+Взаимодействие с платёжным шлюзом Альфа-Банка (далее — ПШ) на тестовой среде происходит через интернет по протоколу HTTP
+
+Чтобы установить MTLS-соединение на тестовой среде, банк выдаёт клиенту ключевую пару RSA/TLS: сертификат и приватный клю
+
+MTLS-соединение позволяет произвести двустороннюю аутентификацию.
+
+Внимание
+
+ПШ не обрабатывает запросы с сертификатом MTLS-соединения, по которому истёк срок жизни
+
+Если ПО клиента пытается верифицировать серверный сертификат банка, необходимо добавить в доверенные сертификат удостове
+
+Клиентский самоподписанный сертификат подписывает каждое тело запроса, которое клиент направляет на тестовой среде с помо
+
+Чтобы получить этот сертификат, необходимо самостоятельно сгенерировать ключевую пару client.crt и client.key:
+
+• client.crt — сертификат, который клиент передаёт в банк, чтобы зарегистрировать на тестовой среде
+
+• client.key — приватный ключ, который клиент оставляет у себя, чтобы подписывать тело запроса на тестовой среде
+
+Пример генерации запроса на ключевую пару client.crt и client.key с помощью OpenSSL:
+
+openssl req -x509 -newkey rsa:4096 -keyout private.key -out client.crt -nodes -days 3650
+
+12/23/25, 11:20 AM Главная
+
+https://alfabank.ru/sme/payservice/sbp/docs/welcome/ 1/7
+
+https://alfabank.ru/sme/payservice/sbp/docs/welcome/?rp-menuOpen=1
+https://217.12.103.132:2443/fsCryptoProxy
+http://217.12.103.147:9914/fsCryptoProxy
+https://217.12.103.147/fsCryptoProxy
+https://alfabank.ru/sme/payservice/sbp/docs/welcome/?rp-menuOpen=1#authentication_process
+mailto:acquiring@alfabank.ru
+
+
+Пример заполнения полей:
+
+• Country Name (2 letter code) []: RU
+
+• State or Province Name (full name) []:
+
+• Locality Name (eg, city) []: Moscow
+
+• Organization Name (eg, company) []: COMPANY
+
+• Organizational Unit Name (eg, section) []: IT
+
+• Common Name (eg, fully qualified host name) []: Company Pay C2B
+
+• Email Address []: admin@test.ru
+
+Примечание
+
+• Длина RSA ключа может быть 2048 или 4096 бит
+
+• Ключевую пару генерируют на срок не менее 10 лет
+
+Файл client.crt необходимо направить в банк, чтобы зарегистрировать его на тестовой среде по адресу acquiring@alfabank.ru
+
+Вместе с файлом client.crt нужно указать:
+
+1. ИНН, наименование организации, на которую регистрируете сертификат
+
+2. Тип среды, для которой выпущен сертификат: тестовая или промышленная
+
+3. Информацию о том, как регистрируете сертификат: первично или повторно взамен истёкшего с alias…
+
+4. К письму обязательно приложите файл client.crt в архиве без пароля
+
+Пример письма:
+
+• Тема письма:
+Регистрация сертификата на тестовом стенде СБП C2B
+
+• Тело письма:
+Просим зарегистрировать сертификат, чтобы направлять запросы на тестовый стенд банка по продукту СБП C2B.
+Сертификат выпущен впервые / повторно взамен истёкшего с alias…
+Название организации:
+ИНН:
+Сертификат — во вложении.
+
+Письмо на регистрацию сертификата можно направить, если кликнуть на email-адрес acquiring@alfabank.ru. Тогда откроется предзап
+
+После регистрации сертификата на тестовой среде банк передаёт клиенту:
+
+1. Аlias — имя сертификата, который зарегистрирован на тестовой среде. Оно должно быть указано в headers — key-name при напра
+
+2. Клиентский сертификат RSA/TLS — он нужен, чтобы поднять MTLS-соединение на тестовой среде
+
+3. Сертификат удостоверяющего центра c2b-ca-test.crt вместе с промежуточным и удостоверяющим сертификатом root для тестово
+
+4. Тестовый номер терминала TermNo
+Аутентификация на промышленной среде
+
+Взаимодействие с платёжным шлюзом Альфа-Банка на промышленной среде происходит через интернет по протоколу HTTPS, при
+
+Чтобы установить MTLS-соединение на промышленной среде, банк выдаёт клиенту ключевую пару RSA/TLS — сертификат и приватн
+
+Внимание
+
+ПШ не обрабатывает запросы с сертификатом MTLS-соединения, по которому истёк срок жизни
+
+Если ПО клиента пытается верифицировать серверный сертификат банка, необходимо добавить в доверенные сертификат удостове
+
+Клиентский самоподписанный сертификат подписывает каждое тело запроса, которое клиент направляет на промышленной среде
+
+Чтобы получить этот сертификат, клиенту необходимо самостоятельно сгенерировать ключевую пару client.crt и client.key:
+
+• client.crt — сертификат, который клиент передаёт в банк, чтобы зарегистрировать на промышленной среде
+
+12/23/25, 11:20 AM Главная
+
+https://alfabank.ru/sme/payservice/sbp/docs/welcome/ 2/7
+
+mailto:admin@test.ru
+mailto:acquiring@alfabank.ru
+mailto:acquiring@alfabank.ru
+
+
+• client.key — приватный ключ, который клиент оставляет у себя, чтобы подписывать тело запроса на промышленной среде
+
+Пример генерации запроса на ключевую пару client.crt и client.key с помощью OpenSSL:
+
+Пример заполнения полей
+
+• Country Name (2 letter code) []: RU
+
+• State or Province Name (full name) []:
+
+• Locality Name (eg, city) []: Moscow
+
+• Organization Name (eg, company) []: COMPANY
+
+• Organizational Unit Name (eg, section) []: IT
+
+• Common Name (eg, fully qualified host name) []: Company Pay C2B
+
+• Email Address []: admin@test.ru
+
+Примечание
+
+• Длина RSA ключа может быть 2048 или 4096 бит
+
+• Ключевую пару генерируют на срок не менее 10 лет
+
+Файл client.crt необходимо направить в банк, чтобы зарегистрировать его на промышленной среде по адресу acquiring@alfabank.ru
+
+Вместе с файлом client.crt необходимо указать:
+
+1. ИНН, наименование организации, на которую регистрируете сертификат
+
+2. Тип среды, для которой выпущен сертификат: тестовая или промышленная
+
+3. Информацию о том, как регистрируете сертификат: первично или повторно взамен истёкшего с alias…
+
+4. К письму обязательно приложите файл client.crt в архиве без пароля
+
+• Тема письма:
+Регистрация сертификата на промышленном (боевом) стенде СБП C2B
+
+• Тело письма:
+Просим зарегистрировать сертификат, чтобы направлять запросы на промышленный (боевой) стенд банка по продукту СБП C2B.
+Сертификат выпущен впервые / повторно взамен истёкшего с alias…
+Название организации:
+ИНН:
+Сертификат во вложении.
+
+Письмо на регистрацию сертификата можно направить, если кликнуть на email-адрес acquiring@alfabank.ru. Тогда откроется предзап
+
+После регистрации сертификата на промышленной среде банк передаёт клиенту:
+
+1. Аlias — имя сертификата, который зарегистрирован на промышленной среде. Оно должно быть указано в headers — key-name при
+
+2. Клиентский сертификат RSA/TLS — он нужен, чтобы поднять MTLS-соединение на промышленной среде
+
+3. Сертификат удостоверяющего центра c2b-ca.crt вместе с промежуточным и удостоверяющим сертификатом root для промышлен
+
+4. Эндпойнт промышленной среды
+
+Тестирование
+
+Чтобы провести тестирование, клиент может использовать тестовый стенд.
+
+Эндпойнт тестовой среды (маршрут отправки) — https://217.12.103.132:2443/fsCryptoProxy
+
+Для направления запросов обязательны следующие headers:
+
+openssl req -x509 -newkey rsa:4096 -keyout private.key -out client.crt -nodes -days 3650
+
+12/23/25, 11:20 AM Главная
+
+https://alfabank.ru/sme/payservice/sbp/docs/welcome/ 3/7
+
+mailto:admin@test.ru
+mailto:acquiring@alfabank.ru
+mailto:acquiring@alfabank.ru
+https://217.12.103.132:2443/fsCryptoProxy
+
+
+• Content-Type — application/x-www-form-urlencoded
+
+• Authorization — помещается hash полученного тела запроса
+
+• key-name — помещается alias зарегистрированного самоподписанного клиентского сертификата
+
+На тестовой среде взаимодействие происходит по протоколу HTTPS.
+
+Пример, как можно направить запрос на тестовом стенде
+
+1. Составить тестовый запрос.
+
+Порядок параметров в строке для вычисления hash должен соответствовать порядку, в котором параметры передаются в запрос
+
+Пример, как сформировать блок данных:
+
+Обязательно
+
+В блоке данных для подписи сообщения нужно исключить все пробелы, символы табуляции и переноса строки между ключа
+
+Примечание по полю «paymentPurpose»:
+
+• Максимальная длина значения paymentPurpose — 140 символов
+
+• Для значения paymentPurpose можно использовать такие символы:
+
+• Символы латинского алфавита (A–Z и a–z) с десятичными кодами из диапазонов [065–090] и [097–122] в кодировке UTF-8
+
+• Символы русского алфавита (А–Я и а–я) с десятичными кодами из диапазона [1040–1103] в кодировке UTF-8
+
+• Цифры 0–9 с десятичными кодами из диапазона [048–057] в кодировке UTF-8
+
+• Специальные символы с десятичными кодами из диапазонов [032–047], [058–064], [091–096], [123–126] в кодировке UTF-8
+
+• Символ № под номером 8470 в кодировке UTF-8
+
+• Символы ё с кодом 1105 и Ё с кодом 1025 не входят в допустимый диапазон для методов СБП API. Если paymentPurpose исполь
+
+• Нельзя переводить каретку и знак табуляции НСПК допускает символы \ и n, но, чтобы совместно использовать их в JSON, н
+
+• paymentPurpose: Платеж по дог\nовору… — неправильно
+
+• paymentPurpose: Платеж по дог\\nовору… — правильно
+
+{
+
+"command":"GetQRCd",
+
+"TermNo":"90080567",
+
+"qrcType":"01",
+
+"amount":"100",
+
+"currency":"RUB",
+
+"paymentPurpose":"Назначение платежа"
+
+}
+
+12/23/25, 11:20 AM Главная
+
+https://alfabank.ru/sme/payservice/sbp/docs/welcome/ 4/7
+
+
+
+2. Из готового запроса необходимо вычислить hash по функции sha256 и зашифровать его приватным ключом тестовой среды
+
+Рассчитать и закрыть hash приватным ключом с помощью такой команды:
+
+Рассмотрим пример с использованием библиотеки OpenSSL:
+
+• client.key — имя файла приватного ключа
+
+• signature.txt — имя файла, в который будет записан зашифрованный hash
+
+• block.txt — имя файла с блоком данных, необходимых, чтобы рассчитать hash
+
+Десериализовать полученные байты в base64 при помощи команды:
+
+• signature64.txt — имя файла, в который будет записан зашифрованный hash по стандарту base64
+
+Готовую строку нужно поместить в заголовок Authorization.
+
+3. Проверить результат можно так:
+
+Извлечь открытый ключ из сертификата client.crt командой:
+
+• client.crt — имя файла клиентского сертификата
+
+• signing-pub.key — имя файла, который получает открытый ключ
+
+С открытым ключом можно проверить данные командой:
+
+• signature.txt — имя файла, в который записан зашифрованный hash
+
+• signing-pub.key — имя файла открытого ключа
+
+• block.txt — имя файла с блоком данных, по которому рассчитан hash
+
+Если проверка прошла успешно, придёт ответ Verified OK.
+
+Примечание
+
+• Команда для проверки кодировки: file -bi block.txt
+
+• Команда для проверки символа новой строки в конце: cat -e block.txt
+
+• Команда для удаления символа новой строки в конце: truncate -s -1 block.txt
+
+Пример поля в составе запроса:
+
+Клиент отправляет запрос с заголовком autorization и сообщением, которое подписано приватным ключом клиента client.key и загол
+
+openssl dgst -sha256 -sign client.key -out signature.txt block.txt
+
+base64 signature.txt > signature64.txt
+
+openssl x509 -in client.crt -pubkey -noout > signing-pub.key
+
+openssl dgst -sha256 -signature signature.txt -verify signing-pub.key block.txt
+
+Content-Type: application/x-www-form-urlencoded
+
+Authorization: QMm5QWnAAj8Tp1hoIvGf1Hv7RPBoGgsDyGiR5GQ2v/MaS7Yaix6LDwAcry0UBWDZzqle2hx2fC7WbWkxXGvxK2Hcx
+
+key-name: c2b-tsp-test
+
+12/23/25, 11:20 AM Главная
+
+https://alfabank.ru/sme/payservice/sbp/docs/welcome/ 5/7
+
+
+
+Body:
+
+Как провести тестовую оплату
+
+1. Откройте на смартфоне ссылку https://testpay.alfabank.ru/sbp-page и нажмите Сканировать QR
+
+2. Наведите камеру смартфона на QR-код
+
+3. Нажмите Произвести оплату.
+Готово: оплата на тестовом контуре выполнена. Переходить в выбор банков не надо.
+
+{"command":"GetQRCd","TermNo":"30000018","qrcType":"01","amount":"100","currency":"RUB","paymentPurpose"
+
+12/23/25, 11:20 AM Главная
+
+https://alfabank.ru/sme/payservice/sbp/docs/welcome/ 6/7
+
+https://testpay.alfabank.ru/sbp-page
+
+
+Получение статуса платежа по QR-коду, который уже оплачен
+
+Получить статус платежа по QR-коду можно с помощью запроса GetQRCstatus или callback-уведомления от ПШ.
+
+Запрос GetQRCstatus позволяет получить статус по оплаченному динамическому QR-коду, кассовой платёжной ссылке или при опла
+
+Callback-уведомление уходит по оплаченному статическому и динамическому QR-коду, по кассовой платёжной ссылке или при опла
+
+Чтобы получать callback-уведомления, торгово-сервисному предприятию (далее — ТСП) необходимо направить на email acquiring@alf
+
+Сервер на стороне ТСП должен быть публичным, иметь протокол HTTPS и 443 порт.
+
+Адреса, с которых ПШ отправляет callback-уведомления: 217.12.97.124, 217.12.101.32.
+
+Дополнительная информация по вызову метода GetQRCstatus
+
+• В интеграционном тестовом окружении для метода GetQRCstatus введено ограничение частоты запросов: не более 4 запросов в м
+
+• Ограничение введено в связи с лимитами на стороне НСПК (Национальная система платёжных карт): общий лимит — 60 запросов в
+
+• Чтобы исключить паразитический/избыточный трафики обеспечить стабильность работы тестового контура, мы выделили для да
+
+• При превышении лимита запросы будут отвергаться кодом 429 (Too Many Requests).
+
+Переход на промышленную среду
+
+Чтобы перейти на промышленную среду, необходимо заключить сделку по СБП с Альфа-Банком и запросить боевые доступы — для
+
+Пример письма есть в разделе Аутентификация на промышленной среде
+
+Срок, за который банк предоставит боевые данные, — до трёх рабочих дней.
+
+12/23/25, 11:20 AM Главная
+
+https://alfabank.ru/sme/payservice/sbp/docs/welcome/ 7/7
+
+mailto:acquiring@alfabank.ru
+
diff --git a/_docs/alfabank/qr_payout/2_general_provisions.md b/_docs/alfabank/qr_payout/2_general_provisions.md
new file mode 100644
index 0000000..3af0134
--- /dev/null
+++ b/_docs/alfabank/qr_payout/2_general_provisions.md
@@ -0,0 +1,275 @@
+
+Общие положения
+
+Каналы взаимодействия
+
+1. Взаимодействие с хостом Альфа-Банка осуществляется через сеть Интернет по протоколу HTTP(S) с использованием клиентских
+сертификатов RSA/TLS.
+
+2. Порядок выпуска, установки и применения сертификатов определяется Удостоверяющим Центром Заказчика и не является пред
+данных ТУ, за исключением требований к имени (алиас) сертификатов на прокси-сервере Заказчика:
+
+• Имя (алиас) сертификата должно соответствовать коду терминала запроса и реквизиту заголовка запроса key-name;
+
+• При проверке соединения используется сертификат с именем равным обязательному параметру TermNo тела запроса и реквиз
+заголовка запроса key-name.
+
+Идентификация Виртуального терминала
+
+Описание по идентификации
+
+1. Каждый виртуальный терминал получает регистрационный номер (далее — «TermNo»).
+
+2. TermNo требуется для определения виртуального терминала, кассы или системы.
+
+3. Для каждого адреса ТСП присваивается минимум 1 виртуальный терминал и максимум по запросу.
+
+4. TermNo определяет принадлежность терминала ЮЛ и конкретному ТСП, а также расчетный счет ЮЛ в системе Заказчика, на кото
+будут поступать средства покупателей.
+
+5. TermNo сохраняется в настройках виртуального терминала и с клиентским сертификатом используется в информационном обмен
+на прикладном уровне протокола взаимодействия.
+
+6. Оплата производится покупателями самостоятельно, необходимая для оплаты информация передается покупателю посредством
+кода СБП, отображаемом на экране Агент ТСПа, или распечатанном на чеке или кассе или ссылке и т. д.
+
+7. Получение динамических QR-кодов СБП и проверка их оплаты осуществляются с обязательным использованием TermNo.
+
+Общий порядок работы
+
+Оплата покупки через СБП
+
+1. Кассир указывает на терминале (в случае кассового решения получает из ПО кассы) следующие параметры:
+
+• Сумма;
+
+• Валюта (подставляются автоматически);
+
+• Назначение платежа (подставляется автоматически).
+
+2. ТСП запрашивает динамический QR-код;
+
+3. ТСП отображает полученное изображение (или печатает предварительный чек с изображением);
+
+4. Покупатель:
+
+• сканирует QR-код в приложении своего смартфона;
+
+• получает и проверяет необходимую для подтверждения доп. информацию;
+
+• подтверждает оплату;
+
+• сообщает о проведении оплаты кассиру.
+
+5. Кассир на терминале запрашивает подтверждение оплаты;
+
+6. ТСП запрашивает подтверждение оплаты полученного ранее QR-кода
+
+12/23/25, 11:21 AM Общие положения
+
+https://alfabank.ru/sme/payservice/sbp/docs/general/?rp-menuOpen=1 1/4
+
+
+
+7. Получив подтверждение, ТСП печатает чек оплаты QR-кода с указанием:
+
+• qrcId
+
+• кода транзакции СБП
+
+• даты и времени оплаты QR-кода
+Возврат покупки через СБП
+
+Особенность возврата покупки через ТСП:
+
+1. Требует обязательного наличия чека и указания кода транзакции СБП;
+
+2. Может производиться исключительно:
+
+• по идентификатору плательщика (номеру телефона), осуществившего оплату;
+
+• возврат средств возможен только в Банк-участник СБП из которого проводилась оплата;
+
+• возврат осуществляется на счет плательщика, предназначенный для приема переводов СБП (счет по умолчанию для номера
+телефона получателя).
+
+Кассир указывает на терминале следующие параметры:
+
+1. Сумма возврата покупки (частичного возврата);
+
+2. Валюта;
+
+3. Назначение платежа;
+
+4. Данные из чека оплаты QR-кода покупателя:
+
+• Код транзакции СБП;
+
+• qrcId;
+
+• Дату оплаты QR-кода.
+
+ТСП запрашивает возможность возврата оплаты QR-кода;
+
+После подтверждения возможности возврата:
+
+• На хосте Банка найдена исходная операция и имеются все необходимые данные для возврата, кассир указывает на терминале
+одноразовый код подтверждения возврата (порядок получения кассиром одноразового кода подтверждения (SMS/PUSH сообще
+или производится иная аутоинтефикация ответственного пользователя, обладающего правом выполнения подобны действий.
+
+• Любой способ проверки полномочий сотрудника ЮЛ совершать возвраты, если таковой необходим оговаривается отдельно.
+
+ТСП запрашивает возврат и печатает чек возврата с указанием:
+
+Данные из чека оплаты QR-кода покупателя: * Код транзакции «payrnn»; * Сумма возврата, может быть меньше или равна сумме,
+указанной в чеке оплаты; * Конечный список используемых при возврате параметров может быть измен, оговаривается отдельно.
+
+Регистрация кассовой ссылки
+
+• ТСП отправляет запрос на создание кассовой ссылки Агенту ТСП;
+
+• Агент ТСП отправляет запрос на создание кассовой ссылки в ОПКЦ СБП;
+
+• ОПКЦ СБП возвращает данные новой Кассовой ссылки Агенту ТСП;
+
+• Агент ТСП передает данные Кассовой ссылки в ТСП
+
+• Агент ТСП размещает QR-код с данными Кассовой ссылки у кассы или иными аналогичными способами для возможности считыва
+его электронными устройствами клиентов (смартфон, планшет и т. п.) в процессе оплаты ими покупок.
+
+Активация кассовой ссылки
+
+1. ТСП направляет запрос на активацию Кассовой ссылки Агенту ТСП;
+
+• В запросе активации ТСП передает идентификатор ранее зарегистрированной кассовой ссылки и параметры оплаты;
+
+• В параметрах оплаты обязательно следует передавать сумму платежа, валюту платежа и назначение платежа, а также другие
+служебные параметры запроса, описанные в спецификации.
+
+• Для получения уведомлений о статусе оплаты по активированной ссылке ТСП должно передать в специальном параметре запр
+активации адрес для коллбеков с уведомлением от НСПК о статусе операций оплаты.
+
+2. Агент ТСП передает запрос на активацию Кассовой ссылки в ОПКЦ СБП;
+
+12/23/25, 11:21 AM Общие положения
+
+https://alfabank.ru/sme/payservice/sbp/docs/general/?rp-menuOpen=1 2/4
+
+
+
+3. ОПКЦ СБП передает Агенту ТСП уведомление об активации Кассовой ссылки;
+
+4. Агент ТСП передает в ТСП уведомление об активации Кассовой ссылки;
+
+5. ТСП сообщает клиенту о возможности оплаты по QR-коду, полученного в процессе создания (регистрации) кассовой ссылки, кото
+клиент может считать с помощью своего электронного устройства;
+
+6. Клиент производит оплату C2B с помощью своего электронного устройства;
+
+7. Агент ТСП получает уведомление от НСПК о финальном статусе операции C2B;
+
+8. ТСП запрашивает статус операции у Агента ТСП или получает уведомление о статусе операции в случае, если ранее в запросе
+активации кассовой ссылки был передан адрес для коллбеков с уведомлением о статусе оплат.
+
+Деактивация кассовой ссылки
+
+1. Клиент или ТСП принимает решение об отсутствии возможности или необходимости оплаты по ранее активированной кассовой
+ссылке;
+
+2. ТСП отправляет запрос Агенту ТСП на деактивацию кассовой ссылки;
+
+3. Агент ТСП передает запрос на деактивацию Кассовой ссылки в ОПКЦ СБП;
+
+4. ОПКЦ деактивирует ссылку и передает Агенту ТСП оповещение об этом;
+
+5. Агент ТСП передает оповещение о деактивации ссылки в ТСП.
+
+Возврат по ранее оплаченной кассовой ссылке
+
+a) Для возврата по ранее оплаченной кассовой ссылке отличий от ранее реализованных процессов возврата по операциям C2B нет
+за исключением того, что обязательно требуется передавать значение параметра «payrrn» без «qrcid».
+
+Изменение счета ТСП для ранее зарегистрированной кассовой ссылки
+
+a) ТСП принимает решение о необходимости смены счета, который был использован в процессе создания (регистрации) кассовой
+платежной ссылки;
+
+b) ТСП обращается с запросом о изменении счета по ранее зарегистрированной кассовой ссылке к Агенту ТСП;
+
+c) Агент ТСП передает запрос о смене счета в НСПК;
+
+d) НСПК сообщает о результате выполнения запроса Агенту ТСП;
+
+e) ТСП уточняет статус операции смены счета у Агента ТСП. Автоматического уведомления ТСП о смене счета по ранее
+зарегистрированной кассовой ссылки не поддерживается.
+
+Регистрация QR-кода для привязки счета
+
+1. ТСП регистрирует QR-код с типом «03» для привязки счета клиента к функциональности оплат по инициативе ТСП;
+
+2. Агент ТСП передает запрос на регистрацию QR-кода для привязки счета в НСПК;
+
+3. Клиент считывает QR-код при помощи своего электронного устройства;
+
+4. Банк Плательщика получает данные QR-кода из запроса в НСПК;
+
+5. Банк Плательщика отображает детали привязки счета на электронном устройстве Клиенту;
+
+6. Клиент принимает решение о привязке счета;
+
+7. Банк плательщика сообщает о решении клиента в НСПК;
+
+8. НСПК сообщает Агенту ТСП о решении по привязке счета;
+
+9. ТСП получает уведомление о статусе совершенной Плательщиком привязки счета в случае, если в запросе на регистрацию QR-ко
+был передан адрес для коллбеков.
+
+Регистрация QR-кода для оплаты с привязкой счета
+
+1. ТСП регистрирует QR-код для оплаты как описано в пункте «Оплата покупки через СБП», но с дополнительным параметром
+«subscriptionPurpose»;
+
+2. После успешного завершения оплаты по QR-коду Банк Плательщика должен инициировать на электронном устройстве клиента
+сценарий получения решения клиента по привязке счета для оплат по инициативе ТСП, оплату в пользу которого только что сов
+клиент;
+
+3. Банк Плательщика отображает детали привязки счета на электронном устройстве Клиенту;
+
+12/23/25, 11:21 AM Общие положения
+
+https://alfabank.ru/sme/payservice/sbp/docs/general/?rp-menuOpen=1 3/4
+
+
+
+4. Клиент принимает решение о привязке счета;
+
+5. Банк плательщика сообщает о решении клиента в НСПК;
+
+6. НСПК сообщает Агенту ТСП о решении по привязке счета;
+
+7. ТСП получает уведомление о статусе совершенной Плательщиком привязки счета в случае, если в запросе на регистрацию QR-ко
+был передан адрес для коллбеков.
+
+Оплата с привязанного счета по инициативе ТСП
+
+1. ТСП регистрирует QR-код для оплаты с привязанного счета;
+
+2. Агент ТСП передает запрос регистрации QR в НСПК;
+
+3. ТСП направляет запрос оплаты с привязанного счета в НСПК;
+
+4. НСПК направляет запрос оплаты с привязанного счета в Банк Плательщика;
+
+5. Банк Плательщика сообщает о своем решении по оплате с привязанного счета своего клиента в пользу ТСП из запроса НСПК;
+
+6. НСПК Сообщает Агенту ТСП о решении Банка плательщика об оплате с привязанного счета;
+
+7. Банк Плательщика начинает операцию C2B;
+
+8. НСПК уведомляет Агента ТСП о финальном статусе операции C2B.
+
+12/23/25, 11:21 AM Общие положения
+
+https://alfabank.ru/sme/payservice/sbp/docs/general/?rp-menuOpen=1 4/4
+
+
diff --git a/_docs/alfabank/qr_payout/3_static_QR-cods.md b/_docs/alfabank/qr_payout/3_static_QR-cods.md
new file mode 100644
index 0000000..e30e7bd
--- /dev/null
+++ b/_docs/alfabank/qr_payout/3_static_QR-cods.md
@@ -0,0 +1,765 @@
+Статический QR-код
+
+Статический QR-код
+
+Оплата по статическому QR-коду — это один из способов безналичной оплаты, альтернатива платежам совершаемых банковскими к
+
+Статический QR-код представляет из себя изображение, которое можно распечатать и разместить на видном месте возле кассовой
+
+Изображение такого QR-кода всегда остается неизменным.
+
+Данный вид QR-кода реализован в двух вариантах:
+
+• с открытой суммой, которую вводит сам покупатель;
+
+• с фиксированной суммой, заполняемой продавцом.
+
+Совершить оплату по статическому QR-коду возможно следующими способами:
+
+• отсканировать изображение QR-кода камерой смартфона и далее перейти в приложение мобильного банка или отсканировать не
+приложения банка;
+
+• в случае если изображение QR-кода содержит NFC-метку, то приложить смартфона с включенным NFC-модулем и совершить опл
+
+Если QR-код уже с фиксированной суммой, то произвести оплату по цене, указанной в реквизитах платежа, если сумма открытая, то
+
+Средства мгновенно поступают на счёт продавца.
+
+Терминал или дополнительное устройство в данном случае не требуется.
+
+1. Запрос на регистрацию статического QR-кода
+
+Метод GetQRCd
+
+• Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…
+
+50)
+
+y Тип запроса. Константа «GetQRCd».
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+qrcType String (n-2) y Тип запрашиваемого QR-кода — «01».
+
+amount Number o Сумма платежа в минорных единицах (копейках).
+
+Значение не указывается, если сумма по платежу вводится плательщиком (сумма открыта).
+
+width String o Ширина картинки QR-кода (только числовое значение).
+
+height String o Высота картинки QR-кода (только числовое значение).
+
+currency String (ans-3) o Код валюты (для рублей должен передаваться «RUB»).
+
+paymentPurpose String (ans-
+140)
+
+o Назначение платежа.
+
+redirectUrl String (ans-
+
+1024)
+
+о Содержит ссылку для автоматического возврата в приложение или на сайт ТСП. Допускаются только си
+
+соответствовать правилам кодировки URL.
+
+Если все же требуется использовать в redirectUrl кириллические символы, необходимо перекодировать
+
+encoded octets согласно RFC3986.
+
+messageID String (ans-
+
+1024)
+
+o Уникальный идентификатор сообщения, GUID. Только латинские символы!
+
+12/23/25, 11:22 AM Статический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/static/?rp-menuOpen=1 1/9
+
+https://alfabank.ru/sme/payservice/sbp/docs/static/?rp-menuOpen=1
+
+
+Код ключа Тип данных required Назначение
+
+queryData.notificationUrl String (ans-
+
+512)
+
+o Полный URL для получения уведомления о финальном статусе оплаты QR-кода. Если параметр отсутс
+
+• Примерный формат запроса:
+
+• Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*.
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+image String (an)
+
+Длинна зависит от формата, порядок 7000 символов.
+
+y Изображение QR-кода содержит энкодированный BASE64 файл из
+
+message String (ans-1024) y Расшифровка кода ответа**.
+
+payload String (1…999) y Платежная ссылка***.
+
+payrrn String (n-12) y Референсный идентификатор запроса в системе Банка.
+
+qrcId String (an-32) y Идентификатор QR-кода.
+
+messageID String (ans-1024) o Уникальный идентификатор сообщения, GUID.
+
+status String (an-20) y Статус регистрации Платежной ссылки СБП.
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+*** Формат payload может быть двух видов:
+
+- https://qr.nspk.ru/AS10000NJTDV88TN82CRT8CG1AU690OF
+
+- https://qr.nspk.ru/AS10000NJTDV88TN82CRT8CG1AU690OF?type=01&bank=100000000008&sum=100&cur=RUB&crc=2D0D
+
+• Примерный формат ответа:
+
+• 200 ОК
+
+1 {
+
+2 "command":"GetQRCd",
+
+3 "TermNo":"90080567",
+
+4 "qrcType":"01",
+
+5 "width":"600",
+
+6 "height":"600",
+
+7 "amount":"10000",
+
+8 "currency":"RUB",
+
+9 "paymentPurpose":"Назначение платежа",
+
+10 "messageID":"message",
+
+11 "queryData":
+
+12 {
+
+13 "notificationUrl":"https://sbp-payments"
+
+14 },
+
+15 "redirectUrl": " https://exampletsp.io/qwertyui "
+
+16 }
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "TermNo": 90080567,
+
+4 "image": "iVBORw0KGgoAAAANSUhEUgAABEoAAARKCAIKFIRoUEQWVNAAAQA/w…...YII",
+
+5 "message": "OK",
+
+6 "messageID": "message",
+
+12/23/25, 11:22 AM Статический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/static/?rp-menuOpen=1 2/9
+
+https://qr.nspk.ru/AS10000NJTDV88TN82CRT8CG1AU690OF
+https://qr.nspk.ru/AS10000NJTDV88TN82CRT8CG1AU690OF?type=01&bank=100000000008&sum=100&cur=RUB&crc=2D0D
+
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request
+
+2. Нотификация о финальном статусе оплаты статического QR-кода
+
+Запрос отправляется из ПШ Банка во внутреннюю систему ТСП на URL адрес, указанный в параметре «queryData.notificationUrl» при н
+
+Метод «qrc/notification»
+
+• Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+qrcId String (an-32) y Идентификатор QR-кода.
+
+trxId String (an-32) y Уникальный идентификатор платежа в НСПК.
+
+status String (an-10) y Статус оплаты QR-кода в НСПК.
+
+Возможные значения:
+
+— ACWP — ACCEPTED операция завершена успешно;
+
+— RJCT — REJECTED операция отклонена.
+
+amount Number y Сумма платежа в минорных единицах (копейках).
+
+timestamp YYYY-MMDDThh: mm: ss[.SSS]
+
+или
+
+YYYY-MMDDThh: mm:
+
+ss[.SSSZ]
+
+y Метка времени НСПК по Гринвичу (GMT).
+
+payerId String (ans) y Идентификатор плательщика (маскированный номер телефона плательщика).
+
+kzo String (ans 1-128) y Контрольное Значение Операции СБП.
+
+Формируется ОПКЦ СБП. Присутствует при условии, что Операция СБП C2B по запрашиваемом
+
+="ACWP»).
+
+payrrn String (n-12) y Референсный идентификатор запроса в системе Банка.
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+CreditDatePos String (ans 1-256) o Дата операции, установленная Банком Получателя в ходе обработки уведомления НСПК.
+
+• Примерный формат запроса:
+
+7 "payload": "https://qr.nspk.ru/AS10000NJTDV88TN82CRT8CG1AU690OF",
+
+8 "payrrn": "000051992395",
+
+9 "qrcId": "AS10000NJTDV88TN82CRT8CG1AU690OF",
+
+10 "status": "CREATED"
+
+11 }
+
+{
+
+"ErrorCode":"Код ответа",
+
+"message":"Расшифровка кода ответа"
+
+}
+
+1 {
+
+2 "command":"qrc/notification",
+
+3 "qrcId":"AS10000NJTDV88TN82CRT8CG1AU690OF",
+
+12/23/25, 11:22 AM Статический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/static/?rp-menuOpen=1 3/9
+
+
+
+• ВС ТСП отвечает http-кодом «200» — успешное получение нотификации, или ошибкой.
+В настоящий момент ответ ВС не обрабатывается шлюзом Агента ТСП. Обработка ответов ТСП сейчас находится в разработк
+В случае добавления со стороны НСПК дополнительных параметров уведомления, система, принимающая их от шлюза Альфа-Банк
+неожиданные параметры как ошибочный запрос.
+
+3. Запрос проведения возврата по успешной оплате по статическому QR-коду
+
+Возврат по СБП состоит из 2х последовательных запросов:
+
+• GetQRCreversalData — проверка возможности проведения возврата;
+
+• QRCreversal — выполнение непосредственно самого возврата.
+
+В случае если ТСП инициирует выполнение повторных операций СБП B2C по одной и той же операции СБП C2B, то допускается не б
+операций СБП B2C в течение одного операционного дня.
+
+3.1. Запрос возможности проведения возврата
+
+Запрос GetQRCreversalData направляется ТСП в Банк для проверки возможности возврата по ранее оплаченному QR-коду и получен
+
+Метод GetQRCreversalData
+
+• Описание параметров запроса:
+
+Код
+ключа Тип данных required Назначение
+
+command String (an-1…
+50)
+
+y Тип запроса. Константа GetQRCreversalData».
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+qrcId String (an-32) y Идентификатор QR-кода.
+
+trxId String (an-32) y Уникальный идентификатор платежа в НСПК.
+
+trxDT String (n-14) o Дата и время отменяемого платежа.
+
+amount Number o Сумма возврата в минорных единицах (копейках). Если сумма возврата не передана, то значение будет принято зн
+
+возвратов.
+
+currency String (ans-3) o Код валюты (для рублей должен передаваться «RUB»). В случае пустого значения валюта будет взята из данных о
+
+messageID String (ans-
+
+1024)
+
+o Уникальный идентификатор сообщения, GUID. Только латинские символы!
+
+Примечание: Терминалы с подключенным сканером и распознаванием QR-кодов могут получить «qrcId», распарсив строку QR-кода
+соответствует полю «payload».
+
+• Примерный формат запроса:
+
+4 "trxId":"A31040920067662400000550448AD7B3",
+
+5 "status":"ACWP",
+
+6 "amount":"10000",
+
+7 "timestamp":"2023-04-14T09:20:06.000Z",
+
+8 "payerId":"\*\*\*\*\*\*\*\*\*1779",
+
+9 "kzo":"580d2f38370f378db5915c047ba7b72014327ce455caa927b2488f224926daac85e82984c889d66e79dad8039ccdefd
+
+10 "payrrn":"000051992395",
+
+11 "TermNo":"90080567",
+
+12 "CreditDatePos":"20230414"
+
+13 }
+
+{
+
+` `"command":"GetQRCreversalData",
+
+` `"TermNo":"90080567",
+
+` `"qrcId":"AS10000NJTDV88TN82CRT8CG1AU690OF",
+
+` `"trxId":"A31040920067662400000550448AD7B3",
+
+` `"trxDT":"20230414062006",
+
+` `"amount":"10000",
+
+12/23/25, 11:22 AM Статический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/static/?rp-menuOpen=1 4/9
+
+
+
+• Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*.
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+message String (ans-1024) y Расшифровка кода ответа**.
+
+messageID String (ans-1024) o Уникальный идентификатор сообщения, GUID.
+
+Значение параметра возвращается в случае, если оно указано в запр
+
+payerBnkBIC String (n-9) y БИК банка получателя.
+
+payerBnkName String (an-50) y Наименование банка получателя.
+
+payerId String (n-13) y Идентификатор получателя (маскированный номер телефона получате
+
+payerPam String (ans 1…140) y PAM получателя.
+
+payrrn String (n-12) y Референсный идентификатор запроса в системе Банка.
+
+qrcId String (an-32) y Идентификатор QR-кода.
+
+trxDT String (n-14) y Дата и время платежа по Гринвичу (GMT).
+
+Формат времени — ГГГГММДДччммсс.
+
+trxId String (an-32) y Уникальный идентификатор платежа в НСПК.
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+• Примерный формат ответа:
+
+• 200 ОК
+
+Примечание:
+
+• Текстовые данные передаются в формате urlencoded;
+
+• В случае получения "message»: «Получен отказ на запрос возврата. Статус Recall, ErrDebetMerchant: KSM0284 Invalid special cond
+счёт ТСП. Он должен быть положительным и без ограничений.
+
+• 400 Bad Request
+
+` `"currency":"RUB",
+
+` `"messageID":"message"
+
+}
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "TermNo": 90080567,
+
+4 "message": "OK",
+
+5 "messageID": "message",
+
+6 "payerBnkBIC": "044525593",
+
+7 "payerBnkName": "%u0410%u043B%u044C%u0444%u0430%20%u0411%u0430%u043D%u043A",
+
+8 "payerId": "*1779",
+
+9 "payerPam": "%u0424%u0421%u0418",
+
+10 "payrrn": "000051992395",
+
+11 "qrcId": "AS10000NJTDV88TN82CRT8CG1AU690OF",
+
+12 "trxDT": 20230414062006
+
+13 "trxId": "A31040920067662400000550448AD7B3"
+
+14 }
+
+12/23/25, 11:22 AM Статический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/static/?rp-menuOpen=1 5/9
+
+
+
+3.2. Запрос возврата оплаты по QR-коду
+
+Запрос QRCreversal направляется ТСП в Банк для возврата по ранее произведенной оплате QR. Возврат производится только на сче
+возврата (метод GetQRCreversalData).
+
+Метод QRCreversal.
+
+• Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…
+50)
+
+y Тип запроса. Константа «QRCreversal».
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+qrcId String (an-32) y Идентификатор QR-кода.
+
+trxId String (an-32) y Уникальный идентификатор платежа в НСПК.
+
+trxDT String (n-14) o Дата и время отменяемого платежа.
+
+amount Number o Сумма платежа в минорных единицах (копейках). Если сумма возврата не передана, то значение будет
+
+совершенных возвратов.
+
+currency String (ans-3) o Код валюты (для рублей должен передаваться «RUB»). В случае пустого значения валюта будет взята
+
+messageID String (ans-
+
+1024)
+
+o Уникальный идентификатор сообщения, GUID из сообщения «GetQRCreversalData». Обязательно если
+
+queryData.notificationUrl String (ans-512) o Полный URL для получения уведомления о финальном статусе возврата QR-кода. Уведомление не про
+
+* messageID — необходимо передавать точное значение, которые было указано в ответе на запрос GetQRCreversalData. Если значени
+запрос GetQRCreversalData с указанием messageID и затем использовать полученный GUID при запросе на возврат.
+
+• Примерный формат запроса:
+
+• Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответ*.
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+{
+
+"ErrorCode":"Код ответа",
+
+"message":"Расшифровка кода ответа"
+
+}
+
+1 {
+
+2 "command":"QRCreversal",
+
+3 "TermNo":"90080567",
+
+4 "qrcId":"AS10000NJTDV88TN82CRT8CG1AU690OF",
+
+5 "trxId":"A31040920067662400000550448AD7B3",
+
+6 "trxDT":"20230414062006",
+
+7 "amount":"10000",
+
+8 "currency":"RUB",
+
+9 "messageID":"message"
+
+10 "queryData":
+
+11 {
+
+12 "notificationUrl":"http://sbp-refunds"
+
+13 }
+
+14 }
+
+12/23/25, 11:22 AM Статический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/static/?rp-menuOpen=1 6/9
+
+
+
+Код ключа Тип данных required Назначение
+
+amount Number y Сумма платежа в минорных единицах (копейках).
+
+currency String (ans-3) y Код валюты (для рублей должен передаваться «RUB»).
+
+message String (ans-1024) y Расшифровка кода ответа.
+
+messageID String (ans-1024) y/o Уникальный идентификатор сообщения, GUID. Только латинские символы!
+
+trxDT String (n-14) y Дата и время совершенного возврата по Московскому времени (MSK).
+
+Формат времени — ГГГГММДДччммсс.
+
+trxId String (an-32) y Уникальный идентификатор операции возврата в НСПК.
+
+payrrn String (n-12) y Референсный идентификатор запроса в системе Банка.
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+• Примерный формат ответа:
+
+• 200 OK
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request
+
+{ "ErrorCode":"Код ответа", "message":"Расшифровка кода ответа" }
+
+4. Запрос статуса возврата СБП (B2C)
+
+Метод «GetQRCreversalStatus» необходим ТСП для уточнения статуса операции B2C (метод QRCreversal).
+
+В запросе «GetQRCreversalStatus» обязательно должна быть передана пара параметров:
+
+1. «payrrn» или «originalTrxId»
+
+Один из параметров «payrrn» или «originalTrxId» используется для нахождения исходного платежа C2B.
+
+2. «trxId» или «messageID».
+
+Один из параметров «trxId» или «messageID» используется для нахождения операции возврата B2C, по которому требуется уточнит
+
+Метод «GetQRCreversalStatus»
+
+• Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «Ge
+
+TermNo String (an-20) y Уникальный идентификатор
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "TermNo": 90080567,
+
+4 "amount": 10000,
+
+5 "currency": "RUB",
+
+6 "message": "%u0412%u043E%u0437%u0432%u0440%u0430%u0442%20%u043F%u0440%u043E%u0432%u0435%u0434%u043
+
+7 "messageID": "message",
+
+8 "payrrn": "000051992395",
+
+9 "trxDT": 20230414093406,
+
+10 "trxId": "B31071502287201D00001650448AD7B3"
+
+11 }
+
+12/23/25, 11:22 AM Статический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/static/?rp-menuOpen=1 7/9
+
+
+
+Код ключа Тип данных required Назначение
+
+payrrn String (n-12) y/o
+
+(обязательно, если не передан параметр «originalTrxId»)
+
+Значение параметра «payrrn
+
+originalTrxId String (an-32) y/o
+
+(обязательно, если не передан параметр «payrrn»)
+
+Идентификатор исходной оп
+
+trxId String (an-32) y/o
+
+(обязательно, если не передан «messageID»)
+
+Уникальный идентификатор
+
+messageID String (ans-1024) y/o
+
+(обязательно, если не передан «trxId»)
+
+Значение параметра «messa
+
+• Примерный формат запроса:
+
+• Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ошибки*.
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+Url String (ans 1-512) o Полный URL получения уведомления для ТСП -значение параметра, переданного при запросе возврата Q
+
+amount Number y Сумма Операции СБП в копейках. Целое, положительное число. Валюта операции — рубли РФ.
+
+message String (ans-1024) y Описание результата выполнения запроса**.
+
+messageID String (an-32) o Значение параметра «messageID» из запроса «QRCreversal».
+
+originalQrcId String (an-32) y Идентификатор зарегистрированной Платежной ссылки СБП, по которому была выполнена исходная Опе
+
+originalTrxId String (an-32) y Идентификатор исходной Операции СБП C2B.
+
+payerId String (an-13) y Маскированный номер телефона Клиента-Получателя (Плательщика в исходной Операции C2B, кому дел
+
+status String (an-4) y Статус операции возврата СБП (B2C):
+
+ACWP — ACCEPTED операция завершена успешно;
+
+RJCT — REJECTED операция отклонена;
+
+NTST — Статус операции неизвестен.
+
+trxDT String (n-14) y Дата и время выполнения Операции СБП B2C по сценарию «Возврат по Операции СБП C2B» (ГГГГММДД
+
+trxId String (an-32) y Уникальный идентификатор операции возврата в НСПК.
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+• Примерный формат ответа:
+
+{
+
+ "command": "GetQRCreversalStatus",
+
+ "TermNo": "90080567",
+
+ "payrrn": "000051992395",
+
+ "originalTrxId": "A31040920067662400000550448AD7B3",
+
+ "trxId": "B31071502287201D00001650448AD7B3",
+
+ "messageID":"message"
+
+}
+
+12/23/25, 11:22 AM Статический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/static/?rp-menuOpen=1 8/9
+
+
+
+• 200 OK
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "TermNo": 90080567,
+
+4 "amount": 10000,
+
+5 "message": "OK",
+
+6 "messageID":"123Rersal_Num567",
+
+7 "originalQrcId": "AS10000NJTDV88TN82CRT8CG1AU690OF",
+
+8 "originalTrxId": "A31040920067662400000550448AD7B3",
+
+9 "payerId": "*********1779",
+
+10 "URL":"http://sbp-payment/status",
+
+11 "status": "ACWP",
+
+12 "trxDT": 20230414093406,
+
+13 "trxId": "B31071502287201D00001650448AD7B3"
+
+14 }
+
+{
+
+"ErrorCode":"Код ответа",
+
+"message":"Расшифровка кода ответа"
+
+}
+
+12/23/25, 11:22 AM Статический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/static/?rp-menuOpen=1 9/9
+
+
diff --git a/_docs/alfabank/qr_payout/4_dynamic_QR-cods.md b/_docs/alfabank/qr_payout/4_dynamic_QR-cods.md
new file mode 100644
index 0000000..be1e427
--- /dev/null
+++ b/_docs/alfabank/qr_payout/4_dynamic_QR-cods.md
@@ -0,0 +1,1399 @@
+
+Динамический QR-код
+
+Динамический QR-код
+
+Оплата по динамическому QR-коду — это один из способов безналичной оплаты, альтернатива платежам совершаемых банковскими
+
+Динамический QR-код создается отдельно под каждую конкретную покупку, поэтому он сразу содержит стоимость покупки и все не
+
+Для генерации динамического QR-кода необходимо устройство: компьютер, смартфон или терминал. Чтобы провести оплату касси
+мобильного телефона или через банковское приложение, подтверждает оплату. Средства мгновенно поступают на счёт продавца.
+
+1. Запрос на регистрацию динамического QR-кода
+
+Метод GetQRCd
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «GetQRCd».
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+qrcType String (n-2) y Тип запрашиваемого QR-кода — «02».
+
+amount Number y Сумма платежа в минорных единицах (копейках).
+
+currency String (ans-3) y Код валюты (для рублей должен передаваться «RUB»).
+
+OrderNumber String (ans-1000) o Номер заказа.
+
+В параметре должны передаваться только английские буквы и/или арабские
+
+width String o Ширина картинки QR-кода (только числовое значение).
+
+height String o Высота картинки QR-кода (только числовое значение).
+
+paymentPurpose String (ans-140) o Назначение платежа.
+
+messageID String (an-1…1024) o Уникальный идентификатор сообщения, GUID. Только латинские символы!
+
+qrTtl String (an-1…6) o Срок жизни Платежной ссылки СБП в минутах.
+
+Минимальное допустимое значение — «1». Максимальное допустимое значен
+
+Рекомендация: устанавливать срок жизни Платежной ссылки СБП не менее «
+
+queryData.notificationUrl String (ans-512) o Полный URL для получения уведомления о финальном статусе оплаты QR-ко
+
+Если параметр отсутствует, уведомление не производится.
+
+redirectUrl String (ans-1024) о Содержит ссылку для автоматического возврата в приложение или на сайт ТСП
+
+Если все же требуется использовать в redirectUrl кириллические символы, необх
+
+Блок для внесения д
+
+Код ключа Тип данных required
+
+extJsonParams Object o
+
+12/23/25, 11:23 AM Динамический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1 1/16
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1
+
+
+Код ключа Тип данных required
+
+JsonParam1 String (ans-250) o
+
+JsonParam2 String (ans-250) o
+
+... ... ...
+
+JsonParam10 String (ans-250) o
+
+Если требуется сформировать динамический QR-ко
+
+Код ключа Тип
+данных required Назначение
+
+subscriptionServiceId String (32) o Идентификатор привязки. Обязательно при наличии subscriptionServiceName, т. к. параметры subscriptionS
+
+их в ходе проверки данных привязки счёта на уникальность.
+
+subscriptionServiceName String (70) o Наименование привязки. Обязательно при наличии subscriptionServiceId, т. к. параметры subscriptionServic
+
+их в ходе проверки данных привязки счёта на уникальность.
+
+Если требуется сформировать динамический QR-код под о
+
+Код ключа Тип данных required Назначен
+
+queryData.SenderFIO String (an-140) o Фамилия,
+
+queryData.SenderID String (an-11.13) o Идентифи
+
+queryData.SenderBankBIC String (n-9) o БИК Банка
+
+* Блок для передачи дополнительных идентификаторов ТСП в ежедневные реестры СБП. Функционал потребует дополнительной н
+
+b) Примерный формат запроса:
+
+1 {
+
+2 "command":"GetQRCd",
+
+3 "TermNo":"90080567 ",
+
+4 "qrTtl":"5",
+
+5 "amount":"10000",
+
+6 "currency":"RUB",
+
+7 "qrcType":"02",
+
+8 "width":"600",
+
+9 "height":"600",
+
+10 "paymentPurpose":"Назаначение платежа",
+
+11 "OrderNumber":"FYI123456",
+
+12 "subscriptionServiceId":"3842ca282aea11e88feca860b60304d5",
+
+13 "subscriptionServiceName":"Подписка на онлайн-кинотеатр",
+
+14 "messageID":"f9aa54ff-a615-44b8-aa6c-acab655c89f8",
+
+15 "redirectUrl": "https://alfabank.ru/sme/payservice/sbp/",
+
+16 "extJsonParams":
+
+17 {
+
+18 "JsonParam1":"Value",
+
+19 "JsonParam2":"Value",
+
+20 "JsonParam3":"Value",
+
+21 "JsonParam4":"Value",
+
+22 "JsonParam5":"Value",
+
+23 "JsonParam6":"Value",
+
+24 "JsonParam7":"Value",
+
+25 "JsonParam8":"Value",
+
+26 "JsonParam9":"Value",
+
+27 "JsonParam10":"Value"
+
+28 },
+
+29 "queryData":
+
+30 {
+
+31 "notificationUrl":"https://sbp-payments",
+
+32 "SenderFIO":"Иванов|Иван|Иванович",
+
+33 "SenderID":"0079123456789",
+
+34 "SenderBankBIC":"44525593"
+
+12/23/25, 11:23 AM Динамический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1 2/16
+
+
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначен
+
+ErrorCode String (an-20) y Код ответа
+
+TermNo String (an-20) y Уникальны
+
+image String (an)
+
+Длинна зависит от формата, порядок 7000 символов.
+
+y Изображен
+
+message String (ans-1024) y Расшифро
+
+messageID String (ans-1024) o Уникальны
+
+Значение
+
+payload String (1…999) y Платежная
+
+payrrn String (n-12) y Референс
+
+qrcId String (an-32) y Идентифи
+
+status String (n-7) y Статус рег
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+*** Формат payload может быть двух видов:
+
+- https://qr.nspk.ru/AD100026KQ0ESJBV8OFPCG0U9K1H52UM
+
+- https://qr.nspk.ru/AD100026KQ0ESJBV8OFPCG0U9K1H52UM?type=02&bank=100000000008&sum=10000&cur=RUB&crc=4244
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request { "ErrorCode":"Код ответа", "message":"Расшифровка кода ответа" }
+
+2. Запрос статуса оплаты по динамическому QR-коду
+
+Запрос статуса GetQRCstatus направляется кассой/терминалом ТСП в Банк для получения статуса Операции оплаты выпущенного ра
+
+Запрос статуса направляется не ранее, чем через 10 секунд после формирования QR-кода и не чаще чем каждые 3 секунды.
+
+Успешный ответ на запрос статуса можно получить в течении 30 дней после совершения оплаты по данному QR-коду.
+
+В случае, если срок хранения данных истек, то в ответе на запрос вернется:
+
+35 }
+
+36 }
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "TermNo": 90080567,
+
+4 "image":"iVBORw0KGgoAAAANSUhEUgAAghjysAAAAgjjafggkqqBEoAAARKCAIAAAQA/w……………..................Y
+
+5 "message": "OK",
+
+6 "messageID": "f9aa54ff-a615-44b8-aa6c-acab655c89f8",
+
+7 "payload": "https://qr.nspk.ru/AD100026KQ0ESJBV8OFPCG0U9K1H52UM",
+
+8 "payrrn": "000000022154",
+
+9 "qrcId": "AD100026KQ0ESJBV8OFPCG0U9K1H52UM",
+
+10 "status": "CREATED"
+
+11 }
+
+12/23/25, 11:23 AM Динамический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1 3/16
+
+https://qr.nspk.ru/AD100026KQ0ESJBV8OFPCG0U9K1H52UM
+https://qr.nspk.ru/AD100026KQ0ESJBV8OFPCG0U9K1H52UM?type=02&bank=100000000008&sum=10000&cur=RUB&crc=4244
+
+
+Метод GetQRCstatus
+
+• Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «GetQRCstatus».
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+qrcId String (an-32) y/o Идентификатор QR-кода (обязательно, есл
+
+payrrn String (n-12) y/o Референсный идентификатор запроса в си
+
+messageID String (ans-1024) o Уникальный идентификатор сообщения, G
+
+• Примерный формат запроса:
+
+• Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*.
+
+message String (ans-1024) y Расшифровка кода ответа**.
+
+qrcId String (an-32) y Идентификатор QR-кода.
+
+status String(an-10) y Статус оплаты QR-кода в НСПК***.
+
+Возможные значения:
+
+1. ACWP — ACCEPTED операция завершена успешно;
+
+2. RJCT — REJECTED операция отклонена;
+
+3. NTST — NOT_STARTED операции по QR коду не существует;
+
+4. RCVD — RECEIVED операция в обработке.
+
+trxId String (an-32) y Уникальный идентификатор платежа в НСПК.
+
+trxDT String (n-14) y Дата и время платежа по Гринвичу.
+
+Формат — ГГГГММДДччммсс.
+
+payrrn String (n-12) y Референсный идентификатор запроса в системе Банка.
+
+CreditDatePos String (ans 1-256) y Дата операции, установленная Банком Получателя (ГГГГММДД)
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+{
+
+"ErrorCode":999,
+
+"message":"Неизвестный код проблемы 999RQ05014"
+
+}
+
+{
+
+ "command":"GetQRCstatus",
+
+ "TermNo":"90080567",
+
+ "qrcId":"AD100026KQ0ESJBV8OFPCG0U9K1H52UM",
+
+ "payrrn":"000000022154",
+
+ "messageID": "message"
+
+}
+
+12/23/25, 11:23 AM Динамический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1 4/16
+
+
+
+Код ключа Тип данных required Назначение
+
+amount Number y Сумма платежа в минорных единицах (копейках).
+
+currency String (ans-3) o Код валюты (для рублей должен передаваться «RUB»).
+
+Url String (ans 1-512) o Полный URL для получения уведомления ТСП о финальном статусе оплаты QR-кода. Зн
+
+payerId String (n-13) y Идентификатор плательщика (маскированный номер телефона плательщика).
+
+Kzo String (ans 1-128) o Контрольное Значение Операции СБП.
+
+Формируется на стороне НСПК.
+
+Присутствует при условии, что Операция СБП C2B по запрашиваемому qrcId заверше
+
+messageID String (ans-1024) o Уникальный идентификатор сообщения, GUID.
+
+Значение параметра возвращается в случае, если оно указано в запросе.
+
+merchantId String (12) o ID мерчанта (ТСТ) в Банке
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+Примечание:
+
+• Успешно оплаченным считается только QR-код, для которого получен «status» = «ACWP» с идентификатором платежа «trxId» и «E
+
+• В случае если получен «status» = «NTST» — означает необходимость повтора запроса до получения одного из финальных статусов
+
+• Получение «status» = «RJCT» означает отказ в оплате данного QR-кода.
+
+— Примерный формат ответа:
+
+• 200 OK
+
+Примечание:
+
+• Текстовые данные передаются в формате urlencoded.
+
+• В поле " trxDT» содержится дата и время транзакции на ПШ Банка в формате ГГГГММДДччммсс.
+
+В случае получения значения trxId = null необходимо повторить запрос. Отсутствие значения означает, что в СБП еще нет успешного
+
+• 400 Bad Request
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "message": "OK",
+
+4 "qrcId": "AD100026KQ0ESJBV8OFPCG0U9K1H52UM",
+
+5 "status": "ACWP",
+
+6 "trxId": "A3013090427361010000057B3DA2D4A7",
+
+7 "trxDT": "20230113090427",
+
+8 "payrrn": "000000022154",
+
+9 "CreditDatePos": "20230113",
+
+10 "TermNo": 90080567,
+
+11 "amount": 10000,
+
+12 "currency": "RUB",
+
+13 "Url":"https://sbp-payments",
+
+14 "payerId": "*********1234",
+
+15 "kzo": "212b906a810f2562fd88e145199b30f4b4ea5c7cd7d0261236a73a6152f07f56b7feb915712a055522ee9b76
+
+16 "messageID": "message",
+
+17 "merchantId": "MB0000009603"
+
+18 }
+
+{
+
+ "ErrorCode":"Код ответа",
+
+12/23/25, 11:23 AM Динамический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1 5/16
+
+
+
+3. Нотификация ТСП о финальном статусе оплаты по динамическому QR-коду
+
+Запрос отправляется из ПШ Банка во внутреннюю систему ТСП на URL адрес, указанный в параметре «queryData.notificationUrl» при н
+
+Метод «qrc/notification»
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1...50) y Тип запроса. Константа «qrc/notification»
+
+qrcId String (an-32) y Идентификатор QR-кода.
+
+trxId String (an-32) y Уникальный идентификатор платежа в НСПК.
+
+status String (an-10) y Статус оплаты QR-кода в НСПК.
+
+Возможные значения:
+
+— ACWP — ACCEPTED операция завершена успешно;
+
+— RJCT — REJECTED операция отклонена.
+
+amount Number y Сумма платежа в минорных единицах (копейках)
+
+timestamp YYYY-MMDDThh: mm: ss[.SSS]
+
+или
+
+YYYY-MMDDThh: mm: ss[.SSSZ]
+
+y Метка времени НСПК по Гринвичу (GMT).
+
+payerId String (n-13) y Идентификатор плательщика (маскированный номер те
+
+kzo String (ans 1-128) o Контрольное Значение Операции СБП.
+
+Формируется ОПКЦ СБП. Присутствует при условии, чт
+
+payrrn String (n-12) y Референсный идентификатор запроса в системе Банка
+
+TermNo String (an-20) Y Уникальный идентификатор терминала.
+
+CreditDatePos String (ans 1-256) o Дата операции, установленная Банком Получателя в хо
+
+b) Примерный формат запроса:
+
+c) ВС ТСП отвечает http-кодом «200» — успешное получение нотификации, или ошибкой.
+
+В настоящий момент ответ ВС не обрабатывается шлюзом Агента ТСП. Обработка ответов ТСП находится в разработке.
+
+В случае добавления со стороны НСПК дополнительных параметров уведомления, система, принимающая их от шлюза Альфа-Банка,
+
+ "message":"Расшифровка кода ответа"
+
+}
+
+1 {
+
+2 "command":"qrc/notification",
+
+3 "qrcId":"AD100026KQ0ESJBV8OFPCG0U9K1H52UM",
+
+4 "trxId":"A3013090427361010000057B3DA2D4A7",
+
+5 "status":"ACWP",
+
+6 "amount":"10000",
+
+7 "timestamp":"2022-10-27T14:33:49.000Z ",
+
+8 "payerId":"*********1779",
+
+9 "kzo":"580d2f38370f378db5915c047ba7b72014327ce455caa927b2488f224926daac85e82984c889d66e79dad8039cc
+
+10 "payrrn":"000000022154",
+
+11 "TermNo":"90080567",
+
+12 "CreditDatePos":"20221027"
+
+13 }
+
+12/23/25, 11:23 AM Динамический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1 6/16
+
+
+
+4. Запрос проведения возврата по успешной оплате по динамическому QR-коду
+
+Возврат по СБП состоит из 2х последовательных запросов:
+
+• GetQRCreversalData — проверка возможности проведения возврата;
+
+• QRCreversal — выполнение непосредственно самого возврата.
+
+В случае если ТСП инициирует выполнение повторных операций СБП B2C по одной и той же операции СБП C2B, то допускается не б
+
+Возврат в один этап. При направлении запроса «QRCReversal», с заполненным полем messageID будет произведен возврат в один
+
+4.1. Запрос возможности проведения возврата
+
+Запрос GetQRCreversalData направляется ТСП в Банк для проверки возможности возврата по ранее оплаченному QR-коду и получен
+
+Метод GetQRCreversalData
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «GetQRCreversalData».
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+qrcId String (an-32) y/o Идентификатор QR-кода (обязательно, если не передан «payrrn» или «trxId»).
+
+payrrn String (n-12) y/o Референсный идентификатор запроса в системе Банка (обязательно, если не
+
+trxId String (an-32) y/o Уникальный идентификатор платежа в НСПК (обязательно, если не передан «q
+
+trxDT String (n-14) o Дата и время отменяемого платежа.
+
+amount Number o Сумма возврата в минорных единицах (копейках). Если сумма возврата не пер
+
+currency String (ans-3) o Код валюты (для рублей должен передаваться «RUB»). В случае пустого значе
+
+messageID String (ans-1024) o Уникальный идентификатор сообщения, GUID. Только латинские символы!
+
+ReturnRestAmount Boolean o Проверка доступного остатка для совершения возврата.
+
+Доступные значения:
+
+— true
+
+— false
+
+Примечание:
+
+• Для поиска оригинальной транзакции обязательным является один из параметров: «qrcId», «payrrn» или «trxId»;
+
+• Терминалы с подключенным сканером и распознаванием QR-кодов могут получить «qrcId», распарсив строку QR-кода с чека опла
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+1 {
+
+2 "command":"GetQRCreversalData",
+
+3 "TermNo":"90080567",
+
+4 "qrcId":"AS1000670LSS7DN18SJQDNP4B05KLJL2",
+
+5 "payrrn":"000063441405",
+
+6 "trxId":"X1A2S3D5F6G7H8J9K0C4S5C6D7V5D1K2",
+
+7 "trxDT":"20230313052005",
+
+8 "amount":"10000",
+
+9 "currency":"RUB",
+
+10 "messageID":"f9aa54ff-a615-44b8-aa6c-acab655c89f8",
+
+11 "ReturnRestAmount":true
+
+12 }
+
+12/23/25, 11:23 AM Динамический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1 7/16
+
+
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*.
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+message String (ans-1024) y Расшифровка кода ответа**.
+
+messageID String (ans-1024) o Уникальный идентификатор сообщения, GUID. Только латинские символы!
+
+payerBnkBIC String (n-9) y БИК банка получателя.
+
+payerBnkName String (an-50) y Наименование банка получателя
+
+payerId String (n-13) y Идентификатор получателя (маскированный номер телефона получателя).
+
+payerPam String (ans 1…140) y PAM получателя
+
+payrrn String (n-12) y Референсный идентификатор запроса в системе Банка
+
+qrcId String (an-32) y Идентификатор QR-кода
+
+trxDT String (n-14) y Дата и время платежа по Гринвичу (GMT).
+
+Формат времени — ГГГГММДДччммсс.
+
+trxId String (an-32) y Уникальный идентификатор платежа в НСПК.
+
+restAmount Number (с двумя знаками после точки) o Сумма доступного остатка к возврату.
+
+Если в запросе передано значение "ReturnRestAmount" : true, то в ответе д
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+Примечание:
+
+• Текстовые данные передаются в формате urlencoded;
+
+• В случае получения «message»: «Получен отказ на запрос возврата. Статус Recall, ErrDebetMerchant: KSM0284 Invalid special cond
+
+• 400 Bad Request
+
+4.2. Запрос возврата оплаты QR-кода
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "TermNo": 90080567,
+
+4 "message": "OK",
+
+5 "payerBnkBIC": "044525593",
+
+6 "payerBnkName": "Альфа-Банк",
+
+7 "payerId": "*1234",
+
+8 "payerPam": "ФСИ",
+
+9 "payrrn": "000063441405",
+
+10 "qrcId": "AS1000670LSS7DN18SJQDNP4B05KLJL2",
+
+11 "trxDT": 20200728114531,
+
+12 "trxId": "X1A2S3D5F6G7H8J9K0C4S5C6D7V5D1K2",
+
+13 "restAmount":"99.87"
+
+14 }
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+ }
+
+12/23/25, 11:23 AM Динамический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1 8/16
+
+
+
+Запрос QRCreversal направляется ТСП в Банк для возврата по ранее произведенной оплате QR. Возврат производится только на сче
+
+Метод QRCreversal
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «QRCreversal».
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+qrcId String (an-32) y/o Идентификатор QR-кода (обязательно, если не передан «payrrn» или «trx
+
+payrrn String (n-12) y/o Референсный идентификатор запроса в системе Банка (обязательно, есл
+
+trxId String (an-32) y/o Уникальный идентификатор платежа в НСПК (обязательно, если не перед
+
+trxDT String (n-14) o Дата и время отменяемого платежа.
+
+amount Number o Сумма возврата в минорных единицах (копейках). Если сумма возврата н
+
+currency String (ans-3) o Код валюты (для рублей должен передаваться «RUB»). В случае пустого
+
+messageID String (an-1…50) y/o Уникальный идентификатор сообщения, GUID из сообщения «GetQRCrev
+
+queryData.notificationUrl String (ans-512) o Полный URL для получения уведомления о финальном статусе возврата
+
+ReturnRestAmount Boolean o Проверка доступного остатка для совершения возврата.
+
+Доступные значения:
+
+— true
+
+— false
+
+Блок для внесения д
+
+Код ключа Тип данных required
+
+extJsonParams Object o
+
+JsonParam1 String (ans-250) o
+
+JsonParam2 String (ans-250) o
+
+... ... ...
+
+JsonParam10 String (ans-250) o
+
+* messageID — необходимо передавать точное значение, которые было указано в ответе на запрос GetQRCreversalData. Если значени
+на возврат.
+
+** Блок для передачи дополнительных идентификаторов ТСП в ежедневные реестры СБП. Функционал потребует дополнительной
+
+Примечание: Для поиска оригинальной транзакции обязательным является один из параметров: «qrcId», «payrrn» или «trxId».
+
+b) Примерный формат запроса:
+
+1 {
+
+2 "command":"QRCreversal",
+
+3 "TermNo":"90080567",
+
+4 "qrcId":"AS1000670LSS7DN18SJQDNP4B05KLJL2",
+
+5 "payrrn":"000063441405",
+
+6 "trxId":"X1A2S3D5F6G7H8J9K0C4S5C6D7V5D1K2",
+
+7 "trxDT":"20230313052005",
+
+8 "amount":"10000",
+
+9 "currency":"RUB",
+
+10 "messageID":"f9aa54ff-a615-44b8-aa6c-acab655c89f8",
+
+12/23/25, 11:23 AM Динамический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1 9/16
+
+
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*.
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+amount Number y Сумма платежа в минорных единицах (копейках).
+
+currency String (ans-3) y Код валюты (для рублей должен передаваться «RUB»).
+
+message String (ans-1024) y Расшифровка кода ответа**.
+
+messageID String (ans-1024) o Уникальный идентификатор сообщения, GUID. Только латинские символы!
+
+trxDT String(n-14) y Дата и время операции возврата (ГГГГММДДччммсс).
+
+trxId String(an-32) y Уникальный идентификатор операции возврата в НСПК.
+
+payrrn String (n-12) y Референсный идентификатор запроса в системе Банка.
+
+restAmount Number (с двумя знаками после точки) o Сумма доступного остатка к возврату.
+
+Если в запросе передано значение "ReturnRestAmount" : true, то в ответе дол
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request
+
+11 "extJsonParams":
+
+12 {
+
+13 "JsonParam1":"Value",
+
+14 "JsonParam2":"Value",
+
+15 "JsonParam3":"Value",
+
+16 "JsonParam4":"Value",
+
+17 "JsonParam5":"Value",
+
+18 "JsonParam6":"Value",
+
+19 "JsonParam7":"Value",
+
+20 "JsonParam8":"Value",
+
+21 "JsonParam9":"Value",
+
+22 "JsonParam10":"Value"
+
+23 },
+
+24 "queryData":
+
+25 {
+
+26 "notificationUrl":"http://sbp-refunds/"
+
+27 },
+
+28 "ReturnRestAmount": true
+
+29 }
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "TermNo": 90080567,
+
+4 "amount": 10000,
+
+5 "currency": "RUB",
+
+6 "message": "%u0412%u043E%u0437%u0432%u0440%u0430%u0442%20%u043F%u0440%u043E%u0432%u0435%u0434%
+
+7 "messageID":"message"
+
+8 "payrrn": "000063441405",
+
+9 "trxDT": 20230624143642,
+
+10 "trxId": "A3024113609260070000086B8426B817",
+
+11 "restAmount": "99.87"
+
+12 }
+
+12/23/25, 11:23 AM Динамический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1 10/16
+
+
+
+5. Запрос статуса возврата СБП (B2C)
+
+Метод «GetQRCreversalStatus» необходим ТСП для уточнения статуса операции B2C (метод QRCreversal).
+
+В запросе «GetQRCreversalStatus» обязательно должна быть передана пара параметров:
+
+1. «payrrn» или «originalTrxId» Один из параметров «payrrn» или «originalTrxId» используется для нахождения исходного платежа C2
+
+2. «trxId» или «messageID». Один из параметров «trxId» или «messageID» используется для нахождения операции возврата B2C, по
+
+Метод «GetQRCreversalStatus»
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required
+
+command String (an-1…50) y
+
+TermNo String (an-20) y
+
+payrrn String (n-12) y/o
+
+(обязательно, если не передан параметр «originalTrxId»)
+
+originalTrxId String (an-32) y/o
+
+(обязательно, если не передан параметр «payrrn»)
+
+trxId String (an-32) y/o
+
+(обязательно, если не передан messageID,)
+
+messageID String (ans-1…1024) y/o
+(обязательно, если не передан trxId)
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ошибки*.
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+Url String (ans 1-512) o Полный URL получения уведомления для ТСП — значение параметра,
+
+amount Number y Сумма Операции СБП в копейках. Целое, положительное число. Валют
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+ }
+
+{
+
+ "command":"GetQRCreversalStatus",
+
+ "TermNo":"90080567",
+
+ "payrrn":"000063441405",
+
+ "originalTrxId":"X1A2S3D5F6G7H8J9K0C4S5C6D7V5D1K2",
+
+ "trxId":"A3024113609260070000086B8426B817",
+
+ "messageID":"message"
+
+}
+
+12/23/25, 11:23 AM Динамический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1 11/16
+
+
+
+Код ключа Тип данных required Назначение
+
+message String (ans-1024) y Описание результата выполнения запроса**.
+
+messageID String (ans-1024) o Значение параметра «messageID» из запроса «QRCreversal».
+
+originalQrcId String (an-32) y Идентификатор зарегистрированной Платежной ссылки СБП, по которо
+
+originalTrxId String (an-32) y Идентификатор исходной Операции СБП C2B.
+
+payerId String (an-13) y Маскированный номер телефона Клиента-Получателя (Плательщика в
+
+status String (an-4) y Статус операции возврата СБП (B2C):
+
+ACWP — ACCEPTED операция завершена успешно;
+
+RJCT — REJECTED операция отклонена;
+
+NTST — Статус операции неизвестен.
+
+trxDT String (n-14) y Дата и время выполнения Операции СБП B2C по сценарию «Возврат п
+
+trxId String (an-32) y Уникальный идентификатор операции возврата в НСПК.
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 ОК
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request
+
+6. Запрос истории возвратов по определённой транзакции СБП C2B
+
+Запрос позволяет ТСП проверить все совершённые возвраты по определённой транзакции СБП C2B.
+
+В ответе на запрос возвращаются как успешные, так и неуспешные попытки возвратов.
+
+Метод GetQRCreversalHistory
+
+a) Описание параметров запроса:
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "TermNo": 90080567,
+
+4 "amount": 10000,
+
+5 "message": "OK",
+
+6 "messageID": "message"
+
+7 "originalQrcId": "AS1000670LSS7DN18SJQDNP4B05KLJL2",
+
+8 "originalTrxId": "X1A2S3D5F6G7H8J9K0C4S5C6D7V5D1K2",
+
+9 "payerId": "*********1234",
+
+10 "status": "ACWP",
+
+11 "trxDT": 20230624143642,
+
+12 "trxId": "A3024113609260070000086B8426B817"
+
+13 }
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+}
+
+12/23/25, 11:23 AM Динамический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1 12/16
+
+
+
+Код ключа Тип данных required
+
+command String (an-1…50) y
+
+TermNo String (an-20) y
+
+payrrn String (n-12) y
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*
+
+message String (ans-1024) y Расшифровка кода ответа**
+
+Refunds Array y Массив объектов, содержащих информацию о возвратах по плат
+
+При отсутствии возвратов, будет возвращён ответ с сообщением
+
+refunds.TermNo String (an-20) y Уникальный идентификатор терминала
+
+refunds.amount Number y Сумма Операции СБП B2C (возврат) в копейках. Целое, положител
+
+refunds.originalQrcId String (an-32) y Идентификатор зарегистрированной Платёжной ссылки СБП (QR-к
+
+refunds.originalTrxId String (an-32) y Идентификатор исходной Операции СБП C2B в НСПК
+
+refunds.payerId String (an-15) y Маскированный номер телефона Клиента-Получателя (Плательщи
+
+refunds.status String (an-4) y Статус операции возврата СБП (B2C):
+
+1. ACWP — ACCEPTED возврат успешно выполнен
+
+2. RJCT — REJECTED возврат отклонён
+
+3. NTST — NOT_STARTED возврат не инициирован (получен успе
+
+refunds.trxId String (an-32) y Идентификатор Операции возврата СБП B2C по сценарию «Возвра
+
+refunds.trxDT String (n-4) y Дата и время выполнения Операции возврата СБП B2C по сцена
+
+Формат: ГГГГММДДччммсс, UTC +0
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа «ACWP» и «RJCT»:
+
+• 200 ОК
+
+{
+
+ "command":"GetQRCreversalHistory",
+
+ "TermNo":"90080567",
+
+ "payrrn":"000000002212"
+
+}
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "message": "OK",
+
+4 "refunds": [
+
+5 {
+
+6 "TermNo": 90080567,
+
+7 "amount": 10000,
+
+8 "originalQrcId": "AS1F004F30VC6B4A9GRBENS0HI6LGRJM",
+
+12/23/25, 11:23 AM Динамический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1 13/16
+
+
+
+• 400 Bad Request
+
+e) Примерный формат ответа «NTST»:
+
+• 200 ОК
+
+• 400 Bad Request
+
+f) Примерный формат ответа при отсутствии возвратов по транзакции СБП C2B:
+
+• 200 OK
+
+Декодирование значения поля «message» - «По данной оплате возвраты не найдены».
+
+• 400 Bad Request
+
+9 "originalTrxId": "B51390819586020Z0000120011510503",
+
+10 "payerId": "*********1234",
+
+11 "status": "ACWP",
+
+12 "trxDT": 20250519082345,
+
+13 "trxId": "B51390823097450W0000180011510503"
+
+14 },
+
+15 {
+
+16 "TermNo": 90080567,
+
+17 "amount": 10000,
+
+18 "originalQrcId": "AS1F004F30VC6B4A9GRBENS0HI6LGRJM",
+
+19 "originalTrxId": "B51390819586020Z0000120011510503",
+
+20 "payerId": "*********1234",
+
+21 "status": "RJCT",
+
+22 "trxDT": 20250519083836,
+
+23 "trxId": "A4327120041167130000020011381101"
+
+24 }
+
+25 ]
+
+26 }
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+ }
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "message": "OK",
+
+4 "refunds": [
+
+5 {
+
+6 "TermNo": 90080567,
+
+7 "amount": 10000,
+
+8 "originalQrcId": "AS1F004F30VC6B4A9GRBENS0HI6LGRJM",
+
+9 "originalTrxId": "B51390819586020Z0000120011510503",
+
+10 "payerId": "*********1234",
+
+11 "status": "NTST",
+
+12 "trxId": "B51390835362750D0000100011510503"
+
+13 }
+
+14 ]
+
+15 }
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+ }
+
+{
+
+ "ErrorCode": 0,
+
+ "message": "%u041F%u043E%20%u0434%u0430%u043D%u043D%u043E%u0439%20%u043E%u043F%u043B%u0430%u0442
+
+ }
+
+12/23/25, 11:23 AM Динамический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1 14/16
+
+
+
+7. Нотификация о финальном статусе возврата по динамическому QR-коду
+
+Запрос отправляется из ПШ Банка во внутреннюю систему ТСП на URL адрес, указанный в параметре «queryData.notificationUrl» при н
+
+Метод «b2c-refund/notification»
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «b2c-refund/notification»
+
+messageID String (ans-1024) o Уникальный идентификатор сообщения, GUID
+
+TermNo String (an-20) y Уникальный идентификатор терминала
+
+originalQrcId String (an-32) y Идентификатор зарегистрированной Платежно
+
+originalTrxId String (an-32) y Идентификатор исходной Операции СБП C2B
+
+trxId String (an-32) y Идентификатор Операции СБП B2C по сценар
+
+trxDT String (n-14) y Дата и время выполнения Операции СБП B2C
+
+status String (an-4) y Финальный статус Операции СБП B2C:
+
+«ACWP» — ACCEPTED операция завершена у
+
+«RJCT» — REJECTED операция отклонена;
+
+amount Number y Сумма операции в копейках
+
+ErrorCode String (an-20) y Код ответа*
+
+message String (ans-1024) y Расшифровка кода ответа**
+
+payerId String (an-15) y Маскированный номер телефона Клиента-Полу
+
+agentRefundRequestId String (an-32) y Уникальный идентификатор запроса, назначае
+
+opkcRefundRequestId String (an-32) y Уникальный идентификатор запроса на возвра
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+b) Примерный формат запроса (по успешному возврату):
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+ }
+
+1 {
+
+2 "command":"b2c-refund/notification",
+
+3 "messageID":" message",
+
+4 "TermNo":"90080567",
+
+5 "originalQrcId":"AS1000670LSS7DN18SJQDNP4B05KLJL2",
+
+6 "originalTrxId":"X1A2S3D5F6G7H8J9K0C4S5C6D7V5D1K2",
+
+7 "trxId":" A3024113609260070000086B8426B817",
+
+8 "trxDT":"20230624143642",
+
+9 "status":"ACWP",
+
+10 "amount":"10000",
+
+11 "ErrorCode":"0",
+
+12 "message":"OK",
+
+13 "payerId":"*********1234",
+
+14 "agentRefundRequestId":"00000000000000000182_abcd1994383",
+
+12/23/25, 11:23 AM Динамический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1 15/16
+
+
+
+В ответ ожидается:
+
+• http-код «200» — Успешный ответ (Уведомление получено);
+
+• http-код «500» — Внутренняя ошибка.
+
+c) Примерный формат запроса (по отклоненному возврату):
+
+В ответ ожидается:
+
+• http-код «200» — Успешный ответ (Уведомление получено);
+
+• http-код «500» — Внутренняя ошибка.
+
+d) ВС ТСП отвечает http-кодом «200» — успешное получение нотификации, или ошибкой.
+
+В настоящий момент ответ ВС не обрабатывается шлюзом Агента ТСП. Обработка ответов ТСП находится в разработке.
+
+В случае добавления со стороны НСПК дополнительных параметров уведомления, система, принимающая их от шлюза Альфа-Банка,
+
+15 "opkcRefundRequestId":"BR10000OKEISOIPM8ST8TBLQHIN9R185"
+
+16 }
+
+1 {
+
+2 "command":"b2c-refund/notification",
+
+3 "TermNo":"90080567",
+
+4 "originalQrcId":"AS1000670LSS7DN18SJQDNP4B05KLJL2",
+
+5 "originalTrxId":"X1A2S3D5F6G7H8J9K0C4S5C6D7V5D1K2",
+
+6 "trxId":"A3024113609260070000086B8426B817",
+
+7 "trxDT":"20230624143642",
+
+8 "status":"RJCT",
+
+9 "amount":"10000",
+
+10 "ErrorCode":"0",
+
+11 "message":"OK",
+
+12 "payerId":"*********1234"
+
+13 }
+
+12/23/25, 11:23 AM Динамический QR-код
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1 16/16
+
+
diff --git a/_docs/alfabank/qr_payout/5_cache_payment_link_SBP.md b/_docs/alfabank/qr_payout/5_cache_payment_link_SBP.md
new file mode 100644
index 0000000..1e3bfdd
--- /dev/null
+++ b/_docs/alfabank/qr_payout/5_cache_payment_link_SBP.md
@@ -0,0 +1,2428 @@
+Кассовая платёжная ссылка
+
+Кассовая платёжная ссылка СБП
+
+Кассовая платёжная ссылка — это гибридное решение, которое объединяет в себе преимущества статического и динамического QR-
+
+Благодаря данному решению сам QR-код не меняется, но в то же время сумма оплаты передаётся с кассы, плательщик не может её и
+
+Для совершения оплаты по кассовой платёжной ссылке достаточно один раз распечатать QR-код и разместить его в удобной прикас
+покупки перед оплатой.
+
+Для каждой кассы/терминала создается своя кассовая платёжная ссылка.
+
+При каждой активации кассовой платёжной ссылки передаются значения параметров, соответствующие очередной покупке.
+
+1. Запрос на регистрацию Кассовой платёжной ссылки СБП
+
+Данный метод позволяет сгенерировать кассовую платёжную ссылку, которую в дальнейшем ТСП может распечатать в необходимо
+
+Кроме того, метод предоставляет возможность привязывать, полученные от Банка NFC-таблички, к нужным кассам/терминалам.
+
+Метод RegCashQRc
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «RegCashQRc».
+
+TermNo String (an-20) y Уникальный идентификатор терминала
+
+mediaType String o Тип картинки QR-кода
+
+width String o Ширина картинка QR-кода
+
+height String o Высота картинка QR-кода
+
+redirectUrl String (ans-1024) о Содержит ссылку для автоматического возврата в приложение или на сайт ТСП. Допускаю
+
+Если все же требуется использовать в redirectUrl кириллические символы, необходимо пе
+
+qrcId String (an-32) o Идентификатор QR-кода. Используется в случае, если необходимо привязать заранее зар
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назн
+
+ErrorCode String (an-20) y Код от
+
+TermNo String (an-20) y Уникал
+
+content String y Base6
+
+{
+
+ "command":"RegCashQRc",
+
+ "TermNo":"90080567",
+
+ "mediaType":"image/png",
+
+ "width":"600",
+
+ "height":"600",
+
+ "redirectUrl": "https://exampletsp.io/qwertyui"
+
+}
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 1/28
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1
+
+
+Код ключа Тип данных required Назн
+
+mediaType String y Тип ка
+
+message String (ans-1024) y Расши
+
+payload String (1…999) y Плате
+
+qrcId String (an-32) y Идент
+
+status String (an-20) y Статус
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+*** Формат payload может быть двух видов:
+
+• https://qr.nspk.ru/BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9;
+
+• https://qr.nspk.ru/BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9?type=01&bank=100000000008&crc=2557
+
+d) Примерный формат ответа:
+
+• 200 ОК
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request
+
+2. Запрос на активацию Кассовой платёжной ссылки СБП
+
+Запрос ActivateCashQRc направляется кассой/терминалом ТСП в Банк для активации Кассовой ссылки в целях ожидания оплаты пла
+
+Метод ActivateCashQRc
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…
+
+50)
+
+y Тип запроса. Константа «ActivateCashQRc».
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+qrcId String (an-32) y Идентификатор QR-кода.
+
+amount Number y Сумма платежа в минорных единицах (копейках).
+
+{
+
+ "ErrorCode": 0,
+
+ "TermNo": 90080567,
+
+ "content": "iVBORw0KGgoAAAANSUhEUgVXne/ /B2Pwbvw1OqlrAAAAAElFTk…………………………....SuQmCC",
+
+ "mediaType": "image/png",
+
+ "message": "OK",
+
+ "payload": "https://qr.nspk.ru/BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+ "qrcId": "BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+ "status": "CREATED"
+
+}
+
+{
+
+"ErrorCode":"Код ответа",
+
+"message":"Расшифровка кода ответа"
+
+}
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 2/28
+
+https://qr.nspk.ru/BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9
+https://qr.nspk.ru/BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9?type=01&bank=100000000008&crc=2557
+
+
+Код ключа Тип данных required Назначение
+
+currency String (ans-3) o Код валюты (для рублей должен передаваться «RUB»). Необязательный параметр, при отсутствии его з
+
+OrderNumber String (ans-
+
+1000)
+
+o Номер заказа.
+
+В параметре должны передаваться только английские буквы и/или арабские цифры, подчеркивание
+
+paymentPurpose String (ans-
+
+140)
+
+o Назначение платежа.
+
+queryData.notificationUrl String (ans-
+
+512)
+
+o Полный URL для получения уведомления о финальном статусе оплаты QR-кода
+
+Если параметр отсутствует, уведомление не производится.
+
+qrTtl String (an-1…
+
+2)
+
+o Период использования Кассовой ссылки в минутах. Необязательное поле.
+
+Допустимый диапазон: 5-20.
+
+Если поле «qrTtl» не передано, то за период использования Кассовой ссылки берется значение по ум
+
+redirectUrl String (ans-
+
+1024)
+
+o Содержит ссылку для автоматического возврата в приложение или на сайт ТСП. Допускаются только
+
+перекодировать их в соответствующий ASCII код, используя percent-encoded octets согласно RFC398
+
+Блок для внесения д
+
+Код ключа Тип данных required
+
+extJsonParams Object o
+
+JsonParam1 String (ans-250) o
+
+JsonParam2 String (ans-250) o
+
+... ... ...
+
+JsonParam10 String (ans-250) o
+
+* Блок для передачи дополнительных идентификаторов ТСП в ежедневные реестры СБП. Функционал потребует дополнительной н
+
+b) Примерный формат запроса:
+
+1 {
+
+2 "command":"ActivateCashQRc",
+
+3 "TermNo":"90080567",
+
+4 "qrTtl":"5",
+
+5 "amount":"10000",
+
+6 "currency":"RUB",
+
+7 "paymentPurpose":"Назаначение платежа",
+
+8 "OrderNumber":"FYI123456",
+
+9 "redirectUrl": "https://alfabank.ru/sme/payservice/sbp/",
+
+10 "extJsonParams":
+
+11 {
+
+12 "JsonParam1":"Value",
+
+13 "JsonParam2":"Value",
+
+14 "JsonParam3":"Value",
+
+15 "JsonParam4":"Value",
+
+16 "JsonParam5":"Value",
+
+17 "JsonParam6":"Value",
+
+18 "JsonParam7":"Value",
+
+19 "JsonParam8":"Value",
+
+20 "JsonParam9":"Value",
+
+21 "JsonParam10":"Value"
+
+22 },
+
+23 "queryData":
+
+24 {
+
+25 "notificationUrl":"https://sbp-payments",
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 3/28
+
+
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных
+
+ErrorCode String (an-20)
+
+TermNo String (an-20)
+
+amount Number
+
+currency String (ans-3)
+
+message String (ans-1024)
+
+paramsId String
+
+paymentPurpose String (ans-140)
+
+payrrn String (an-12)
+
+qrcId String (an-32)
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 ОК
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request
+
+Примечание:
+
+• При повторной активации прежние значения параметров Кассовой ссылки СБП заменяются на новые;
+
+• Если Плательщик отсканирует QR-код активированной Кассовой ссылки СБП и перейдёт в Приложение Плательщика и при этом К
+совершить оплату;
+
+• Если в запросе на активацию Кассовой ссылки СБП не будет передан параметр «amount», то ответ вернется с ошибкой — " RQ05019
+
+• Если при активации Кассовой ссылки СБП значение периода использования выходит за пределы допустимого диапазона 1-20 мин
+значение периода использования Кассовой ссылки СБП — 1 минута, максимальное — 20.
+
+• Если оплата с использованием Кассовой ссылки СБП имеет финальный статус RJCT (оплата не прошла), то ТСП может повторно а
+
+26 }
+
+27 }
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "TermNo": 90080567,
+
+4 "amount": 10000,
+
+5 "currency": "RUB",
+
+6 "message": "OK",
+
+7 "paramsId": "BP10001UMBREG8GI9AFRVAD7S7GJEK6E",
+
+8 "paymentPurpose": "%u041D%u0430%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435 %u043F%u043B%u
+
+9 "payrrn": "000056251465",
+
+10 "qrcId": "BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9"
+
+11 }
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+ }
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 4/28
+
+
+
+• Оплата с использованием Кассовой ссылки СБП невозможна, если:
+а) истек период использования активированной Кассовой ссылки СБП;
+б) кассовая ссылка СБП не была активирована вовсе или была деактивирована и не активирована вновь;
+в) оплата по ней уже происходит, при этом для очередной оплаты она не была активирована вновь.
+
+3. Запрос деактивации Кассовой платёжной ссылки СБП
+
+Запрос DelCashQRc направляется кассой/терминалом ТСП в Банк для досрочной деактивации Кассовой ссылки.
+
+Если Плательщик решил отказаться от покупки и не намерен совершать оплату, когда кассовая ссылка уже была активирована, то о
+процедура оплаты. Деактивация Кассовой ссылки СБП влечет за собой отмену всех дальнейших действий для оплаты по активиров
+
+Если кассовая ссылка была активирована, и по ней происходит оплата, то в ответе на запрос «Деактивация Кассовой ссылки СБП» ве
+
+Метод DelCashQRc
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required
+
+command String (an-1…50) y
+
+TermNo String (an-10) y
+
+qrcId String(an-32) y
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required
+
+ErrorCode String (an-20) y
+
+message String (ans-140) y
+
+TermNo String (an-10) y
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request
+
+{
+
+ "command":"DelCashQRc",
+
+ "TermNo":"90080567",
+
+ "qrcId":"BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9"
+
+}
+
+{
+
+ "ErrorCode": 0,
+
+ "TermNo": 90080567,
+
+ "message": "%u0417%u0430%u043F%u0440%u043E%u0441 %u043E%u0431%u0440%u0430%u0431%u043E%u0442%u043
+
+ }
+
+{
+
+ "ErrorCode":"Код ответа",
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 5/28
+
+
+
+4. Запрос статуса Кассовой платёжной ссылки СБП
+
+• Направляется ТСП в Банк для проверки статуса ранее зарегистрированной кассовой ссылки, например, в целях проверки готовно
+
+• Может быть направлен для проверки статуса после попытки активации, в случае, если на запрос активации не получен ответ от Н
+
+• Успешный ответ содержит статус самой Кассовой ссылки, но не операции ее оплаты.
+
+Метод GetCashQRCstatus
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required
+
+command String (an-1…50) y
+
+TermNo String (an-20) y
+
+qrcId String (an-32) y
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных
+
+ErrorCode String (an-20)
+
+message String (ans-140)
+
+status String
+
+paramsId String (an-32)
+
+merchantId String (12)
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+ "message":"Расшифровка кода ответа"
+
+ }
+
+{
+
+ "command": "GetCashQRCstatus",
+
+ "TermNo": "90080567",
+
+ "qrcId": " BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9"
+
+}
+
+{
+
+ "ErrorCode": 0,
+
+ "merchantId":"MB0000009603",
+
+ "message":"Запрос обработан успешно",
+
+ "qrcId":"BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+ "status": "WAITING_PAYMENT",
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 6/28
+
+
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request
+
+5. Запрос изменения параметров для зарегистрированной Кассовой платёжной ссылки СБП
+
+Запрос позволяет изменить следующие параметры Кассовой ссылки СБП:
+
+• Номер счёта юридического лица — «account»
+
+• Номер терминала — «TermNo»
+
+• Торгово-сервисную точку (ТСТ) — «merchantId»
+
+• Ссылку для автоматического возврата в приложение или на сайт ТСП — «redirectUrl»
+
+Смена счёта юридического лица
+
+Метод ChangeAccForCashQRc
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «ChangeAccForC
+
+TermNo String (an-20) y Уникальный идентификатор терминала,
+
+qrcId String (an-32) y Идентификатор Кассовой ссылки СБП
+
+account String (n-32) y Новый счёт юридического лица
+
+b) Примерный формат запроса для смены номера счёта Кассовой ссылки СБП:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required
+
+ErrorCode String (an-20) y
+
+TermNo String (an-20) y
+
+account String (an-20) y
+
+merchantId String (an-12) y
+
+message String (ans-1024) y
+
+ "paramsId": "BP10001UMBREG8GI9AFRVAD7S7GJEK6E"
+
+}
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+ }
+
+{
+
+ "command":"ChangeAccForCashQRc",
+
+ "TermNo":"90080567",
+
+ "qrcId":"BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+ "account":"00000000000000001111"
+
+}
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 7/28
+
+
+
+Код ключа Тип данных required
+
+qrcId String(an-32) y
+
+status String (an-4) o
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+• 400 Bad Request
+
+Смена номера терминала/мерчанта для Кассовой ссылки СБП
+
+При успешном выполнении запроса Кассовая ссылка СБП будет перенесена на новый терминал/мерчант
+
+Метод ChangeAccForCashQRc
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «ChangeAccForCashQRc»
+
+TermNo String (an-20) y Уникальный идентификатор терминала, на который Кассовая с
+
+qrcId String (an-32) y Идентификатор QR-кода
+
+account String (n-32) y Счёт юридического лица, установленный для нового терминал
+
+NewTermNo String (an-20) y Новый уникальный идентификатор терминала
+
+NewMerchantId String (an-12) y/o Идентификатор новой ТСТ.
+
+Поле обязательно, если терминал, на который переносится
+
+b) Примерный формат запроса для переноса КС на новый терминал, зарегистрированный в рамках одной ТСТ:
+
+{
+
+ "ErrorCode": 0,
+
+ "TermNo": 90080567,
+
+ "account": "00000000000000001111",
+
+ "merchantId": " MA0001111111",
+
+ "message": "OK",
+
+ "qrcId": " BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+ "status": "UPDATED"
+
+}
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+}
+
+{
+
+ "command":"ChangeAccForCashQRc",
+
+ "TermNo":"90080567",
+
+ "account":"00000000000000001111",
+
+ "qrcId":"BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+ "NewTermNo":"90011111"
+
+}
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 8/28
+
+
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required
+
+ErrorCode String (an-20) y
+
+TermNo String (an-20) y
+
+account String (an-20) y
+
+merchantId String (an-12) y
+
+message String (ans-1024) y
+
+qrcId String(an-32) y
+
+status String (an-4) o
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+• 400 Bad Request
+
+e) Примерный формат запроса для переноса КС на новый терминал, зарегистрированный в другой ТСТ или в другом юридическом
+
+f) Описание параметров ответа:
+
+Код ключа Тип данных required
+
+ErrorCode String (an-20) y
+
+TermNo String (an-20) y
+
+account String (an-20) y
+
+merchantId String (an-12) y
+
+{
+
+ "ErrorCode": 0,
+
+ "TermNo": 90011111,
+
+ "account": "00000000000000001111",
+
+ "merchantId": " MA0001111111",
+
+ "message": "OK",
+
+ "qrcId": " BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+ "status": "UPDATED"
+
+}
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+}
+
+{
+
+ "command": "ChangeAccForCashQRc",
+
+ "TermNo": "90080567",
+
+ "account": "00000000000000002222",
+
+ "qrcId": " BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+ "NewTermNo": "90022222",
+
+ "NewMerchantId": "MA0002222222"
+
+}
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 9/28
+
+
+
+Код ключа Тип данных required
+
+message String (ans-1024) y
+
+qrcId String(an-32) y
+
+status String (an-4) o
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+g) Примерный формат ответа:
+
+• 200 OK
+
+• 400 Bad Request
+
+h) Описание параметров ответа:
+
+Код ключа Тип данных required
+
+ErrorCode String (an-20) y
+
+TermNo String (an-20) y
+
+account String (an-20) y
+
+merchantId String (an-12) y
+
+message String (ans-1024) y
+
+qrcId String(an-32) y
+
+status String (an-4) o
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+Перенос кассовой ссылки на нового мерчанта со старым номером терминала
+
+При успешном выполнении запроса Кассовая ссылка СБП будет перенесена на нового мерчанта вместе со старым терминало
+
+Метод ChangeAccForCashQRc
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «ChangeAccForC
+
+TermNo String (an-20) y Уникальный идентификатор терминала,
+
+{
+
+ "ErrorCode": 0,
+
+ "TermNo": 90022222,
+
+ "account": "00000000000000002222",
+
+ "merchantId": " MA0002222222",
+
+ "message": "OK",
+
+ "qrcId": " BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+ "status": "UPDATED"
+
+}
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+}
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 10/28
+
+
+
+Код ключа Тип данных required Назначение
+
+qrcId String (an-32) y Идентификатор QR-кода
+
+account String (n-32) y Счёт юридического лица, используемый
+
+NewMerchantId String (an-12) y Идентификатор новой ТСТ
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required
+
+ErrorCode String (an-20) y
+
+TermNo String (an-20) y
+
+account String (an-20) y
+
+merchantId String (an-12) y
+
+message String (ans-1024) y
+
+qrcId String(an-32) y
+
+status String (an-4) o
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+• 400 Bad Request
+
+Смена ссылки для автоматического возврата в приложение или на сайт ТСП
+
+При успешном выполнении запроса будет изменено значение поля «redirectUrl», указанное при первоначальной регистрации К
+
+{
+
+ "command": "ChangeAccForCashQRc",
+
+ "TermNo": "90080567",
+
+ "account": "00000000000000002222",
+
+ "qrcId": " BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+ "NewMerchantId": "MA0002222222"
+
+}
+
+{
+
+"ErrorCode": 0,
+
+"TermNo": 90080567,
+
+"account": "00000000000000002222",
+
+"merchantId": " MA0002222222",
+
+"message": "OK",
+
+"qrcId": " BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+"status": "UPDATED"
+
+}
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+}
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 11/28
+
+
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «ChangeAccForCashQRc».
+
+TermNo String (an-20) y Уникальный идентификатор терминала, на который кассовая ссылка/NFC-табличка была
+
+qrcId String (an-32) y Идентификатор QR-кода
+
+redirectUrl String (ans-1024) y Новая ссылка для автоматического возврата в приложение или на сайт ТСП.
+
+Допускаются только символы в кодировке ASCII. Формат должен соответствовать пра
+
+Если требуется использовать в redirectUrl кириллические символы, необходимо перек
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required
+
+ErrorCode String (an-20) y
+
+TermNo String (an-20) y
+
+account String (an-20) y
+
+merchantId String (an-12) y
+
+message String (ans-1024) y
+
+qrcId String(an-32) y
+
+status String (an-4) o
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+• 400 Bad Request
+
+{
+
+ "command": "ChangeAccForCashQRc",
+
+ "TermNo": "90080567",
+
+ "qrcId": " BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+ "redirectUrl": " https://alfabank.ru/sme/payservice/sbp/"
+
+}
+
+{
+
+ "ErrorCode": 0,
+
+ "TermNo": 90080567,
+
+ "account": "00000000000000002222",
+
+ "merchantId": " MA0002222222",
+
+ "message": "OK",
+
+ "qrcId": " BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+ "status": "UPDATED"
+
+}
+
+{
+
+ "ErrorCode":"Код ответа",
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 12/28
+
+
+
+6. Запрос на изменение номера терминала (TermNo) для зарегистрированной Кассовой платё
+
+Данный запрос позволяет ТСП произвести смену номера терминала по ранее зарегистрированной Кассовой ссылке СБП на любой д
+может быть использован и для перепривязки кассовой ссылки на новое ЮЛ, ИП.
+
+Метод ChangeTermNoForCashQRc
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required
+
+command String (an-1…50) y
+
+TermNo String (an-20) y
+
+qrcId String (an-32) y
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*
+
+TermNo String (an-20) y Уникальный идентификатор терми
+
+message String (ans-140) y Расшифровка кода ответа**
+
+status String (an-4) y Статус выполнения перерегистрац
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+• 400 Bad Request
+
+ "message":"Расшифровка кода ответа"
+
+}
+
+{
+
+ "command": "ChangeTermNoForCashQRc",
+
+ "TermNo": "90080567",
+
+ "qrcId": "BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9"
+
+}
+
+{
+
+ "ErrorCode": 0,
+
+ "TermNo": 90080567,
+
+ "message": "OK",
+
+ "status": "UPDATED"
+
+}
+
+{
+
+ "ErrorCode": "Код ответа",
+
+ "message": "Расшифровка кода ответа"
+
+}
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 13/28
+
+
+
+7. Запрос статуса оплаты по Кассовой платёжной ссылке СБП
+
+Запрос статуса GetQRCstatus направляется кассой/терминалом ТСП в Банк для получения статуса Операции оплаты выпущенного ра
+
+Запрос статуса направляется не ранее, чем через 10 секунд после формирования QR-кода и не чаще чем каждые 3 секунды.
+
+Успешный ответ на запрос статуса можно получить в течении 30 дней после совершения оплаты по данному QR-коду.
+
+В случае, если срок хранения данных истек, то в ответе на запрос вернется:
+
+Метод GetQRCstatus
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «GetQRCstatus».
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+payrrn String (n-12) y/o Референсный идентификатор запроса в системе Банка.
+
+qrcId String (an-32) y/o Идентификатор QR-кода (обязательно, если не передан «pa
+
+paramsId String (an-32) y/o Идентификатор параметров ссылки СБП (если передан qrcId
+
+messageID String (ans-1024) o Уникальный идентификатор сообщения, GUID. Только латин
+
+Примечание: для кассовой платежной ссылки должен быть передан один из параметров: payrrn или qrcId + paramsId. Передавать в з
+
+b) Примерный формат запроса:
+
+1-й вариант запроса:
+
+2-й вариант запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*.
+
+message String (ans-1024) y Расшифровка кода ответа**.
+
+{
+
+"ErrorCode":999,
+
+"message":"Неизвестный код проблемы 999RQ05014"
+
+}
+
+{
+
+ "command":"GetQRCstatus",
+
+ "TermNo":"90080567",
+
+ "payrrn":"000056251465",
+
+ "messageID":"message"
+
+}
+
+{
+
+ "command":"GetQRCstatus",
+
+ "TermNo":"90080567",
+
+ "qrcId": "AS1R005G9DAOLK5L8S5OPR6HB23HSN0I",
+
+ "paramsId": "BP10001UMBREG8GI9AFRVAD7S7GJEK6E",
+
+ "messageID":"message"
+
+}
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 14/28
+
+
+
+Код ключа Тип данных required Назначение
+
+qrcId String (an-32) y Идентификатор QR-кода.
+
+status String(an-10) y Статус оплаты QR-кода в НСПК*
+
+Возможные значения:
+
+1. ACWP — ACCEPTED операция завершена успешно;
+
+2. RJCT — REJECTED операция отклонена;
+
+3. NTST — NOT_STARTED операции по QR коду не существует;
+
+4. RCVD — RECEIVED операция в обработке.
+
+trxId String (an-32) y Уникальный идентификатор платежа в НСПК.
+
+trxDT String (n-14) y Дата и время платежа по Гринвичу.
+
+Формат — ГГГГММДДччммсс.
+
+payrrn String (n-12) o Референсный идентификатор запроса в системе Банка. Значение возвращается если зап
+
+CreditDatePos String (ans 1-256) o Дата операции, установленная Банком Получателя (ГГГГММДД)
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+amount Number y Сумма платежа в минорных единицах (копейках).
+
+currency String (ans-3) o Код валюты (для рублей должен передаваться «RUB»).
+
+Url String (ans 1-512) o Полный URL для получения уведомления ТСП о финальном статусе оплаты QR-кода. Зн
+
+paramsId String (an-32) o Идентификатор активных значений параметров Платежной ссылки СБП. Передается, есл
+
+payerId String (ans) y Идентификатор плательщика (маскированный номер телефона плательщика).
+
+Kzo String (ans 1-128) o Контрольное Значение Операции СБП. Формируется ОПКЦ СБП.
+
+Присутствует при условии, что Операция СБП C2B по запрашиваемому qrcId завершена
+
+messageID String (ans-1024) o Уникальный идентификатор сообщения, GUID.
+
+Значение параметра возвращается в случае, если оно указано в запросе.
+
+merchantId String (12) o ID мерчанта (ТСТ) в Банке
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+Примечание:
+
+• Успешно оплаченным считается только QR-код, для которого получен «status» = «ACWP» с идентификатором платежа «trxId» и «E
+
+• В случае если получен «status» = «NTST» — означает необходимость повтора запроса до получения одного из финальных статусов
+
+• Получение «status» = «RJCT» означает отказ в оплате данного QR-кода.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "message": "OK",
+
+4 "qrcId": "BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+5 "status": "ACWP",
+
+6 "trxId": "A30180803159571F0000097B3DA2D4A7",
+
+7 "trxDT": "20230118080315",
+
+8 "payrrn": "000056251465",
+
+9 "CreditDatePos": "20230118",
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 15/28
+
+
+
+Примечание:
+
+• Текстовые данные передаются в формате urlencoded.
+
+• В поле " trxDT» содержится дата и время транзакции на ПШ Банка в формате ГГГГММДДччммсс.
+
+В случае получения значения trxId = null необходимо повторить запрос. Отсутствие значения означает, что в СБП еще нет успешного
+
+• 400 Bad Request
+
+8. Нотификация ТСП о финальном статусе оплаты по Кассовой платёжной ссылке СБП
+
+Запрос отправляется из ПШ Банка во внутреннюю систему ТСП на URL адрес, указанный в параметре «queryData.notificationUrl» при н
+
+Метод «qrc/notification»
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «qrc/notification»
+
+qrcId String (an-32) y Идентификатор QR-кода.
+
+trxId String(an-32) y Уникальный идентификатор платежа в Н
+
+paramsId String (an-32) y Идентификатор активных значений пара
+
+status String(an-10) y Статус оплаты QR-кода в НСПК.
+
+Возможные значения:
+
+— ACWP — ACCEPTED операция заверш
+
+— RJCT — REJECTED операция отклоне
+
+amount Number y Сумма платежа в минорных единицах (ко
+
+timestamp YYYY-MMDDThh: mm: ss[.SSS]
+
+или
+
+YYYY-MMDDThh: mm: ss[.SSSZ]
+
+y Метка времени НСПК по Гринвичу (GMT)
+
+payerId String (ans) y Идентификатор плательщика (маскирова
+
+kzo String (ans 1-128) o Контрольное Значение Операции СБП. Ф
+
+Присутствует при условии, что Операция
+
+payrrn String (n-12) y Референсный идентификатор запроса в
+
+TermNo String (an-20) y Уникальный идентификатор терминала
+
+10 "TermNo": 90080567,
+
+11 "amount": 10000,
+
+12 "currency": "RUB",
+
+13 "Url":"https://sbp-payments",
+
+14 "paramsId": "BP10001UMBREG8GI9AFRVAD7S7GJEK6E",
+
+15 "payerId": "*********1234",
+
+16 "kzo": "b02bf0fb819dcc6249f1f6be81da28062236febcb25774a29ebdd770f2a35ba29fa038e459c0845ade1ef2
+
+17 "messageID ":"message"
+
+18 "merchantId": "MB0000009603"
+
+19 }
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+ }
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 16/28
+
+
+
+Код ключа Тип данных required Назначение
+
+CreditDatePos String (ans 1-256) o Дата операции, установленная Банком П
+
+b) Примерный формат запроса:
+
+c) ВС отвечает http-кодом «200» — успешное получение нотификации, или ошибкой.
+
+В настоящий момент ответ ВС не обрабатывается шлюзом Агента ТСП. Обработка ответов ТСП находится в разработке.
+
+В случае добавления со стороны НСПК дополнительных параметров уведомления, система принимающая их от шлюза Альфа-Банка
+
+9. Запрос операций по Кассовой платёжной ссылке СБП
+
+• Запрос позволяет выполнить поиск всех операций оплаты и возвратов, произведенных по определенной кассовой платежной ссы
+
+• В ответе платежный шлюз Банка возвращает результат обработки запроса с разбивкой по массивам payments (оплаты) и refunds (в
+
+Метод «GetCashQrcId»
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required
+
+command String (an-1…50) y
+
+TermNo String (an-20) y
+
+qrcId String (an-32) y
+
+dateFrom date-time y
+
+dateTo date-time y
+
+Примечание: Временной диапазон dateFrom — dateTo не должен быть более семи календарных дней. Время в параметре dateFrom д
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+1 {
+
+2 "command":"qrc/notification",
+
+3 "qrcId":"BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+4 "trxId":"A30180803159571F0000097B3DA2D4A7",
+
+5 "paramsId":"BP10001UMBREG8GI9AFRVAD7S7GJEK6E",
+
+6 "status":"ACWP",
+
+7 "amount":"10000",
+
+8 "timestamp":"2023-02-07T08:35:31.102Z",
+
+9 "payerId":"*********1234",
+
+10 "kzo":"d4d45d9db80b29fec2aacbfaf778edc49ff615c13021a2bf5a05f35d8afbcc76f84ceda7598695956c1d5168b1f
+
+11 "payrrn":"000056251465",
+
+12 "TermNo":"90080567",
+
+13 "CreditDatePos":"20230207"
+
+14 }
+
+{
+
+ "command": "GetCashQrcId",
+
+ "TermNo": "90080567",
+
+ "qrcId": "BS10005FR8SV6EI9931BIQGPSUEG8ELL",
+
+ "dateFrom": "2023-03-12T17:30:09",
+
+ "dateTo": "2023-03-12T23:25:15"
+
+}
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 17/28
+
+
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*.
+
+TermNo String (an-20) y Уникальный
+
+payments array o **Массив пла
+
+operationId string y id платежа в
+
+status string (enum) y Статус оплат
+
+— SUCCESS,
+
+— REJECTED
+
+reason string o Описание со
+
+amount number y Сумма в коп
+
+date date-time y Формат YYY
+
+refunds array o **Массив воз
+
+refundId string y id возврата в
+
+date date-time y Формат YYY
+
+status string (enum) y Статус возвр
+
+— SUCCESS,
+
+REJECTED,
+
+reason string o Описание пр
+
+amount number y Сумма в коп
+
+* Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "TermNo": 90080567,
+
+4 "payments": [
+
+5 {
+
+6 "amount": 10000,
+
+7 "date": "2024-02-07T14:08:13",
+
+8 "operationId": "A4038110812414010000020011180902",
+
+9 "reason": "Запрос обработан успешно",
+
+10 "status": "SUCCESS"
+
+11 }
+
+12 ],
+
+13 "refunds": [
+
+14 {
+
+15 "amount": 10000,
+
+16 "date": "2024-02-07T14:19:36",
+
+17 "reason": "Платёж проведён",
+
+18 "refundId": "A4038111858413010000020011180902",
+
+19 "status": "SUCCESS"
+
+20 }
+
+21 ]
+
+22 }
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 18/28
+
+
+
+e) При проверке обязательности заполнения параметров запроса, в случае, если какой-либо параметр не заполнен в ответе вернуть
+
+ErrorCode message
+
+"3" Не передан обязательный параметр dateFrom/dateTo
+
+"16" Не передан параметр TermNo
+
+"41" Не передан параметр qrcId
+
+"301" Превышен временной диапазон dateFrom-dateTo
+
+10. Запрос проведения возврата по успешной оплате по Кассовой платёжной ссылке СБП
+
+Возврат по СБП состоит из 2х последовательных запросов:
+
+• GetQRCreversalData — проверка возможности проведения возврата;
+
+• QRCreversal — выполнение непосредственно самого возврата.
+
+В случае если ТСП инициирует выполнение повторных операций СБП B2C по одной и той же операции СБП C2B, то допускается не б
+
+Возврат в один этап. При направлении запроса «QRCReversal», с заполненным полем messageID будет произведен возврат в один
+
+10.1. Запрос возможности проведения возврата
+
+Запрос GetQRCreversalData направляется ТСП в Банк для проверки возможности возврата по ранее оплаченному QR-коду и получен
+
+Метод GetQRCreversalData
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «GetQRCreversalData».
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+payrrn String (n-12) y/o Референсный идентификатор запроса в системе Банка (обязательно, если не
+
+trxId String (an-32) y/o Уникальный идентификатор платежа в НСПК (обязательно, если не передан «p
+
+trxDT String (n-14) o Дата и время отменяемого платежа.
+
+amount Number o Сумма возврата в минорных единицах (копейках). Если сумма возврата не пер
+
+currency String (ans-3) o Код валюты (для рублей должен передаваться «RUB»). В случае пустого значе
+
+messageID String (ans-1024) o Уникальный идентификатор сообщения, GUID. Только латинские символы!
+
+ReturnRestAmount Boolean o Проверка доступного остатка для совершения возврата.
+
+Доступные значения:
+
+— true
+
+— false
+
+Примечание:
+
+• Для поиска оригинальной транзакции обязательным является один из параметров: «payrrn» или «trxId»;
+
+• Терминалы с подключенным сканером и распознаванием QR-кодов могут получить «qrcId», распарсив строку QR-кода с чека опла
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+}
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 19/28
+
+
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*.
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+message String (ans-140) y Расшифровка кода ответа**.
+
+messageID String (an-1…50) y/o Уникальный идентификатор сообщения, GUID. Только латинские символы!
+
+payerBnkBIC String (n-9) y БИК банка получателя
+
+payerBnkName String (an-50) y Наименование банка получателя
+
+payerId String (n-13) y Идентификатор получателя (маскированный номер телефона получателя).
+
+payerPam String (ans 1…140) y PAM получателя
+
+payrrn String (n-12) y Референсный идентификатор запроса в системе Банка
+
+qrcId String(an-32) y Идентификатор QR-кода.
+
+trxDT String (n-14) y Дата и время платежа в AnyWay (ГГГГММДДччммсс)
+
+trxId String (an-32) y Уникальный идентификатор платежа в НСПК
+
+restAmount Number (с двумя знаками после точки) o Сумма доступного остатка к возврату.
+
+Если в запросе передано значение "ReturnRestAmount" : true, то в ответе д
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+1 {
+
+2 "command":"GetQRCreversalData",
+
+3 "TermNo":"90080567",
+
+4 "payrrn":"000056251465",
+
+5 "trxId": "A30180803159571F0000097B3DA2D4A7",
+
+6 "trxDT":"20230416082214",
+
+7 "amount":"10000",
+
+8 "currency":"RUB",
+
+9 "messageID":"f9aa54ff-a615-44b8-aa6c-acab655c89f8",
+
+10 "ReturnRestAmount": true
+
+11 }
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "TermNo": 90080567,
+
+4 "message": "OK",
+
+5 "messageID":"message",
+
+6 "payerBnkBIC": "044525225",
+
+7 "payerBnkName": "Альфа-Банк",
+
+8 "payerId": "*1234",
+
+9 "payerPam": "ИИИ",
+
+10 "payrrn": "000056251465",
+
+11 "qrcId": "BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+12 "trxDT": 20230118124954,
+
+13 "trxId": "A3018124954175080000087B3DA2D4A7",
+
+14 "restAmount":"99.87"
+
+15 }
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 20/28
+
+
+
+Примечание:
+
+• Текстовые данные передаются в формате urlencoded;
+
+• В случае получения "message»: «Получен отказ на запрос возврата. Статус Recall, ErrDebetMerchant: KSM0284 Invalid special cond
+
+• 400 Bad Request
+
+10.2. Запрос возврата оплаты
+
+Запрос QRCreversal направляется ТСП в Банк для возврата по ранее произведенной оплате QR. Возврат производится только на сче
+
+Метод QRCreversal.
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «QRCreversal».
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+payrrn String (n-12) y/o Референсный идентификатор запроса в системе Банка (обязательно, есл
+
+trxId String (an-32) y/o Уникальный идентификатор платежа в НСПК (обязательно, если не перед
+
+trxDT String (n-14) o Дата и время отменяемого платежа.
+
+amount Number o Сумма возврата в минорных единицах (копейках). Если сумма возврата н
+
+currency String (ans-3) o Код валюты (для рублей должен передаваться «RUB»). В случае пустого
+
+messageID String (an-1…50) y/o Уникальный идентификатор сообщения, GUID из сообщения «GetQRCrev
+
+queryData.notificationUrl String (ans-512) o Полный URL для получения уведомления о финальном статусе возврата
+
+ReturnRestAmount Boolean o Проверка доступного остатка для совершения возврата.
+
+Доступные значения:
+
+— true
+
+— false
+
+Блок для внесения д
+
+Код ключа Тип данных required
+
+extJsonParams Object o
+
+JsonParam1 String (ans-250) o
+
+JsonParam2 String (ans-250) o
+
+... ... ...
+
+JsonParam10 String (ans-250) o
+
+* messageID — необходимо передавать точное значение, которые было указано в ответе на запрос GetQRCreversalData. Если значени
+на возврат.
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+ }
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 21/28
+
+
+
+** Блок для передачи дополнительных идентификаторов ТСП в ежедневные реестры СБП. Функционал потребует дополнительной
+
+Примечание: Для поиска оригинальной транзакции обязательным является один из параметров: «payrrn» или «trxId».
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*.
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+amount Number y Сумма платежа в минорных единицах (копейках).
+
+currency String (ans-3) y Код валюты (для рублей должен передаваться «RUB»).
+
+message String (ans-1024) y Расшифровка кода ответа**.
+
+messageID String (ans-1024) o Уникальный идентификатор сообщения, GUID. Только латинские символы!
+
+trxDT String(n-14) y Дата и время операции возврата (ГГГГММДДччммсс).
+
+trxId String(an-32) y Уникальный идентификатор операции возврата в НСПК.
+
+payrrn String (n-12) y Референсный идентификатор запроса в системе Банка.
+
+restAmount Number (с двумя знаками после точки) o Сумма доступного остатка к возврату.
+
+Если в запросе передано значение "ReturnRestAmount" : true, то в ответе дол
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+1 {
+
+2 "command":"QRCreversal",
+
+3 "TermNo":"90080567",
+
+4 "payrrn":"000056251465",
+
+5 "trxId":"A30180803159571F0000097B3DA2D4A7",
+
+6 "trxDT":"20230416082214",
+
+7 "amount":"10000",
+
+8 "currency":"RUB",
+
+9 "messageID":"f9aa54ff-a615-44b8-aa6c-acab655c89f8",
+
+10 "extJsonParams":
+
+11 {
+
+12 "JsonParam1":"Value",
+
+13 "JsonParam2":"Value",
+
+14 "JsonParam3":"Value",
+
+15 "JsonParam4":"Value",
+
+16 "JsonParam5":"Value",
+
+17 "JsonParam6":"Value",
+
+18 "JsonParam7":"Value",
+
+19 "JsonParam8":"Value",
+
+20 "JsonParam9":"Value",
+
+21 "JsonParam10":"Value"
+
+22 },
+
+23 "queryData":
+
+24 {
+
+25 "notificationUrl":"http://sbp-refunds/"
+
+26 },
+
+27 "ReturnRestAmount": true
+
+28 }
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "TermNo": 90080567,
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 22/28
+
+
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request
+
+11. Запрос статуса возврата СБП (B2C)
+
+Метод «GetQRCreversalStatus» необходим ТСП для уточнения статуса операции B2C (метод QRCreversal).
+
+В запросе «GetQRCreversalStatus» обязательно должна быть передана пара параметров:
+
+1. «payrrn» или «originalTrxId» Один из параметров «payrrn» или «originalTrxId» используется для нахождения исходного платежа C2
+
+2. «trxId» или «messageID». Один из параметров «trxId» или «messageID» используется для нахождения операции возврата B2C, по
+
+Метод «GetQRCreversalStatus»
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required
+
+command String (an-1…50) y
+
+TermNo String (an-20) y
+
+payrrn String (n-12) y/o
+
+(обязательно, если не передан параметр «originalTrxId»)
+
+originalTrxId String (an-32) y/o
+
+(обязательно, если не передан параметр «payrrn»)
+
+trxId String (an-32) y/o
+
+(обязательно, если не передан messageID,)
+
+messageID String (ans-1…1024) y/o
+(обязательно, если не передан trxId)
+
+b) Примерный формат запроса:
+
+4 "amount": 10000,
+
+5 "currency": "RUB",
+
+6 "message": "%u0421%u0442%u0430%u0442%u0443%u0441%20%u0432%u044B%u044F%u0441%u043D%u0435%u043D%
+
+7 "messageID":"message"
+
+8 "payrrn": "000056251465",
+
+9 "trxDT": 20230614061308,
+
+10 "trxId": "B3018130524291090000167B3DA2D4A7",
+
+11 "restAmount": "99.87"
+
+12 }
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+ }
+
+{
+
+ "command":"GetQRCreversalStatus",
+
+ "TermNo":"90080567",
+
+ "payrrn":"000056251465",
+
+ "originalTrxId":"A30180803159571F0000097B3DA2D4A7",
+
+ "trxId":"B3018130524291090000167B3DA2D4A7",
+
+ "messageID":"message"
+
+}
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 23/28
+
+
+
+c) Примерный формат ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ошибки*.
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+Url String (ans 1-512) o Полный URL получения уведомления для ТСП — значение параметра,
+
+amount Number y Сумма Операции СБП в копейках. Целое, положительное число. Валют
+
+message String (ans-1024) y Описание результата выполнения запроса**.
+
+messageID String (ans-1024) o Значение параметра «messageID» из запроса «QRCreversal».
+
+originalQrcId String (an-32) y Идентификатор зарегистрированной Платежной ссылки СБП, по которо
+
+originalTrxId String (an-32) y Идентификатор исходной Операции СБП C2B.
+
+payerId String (an-13) y Маскированный номер телефона Клиента-Получателя (Плательщика в
+
+status String (an-4) y Статус операции возврата СБП (B2C):
+
+ACWP — ACCEPTED операция завершена успешно;
+
+RJCT — REJECTED операция отклонена;
+
+NTST — Статус операции неизвестен.
+
+trxDT String (n-14) y Дата и время выполнения Операции СБП B2C по сценарию «Возврат п
+
+trxId String (an-32) y Уникальный идентификатор операции возврата в НСПК.
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 ОК
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "TermNo": 90080567,
+
+4 "amount": 10000,
+
+5 "message": "OK",
+
+6 "messageID": "message"
+
+7 "originalQrcId": "BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+8 "originalTrxId": "A30180803159571F0000097B3DA2D4A7",
+
+9 "payerId": "*********1234",
+
+10 "status": "ACWP",
+
+11 "trxDT": 20230614061308,
+
+12 "trxId": "B3018130524291090000167B3DA2D4A7"
+
+13 }
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+}
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 24/28
+
+
+
+12. Запрос истории возвратов по определённой транзакции СБП C2B
+
+Запрос позволяет ТСП проверить все совершённые возвраты по определённой транзакции СБП C2B.
+
+В ответе на запрос возвращаются как успешные, так и неуспешные попытки возвратов.
+
+Метод GetQRCreversalHistory
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required
+
+command String (an-1…50) y
+
+TermNo String (an-20) y
+
+payrrn String (n-12) y
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*
+
+message String (ans-1024) y Расшифровка кода ответа**
+
+Refunds Array y Массив объектов, содержащих информацию о возвратах по плат
+
+При отсутствии возвратов, будет возвращён ответ с сообщением
+
+refunds.TermNo String (an-20) y Уникальный идентификатор терминала
+
+refunds.amount Number y Сумма Операции СБП B2C (возврат) в копейках. Целое, положител
+
+refunds.originalQrcId String (an-32) y Идентификатор зарегистрированной Платёжной ссылки СБП (QR-к
+
+refunds.originalTrxId String (an-32) y Идентификатор исходной Операции СБП C2B в НСПК
+
+refunds.payerId String (an-15) y Маскированный номер телефона Клиента-Получателя (Плательщи
+
+refunds.status String (an-4) y Статус операции возврата СБП (B2C):
+
+1. ACWP — ACCEPTED возврат успешно выполнен
+
+2. RJCT — REJECTED возврат отклонён
+
+3. NTST — NOT_STARTED возврат не инициирован (получен успе
+
+refunds.trxId String (an-32) y Идентификатор Операции возврата СБП B2C по сценарию «Возвра
+
+refunds.trxDT String (n-4) y Дата и время выполнения Операции возврата СБП B2C по сцена
+
+Формат: ГГГГММДДччммсс, UTC +0
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа «ACWP» и «RJCT»:
+
+{
+
+ "command":"GetQRCreversalHistory",
+
+ "TermNo":"90080567",
+
+ "payrrn":"000000002212"
+
+}
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 25/28
+
+
+
+• 200 ОК
+
+• 400 Bad Request
+
+e) Примерный формат ответа «NTST»:
+
+• 200 ОК
+
+• 400 Bad Request
+
+f) Примерный формат ответа при отсутствии возвратов по транзакции СБП C2B:
+
+• 200 OK
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "message": "OK",
+
+4 "refunds": [
+
+5 {
+
+6 "TermNo": 90080567,
+
+7 "amount": 10000,
+
+8 "originalQrcId": "AS1F004F30VC6B4A9GRBENS0HI6LGRJM",
+
+9 "originalTrxId": "B51390819586020Z0000120011510503",
+
+10 "payerId": "*********1234",
+
+11 "status": "ACWP",
+
+12 "trxDT": 20250519082345,
+
+13 "trxId": "B51390823097450W0000180011510503"
+
+14 },
+
+15 {
+
+16 "TermNo": 90080567,
+
+17 "amount": 10000,
+
+18 "originalQrcId": "AS1F004F30VC6B4A9GRBENS0HI6LGRJM",
+
+19 "originalTrxId": "B51390819586020Z0000120011510503",
+
+20 "payerId": "*********1234",
+
+21 "status": "RJCT",
+
+22 "trxDT": 20250519083836,
+
+23 "trxId": "A4327120041167130000020011381101"
+
+24 }
+
+25 ]
+
+26 }
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+ }
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "message": "OK",
+
+4 "refunds": [
+
+5 {
+
+6 "TermNo": 90080567,
+
+7 "amount": 10000,
+
+8 "originalQrcId": "AS1F004F30VC6B4A9GRBENS0HI6LGRJM",
+
+9 "originalTrxId": "B51390819586020Z0000120011510503",
+
+10 "payerId": "*********1234",
+
+11 "status": "NTST",
+
+12 "trxId": "B51390835362750D0000100011510503"
+
+13 }
+
+14 ]
+
+15 }
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+ }
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 26/28
+
+
+
+Декодирование значения поля «message» - «По данной оплате возвраты не найдены».
+
+• 400 Bad Request
+
+13. Нотификация о финальном статусе возврата по Кассовой платёжной ссылке СБП
+
+Запрос отправляется из ПШ Банка во внутреннюю систему ТСП на URL адрес, указанный в параметре «queryData.notificationUrl» при н
+
+Метод «b2c-refund/notification»
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «b2c-refund/notification»
+
+messageID String (ans-1024) o Уникальный идентификатор сообщения, GUID
+
+TermNo String (an-20) y Уникальный идентификатор терминала
+
+originalQrcId String (an-32) y Идентификатор зарегистрированной Платежно
+
+originalTrxId String (an-32) y Идентификатор исходной Операции СБП C2B
+
+trxId String (an-32) y Идентификатор Операции СБП B2C по сценар
+
+trxDT String (n-14) y Дата и время выполнения Операции СБП B2C
+
+status String (an-4) y Финальный статус Операции СБП B2C:
+
+"ACWP" — ACCEPTED операция завершена ус
+
+"RJCT" — REJECTED операция отклонена;
+
+amount Number y Сумма операции в копейках
+
+ErrorCode String (an-20) y Код ответа*
+
+message String (ans-1024) y Расшифровка кода ответа**
+
+payerId String (an-15) y Маскированный номер телефона Клиента-Полу
+
+agentRefundRequestId String (an-32) y Уникальный идентификатор запроса, назначае
+
+opkcRefundRequestId String (an-32) y Уникальный идентификатор запроса на возвра
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+b) Примерный формат запроса (по успешному возврату):
+
+{
+
+ "ErrorCode": 0,
+
+ "message": "%u041F%u043E%20%u0434%u0430%u043D%u043D%u043E%u0439%20%u043E%u043F%u043B%u0430%u0442
+
+ }
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+ }
+
+1 {
+
+2 "command":"b2c-refund/notification",
+
+3 "messageID":" message",
+
+4 "TermNo":"90080567",
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 27/28
+
+
+
+В ответ ожидается:
+
+• http-код «200» — Успешный ответ (Уведомление получено);
+
+• http-код «500» — Внутренняя ошибка.
+
+c) Примерный формат запроса (по отклоненному возврату):
+
+В ответ ожидается:
+
+• http-код «200» — Успешный ответ (Уведомление получено);
+
+• http-код «500» — Внутренняя ошибка.
+
+d) ВС ТСП отвечает http-кодом «200» — успешное получение нотификации, или ошибкой.
+
+В настоящий момент ответ ВС не обрабатывается шлюзом Агента ТСП. Обработка ответов ТСП находится в разработке.
+
+В случае добавления со стороны НСПК дополнительных параметров уведомления, система, принимающая их от шлюза Альфа-Банка,
+
+5 "originalQrcId":"BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+6 "originalTrxId":"A3018124954175080000087B3DA2D4A7",
+
+7 "trxId":"B3018130524291090000167B3DA2D4A7",
+
+8 "trxDT":"20230614061308",
+
+9 "status":"ACWP",
+
+10 "amount":"10000",
+
+11 "ErrorCode":"0",
+
+12 "message":"OK",
+
+13 "payerId":"*********1234",
+
+14 "agentRefundRequestId":"00000000000000000182_abcd1994383",
+
+15 "opkcRefundRequestId":"BR10000OKEISOIPM8ST8TBLQHIN9R185"
+
+16 }
+
+1 {
+
+2 "command":"b2c-refund/notification",
+
+3 "TermNo":"90080567",
+
+4 "originalQrcId":" BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
+
+5 "originalTrxId":" A3018124954175080000087B3DA2D4A7",
+
+6 "trxId":"A3024113609260070000086B8426B817",
+
+7 "trxDT":"20230614061308",
+
+8 "status":"RJCT",
+
+9 "amount":"10000",
+
+10 "ErrorCode":"0",
+
+11 "message":"OK",
+
+12 "payerId":"*********1234"
+
+13 }
+
+12/23/25, 11:24 AM Кассовая платёжная ссылка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1 28/28
+
+
diff --git a/_docs/alfabank/qr_payout/6_link_account_subscription_SBP.md b/_docs/alfabank/qr_payout/6_link_account_subscription_SBP.md
new file mode 100644
index 0000000..110c0ca
--- /dev/null
+++ b/_docs/alfabank/qr_payout/6_link_account_subscription_SBP.md
@@ -0,0 +1,1124 @@
+Привязка счёта/подписка СБП
+
+Привязка счёта/подписка СБП
+
+1. Привязка счёта без оплаты (регистрация QR-кода для привязки счёта/подписки по СБП)
+
+• Запрос «Регистрация QR-кода для привязки счёта/подписки по СБП» позволяет Плательщику выполнить привязку своего банковс
+проведения оплаты СБП C2B.
+
+• Последующие платежи с привязанного счета в адрес данного ТСП в рамках операций СБП C2B будут выполняться без участия Пла
+
+• Сценарий может применяться как для разовых, так и для регулярных платежей.
+
+1.1. Метод RegQRcSub
+
+a) Описание параметров запроса:
+
+Код ключа Тип
+данных required Назначение
+
+command String (an-
+
+1…50)
+
+y Тип запроса. Константа «RegQRcSub».
+
+TermNo String (an-
+20)
+
+y Уникальный идентификатор терминала.
+
+qrcType String (an-
+
+32)
+
+y Тип запрашиваемого QR-кода. Константа — «03».
+
+subscriptionPurpose String (ans-
+
+140)
+
+y Цель привязки счета. Информация от ТСП с деталями привязки счета. Данная информация будет отобража
+
+оформлении привязки счета в ДБО Банка Плательщика. Рекомендуется указывать подробную информацию
+применимо, регулярность платежей, сумму регулярных платежей и прочее*.
+
+queryData.notificationUrl String (ans-
+
+512)
+
+y Полный URL для получения уведомления о результате привязки счета.
+
+qrTtl String (an-
+
+1…6)
+
+o Срок жизни Функциональной ссылки СБП в минутах.
+
+Минимальное допустимое значение — «1». Максимальное допустимое значение — «129 600» (90 дней).
+
+Рекомендация: устанавливать срок жизни Функциональной ссылки СБП не менее «5» минут. Если поле
+
+будет использовано значение по умолчанию — «4 320» минут (3 суток).
+
+redirectUrl String (ans-
+
+1024)
+
+о Содержит ссылку для автоматического возврата в приложение или на интернет страницу. Допускаются тол
+
+Формат должен соответствовать правилам кодировки URL.
+Если все же требуется использовать в redirectUrl кириллические символы, необходимо перекодировать их в
+
+используя percent-encoded octets согласно RFC3986.
+
+Если требуется сформировать QR-код для привязки дополнительного счёта Плательщика в том же Б
+
+Код ключа Тип
+данных required Назначение
+
+subscriptionServiceId String (32) о Идентификатор привязки. Обязательно при наличии subscriptionServiceName, т. к. параметры subscriptionSe
+
+могут быть переданы только вместе. При получении параметров subscriptionServiceId и subscriptionServiceN
+
+использовать их в ходе проверки данных привязки счёта на уникальность.
+
+subscriptionServiceName String (70) о Наименование привязки. Обязательно при наличии subscriptionServiceId, т. к. параметры subscriptionService
+
+быть переданы только вместе. При получении параметров subscriptionServiceId и subscriptionServiceName Б
+
+использовать их в ходе проверки данных привязки счёта на уникальность.
+
+b) Примерный формат запроса:
+
+12/23/25, 11:24 AM Привязка счёта / подписка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/subscription/?rp-menuOpen=1 1/13
+
+https://alfabank.ru/sme/payservice/sbp/docs/subscription/?rp-menuOpen=1
+
+
+Примечание: При отсутствии данных в поле subscriptionPurpose ответ вернется с ошибкой:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*.
+
+message String (ans-1024) y Расшифровка кода ответа**.
+
+qrcId String (an-32) y Идентификатор QR-кода.
+
+payload String (1…999) y Платежная ссылка***.
+
+payrrn String (an-12) y Референсный идентификатор запроса в системе Банка
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+*** Формат payload может быть двух видов:
+
+• https://sub.nspk.ru/AB1S000V3LEOSC2C8HU8H1B06C6P1P5L
+
+• https://sub.nspk.ru/AB1S000V3LEOSC2C8HU8H1B06C6P1P5L?type=03&bank=100000000008&crc=61C4
+
+d) Примерный формат ответа
+
+• 200 OK
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request
+
+1 {
+
+2 "command":"RegQRcSub",
+
+3 "TermNo":"90080567",
+
+4 "qrTtl":"10",
+
+5 "qrcType":"03",
+
+6 "subscriptionPurpose":"Подписка на оплату услуг Интернет 500р./мес.",
+
+7 "queryData":
+
+8 {
+
+9 "notificationUrl":"https://sbp-subscription"
+
+10 },
+
+11 "redirectUrl":"https://exampletsp.io/qwertyui"
+
+12 }
+
+{
+
+ "ErrorCode": 30,
+
+ "message": "Отсутствуют данные в полях: subscriptionPurpose"
+
+}
+
+{
+
+ "ErrorCode":"RQ00000",
+
+ "message":"Запрос обработан успешно",
+
+ "qrcId":"AB1S000V3LEOSC2C8HU8H1B06C6P1P5L ",
+
+ "payload":"https://sub.nspk.ru/AB1S000V3LEOSC2C8HU8H1B06C6P1P5L",
+
+ "payrrn":" 000096116491 "
+
+}
+
+{
+
+ "ErrorCode":"Код ответа",
+
+12/23/25, 11:24 AM Привязка счёта / подписка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/subscription/?rp-menuOpen=1 2/13
+
+https://sub.nspk.ru/AB1S000V3LEOSC2C8HU8H1B06C6P1P5L
+https://sub.nspk.ru/AB1S000V3LEOSC2C8HU8H1B06C6P1P5L?type=03&bank=100000000008&crc=61C4
+
+
+Результатом выполнения запроса «Регистрация QR-кода для привязки счета/подписки по СБП» является передача Банком Плательщ
+
+1. «subscriptionToken» — Уникальный Идентификатор привязки счета, назначаемый Банком Плательщика;
+
+2. «memberId» – Идентификатор банка Плательщика.
+
+Важно:
+
+• Значения параметров «subscriptionToken» и «memberId» необходимо хранить в системе ТСП для дальнейшего использования ТСП в
+с привязанного счета по инициативе ТСП». В случае отсутствия или утери значения параметра «subscriptionToken», привязку счет
+повторно.
+
+• Для получения значений параметров «subscriptionToken» и «memberId» ТСП необходимо реализовать возможность получения callb
+
+1.2. Нотификация по сценарию «Регистрация QR-кода для привязки счета/подписки по СБП
+
+Запрос отправляется из ПШ Банка во внутреннюю систему ТСП на URL адрес, указанный в параметре «queryData.notificationUrl» при н
+«RegQRcSub».
+
+Метод «subscription/notification»
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «subscription/notification».
+
+сode String (an-7) y Возможные варианты кодов ответа:
+
+— «RQ00000» — Запрос обработан успешно;
+
+— «RQ05030» — Плательщик отказался от оформления подписки.
+
+message String (ans-255) y Расшифровка кода ответа*.
+
+status String (an-10) y Возможные статусы оформления подписки:
+
+— «ACWP» — подписка оформлена;
+
+— «RJCT» — подписка не оформлена.
+
+qrcId String (an-32) y Идентификатор QR-кода
+
+subscriptionToken String (an-32) o Идентификатор Подписки, назначаемый Банком Плательщика.
+
+Отсутствует, если Плательщик не дал согласие на оформление подписки.
+
+memberId String (an-12) o Идентификатор Банка Плательщика.
+Отсутствует, если Плательщик не дал согласие на оформление подписки.
+
+* Таблица возможных кодов ответа приведена в приложении 2.
+
+b) Примерный формат запроса при согласии Плательщика совершить привязку счёта:
+
+c) Примерный формат запроса при отказе Плательщика совершить привязку счёта:
+
+ "message":"Расшифровка кода ответа"
+
+}
+
+{
+
+ "command":"subscription/notification ",
+
+ "сode":"RQ00000",
+
+ "message":"Привязка счета оформлена",
+
+ "status":"ACWP",
+
+ "qrcId":"BB1S0053V5S91S2E83RPL8THQSRS7O8K",
+
+ "subscriptionToken":"6feeacc6a74648589285346e3785ad9e",
+
+ "memberId":"100000000008"
+
+}
+
+12/23/25, 11:24 AM Привязка счёта / подписка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/subscription/?rp-menuOpen=1 3/13
+
+
+
+d) ВС ТСП отвечает http-кодом «200» — успешное получение нотификации, или ошибкой.
+
+В настоящий момент ответ ВС не обрабатывается шлюзом Альфа-Банка. Обработка ответов ТСП находится в разработке.
+
+В случае добавления со стороны НСПК дополнительных параметров уведомления, система принимающая их от шлюза Альфа-Банка
+такие неожиданные параметры как ошибочный запрос.
+
+2. Оплата по QR-коду с последующей привязкой счёта/подпиской по СБП
+
+• Запрос «Оплата по QR-коду с последующей привязкой/подпиской по СБП» позволяет Плательщику выполнить разовую оплату в р
+с последующей привязкой своего банковского счета к ТСП.
+
+• Последующие платежи с привязанного счета в адрес данного ТСП будут выполняться без участия Плательщика.
+
+• Регистрация Функциональной ссылки СБП для выполнения оплаты с последующей привязкой счета представляет собой регистра
+ссылки с "qrcType"="02" с дополнительным параметром "subscriptionPurpose" (информация от ТСП с деталями привязки счета).
+
+2.1 Метод GetQRCd
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…
+50)
+
+y Тип запроса. Константа «GetQRCd».
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+amount Number y Сумма платежа в минорных единицах (копейках).
+
+currency String (ans-3) y Код валюты (для рублей должен передаваться «RUB»).
+
+width String o Ширина картинки QR-кода (только числовое значение).
+
+height String o Высота картинки QR-кода (только числовое значение).
+
+qrcType String (n-2) y Тип запрашиваемого QR-кода. Константа — «02».
+
+paymentPurpose String (ans-
+
+140)
+
+o Назначение платежа.
+
+messageID String (an-1…
+1024)
+
+o Уникальный идентификатор сообщения, GUID. Только латинские символы!
+
+qrTtl String (an-1…
+
+6)
+
+o Срок жизни Функциональной ссылки СБП в минутах. Минимальное допустимое значение — «1».
+
+значение — «129 600» (90 дней).
+
+Рекомендация: устанавливать срок жизни Функциональной ссылки СБП не менее «5» минут. Ес
+
+в запросе, будет использовано значение по умолчанию — «4 320» минут (3 суток).
+
+queryData.notificationUrl String (ans-
+
+512)
+
+y Полный URL для получения уведомления о финальном статусе оплаты QR-кода, а также о результа
+
+queryData.notificationUrl_sub String (ans-
+512)
+
+o Полный URL для получения уведомления о результате привязки счета.
+
+В случае указания значения в данном поле, на указанный URL адрес будет направлено одно отд
+
+привязки счета Плательщика.
+
+{
+
+ "command":"subscription/notification",
+
+ "сode":"RQ05030",
+
+ "message":"Плательщик отказался от привязки счета",
+
+ "status":"RJCT",
+
+ "qrcId":"BB1S0053V5S91S2E83RPL8THQSRS7O8K",
+
+ "subscriptionToken":"00000000000000000000000000000000",
+
+ "memberId ":"100000000008"
+
+}
+
+12/23/25, 11:24 AM Привязка счёта / подписка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/subscription/?rp-menuOpen=1 4/13
+
+
+
+Код ключа Тип данных required Назначение
+
+subscriptionPurpose String (ans-
+
+140)
+
+y Цель привязки счета. Информация от ТСП с деталями привязки счета. Данная информация буде
+
+Плательщика при оформлении привязки счета в ДБО Банка Плательщика.
+
+Рекомендуется указывать подробную информацию о привязке счета, включая, если применимо
+
+регулярных платежей и прочее*.
+
+redirectUrl String (ans-
+
+1024)
+
+o Содержит ссылку для автоматического возврата в приложение или на сайт ТСП. Допускаются тольк
+
+должен соответствовать правилам кодировки URL.
+
+Если все же требуется использовать в redirectUrl кириллические символы, необходимо перекодиров
+код, используя percent-encoded octets согласно RFC3986.
+
+Если требуется сформировать QR-код для привязки дополнительного счёта Плательщика в том же Б
+
+Код ключа Тип
+данных required Назначение
+
+subscriptionServiceId String (32) o Идентификатор привязки. Обязательно при наличии subscriptionServiceName, т. к. параметры subscriptionSe
+
+могут быть переданы только вместе. При получении параметров subscriptionServiceId и subscriptionServiceN
+
+использовать их в ходе проверки данных привязки счёта на уникальность.
+
+subscriptionServiceName String (70) o Наименование привязки. Обязательно при наличии subscriptionServiceId, т. к. параметры subscriptionService
+быть переданы только вместе. При получении параметров subscriptionServiceId и subscriptionServiceName Б
+
+использовать их в ходе проверки данных привязки счёта на уникальность.
+
+Если требуется сформировать динамический QR-код под определенного Плательщика, то необходимо использоват
+
+Код ключа Тип данных required Назначение
+
+queryData.SenderFIO String (an-140) o Фамилия, Имя и Отчество Плательщика (не является регистрозависимым)
+
+queryData.SenderID String (an-11.13) o Идентификатор Плательщика (номер телефона Плательщика — 0079123456
+
+queryData.SenderBankBIC String (n-9) o БИК Банка Плательщика
+
+Важно! При отсутствии данных в параметре subscriptionPurpose будет зарегистрирована обычная одноразовая Платежная ссылка СБ
+возможности совершить привязку счета.
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+1 {
+
+2 "command":"GetQRCd",
+
+3 "TermNo":"90080567",
+
+4 "amount":"10000",
+
+5 "currency":"RUB",
+
+6 "qrcType":"02",
+
+7 "paymentPurpose":"Назначение платежа",
+
+8 "subscriptionPurpose":"Подписка на оплату услуг Интернет 500р./мес.",
+
+9 "width":"600",
+
+10 "height":"600",
+
+11 "qrTtl":"10",
+
+12 "messageID":"message",
+
+13 "queryData":
+
+14 {
+
+15 "notificationUrl":"https://sbp-payments",
+
+16 "notificationUrl_sub":"https://sbp-subscription"
+
+17 },
+
+18 "redirectUrl": "https://exampletsp.io/qwertyui"
+
+19 }
+
+12/23/25, 11:24 AM Привязка счёта / подписка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/subscription/?rp-menuOpen=1 5/13
+
+
+
+Код
+ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*.
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+image String(an)
+
+Длинна зависит от формата, порядок
+
+7000 символов.
+
+y Изображение QR-кода содержит энкодированный BASE64 файл изображени
+.png
+
+message String (ans-1024) y Расшифровка кода ответа**.
+
+payload String (1…999) y Платежная ссылка***.
+
+messageID String (ans-1024) o Уникальный идентификатор сообщения, GUID
+
+payrrn String (n-12) y Референсный идентификатор запроса в системе Банка
+
+qrcId String (an-32) y Идентификатор QR-кода
+
+status String (n-7) y Статус регистрации Платежной ссылки СБП
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+*** Формат payload может быть двух видов:
+
+• https://qr.nspk.ru/BD1P004FM8U22B8B8N1RHCRJSAB6C4TS
+
+• https://qr.nspk.ru/BD1P004FM8U22B8B8N1RHCRJSAB6C4TS?type=02&bank=100000000008&sum=100&cur=RUB&crc=A1A3
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request
+
+Результатом выполнения запроса «Оплата по QR-коду с последующей привязкой/подпиской по СБП» является передача Банком Пла
+следующих параметров:
+
+1. «subscriptionToken» — Уникальный Идентификатор привязки счета, назначаемый Банком Плательщика;
+
+2. «memberId» – Идентификатор банка Плательщика.
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "TermNo": 90080567,
+
+4 "image":"iVBORw0KGgoAAAANSUhEUgAAghjysAAAAgjjafggkqqBEoAAARKCAIAAAQA/w……………...........YIAI",
+
+5 "message":"%u0423%u0441%u043F%u0435%u0445",
+
+6 "messageID":"message",
+
+7 "payload":" https://qr.nspk.ru/AS1000670LSS7DN18SJQDNP4B05KLJLK",
+
+8 "payrrn":"000022134348",
+
+9 "qrcId":"AS1000670LSS7DN18SJQDNP4B05KLJLK ",
+
+10 "status":"CREATED"
+
+11 }
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+}
+
+12/23/25, 11:24 AM Привязка счёта / подписка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/subscription/?rp-menuOpen=1 6/13
+
+https://qr.nspk.ru/BD1P004FM8U22B8B8N1RHCRJSAB6C4TS%20
+https://qr.nspk.ru/BD1P004FM8U22B8B8N1RHCRJSAB6C4TS?type=02&bank=100000000008&sum=100&cur=RUB&crc=A1A3
+
+
+Важно:
+
+• Значения параметров "subscriptionToken" и "memberId" необходимо хранить в системе ТСП для дальнейшего использования ТСП в
+с привязанного счета по инициативе ТСП». В случае отсутствия или утери значения параметра "subscriptionToken", привязку счет
+повторно.
+
+• Для получения значений параметров "subscriptionToken" и "memberId" ТСП необходимо реализовать возможность получения callba
+
+2.2. Нотификация по сценарию «Оплата по QR-коду с последующей привязкой счета/подпиской по СБП»
+
+Запросы о нотификации отправляются из ПШ Банка во внутреннюю систему ТСП на URL адрес, указанный в параметре «queryData.no
+«queryData.notificationUrl_sub» при направлении запроса «GetQRCd».
+
+Информация о возможных сценариях нотификации:
+
+1. При успешной оплате и успешной привязке счёта в адрес ТСП направляется два callback уведомления:
+• об успешности оплаты по QR-коду — метод «qrc/notification»;
+
+• об успешности привязки счета — метод «subscription/notification».
+
+2. Если Плательщик совершил оплату, но отказался от привязки счета, то в ТСП направляется два callback уведомления:
+• об успешности оплаты по QR-коду (метод «qrc/notification»);
+
+• об отказе Плательщика от привязки счета (метод «subscription/notification»).
+
+3. Если Плательщик не стал совершать оплату, то привязка счета ему не предлагается, в ТСП callback уведомление не направляется.
+
+3. Оплата с привязанного счёта по инициативе ТСП
+
+Запрос «Оплата с привязанного счета по инициативе ТСП» позволяет по запросу ТСП выполнить оплату в рамках операции СБП C2B
+привязка которого была выполнена ранее в рамках запроса «Регистрация QR-кода для привязки счета/подписки по СБП» или «О
+с последующей привязкой счета/подпиской по СБП». Сценарий может применяться как для разовых, так и для регулярных плате
+
+Для выполнения оплаты с привязанного счета необходимо направить в платежный шлюз Банка два последовательных запроса:
+
+1. Запрос «GetQRCd» на генерирование Платежной ссылки со значением параметра qrcType = «02» и с обязательно заполненным зн
+«paymentPurpose»;
+
+2. Запрос «QRCSubPayPetition» на оплату с привязанного счёта с указанием:
+• идентификатора QR-кода, полученного в ответе на запрос GetQRCd;
+
+• идентификаторов «subscriptionToken» и «SenderMemberId», полученных в callback уведомлении по методу «subscription/notificatio
+
+В случае удаления Плательщиком привязки счета Банк Плательщика, получив запрос по сценарию «Оплата с привязанного счета по
+запрос и направляет в адрес ТСП нотификацию с сообщением — «Привязка счета не найдена».
+
+Оплату с привязанного счета можно проводить на сумму до 1 000 000 руб.
+
+3.1. Генерация Платежной ссылки
+
+Метод «GetQRCd»
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…
+
+50)
+
+y Тип запроса. Константа «GetQRCd».
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+amount Number y Сумма платежа в минорных единицах (копейках).
+
+currency String (ans-3) y Код валюты (для рублей должен передаваться «RUB»).
+
+width String o Ширина картинки QR-кода (только числовое значение).
+
+height String o Высота картинки QR-кода (только числовое значение).
+
+qrcType String (n-2) y Тип запрашиваемого QR-кода. Константа — «02».
+
+12/23/25, 11:24 AM Привязка счёта / подписка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/subscription/?rp-menuOpen=1 7/13
+
+
+
+Код ключа Тип данных required Назначение
+
+paymentPurpose String (ans-
+
+140)
+
+y Назначение платежа. Обязательно к заполнению в сценарии «Оплата с привязанного счета по и
+
+messageID String (an-1…
+1024)
+
+o Уникальный идентификатор сообщения, GUID. Только латинские символы!
+
+qrTtl String (an-1…
+
+6)
+
+o Срок жизни Функциональной ссылки СБП в минутах. Минимальное допустимое значение — «
+
+значение — «129 600» (90 дней).
+
+Рекомендация: устанавливать срок жизни Функциональной ссылки СБП не менее «5» минут
+
+в запросе, будет использовано значение по умолчанию — «4 320» минут (3 суток).
+
+queryData.notificationUrl String (ans-
+
+512)
+
+y Полный URL для получения уведомления о решении Банка Плательщика по оплате с привязанн
+
+статусе оплаты QR-кода.
+
+queryData.notificationUrl_subRes String (ans-
+
+512)
+
+o Полный URL для получения уведомления о решении Банка Плательщика по оплате с привяз
+
+В случае указания значения в данном поле, на указанный URL адрес будет направлено одно
+
+о решении Банка Плательщика по оплате с привязанного счета.
+
+redirectUrl String (ans-
+
+1024)
+
+o Содержит ссылку для автоматического возврата в приложение или на сайт ТСП. Допускаются то
+
+Формат должен соответствовать правилам кодировки URL.
+Если все же требуется использовать в redirectUrl кириллические символы, необходимо перекоди
+
+код, используя percent-encoded octets согласно RFC3986.
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код
+ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*.
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+image String (an)
+
+Длинна зависит от формата, порядок
+
+7000 символов.
+
+y Изображение QR-кода содержит энкодированный BASE64 файл изображени
+.png
+
+message String (ans-1024) y Расшифровка кода ответа**.
+
+messageID String (ans-1024) o Уникальный идентификатор сообщения, GUID.
+
+payload String (1…999) y Платежная ссылка***.
+
+1 {
+
+2 "command":"GetQRCd",
+
+3 "TermNo":"90080567",
+
+4 "amount":"10000",
+
+5 "currency":"RUB",
+
+6 "qrcType":"02",
+
+7 "paymentPurpose":"Назначение платежа",
+
+8 "width":"600",
+
+9 "height":"600",
+
+10 "qrTtl":"10",
+
+11 "messageID":"message",
+
+12 "queryData":
+
+13 {
+
+14 "notificationUrl":"https://sbp-payments",
+
+15 "notificationUrl_subRes":"https://sbp-subscription_ resolution"
+
+16 },
+
+17 "redirectUrl": "https://exampletsp.io/qwertyui"
+
+18 }
+
+12/23/25, 11:24 AM Привязка счёта / подписка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/subscription/?rp-menuOpen=1 8/13
+
+
+
+Код
+ключа Тип данных required Назначение
+
+payrrn String (n-12) y Референсный идентификатор запроса в системе Банка.
+
+qrcId String (an-32) y Идентификатор QR-кода.
+
+status String (n-7) y Статус регистрации Платежной ссылки СБП
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+*** Формат payload может быть двух видов:
+
+• https://qr.nspk.ru/AD10000BBJKO23GB98LA1FGBRIHH3K89
+
+• https://qr.nspk.ru/AD10000BBJKO23GB98LA1FGBRIHH3K89?type=02&bank=100000000008&sum=10000&cur=RUB&crc=D87E
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request
+
+3.2. Запрос на оплату с привязанного счета по инициативе ТСП
+
+Метод QRCSubPayPetition используется ТСП для того, чтобы Банк Плательщика выполнил оплату с привязанного счета.
+
+Метод «QRCSubPayPetition»
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «QRCSubPayPetition».
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+subscriptionToken String (an-32) y Идентификатор Привязки счета, назначенный Банком Плательщика ранее на этапе оформления п
+
+SenderMemberId String (an-12) y Идентификатор банка Плательщика.
+
+qrcId String (an-32) y Идентификатор QR-кода.
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "TermNo": 90080567,
+
+4 "image": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAYAAAC
+
+5 "message": "%u0423%u0441%u043F%u0435%u0445",
+
+6 "messageID": "message",
+
+7 "payload": "https://qr.nspk.ru/AD10000BBJKO23GB98LA1FGBRIHH3K89?type=02&bank=100000000008&sum=10
+
+8 "payrrn": "000755856505",
+
+9 "qrcId": "AD10000BBJKO23GB98LA1FGBRIHH3K89",
+
+10 "status": "CREATED"
+
+11 }
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+ }
+
+12/23/25, 11:24 AM Привязка счёта / подписка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/subscription/?rp-menuOpen=1 9/13
+
+https://qr.nspk.ru/AD10000BBJKO23GB98LA1FGBRIHH3K89
+https://qr.nspk.ru/AD10000BBJKO23GB98LA1FGBRIHH3K89?type=02&bank=100000000008&sum=10000&cur=RUB&crc=D87E
+
+
+* Если привязка счета была подтверждена Плательщиком, Банк Плательщика в обязательном порядке должен передать параметр «
+Уникальный Идентификатор привязки счета. Уникальный Идентификатор привязки счета должен однозначно идентифицировать со
+Плательщика.
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*.
+
+message String (ans-140) y Расшифровка кода ответа**.
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+• 400 Bad Request
+
+3.3. Нотификация по сценарию «Оплата с привязанного счёта по инициативе ТСП»
+
+Запросы о нотификации отправляются из ПШ Банка во внутреннюю систему ТСП на URL адрес, указанный в параметре «queryData.no
+«queryData.notificationUrl_subRes» при направлении запроса «GetQRCd».
+
+Нотификация по оплате с привязанного счёта состоит из двух уведомлений:
+
+1. Уведомление о согласии/отказе в проведении платежа — метод «resolution /notification»;
+
+2. Уведомление о проведении/отказе в проведении платежа по QR-коду — метод «qrc/notification».
+
+Метод «resolution /notification»
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «resolution/notification»
+
+code String (an-7) y Возможные варианты кодов ответа:
+
+«RQ00030» — Согласие Банка Плательщика на выполнение платежа
+
+{
+
+ "command":"QRCSubPayPetition ",
+
+ "TermNo":"90080567",
+
+ "subscriptionToken":"70LSS7DN18SJQRS10006DNPKLJL24B05"
+
+ "SenderMemberId":"100000000008",
+
+ "qrcId":" AD10000BBJKO23GB98LA1FGBRIHH3K89"
+
+}
+
+{
+
+ "ErrorCode":"RQ00000",
+
+ "message":"Запрос обработан успешно"
+
+}
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+}
+
+12/23/25, 11:24 AM Привязка счёта / подписка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/subscription/?rp-menuOpen=1 10/13
+
+
+
+Код ключа Тип данных required Назначение
+
+«RQ05031» — Отказ Банка Плательщика. Привязка счета не найдена
+
+«RQ05032» — Отказ Банка Плательщика в выполнении платежа
+
+«RQ05060» — Недостаточно денежных средств для проведения операции
+
+«RQ05061» — Превышен лимит по сумме операций по СБП
+
+«RQ05062» — Превышен лимит по количеству операций по СБП
+
+«RQ05063» — Подозрение в мошенничестве
+
+«RQ05064» — Выполнение операций в данной категории ТСП запрещено
+
+«RQ05065» — Счёт заблокирован
+
+«RQ05066» — Счёт закрыт
+
+«RQ05067» — Выполнение операции запрещено по требованию законодательства
+
+message String (ans-1…1024) y Расшифровка кода ответа*.
+
+qrcId String (an-32) y Идентификатор QR-кода
+
+* Таблица возможных кодов ответа приведена в приложении 2.
+
+b) Примерный формат запроса при успешной оплате с привязанного счета:
+
+c) Примерный формат запроса в случае если недостаточно денежных средств на счёте Плательщика/сумма больше установленного
+
+d) Примерный формат запроса в случае направления запроса ТСП на оплату с привязанного счета, когда привязка счета была успеш
+Плательщиком удалена:
+
+e) ВС ТСП отвечает http-кодом «200» — успешное получение нотификации, или ошибкой.
+
+В настоящий момент ответ ВС не обрабатывается шлюзом Альфа-Банка. Обработка ответов ТСП находится в разработке.
+
+В случае добавления со стороны НСПК дополнительных параметров уведомления, система принимающая их от шлюза Альфа-Банка
+такие неожиданные параметры как ошибочный запрос.
+
+4. Запрос статуса привязки счёта
+
+Запрос предназначен для попытки уточнения в ПШ Банка привязки счета со стороны ТСП.
+
+Метод GetQRCSubStatus.
+
+{
+
+ "command":"resolution/notification ",
+
+ "code":" RQ00030",
+
+ "message":" Согласие на проведение платежа ",
+
+ "qrcId":" BD10006FEU7CQ9VE8D383VP0O2VH78D9",
+
+}
+
+{
+
+ "command":" resolution/notification ",
+
+ "code":" RQ05032",
+
+ "message":" Отказ в выполнении платежа ",
+
+ "qrcId":" BD10004KH55FOMC48QIR3FCDEHVLA23F ",
+
+}
+
+{
+
+ "command":" resolution/notification ",
+
+ "code":"RQ05031",
+
+ "message":"Привязка счета не найдена ",
+
+ "qrcId":" BD10004KH55FOMC48QIR3FCDEHVLA23F ",
+
+}
+
+12/23/25, 11:24 AM Привязка счёта / подписка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/subscription/?rp-menuOpen=1 11/13
+
+
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «GetQRCSubStatus».
+
+TermNo String (an-20) y Уникальный идентификатор терминала.
+
+qrcId String(an-32) y Идентификатор QR-кода.
+
+RQperiod String(n-3) o Период времени, за который нужно искать уведомление для Агенета ТСП о решении Банка Плательщика по пр
+
+*Если параметр не передан в запросе, то поиск будет осуществляться без ограничения по времени.
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*.
+
+message String (ans-140) y Расшифровка кода ответа**.
+
+qrcId String(an-32) o Идентификатор QR-кода.
+
+status String(a-4) o Статус выполнения привязки счета Плательщика.
+
+subscriptionToken String(an-32) o Уникальный идентификатор привязки счета Плательщика в Банке Плательщика.
+
+memberId String(an-12) o Идентификатор Банка Плательщика.
+
+notifyDate String(ans-19) o Дата получения уведомления о результате выполнения привязки счета Плательщика.
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+Примечание:
+
+• Если уведомление найдено, то в ответе будет присутствовать параметр «status».
+
+• Если в ходе выполнения запроса возникла ошибка обработки запроса, то в ответе будут переданы только код ошибки не равный
+
+• Если уведомление не было найдено (не получено от НСПК), то запрос будет считаться успешно выполненным и в ответе будет пер
+соответствующее успешному ответу, но без дополнительных параметров.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+{
+
+ "command":"GetQRCSubStatus",
+
+ "TermNo":"90080567",
+
+ "qrcId":"BB1S002PRSK6SR3E9R7P0H077UKN1QVF",
+
+ "RQperiod":"14"
+
+}
+
+{
+
+ "ErrorCode": 0,
+
+ "memberId": 600000000015,
+
+ "message": "OK",
+
+ "qrcId": "BB1S002PRSK6SR3E9R7P0H077UKN1QVF",
+
+ "status": "ACWP",
+
+ "subscriptionToken": "70LSS7DN18SJQRS10006DNPKLJLAGT77"
+
+}
+
+12/23/25, 11:24 AM Привязка счёта / подписка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/subscription/?rp-menuOpen=1 12/13
+
+
+
+Примечание: текстовые данные передаются в формате urlencoded.
+
+• 400 Bad Request
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+}
+
+12/23/25, 11:24 AM Привязка счёта / подписка СБП
+
+https://alfabank.ru/sme/payservice/sbp/docs/subscription/?rp-menuOpen=1 13/13
+
+
diff --git a/_docs/alfabank/qr_payout/7_digital_rubble.md b/_docs/alfabank/qr_payout/7_digital_rubble.md
new file mode 100644
index 0000000..4f74fa2
--- /dev/null
+++ b/_docs/alfabank/qr_payout/7_digital_rubble.md
@@ -0,0 +1,1101 @@
+Цифровой Рубль
+
+Цифровой рубль
+
+Цифровой рубль — это цифровая форма рубля.
+
+Сейчас у нас есть наличная (банкноты и монеты) и безналичная (деньги на счетах) форма национальной валюты, а в дополнение к ни
+
+Счета цифрового рубля будут открываться на платформе Центробанка. На этих счетах будет храниться цифровой рубль.
+
+Операции с цифровыми рублями будут проходить на ПЦР.
+
+Доступ к счетам цифрового рубля будет возможен через мобильные приложения банков и интернет-банки.
+
+По эквайрингу прием ЦР осуществляется в рамках Универсального платёжного кода
+
+1. Динамический QR-код:
+
+1.1. Запрос регистрации динамического УПК (универсального одноразового платёжного кода)
+
+• Сгенерировать универсальный одноразовый платёжный код возможно с помощью уже существующего метода «GetQRCd».
+Сгенерированный QR-код возможно оплатить как через СБП, так и с использованием ЦР.
+При этом в настройках ТСП на ПШ Банка обязательно должен быть указан счет ЦР
+
+• Также универсальный одноразовый платёжный код возможно сгенерировать с помощью отдельного метода «ReqUniQr».
+Сгенерированный QR-код возможно оплатить как через СБП, так и с использованием ЦР.
+При этом в настройках ТСП на ПШ Банка обязательно должен быть указан счет ЦР
+
+Запрос «ReqUniQr» направляется ТСП в Банк для выполнения запроса «Регистрация универсальной платёжной ссылки» API СБП.
+
+В ответе ПШ Банка возвращает результат обработки запроса и, в случае успешной обработки — значения параметров, полученных в
+
+• image (изображение)
+
+• mediaTypeR (расширение QR-кода)
+
+• payload (платёжная ссылка)
+
+• uniQrId (Идентификатор Платёжной ссылки)
+
+• status (Статус регистрации Платёжной ссылки. Единственное допустимое значение = «CREATED»).
+
+Метод ReqUniQr
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an‐1…50) y Тип запроса. Константа «ReqUniQr»
+
+TermNo String (an‐20) y Уникальный идентификатор терминала
+
+amount Number о Сумма платежа в минорных единицах (копейках)
+
+Обязательна при значении uniQrType = 02
+
+mediaType String o Расширение QR‐кода
+
+width String o Ширина картинки QR‐кода (только числовое значение)
+
+height String o Высота картинки QR‐кода (только числовое значение)
+
+uniQrType String (n‐2) y Тип платёжной ссылки:
+
+• 01 — многоразовая
+
+• 02 — одноразовая
+
+12/23/25, 11:24 AM Цифровой рубль
+
+https://alfabank.ru/sme/payservice/sbp/docs/digital-rub/?rp-menuOpen=1 1/13
+
+https://alfabank.ru/sme/payservice/sbp/docs/digital-rub/?rp-menuOpen=1
+https://sbp.nspk.ru/uniqr?ysclid=mhajjmr4i0196202211
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1#dynemic_qr
+
+
+Код ключа Тип данных required Назначение
+
+paymentPurpose String (ans‐140) o Назначение платежа
+
+redirectUrl String (ans‐1024) o Содержит ссылку для автоматического возврата в приложение или на сайт ТСП.
+
+Допускаются только символы в кодировке ASCII. Формат должен соответствовать правилам кодир
+
+Если требуется использовать в redirectUrl кириллические символы, необходимо перекодировать их
+
+RFC3986
+
+paymentPageUrl String (ans‐1024) o Ссылка для перенаправления Покупателя на Платёжную страницу Участника Сервиса УПК
+
+messageID String (ans‐1024) o Уникальный идентификатор сообщения, GUID
+
+qrTtl String (an‐1…6) o Минимальное значение срока использования созданной динамической платёжной ссылки в целых мин
+
+fraudScore String (an‐16) o Индикатор Подозрительной Операции Агента ТСП
+
+queryData.notificationUrl String (ans‐512) o Полный URL для получения уведомления о финальном статусе оплаты QR‐кода
+
+Если требуется сформировать динамический QR-код под определенного Плательщика, то необходи
+
+Код ключа Тип данных required Назначение
+
+queryData.SenderFIO String (an‐140) o Фамилия, Имя и Отчество Плательщика, не являет
+
+queryData.SenderID String (an-11…13) o Идентификатор Плательщика
+
+queryData.SenderBankBIC String (n‐9) o Банковский Идентификационный Код Банка Плате
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an‐20) y Код ответа:
+
+0 — успешное выполнение запроса
+
+иначе — код ошибки и её расшифровка в поле message*
+
+message String (ans‐1024) o Расшифровка кода ответа — если ErrorCode не равен 0**
+
+payload String (1…999) o Платёжная ссылка — если ErrorCode = 0
+
+1 {
+
+2 "command":"ReqUniQr",
+
+3 "TermNo":"90080567",
+
+4 "amount":"10000",
+
+5 "uniQrType":"02",
+
+6 "redirectUrl":"https://alfabank.ru/sme/payservice/sbp/",
+
+7 "paymentPageUrl":"https://alfabank.ru/sme/payservice/sbp/",
+
+8 "mediaType":"image/png",
+
+9 "width":"600",
+
+10 "height":"600",
+
+11 "qrTtl":"2",
+
+12 "messageID":"f9aa54ff-a615-44b8-aa6c-acab655c89f8",
+
+13 "paymentPurpose":"Назаначение платежа",
+
+14 "fraudScore":"0000000000000000",
+
+15 "queryData":
+
+16 {
+
+17 "notificationUrl":"https://sbp-payments",
+
+18 "SenderFIO":"Иванов|Иван|Иванович",
+
+19 "SenderID":"0079123456789",
+
+20 "SenderBankBIC":"44525593"
+
+21 }
+
+22 }
+
+12/23/25, 11:24 AM Цифровой рубль
+
+https://alfabank.ru/sme/payservice/sbp/docs/digital-rub/?rp-menuOpen=1 2/13
+
+
+
+Код ключа Тип данных required Назначение
+
+payrrn String (n‐12) o Референсный номер платежа — если ErrorCode = 0
+
+mediaTypeR String o Расширение QR-кода — если ErrorCode = 0
+
+uniQrId String (an‐32) o Идентификатор Платёжной ссылки — если ErrorCode = 0
+
+messageID String (ans‐1024) o Уникальный идентификатор сообщения, GUID — если ErrorCode =
+
+status String (an‐20) o Статус регистрации Платёжной ссылки = «CREATED» — если Error
+
+*,** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+• 400 Bad Request
+
+1.2. Запрос статуса оплаты по динамическому УПК
+
+• Статус оплаты универсального одноразового платёжного кода возможно проверить с помощью уже существующего метода «GetQ
+При этом, в ответе к уже существующим статусам, добавляется еще два новых статуса для ЦР: «ENDD» и «ACDR»
+
+• Также статус оплаты возможно проверить с помощью отдельного метода «GetUniQrStatus»
+
+Метод GetUniQrStatus
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an‐1…50) y Тип запроса. Константа «GetUniQrStatus»
+
+TermNo String (an‐20) y Уникальный идентификатор терминала
+
+uniQrIds String y Массив идентификаторов Одноразовых Платёжных ссылок (uniQrId), статус которых х
+
+Максимальное количество идентификаторов Одноразовых Платёжных ссылок в одно
+
+b) Примерный формат запроса:
+
+1 {
+
+2 "ErrorCode":"0",
+
+3 "message":"Запрос выполнен",
+
+4 "image":"iVBORw0KGgoAAAANS…AAASUVORK5CYII=",
+
+5 "messageID":"message",
+
+6 "payload":"https://qr.nspk.ru/BD10006PV41C82I48OAODKVDFF0IK9SE",
+
+7 "payrrn":"000000002235",
+
+8 "uniQrId":"BD10006PV41C82I48OAODKVDFF0IK9SE",
+
+9 "mediaTypeR":"image/png",
+
+10 "status":"CREATED"
+
+11 }
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+}
+
+1 {
+
+2 "command": "GetUniQrStatus",
+
+3 "TermNo": "agttest321",
+
+12/23/25, 11:24 AM Цифровой рубль
+
+https://alfabank.ru/sme/payservice/sbp/docs/digital-rub/?rp-menuOpen=1 3/13
+
+https://alfabank.ru/sme/payservice/sbp/docs/dynamic/?rp-menuOpen=1#payment_status
+
+
+с) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an‐20) y Код ответа:
+
+0 — успешное выполнение запроса
+
+иначе — код ошибки и её расшифровка в поле message*
+
+message String (ans‐1024) o Расшифровка кода ответа — если ErrorCode не равен 0**
+
+data String o Блок данных в формате JSON (массив Record)*** — если ErrorCode
+
+messageID String (ans‐1024) o Уникальный идентификатор сообщения, GUID — если ErrorCode = 0
+
+status String (an‐20) o Статус регистрации Платёжной ссылки = «CREATED» — если ErrorC
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+*** описание структуры массива Record блока данных data:
+
+Код ключа Тип данных Назначение
+
+uniQrId String (an‐32) Идентификатор Одноразовой Платёжной ссылки
+
+code String (7) Код ответа для указанной Одноразовой Платёжной ссылки
+
+message String (1…255) Текстовое описание кода ответа для указанной Одноразовой Платёжной ссылки
+
+paymentServiceId String (12) Идентификатор способа приёма платежа, который использовался для оплаты указанной Одноразовой Платёжной сс
+
+Будет отсутствовать в ответе при значении параметра status = «NTST» и будет заполнен при любых других значениях
+
+status String (4) Текущий статус Одноразовой Платёжной ссылки. Допустимые значения:
+
+1. «NTST» (NOT_STARTED): платёж не инициирован
+
+2. «RCVD» (RECEIVED): инициирован платёж
+
+3. «ACWP» (ACCEPTED): платёж успешно выполнен
+
+4. «RJCT» (REJECTED): платёж отклонён
+
+5. «ENDD»: платёж с расчётами в ЦР обработан, но результат выполнения неизвестен (успех или отказ)
+
+6. «ACDR»: передаётся статус (аналог «ACWP»), указанный в настройке ACWPstatusDR. Используется в отдельных п
+
+Может принимать значения:
+
+• «ENDD» передаётся в случае, если:
+
+• с использованием указанной Одноразовой Платёжной ссылки была выполнена Операция ЦР C2B (paymentSe
+
+• нет уведомления, но уже был запрос статуса, и в нём был получен «ENDD» (если ссылка была сформирована
+
+• «ACWP» и «RJCT» только в том случае, если с использованием указанной Одноразовой Платёжной ссылки был
+
+• «ACDR» передаётся статус, если есть уведомление от ПлЦР об оплате (если ссылка была сформирована как un
+
+trxId String (32) Идентификатор Операции СБП будет заполнен только при соблюдении следующих условий:
+
+• paymentServiceId = «PS0000000001»
+
+4 "uniQrIds":
+
+5 [
+
+6 "AD2000670LSS7DN18SJQDNP4B05KLJL1",
+
+7 "AD2000670LSS7DN18SJQDNP4B05KLJL2",
+
+8 "AD2000670LSS7DN18SJQDNP4B05KLJL3",
+
+9 "AD2000670LSS7DN18SJQDNP4B05KLJL4",
+
+10 "AD2000670LSS7DN18SJQDNP4B05KLJL5"
+
+11 ]
+
+12 }
+
+12/23/25, 11:24 AM Цифровой рубль
+
+https://alfabank.ru/sme/payservice/sbp/docs/digital-rub/?rp-menuOpen=1 4/13
+
+https://wiki.finstream.ru/pages/viewpage.action?pageId=153813196#id-%D0%A8%D0%BB%D1%8E%D0%B7FastPayAgentDR(%D0%9F%D0%BB%D0%B0%D1%82%D0%B5%D0%B6%D0%BD%D0%B0%D1%8F%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%D0%A1%D0%91%D0%9F/%D0%A6%D0%A0(%D0%A6%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%BE%D0%B9%D1%80%D1%83%D0%B1%D0%BB%D1%8C)%D0%B4%D0%BB%D1%8F%D0%90%D0%B3%D0%B5%D0%BD%D1%82%D0%B0%D0%A2%D0%A1%D0%9F)-%D0%91%D0%B8%D0%B7%D0%BD%D0%B5%D1%81-%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81AWGW.FastPayAgentDR.BProcess
+
+
+Код ключа Тип данных Назначение
+
+• status = «ACWP» или «RJCT»
+
+kzo String (1…128) Контрольное значение Операции СБП будет заполнено только при соблюдении следующих условий:
+
+• paymentServiceId = «PS0000000001»
+
+• status = «ACWP»
+
+payrrn String (n‐12) Референсный номер платежа — если ErrorCode = 0
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+• 400 Bad Request
+
+2. Кассовая платёжная ссылка
+
+1 {
+
+2 "ErrorCode": "0",
+
+3 "message": "Запрос обработан успешно",
+
+4 "data": [
+
+5 {
+
+6 "qrcId": "AD2000670LSS7DN18SJQDNP4B05KLJL1",
+
+7 "code": "RQ00000",
+
+8 "message": "Запрос обработан успешно",
+
+9 "paymentServiceId": "PS0000000002",
+
+10 "status": "ENDD",
+
+11 "trxId": null,
+
+12 "kzo": null
+
+13 },
+
+14 {
+
+15 "qrcId": "AD2000670LSS7DN18SJQDNP4B05KLJL2",
+
+16 "code": "RQ00000",
+
+17 "message": "Запрос обработан успешно",
+
+18 "paymentServiceId": "PS0000000001",
+
+19 "status": "ACWP",
+
+20 "trxId": "A1A2S3D5F6G7H8J9K0C4S5C6D7V5D1K3",
+
+21 "kzo": "FDOS4JUETLYT639ADAFZ4GAUY9VSM2TG2Y595LQ20EKQF3JM1CIV4ZTZYA1EYIMFMEJSRB2UR7KATMA2
+
+22 },
+
+23 {
+
+24 "qrcId": "AD2000670LSS7DN18SJQDNP4B05KLJL4",
+
+25 "code": "RQ00000",
+
+26 "message": "Запрос обработан успешно",
+
+27 "paymentServiceId": null,
+
+28 "status": "NTST",
+
+29 "trxId": null,
+
+30 "kzo": null
+
+31 },
+
+32 {
+
+33 "qrcId": "AD2000670LSS7DN18SJQDNP4B05KLJL5",
+
+34 "code": "RQ05014",
+
+35 "message": "Указанное значение uniQrId не найдено",
+
+36 "paymentServiceId": null,
+
+37 "status": null,
+
+38 "trxId": null,
+
+39 "kzo": null
+
+40 }
+
+41 ]
+
+42 }
+
+{
+
+ "ErrorCode": "Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+}
+
+12/23/25, 11:24 AM Цифровой рубль
+
+https://alfabank.ru/sme/payservice/sbp/docs/digital-rub/?rp-menuOpen=1 5/13
+
+
+
+2.1 Запрос регистрации кассового УПК (универсального многоразового платёжного кода)
+
+• Сгенерировать универсальный многоразовый платёжный код возможно с помощью уже существующего метода «RegCashQRc».
+Сгенерированный QR-код возможно оплатить как через СБП, так и с использованием ЦР.
+При этом в настройках ТСП на ПШ Банка обязательно должен быть указан счет ЦР
+
+• Также универсальный многоразовый платёжный код возможно сгенерировать с помощью отдельного метода «RegCashUniQr».
+Сгенерированный QR-код возможно оплатить как через СБП, так и с использованием ЦР.
+При этом в настройках ТСП на ПШ Банка обязательно должен быть указан счет ЦР
+
+Метод ReqUniQr
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an‐1…50) y Тип запроса. Константа «ReqCashUniQr»
+
+TermNo String (an‐20) y Уникальный идентификатор терминала
+
+messageID String (ans‐1024) o Уникальный идентификатор сообщения, GUID
+
+redirectUrl String (ans‐1024) o Содержит ссылку для автоматического возврата в приложение или на сайт ТСП.
+
+Допускаются только символы в кодировке ASCII. Формат должен соответствовать правилам кодир
+
+Если требуется использовать в redirectUrl кириллические символы, необходимо перекодировать их
+
+RFC3986
+
+paymentPageUrl String (ans‐1024) o Ссылка для перенаправления Покупателя на Платёжную страницу Участника Сервиса УПК
+
+mediaType String o Расширение QR‐кода УПК
+
+width String o Ширина картинки QR‐кода (только числовое значение)
+
+height String o Высота картинки QR‐кода (только числовое значение)
+
+qrcId String (32) o Идентификатор Многоразового УПК, предварительно зарегистрированный с использованием мето
+
+Если Банк ТСП передаст в запросе параметр qrcId, Оператор Сервиса УПК использует значение это
+
+параметр qrcId будет отсутствовать, Оператор Сервиса УПК сформирует новое значение идентифи
+
+Зарегистрировать Кассовый УПК с определенным значением qrcId может только тот Банк ТСП, кот
+
+API «Получение идентификаторов для Многоразовых УПК»
+
+queryData.notificationUrl String (ans‐512) o Полный URL для получения уведомления о финальном статусе оплаты QR-кода
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+1 {
+
+2 "command":"ReqCashUniQr",
+
+3 "TermNo":"90080567",
+
+4 "messageID":"f9aa54ff-a615-44b8-aa6c-acab655c89f8",
+
+5 "redirectUrl":"https://alfabank.ru/sme/payservice/sbp/",
+
+6 "paymentPageUrl":"https://alfabank.ru/sme/payservice/sbp/",
+
+7 "mediaType":"image/png",
+
+8 "width":"600",
+
+9 "height":"600",
+
+10 "qrcId":"",
+
+11 "queryData":
+
+12 {
+
+13 "notificationUrl":"https://sbp-payments",
+
+14 }
+
+15 }
+
+12/23/25, 11:24 AM Цифровой рубль
+
+https://alfabank.ru/sme/payservice/sbp/docs/digital-rub/?rp-menuOpen=1 6/13
+
+https://alfabank.ru/sme/payservice/sbp/docs/paylink/?rp-menuOpen=1#cash_register_payment_link
+
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an‐20) y Код ответа*
+
+message String (ans‐1024) y Расшифровка кода ответа**
+
+TermNo String (an‐20) y Уникальный идентификатор терминала
+
+payload String (1…999) o Платёжная ссылка УПК. См. приложение 1
+
+image String (an)
+
+Длина зависит от формата, порядок 7000 символов
+
+y Изображение QR-кода содержит энкодированный BASE64
+
+mediaType String o Расширение QR-кода УПК, если ErrorCode = 0
+
+qrcId String (an‐32) o Идентификатор QR-кода
+
+messageID String (ans‐1024) o Уникальный идентификатор сообщения, GUID — если Err
+
+status String (an‐20) o Статус регистрации Платёжной или Информационной ссы
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+• 400 Bad Request
+
+2.2 Запрос статуса оплаты по кассовому УПК
+
+• Статус оплаты кассового универсального многоразового платёжного кода возможно проверить с помощью уже существующего м
+При этом, в ответе к уже существующим статусам, добавляется ещё два новых статуса для ЦР: «ENDD» и «ACDR».
+
+• Также статус оплаты возможно проверить с помощью отдельного метода «GetCashUniQrStatus».
+
+Метод GetCashUniQrStatus
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an‐1…50) y Тип запроса. Константа «GetCashUniQrS
+
+TermNo String (an‐20) y Уникальный идентификатор терминала
+
+messageID String (ans‐1024) o Уникальный идентификатор сообщения
+
+{
+
+ "ErrorCode": "0",
+
+ "message": "OK",
+
+ "TermNo": "90080567",
+
+ "payload": "![CDATA[https://qr.nspk.ru/BS2R003FS8EFGAVM852PQS13N894HDLU?type=01&bank=620000000015&cr
+
+ "image": "iVBORw0KGgoAAAANSUhEUgAAAlg......",
+
+ "mediaType": "image/png",
+
+ "qrcId": "BS2R003FS8EFGAVM852PQS13N894HDLU",
+
+ "status": "CREATED"
+
+}
+
+{
+
+ "ErrorCode":"Код ответа",
+
+ "message":"Расшифровка кода ответа"
+
+}
+
+12/23/25, 11:24 AM Цифровой рубль
+
+https://alfabank.ru/sme/payservice/sbp/docs/digital-rub/?rp-menuOpen=1 7/13
+
+
+
+Код ключа Тип данных required Назначение
+
+payrrn String (n‐12) o Референсный номер платежа
+
+uniQrId String (an‐32) y Идентификатор Кассового УПК
+
+paramsId String (an‐32) y Идентификатор параметров Кассового У
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an‐20) y Код ответа*
+
+message String (ans‐1024) y Расшифровка кода ответа**
+
+messageID String (ans‐1024) o Уникальный идентификатор сообщения, GUID — если ErrorCode = 0
+
+uniQrId String (an‐32) o Идентификатор Кассового УПК
+
+payrrn String (n‐12) o Референсный номер платежа
+
+trxId String (an‐32) o Уникальный идентификатор платежа в НСПК. Идентификатор Операции СБП будет заполнен то
+
+• paymentServiceId = «PS0000000001»
+
+• status = «ACWP» или «RJCT»
+
+trxDT String (n‐14) o Дата и время платежа в AnyWay (ГГГГММДДччммсс)
+
+paymentServiceId String (12) o Идентификатор Платёжного сервиса, с использованием которого был выполнен Перевод УПК
+
+• «PS0000000001» — платёж через СБП
+
+• «PS0000000002» — платёж с использованием ЦР
+
+Будет отсутствовать в ответе при значении параметра status = «NTST» и будет заполнен при лю
+
+BatchId String (n‐1…8) o Уникальный идентификатор смены (если смена терминала была открыта), метод получения см. ан
+
+CreditDatePos String (ans 1‐256) o Дата операции, установленная Банком Получателя в ходе обработки уведомления НСПК (определ
+
+merchantId String (an‐20) o Id магазина в НСПК
+
+TermNo String (an‐20) y Уникальный идентификатор терминала
+
+amount Number o Сумма платежа в минорных единицах (копейках)
+
+currency String (ans‐3) o Код валюты (для рублей должен передаваться «RUB»)
+
+Url String (ans 1‐512) o Полный URL для получения уведомления ТСП (значение параметра, переданного при регистрации
+
+cashRegisterQrcStatus String y Текущий статус Кассовой ссылки СБП для указанного paramsId:
+
+• «WAITING_PAYMENT» — Кассовая ссылка СБП для указанного paramsId активирована и готов
+
+{
+
+ "command": "GetCashUniQrStatus",
+
+ "TermNo": "90080567",
+
+ "messageID": " f9aa54ff-a615-44b8-aa6c-acab655c89f8",
+
+ "payrrn": "000000000256",
+
+ "uniQrId": "AS1R0006QD93NUCF9MIPLLLDD7BF49CI",
+
+ "paramsId": "BP10001NAJ5S985L9DM9GO6PK4H6KN3M"
+
+}
+
+12/23/25, 11:24 AM Цифровой рубль
+
+https://alfabank.ru/sme/payservice/sbp/docs/digital-rub/?rp-menuOpen=1 8/13
+
+
+
+Код ключа Тип данных required Назначение
+
+• «IN_PROGRESS» — Операция по Кассовой ссылке СБП для указанного paramsId в процессе вы
+
+• «DEACTIVATED» — Кассовая ссылка СБП с указанным paramsId более не существует (все дейс
+
+paramsId String‐32 y Идентификатор активного набора параметров
+
+kzo String (1…128) o Контрольное значение Операции СБП будет заполнено только при соблюдении следующих ус
+
+• paymentServiceId = PS0000000001»
+
+• status = «ACWP»
+
+status String (4) o Статус Перевода УПК. Допустимые значения:
+
+1. «NTST» — Перевод УПК не начат
+
+2. «RCVD» — Перевод УПК в процессе обработки
+
+3. «ENDD» — Перевод УПК завершён (только для оплаты ЦР)
+
+4. «ACWP» — Перевод УПК выполнен успешно (только для оплаты через СБП)
+
+5. «RJCT» — Перевод УПК отклонён (только для оплаты через СБП)
+
+6. «ACDR» — Перевод в ЦР выполнен успешно (аналог «ACWP»), если указан в настройке ACW
+
+timestamp UTC time format o Дата и время выполнения Операции СБП. Параметр будет заполнен только при соблюдении следу
+
+• paymentServiceId = «PS0000000001»
+
+• status = «ACWP» или «RJCT»
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+• «status» = «NTST», «RCVD» или «ACTC» — означает необходимость повтора запроса до получения одного из финальных статусов
+
+• Получение «status» = «RJCT» означает отказ в оплате данного QR-кода
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+• 400 Bad Request
+
+1 {
+
+2 "ErrorCode": "0",
+
+3 "message": "Запрос выполнен",
+
+4 "TermNo": "90080567",
+
+5 "messageID": " f9aa54ff-a615-44b8-aa6c-acab655c89f8",
+
+6 "uniQrId": "AS1R0006QD93NUCF9MIPLLLDD7BF49CI",
+
+7 "paramsId": "BP10001NAJ5S985L9DM9GO6PK4H6KN3M",
+
+8 "trxStatus": "ACWP",
+
+9 "payrrn": "000000000256",
+
+10 "timestamp": "2025-06-24T11:53:09.000Z",
+
+11 "cashRegisterQrcStatus": "DEACTIVATED",
+
+12 "trxId": "B5175115309809010000120011530503",
+
+13 "trxDT": "20250624115309",
+
+14 "amount": "100",
+
+15 "currency": "RUB",
+
+16 "Url": " https://sbp-payments",
+
+17 "CreditDatePos": "20250624",
+
+18 "payerId": "*********5744",
+
+19 "kzo": "45dfe048b805b1f7612a51b961ee61e5df008314a1a3c82892a085cacff18500e8c7f09170c10415fd26710a4a
+
+20 "merchantId": "MA0000018412",
+
+21 "paymentServiceId": "PS0000000001"
+
+22 }
+
+12/23/25, 11:24 AM Цифровой рубль
+
+https://alfabank.ru/sme/payservice/sbp/docs/digital-rub/?rp-menuOpen=1 9/13
+
+
+
+2.3. Изменение параметров кассового УПК (универсального многоразового платёжного кода)
+
+Запрос «ChangeAccForCashUniQr» направляется ТСП в Банк для выполнения запроса УПК API «Изменение параметров Многоразово
+отдельных параметров Многоразового или Кассового УПК, заданных при регистрации УПК.
+
+Для Многоразового или Кассового УПК могут быть изменены:
+
+• Уникальный идентификатор терминала (параметр TermNo)
+
+• Получатель денежных средств в Переводе УПК или ТСП получателя (параметр merchantId). Новое значение merchantId может прин
+принадлежало прежнее значение merchantId, так и другому ЮЛ, ИП или Самозанятому, зарегистрированному в НСПК
+
+• Ссылка для автоматического возврата Покупателя из приложения Банка в приложение или на сайт ТСП (параметр redirectUrl)
+
+• Набор Платёжных сервисов, с использованием которых может быть выполнен Перевод УПК по данному Многоразовому/Кассовом
+в Переводе УПК, выполненном с использованием того или иного Платёжного сервиса, например, Счет ТСП в Банке ТСП, на которы
+выполнения Операции СБП C2B (параметры Account и AccountDR)
+
+В ответе ПШ Банка возвращает результат обработки запроса и, в случае успешной обработки — значения параметров, полученных в
+
+Метод ChangeAccForCashUniQr
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1…50) y Тип запроса. Константа «ChangeAccForCashUniQr»
+
+TermNo String (an‐20) y Уникальный идентификатор терминала
+
+messageID String (ans‐1024) o Уникальный идентификатор сообщения, GUID
+
+qrcId String (32) o Идентификатор Кассового УПК
+
+account String (an‐20) o Новый счёт ЮЛ для УПК:
+
+если заполнено — будет изменён счёт для оплаты через СБП в УПК
+если не заполнено — значение берётся из поля Account справочника терминалов
+
+accountDR String (55) o Новый счёт ЮЛ для ЦР:
+
+если заполнено — будет изменён счёт для оплаты ЦР в УПК
+
+если не заполнено — значение берётся из поля AccountDR справочника терминалов
+
+NewTermNo String (an‐20) o Новый уникальный идентификатор терминала.
+Поле обязательно, если НЕ переданы account, accountDR, NewMerchantId, redirectUrl
+
+NewMerchantId String (an‐12) o Новый Id мерчанта (магазина) в НСПК.
+
+Поле обязательно, если НЕ переданы account, accountDR, NewTermNo, redirectUrl
+
+redirectUrl String (ans‐1024) o Содержит ссылку для автоматического возврата в приложение или на сайт ТСП.
+
+Допускаются только символы в кодировке ASCII. Формат должен соответствовать правилам кодировки U
+
+Если требуется использовать в redirectUrl кириллические символы, необходимо перекодировать их в соот
+
+paymentPageUrl String (ans‐1024) o Ссылка для перенаправления Покупателя на Платёжную страницу Участника Сервиса УПК
+
+fraudScore String o Индикатор Подозрительной Операции Банка ТСП
+
+b) Примерный формат запроса:
+
+{
+
+ "ErrorCode": "Код ответа",
+
+ "message": "Расшифровка кода ответа"
+
+}
+
+1 {
+
+2 "command": "ChangeAccForCashUniQr",
+
+3 "TermNo": "90080567",
+
+12/23/25, 11:24 AM Цифровой рубль
+
+https://alfabank.ru/sme/payservice/sbp/docs/digital-rub/?rp-menuOpen=1 10/13
+
+https://wiki.finstream.ru/pages/viewpage.action?pageId=79692419#id-%D0%A8%D0%BB%D1%8E%D0%B7FastPayAgent%D0%B4%D0%BB%D1%8F%D0%B7%D0%B0%D1%8F%D0%B2%D0%BE%D0%BA%D0%A2%D0%A1%D0%9F-%D0%A2%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B0%D0%BB%D1%8B
+https://wiki.finstream.ru/pages/viewpage.action?pageId=79692419#id-%D0%A8%D0%BB%D1%8E%D0%B7FastPayAgent%D0%B4%D0%BB%D1%8F%D0%B7%D0%B0%D1%8F%D0%B2%D0%BE%D0%BA%D0%A2%D0%A1%D0%9F-%D0%A2%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B0%D0%BB%D1%8B
+
+
+Правила заполнения и интерпретации параметров:
+
+• В запросе должен быть заполнен хотя бы один из параметров: account, accountDR, NewTermNo, NewMerchantId, redirectUrl. Если ни
+ErrorCode = «90» и message = «Не указан ни один из обязательных параметров»
+
+• account — будет выполнено изменение счёта ЮЛ, ИП или самозанятого для расчётов через СБП зарегистрированного УПК. Если зн
+из справочника терминалов
+
+• accountDR — будет выполнено изменение/добавление счета ЮЛ, ИП или самозанятого для расчётов ЦР зарегистрированного УПК.
+берётся из справочника терминалов/ЮЛ
+
+• Если параметр accountDR был передан в запросе, но длина его значения отличается от 55 — будет возвращена ошибка c ErrorCode
+Параметр accountDR должен содержать 55 символов»
+
+• NewTermNo — будет выполнено изменение номера терминала для зарегистрированной Кассовой ссылки СБП. Новый номер терми
+или ТСТ указанного NewMerchantId запроса
+
+• NewMerchantId — будет выполнено изменение ТСТ для зарегистрированной Кассовой ссылки СБП. Если поле NewTermNo в запросе
+перепривязка существующего TermNo к новому NewMerchantId
+
+• redirectUrl — будет выполнено изменение ссылки автоматического возврата в приложение или на сайт ТСП для зарегистрированно
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an‐20) y Код ответа*
+
+message String (ans‐1024) y Расшифровка кода ответа**
+
+messageID String (ans‐1024) o Уникальный идентификатор сообщения, GUID — если ErrorCode = 0
+
+qrcId String (an‐32) o Идентификатор QR-кода
+
+TermNo String (an‐20) y Уникальный идентификатор терминала
+
+account String (an‐20) y/o Cчёт для оплаты через СБП.
+В ответе должен присутствовать один из параметров account или accountDR, либо о
+
+accountDR String (55) y/o Cчёт для оплаты ЦР.
+
+В ответе должен присутствовать один из параметров account или accountDR, либо о
+
+merchantId String (an‐12) y Id мерчанта (магазина) в НСПК
+
+status String (an‐20) o Статус регистрации Платёжной или Информационной ссылки СБП («CREATED» —
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 ОК
+
+4 "messageID": "f9aa54ff-a615-44b8-aa6c-acab655c89f8",
+
+5 "qrcId": "BS200031LP9DVTOR80O83FQ2ILIADFLM",
+
+6 "account": "40201810100000088000",
+
+7 "accountDR": "g.ab.cbrdc.wlt.clt.abcd0123-ab12-4a12-89ab-abcdef01234G",
+
+8 "redirectUrl": "https://alfabank.ru/sme/payservice/sbp/",
+
+9 "paymentPageUrl": " https://alfabank.ru/sme/payservice/sbp/",
+
+10 "fraudScore": "0000000000000000",
+
+11 "NewTermNo": "10000234",
+
+12 "NewMerchantId": "MA0000020651"
+
+13 }
+
+1 {
+
+2 "ErrorCode": "0",
+
+3 "message": "OK",
+
+4 "TermNo": "10000234",
+
+5 "messageID": "f9aa54ff-a615-44b8-aa6c-acab655c89f8",
+
+6 "qrcId": "BS200031LP9DVTOR80O83FQ2ILIADFLM",
+
+7 "account": "40201810100000088000",
+
+12/23/25, 11:24 AM Цифровой рубль
+
+https://alfabank.ru/sme/payservice/sbp/docs/digital-rub/?rp-menuOpen=1 11/13
+
+
+
+• 400 Bad Request
+
+3. Нотификация Клиента-получателя об исполнении перевода ЦР С2B
+
+Сообщение отправляется из ПШ Банка на сервер ТСП и содержит Извещение Клиента-получателя об исполнении перевода ЦР (С2B)
+
+Метод paymentDR/notification
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an‐1…50) o Константа «paymentDR/notification»
+
+uniQrId String (an‐32) o Идентификатор платежа в системе ЮЛ‐получателя
+
+operationId String o Идентификатор операции на ПлЦР (значение из тега ЭС )
+
+status String (an‐20) o Статус платежа на ПлЦР
+
+• если заполнено значение настройки ACWPstatusDR, то передаётся значение, указанное
+
+• «RCVD» — Перевод УПК в процессе обработки
+
+amount String (an‐1…12) o Сумма платежа в рублях с копейками
+
+timestamp YYYY-MM-DDThh:mm:ss[.SSS] o Дата и время исполнения распоряжения на ПлЦР
+
+payrrn String (n‐12) y Референсный номер платежа
+
+BatchId String (n‐4…8) y Уникальный идентификатор смены (если смена терминала открыта)
+
+TermNo String (an‐20) y Уникальный идентификатор терминала в AWGW
+
+CreditDatePos String (ans 1‐256) y Дата операции, установленная Банком Получателя в ходе обработки уведомления НСПК (опре
+
+merchantName ? y Наименование ТСП
+
+purpose String (ans‐210 y Назначение платежа
+
+b) Примерный формат запроса:
+
+8 "accountDR": "g.ab.cbrdc.wlt.clt.abcd0123-ab12-4a12-89ab-abcdef01234G",
+
+9 "status": "UPDATED",
+
+10 "merchantId": "MA0000020651"
+
+11 }
+
+{
+
+ "ErrorCode": "Код ответа",
+
+ "message": "Расшифровка кода ответа"
+
+}
+
+1 {
+
+2 "command": "paymentDR/notification",
+
+3 "uniQrId": "AD2000670LSS7DN18SJQDNP4B05KLJL1",
+
+4 "operationId": "546464AX45546",
+
+5 "status": "ACWP",
+
+6 "amount": "10241.21",
+
+7 "timestamp": "2024-08-01T10:15:00.000Z",
+
+8 "payrrn": "102345678912",
+
+9 "BatchId": "998844",
+
+10 "TermNo": "90080567",
+
+11 "CreditDatePos": "20240802",
+
+12 "merchantName": "Рога и Копыта",
+
+12/23/25, 11:24 AM Цифровой рубль
+
+https://alfabank.ru/sme/payservice/sbp/docs/digital-rub/?rp-menuOpen=1 12/13
+
+
+
+В ответ ожидается:
+
+• http-код «200» — Успешный ответ (Уведомление получено)
+
+• http-код «500» — Внутренняя ошибка
+
+13 "purpose": "Кофе и булочка"
+
+14 }
+
+12/23/25, 11:24 AM Цифровой рубль
+
+https://alfabank.ru/sme/payservice/sbp/docs/digital-rub/?rp-menuOpen=1 13/13
+
+
diff --git a/_docs/alfabank/qr_payout/8_additional_methods_API.md b/_docs/alfabank/qr_payout/8_additional_methods_API.md
new file mode 100644
index 0000000..2e1a915
--- /dev/null
+++ b/_docs/alfabank/qr_payout/8_additional_methods_API.md
@@ -0,0 +1,343 @@
+Дополнительные методы API
+
+Дополнительные методы API
+
+1. Запрос списка банков-участников СБП
+
+Запрос GetBankList направляется ТСП на ПШ Альфа-Банка для получения списка банков-участников СБП.
+
+Метод GetBankList
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1..50) y Тип запроса. Константа «GetBankList»
+
+messageID String (ans-1…
+
+1024)
+
+o Уникальный идентификатор сообщения, GUID
+
+BankMemberIdFilter String (n-11) o Фильтр для результатов запроса (указывается идентификатор участника СБП, добавляется в запрос если в
+
+ответе нужно получить данные только по одному банку)
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*
+
+message String (ans-1024) y Расшифровка кода ответа**
+
+BankList Массив o Коллекция, содержащая список банков-участников
+
+BankList.BankName String (an-50) o Наименование банка-участника
+
+BankList.BankID String (an-12) o Идентификатор участника СБП в НСПК
+
+BankList.BankBIK String (n-9) o БИК банка-участника СБП. (Присутствует в ответе если был передан из НСПК в данных участника СБП)
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+{
+
+ "command": "GetBankList"
+
+}
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "message":"Запрос обработан успешно",
+
+4 "BankList":
+
+5 [ {
+
+6 "BankName":"Наименование банка 1",
+
+7 "BankID":"10000001100",
+
+8 "BankBIK":"044525823"
+
+9 },
+
+10 …
+
+11 {
+
+12 "BankName":" Наименование банка N",
+
+13 "BankID":"10000001145",
+
+12/23/25, 11:25 AM Дополнительные методы API
+
+https://alfabank.ru/sme/payservice/sbp/docs/additional-api/?rp-menuOpen=1 1/5
+
+https://alfabank.ru/sme/payservice/sbp/docs/additional-api/?rp-menuOpen=1
+
+
+2. Запрос блокирования QR-кода
+
+Запрос направляется в ПШ банка в целях блокирования сгенерированного QR-кода. Запрос действует для любого вида сгенерирова
+QR-кода.
+
+Метод BlockQRcId
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1..50) y Тип запроса. Константа «BlockQRcId»
+
+TermNo String (an-20) y Уникальный идентификатор терминала
+
+qrcId String (an-32) y Идентификатор QR-кода
+
+reason String (ans-1024) o Причина блокировки
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*
+
+TermNo String (an-20) y Уникальный идентификатор терминала
+
+message String (ans-1024) y Расшифровка кода ответа**
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+• 400 Bad Request
+
+14 "BankBIK":"044525829"
+
+15 }
+
+16 ]
+
+17 }
+
+{
+
+ "command": "BlockQRcId",
+
+ "TermNo": "90080567",
+
+ "qrcId": "BS1R003FN6RS6HL48QMBFVO5C4K9GQRV",
+
+ "reason": "Заказ 12345 направлен в стоп-лист"
+
+}
+
+{
+
+ "ErrorCode": 0,
+
+ "TermNo": 90080567,
+
+ "message": "OK"
+
+}
+
+{
+
+"ErrorCode": "Код ответа",
+
+12/23/25, 11:25 AM Дополнительные методы API
+
+https://alfabank.ru/sme/payservice/sbp/docs/additional-api/?rp-menuOpen=1 2/5
+
+
+
+3. Запрос разблокирования QR-кода
+
+Запрос направляется в ПШ банка в целях разблокирования ранее заблокированного QR-кода.
+
+Метод UnblockQRcId
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1..50) y Тип запроса. Константа «UnblockQRcId»
+
+TermNo String (an-20) y Уникальный идентификатор терминала
+
+qrcId String (an-32) y Идентификатор QR-кода
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*
+
+TermNo String (an-20) y Уникальный идентификатор терминала
+
+message String (ans-1024) y Расшифровка кода ответа**
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+• 400 Bad Request
+
+4. Запрос списка заблокированных QR-кодов
+
+Запрос направляется в ПШ банка для получения списка заблокированных QR-кодов по определенному терминалу или кассе.
+
+"message": "Расшифровка кода ответа"
+
+}
+
+{
+
+ "command": "UnblockQRcId",
+
+ "TermNo": "90080567",
+
+ "qrcId": "BS1R003FN6RS6HL48QMBFVO5C4K9GQRV"
+
+}
+
+{
+
+ "ErrorCode": 0,
+
+ "TermNo": 90080567,
+
+ "message": "OK"
+
+}
+
+{
+
+"ErrorCode":"Код ответа",
+
+"message": "Расшифровка кода ответа"
+
+}
+
+12/23/25, 11:25 AM Дополнительные методы API
+
+https://alfabank.ru/sme/payservice/sbp/docs/additional-api/?rp-menuOpen=1 3/5
+
+
+
+Метод GetBlockedQRcIdList
+
+a) Описание параметров запроса:
+
+Код ключа Тип данных required Назначение
+
+command String (an-1..50) y Тип запроса. Константа «GetBlockedQRcIdList»
+
+TermNo String (an-20) y Уникальный идентификатор терминала
+
+b) Примерный формат запроса:
+
+c) Описание параметров ответа:
+
+Код ключа Тип данных required Назначение
+
+ErrorCode String (an-20) y Код ответа*
+
+message String (ans-1024) y Расшифровка кода ответа**
+
+QRcIdList Коллекция Список QRcId
+
+QRcIdList.qrcId String (an-32) y Идентификатор QR-кода
+
+QRcIdList.reason String (ans-1024) o Причина блокировки
+
+QRcIdList.date String (an-20) y Дата и время
+
+*, ** Таблица возможных кодов ответа приведена в приложении 2.
+
+d) Примерный формат ответа:
+
+• 200 OK
+
+• 400 Bad Request
+
+{
+
+ "command": "GetBlockedQRcIdList",
+
+ "TermNo": "90080567",
+
+}
+
+1 {
+
+2 "ErrorCode": 0,
+
+3 "QRcIdList":
+
+4 [
+
+5 {
+
+6 "date": "2024-04-18 17:17:45",
+
+7 "qrcId": "BD100000K5II0G369JHR3KBA6SM3FD3V",
+
+8 "reason": "Заказ 12345 направлен в стоп-лист"
+
+9 },
+
+10 {
+
+11 "date": "2024-05-01 19:07:15",
+
+12 "qrcId": "BD100002JN871TSC9SJB7HPVRFD3HQ8T",
+
+13 "reason": "Заказ 96780 направлен в стоп-лист"
+
+14 }
+
+15 ],
+
+16 "TermNo": "90080567",
+
+17 "message": "OK"
+
+18 }
+
+{
+
+"ErrorCode":"Код ответа",
+
+12/23/25, 11:25 AM Дополнительные методы API
+
+https://alfabank.ru/sme/payservice/sbp/docs/additional-api/?rp-menuOpen=1 4/5
+
+
+
+"message": "Расшифровка кода ответа"
+
+}
+
+12/23/25, 11:25 AM Дополнительные методы API
+
+https://alfabank.ru/sme/payservice/sbp/docs/additional-api/?rp-menuOpen=1 5/5
+
+
diff --git a/_docs/alfabank/qr_payout/9_appendix.md b/_docs/alfabank/qr_payout/9_appendix.md
new file mode 100644
index 0000000..5d476c8
--- /dev/null
+++ b/_docs/alfabank/qr_payout/9_appendix.md
@@ -0,0 +1,582 @@
+Приложения
+
+Приложения
+
+Приложение 1. Формат payload
+В СБП используется формат двухмерного кода QR Code (ISO/IEC 18 004--2015).
+
+Payload QR-кода может быть представлен в двух вариантах:
+
+1. Короткий вариант Payload: https://HOST/QR_ID
+
+2. Длинный вариант Payload: https://HOST/QR_ID?type=QR_TYPE&bank=MEMBER_ID&sum=SUM&cur=CUR&crc=CRC
+
+Описание параметров URL-based payload:
+
+Параметр Описание required Формат
+
+HOST qr.nspk.ru — для QR_TYPE = 01 и 02
+
+sub.nspk.ru — для QR_TYPE = 03
+
+y String
+
+QR_ID Идентификатор зарегистрированного QR кода в СБП y String 32 символа
+
+QR_TYPE Тип QR кода:
+
+01 — QR Static (QR наклейка);
+
+02 — QR Dynamic (QR на кассе);
+
+03 — QR-Subscription (Оформление привязки счета).
+
+y String 2 цифры
+
+MEMBER_ID Идентификатор Банка Получателя (ТСП) (Member_ID) y String 12 символов
+
+SUM Сумма в копейках y (если QR_TYPE = 02);
+
+Отсутствует, если QR_TYPE = 03
+
+String до 12 цифр
+
+CUR Валюта операции y (если присутствует SUM) String 3 символа
+
+CRC Значение контрольной суммы y String 4 символа
+
+Приложение 2. Описание кодов ответа
+Полный перечень кодов представлен на сайте НСПК. Данная спецификация не описывает всего перечня кодов ответов т. к. в случае
+исключительных ситуаций системой возможна генерация собственных кодов. Не описанные в документе коды следует обрабатыват
+техническую (системную) ошибку.
+
+ErrorCode message
+
+«-999» Прочее сообщение FSCryptoProxy
+
+«-71» Неверные данные Basic авторизации запроса. Не прошла проверка авторизации запроса от fsCryptoProxy → GW
+
+«-9» Система перегружена. Повторите запрос через несколько секунд. Очередь: %1
+
+«-8» Запрос отклонен. '%1' превышено ограничение на размер очереди. Ограничение: %2 Очередь: %3
+
+«-7» Неверная подпись сообщения. Не прошла проверка связки запроса от fsCryptoProxy → GW, закрытый ключ, указанный в настройках fsCryptoProxy
+
+(proxyAlias) не соответствует открытому ключу, указанному в GW, продукции у БС в настройке PublicKeyFile
+
+12/23/25, 11:25 AM Приложения
+
+https://alfabank.ru/sme/payservice/sbp/docs/additional/?rp-menuOpen=1 1/8
+
+https://alfabank.ru/sme/payservice/sbp/docs/additional/?rp-menuOpen=1
+https://host/QR_ID
+https://host/QR_ID?type=QR_TYPE&bank=MEMBER_ID&sum=SUM&cur=CUR&crc=CRC
+
+
+ErrorCode message
+
+«-6» Не передана подпись сообщения в параметре Authorization заголовка
+
+«-5» Тип запроса %1 не поддерживается
+
+«-4» При получении данных возникли проблемы: %1
+
+«-3» При создании потока JSON не образовался потоковый объект
+
+«-2» Возникли проблемы при преобразовании объекта в JSON %1
+
+«-1» Возникли проблемы при обработке запроса %1
+
+«0» «OK»
+
+«1» Внутренняя ошибка %1
+
+«2» Терминал %1 не обнаружен
+
+«3» Не заполнены данные запроса %1
+
+«301» Некорректно заполнены данные запроса %1
+
+«4» Не передан qrcId или payrrn
+
+«5» Не получены данные от СПБ
+
+«8» Таймаут ответа, попробуйте позже
+
+«9» Ошибка идентификации, попробуйте позже
+
+«10» Не передан реквизит command
+
+«11» Данная команда не поддерживается
+
+«12» «Не найдены данные для возврата»
+
+«13» Не найден успешный ответ на вызов GetQRCreversalData по причине: %1
+
+«14» Повторное открытие смены невозможно. Смена уже открыта.
+
+«15» Закрытие смены невозможно. Смена не открыта
+
+«16» Не передан TermNo
+
+«17» Не удалось найти QR по payrrn
+
+«18» Платеж не найден в запросах B07%1
+
+«19» Платеж не найден в запросах B08%1
+
+«20» Получен отказ на запрос возврата. Статус %1%2%3
+
+«21» Не удалось получить получателя перевода
+
+«22» payrrn=%1 в запросе не соответствует данным qrcId=%2 у которого payrrn=%3
+
+«23» Возврат невозможен для указанных параметров. Для payrrn=%1 соответствует trxId=%2, а в запросе получен %3
+
+«24» Возврат невозможен для указанных параметров. Для qrcId=%1 соответствует trxId=%2, а в запросе получен %3
+
+«25» «Терминал %1 заблокирован
+
+«26» «Ошибка идентификации»
+
+«27» «Невозможно выполнить возврат по данному Терминалу, т. к. счет зачисления не равен счету списания»
+
+«28» Запрос QR-кода не удался, не был получен Идентификатор QR-кода
+
+12/23/25, 11:25 AM Приложения
+
+https://alfabank.ru/sme/payservice/sbp/docs/additional/?rp-menuOpen=1 2/8
+
+
+
+ErrorCode message
+
+«29» Возврат невозможен. Для qrcId=%1 не удалось найти успешный ответ на запрос GetQRCstatus
+
+«30» Отсутствуют данные в переданных параметрах
+
+«31» Не удалось определить параметры: legalid или Для legalid не удалось найти данные в спр. счетов или в спр. клиентов
+
+«32» Отсутствуют данные получателя
+
+«33» Отсутствуют данные отправителя
+
+«34» Значения параметров запроса не совпадают с данными предыдущего шага
+
+«35» Не заполнен обязательный параметр REF
+
+«40» Возврат невозможен. Для payrrn=%1 не удалось найти успешный ответ на запрос GetQRCstatus
+
+«41» При активации кассовой ссылки, не удалось получить paramsId
+
+«42» Счет %1 не зарегистрирован у клиента. Изменение невозможно.
+
+«43» Данные об оплате еще не известны. По qrcId не получено уведомление (Notification) от НСПК
+
+«44» Кассовая ссылка зарегистрирована на устройстве #'%1' и может быть использована только на этом устройстве.
+
+«45» Общая Ошибка поиска архивной операции C2B
+
+«46» Ошибка поиска архивной операции C2B, по причине: %1
+
+«47» Для выяснения статуса возврата необходимо передать один из параметров запроса: messageID, trxId или opkcRefundRequestId
+
+«48» Возврат с messageID '%1' на устройстве #'%2' не обнаружен
+
+«49» По возврату с messageID '%1' не обнаружен Идентификатор Операции СБП B2C по сценарию Возврат по Операции СБП C2B
+
+«50» Идентификаторы Операции СБП B2C по сценарию Возврат по Операции СБП C2B переданный в запросе '%1' отличается от данных возврата '%2'
+полученного по messageID '%3'
+
+«51» Возврат по Идентификаторы Операции СБП B2C '%1' не обнаружен
+
+«52» Если передан реквизит opkcRefundRequestId запроса, то для выяснения статуса возврата необходимо также передать один из параметров запроса pa
+
+или originalTrxId
+
+«53» По данным payrrn '%1' не удалось определить Идентификатор исходной Операции СБП C2B
+
+«54» Не передан параметр LegalId
+
+«55» Не передан параметр quantity
+
+«67» ТСП '%1' не обнаружено с справочнике системы
+
+«68» Выплата по ТСП '%1' для устройства '%2' — запрещена
+
+«101» Тип запроса command='%1' не поддерживается
+
+«121» Возврат не может быть осуществлен, т. к. операция оплаты не имеет финального статуса
+
+«201» Получен отказ на запрос возврата. «Статус %1, Недостаточно средств на счете»
+
+«1001» «Сервис временно недоступен»
+
+«RQ00000» Запрос обработан успешно.
+
+«RQ00030» Согласие на выполнение платежа.
+
+«RQ00031» Ожидание решения по возврату от Банка Плательщика.
+
+«RQ02034» Некорректное значение code.
+
+12/23/25, 11:25 AM Приложения
+
+https://alfabank.ru/sme/payservice/sbp/docs/additional/?rp-menuOpen=1 3/8
+
+
+
+ErrorCode message
+
+«RQ03001» Ошибка валидации. Неверный формат запроса.
+
+«RQ05001» Значение agentId отсутствует в ОПКЦ СБП (Агент с указанным идентификатором не найден).
+
+«RQ05002» Значение memberId отсутствует в ОПКЦ СБП (участник с указанным идентификатором не найден).
+
+«RQ05003» Значение LegalId отсутствует в ОПКЦ СБП (юридическое лицо с указанным идентификатором не найдено).
+
+«RQ05004» Счет юридического лица не найден.
+
+«RQ05005» Значение merchantId отсутствует в ОПКЦ СБП (ТСП с указанным идентификатором не зарегистрировано в СБП).
+
+«RQ05006» Некорректное значение currency (код валюты).
+
+«RQ05007» Неверная версия шаблона Платежной или Информационной ссылки СБП (неверная версия шаблона QRC).
+
+«RQ05008» Неверный тип Платежной или Информационной ссылки СБП (неверный тип QRC).
+
+«RQ05009» Значение amount меньше минимально допустимого
+
+«RQ05010» Значение amount больше максимально допустимого
+
+«RQ05011» amount и currency должны одновременно присутствовать или одновременно отсутствовать при qrcType = 01 (QR-Static)
+
+«RQ05012» Отсутствует currency при qrcType = 02 (QR-Dynamic)
+
+«RQ05013» Отсутствует amount при qrcType = 02 (QR-Dynamic)
+
+«RQ05014» Значение qrcId не найдено
+
+«RQ05015» Превышено допустимое значение элементов в запросе
+
+«RQ05016» Некорректный формат qrcId
+
+«RQ05017» Некорректный формат или отсутствует paymentPurpose
+
+«RQ05018» Некорректный формат subscriptionPurpose
+
+«RQ05019» Отсутствует amount при активации Кассовой ссылки СБП
+
+«RQ05020» Период использования динамической Платежной ссылки СБП в поле qrTtl выходит за допустимый диапазон
+
+«RQ05021» Некорректный формат subscriptionToken
+
+«RQ05022» Невозможно деактивировать Кассовую ссылку СБП
+
+«RQ05023» qrTtl для Кассовой ссылки СБП выходит за допустимый диапазон
+
+«RQ05024» Некорректный формат redirectUrl
+
+«RQ05025» Отказ в смене счета ЮЛ, ИП или самозанятого. Кассовая ссылка СБП не деактивирована
+
+«RQ05026» Кассовая ссылка с указанным идентификатором уже существует
+
+«RQ05030» Отказ Банка Плательщика. Плательщик отказался от привязки счета
+
+«RQ05031» Отказ Банка Плательщика. Привязка счета не найдена
+
+«RQ05032» Отказ Банка Плательщика в выполнении платежа
+
+«RQ05033» Отказ в повторном платеже
+
+«RQ05034» Сценарий не поддерживается Банком Плательщика
+
+«RQ05035» Истекло время ожидания решения Банка Плательщика
+
+«RQ05036» Дублирование идентификатора запроса, назначаемого ТСП или Агентом ТСП, — agentRefundRequestId
+
+12/23/25, 11:25 AM Приложения
+
+https://alfabank.ru/sme/payservice/sbp/docs/additional/?rp-menuOpen=1 4/8
+
+
+
+ErrorCode message
+
+«RQ05037» Предыдущий запрос на возврат по Операции СБП C2B еще не обработан
+
+«RQ05038» Параметры запроса отличаются от параметров исходной Операции СБП C2B
+
+«RQ05039» Не найдена исходная Операция СБП C2B
+
+«RQ05040» Отказ от Банка Плательщика. Сумма возврата превышает сумму исходной Операции СБП C2B
+
+«RQ05041» Запрос на возврат по операции C2B не найден
+
+«RQ05042» Некорректный формат или отсутствует amount
+
+«RQ05043» Некорректный формат или отсутствует takeTax
+
+«RQ05044» Некорректный формат или отсутствует totalTaxAmount
+
+«RQ05045» Некорректный формат uip
+
+«RQ05046» Неверный тип платежной ссылки
+
+«RQ05047» Запрос на возврат с указанным идентификатором не найден
+
+«RQ05050» Сценарии с привязкой счета для ЮЛ/ИП недоступны
+
+«RQ05051» Решение выполнения оплаты с привязанного счета от Банка Плательщика еще не получено
+
+«RQ05052» Распоряжение от Банка Плательщика не было получено в ожидаемое время
+
+«RQ05053» От Банка Плательщика было получено положительное решение об оплате с привязанного счета Плательщика
+
+«RQ07999» Техническая ошибка
+
+Ошибки по методу GetQRCd
+
+Код Описание
+
+-1 Возникли проблемы при обработке запроса: <...>
+
+1 Внутренняя ошибка <...>
+
+3 Не заполнены данные: <...>
+
+8 Таймаут ответа, попробуйте позже
+
+26 Ошибка идентификации
+
+28 Запрос QR-кода не удался, не был получен Идентификатор QR-кода
+
+301 Некорректно заполнены данные данные: <...>
+
+100 Ошибка во время выполнения SQL-запроса для поиска AccountDR для TermNo=
+
+101 Ошибка во время выполнения SQL-запроса для проверки isUniQR для QrcId =
+
+999* Неизвестная ошибка. Необходимо уточнить статус операции
+
+Ошибки по методу GetQRCstatus
+
+Код Описание
+
+-1 Возникли проблемы при обработке запроса: <...>
+
+1 Внутренняя ошибка <...>
+
+12/23/25, 11:25 AM Приложения
+
+https://alfabank.ru/sme/payservice/sbp/docs/additional/?rp-menuOpen=1 5/8
+
+
+
+Код Описание
+
+2 Терминал <номер терминала> не обнаружен
+
+4 Не передан qrcId или payrrn
+
+5 Не получены данные от СПБ
+
+8 Таймаут ответа, попробуйте позже
+
+9 Ошибка идентификации, попробуйте позже
+
+16 Не передан параметр TermNo
+
+18 Платеж не найден в запросах B07,B23 <...>
+
+25 Терминал <номер терминала> заблокирован
+
+999* Неизвестная ошибка. Необходимо уточнить статус операции.
+
+Ошибки по методу GetQRCreversalData
+
+Код Описание
+
+-1 Возникли проблемы при обработке запроса: <текст с более подробным описанием ошибки>
+
+1 Внутренняя ошибка <текст с более подробным описанием ошибки>
+
+2 Терминал <номер терминала> не обнаружен
+
+3 Не заполнены данные: <текст с более подробным описанием ошибки>
+
+8 Таймаут ответа, попробуйте позже
+
+12 Не найдены данные для возврата
+
+16 Не передан параметр TermNo
+
+20 Получен отказ на запрос возврата. Статус <статус и при наличии код с текстом ошибки>
+
+21 Не удалось получить получателя перевода
+
+22 payrrn=<значение payrrn> в запросе не соответствует данным qrcId=<значение qrcId> у которого payrrn=<значение payrrn>
+
+23 Возврат невозможен для указанных параметров. Для payrrn=<значение payrrn> соответствует trxId=<значение trxId>, а в запросе получен <значение trxId>
+
+24 Возврат невозможен для указанных параметров. Для qrcId=<значение qrcId> соответствует trxId=<значение trxId>, а в запросе получен <значение trxId>
+
+25 Терминал <номер терминала> заблокирован
+
+27 Невозможно выполнить возврат по данному Терминалу, т.к. счёт зачисления не равен счёту списания
+
+29 Возврат невозможен. Для qrcId=<значение qrcId> не удалось найти успешный ответ на запрос GetQRCstatus
+
+40 Возврат невозможен. Для payrrn=<значение payrrn> не удалось найти успешный ответ на запрос GetQRCstatus
+
+1001 Превышено количество повторных запросов возврата B2C
+
+Ошибки по методу QRCreversal
+
+Код Описание
+
+-1 Возникли проблемы при обработке запроса: <текст с более подробным описанием ошибки>
+
+1 Внутренняя ошибка <текст с более подробным описанием ошибки>
+
+12/23/25, 11:25 AM Приложения
+
+https://alfabank.ru/sme/payservice/sbp/docs/additional/?rp-menuOpen=1 6/8
+
+
+
+Код Описание
+
+2 Терминал <номер терминала> не обнаружен
+
+3 Не заполнены данные: <текст с более подробным описанием ошибки>
+
+8 Таймаут ответа, попробуйте позже
+
+12 Не найдены данные для возврата
+
+13 Не найден успешный ответ на вызов GetQRCreversalData
+
+16 Не передан параметр TermNo
+
+20 Получен отказ на запрос возврата. Статус <статус и при наличии код с текстом ошибки>
+
+21 Не удалось получить получателя перевода
+
+22 payrrn=<значение payrrn> в запросе не соответствует данным qrcId=<значение qrcId> у которого payrrn=<значение payrrn>
+
+23 Возврат невозможен для указанных параметров. Для payrrn=<значение payrrn> соответствует trxId=<значение trxId>, а в запросе получен <значение trxId>
+
+24 Возврат невозможен для указанных параметров. Для qrcId=<значение qrcId> соответствует trxId=<значение trxId>, а в запросе получен <значение trxId>
+
+25 Терминал <номер терминала> заблокирован
+
+27 Невозможно выполнить возврат по данному Терминалу, т.к. счёт зачисления не равен счёту списания
+
+40 Возврат невозможен. Для payrrn=<значение payrrn> не удалось найти успешный ответ на запрос GetQRCstatus
+
+201 Получен отказ на запрос возврата. Статус <статус>, недостаточно средств на счёте
+
+999* Неизвестная ошибка. Необходимо уточнить статус операции
+
+Ошибки по методу ActivateCashQRc
+
+Код Описание
+
+-1 Возникли проблемы при обработке запроса: <текст с более подробным описанием ошибки>
+
+1 Внутренняя ошибка <...>
+
+2 Терминал <номер терминала> не обнаружен
+
+3 Не заполнены данные: <...>
+
+8 Таймаут ответа, попробуйте позже
+
+16 Не передан параметр TermNo
+
+25 Терминал <номер терминала> заблокирован
+
+28 Запрос QR-кода не удался, не был получен Идентификатор QR-кода
+
+41 При активации кассовой ссылки не удалось получить paramsId
+
+44 Кассовая ссылка зарегистрирована на устройстве #'<номер терминала>' и может быть использована только на этом устройстве
+
+301 Некорректно заполнены данные данные: <...>
+
+999* Неизвестная ошибка. Необходимо уточнить статус операции
+
+Коды ответов, направляемые в callback-уведомлении по сценарию «Оплата с привязанного счёта» по методу «resolution
+/notification»
+
+12/23/25, 11:25 AM Приложения
+
+https://alfabank.ru/sme/payservice/sbp/docs/additional/?rp-menuOpen=1 7/8
+
+
+
+ErrorCode message
+
+«RQ05031» Отказ Банка Плательщика. Привязка счёта не найдена
+
+«RQ05032» Отказ Банка Плательщика в проведении платежа
+
+«RQ05060» Недостаточно денежных средств для проведения операции
+
+«RQ05061» Превышен лимит по сумме операций по СБП
+
+«RQ05062» Превышен лимит по количеству операций по СБП
+
+«RQ05063» Подозрение в мошенничестве
+
+«RQ05064» Выполнение операций в данной категории ТСП запрещено
+
+«RQ05065» Счёт заблокирован
+
+«RQ05066» Счёт закрыт
+
+«RQ05067» Выполнение операции запрещено по требованию законодательства
+
+Примечание: Применение кода ответа «RQ05032» допускается не более, чем в 20% от общего числа отказов со стороны Банка
+Плательщика при выполнении Сценария «Оплата с привязанного счёта».
+
+Приложение 3. Пояснение для колонки «required»
+«y» — «Yes» обязательное;
+
+«o» — «Optional» (опционально);
+
+«y/o» — «Условно обязательное» определяется условиями запроса.
+
+Приложение 4. Пояснение для колонки «Тип данных»
+
+Нотация Описание
+
+a Символы латинского алфавита (A–Z и a–z) с десятичными кодами из диапазонов [065-090] и [097-122] в кодировке UTF-8;
+
+Символы русского алфавита (А-Я и а-я) с десятичными кодами из диапазона [1040-1103] в кодировке UTF-8.
+
+n Цифры 0-9 с десятичными кодами из диапазона [048-057] в кодировке UTF-8.
+
+an Символы латинского алфавита (A–Z и a–z) с десятичными кодами из диапазонов [065-090] и [097-122] в кодировке UTF-8;
+
+Символы русского алфавита (А-Я и а-я) с десятичными кодами из диапазона [1040-1103] в кодировке UTF-8;
+
+Цифры 0-9 с десятичными кодами из диапазона [048-057] в кодировке UTF-8.
+
+ans Символы латинского алфавита (A–Z и a–z) с десятичными кодами из диапазонов [065-090] и [097-122] в кодировке UTF-8;
+
+Символы русского алфавита (А-Я и а-я) с десятичными кодами из диапазона [1040-1103] в кодировке UTF-8;
+
+Цифры 0-9 с десятичными кодами из диапазона [048-057] в кодировке UTF-8;
+
+Специальные символы с десятичными кодами из диапазонов [032-047], [058-064], [091-096], [123-126] в кодировке UTF-8;
+
+Символ «№» под номером 8470 в кодировке UTF-8.
+
+12/23/25, 11:25 AM Приложения
+
+https://alfabank.ru/sme/payservice/sbp/docs/additional/?rp-menuOpen=1 8/8
+
+
diff --git a/_docs/laravel-libs/laravel-data/_index.md b/_docs/laravel-libs/laravel-data/_index.md
new file mode 100644
index 0000000..3bc4445
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/_index.md
@@ -0,0 +1,6 @@
+---
+title: v4
+slogan: Powerful data objects for Laravel
+githubUrl: https://github.com/spatie/laravel-data
+branch: main
+---
diff --git a/_docs/laravel-libs/laravel-data/about-us.md b/_docs/laravel-libs/laravel-data/about-us.md
new file mode 100644
index 0000000..8a137d1
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/about-us.md
@@ -0,0 +1,11 @@
+---
+title: About us
+weight: 9
+---
+
+[Spatie](https://spatie.be) is a webdesign agency based in Antwerp, Belgium.
+
+Open source software is used in all projects we deliver. Laravel, Nginx, Ubuntu are just a few
+of the free pieces of software we use every single day. For this, we are very grateful.
+When we feel we have solved a problem in a way that can help other developers,
+we release our code as open source software [on GitHub](https://spatie.be/open-source).
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/_index.md b/_docs/laravel-libs/laravel-data/advanced-usage/_index.md
new file mode 100644
index 0000000..12ccdad
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/_index.md
@@ -0,0 +1,4 @@
+---
+title: Advanced usage
+weight: 5
+---
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/available-property-mappers.md b/_docs/laravel-libs/laravel-data/advanced-usage/available-property-mappers.md
new file mode 100644
index 0000000..b64704d
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/available-property-mappers.md
@@ -0,0 +1,68 @@
+---
+title: Available property mappers
+weight: 19
+---
+
+In previous sections we've already seen how to [create](/docs/laravel-data/v4/as-a-data-transfer-object/mapping-property-names) data objects where the keys of the
+payload differ from the property names of the data object. It is also possible to [transform](/docs/laravel-data/v4/as-a-resource/mapping-property-names) data objects to an array/json/... where the keys of the payload differ
+from the property names of the data object.
+
+These mappings can be set manually put the package also provide a set of mappers that can be used to automatically map
+property names:
+
+```php
+use Spatie\LaravelData\Mappers\CamelCaseMapper;
+use Spatie\LaravelData\Mappers\SnakeCaseMapper;
+use Spatie\LaravelData\Mappers\KebabCaseMapper;
+use Spatie\LaravelData\Mappers\ProvidedNameMapper;
+use Spatie\LaravelData\Mappers\StudlyCaseMapper;
+use Spatie\LaravelData\Mappers\LowerCaseMapper;
+use Spatie\LaravelData\Mappers\UpperCaseMapper;
+
+class ContractData extends Data
+{
+ public function __construct(
+ #[MapName(CamelCaseMapper::class)]
+ public string $name,
+ #[MapName(SnakeCaseMapper::class)]
+ public string $recordCompany,
+ #[MapName(KebabCaseMapper::class)]
+ public string $vatNumber,
+ #[MapName(new ProvidedNameMapper('country field'))]
+ public string $country,
+ #[MapName(StudlyCaseMapper::class)]
+ public string $cityName,
+ #[MapName(LowerCaseMapper::class)]
+ public string $addressLine1,
+ #[MapName(UpperCaseMapper::class)]
+ public string $addressLine2,
+ ) {
+ }
+}
+```
+
+Creating the data object can now be done as such:
+
+```php
+ContractData::from([
+ 'name' => 'Rick Astley',
+ 'record_company' => 'RCA Records',
+ 'country field' => 'Belgium',
+ 'CityName' => 'Antwerp',
+ 'addressline1' => 'some address line 1',
+ 'ADDRESSLINE2' => 'some address line 2',
+]);
+```
+
+When transforming such a data object the payload will look like this:
+
+```json
+{
+ "name" : "Rick Astley",
+ "record_company" : "RCA Records",
+ "country field" : "Belgium",
+ "CityName" : "Antwerp",
+ "addressline1" : "some address line 1",
+ "ADDRESSLINE2" : "some address line 2"
+}
+```
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/commands.md b/_docs/laravel-libs/laravel-data/advanced-usage/commands.md
new file mode 100644
index 0000000..9e37e90
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/commands.md
@@ -0,0 +1,45 @@
+---
+title: Commands
+weight: 16
+---
+
+## make:data
+
+You can easily generate new data objects with the artisan command `make:data`:
+
+```shell
+php artisan make:data PostData
+```
+
+By default, this command puts data objects in the `App\Data` namespace, this can be changed as such:
+
+```shell
+php artisan make:data PostData --namespace=DataTransferObjects
+```
+
+By default, the command creates a new data object within the `\App\Data` namespace and suffixes the class with `Data`, this can be changed by adding the following lines to the `data.php` config file:
+
+```php
+'commands' => [
+ /*
+ * Provides default configuration for the `make:data` command. These settings can be overridden with options
+ * passed directly to the `make:data` command for generating single Data classes, or if not set they will
+ * automatically fall back to these defaults. See `php artisan make:data --help` for more information
+ */
+ 'make' => [
+ /*
+ * The default namespace for generated Data classes. This exists under the application's root namespace,
+ * so the default 'Data` will end up as '\App\Data', and generated Data classes will be placed in the
+ * app/Data/ folder. Data classes can live anywhere, but this is where `make:data` will put them.
+ */
+ 'namespace' => 'Data',
+
+ /*
+ * This suffix will be appended to all data classes generated by make:data, so that they are less likely
+ * to conflict with other related classes, controllers or models with a similar name without resorting
+ * to adding an alias for the Data object. Set to a blank string (not null) to disable.
+ */
+ 'suffix' => 'Data',
+ ],
+]
+```
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/creating-a-cast.md b/_docs/laravel-libs/laravel-data/advanced-usage/creating-a-cast.md
new file mode 100644
index 0000000..5929c6b
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/creating-a-cast.md
@@ -0,0 +1,139 @@
+---
+title: Creating a cast
+weight: 6
+---
+
+Casts take simple values and cast them into complex types. For example, `16-05-1994T00:00:00+00` could be cast into a `Carbon` object with the same date.
+
+A cast implements the following interface:
+
+```php
+interface Cast
+{
+ public function cast(DataProperty $property, mixed $value, array $properties, CreationContext $context): mixed;
+}
+```
+
+A cast receives the following:
+
+- **property** a `DataProperty` object which represents the property for which the value is cast. You can read more about the internal structures of the package [here](/docs/laravel-data/v4/advanced-usage/internal-structures)
+- **value** the value that should be cast
+- **properties** an array of the current properties that will be used to create the data object
+- **creationContext** the context in which the data object is being created you'll find the following info here:
+ - **dataClass** the data class which is being created
+ - **validationStrategy** the validation strategy which is being used
+ - **mapPropertyNames** whether property names should be mapped
+ - **disableMagicalCreation** whether to use the magical creation methods or not
+ - **ignoredMagicalMethods** the magical methods which are ignored
+ - **casts** a collection of global casts
+
+In the end, the cast should return a casted value.
+
+When the cast is unable to cast the value, an `Uncastable` object should be returned.
+
+## Null
+
+A cast like a transformer never receives a `null` value, this is because the package will always keep a `null` value as `null` because we don't want to create values out of thin air. If you want to replace a `null` value, then use a magic method.
+
+## Castables
+
+You may want to allow your application's value objects to define their own custom casting logic. Instead of attaching the custom cast class to your object, you may alternatively attach a value object class that implements the `Spatie\LaravelData\Casts\Castable` interface:
+
+```php
+class ForgotPasswordRequest extends Data
+{
+ public function __construct(
+ #[WithCastable(Email::class)]
+ public Email $email,
+ ) {
+ }
+}
+```
+
+When using `Castable` classes, you may still provide arguments in the `WithCastable` attribute. The arguments will be passed to the `dataCastUsing` method:
+
+```php
+class DuplicateEmailCheck extends Data
+{
+ public function __construct(
+ #[WithCastable(Email::class, normalize: true)]
+ public Email $email,
+ ) {
+ }
+}
+```
+
+By combining "castables" with PHP's [anonymous classes](https://www.php.net/manual/en/language.oop5.anonymous.php), you may define a value object and its casting logic as a single castable object. To accomplish this, return an anonymous class from your value object's `dataCastUsing` method. The anonymous class should implement the `Cast` interface:
+
+```php
+type` to get the type the items should be transformed into.
+
+## Combining casts and transformers
+
+You can combine casts and transformers in one class:
+
+```php
+class ToUpperCastAndTransformer implements Cast, Transformer
+{
+ public function cast(DataProperty $property, mixed $value, array $properties, CreationContext $context): string
+ {
+ return strtoupper($value);
+ }
+
+ public function transform(DataProperty $property, mixed $value, TransformationContext $context): string
+ {
+ return strtoupper($value);
+ }
+}
+```
+
+Within your data object, you can use the `WithCastAndTransformer` attribute to use the cast and transformer:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ #[WithCastAndTransformer(SomeCastAndTransformer::class)]
+ public string $artist,
+ ) {
+ }
+}
+```
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/creating-a-rule-inferrer.md b/_docs/laravel-libs/laravel-data/advanced-usage/creating-a-rule-inferrer.md
new file mode 100644
index 0000000..be6cfa2
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/creating-a-rule-inferrer.md
@@ -0,0 +1,63 @@
+---
+title: Creating a rule inferrer
+weight: 8
+---
+
+Rule inferrers will try to infer validation rules for properties within a data object.
+
+A rule inferrer can be created by implementing the `RuleInferrer` interface:
+
+```php
+interface RuleInferrer
+{
+ public function handle(DataProperty $property, PropertyRules $rules, ValidationContext $context): PropertyRules;
+}
+```
+
+A collection of previous inferred rules is given, and a `DataProperty` object which represents the property for which the value is transformed. You can read more about the internal structures of the package [here](/docs/laravel-data/v4/advanced-usage/internal-structures).
+
+The `ValidationContext` is also injected, this contains the following info:
+
+- **payload** the current payload respective to the data object which is being validated
+- **fullPayload** the full payload which is being validated
+- **validationPath** the path from the full payload to the current payload
+
+The `RulesCollection` contains all the rules for the property represented as `ValidationRule` objects.
+
+You can add new rules to it:
+
+```php
+$rules->add(new Min(42));
+```
+
+When adding a rule of the same kind, a previous version of the rule will be removed:
+
+```php
+$rules->add(new Min(42));
+$rules->add(new Min(314));
+
+$rules->all(); // [new Min(314)]
+```
+
+Adding a string rule can be done as such:
+
+```php
+$rules->add(new Rule('min:42'));
+```
+
+You can check if the collection contains a type of rule:
+
+```php
+$rules->hasType(Min::class);
+```
+
+Or remove certain types of rules:
+
+```php
+$rules->removeType(Min::class);
+```
+
+In the end, a rule inferrer should always return a `RulesCollection`.
+
+Rule inferrers need to be manually defined within the `data.php` config file.
+
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/creating-a-transformer.md b/_docs/laravel-libs/laravel-data/advanced-usage/creating-a-transformer.md
new file mode 100644
index 0000000..7555958
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/creating-a-transformer.md
@@ -0,0 +1,60 @@
+---
+title: Creating a transformer
+weight: 7
+---
+
+Transformers take complex values and transform them into simple types. For example, a `Carbon` object could be transformed to `16-05-1994T00:00:00+00`.
+
+A transformer implements the following interface:
+
+```php
+interface Transformer
+{
+ public function transform(DataProperty $property, mixed $value, TransformationContext $context): mixed;
+}
+```
+
+The following parameters are provided:
+
+- **property**: a `DataProperty` object which represents the property for which the value is transformed. You can read more about the internal structures of the package [here](/docs/laravel-data/v4/advanced-usage/internal-structures)
+- **value**: the value that should be transformed, this will never be `null`
+- **context**: a `TransformationContext` object which contains the current transformation context with the following properties:
+ - **transformValues** indicates if values should be transformed or not
+ - **mapPropertyNames** indicates if property names should be mapped or not
+ - **wrapExecutionType** the execution type that should be used for wrapping values
+ - **transformers** a collection of transformers that can be used to transform values
+
+In the end, the transformer should return a transformed value.
+
+## Combining transformers and casts
+
+You can transformers and casts in one class:
+
+```php
+class ToUpperCastAndTransformer implements Cast, Transformer
+{
+ public function cast(DataProperty $property, mixed $value, array $properties, CreationContext $context): string
+ {
+ return strtoupper($value);
+ }
+
+ public function transform(DataProperty $property, mixed $value, TransformationContext $context): string
+ {
+ return strtoupper($value);
+ }
+}
+```
+
+Within your data object, you can use the `WithCastAndTransformer` attribute to use the cast and transformer:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ #[WithCastAndTransformer(SomeCastAndTransformer::class)]
+ public string $artist,
+ ) {
+ }
+}
+```
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/eloquent-casting.md b/_docs/laravel-libs/laravel-data/advanced-usage/eloquent-casting.md
new file mode 100644
index 0000000..56f3aca
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/eloquent-casting.md
@@ -0,0 +1,246 @@
+---
+title: Eloquent casting
+weight: 1
+---
+
+Since data objects can be created from arrays and be easily transformed into arrays back again, they are excellent to be used
+with [Eloquent casts](https://laravel.com/docs/eloquent-mutators#custom-casts):
+
+```php
+class Song extends Model
+{
+ protected $casts = [
+ 'artist' => ArtistData::class,
+ ];
+}
+```
+
+Now you can store a data object in a model as such:
+
+```php
+Song::create([
+ 'artist' => new ArtistData(name: 'Rick Astley', age: 22),
+]);
+```
+
+It is also possible to use an array representation of the data object:
+
+```php
+Song::create([
+ 'artist' => [
+ 'name' => 'Rick Astley',
+ 'age' => 22
+ ]
+]);
+```
+
+This will internally be converted to a data object which you can later retrieve as such:
+
+```php
+Song::findOrFail($id)->artist; // ArtistData object
+```
+
+### Abstract data objects
+
+Sometimes you have an abstract parent data object with multiple child data objects, for example:
+
+```php
+abstract class RecordConfig extends Data
+{
+ public function __construct(
+ public int $tracks,
+ ) {}
+}
+
+class CdRecordConfig extends RecordConfig
+{
+ public function __construct(
+ int $tracks,
+ public int $bytes,
+ ) {
+ parent::__construct($tracks);
+ }
+}
+
+class VinylRecordConfig extends RecordConfig
+{
+ public function __construct(
+ int $tracks,
+ public int $rpm,
+ ) {
+ parent::__construct($tracks);
+ }
+}
+```
+
+A model can have a JSON field which is either one of these data objects:
+
+```php
+class Record extends Model
+{
+ protected $casts = [
+ 'config' => RecordConfig::class,
+ ];
+}
+```
+
+You can then store either a `CdRecordConfig` or a `VinylRecord` in the `config` field:
+
+```php
+$cdRecord = Record::create([
+ 'config' => new CdRecordConfig(tracks: 12, bytes: 1000),
+]);
+
+$vinylRecord = Record::create([
+ 'config' => new VinylRecordConfig(tracks: 12, rpm: 33),
+]);
+
+$cdRecord->config; // CdRecordConfig object
+$vinylRecord->config; // VinylRecordConfig object
+```
+
+When a data object class is abstract and used as an Eloquent cast, then this feature will work out of the box.
+
+The child data object value of the model will be stored in the database as a JSON string with the class name and the data object properties:
+
+```json
+{
+ "type": "\\App\\Data\\CdRecordConfig",
+ "data": {
+ "tracks": 12,
+ "bytes": 1000
+ }
+}
+```
+
+When retrieving the model, the data object will be instantiated based on the `type` key in the JSON string.
+
+#### Abstract data object with collection
+
+You can use with collection.
+
+```php
+class Record extends Model
+{
+ protected $casts = [
+ 'configs' => DataCollection::class . ':' . RecordConfig::class,
+ ];
+}
+```
+
+#### Abstract data class morphs
+
+By default, the `type` key in the JSON string will be the fully qualified class name of the child data object. This can break your application quite easily when you refactor your code. To prevent this, you can add a morph map like with [Eloquent models](https://laravel.com/docs/eloquent-relationships#polymorphic-relationships). Within your `AppServiceProvivder` you can add the following mapping:
+
+```php
+use Spatie\LaravelData\Support\DataConfig;
+
+app(DataConfig::class)->enforceMorphMap([
+ 'cd_record_config' => CdRecordConfig::class,
+ 'vinyl_record_config' => VinylRecordConfig::class,
+]);
+```
+
+## Casting data collections
+
+It is also possible to store data collections in an Eloquent model:
+
+```php
+class Artist extends Model
+{
+ protected $casts = [
+ 'songs' => DataCollection::class.':'.SongData::class,
+ ];
+}
+```
+
+A collection of data objects within the Eloquent model can be made as such:
+
+```php
+Artist::create([
+ 'songs' => [
+ new SongData(title: 'Never gonna give you up', artist: 'Rick Astley'),
+ new SongData(title: 'Together Forever', artist: 'Rick Astley'),
+ ],
+]);
+```
+
+It is also possible to provide an array instead of a data object to the collection:
+
+```php
+Artist::create([
+ 'songs' => [
+ ['title' => 'Never gonna give you up', 'artist' => 'Rick Astley'],
+ ['title' => 'Together Forever', 'artist' => 'Rick Astley']
+ ],
+]);
+```
+
+## Using defaults for null database values
+
+By default, if a database value is `null`, then the model attribute will also be `null`. However, sometimes you might want to instantiate the attribute with some default values.
+
+To achieve this, you may provide an additional `default` [Cast Parameter](https://laravel.com/docs/eloquent-mutators#cast-parameters) to ensure the caster gets instantiated.
+
+```php
+class Song extends Model
+{
+ protected $casts = [
+ 'artist' => ArtistData::class . ':default',
+ ];
+}
+```
+
+This will ensure that the `ArtistData` caster is instantiated even when the `artist` attribute in the database is `null`.
+
+You may then specify some default values in the cast which will be used instead.
+
+```php
+class ArtistData extends Data
+{
+ public string $name = 'Default name';
+}
+```
+
+```php
+Song::findOrFail($id)->artist->name; // 'Default name'
+```
+
+### Nullable collections
+
+You can also use the `default` argument in the case where you _always_ want a `DataCollection` to be returned.
+
+The first argument (after `:`) should always be the data class to be used with the `DataCollection`, but you can add `default` as a comma separated second argument.
+
+```php
+class Artist extends Model
+{
+ protected $casts = [
+ 'songs' => DataCollection::class.':'.SongData::class.',default',
+ ];
+}
+```
+
+```php
+$artist = Artist::create([
+ 'songs' => null
+]);
+
+$artist->songs; // DataCollection
+$artist->songs->count();// 0
+```
+
+## Using encryption with data objects and collections
+
+Similar to Laravel's native encrypted casts, you can also encrypt data objects and collections.
+
+When retrieving the model, the data object will be decrypted automatically.
+
+```php
+class Artist extends Model
+{
+ protected $casts = [
+ 'songs' => DataCollection::class.':'.SongData::class.',encrypted',
+ ];
+}
+```
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/get-data-from-a-class-quickly.md b/_docs/laravel-libs/laravel-data/advanced-usage/get-data-from-a-class-quickly.md
new file mode 100644
index 0000000..b04de97
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/get-data-from-a-class-quickly.md
@@ -0,0 +1,55 @@
+---
+title: Get data from a class quickly
+weight: 15
+---
+
+By adding the `WithData` trait to a Model, Request or any class that can be magically be converted to a data object,
+you'll enable support for the `getData` method. This method will automatically generate a data object for the object it
+is called upon.
+
+For example, let's retake a look at the `Song` model we saw earlier. We can add the `WithData` trait as follows:
+
+```php
+class Song extends Model
+{
+ use WithData;
+
+ protected $dataClass = SongData::class;
+}
+```
+
+Now we can quickly get the data object for the model as such:
+
+```php
+Song::firstOrFail($id)->getData(); // A SongData object
+```
+
+We can do the same with a FormRequest, we don't use a property here to define the data class but use a method instead:
+
+```php
+class SongRequest extends FormRequest
+{
+ use WithData;
+
+ protected function dataClass(): string
+ {
+ return SongData::class;
+ }
+}
+```
+
+Now within a controller where the request is injected, we can get the data object like this:
+
+```php
+class SongController
+{
+ public function __invoke(SongRequest $request): SongData
+ {
+ $data = $request->getData();
+
+ $song = Song::create($data->toArray());
+
+ return $data;
+ }
+}
+```
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/in-packages.md b/_docs/laravel-libs/laravel-data/advanced-usage/in-packages.md
new file mode 100644
index 0000000..71fa68e
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/in-packages.md
@@ -0,0 +1,23 @@
+---
+title: In Packages
+weight: 18
+---
+
+## Testing
+
+When you're developing a package, running into config access issues is quite common, especially when using the magic from factory method, which won't resolve the factory instance without the config. Simply include our Provider in your package's TestCase, and you're all set.
+
+```php
+use Orchestra\Testbench\TestCase as Orchestra;
+
+class TestCase extends Orchestra
+{
+ protected function getPackageProviders($app)
+ {
+ return [
+ LaravelDataServiceProvider::class,
+ // Register additional service providers to use with your tests
+ ];
+ }
+}
+```
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/internal-structures.md b/_docs/laravel-libs/laravel-data/advanced-usage/internal-structures.md
new file mode 100644
index 0000000..27a4a74
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/internal-structures.md
@@ -0,0 +1,126 @@
+---
+title: Internal structures
+weight: 11
+---
+
+This package has some internal structures which are used to analyze data objects and their properties. They can be
+helpful when writing casts, transformers or rule inferrers.
+
+## DataClass
+
+The DataClass represents the structure of a data object and has the following properties:
+
+- `name` the name of the data class
+- `properties` all the `DataProperty`'s of the class (more on that later)
+- `methods` all the magical creation `DataMethod`s of the class (more on that later)
+- `constructorMethod` the constructor `DataMethod` of the class
+- `isReadOnly` is the class read only
+- `isAbstract` is the class abstract
+- `appendable` is the class implementing `AppendableData`
+- `includeable` is the class implementing `IncludeableData`
+- `responsable` is the class implementing `ResponsableData`
+- `transformable` is the class implementing `TransformableData`
+- `validatable` is the class implementing `ValidatableData`
+- `wrappable` is the class implementing `WrappableData`
+- `emptyData` the the class implementing `EmptyData`
+- `attributes` a collection of resolved attributes assigned to the class
+- `dataCollectablePropertyAnnotations` the property annotations of the class used to infer the data collection type
+- `allowedRequestIncludes` the allowed request includes of the class
+- `allowedRequestExcludes` the allowed request excludes of the class
+- `allowedRequestOnly` the allowed request only of the class
+- `allowedRequestExcept` the allowed request except of the class
+- `outputMappedProperties` properties names which are mapped when transforming the data object
+- `transformationFields` structure of the transformation fields
+
+## DataProperty
+
+A data property represents a single property within a data object.
+
+- `name` the name of the property
+- `className` the name of the class of the property
+- `type` the `DataPropertyType` of the property (more on that later)
+- `validate` should the property be automatically validated
+- `computed` is the property computed
+- `hidden` will the property be hidden when transforming the data object
+- `isPromoted` is the property constructor promoted
+- `isReadOnly` is the property read only
+- `hasDefaultValue` has the property a default value
+- `defaultValue` the default value of the property
+- `cast` the cast assigned to the property
+- `transformer` the transformer assigned to the property
+- `inputMappedName` the name used to map a property name given
+- `outputMappedName` the name used to map a property name onto
+- `attributes` a collection of resolved attributes assigned to the property
+
+## DataMethod
+
+A data method represents a method within a data object.
+
+- `name` the name of the method
+- `parameters` all the `DataParameter`'s and `DataProperty`s of the method (more on that later)
+- `isStatic` whether the method is static
+- `isPublic` whether the method is public
+- `isCustomCreationMethod` whether the method is a custom creation method (=magical creation method)
+- `returnType` the `DataType` of the return value (more on that later)
+
+## DataParameter
+
+A data parameter represents a single parameter/property within a data method.
+
+- `name` the name of the parameter
+- `isPromoted` is the property/parameter constructor promoted
+- `hasDefaultValue` has the parameter a default value
+- `defaultValue` the default value of the parameter
+- `type` the `DataType` of the parameter (more on that later)
+
+## DataType
+
+A data type represents a type within a data object.
+
+- `Type` can be a `NamedType`, `UnionType` or `IntersectionType` (more on that later)
+- `isNullable` can the type be nullable
+- `isMixed` is the type a mixed type
+- `kind` the `DataTypeKind` of the type (more on that later)
+
+## DataPropertyType
+
+Extends from the `DataType` and has the following additional properties:
+
+- `isOptional` can the type be optional
+- `lazyType` the class of the lazy type for the property
+- `dataClass` the data object class of the property or the data object class of the collection it collects
+- `dataCollectableClass` the collectable type of the data objects
+- `kind` the `DataTypeKind` of the type (more on that later)
+
+## DataTypeKind
+
+An enum representing the kind of type of a property/parameter with respect to the package:
+
+- Default: a non package specific type
+- DataObject: a data object
+- DataCollection: a `DataCollection` of data objects
+- DataPaginatedCollection: a `DataPaginatedCollection` of data objects
+- DataCursorPaginatedCollection: a `DataCursorPaginatedCollection` of data objects
+- DataArray: an array of data objects
+- DataEnumerable: a `Enumerable` of data objects
+- DataPaginator: a `Paginator` of data objects
+- DataCursorPaginator: a `CursorPaginator` of data objects
+
+## NamedType
+
+Represents a named PHP type with the following properties:
+
+- `name` the name of the type
+- `builtIn` is the type a built-in type
+- `acceptedTypes` an array of accepted types as string
+- `kind` the `DataTypeKind` of the type (more on that later)
+- `dataClass` the data object class of the property or the data object class of the collection it collects
+- `dataCollectableClass` the collectable type of the data objects
+- `isCastable` wetter the type is a `Castable`
+
+## UnionType / IntersectionType
+
+Represents a union or intersection of types with the following properties:
+
+- `types` an array of types (can be `NamedType`, `UnionType` or `IntersectionType`)
+
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/mapping-rules.md b/_docs/laravel-libs/laravel-data/advanced-usage/mapping-rules.md
new file mode 100644
index 0000000..33c3f93
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/mapping-rules.md
@@ -0,0 +1,72 @@
+---
+title: Mapping rules
+weight: 13
+---
+
+It is possible to map the names properties going in and out of your data objects using: `MapOutputName`, `MapInputName`
+and `MapName` attributes. But sometimes it can be quite hard to follow where which name can be used. Let's go through
+some case:
+
+In the data object:
+
+```php
+class UserData extends Data
+ {
+ public function __construct(
+ #[MapName('favorite_song')] // name mapping
+ public Lazy|SongData $song,
+ #[RequiredWith('song')] // In validation rules, use the original name
+ public string $title,
+ ) {
+ }
+
+ public static function allowedRequestExcept(): ?array
+ {
+ return [
+ 'song', // Use the original name when defining includes, excludes, excepts and only
+ ];
+ }
+
+ public function rules(ValidContext $context): array {
+ return [
+ 'song' => 'required', // Use the original name when defining validation rules
+ ];
+ }
+
+ // ...
+ }
+ ```
+
+When creating a data object:
+
+```php
+UserData::from([
+ 'favorite_song' => ..., // You can use the mapped or original name here
+ 'title' => 'some title'
+]);
+```
+
+When adding an include, exclude, except or only:
+
+```php
+ UserData::from(User::first())->except('song'); // Always use the original name here
+```
+
+Within a request query, you can use the mapped or original name:
+
+```
+https://spatie.be/my-account?except[]=favorite_song
+```
+
+When validating a data object or getting rules for a data object, always use the original name:
+
+```php
+$data = [
+ 'favorite_song' => 123,
+ 'title' => 'some title',
+];
+
+UserData::validate($data)
+UserData::getValidationRules($data)
+```
+
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/normalizers.md b/_docs/laravel-libs/laravel-data/advanced-usage/normalizers.md
new file mode 100644
index 0000000..5b9006b
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/normalizers.md
@@ -0,0 +1,66 @@
+---
+title: Normalizers
+weight: 4
+---
+
+This package allows you to dynamically create data objects from any kind of object. For example, you can use an
+eloquent model to create a data object like this:
+
+```php
+SongData::from(Song::findOrFail($id));
+```
+
+A `Normalizer` will take a payload like a model and will transform it into an array, so it can be used in the pipeline (see further).
+
+By default, there are five normalizers:
+
+- **ModelNormalizer** will cast eloquent models
+- **ArrayableNormalizer** will cast `Arrayable`'s
+- **ObjectNormalizer** will cast `stdObject`'s
+- **ArrayNormalizer** will cast arrays
+- **JsonNormalizer** will cast json strings
+
+A sixth normalizer can be optionally enabled:
+
+- **FormRequestNormalizer** will normalize a form request by calling the `validated` method
+
+Normalizers can be globally configured in `config/data.php`, and can be configured on a specific data object by overriding the `normalizers` method.
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ // ...
+ ) {
+ }
+
+ public static function normalizers(): array
+ {
+ return [
+ ModelNormalizer::class,
+ ArrayableNormalizer::class,
+ ObjectNormalizer::class,
+ ArrayNormalizer::class,
+ JsonNormalizer::class,
+ ];
+ }
+}
+```
+
+A normalizer implements the `Normalizer` interface and should return an array representation of the payload, or null if it cannot normalize the payload:
+
+```php
+class ArrayableNormalizer implements Normalizer
+{
+ public function normalize(mixed $value): ?array
+ {
+ if (! $value instanceof Arrayable) {
+ return null;
+ }
+
+ return $value->toArray();
+ }
+}
+```
+
+Normalizers are executed in the same order as they are defined in the `normalize` method. The first normalizer not returning null will be used to normalize the payload. Magical creation methods always have precedence over normalizers.
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/performance.md b/_docs/laravel-libs/laravel-data/advanced-usage/performance.md
new file mode 100644
index 0000000..d1efe69
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/performance.md
@@ -0,0 +1,88 @@
+---
+title: Performance
+weight: 15
+---
+
+Laravel Data is a powerful package that leverages PHP reflection to infer as much information as possible. While this approach provides a lot of benefits, it does come with a minor performance overhead. This overhead is typically negligible during development, but it can become noticeable in a production environment with a large number of data objects.
+
+Fortunately, Laravel Data is designed to operate efficiently without relying on reflection. It achieves this by allowing you to cache the results of its complex analysis. This means that the performance cost is incurred only once, rather than on every request. By caching the analysis results before deploying your application to production, you ensure that a pre-analyzed, cached version of the data objects is used, significantly improving performance.
+
+## Caching
+
+Laravel Data provides a command to cache the analysis results of your data objects. This command will analyze all of your data objects and store the results in a Laravel cache of your choice:
+
+```
+php artisan data:cache-structures
+```
+
+That's it, the command will search for all the data objects in your application and cache the analysis results. Be sure to always run this command after creating or modifying a data object or when deploying your application to production.
+
+## Configuration
+
+The caching mechanism can be configured in the `data.php` config file. By default, the cache store is set to the default cache store of your application. You can change this to any other cache driver supported by Laravel. A prefix can also be set for the cache keys stored:
+
+```php
+'structure_caching' => [
+ 'cache' => [
+ 'store' => 'redis',
+ 'prefix' => 'laravel-data',
+ ],
+],
+```
+
+To find the data classes within your application, we're using the [php-structure-discoverer](https://github.com/spatie/php-structure-discoverer) package. This package allows you to configure the directories that will be searched for data objects. By default, the `app/data` directory is searched recursively. You can change this to any other directory or directories:
+
+```php
+'structure_caching' => [
+ 'directories' => [
+ app_path('Data'),
+ ],
+],
+```
+
+Structure discoverer uses reflection (enabled by default) or a PHP parser to find the data objects. You can disable the reflection-based discovery and thus use the PHP parser discovery as such:
+
+```php
+'structure_caching' => [
+ 'reflection_discovery' => [
+ 'enabled' => false,
+ ],
+],
+```
+
+Since we cannot depend on reflection, we need to tell the parser what data objects are exactly and where to find them. This can be done by adding the laravel-data directory to the config directories:
+
+```php
+'structure_caching' => [
+ 'directories' => [
+ app_path('Data'),
+ base_path('vendor/spatie/laravel-data/src'),
+ ],
+],
+```
+
+When using reflection discovery, the base directory and root namespace can be configured as such if you're using a non-standard directory structure or namespace
+
+```php
+'structure_caching' => [
+ 'reflection_discovery' => [
+ 'enabled' => true,
+ 'base_path' => base_path(),
+ 'root_namespace' => null,
+ ],
+],
+```
+
+The caching mechanism can be disabled by setting the `enabled` option to `false`:
+
+```php
+'structure_caching' => [
+ 'enabled' => false,
+],
+```
+
+You can read more about reflection discovery [here](https://github.com/spatie/php-structure-discoverer#parsers).
+
+## Testing
+
+When running tests, the cache is automatically disabled. This ensures that the analysis results are always up-to-date during development and testing. And that the cache won't interfere with your caching mocks.
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/pipeline.md b/_docs/laravel-libs/laravel-data/advanced-usage/pipeline.md
new file mode 100644
index 0000000..e2aec83
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/pipeline.md
@@ -0,0 +1,125 @@
+---
+title: Pipeline
+weight: 5
+---
+
+The data pipeline allows you to configure how data objects are constructed from a payload. In the previous chapter we
+saw that a data object created from a payload will be first normalized into an array. This array is passed into the
+pipeline.
+
+The pipeline exists of multiple pipes which will transform the normalized data into a collection of property values
+which can be passed to the data object constructor.
+
+By default, the pipeline exists of the following pipes:
+
+- **AuthorizedDataPipe** checks if the user is authorized to perform the request
+- **MapPropertiesDataPipe** maps the names of properties
+- **FillRouteParameterPropertiesDataPipe** fills property values from route parameters
+- **ValidatePropertiesDataPipe** validates the properties
+- **DefaultValuesDataPipe** adds default values for properties when they are not set
+- **CastPropertiesDataPipe** casts the values of properties
+
+Each result of the previous pipe is passed on into the next pipe, you can define the pipes on an individual data object
+as such:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ // ...
+ ) {
+ }
+
+ public static function pipeline(): DataPipeline
+ {
+ return DataPipeline::create()
+ ->into(static::class)
+ ->through(AuthorizedDataPipe::class)
+ ->through(MapPropertiesDataPipe::class)
+ ->through(FillRouteParameterPropertiesDataPipe::class)
+ ->through(ValidatePropertiesDataPipe::class)
+ ->through(DefaultValuesDataPipe::class)
+ ->through(CastPropertiesDataPipe::class);
+ }
+}
+```
+
+Each pipe implements the `DataPipe` interface and should return an `array` of properties:
+
+```php
+interface DataPipe
+{
+ public function handle(mixed $payload, DataClass $class, array $properties, CreationContext $creationContext): array;
+}
+```
+
+The `handle` method has several arguments:
+
+- **payload** the non normalized payload
+- **class** the `DataClass` object for the data
+ object [more info](/docs/laravel-data/v4/advanced-usage/internal-structures)
+- **properties** the key-value properties which will be used to construct the data object
+- **creationContext** the context in which the data object is being created you'll find the following info here:
+ - **dataClass** the data class which is being created
+ - **validationStrategy** the validation strategy which is being used
+ - **mapPropertyNames** whether property names should be mapped
+ - **disableMagicalCreation** whether to use the magical creation methods or not
+ - **ignoredMagicalMethods** the magical methods which are ignored
+ - **casts** a collection of global casts
+
+When using a magic creation methods, the pipeline is not being used (since you manually overwrite how a data object is
+constructed). Only when you pass in a request object a minimal version of the pipeline is used to authorize and validate
+the request.
+
+## Preparing data for the pipeline
+
+Sometimes you need to make some changes to the payload after it has been normalized, but before they are sent into the data pipeline. You can do this using the `prepareForPipeline` method as follows:
+
+```php
+class SongMetadata
+{
+ public function __construct(
+ public string $releaseYear,
+ public string $producer,
+ ) {}
+}
+
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public SongMetadata $metadata,
+ ) {}
+
+ public static function prepareForPipeline(array $properties): array
+ {
+ $properties['metadata'] = Arr::only($properties, ['release_year', 'producer']);
+
+ return $properties;
+ }
+}
+```
+
+Now it is possible to create a data object as follows:
+
+```php
+$songData = SongData::from([
+ 'title' => 'Never gonna give you up',
+ 'release_year' => '1987',
+ 'producer' => 'Stock Aitken Waterman',
+]);
+```
+
+## Extending the pipeline within your data class
+
+Sometimes you want to send your payload first through a certain pipe without creating a whole new pipeline, this can be done as such:
+
+```php
+class SongData extends Data
+{
+ public static function pipeline(): DataPipeline
+ {
+ return parent::pipeline()->firstThrough(GuessCasingForKeyDataPipe::class);
+ }
+}
+```
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/traits-and-interfaces.md b/_docs/laravel-libs/laravel-data/advanced-usage/traits-and-interfaces.md
new file mode 100644
index 0000000..b6a02e8
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/traits-and-interfaces.md
@@ -0,0 +1,60 @@
+---
+title: Traits and interfaces
+weight: 17
+---
+
+Laravel data, is built to be as flexible as possible. This means that you can use it in any way you want.
+
+For example, the `Data` class we've been using throughout these docs is a class implementing a few data interfaces and traits:
+
+```php
+use Illuminate\Contracts\Support\Responsable;
+use Spatie\LaravelData\Concerns\AppendableData;
+use Spatie\LaravelData\Concerns\BaseData;
+use Spatie\LaravelData\Concerns\ContextableData;
+use Spatie\LaravelData\Concerns\EmptyData;
+use Spatie\LaravelData\Concerns\IncludeableData;
+use Spatie\LaravelData\Concerns\ResponsableData;
+use Spatie\LaravelData\Concerns\TransformableData;
+use Spatie\LaravelData\Concerns\ValidateableData;
+use Spatie\LaravelData\Concerns\WrappableData;
+use Spatie\LaravelData\Contracts\AppendableData as AppendableDataContract;
+use Spatie\LaravelData\Contracts\BaseData as BaseDataContract;
+use Spatie\LaravelData\Contracts\EmptyData as EmptyDataContract;
+use Spatie\LaravelData\Contracts\IncludeableData as IncludeableDataContract;
+use Spatie\LaravelData\Contracts\ResponsableData as ResponsableDataContract;
+use Spatie\LaravelData\Contracts\TransformableData as TransformableDataContract;
+use Spatie\LaravelData\Contracts\ValidateableData as ValidateableDataContract;
+use Spatie\LaravelData\Contracts\WrappableData as WrappableDataContract;
+
+abstract class Data implements Responsable, AppendableDataContract, BaseDataContract, TransformableDataContract, IncludeableDataContract, ResponsableDataContract, ValidateableDataContract, WrappableDataContract, EmptyDataContract
+{
+ use ResponsableData;
+ use IncludeableData;
+ use AppendableData;
+ use ValidateableData;
+ use WrappableData;
+ use TransformableData;
+ use BaseData;
+ use EmptyData;
+ use ContextableData;
+}
+```
+
+These traits and interfaces allow you to create your own versions of the base `Data` class, and add your own functionality to it.
+
+An example of such custom base data classes are the `Resource` and `Dto` class.
+
+Each interface (and corresponding trait) provides a piece of functionality:
+
+- **BaseData** provides the base functionality of the data package to create data objects
+- **BaseDataCollectable** provides the base functionality of the data package to create data collections
+- **ContextableData** provides the functionality to add context for includes and wraps to the data object/collectable
+- **IncludeableData** provides the functionality to add includes, excludes, only and except to the data object/collectable
+- **TransformableData** provides the functionality to transform the data object/collectable
+- **ResponsableData** provides the functionality to return the data object/collectable as a response
+- **WrappableData** provides the functionality to wrap the transformed data object/collectable
+- **AppendableData** provides the functionality to append data to the transformed data payload
+- **EmptyData** provides the functionality to get an empty version of the data object
+- **ValidateableData** provides the functionality to validate the data object
+- **DeprecatableData** provides the functionality to add deprecated functionality to the data object
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/typescript.md b/_docs/laravel-libs/laravel-data/advanced-usage/typescript.md
new file mode 100644
index 0000000..08de760
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/typescript.md
@@ -0,0 +1,130 @@
+---
+title: Transforming to TypeScript
+weight: 2
+---
+
+Thanks to the [typescript-transformer](https://spatie.be/docs/typescript-transformer) package, it is possible to
+automatically transform data objects into TypeScript definitions.
+
+For example, the following data object:
+
+```php
+class DataObject extends Data
+{
+ public function __construct(
+ public null|int $nullable,
+ public int $int,
+ public bool $bool,
+ public string $string,
+ public float $float,
+ /** @var string[] */
+ public array $array,
+ public Lazy|string $lazy,
+ public Optional|string $optional,
+ public SimpleData $simpleData,
+ /** @var \Spatie\LaravelData\Tests\Fakes\SimpleData[] */
+ public DataCollection $dataCollection,
+ )
+ {
+ }
+}
+```
+
+... can be transformed to the following TypeScript type:
+
+```tsx
+{
+ nullable: number | null;
+ int: number;
+ bool: boolean;
+ string: string;
+ float: number;
+ array: Array;
+ lazy? : string;
+ optional? : string;
+ simpleData: SimpleData;
+ dataCollection: Array;
+}
+```
+
+## Installation of extra package
+
+First, you must install the spatie/laravel-typescript-transformer into your project.
+
+```bash
+composer require spatie/laravel-typescript-transformer
+```
+
+Next, publish the config file of the typescript-transformer package with:
+
+```bash
+php artisan vendor:publish --tag=typescript-transformer-config
+```
+
+Finally, add the `Spatie\LaravelData\Support\TypeScriptTransformer\DataTypeScriptTransformer` transformer to the
+transformers in the `typescript-transformer.php` config file.
+
+If you're using the `DtoTransformer` provided by the package, then be sure to put the `DataTypeScriptTransformer` before the `DtoTransformer`.
+
+## Usage
+
+Annotate each data object that you want to transform to Typescript with a `/** @typescript */` annotation or
+a `#[TypeScript]` attribute.
+
+To [generate the typescript file](https://spatie.be/docs/typescript-transformer/v4/laravel/executing-the-transform-command)
+, run this command:
+
+```php
+php artisan typescript:transform
+```
+
+If you want to transform all the data objects within your application to TypeScript, you can use
+the `DataTypeScriptCollector`, which should be added to the collectors in `typescript-transformer.php`.
+
+If you're using the `DefaultCollector` provided by the package, then be sure to put the `DataTypeScriptCollector` before the `DefaultCollector`.
+
+### Optional types
+
+An optional or lazy property will automatically be transformed into an optional type within TypeScript:
+
+```php
+class DataObject extends Data
+{
+ public function __construct(
+ public Lazy|string $lazy,
+ public Optional|string $optional,
+ )
+ {
+ }
+}
+```
+
+This will be transformed into:
+
+```tsx
+{
+ lazy? : string;
+ optional? : string;
+}
+```
+
+If you want to have optional typed properties in TypeScript without typing your properties optional or lazy within PHP,
+then you can use the `Optional` attribute from the `typescript-transformer` package.
+
+Don't forget to alias it as `TypeScriptOptional` when you're already using this package's `Optional` type!
+
+```php
+use Spatie\TypeScriptTransformer\Attributes\Optional as TypeScriptOptional;
+
+class DataObject extends Data
+{
+ public function __construct(
+ #[TypeScriptOptional]
+ public int $id,
+ public string $someString,
+ public Optional|string $optional,
+ )
+ {
+ }
+}
+```
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/use-with-inertia.md b/_docs/laravel-libs/laravel-data/advanced-usage/use-with-inertia.md
new file mode 100644
index 0000000..4f6ca1d
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/use-with-inertia.md
@@ -0,0 +1,149 @@
+---
+title: Use with Inertia
+weight: 9
+---
+
+> Inertia.js lets you quickly build modern single-page React, Vue, and Svelte apps using classic server-side routing and
+> controllers.
+
+Laravel Data works excellent with [Inertia](https://inertiajs.com).
+
+You can pass a complete data object to an Inertia response:
+
+```php
+return Inertia::render('Song', SongsData::from($song));
+```
+
+## Lazy properties
+
+This package supports [lazy](https://spatie.be/docs/laravel-data/v4/as-a-resource/lazy-properties) properties, which can
+be manually included or excluded.
+
+Inertia has a similar concept called [lazy data evaluation](https://inertiajs.com/partial-reloads#lazy-data-evaluation),
+where some properties wrapped in a closure only get evaluated and included in the response when explicitly asked.
+Inertia v2 introduced the concept of [deferred props](https://inertiajs.com/deferred-props), which allows to defer the
+loading of certain data until after the initial page render.
+
+This package can output specific properties as Inertia lazy or deferred props as such:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public Lazy|string $title,
+ public Lazy|string $artist,
+ public Lazy|string $lyrics,
+ ) {
+ }
+
+ public static function fromModel(Song $song): self
+ {
+ return new self(
+ Lazy::inertia(fn() => $song->title),
+ Lazy::closure(fn() => $song->artist)
+ Lazy::inertiaDeferred(fn() => $song->lyrics)
+ );
+ }
+}
+```
+
+We provide three kinds of lazy properties:
+
+- **Lazy::inertia()** Never included on first visit, optionally included on partial reloads
+- **Lazy::closure()** Always included on first visit, optionally included on partial reloads
+- **Lazy::inertiaDeferred()** Included when ready, optionally included on partial reloads
+
+Now within your JavaScript code, you can include the properties as such:
+
+```js
+router.reload((url, {
+ only: ['title'],
+});
+```
+
+#### Deferred property groups
+
+It is possible to group deferred properties together, so that all grouped properties are loaded at the same time. In
+order to achieve this, you can pass a group name as the second argument to `Lazy::inertiaDeferred()`:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public Lazy|string $title,
+ public Lazy|string $artist,
+ public Lazy|string $lyrics,
+ ) {
+ }
+
+ public static function fromModel(Song $song): self
+ {
+ return new self(
+ Lazy::inertiaDeferred(fn() => $song->title),
+ Lazy::inertiaDeferred(fn() => $song->artist, 'details')
+ Lazy::inertiaDeferred(fn() => $song->lyrics, 'details')
+ );
+ }
+}
+```
+
+### Auto lazy Inertia properties
+
+We already saw earlier that the package can automatically make properties Lazy, the same can be done for Inertia
+properties.
+
+It is possible to rewrite the previous example as follows:
+
+```php
+use Spatie\LaravelData\Attributes\AutoClosureLazy;
+use Spatie\LaravelData\Attributes\AutoInertiaLazy;
+use Spatie\LaravelData\Attributes\AutoInertiaDeferred;
+
+class SongData extends Data
+{
+ public function __construct(
+ #[AutoInertiaLazy]
+ public Lazy|string $title,
+ #[AutoClosureLazy]
+ public Lazy|string $artist,
+ #[AutoInertiaDeferred]
+ public Lazy|string $lyrics,
+ ) {
+ }
+}
+```
+
+If all the properties of a class should be either Inertia or closure lazy, you can use the attributes on the class
+level:
+
+```php
+#[AutoInertiaLazy]
+class SongData extends Data
+{
+ public function __construct(
+ public Lazy|string $title,
+ public Lazy|string $artist,
+ ) {
+ }
+}
+```
+
+#### Deferred property groups
+
+For the `AutoInertiaDeferred` attribute, it is also possible to specify a group name in order to group deferred
+properties together:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ #[AutoInertiaDeferred()]
+ public Lazy|string $title,
+ #[AutoInertiaDeferred('details')]
+ public Lazy|string $artist,
+ #[AutoInertiaDeferred('details')]
+ public Lazy|string $lyrics,
+ ) {
+ }
+}
+```
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/use-with-livewire.md b/_docs/laravel-libs/laravel-data/advanced-usage/use-with-livewire.md
new file mode 100644
index 0000000..43279d4
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/use-with-livewire.md
@@ -0,0 +1,131 @@
+---
+title: Use with Livewire
+weight: 10
+---
+
+> Livewire is a full-stack framework for Laravel that makes building dynamic interfaces simple without leaving the
+> comfort of Laravel.
+
+Laravel Data works excellently with [Laravel Livewire](https://laravel-livewire.com).
+
+You can use a data object as one of the properties of your Livewire component as such:
+
+```php
+class Song extends Component
+{
+ public SongData $song;
+
+ public function mount(int $id)
+ {
+ $this->song = SongData::from(Song::findOrFail($id));
+ }
+
+ public function render()
+ {
+ return view('livewire.song');
+ }
+}
+```
+
+A few things are required to make this work:
+
+1) You should implement `Wireable` on all the data classes you'll be using with Livewire
+2) Each of these classes should also use the `WireableData` trait provided by this package
+3) That's it
+
+We can update our previous example to make it work with Livewire as such:
+
+```php
+class SongData extends Data implements Wireable
+{
+ use WireableData;
+
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+}
+```
+
+## Livewire Synths (Experimental)
+
+Laravel Data also provides a way to use Livewire Synths with your data objects. It will allow you to use data objects
+and collections
+without the need to make them Wireable. This is an experimental feature and is subject to change.
+
+You can enable this feature by setting the config option in `data.php`:
+
+```php
+'livewire' => [
+ 'enable_synths' => false,
+]
+```
+
+Once enabled, you can use data objects within your Livewire components without the need to make them Wireable:
+
+```php
+class SongUpdateComponent extends Component
+{
+ public SongData $data;
+
+ public function mount(public int $id): void
+ {
+ $this->data = SongData::from(Song::findOrFail($id));
+ }
+
+ public function save(): void
+ {
+ Artist::findOrFail($this->id)->update($this->data->toArray());
+ }
+
+ public function render(): string
+ {
+ return <<<'BLADE'
+
+
Songs
+
+
+
Title: {{ $data->title }}
+
Artist: {{ $data->artist }}
+
+
+ BLADE;
+ }
+}
+```
+
+### Lazy
+
+It is possible to use Lazy properties, these properties will not be sent over the wire unless they're included. **Always
+include properties permanently** because a data object is being transformed and then cast again between Livewire
+requests the includes should be permanent.
+
+It is possible to query lazy nested data objects, it is however not possible to query lazy properties which are not a data:
+
+```php
+use Spatie\LaravelData\Lazy;
+
+class LazySongData extends Data
+{
+ public function __construct(
+ public Lazy|ArtistData $artist,
+ public Lazy|string $title,
+ ) {}
+}
+```
+
+Within your Livewire view
+
+```php
+$this->data->artist->name; // Works
+$this->data->title; // Does not work
+```
+
+### Validation
+
+Laravel data **does not provide validation** when using Livewire, you should do this yourself! This is because laravel-data
+does not support object validation at the moment. Only validating payloads which eventually become data objects.
+The validation could technically happen when hydrating the data object, but this is not implemented
+because we cannot guarantee that every hydration happens when a user made sure the data is valid
+and thus the payload should be validated.
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/validation-attributes.md b/_docs/laravel-libs/laravel-data/advanced-usage/validation-attributes.md
new file mode 100644
index 0000000..673de2b
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/validation-attributes.md
@@ -0,0 +1,1029 @@
+---
+title: Validation attributes
+weight: 14
+---
+
+These are all the validation attributes currently available in laravel-data.
+
+## Accepted
+
+[Docs](https://laravel.com/docs/validation#rule-accepted)
+
+```php
+#[Accepted]
+public bool $closure;
+```
+
+## AcceptedIf
+
+[Docs](https://laravel.com/docs/validation#rule-accepted-if)
+
+```php
+#[AcceptedIf('other_field', 'equals_this')]
+public bool $closure;
+```
+
+## ActiveUrl
+
+[Docs](https://laravel.com/docs/validation#rule-active-url)
+
+```php
+#[ActiveUrl]
+public string $closure;
+```
+
+## After
+
+[Docs](https://laravel.com/docs/validation#rule-after)
+
+```php
+#[After('tomorrow')]
+public Carbon $closure;
+
+#[After(Carbon::yesterday())]
+public Carbon $closure;
+
+// Always use field references when referencing other fields
+#[After(new FieldReference('other_field'))]
+public Carbon $closure;
+```
+
+## AfterOrEqual
+
+[Docs](https://laravel.com/docs/validation#rule-after-or-equal)
+
+```php
+#[AfterOrEqual('tomorrow')]
+public Carbon $closure;
+
+#[AfterOrEqual(Carbon::yesterday())]
+public Carbon $closure;
+
+// Always use field references when referencing other fields
+#[AfterOrEqual(new FieldReference('other_field'))]
+public Carbon $closure;
+```
+
+## Alpha
+
+[Docs](https://laravel.com/docs/validation#rule-alpha)
+
+```php
+#[Alpha]
+public string $closure;
+```
+
+## AlphaDash
+
+[Docs](https://laravel.com/docs/validation#rule-alpha-dash)
+
+```php
+#[AlphaDash]
+public string $closure;
+```
+
+## AlphaNumeric
+
+[Docs](https://laravel.com/docs/validation#rule-alpha-num)
+
+```php
+#[AlphaNumeric]
+public string $closure;
+```
+
+## ArrayType
+
+[Docs](https://laravel.com/docs/validation#rule-array)
+
+```php
+#[ArrayType]
+public array $closure;
+
+#[ArrayType(['valid_key', 'other_valid_key'])]
+public array $closure;
+
+#[ArrayType('valid_key', 'other_valid_key')]
+public array $closure;
+```
+
+## Bail
+
+[Docs](https://laravel.com/docs/validation#rule-bail)
+
+```php
+#[Bail]
+public string $closure;
+```
+
+## Before
+
+[Docs](https://laravel.com/docs/validation#rule-before)
+
+```php
+#[Before('tomorrow')]
+public Carbon $closure;
+
+#[Before(Carbon::yesterday())]
+public Carbon $closure;
+
+// Always use field references when referencing other fields
+#[Before(new FieldReference('other_field'))]
+public Carbon $closure;
+```
+
+## BeforeOrEqual
+
+[Docs](https://laravel.com/docs/validation#rule-before-or-equal)
+
+```php
+#[BeforeOrEqual('tomorrow')]
+public Carbon $closure;
+
+#[BeforeOrEqual(Carbon::yesterday())]
+public Carbon $closure;
+
+// Always use field references when referencing other fields
+#[BeforeOrEqual(new FieldReference('other_field'))]
+public Carbon $closure;
+```
+
+## Between
+
+[Docs](https://laravel.com/docs/validation#rule-between)
+
+```php
+#[Between(3.14, 42)]
+public int $closure;
+```
+
+## BooleanType
+
+[Docs](https://laravel.com/docs/validation#rule-boolean)
+
+```php
+#[BooleanType]
+public bool $closure;
+```
+
+## Confirmed
+
+[Docs](https://laravel.com/docs/validation#rule-confirmed)
+
+```php
+#[Confirmed]
+public string $closure;
+```
+
+## CurrentPassword
+
+[Docs](https://laravel.com/docs/validation#rule-current-password)
+
+```php
+#[CurrentPassword]
+public string $closure;
+
+#[CurrentPassword('api')]
+public string $closure;
+```
+
+## Date
+
+[Docs](https://laravel.com/docs/validation#rule-date)
+
+```php
+#[Date]
+public Carbon $date;
+```
+
+## DateEquals
+
+[Docs](https://laravel.com/docs/validation#rule-date-equals)
+
+```php
+#[DateEquals('tomorrow')]
+public Carbon $date;
+
+#[DateEquals(Carbon::yesterday())]
+public Carbon $date;
+```
+
+## DateFormat
+
+[Docs](https://laravel.com/docs/validation#rule-date-format)
+
+```php
+#[DateFormat('d-m-Y')]
+public Carbon $date;
+
+#[DateFormat(['Y-m-d', 'Y-m-d H:i:s'])]
+public Carbon $date;
+```
+
+## Declined
+
+[Docs](https://laravel.com/docs/validation#rule-declined)
+
+```php
+#[Declined]
+public bool $closure;
+```
+
+## DeclinedIf
+
+[Docs](https://laravel.com/docs/validation#rule-declined-if)
+
+```php
+#[DeclinedIf('other_field', 'equals_this')]
+public bool $closure;
+```
+
+## Different
+
+[Docs](https://laravel.com/docs/validation#rule-different)
+
+```php
+#[Different('other_field')]
+public string $closure;
+```
+
+## Digits
+
+[Docs](https://laravel.com/docs/validation#rule-digits)
+
+```php
+#[Digits(10)]
+public int $closure;
+```
+
+## DigitsBetween
+
+[Docs](https://laravel.com/docs/validation#rule-digits-between)
+
+```php
+#[DigitsBetween(2, 10)]
+public int $closure;
+```
+
+## Dimensions
+
+[Docs](https://laravel.com/docs/validation#rule-dimensions)
+
+```php
+#[Dimensions(ratio: 1.5)]
+public UploadedFile $closure;
+
+#[Dimensions(maxWidth: 100, maxHeight: 100)]
+public UploadedFile $closure;
+```
+
+## Distinct
+
+[Docs](https://laravel.com/docs/validation#rule-distinct)
+
+```php
+#[Distinct]
+public string $closure;
+
+#[Distinct(Distinct::Strict)]
+public string $closure;
+
+#[Distinct(Distinct::IgnoreCase)]
+public string $closure;
+```
+
+## DoesntEndWith
+
+[Docs](https://laravel.com/docs/validation#rule-doesnt-end-with)
+
+```php
+#[DoesntEndWith('a')]
+public string $closure;
+
+#[DoesntEndWith(['a', 'b'])]
+public string $closure;
+
+#[DoesntEndWith('a', 'b')]
+public string $closure;
+```
+
+## DoesntStartWith
+
+[Docs](https://laravel.com/docs/validation#rule-doesnt-start-with)
+
+```php
+#[DoesntStartWith('a')]
+public string $closure;
+
+#[DoesntStartWith(['a', 'b'])]
+public string $closure;
+
+#[DoesntStartWith('a', 'b')]
+public string $closure;
+```
+
+## Email
+
+[Docs](https://laravel.com/docs/validation#rule-email)
+
+```php
+#[Email]
+public string $closure;
+
+#[Email(Email::RfcValidation)]
+public string $closure;
+
+#[Email([Email::RfcValidation, Email::DnsCheckValidation])]
+public string $closure;
+
+#[Email(Email::RfcValidation, Email::DnsCheckValidation)]
+public string $closure;
+```
+
+## EndsWith
+
+[Docs](https://laravel.com/docs/validation#rule-ends-with)
+
+```php
+#[EndsWith('a')]
+public string $closure;
+
+#[EndsWith(['a', 'b'])]
+public string $closure;
+
+#[EndsWith('a', 'b')]
+public string $closure;
+```
+
+## Enum
+
+[Docs](https://laravel.com/docs/validation#rule-enum)
+
+```php
+#[Enum(ChannelType::class)]
+public string $closure;
+
+#[Enum(ChannelType::class, only: [ChannelType::Email])]
+public string $closure;
+
+#[Enum(ChannelType::class, except: [ChannelType::Email])]
+public string $closure;
+```
+
+## ExcludeIf
+
+*At the moment the data is not yet excluded due to technical reasons, v4 should fix this*
+
+[Docs](https://laravel.com/docs/validation#rule-exclude-if)
+
+```php
+#[ExcludeIf('other_field', 'has_value')]
+public string $closure;
+```
+
+## ExcludeUnless
+
+*At the moment the data is not yet excluded due to technical reasons, v4 should fix this*
+
+[Docs](https://laravel.com/docs/validation#rule-exclude-unless)
+
+```php
+#[ExcludeUnless('other_field', 'has_value')]
+public string $closure;
+```
+
+## ExcludeWith
+
+*At the moment the data is not yet excluded due to technical reasons, v4 should fix this*
+
+[Docs](https://laravel.com/docs/validation#rule-exclude-with)
+
+```php
+#[ExcludeWith('other_field')]
+public string $closure;
+```
+
+## ExcludeWithout
+
+*At the moment the data is not yet excluded due to technical reasons, v4 should fix this*
+
+[Docs](https://laravel.com/docs/validation#rule-exclude-without)
+
+```php
+#[ExcludeWithout('other_field')]
+public string $closure;
+```
+
+## Exists
+
+[Docs](https://laravel.com/docs/validation#rule-exists)
+
+```php
+#[Exists('users')]
+public string $closure;
+
+#[Exists(User::class)]
+public string $closure;
+
+#[Exists('users', 'email')]
+public string $closure;
+
+#[Exists('users', 'email', connection: 'tenant')]
+public string $closure;
+
+#[Exists('users', 'email', withoutTrashed: true)]
+public string $closure;
+```
+
+## File
+
+[Docs](https://laravel.com/docs/validation#rule-file)
+
+```php
+#[File]
+public UploadedFile $closure;
+```
+
+## Filled
+
+[Docs](https://laravel.com/docs/validation#rule-filled)
+
+```php
+#[Filled]
+public string $closure;
+```
+
+## GreaterThan
+
+[Docs](https://laravel.com/docs/validation#rule-gt)
+
+```php
+#[GreaterThan('other_field')]
+public int $closure;
+```
+
+## GreaterThanOrEqualTo
+
+[Docs](https://laravel.com/docs/validation#rule-gte)
+
+```php
+#[GreaterThanOrEqualTo('other_field')]
+public int $closure;
+```
+
+## Image
+
+[Docs](https://laravel.com/docs/validation#rule-image)
+
+```php
+#[Image]
+public UploadedFile $closure;
+```
+
+## In
+
+[Docs](https://laravel.com/docs/validation#rule-in)
+
+```php
+#[In([1, 2, 3, 'a', 'b'])]
+public mixed $closure;
+
+#[In(1, 2, 3, 'a', 'b')]
+public mixed $closure;
+```
+
+## InArray
+
+[Docs](https://laravel.com/docs/validation#rule-in-array)
+
+```php
+#[InArray('other_field')]
+public string $closure;
+```
+
+## IntegerType
+
+[Docs](https://laravel.com/docs/validation#rule-integer)
+
+```php
+#[IntegerType]
+public int $closure;
+```
+
+## IP
+
+[Docs](https://laravel.com/docs/validation#rule-ip)
+
+```php
+#[IP]
+public string $closure;
+```
+
+## IPv4
+
+[Docs](https://laravel.com/docs/validation#ipv4)
+
+```php
+#[IPv4]
+public string $closure;
+```
+
+## IPv6
+
+[Docs](https://laravel.com/docs/validation#ipv6)
+
+```php
+#[IPv6]
+public string $closure;
+```
+
+## Json
+
+[Docs](https://laravel.com/docs/validation#rule-json)
+
+```php
+#[Json]
+public string $closure;
+```
+
+## LessThan
+
+[Docs](https://laravel.com/docs/validation#rule-lt)
+
+```php
+#[LessThan('other_field')]
+public int $closure;
+```
+
+## LessThanOrEqualTo
+
+[Docs](https://laravel.com/docs/validation#rule-lte)
+
+```php
+#[LessThanOrEqualTo('other_field')]
+public int $closure;
+```
+
+## Lowercase
+
+[Docs](https://laravel.com/docs/validation#rule-lowercase)
+
+```php
+#[Lowercase]
+public string $closure;
+```
+
+## ListType
+
+[Docs](https://laravel.com/docs/validation#rule-list)
+
+```php
+#[ListType]
+public array $array;
+```
+
+## MacAddress
+
+[Docs](https://laravel.com/docs/validation#rule-mac)
+
+```php
+#[MacAddress]
+public string $closure;
+```
+
+## Max
+
+[Docs](https://laravel.com/docs/validation#rule-max)
+
+```php
+#[Max(20)]
+public int $closure;
+```
+
+## MaxDigits
+
+[Docs](https://laravel.com/docs/validation#rule-max-digits)
+
+```php
+#[MaxDigits(10)]
+public int $closure;
+```
+
+## MimeTypes
+
+[Docs](https://laravel.com/docs/validation#rule-mimetypes)
+
+```php
+#[MimeTypes('video/quicktime')]
+public UploadedFile $closure;
+
+#[MimeTypes(['video/quicktime', 'video/avi'])]
+public UploadedFile $closure;
+
+#[MimeTypes('video/quicktime', 'video/avi')]
+public UploadedFile $closure;
+```
+
+## Mimes
+
+[Docs](https://laravel.com/docs/validation#rule-mimes)
+
+```php
+#[Mimes('jpg')]
+public UploadedFile $closure;
+
+#[Mimes(['jpg', 'png'])]
+public UploadedFile $closure;
+
+#[Mimes('jpg', 'png')]
+public UploadedFile $closure;
+```
+
+## Min
+
+[Docs](https://laravel.com/docs/validation#rule-min)
+
+```php
+#[Min(20)]
+public int $closure;
+```
+
+## MinDigits
+
+[Docs](https://laravel.com/docs/validation#rule-min-digits)
+
+```php
+#[MinDigits(2)]
+public int $closure;
+```
+
+## MultipleOf
+
+[Docs](https://laravel.com/docs/validation#rule-multiple-of)
+
+```php
+#[MultipleOf(3)]
+public int $closure;
+```
+
+## NotIn
+
+[Docs](https://laravel.com/docs/validation#rule-not-in)
+
+```php
+#[NotIn([1, 2, 3, 'a', 'b'])]
+public mixed $closure;
+
+#[NotIn(1, 2, 3, 'a', 'b')]
+public mixed $closure;
+```
+
+## NotRegex
+
+[Docs](https://laravel.com/docs/validation#rule-not-regex)
+
+```php
+#[NotRegex('/^.+$/i')]
+public string $closure;
+```
+
+## Nullable
+
+[Docs](https://laravel.com/docs/validation#rule-nullable)
+
+```php
+#[Nullable]
+public ?string $closure;
+```
+
+## Numeric
+
+[Docs](https://laravel.com/docs/validation#rule-numeric)
+
+```php
+#[Numeric]
+public ?string $closure;
+```
+
+## Password
+
+[Docs](https://laravel.com/docs/validation#rule-password)
+
+```php
+#[Password(min: 12, letters: true, mixedCase: true, numbers: false, symbols: false, uncompromised: true, uncompromisedThreshold: 0)]
+public string $closure;
+```
+
+## Present
+
+[Docs](https://laravel.com/docs/validation#rule-present)
+
+```php
+#[Present]
+public string $closure;
+```
+
+## Prohibited
+
+[Docs](https://laravel.com/docs/validation#rule-prohibited)
+
+```php
+#[Prohibited]
+public ?string $closure;
+```
+
+## ProhibitedIf
+
+[Docs](https://laravel.com/docs/validation#rule-prohibited-if)
+
+```php
+#[ProhibitedIf('other_field', 'has_value')]
+public ?string $closure;
+
+#[ProhibitedIf('other_field', ['has_value', 'or_this_value'])]
+public ?string $closure;
+```
+
+## ProhibitedUnless
+
+[Docs](https://laravel.com/docs/validation#rule-prohibited-unless)
+
+```php
+#[ProhibitedUnless('other_field', 'has_value')]
+public ?string $closure;
+
+#[ProhibitedUnless('other_field', ['has_value', 'or_this_value'])]
+public ?string $closure;
+```
+
+## Prohibits
+
+[Docs](https://laravel.com/docs/validation#rule-prohibits)
+
+```php
+#[Prohibits('other_field')]
+public ?string $closure;
+
+#[Prohibits(['other_field', 'another_field'])]
+public ?string $closure;
+
+#[Prohibits('other_field', 'another_field')]
+public ?string $closure;
+```
+
+## Regex
+
+[Docs](https://laravel.com/docs/validation#rule-regex)
+
+```php
+#[Regex('/^.+$/i')]
+public string $closure;
+```
+
+## Required
+
+[Docs](https://laravel.com/docs/validation#rule-required)
+
+```php
+#[Required]
+public string $closure;
+```
+
+## RequiredIf
+
+[Docs](https://laravel.com/docs/validation#rule-required-if)
+
+```php
+#[RequiredIf('other_field', 'value')]
+public ?string $closure;
+
+#[RequiredIf('other_field', ['value', 'another_value'])]
+public ?string $closure;
+```
+
+## RequiredUnless
+
+[Docs](https://laravel.com/docs/validation#rule-required-unless)
+
+```php
+#[RequiredUnless('other_field', 'value')]
+public ?string $closure;
+
+#[RequiredUnless('other_field', ['value', 'another_value'])]
+public ?string $closure;
+```
+
+## RequiredWith
+
+[Docs](https://laravel.com/docs/validation#rule-required-with)
+
+```php
+#[RequiredWith('other_field')]
+public ?string $closure;
+
+#[RequiredWith(['other_field', 'another_field'])]
+public ?string $closure;
+
+#[RequiredWith('other_field', 'another_field')]
+public ?string $closure;
+```
+
+## RequiredWithAll
+
+[Docs](https://laravel.com/docs/validation#rule-required-with-all)
+
+```php
+#[RequiredWithAll('other_field')]
+public ?string $closure;
+
+#[RequiredWithAll(['other_field', 'another_field'])]
+public ?string $closure;
+
+#[RequiredWithAll('other_field', 'another_field')]
+public ?string $closure;
+```
+
+## RequiredWithout
+
+[Docs](https://laravel.com/docs/validation#rule-required-without)
+
+```php
+#[RequiredWithout('other_field')]
+public ?string $closure;
+
+#[RequiredWithout(['other_field', 'another_field'])]
+public ?string $closure;
+
+#[RequiredWithout('other_field', 'another_field')]
+public ?string $closure;
+```
+
+## RequiredWithoutAll
+
+[Docs](https://laravel.com/docs/validation#rule-required-without-all)
+
+```php
+#[RequiredWithoutAll('other_field')]
+public ?string $closure;
+
+#[RequiredWithoutAll(['other_field', 'another_field'])]
+public ?string $closure;
+
+#[RequiredWithoutAll('other_field', 'another_field')]
+public ?string $closure;
+```
+
+## RequiredArrayKeys
+
+[Docs](https://laravel.com/docs/validation#rule-required-array-keys)
+
+```php
+#[RequiredArrayKeys('a')]
+public array $closure;
+
+#[RequiredArrayKeys(['a', 'b'])]
+public array $closure;
+
+#[RequiredArrayKeys('a', 'b')]
+public array $closure;
+```
+
+## Rule
+
+```php
+#[Rule('string|uuid')]
+public string $closure;
+
+#[Rule(['string','uuid'])]
+public string $closure;
+```
+
+## Same
+
+[Docs](https://laravel.com/docs/validation#rule-same)
+
+```php
+#[Same('other_field')]
+public string $closure;
+```
+
+## Size
+
+[Docs](https://laravel.com/docs/validation#rule-size)
+
+```php
+#[Size(10)]
+public string $closure;
+```
+
+## Sometimes
+
+[Docs](https://laravel.com/docs/validation#validating-when-present)
+
+```php
+#[Sometimes]
+public string $closure;
+```
+
+## StartsWith
+
+[Docs](https://laravel.com/docs/validation#rule-starts-with)
+
+```php
+#[StartsWith('a')]
+public string $closure;
+
+#[StartsWith(['a', 'b'])]
+public string $closure;
+
+#[StartsWith('a', 'b')]
+public string $closure;
+```
+
+## StringType
+
+[Docs](https://laravel.com/docs/validation#rule-string)
+
+```php
+#[StringType()]
+public string $closure;
+```
+
+## TimeZone
+
+[Docs](https://laravel.com/docs/validation#rule-timezone)
+
+```php
+#[TimeZone()]
+public string $closure;
+```
+
+## Unique
+
+[Docs](https://laravel.com/docs/validation#rule-unique)
+
+```php
+#[Unique('users')]
+public string $closure;
+
+#[Unique(User::class)]
+public string $closure;
+
+#[Unique('users', 'email')]
+public string $closure;
+
+#[Unique('users', connection: 'tenant')]
+public string $closure;
+
+#[Unique('users', withoutTrashed: true)]
+public string $closure;
+
+#[Unique('users', ignore: 5)]
+public string $closure;
+
+#[Unique('users', ignore: new AuthenticatedUserReference())]
+public string $closure;
+
+#[Unique('posts', ignore: new RouteParameterReference('post'))]
+public string $closure;
+```
+
+## Uppercase
+
+[Docs](https://laravel.com/docs/validation#rule-uppercase)
+
+```php
+#[Uppercase]
+public string $closure;
+```
+
+## Url
+
+[Docs](https://laravel.com/docs/validation#rule-url)
+
+```php
+#[Url]
+public string $closure;
+```
+
+```php
+#[Url(['http', 'https'])]
+public string $closure;
+```
+
+## Ulid
+
+[Docs](https://laravel.com/docs/validation#rule-ulid)
+
+```php
+#[Ulid]
+public string $closure;
+```
+
+## Uuid
+
+[Docs](https://laravel.com/docs/validation#rule-uuid)
+
+```php
+#[Uuid]
+public string $closure;
+```
diff --git a/_docs/laravel-libs/laravel-data/advanced-usage/working-with-dates.md b/_docs/laravel-libs/laravel-data/advanced-usage/working-with-dates.md
new file mode 100644
index 0000000..1cd5760
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/advanced-usage/working-with-dates.md
@@ -0,0 +1,86 @@
+---
+title: Working with dates
+weight: 3
+---
+
+Dates can be hard, there are tons of formats to cast them from or transform them to. Within the `data.php` config file a
+default date format can be set:
+
+```php
+ 'date_format' => DATE_ATOM,
+```
+
+Now when using the `DateTimeInterfaceCast` or `DateTimeInterfaceTransformer` the format defined will be used
+
+```php
+#[WithCast(DateTimeInterfaceCast::class)]
+#[WithTransformer(DateTimeInterfaceTransformer::class)]
+public DateTime $date
+```
+
+It is also possible to manually set the format;
+
+```php
+#[WithCast(DateTimeInterfaceCast::class, format: DATE_ATOM)]
+#[WithTransformer(DateTimeInterfaceTransformer::class, format: DATE_ATOM)]
+public DateTime $date
+```
+
+When casting the data object will use the type of the property to cast a date string into, so if you want to
+use `Carbon`, that's perfectly possible:
+
+```php
+#[WithCast(DateTimeInterfaceCast::class)]
+public Carbon $date
+```
+
+You can even manually specify the type the date string should be cast to:
+
+```php
+
+#[WithCast(DateTimeInterfaceCast::class, type: CarbonImmutable::class)]
+public $date
+```
+
+## Multiple date formats
+
+Sometimes your application might use different date formats, for example, you receive dates from an IOS and React
+application. These use different underlying date formats. In such case you can add an array to the `date_format` key
+within the `data.php` config file:
+
+```php
+ 'date_format' => [DATE_ATOM, 'Y-m-d'],
+```
+
+Now when casting a date, a valid format will be searched. When none can be found, an exception is thrown.
+
+When a transformers hasn't explicitly stated its format, the first format within the array is used.
+
+## Casting dates in a different time zone
+
+Sometimes a date can be in a different timezone than the timezone you application uses. For example, if your application uses `Europe/Brussels` but your date is in `UTC`:
+
+```php
+#[WithCast(DateTimeInterfaceCast::class, timeZone: 'UTC')]
+public DateTime $date
+```
+
+The date will be created with the `UTC` timezone but will be the same as in the `Europe/Brussels` timezone.
+
+## Changing time zones
+
+When casting a date you may want to set an alternative timezone this can be achieved as such:
+
+```php
+#[WithCast(DateTimeInterfaceCast::class, setTimeZone: 'Europe/Brussels')]
+public DateTime $date
+```
+
+In this case the time will be transformed, if our original time was in `UTC` then one or two hours (depending on summer time) will be added.
+
+You can also change the timezone of a property which is getting transformed:
+
+```php
+#[WithTransformer(DateTimeInterfaceTransformer::class, setTimeZone: 'Europe/Brussels')]
+public DateTime $date
+```
diff --git a/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/_index.md b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/_index.md
new file mode 100644
index 0000000..d5babe3
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/_index.md
@@ -0,0 +1,4 @@
+---
+title: As a DTO
+weight: 2
+---
diff --git a/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/abstract-data.md b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/abstract-data.md
new file mode 100644
index 0000000..db04d53
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/abstract-data.md
@@ -0,0 +1,98 @@
+---
+title: Abstract Data
+weight: 4
+---
+
+It is possible to create an abstract data class with subclasses extending it:
+
+```php
+abstract class Person extends Data
+{
+ public string $name;
+}
+
+class Singer extends Person
+{
+ public function __construct(
+ public string $voice,
+ ) {}
+}
+
+class Musician extends Person
+{
+ public function __construct(
+ public string $instrument,
+ ) {}
+}
+```
+
+It is perfectly possible now to create individual instances as follows:
+
+```php
+Singer::from(['name' => 'Rick Astley', 'voice' => 'tenor']);
+Musician::from(['name' => 'Rick Astley', 'instrument' => 'guitar']);
+```
+
+But what if you want to use this abstract type in another data class like this:
+
+```php
+class Contract extends Data
+{
+ public string $label;
+ public Person $artist;
+}
+```
+
+While the following may both be valid:
+
+```php
+Contract::from(['label' => 'PIAS', 'artist' => ['name' => 'Rick Astley', 'voice' => 'tenor']]);
+Contract::from(['label' => 'PIAS', 'artist' => ['name' => 'Rick Astley', 'instrument' => 'guitar']]);
+```
+
+The package can't decide which subclass to construct for the property.
+
+You can implement the `PropertyMorphableData` interface on the abstract class to solve this. This interface adds a `morph` method that will be used to determine which subclass to use. The `morph` method receives an array of properties limited to properties tagged by a `PropertyForMorph` attribute.
+
+```php
+use Spatie\LaravelData\Attributes\PropertyForMorph;
+use Spatie\LaravelData\Contracts\PropertyMorphableData;
+
+abstract class Person extends Data implements PropertyMorphableData
+{
+ #[PropertyForMorph]
+ public string $type;
+
+ public string $name;
+
+ public static function morph(array $properties): ?string
+ {
+ return match ($properties['type']) {
+ 'singer' => Singer::class,
+ 'musician' => Musician::class,
+ default => null
+ };
+ }
+}
+```
+
+The example above will work by adding this code, and the correct Data class will be constructed.
+
+Since the morph functionality needs to run early within the data construction process, it bypasses the normal flow of constructing data objects so there are a few limitations:
+
+- it is only allowed to use properties typed as string, int, or BackedEnum(int or string)
+- When a property is typed as an enum, the value passed to the morph method will be an enum
+- it can be that the value of a property within the morph method is null or a different type than expected since it runs before validation
+- properties with mapped property names are still supported
+
+It is also possible to use abstract data classes as collections as such:
+
+```php
+class Band extends Data
+{
+ public string $name;
+
+ /** @var array */
+ public array $members;
+}
+```
diff --git a/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/casts.md b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/casts.md
new file mode 100644
index 0000000..cfadf33
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/casts.md
@@ -0,0 +1,164 @@
+---
+title: Casts
+weight: 5
+---
+
+We extend our example data object just a little bit:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ public DateTime $date,
+ public Format $format,
+ ) {
+ }
+}
+```
+
+The `Format` property here is an `Enum` and looks like this:
+
+```php
+enum Format: string {
+ case cd = 'cd';
+ case vinyl = 'vinyl';
+ case cassette = 'cassette';
+}
+```
+
+When we now try to construct a data object like this:
+
+```php
+SongData::from([
+ 'title' => 'Never gonna give you up',
+ 'artist' => 'Rick Astley',
+ 'date' => '27-07-1987',
+ 'format' => 'vinyl',
+]);
+```
+
+And get an error because the first two properties are simple PHP types(strings, ints, floats, booleans, arrays), but the following two properties are more complex types: `DateTime` and `Enum`, respectively.
+
+These types cannot be automatically created. A cast is needed to construct them from a string.
+
+There are two types of casts, local and global casts.
+
+## Local casts
+
+Local casts are defined within the data object itself and can be added using attributes:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ #[WithCast(DateTimeInterfaceCast::class)]
+ public DateTime $date,
+ #[WithCast(EnumCast::class)]
+ public Format $format,
+ ) {
+ }
+}
+```
+
+Now it is possible to create a data object like this without exceptions:
+
+```php
+SongData::from([
+ 'title' => 'Never gonna give you up',
+ 'artist' => 'Rick Astley',
+ 'date' => '27-07-1987',
+ 'format' => 'vinyl',
+]);
+```
+
+It is possible to provide parameters to the casts like this:
+
+```php
+#[WithCast(EnumCast::class, type: Format::class)]
+public Format $format
+```
+
+## Global casts
+
+Global casts are not defined on the data object but in your `data.php` config file:
+
+```php
+'casts' => [
+ DateTimeInterface::class => Spatie\LaravelData\Casts\DateTimeInterfaceCast::class,
+],
+```
+
+When the data object can find no local cast for the property, the package will look through the global casts and tries to find a suitable cast. You can define casts for:
+
+- a **specific implementation** (e.g. CarbonImmutable)
+- an **interface** (e.g. DateTimeInterface)
+- a **base class** (e.g. Enum)
+
+As you can see, the package by default already provides a `DateTimeInterface` cast, this means we can update our data object like this:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ public DateTime $date,
+ #[WithCast(EnumCast::class)]
+ public Format $format,
+ ) {
+ }
+}
+```
+
+Tip: we can also remove the `EnumCast` since the package will automatically cast enums because they're a native PHP type, but this made the example easy to understand.
+
+## Creating your own casts
+
+It is possible to create your casts. You can read more about this in the [advanced chapter](/docs/laravel-data/v4/advanced-usage/creating-a-cast).
+
+## Casting arrays or collections of non-data types
+
+We've already seen how collections of data can be made of data objects, the same is true for all other types if correctly
+typed.
+
+Let say we have an array of DateTime objects:
+
+```php
+class ReleaseData extends Data
+{
+ public string $title;
+ /** @var array */
+ public array $releaseDates;
+}
+```
+
+By enabling the `cast_and_transform_iterables` feature in the `data` config file (this feature will be enabled by default in laravel-data v5):
+
+```php
+'features' => [
+ 'cast_and_transform_iterables' => true,
+],
+```
+
+We now can create a `ReleaseData` object with an array of strings which will be cast into an array DateTime objects:
+
+```php
+ReleaseData::from([
+ 'title' => 'Never Gonna Give You Up',
+ 'releaseDates' => [
+ '1987-07-27T12:00:00Z',
+ '1987-07-28T12:00:00Z',
+ '1987-07-29T12:00:00Z',
+ ],
+]);
+```
+
+For this feature to work, a cast should not only implement the `Cast` interface but also the `IterableItemCast`. The
+signatures of the `cast` and `castIterableItem` methods are exactly the same, but they're called on different times.
+When casting a property like a DateTime from a string, the `cast` method will be used, when transforming an iterable
+property like an array or Laravel Collection where the iterable item is typed using an annotation, then each item of the
+provided iterable will trigger a call to the `castIterableItem` method.
diff --git a/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/collections.md b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/collections.md
new file mode 100644
index 0000000..f44f9ed
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/collections.md
@@ -0,0 +1,266 @@
+---
+title: Collections
+weight: 3
+---
+
+It is possible to create a collection of data objects by using the `collect` method:
+
+```php
+SongData::collect([
+ ['title' => 'Never Gonna Give You Up', 'artist' => 'Rick Astley'],
+ ['title' => 'Giving Up on Love', 'artist' => 'Rick Astley'],
+]); // returns an array of SongData objects
+```
+
+Whatever type of collection you pass in, the package will return the same type of collection with the freshly created
+data objects within it. As long as this type is an array, Laravel collection or paginator or a class extending from it.
+
+This opens up possibilities to create collections of Eloquent models:
+
+```php
+SongData::collect(Song::all()); // return an Eloquent collection of SongData objects
+```
+
+Or use a paginator:
+
+```php
+SongData::collect(Song::paginate()); // return a LengthAwarePaginator of SongData objects
+
+// or
+
+SongData::collect(Song::cursorPaginate()); // return a CursorPaginator of SongData objects
+```
+
+Internally the `from` method of the data class will be used to create a new data object for each item in the collection.
+
+When the collection already contains data objects, the `collect` method will return the same collection:
+
+```php
+SongData::collect([
+ SongData::from(['title' => 'Never Gonna Give You Up', 'artist' => 'Rick Astley']),
+ SongData::from(['title' => 'Giving Up on Love', 'artist' => 'Rick Astley']),
+]); // returns an array of SongData objects
+```
+
+The collect method also allows you to cast collections from one type into another. For example, you can pass in
+an `array`and get back a Laravel collection:
+
+```php
+SongData::collect($songs, Collection::class); // returns a Laravel collection of SongData objects
+```
+
+This transformation will only work with non-paginator collections.
+
+## Magically creating collections
+
+We've already seen that `from` can create data objects magically. It is also possible to create a collection of data
+objects magically when using `collect`.
+
+Let's say you've implemented a custom collection class called `SongCollection`:
+
+```php
+class SongCollection extends Collection
+{
+ public function __construct(
+ $items = [],
+ public array $artists = [],
+ ) {
+ parent::__construct($items);
+ }
+}
+```
+
+Since the constructor of this collection requires an extra property it cannot be created automatically. However, it is
+possible to define a custom collect method which can create it:
+
+```php
+class SongData extends Data
+{
+ public string $title;
+ public string $artist;
+
+ public static function collectArray(array $items): SongCollection
+ {
+ return new SongCollection(
+ parent::collect($items),
+ array_unique(array_map(fn(SongData $song) => $song->artist, $items))
+ );
+ }
+}
+```
+
+Now when collecting an array data objects a `SongCollection` will be returned:
+
+```php
+SongData::collectArray([
+ ['title' => 'Never Gonna Give You Up', 'artist' => 'Rick Astley'],
+ ['title' => 'Living on a prayer', 'artist' => 'Bon Jovi'],
+]); // returns an SongCollection of SongData objects
+```
+
+There are a few requirements for this to work:
+
+- The method must be **static**
+- The method must be **public**
+- The method must have a **return type**
+- The method name must **start with collect**
+- The method name must not be **collect**
+
+## Creating a data object with collections
+
+You can create a data object with a collection of data objects just like you would create a data object with a nested
+data object:
+
+```php
+use App\Data\SongData;
+use Illuminate\Support\Collection;
+
+class AlbumData extends Data
+{
+ public string $title;
+ /** @var Collection */
+ public Collection $songs;
+}
+
+AlbumData::from([
+ 'title' => 'Never Gonna Give You Up',
+ 'songs' => [
+ ['title' => 'Never Gonna Give You Up', 'artist' => 'Rick Astley'],
+ ['title' => 'Giving Up on Love', 'artist' => 'Rick Astley'],
+ ]
+]);
+```
+
+Since the collection type here is a `Collection`, the package will automatically convert the array into a collection of
+data objects.
+
+## DataCollections, PaginatedDataCollections and CursorPaginatedCollections
+
+The package also provides a few collection classes which can be used to create collections of data objects. It was a
+requirement to use these classes in the past versions of the package when nesting data objects collections in data
+objects. This is no longer the case, but there are still valid use cases for them.
+
+You can create a DataCollection like this:
+
+```php
+use Spatie\LaravelData\DataCollection;
+
+SongData::collect(Song::all(), DataCollection::class);
+```
+
+A PaginatedDataCollection can be created like this:
+
+```php
+use Spatie\LaravelData\PaginatedDataCollection;
+
+SongData::collect(Song::paginate(), PaginatedDataCollection::class);
+````
+
+And a CursorPaginatedCollection can be created like this:
+
+```php
+use Spatie\LaravelData\CursorPaginatedCollection;
+
+SongData::collect(Song::cursorPaginate(), CursorPaginatedCollection::class);
+```
+
+### Why using these collection classes?
+
+We advise you to always use arrays, Laravel collections and paginators within your data objects. But let's say you have
+a controller like this:
+
+```php
+class SongController
+{
+ public function index()
+ {
+ return SongData::collect(Song::all());
+ }
+}
+```
+
+In the next chapters of this documentation, we'll see that it is possible to include or exclude properties from the data
+objects like this:
+
+```php
+class SongController
+{
+ public function index()
+ {
+ return SongData::collect(Song::all(), DataCollection::class)->include('artist');
+ }
+}
+```
+
+This will only work when you're using a `DataCollection`, `PaginatedDataCollection` or `CursorPaginatedCollection`.
+
+### DataCollections
+
+DataCollections provide some extra functionalities like:
+
+```php
+// Counting the amount of items in the collection
+count($collection);
+
+// Changing an item in the collection
+$collection[0]->title = 'Giving Up on Love';
+
+// Adding an item to the collection
+$collection[] = SongData::from(['title' => 'Never Knew Love', 'artist' => 'Rick Astley']);
+
+// Removing an item from the collection
+unset($collection[0]);
+```
+
+It is even possible to loop over it with a foreach:
+
+```php
+foreach ($songs as $song){
+ echo $song->title;
+}
+```
+
+The `DataCollection` class implements a few of the Laravel collection methods:
+
+- through
+- map
+- filter
+- first
+- each
+- values
+- where
+- reduce
+- sole
+
+You can, for example, get the first item within a collection like this:
+
+```php
+SongData::collect(Song::all(), DataCollection::class)->first(); // SongData object
+```
+
+### The `collection` method
+
+In previous versions of the package it was possible to use the `collection` method to create a collection of data
+objects:
+
+```php
+SongData::collection(Song::all()); // returns a DataCollection of SongData objects
+SongData::collection(Song::paginate()); // returns a PaginatedDataCollection of SongData objects
+SongData::collection(Song::cursorPaginate()); // returns a CursorPaginatedCollection of SongData objects
+```
+
+This method was removed with version v4 of the package in favor for the more powerful `collect` method. The `collection`
+method can still be used by using the `WithDeprecatedCollectionMethod` trait:
+
+```php
+use Spatie\LaravelData\Concerns\WithDeprecatedCollectionMethod;
+
+class SongData extends Data
+{
+ use WithDeprecatedCollectionMethod;
+
+ // ...
+}
+```
+
+Please note that this trait will be removed in the next major version of the package.
diff --git a/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/computed.md b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/computed.md
new file mode 100644
index 0000000..12812bd
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/computed.md
@@ -0,0 +1,38 @@
+---
+title: Computed values
+weight: 9
+---
+
+Earlier we saw how default values can be set for a data object, sometimes you want to set a default value based on other properties. For example, you might want to set a `full_name` property based on a `first_name` and `last_name` property. You can do this by using a computed property:
+
+```php
+use Spatie\LaravelData\Attributes\Computed;
+
+class SongData extends Data
+{
+ #[Computed]
+ public string $full_name;
+
+ public function __construct(
+ public string $first_name,
+ public string $last_name,
+ ) {
+ $this->full_name = "{$this->first_name} {$this->last_name}";
+ }
+}
+```
+
+You can now do the following:
+
+```php
+SongData::from(['first_name' => 'Ruben', 'last_name' => 'Van Assche']);
+```
+
+Please notice: the computed property won't be reevaluated when its dependencies change. If you want to update a computed property, you'll have to create a new object.
+
+Again there are a few conditions for this approach:
+
+- You must always use a sole property, a property within the constructor definition won't work
+- Computed properties cannot be defined in the payload, a `CannotSetComputedValue` will be thrown if this is the case
+- If the `ignore_exception_when_trying_to_set_computed_property_value` configuration option is set to `true`, the computed property will be silently ignored when trying to set it in the payload and no `CannotSetComputedValue` exception will be thrown.
+
diff --git a/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/creating-a-data-object.md b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/creating-a-data-object.md
new file mode 100644
index 0000000..ca60c60
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/creating-a-data-object.md
@@ -0,0 +1,213 @@
+---
+title: Creating a data object
+weight: 1
+---
+
+Let's get started with the following simple data object:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+}
+```
+
+Since this is just a simple PHP object, it can be initialized as such:
+
+```php
+new SongData('Never gonna give you up', 'Rick Astley');
+```
+
+But with this package, you can initialize the data object also with an array:
+
+```php
+SongData::from(['title' => 'Never gonna give you up', 'artist' => 'Rick Astley']);
+```
+
+You can use the `from` method to create a data object from nearly anything. For example, let's say you have an Eloquent
+model like this:
+
+```php
+class Song extends Model
+{
+ // Your model code
+}
+```
+
+You can create a data object from such a model like this:
+
+```php
+SongData::from(Song::firstOrFail($id));
+```
+
+The package will find the required properties within the model and use them to construct the data object.
+
+Data can also be created from JSON strings:
+
+```php
+SongData::from('{"title" : "Never Gonna Give You Up","artist" : "Rick Astley"}');
+```
+
+Although the PHP 8.0 constructor properties look great in data objects, it is perfectly valid to use regular properties
+without a constructor like so:
+
+```php
+class SongData extends Data
+{
+ public string $title;
+ public string $artist;
+}
+```
+
+## Magical creation
+
+It is possible to overwrite or extend the behaviour of the `from` method for specific types. So you can construct a data
+object in a specific manner for that type. This can be done by adding a static method starting with 'from' to the data
+object.
+
+For example, we want to change how we create a data object from a model. We can add a `fromModel` static method that
+takes the model we want to use as a parameter:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+
+ public static function fromModel(Song $song): self
+ {
+ return new self("{$song->title} ({$song->year})", $song->artist);
+ }
+}
+```
+
+Now when creating a data object from a model like this:
+
+```php
+SongData::from(Song::firstOrFail($id));
+```
+
+Instead of the default method, the `fromModel` method will be called to create a data object from the found model.
+
+You're truly free to add as many from methods as you want. For example, you could add one to create a data object from a
+string:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+
+ public static function fromString(string $string): self
+ {
+ [$title, $artist] = explode('|', $string);
+
+ return new self($title, $artist);
+ }
+}
+```
+
+From now on, you can create a data object like this:
+
+```php
+SongData::from('Never gonna give you up|Rick Astley');
+```
+
+It is also possible to use multiple arguments in a magical creation method:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+
+ public static function fromMultiple(string $title, string $artist): self
+ {
+ return new self($title, $artist);
+ }
+}
+```
+
+Now we can create the data object like this:
+
+```php
+SongData::from('Never gonna give you up', 'Rick Astley');
+```
+
+There are a few requirements to enable magical data object creation:
+
+- The method must be **static and public**
+- The method must **start with from**
+- The method cannot be called **from**
+
+When the package cannot find such a method for a type given to the data object's `from` method. Then the data object
+will try to create itself from the following types:
+
+- An *Eloquent model* by calling `toArray` on it
+- A *Laravel request* by calling `all` on it
+- An *Arrayable* by calling `toArray` on it
+- An *array*
+
+This list can be extended using extra normalizers, find more about
+it [here](/docs/laravel-data/v4/advanced-usage/normalizers).
+
+When a data object cannot be created using magical methods or the default methods, a `CannotCreateData`
+exception will be thrown.
+
+## Optional creation
+
+It is impossible to return `null` from a data object's `from` method since we always expect a data object when
+calling `from`. To solve this, you can call the `optional` method:
+
+```php
+SongData::optional(null); // returns null
+```
+
+Underneath the optional method will call the `from` method when a value is given, so you can still magically create data
+objects. When a null value is given, it will return null.
+
+## Creation without magic methods
+
+You can ignore the magical creation methods when creating a data object as such:
+
+```php
+SongData::factory()->withoutMagicalCreation()->from($song);
+```
+
+## Advanced creation using factories
+
+It is possible to configure how a data object is created, whether it will be validated, which casts to use and more. You
+can read more about it [here](/docs/laravel-data/v4/as-a-data-transfer-object/factories).
+
+## DTO classes
+
+The default `Data` class from which you extend your data objects is a multi versatile class, it packs a lot of
+functionality. But sometimes you just want a simple DTO class. You can use the `Dto` class for this:
+
+```php
+class SongData extends Dto
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+}
+```
+
+The `Dto` class is a data class in its most basic form. It can be created from anything using magical methods, can
+validate payloads before creating the data object and can be created using factories. But it doesn't have any of the
+other functionality that the `Data` class has.
diff --git a/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/defaults.md b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/defaults.md
new file mode 100644
index 0000000..d217f09
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/defaults.md
@@ -0,0 +1,54 @@
+---
+title: Default values
+weight: 8
+---
+
+There are a few ways to define default values for a data object. Since a data object is just a regular PHP class, you can use the constructor to set default values:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title = 'Never Gonna Give You Up',
+ public string $artist = 'Rick Astley',
+ ) {
+ }
+}
+```
+
+This works for simple types like strings, integers, floats, booleans, enums and arrays. But what if you want to set a default value for a more complex type like a `CarbonImmutable` object? You can use the constructor to do this:
+
+```php
+class SongData extends Data
+{
+ #[Date]
+ public CarbonImmutable|Optional $date;
+
+ public function __construct(
+ public string $title = 'Never Gonna Give You Up',
+ public string $artist = 'Rick Astley',
+ ) {
+ $this->date = CarbonImmutable::create(1987, 7, 27);
+ }
+}
+```
+
+You can now do the following:
+
+```php
+SongData::from();
+SongData::from(['title' => 'Giving Up On Love', 'date' => CarbonImmutable::create(1988, 4, 15)]);
+```
+
+Even validation will work:
+
+```php
+SongData::validateAndCreate();
+SongData::validateAndCreate(['title' => 'Giving Up On Love', 'date' => CarbonImmutable::create(1988, 4, 15)]);
+```
+
+There are a few conditions for this approach:
+
+- You must always use a sole property, a property within the constructor definition won't work
+- The optional type is technically not required, but it's a good idea to use it otherwise the validation won't work
+- Validation won't be performed on the default value, so make sure it is valid
diff --git a/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/factories.md b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/factories.md
new file mode 100644
index 0000000..651db34
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/factories.md
@@ -0,0 +1,139 @@
+---
+title: Factories
+weight: 13
+---
+
+It is possible to automatically create data objects in all sorts of forms with this package. Sometimes a little bit more
+control is required when a data object is being created. This is where factories come in.
+
+Factories allow you to create data objects like before but allow you to customize the creation process.
+
+For example, we can create a data object using a factory like this:
+
+```php
+SongData::factory()->from(['title' => 'Never gonna give you up', 'artist' => 'Rick Astley']);
+```
+
+Collecting a bunch of data objects using a factory can be done as such:
+
+```php
+SongData::factory()->collect(Song::all())
+```
+
+## Disable property name mapping
+
+We saw [earlier](/docs/laravel-data/v4/as-a-data-transfer-object/mapping-property-names) that it is possible to map
+property names when creating a data object from an array. This can be disabled when using a factory:
+
+```php
+ContractData::factory()->withoutPropertyNameMapping()->from(['name' => 'Rick Astley', 'record_company' => 'RCA Records']); // record_company will not be mapped to recordCompany
+```
+
+## Changing the validation strategy
+
+By default, the package will only validate Requests when creating a data object it is possible to change the validation
+strategy to always validate for each type:
+
+```php
+SongData::factory()->alwaysValidate()->from(['title' => 'Never gonna give you up', 'artist' => 'Rick Astley']);
+```
+
+Or completely disable validation:
+
+```php
+SongData::factory()->withoutValidation()->from(['title' => 'Never gonna give you up', 'artist' => 'Rick Astley']);
+```
+
+## Disabling magic methods
+
+A data object can be created
+using [magic methods](/docs/laravel-data/v4/as-a-data-transfer-object/creating-a-data-object.md#magical-creation) , this can be disabled
+when using a factory:
+
+```php
+SongData::factory()->withoutMagicalCreation()->from('Never gonna give you up'); // Won't work since the magical method creation is disabled
+```
+
+It is also possible to ignore the magical creation methods when creating a data object as such:
+
+```php
+SongData::factory()->ignoreMagicalMethod('fromString')->from('Never gonna give you up'); // Won't work since the magical method is ignored
+```
+
+## Disabling optional values
+
+When creating a data object that has optional properties, it is possible choose whether missing properties from the payload should be created as `Optional`. This can be helpful when you want to have a `null` value instead of an `Optional` object - for example, when creating the DTO from an Eloquent model with `null` values.
+
+```php
+class SongData extends Data {
+ public function __construct(
+ public string $title,
+ public string $artist,
+ public Optional|null|string $album,
+ ) {
+ }
+}
+
+SongData::factory()
+ ->withoutOptionalValues()
+ ->from(['title' => 'Never gonna give you up', 'artist' => 'Rick Astley']); // album will `null` instead of `Optional`
+```
+
+Note that when an Optional property has no default value, and is not nullable, and the payload does not contain a value for this property, the DTO will not have the property set - so accessing it can throw `Typed property must not be accessed before initialization` error. Therefore, it's advisable to either set a default value or make the property nullable, when using `withoutOptionalValues`.
+
+```php
+class SongData extends Data {
+ public function __construct(
+ public string $title,
+ public string $artist,
+ public Optional|string $album, // careful here!
+ public Optional|string $publisher = 'unknown',
+ public Optional|string|null $label,
+ ) {
+ }
+}
+
+$data = SongData::factory()
+ ->withoutOptionalValues()
+ ->from(['title' => 'Never gonna give you up', 'artist' => 'Rick Astley']);
+
+$data->toArray(); // ['title' => 'Never gonna give you up', 'artist' => 'Rick Astley', 'publisher' => 'unknown', 'label' => null]
+
+$data->album; // accessing the album will throw an error, unless the property is set before accessing it
+```
+
+## Adding additional global casts
+
+When creating a data object, it is possible to add additional casts to the data object:
+
+```php
+SongData::factory()->withCast('string', StringToUpperCast::class)->from(['title' => 'Never gonna give you up', 'artist' => 'Rick Astley']);
+```
+
+These casts will not replace the other global casts defined in the `data.php` config file, they will though run before
+the other global casts. You define them just like you would define them in the config file, the first parameter is the
+type of the property that should be cast and the second parameter is the cast class.
+
+## Using the creation context
+
+Internally the package uses a creation context to create data objects. The factory allows you to use this context manually, but when using the from method it will be used automatically.
+
+It is possible to inject the creation context into a magical method by adding it as a parameter:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+
+ public static function fromModel(Song $song, CreationContext $context): self
+ {
+ // Do something with the context
+ }
+}
+```
+
+You can read more about creation contexts [here](/docs/laravel-data/v4/advanced-usage/pipeline).
diff --git a/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/injecting-property-values.md b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/injecting-property-values.md
new file mode 100644
index 0000000..4e97f78
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/injecting-property-values.md
@@ -0,0 +1,232 @@
+---
+title: Injecting property values
+weight: 12
+---
+
+When creating a data object, it is possible to inject values into properties from all kinds of sources like route
+parameters, the current user or dependencies in the container.
+
+## Filling properties from a route parameter
+
+When creating data objects from requests, it's possible to automatically fill data properties from request route
+parameters, such as route models.
+
+The `FromRouteParameter` attribute allows filling properties with route parameter values.
+
+### Using scalar route parameters
+
+```php
+Route::patch('/songs/{songId}', [SongController::class, 'update']);
+
+class SongData extends Data {
+ #[FromRouteParameter('songId')]
+ public int $id;
+ public string $name;
+}
+```
+
+Here, the `$id` property will be filled with the `songId` route parameter value (which most likely is a string or
+integer).
+
+### Using Models, objects or arrays as route parameters
+
+Given that we have a route to create songs for a specific author, and that the `{author}` route parameter uses route
+model binding to automatically bind to an `Author` model:
+
+```php
+Route::post('/songs/{artist}', [SongController::class, 'store']);
+
+class SongData extends Data {
+ public int $id;
+ #[FromRouteParameter('artist')]
+ public ArtistData $author;
+}
+```
+
+Here, the `$artist` property will be filled with the `artist` route parameter value, which will be an instance of the
+`Artist` model. Note that the package will automatically cast the model to `ArtistData`.
+
+## Filling properties from route parameter properties
+
+The `FromRouteParameterProperty` attribute allows filling properties with values from route parameter properties. The
+main difference from `FromRouteParameter` is that the former uses the full route parameter value, while
+`FromRouteParameterProperty` uses a single property from the route parameter.
+
+In the example below, we're using route model binding. `{song}` represents an instance of the `Song` model.
+`FromRouteParameterProperty` automatically attempts to fill the `SongData` `$id` property from `$song->id`.
+
+```php
+Route::patch('/songs/{song}', [SongController::class, 'update']);
+
+class SongData extends Data {
+ #[FromRouteParameterProperty('song')]
+ public int $id;
+ public string $name;
+}
+```
+
+### Using custom property mapping
+
+In the example below, `$name` property will be filled with `$song->title` (instead of `$song->name).
+
+```php
+Route::patch('/songs/{song}', [SongController::class, 'update']);
+
+class SongData extends Data {
+ #[FromRouteParameterProperty('song')]
+ public int $id;
+ #[FromRouteParameterProperty('song', 'title')]
+ public string $name;
+}
+```
+
+### Nested property mapping
+
+Nested properties are supported as well. Here, we fill `$singerName` from `$artist->leadSinger->name`:
+
+```php
+Route::patch('/artists/{artist}/songs/{song}', [SongController::class, 'update']);
+
+class SongData extends Data {
+ #[FromRouteParameterProperty('song')]
+ public int $id;
+ #[FromRouteParameterProperty('artist', 'leadSinger.name')]
+ public string $singerName;
+}
+```
+
+## Route parameters take priority over request body
+
+By default, route parameters take priority over values in the request body. For example, when the song ID is present in
+the route model as well as request body, the ID from route model is used.
+
+```php
+Route::patch('/songs/{song}', [SongController::class, 'update']);
+
+// PATCH /songs/123
+// { "id": 321, "name": "Never gonna give you up" }
+
+class SongData extends Data {
+ #[FromRouteParameterProperty('song')]
+ public int $id;
+ public string $name;
+}
+```
+
+Here, `$id` will be `123` even though the request body has `321` as the ID value.
+
+In most cases, this is useful - especially when you need the ID for a validation rule. However, there may be cases when
+the exact opposite is required.
+
+The above behavior can be turned off by switching the `replaceWhenPresentInPayload` flag off. This can be useful when
+you _intend_ to allow updating a property that is present in a route parameter, such as a slug:
+
+```php
+Route::patch('/songs/{slug}', [SongController::class, 'update']);
+
+// PATCH /songs/never
+// { "slug": "never-gonna-give-you-up", "name": "Never gonna give you up" }
+
+class SongData extends Data {
+ #[FromRouteParameter('slug', replaceWhenPresentInPayload: false )]
+ public string $slug;
+}
+```
+
+Here, `$slug` will be `never-gonna-give-you-up` even though the route parameter value is `never`.
+
+## Filling properties from the authenticated user
+
+The `FromCurrentUser` attribute allows filling properties with values from the authenticated user.
+
+```php
+class SongData extends Data {
+ #[FromAuthenticatedUser]
+ public UserData $user;
+}
+```
+
+It is possible to specify the guard to use when fetching the user:
+
+```php
+class SongData extends Data {
+ #[FromAuthenticatedUser('api')]
+ public UserData $user;
+}
+```
+
+Just like with route parameters, it is possible to fill properties with specific user properties using
+`FromAuthenticatedUserProperty`:
+
+```php
+class SongData extends Data {
+ #[FromAuthenticatedUserProperty('api','name')]
+ public string $username;
+}
+```
+
+All the other features like custom property mapping and not replacing values when present in the payload are supported
+as well.
+
+## Filling properties from the container
+
+The `FromContainer` attribute allows filling properties with dependencies from the container.
+
+```php
+class SongData extends Data {
+ #[FromContainer(SongService::class)]
+ public SongService $song_service;
+}
+```
+
+When a dependency requires additional parameters these can be provided as such:
+
+```php
+class SongData extends Data {
+ #[FromContainer(SongService::class, parameters: ['year' => 1984])]
+ public SongService $song_service;
+}
+```
+
+It is even possible to completely inject the container itself:
+
+```php
+class SongData extends Data {
+ #[FromContainer]
+ public Container $container;
+}
+```
+
+Selecting a property from a dependency can be done using `FromContainerProperty`:
+
+```php
+class SongData extends Data {
+ #[FromContainerProperty(SongService::class, 'name')]
+ public string $service_name;
+}
+```
+
+Again, all the other features like custom property mapping and not replacing values when present in the payload are
+supported as well.
+
+## Creating your own injectable attributes
+
+All the attributes we saw earlier implement the `InjectsPropertyValue` interface:
+
+```php
+interface InjectsPropertyValue
+{
+ public function resolve(
+ DataProperty $dataProperty,
+ mixed $payload,
+ array $properties,
+ CreationContext $creationContext
+ ): mixed;
+
+ public function shouldBeReplacedWhenPresentInPayload() : bool;
+}
+```
+
+It is possible to create your own attribute by implementing this interface. The `resolve` method is responsible for
+returning the value that should be injected into the property. The `shouldBeReplacedWhenPresentInPayload` method should
+return `true` if the value should be replaced when present in the payload.
diff --git a/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/mapping-property-names.md b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/mapping-property-names.md
new file mode 100644
index 0000000..2251ec2
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/mapping-property-names.md
@@ -0,0 +1,94 @@
+---
+title: Mapping property names
+weight: 7
+---
+
+Sometimes the property names in the array from which you're creating a data object might be different. You can define another name for a property when it is created from an array using attributes:
+
+```php
+class ContractData extends Data
+{
+ public function __construct(
+ public string $name,
+ #[MapInputName('record_company')]
+ public string $recordCompany,
+ ) {
+ }
+}
+```
+
+Creating the data object can now be done as such:
+
+```php
+ContractData::from(['name' => 'Rick Astley', 'record_company' => 'RCA Records']);
+```
+
+Changing all property names in a data object to snake_case in the data the object is created from can be done as such:
+
+```php
+#[MapInputName(SnakeCaseMapper::class)]
+class ContractData extends Data
+{
+ public function __construct(
+ public string $name,
+ public string $recordCompany,
+ ) {
+ }
+}
+```
+
+You can also use the `MapName` attribute when you want to combine input (see [transforming data objects](/docs/laravel-data/v4/as-a-resource/mapping-property-names)) and output property name mapping:
+
+```php
+#[MapName(SnakeCaseMapper::class)]
+class ContractData extends Data
+{
+ public function __construct(
+ public string $name,
+ public string $recordCompany,
+ ) {
+ }
+}
+```
+
+It is possible to set a default name mapping strategy for all data objects in the `data.php` config file:
+
+```php
+'name_mapping_strategy' => [
+ 'input' => SnakeCaseMapper::class,
+ 'output' => null,
+],
+```
+
+
+## Mapping Nested Properties
+
+You can also map nested properties using dot notation in the `MapInputName` attribute. This is useful when you want to extract a nested value from an array and assign it to a property in your data object:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ #[MapInputName("title.name")]
+ public string $title,
+ #[MapInputName("artists.0.name")]
+ public string $artist
+ ) {
+ }
+}
+```
+
+You can create the data object from an array with nested structures:
+
+```php
+SongData::from([
+ "title" => [
+ "name" => "Never gonna give you up"
+ ],
+ "artists" => [
+ ["name" => "Rick Astley"]
+ ]
+]);
+```
+
+The package has a set of default mappers available, you can find them [here](/docs/laravel-data/v4/advanced-usage/available-property-mappers).
diff --git a/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/model-to-data-object.md b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/model-to-data-object.md
new file mode 100644
index 0000000..0139fcc
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/model-to-data-object.md
@@ -0,0 +1,261 @@
+---
+title: From a model
+weight: 11
+---
+
+It is possible to create a data object from a model, let's say we have the following model:
+
+```php
+class Artist extends Model
+{
+
+}
+```
+
+It has the following columns in the database:
+
+- id
+- first_name
+- last_name
+- created_at
+- updated_at
+
+We can create a data object from this model like this:
+
+```php
+class ArtistData extends Data
+{
+ public int $id;
+ public string $first_name;
+ public string $last_name;
+ public CarbonImmutable $created_at;
+ public CarbonImmutable $updated_at;
+}
+```
+
+We now can create a data object from the model like this:
+
+```php
+$artist = ArtistData::from(Artist::find(1));
+```
+
+## Casts
+
+A model can have casts, these casts will be called before a data object is created. Let's extend the model:
+
+```php
+class Artist extends Model
+{
+ public function casts(): array
+ {
+ return [
+ 'properties' => 'array'
+ ];
+ }
+}
+```
+
+Within the database the new column will be stored as a JSON string, but in the data object we can just use the array
+type:
+
+```php
+class ArtistData extends Data
+{
+ public int $id;
+ public string $first_name;
+ public string $last_name;
+ public array $properties;
+ public CarbonImmutable $created_at;
+ public CarbonImmutable $updated_at;
+}
+```
+
+## Attributes & Accessors
+
+Laravel allows you to define attributes on a model, these will be called before a data object is created. Let's extend
+the model:
+
+```php
+class Artist extends Model
+{
+ protected function fullName(): Attribute
+ {
+ return Attribute::make(
+ get: fn () => $this->first_name . ' ' . $this->last_name,
+ );
+ }
+}
+```
+
+We now can use the attribute in the data object:
+
+```php
+class ArtistData extends Data
+{
+ public int $id;
+ public string $full_name;
+ public CarbonImmutable $created_at;
+ public CarbonImmutable $updated_at;
+}
+```
+
+Remember: we need to use the snake_case version of the attribute in the data object since that's how it is stored in the
+model. Read on for a more elegant solution when you want to use camelCase property names in your data object.
+
+It is also possible to define accessors on a model which are the successor of the attributes:
+
+```php
+class Artist extends Model
+{
+ public function getFullName(): Attribute
+ {
+ return Attribute::get(fn () => "{$this->first_name} {$this->last_name}");
+ }
+}
+```
+
+With the same data object we created earlier we can now use the accessor.
+
+## Mapping property names
+
+Sometimes you want to use camelCase property names in your data object, but the model uses snake_case. You can use
+an `MapInputName` to map the property names:
+
+```php
+use Spatie\LaravelData\Attributes\MapInputName;
+use Spatie\LaravelData\Mappers\SnakeCaseMapper;
+
+class ArtistData extends Data
+{
+ public int $id;
+ #[MapInputName(SnakeCaseMapper::class)]
+ public string $fullName;
+ public CarbonImmutable $created_at;
+ public CarbonImmutable $updated_at;
+}
+```
+
+An even more elegant solution would be to map every property within the data object:
+
+```php
+#[MapInputName(SnakeCaseMapper::class)]
+class ArtistData extends Data
+{
+ public int $id;
+ public string $fullName;
+ public CarbonImmutable $createdAt;
+ public CarbonImmutable $updatedAt;
+}
+```
+
+## Relations
+
+Let's create a new model:
+
+```php
+class Song extends Model
+{
+ public function artist(): BelongsTo
+ {
+ return $this->belongsTo(Artist::class);
+ }
+}
+```
+
+Which has the following columns in the database:
+
+- id
+- artist_id
+- title
+
+We update our previous model as such:
+
+```php
+class Artist extends Model
+{
+ public function songs(): HasMany
+ {
+ return $this->hasMany(Song::class);
+ }
+}
+```
+
+We can now create a data object like this:
+
+```php
+class SongData extends Data
+{
+ public int $id;
+ public string $title;
+}
+```
+
+And update our previous data object like this:
+
+```php
+class ArtistData extends Data
+{
+ public int $id;
+ /** @var array */
+ public array $songs;
+ public CarbonImmutable $created_at;
+ public CarbonImmutable $updated_at;
+}
+```
+
+We can now create a data object with the relations like this:
+
+```php
+$artist = ArtistData::from(Artist::with('songs')->find(1));
+```
+
+When you're not loading the relations in advance, `null` will be returned for the relation.
+
+It is however possible to load the relation on the fly by adding the `LoadRelation` attribute to the property:
+
+```php
+class ArtistData extends Data
+{
+ public int $id;
+ /** @var array */
+ #[LoadRelation]
+ public array $songs;
+ public CarbonImmutable $created_at;
+ public CarbonImmutable $updated_at;
+}
+```
+
+Now the data object with relations can be created like this:
+
+```php
+$artist = ArtistData::from(Artist::find(1));
+```
+
+We even eager-load the relation for performance, neat!
+
+### Be careful with automatic loading of relations
+
+Let's update the `SongData` class like this:
+
+```php
+class SongData extends Data
+{
+ public int $id;
+ public string $title;
+ #[LoadRelation]
+ public ArtistData $artist;
+}
+```
+
+When we now create a data object like this:
+
+```php
+$song = SongData::from(Song::find(1));
+```
+
+We'll end up in an infinite loop, since the `SongData` class will try to load the `ArtistData` class, which will try to
+load the `SongData` class, and so on.
+
+## Missing attributes
+
+When a model is missing attributes and `preventAccessingMissingAttributes` is enabled for a model the `MissingAttributeException` won't be thrown when creating a data object with a property that can be null or Optional.
diff --git a/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/nesting.md b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/nesting.md
new file mode 100644
index 0000000..d1baeb2
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/nesting.md
@@ -0,0 +1,166 @@
+---
+title: Nesting
+weight: 2
+---
+
+It is possible to nest multiple data objects:
+
+```php
+class ArtistData extends Data
+{
+ public function __construct(
+ public string $name,
+ public int $age,
+ ) {
+ }
+}
+
+class AlbumData extends Data
+{
+ public function __construct(
+ public string $title,
+ public ArtistData $artist,
+ ) {
+ }
+}
+```
+
+You can now create a data object as such:
+
+```php
+new AlbumData(
+ 'Never gonna give you up',
+ new ArtistData('Rick Astley', 22)
+);
+```
+
+Or you could create it from an array using a magic creation method:
+
+```php
+AlbumData::from([
+ 'title' => 'Never gonna give you up',
+ 'artist' => [
+ 'name' => 'Rick Astley',
+ 'age' => 22
+ ]
+]);
+```
+
+## Collections of data objects
+
+What if you want to nest a collection of data objects within a data object?
+
+That's perfectly possible, but there's a small catch; you should always define what kind of data objects will be stored
+within the collection. This is really important later on to create validation rules for data objects or partially
+transforming data objects.
+
+There are a few different ways to define what kind of data objects will be stored within a collection. You could use an
+annotation, for example, which has an advantage that your IDE will have better suggestions when working with the data
+object. And as an extra benefit, static analyzers like PHPStan will also be able to detect errors when your code
+is using the wrong types.
+
+A collection of data objects defined by annotation looks like this:
+
+```php
+/**
+ * @property \App\Data\SongData[] $songs
+ */
+class AlbumData extends Data
+{
+ public function __construct(
+ public string $title,
+ public array $songs,
+ ) {
+ }
+}
+```
+
+or like this when using properties:
+
+```php
+class AlbumData extends Data
+{
+ public string $title;
+
+ /** @var \App\Data\SongData[] */
+ public array $songs;
+}
+```
+
+If you've imported the data class you can use the short notation:
+
+```php
+use App\Data\SongData;
+
+class AlbumData extends Data
+{
+ /** @var SongData[] */
+ public array $songs;
+}
+```
+
+It is also possible to use generics:
+
+```php
+use App\Data\SongData;
+
+class AlbumData extends Data
+{
+ /** @var array */
+ public array $songs;
+}
+```
+
+The same is true for Laravel collections, but be sure to use two generic parameters to describe the collection. One for the collection key type and one for the data object type.
+
+```php
+use App\Data\SongData;
+use Illuminate\Support\Collection;
+
+class AlbumData extends Data
+{
+ /** @var Collection */
+ public Collection $songs;
+}
+```
+
+If the collection is well-annotated, the `Data` class doesn't need to use annotations:
+
+```php
+/**
+ * @template TKey of array-key
+ * @template TData of \App\Data\SongData
+ *
+ * @extends \Illuminate\Support\Collection
+ */
+class SongDataCollection extends Collection
+{
+}
+
+class AlbumData extends Data
+{
+ public function __construct(
+ public string $title,
+ public SongDataCollection $songs,
+ ) {
+ }
+}
+```
+
+You can also use an attribute to define the type of data objects that will be stored within a collection:
+
+```php
+class AlbumData extends Data
+{
+ public function __construct(
+ public string $title,
+ #[DataCollectionOf(SongData::class)]
+ public array $songs,
+ ) {
+ }
+}
+```
+
+This was the old way to define the type of data objects that will be stored within a collection. It is still supported, but we recommend using the annotation since static analyzers and IDEs will have better support for that.
+
+```php
diff --git a/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/optional-properties.md b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/optional-properties.md
new file mode 100644
index 0000000..81460ba
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/optional-properties.md
@@ -0,0 +1,71 @@
+---
+title: Optional properties
+weight: 6
+---
+
+Sometimes you have a data object with properties which shouldn't always be set, for example in a partial API update where you only want to update certain fields. In this case you can make a property `Optional` as such:
+
+```php
+use Spatie\LaravelData\Optional;
+
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string|Optional $artist,
+ ) {
+ }
+}
+```
+
+You can now create the data object as such:
+
+```php
+SongData::from([
+ 'title' => 'Never gonna give you up'
+]);
+```
+
+The value of `artist` will automatically be set to `Optional`. When you transform this data object to an array, it will look like this:
+
+```php
+[
+ 'title' => 'Never gonna give you up'
+]
+```
+
+You can manually use `Optional` values within magical creation methods as such:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string|Optional $artist,
+ ) {
+ }
+
+ public static function fromTitle(string $title): static
+ {
+ return new self($title, Optional::create());
+ }
+}
+```
+
+It is possible to automatically update `Optional` values to `null`:
+
+```php
+class SongData extends Data {
+ public function __construct(
+ public string $title,
+ public Optional|null|string $artist,
+ ) {
+ }
+}
+
+SongData::factory()
+ ->withoutOptionalValues()
+ ->from(['title' => 'Never gonna give you up']); // artist will `null` instead of `Optional`
+```
+
+You can read more about this [here](/docs/laravel-data/v4/as-a-data-transfer-object/factories#disabling-optional-values).
diff --git a/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/request-to-data-object.md b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/request-to-data-object.md
new file mode 100644
index 0000000..53f77f0
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/request-to-data-object.md
@@ -0,0 +1,108 @@
+---
+title: From a request
+weight: 10
+---
+
+You can create a data object by the values given in the request.
+
+For example, let's say you send a POST request to an endpoint with the following data:
+
+```json
+{
+ "title" : "Never gonna give you up",
+ "artist" : "Rick Astley"
+}
+```
+
+This package can automatically resolve a `SongData` object from these values by using the `SongData` class we saw in an
+earlier chapter:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+}
+```
+
+You can now inject the `SongData` class in your controller. It will already be filled with the values found in the
+request.
+
+```php
+class UpdateSongController
+{
+ public function __invoke(
+ Song $model,
+ SongData $data
+ ){
+ $model->update($data->all());
+
+ return redirect()->back();
+ }
+}
+```
+
+As an added benefit, these values will be validated before the data object is created. If the validation fails, a `ValidationException` will be thrown which will look like you've written the validation rules yourself.
+
+The package will also automatically validate all requests when passed to the from method:
+
+```php
+class UpdateSongController
+{
+ public function __invoke(
+ Song $model,
+ SongRequest $request
+ ){
+ $model->update(SongData::from($request)->all());
+
+ return redirect()->back();
+ }
+}
+```
+
+We have a complete section within these docs dedicated to validation, you can find it [here](/docs/laravel-data/v4/validation/introduction).
+
+## Getting the data object filled with request data from anywhere
+
+You can resolve a data object from the container.
+
+```php
+app(SongData::class);
+```
+
+We resolve a data object from the container, its properties will already be filled by the values of the request with matching key names.
+If the request contains data that is not compatible with the data object, a validation exception will be thrown.
+
+
+## Validating a collection of data objects:
+
+Let's say we want to create a data object like this from a request:
+
+```php
+class AlbumData extends Data
+{
+ public function __construct(
+ public string $title,
+ #[DataCollectionOf(SongData::class)]
+ public DataCollection $songs,
+ ) {
+ }
+}
+```
+
+Since the `SongData` has its own validation rules, the package will automatically apply them when resolving validation
+rules for this object.
+
+In this case the validation rules for `AlbumData` would look like this:
+
+```php
+[
+ 'title' => ['required', 'string'],
+ 'songs' => ['required', 'array'],
+ 'songs.*.title' => ['required', 'string'],
+ 'songs.*.artist' => ['required', 'string'],
+]
+```
diff --git a/_docs/laravel-libs/laravel-data/as-a-resource/_index.md b/_docs/laravel-libs/laravel-data/as-a-resource/_index.md
new file mode 100644
index 0000000..153109e
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-resource/_index.md
@@ -0,0 +1,5 @@
+---
+title: As a resource
+
+weight: 4
+---
diff --git a/_docs/laravel-libs/laravel-data/as-a-resource/appending-properties.md b/_docs/laravel-libs/laravel-data/as-a-resource/appending-properties.md
new file mode 100644
index 0000000..e6cae89
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-resource/appending-properties.md
@@ -0,0 +1,89 @@
+---
+title: Appending properties
+weight: 4
+---
+
+It is possible to add some extra properties to your data objects when they are transformed into a resource:
+
+```php
+SongData::from(Song::first())->additional([
+ 'year' => 1987,
+]);
+```
+
+This will output the following array:
+
+```php
+[
+ 'name' => 'Never gonna give you up',
+ 'artist' => 'Rick Astley',
+ 'year' => 1987,
+]
+```
+
+When using a closure, you have access to the underlying data object:
+
+```php
+SongData::from(Song::first())->additional([
+ 'slug' => fn(SongData $songData) => Str::slug($songData->title),
+]);
+```
+
+Which produces the following array:
+
+```php
+[
+ 'name' => 'Never gonna give you up',
+ 'artist' => 'Rick Astley',
+ 'slug' => 'never-gonna-give-you-up',
+]
+```
+
+It is also possible to add extra properties by overwriting the `with` method within your data object:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public int $id,
+ public string $title,
+ public string $artist
+ ) {
+ }
+
+ public static function fromModel(Song $song): self
+ {
+ return new self(
+ $song->id,
+ $song->title,
+ $song->artist
+ );
+ }
+
+ public function with()
+ {
+ return [
+ 'endpoints' => [
+ 'show' => action([SongsController::class, 'show'], $this->id),
+ 'edit' => action([SongsController::class, 'edit'], $this->id),
+ 'delete' => action([SongsController::class, 'delete'], $this->id),
+ ]
+ ];
+ }
+}
+```
+
+Now each transformed data object contains an `endpoints` key with all the endpoints for that data object:
+
+```php
+[
+ 'id' => 1,
+ 'name' => 'Never gonna give you up',
+ 'artist' => 'Rick Astley',
+ 'endpoints' => [
+ 'show' => 'https://spatie.be/songs/1',
+ 'edit' => 'https://spatie.be/songs/1',
+ 'delete' => 'https://spatie.be/songs/1',
+ ],
+]
+```
diff --git a/_docs/laravel-libs/laravel-data/as-a-resource/from-data-to-array.md b/_docs/laravel-libs/laravel-data/as-a-resource/from-data-to-array.md
new file mode 100644
index 0000000..58138df
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-resource/from-data-to-array.md
@@ -0,0 +1,126 @@
+---
+title: From data to array
+weight: 1
+---
+
+A data object can automatically be transformed into an array as such:
+
+```php
+SongData::from(Song::first())->toArray();
+```
+
+Which will output the following array:
+
+```php
+[
+ 'name' => 'Never gonna give you up',
+ 'artist' => 'Rick Astley'
+]
+```
+
+By default, calling `toArray` on a data object will recursively transform all properties to an array. This means that nested data objects and collections of data objects will also be transformed to arrays. Other complex types like `Carbon`, `DateTime`, `Enums`, etc... will be transformed into a string. We'll see in the [transformers](/docs/laravel-data/v4/as-a-resource/transformers) section how to configure and customize this behavior.
+
+If you only want to transform a data object to an array without transforming the properties, you can call the `all` method:
+
+```php
+SongData::from(Song::first())->all();
+```
+
+You can also manually transform a data object to JSON:
+
+```php
+SongData::from(Song::first())->toJson();
+```
+
+## Using collections
+
+Here's how to create a collection of data objects:
+
+```php
+SongData::collect(Song::all());
+```
+
+A collection can be transformed to array:
+
+```php
+SongData::collect(Song::all())->toArray();
+```
+
+Which will output the following array:
+
+```php
+[
+ [
+ "name": "Never Gonna Give You Up",
+ "artist": "Rick Astley"
+ ],
+ [
+ "name": "Giving Up on Love",
+ "artist": "Rick Astley"
+ ]
+]
+```
+
+## Nesting
+
+It is possible to nest data objects.
+
+```php
+class UserData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $email,
+ public SongData $favorite_song,
+ ) {
+ }
+
+ public static function fromModel(User $user): self
+ {
+ return new self(
+ $user->title,
+ $user->email,
+ SongData::from($user->favorite_song)
+ );
+ }
+}
+```
+
+When transformed to an array, this will look like the following:
+
+```php
+[
+ "name": "Ruben",
+ "email": "ruben@spatie.be",
+ "favorite_song": [
+ "name" : "Never Gonna Give You Up",
+ "artist" : "Rick Astley"
+ ]
+]
+```
+
+You can also nest a collection of data objects:
+
+```php
+class AlbumData extends Data
+{
+ /**
+ * @param Collection $songs
+ */
+ public function __construct(
+ public string $title,
+ public array $songs,
+ ) {
+ }
+
+ public static function fromModel(Album $album): self
+ {
+ return new self(
+ $album->title,
+ SongData::collect($album->songs)
+ );
+ }
+}
+```
+
+As always, remember to type collections of data objects by annotation or the `DataCollectionOf` attribute, this is essential to transform these collections correctly.
diff --git a/_docs/laravel-libs/laravel-data/as-a-resource/from-data-to-resource.md b/_docs/laravel-libs/laravel-data/as-a-resource/from-data-to-resource.md
new file mode 100644
index 0000000..8ec323e
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-resource/from-data-to-resource.md
@@ -0,0 +1,202 @@
+---
+title: From data to resource
+weight: 2
+---
+
+A data object will automatically be transformed to a JSON response when returned in a controller:
+
+```php
+class SongController
+{
+ public function show(Song $model)
+ {
+ return SongData::from($model);
+ }
+}
+```
+
+The JSON then will look like this:
+
+```json
+{
+ "name": "Never gonna give you up",
+ "artist": "Rick Astley"
+}
+```
+
+### Collections
+
+Returning a data collection from the controller like this:
+
+```php
+SongData::collect(Song::all());
+```
+
+Will return a collection automatically transformed to JSON:
+
+```json
+[
+ {
+ "name": "Never Gonna Give You Up",
+ "artist": "Rick Astley"
+ },
+ {
+ "name": "Giving Up on Love",
+ "artist": "Rick Astley"
+ }
+]
+```
+
+### Paginators
+
+It is also possible to provide a paginator:
+
+```php
+SongData::collect(Song::paginate());
+```
+
+The data object is smart enough to create a paginated response from this with links to the next, previous, last, ... pages:
+
+```json
+{
+ "data" : [
+ {
+ "name" : "Never Gonna Give You Up",
+ "artist" : "Rick Astley"
+ },
+ {
+ "name" : "Giving Up on Love",
+ "artist" : "Rick Astley"
+ }
+ ],
+ "meta" : {
+ "current_page": 1,
+ "first_page_url": "https://spatie.be/?page=1",
+ "from": 1,
+ "last_page": 7,
+ "last_page_url": "https://spatie.be/?page=7",
+ "next_page_url": "https://spatie.be/?page=2",
+ "path": "https://spatie.be/",
+ "per_page": 15,
+ "prev_page_url": null,
+ "to": 15,
+ "total": 100
+ }
+}
+```
+
+
+## Transforming empty objects
+
+When creating a new model, you probably want to provide a blueprint to the frontend with the required data to create a model. For example:
+
+```json
+{
+ "name": null,
+ "artist": null
+}
+```
+
+You could make each property of the data object nullable like this:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public ?string $title,
+ public ?string $artist,
+ ) {
+ }
+
+ // ...
+}
+```
+
+This approach would work, but as soon as the model is created, the properties won't be `null`, which doesn't follow our data model. So it is considered a bad practice.
+
+That's why in such cases, you can return an empty representation of the data object:
+
+```php
+class SongsController
+{
+ public function create(): array
+ {
+ return SongData::empty();
+ }
+}
+```
+
+Which will output the following JSON:
+
+```json
+{
+ "name": null,
+ "artist": null
+}
+```
+
+The `empty` method on a data object will return an array with default empty values for the properties in the data object.
+
+It is possible to change the default values within this array by providing them in the constructor of the data object:
+
+ ```php
+ class SongData extends Data
+{
+ public function __construct(
+ public string $title = 'Title of the song here',
+ public string $artist = "An artist",
+ ) {
+ }
+
+ // ...
+}
+ ```
+
+Now when we call `empty`, our JSON looks like this:
+
+```json
+{
+ "name": "Title of the song here",
+ "artist": "An artist"
+}
+```
+
+You can also pass defaults within the `empty` call:
+
+```php
+SongData::empty([
+ 'name' => 'Title of the song here',
+ 'artist' => 'An artist'
+]);
+```
+
+Or filter the properties that should be included in the empty response:
+
+```php
+SongData::empty(only: ['name']); // Will only return the `name` property
+
+SongData::empty(except: ['name']); // Will return the `artist` property
+```
+
+## Response status code
+
+When a resource is being returned from a controller, the status code of the response will automatically be set to `201 CREATED` when Laravel data detects that the request's method is `POST`. In all other cases, `200 OK` will be returned.
+
+## Resource classes
+
+To make it a bit more clear that a data object is a resource, you can use the `Resource` class instead of the `Data` class:
+
+```php
+use Spatie\LaravelData\Resource;
+
+class SongResource extends Resource
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+}
+```
+
+These resource classes have as an advantage that they won't validate data or check authorization, They are only used to transform data which makes them a bit faster.
diff --git a/_docs/laravel-libs/laravel-data/as-a-resource/lazy-properties.md b/_docs/laravel-libs/laravel-data/as-a-resource/lazy-properties.md
new file mode 100644
index 0000000..e02416b
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-resource/lazy-properties.md
@@ -0,0 +1,568 @@
+---
+title: Including and excluding properties
+weight: 6
+---
+
+Sometimes you don't want all the properties included when transforming a data object to an array, for example:
+
+```php
+class AlbumData extends Data
+{
+ /**
+ * @param Collection $songs
+ */
+ public function __construct(
+ public string $title,
+ public Collection $songs,
+ ) {
+ }
+}
+```
+
+This will always output a collection of songs, which can become quite large. With lazy properties, we can include
+properties when we want to:
+
+```php
+class AlbumData extends Data
+{
+ /**
+ * @param Lazy|Collection $songs
+ */
+ public function __construct(
+ public string $title,
+ public Lazy|Collection $songs,
+ ) {
+ }
+
+ public static function fromModel(Album $album): self
+ {
+ return new self(
+ $album->title,
+ Lazy::create(fn() => SongData::collect($album->songs))
+ );
+ }
+}
+```
+
+The `songs` key won't be included in the resource when transforming it from a model. Because the closure that provides
+the data won't be called when transforming the data object unless we explicitly demand it.
+
+Now when we transform the data object as such:
+
+```php
+AlbumData::from(Album::first())->toArray();
+```
+
+We get the following array:
+
+```php
+[
+ 'title' => 'Together Forever',
+]
+```
+
+As you can see, the `songs` property is missing in the array output. Here's how you can include it.
+
+```php
+AlbumData::from(Album::first())->include('songs');
+```
+
+## Including lazy properties
+
+Lazy properties will only be included when the `include` method is called on the data object with the property's name.
+
+It is also possible to nest these includes. For example, let's update the `SongData` class and make all of its
+properties lazy:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public Lazy|string $title,
+ public Lazy|string $artist,
+ ) {
+ }
+
+ public static function fromModel(Song $song): self
+ {
+ return new self(
+ Lazy::create(fn() => $song->title),
+ Lazy::create(fn() => $song->artist)
+ );
+ }
+}
+```
+
+Now `name` or `artist` should be explicitly included. This can be done as such on the `AlbumData`:
+
+```php
+AlbumData::from(Album::first())->include('songs.name', 'songs.artist');
+```
+
+Or you could combine these includes:
+
+```php
+AlbumData::from(Album::first())->include('songs.{name, artist}');
+```
+
+If you want to include all the properties of a data object, you can do the following:
+
+```php
+AlbumData::from(Album::first())->include('songs.*');
+```
+
+Explicitly including properties of data objects also works on a single data object. For example, our `UserData` looks
+like this:
+
+```php
+class UserData extends Data
+{
+ public function __construct(
+ public string $title,
+ public Lazy|SongData $favorite_song,
+ ) {
+ }
+
+ public static function fromModel(User $user): self
+ {
+ return new self(
+ $user->title,
+ Lazy::create(fn() => SongData::from($user->favorite_song))
+ );
+ }
+}
+```
+
+We can include properties of the data object just like we would with collections of data objects:
+
+```php
+return UserData::from(Auth::user())->include('favorite_song.name');
+```
+
+## Types of Lazy properties
+
+### Conditional Lazy properties
+
+You can include lazy properties in different ways:
+
+```php
+Lazy::create(fn() => SongData::collect($album->songs));
+```
+
+With a basic `Lazy` property, you must explicitly include it when the data object is transformed.
+
+Sometimes you only want to include a property when a specific condition is true. This can be done with conditional lazy
+properties:
+
+```php
+Lazy::when(fn() => $this->is_admin, fn() => SongData::collect($album->songs));
+```
+
+The property will only be included when the `is_admin` property of the data object is true. It is not possible to
+include the property later on with the `include` method when a condition is not accepted.
+
+### Relational Lazy properties
+
+You can also only include a lazy property when a particular relation is loaded on the model as such:
+
+```php
+Lazy::whenLoaded('songs', $album, fn() => SongData::collect($album->songs));
+```
+
+Now the property will only be included when the song's relation is loaded on the model.
+
+## Default included lazy properties
+
+It is possible to mark a lazy property as included by default:
+
+```php
+Lazy::create(fn() => SongData::collect($album->songs))->defaultIncluded();
+```
+
+The property will now always be included when the data object is transformed. You can explicitly exclude properties that
+were default included as such:
+
+```php
+AlbumData::create(Album::first())->exclude('songs');
+```
+
+## Auto Lazy
+
+Writing Lazy properties can be a bit cumbersome. It is often a repetitive task to write the same code over and over
+again while the package can infer almost everything.
+
+Let's take a look at our previous example:
+
+```php
+class UserData extends Data
+{
+ public function __construct(
+ public string $title,
+ public Lazy|SongData $favorite_song,
+ ) {
+ }
+
+ public static function fromModel(User $user): self
+ {
+ return new self(
+ $user->title,
+ Lazy::create(fn() => SongData::from($user->favorite_song))
+ );
+ }
+}
+```
+
+The package knows how to get the property from the model and wrap it into a data object, but since we're using a lazy
+property, we need to write our own magic creation method with a lot of repetitive code.
+
+In such a situation auto lazy might be a good fit, instead of casting the property directly into the data object, the
+casting process is wrapped in a lazy Closure.
+
+This makes it possible to rewrite the example as such:
+
+```php
+#[AutoLazy]
+class UserData extends Data
+{
+ public function __construct(
+ public string $title,
+ public Lazy|SongData $favorite_song,
+ ) {
+ }
+}
+```
+
+While achieving the same result!
+
+Auto Lazy wraps the casting process of a value for every property typed as `Lazy` into a Lazy Closure when the
+`AutoLazy` attribute is present on the class.
+
+It is also possible to use the `AutoLazy` attribute on a property level:
+
+```php
+class UserData extends Data
+{
+ public function __construct(
+ public string $title,
+ #[AutoLazy]
+ public Lazy|SongData $favorite_song,
+ ) {
+ }
+}
+```
+
+The auto lazy process won't be applied in the following situations:
+
+- When a null value is passed to the property
+- When the property value isn't present in the input payload and the property typed as `Optional`
+- When a Lazy Closure is passed to the property
+
+### Auto lazy with model relations
+
+When you're constructing a data object from an Eloquent model, it is also possible to automatically create lazy
+properties for model relations which are only resolved when the relation is loaded:
+
+```php
+class UserData extends Data
+{
+ public function __construct(
+ public string $title,
+ #[AutoWhenLoadedLazy]
+ public Lazy|SongData $favoriteSong,
+ ) {
+ }
+}
+```
+
+When the `favoriteSong` relation is loaded on the model, the property will be included in the data object.
+
+If the name of the relation doesn't match the property name, you can specify the relation name:
+
+```php
+class UserData extends Data
+{
+ public function __construct(
+ public string $title,
+ #[AutoWhenLoadedLazy('favoriteSong')]
+ public Lazy|SongData $favorite_song,
+ ) {
+ }
+}
+```
+
+The package will use the regular casting process when the relation is loaded, so it is also perfectly possible to create a collection of data objects:
+
+```php
+class UserData extends Data
+{
+ /**
+ * @param Lazy|array $favoriteSongs
+ */
+ public function __construct(
+ public string $title,
+ #[AutoWhenLoadedLazy]
+ public Lazy|array $favoriteSongs,
+ ) {
+ }
+}
+```
+
+## Only and Except
+
+Lazy properties are great for reducing payloads sent over the wire. However, when you completely want to remove a
+property Laravel's `only` and `except` methods can be used:
+
+```php
+AlbumData::from(Album::first())->only('songs'); // will only show `songs`
+AlbumData::from(Album::first())->except('songs'); // will show everything except `songs`
+```
+
+It is also possible to use multiple keys:
+
+```php
+AlbumData::from(Album::first())->only('songs.name', 'songs.artist');
+AlbumData::from(Album::first())->except('songs.name', 'songs.artist');
+```
+
+And special keys like described above:
+
+```php
+AlbumData::from(Album::first())->only('songs.{name, artist}');
+AlbumData::from(Album::first())->except('songs.{name, artist}');
+```
+
+Only and except always take precedence over include and exclude, which means that when a property is hidden by `only` or
+`except` it is impossible to show it again using `include`.
+
+### Conditionally
+
+It is possible to add an `include`, `exclude`, `only` or `except` if a certain condition is met:
+
+```php
+AlbumData::from(Album::first())->includeWhen('songs', auth()->user()->isAdmin);
+AlbumData::from(Album::first())->excludeWhen('songs', auth()->user()->isAdmin);
+AlbumData::from(Album::first())->onlyWhen('songs', auth()->user()->isAdmin);
+AlbumData::from(Album::first())->except('songs', auth()->user()->isAdmin);
+```
+
+You can also use the values of the data object in such condition:
+
+```php
+AlbumData::from(Album::first())->includeWhen('songs', fn(AlbumData $data) => count($data->songs) > 0);
+AlbumData::from(Album::first())->excludeWhen('songs', fn(AlbumData $data) => count($data->songs) > 0);
+AlbumData::from(Album::first())->onlyWhen('songs', fn(AlbumData $data) => count($data->songs) > 0);
+AlbumData::from(Album::first())->exceptWhen('songs', fn(AlbumData $data) => count($data->songs) > 0);
+```
+
+In some cases, you may want to define an include on a class level by implementing a method:
+
+```php
+class AlbumData extends Data
+{
+ /**
+ * @param Lazy|Collection $songs
+ */
+ public function __construct(
+ public string $title,
+ public Lazy|Collection $songs,
+ ) {
+ }
+
+ public function includeProperties(): array
+ {
+ return [
+ 'songs' => $this->title === 'Together Forever',
+ ];
+ }
+}
+```
+
+It is even possible to include nested properties:
+
+```php
+class AlbumData extends Data
+{
+ /**
+ * @param Lazy|Collection $songs
+ */
+ public function __construct(
+ public string $title,
+ public Lazy|Collection $songs,
+ ) {
+ }
+
+ public function includeProperties(): array
+ {
+ return [
+ 'songs.title' => $this->title === 'Together Forever',
+ ];
+ }
+}
+```
+
+You can define exclude, except and only partials on a data class:
+
+- You can define **excludes** in a `excludeProperties` method
+- You can define **except** in a `exceptProperties` method
+- You can define **only** in a `onlyProperties` method
+
+## Using query strings
+
+It is possible to include or exclude lazy properties by the URL query string:
+
+For example, when we create a route `my-account`:
+
+```php
+// in web.php
+
+Route::get('my-account', fn() => UserData::from(User::first()));
+```
+
+We now specify that a key of the data object is allowed to be included by query string on the data object:
+
+```php
+class UserData extends Data
+{
+ public static function allowedRequestIncludes(): ?array
+ {
+ return ['favorite_song'];
+ }
+
+ // ...
+}
+```
+
+Our JSON would look like this when we request `https://spatie.be/my-account`:
+
+```json
+{
+ "name" : "Ruben Van Assche"
+}
+```
+
+We can include `favorite_song` by adding it to the query in the URL as such:
+
+```
+https://spatie.be/my-account?include=favorite_song
+```
+
+```json
+{
+ "name" : "Ruben Van Assche",
+ "favorite_song" : {
+ "name" : "Never Gonna Give You Up",
+ "artist" : "Rick Astley"
+ }
+}
+```
+
+We can also include multiple properties by separating them with a comma:
+
+```
+https://spatie.be/my-account?include=favorite_song,favorite_movie
+```
+
+Or by using a group input:
+
+```
+https://spatie.be/my-account?include[]=favorite_song&include[]=favorite_movie
+```
+
+Including properties works for data objects and data collections.
+
+### Allowing includes by query string
+
+By default, it is disallowed to include properties by query string:
+
+```php
+class UserData extends Data
+{
+ public static function allowedRequestIncludes(): ?array
+ {
+ return [];
+ }
+}
+```
+
+You can pass several names of properties which are allowed to be included by query string:
+
+```php
+class UserData extends Data
+{
+ public static function allowedRequestIncludes(): ?array
+ {
+ return ['favorite_song', 'name'];
+ }
+}
+```
+
+Or you can allow all properties to be included by query string:
+
+```php
+class UserData extends Data
+{
+ public static function allowedRequestIncludes(): ?array
+ {
+ return null;
+ }
+}
+```
+
+### Other operations
+
+It is also possible to run exclude, except and only operations on a data object:
+
+- You can define **excludes** in `allowedRequestExcludes` and use the `exclude` key in your query string
+- You can define **except** in `allowedRequestExcept` and use the `except` key in your query string
+- You can define **only** in `allowedRequestOnly` and use the `only` key in your query string
+
+## Mutability
+
+Adding includes/excludes/only/except to a data object will only affect the data object (and its nested chain) once:
+
+```php
+AlbumData::from(Album::first())->include('songs')->toArray(); // will include songs
+AlbumData::from(Album::first())->toArray(); // will not include songs
+```
+
+If you want to add includes/excludes/only/except to a data object and its nested chain that will be used for all future
+transformations, you can define them in their respective *properties methods:
+
+```php
+class AlbumData extends Data
+{
+ /**
+ * @param Lazy|Collection $songs
+ */
+ public function __construct(
+ public string $title,
+ public Lazy|Collection $songs,
+ ) {
+ }
+
+ public function includeProperties(): array
+ {
+ return [
+ 'songs'
+ ];
+ }
+}
+```
+
+Or use the permanent methods:
+
+```php
+AlbumData::from(Album::first())->includePermanently('songs');
+AlbumData::from(Album::first())->excludePermanently('songs');
+AlbumData::from(Album::first())->onlyPermanently('songs');
+AlbumData::from(Album::first())->exceptPermanently('songs');
+```
+
+When using a conditional includes/excludes/only/except, you can set the permanent flag:
+
+```php
+AlbumData::from(Album::first())->includeWhen('songs', fn(AlbumData $data) => count($data->songs) > 0, permanent: true);
+AlbumData::from(Album::first())->excludeWhen('songs', fn(AlbumData $data) => count($data->songs) > 0, permanent: true);
+AlbumData::from(Album::first())->onlyWhen('songs', fn(AlbumData $data) => count($data->songs) > 0), permanent: true);
+AlbumData::from(Album::first())->except('songs', fn(AlbumData $data) => count($data->songs) > 0, permanent: true);
+```
diff --git a/_docs/laravel-libs/laravel-data/as-a-resource/mapping-property-names.md b/_docs/laravel-libs/laravel-data/as-a-resource/mapping-property-names.md
new file mode 100644
index 0000000..c21faff
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-resource/mapping-property-names.md
@@ -0,0 +1,84 @@
+---
+title: Mapping property names
+weight: 3
+---
+
+Sometimes you might want to change the name of a property in the transformed payload, with attributes this is possible:
+
+```php
+class ContractData extends Data
+{
+ public function __construct(
+ public string $name,
+ #[MapOutputName('record_company')]
+ public string $recordCompany,
+ ) {
+ }
+}
+```
+
+Now our array looks like this:
+
+```php
+[
+ 'name' => 'Rick Astley',
+ 'record_company' => 'RCA Records',
+]
+```
+
+Changing all property names in a data object to snake_case as output data can be done as such:
+
+```php
+#[MapOutputName(SnakeCaseMapper::class)]
+class ContractData extends Data
+{
+ public function __construct(
+ public string $name,
+ public string $recordCompany,
+ ) {
+ }
+}
+```
+
+You can also use the `MapName` attribute when you want to combine input and output property name mapping:
+
+```php
+#[MapName(SnakeCaseMapper::class)]
+class ContractData extends Data
+{
+ public function __construct(
+ public string $name,
+ public string $recordCompany,
+ ) {
+ }
+}
+```
+
+It is possible to set a default name mapping strategy for all data objects in the `data.php` config file:
+
+```php
+'name_mapping_strategy' => [
+ 'input' => null,
+ 'output' => SnakeCaseMapper::class,
+],
+```
+
+You can now create a data object as such:
+
+```php
+$contract = new ContractData(
+ name: 'Rick Astley',
+ recordCompany: 'RCA Records',
+);
+```
+
+And a transformed version of the data object will look like this:
+
+```php
+[
+ 'name' => 'Rick Astley',
+ 'record_company' => 'RCA Records',
+]
+```
+
+The package has a set of default mappers available, you can find them [here](/docs/laravel-data/v4/advanced-usage/available-property-mappers).
diff --git a/_docs/laravel-libs/laravel-data/as-a-resource/transformers.md b/_docs/laravel-libs/laravel-data/as-a-resource/transformers.md
new file mode 100644
index 0000000..7d778b4
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-resource/transformers.md
@@ -0,0 +1,195 @@
+---
+title: Transforming data
+weight: 7
+---
+
+Transformers allow you to transform complex types to simple types. This is useful when you want to transform a data object to an array or JSON.
+
+No complex transformations are required for the default types (string, bool, int, float, enum and array), but special types like `Carbon` or a Laravel Model will need extra attention.
+
+Transformers are simple classes that will convert a such complex types to something simple like a `string` or `int`. For example, we can transform a `Carbon` object to `16-05-1994`, `16-05-1994T00:00:00+00` or something completely different.
+
+There are two ways you can define transformers: locally and globally.
+
+## Local transformers
+
+When you want to transform a specific property, you can use an attribute with the transformer you want to use:
+
+```php
+class ArtistData extends Data{
+ public function __construct(
+ public string $name,
+ #[WithTransformer(DateTimeInterfaceTransformer::class)]
+ public Carbon $birth_date
+ ) {
+ }
+}
+```
+
+The `DateTimeInterfaceTransformer` is shipped with the package and will transform objects of type `Carbon`, `CarbonImmutable`, `DateTime` and `DateTimeImmutable` to a string.
+
+The format used for converting the date to string can be set in the `data.php` config file. It is also possible to manually define a format:
+
+```php
+class ArtistData extends Data{
+ public function __construct(
+ public string $name,
+ #[WithTransformer(DateTimeInterfaceTransformer::class, format: 'm-Y')]
+ public Carbon $birth_date
+ ) {
+ }
+}
+```
+
+Next to a `DateTimeInterfaceTransformer` the package also ships with an `ArrayableTransformer` that transforms an `Arrayable` object to an array.
+
+It is possible to create transformers for your specific types. You can find more info [here](/docs/laravel-data/v4/advanced-usage/creating-a-transformer).
+
+## Global transformers
+
+Global transformers are defined in the `data.php` config file and are used when no local transformer for a property was added. By default, there are two transformers:
+
+```php
+use Illuminate\Contracts\Support\Arrayable;
+use Spatie\LaravelData\Transformers\ArrayableTransformer;
+use Spatie\LaravelData\Transformers\DateTimeInterfaceTransformer;
+
+/*
+ * Global transformers will take complex types and transform them into simple
+ * types.
+ */
+'transformers' => [
+ DateTimeInterface::class => DateTimeInterfaceTransformer::class,
+ Arrayable::class => ArrayableTransformer::class,
+],
+```
+
+The package will look through these global transformers and tries to find a suitable transformer. You can define transformers for:
+
+- a **specific implementation** (e.g. CarbonImmutable)
+- an **interface** (e.g. DateTimeInterface)
+- a **base class** (e.g. Enum)
+
+## Getting a data object without transforming
+
+It is possible to get an array representation of a data object without transforming the properties. This means `Carbon` objects won't be transformed into strings. And also, nested data objects and `DataCollection`s won't be transformed into arrays. You can do this by calling the `all` method on a data object like this:
+
+```php
+ArtistData::from($artist)->all();
+```
+
+## Getting a data object (on steroids)
+
+Internally the package uses the `transform` method for operations like `toArray`, `all`, `toJson` and so on. This method is highly configurable, when calling it without any arguments it will behave like the `toArray` method:
+
+```php
+ArtistData::from($artist)->transform();
+```
+
+Producing the following result:
+
+```php
+[
+ 'name' => 'Rick Astley',
+ 'birth_date' => '06-02-1966',
+]
+```
+
+It is possible to disable the transformation of values, which will make the `transform` method behave like the `all` method:
+
+```php
+use Spatie\LaravelData\Support\Transformation\TransformationContext;
+
+ArtistData::from($artist)->transform(
+ TransformationContextFactory::create()->withoutValueTransformation()
+);
+```
+
+Outputting the following array:
+
+```php
+[
+ 'name' => 'Rick Astley',
+ 'birth_date' => Carbon::parse('06-02-1966'),
+]
+```
+
+The [mapping of property names](/docs/laravel-data/v4/as-a-resource/mapping-property-names) can also be disabled:
+
+```php
+ArtistData::from($artist)->transform(
+ TransformationContextFactory::create()->withoutPropertyNameMapping()
+);
+```
+
+It is possible to enable [wrapping](/docs/laravel-data/v4/as-a-resource/wrapping-data) the data object:
+
+```php
+use Spatie\LaravelData\Support\Wrapping\WrapExecutionType;
+
+ArtistData::from($artist)->transform(
+ TransformationContextFactory::create()->withWrapping()
+);
+```
+
+Outputting the following array:
+
+```php
+[
+ 'data' => [
+ 'name' => 'Rick Astley',
+ 'birth_date' => '06-02-1966',
+ ],
+]
+```
+
+You can also add additional global transformers as such:
+
+```php
+ArtistData::from($artist)->transform(
+ TransformationContextFactory::create()->withGlobalTransformer(
+ 'string',
+ StringToUpperTransformer::class
+ )
+);
+```
+
+## Transformation depth
+
+When transforming a complicated structure of nested data objects it is possible that an infinite loop is created of data objects including each other.
+To prevent this, a transformation depth can be set, when that depth is reached when transforming, either an exception will be thrown or an empty
+array is returned, stopping the transformation.
+
+This transformation depth can be set globally in the `data.php` config file:
+
+```php
+'max_transformation_depth' => 20,
+```
+
+Setting the transformation depth to `null` will disable the transformation depth check:
+
+```php
+'max_transformation_depth' => null,
+```
+
+It is also possible if a `MaxTransformationDepthReached` exception should be thrown or an empty array should be returned:
+
+```php
+'throw_when_max_transformation_depth_reached' => true,
+```
+
+It is also possible to set the transformation depth on a specific transformation by using a `TransformationContextFactory`:
+
+```php
+ArtistData::from($artist)->transform(
+ TransformationContextFactory::create()->maxDepth(20)
+);
+```
+
+By default, an exception will be thrown when the maximum transformation depth is reached. This can be changed to return an empty array as such:
+
+```php
+ArtistData::from($artist)->transform(
+ TransformationContextFactory::create()->maxDepth(20, throw: false)
+);
+```
diff --git a/_docs/laravel-libs/laravel-data/as-a-resource/wrapping.md b/_docs/laravel-libs/laravel-data/as-a-resource/wrapping.md
new file mode 100644
index 0000000..995c256
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/as-a-resource/wrapping.md
@@ -0,0 +1,225 @@
+---
+title: Wrapping
+weight: 5
+---
+
+By default, when a data object is transformed into JSON in your controller, it looks like this:
+
+```json
+{
+ "name" : "Never gonna give you up",
+ "artist" : "Rick Astley"
+}
+```
+
+It is possible to wrap a data object:
+
+```php
+SongData::from(Song::first())->wrap('data');
+```
+
+Now the JSON looks like this:
+
+```json
+{
+ "data" : {
+ "name" : "Never gonna give you up",
+ "artist" : "Rick Astley"
+ }
+}
+```
+
+Data objects and collections will only get wrapped when you're sending them as a response and never when calling `toArray` or `toJson` on it.
+
+It is possible to define a default wrap key inside a data object:
+
+```php
+class SongData extends Data
+{
+ public function defaultWrap(): string
+ {
+ return 'data';
+ }
+
+ // ...
+}
+```
+
+Or you can set a global wrap key inside the `data.php` config file:
+
+```php
+ /*
+ * Data objects can be wrapped into a key like 'data' when used as a resource,
+ * this key can be set globally here for all data objects. You can pass in
+ * `null` if you want to disable wrapping.
+ */
+ 'wrap' => 'data',
+```
+
+## Wrapping collections
+
+Collections can be wrapped just like data objects:
+
+```php
+SongData::collect(Song::all(), DataCollection::class)->wrap('data');
+```
+
+Notice here, for now we only support wrapping `DataCollections`, `PaginatedDataCollections` and `CursorPaginatedDataCollections` on the root level. Wrapping won't work for Laravel Collections or arrays (for now) since the package cannot interfere. Nested properties with such types can be wrapped though (see further).
+
+The JSON will now look like this:
+
+```json
+{
+ "data" : [
+ {
+ "name" : "Never Gonna Give You Up",
+ "artist" : "Rick Astley"
+ },
+ {
+ "name" : "Giving Up on Love",
+ "artist" : "Rick Astley"
+ }
+ ]
+}
+```
+
+It is possible to set the data key in paginated collections:
+
+```php
+SongData::collect(Song::paginate(), PaginatedDataCollection::class)->wrap('paginated_data');
+```
+
+Which will let the JSON look like this:
+
+```json
+{
+ "paginated_data" : [
+ {
+ "name" : "Never Gonna Give You Up",
+ "artist" : "Rick Astley"
+ },
+ {
+ "name" : "Giving Up on Love",
+ "artist" : "Rick Astley"
+ }
+ ],
+ "meta" : {
+ "current_page" : 1,
+ "first_page_url" : "https://spatie.be/?page=1",
+ "from" : 1,
+ "last_page" : 7,
+ "last_page_url" : "https://spatie.be/?page=7",
+ "next_page_url" : "https://spatie.be/?page=2",
+ "path" : "https://spatie.be/",
+ "per_page" : 15,
+ "prev_page_url" : null,
+ "to" : 15,
+ "total" : 100
+ }
+}
+```
+
+## Nested wrapping
+
+A data object included inside another data object will never be wrapped even if a wrap is set:
+
+```php
+class UserData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $email,
+ public SongData $favorite_song,
+ ) {
+ }
+
+ public static function fromModel(User $user): self
+ {
+ return new self(
+ $user->title,
+ $user->email,
+ SongData::create($user->favorite_song)->wrap('data')
+ );
+ }
+}
+
+UserData::from(User::first())->wrap('data');
+```
+
+```json
+{
+ "data" : {
+ "name" : "Ruben",
+ "email" : "ruben@spatie.be",
+ "favorite_song" : {
+ "name" : "Never Gonna Give You Up",
+ "artist" : "Rick Astley"
+ }
+ }
+}
+```
+
+A data collection inside a data object will get wrapped when a wrapping key is set (in order to mimic Laravel resources):
+
+```php
+use Spatie\LaravelData\Attributes\DataCollectionOf;
+use Spatie\LaravelData\DataCollection;
+
+class AlbumData extends Data
+{
+ public function __construct(
+ public string $title,
+ #[DataCollectionOf(SongData::class)]
+ public DataCollection $songs,
+ ) {
+ }
+
+ public static function fromModel(Album $album): self
+ {
+ return new self(
+ $album->title,
+ SongData::collect($album->songs, DataCollection::class)->wrap('data')
+ );
+ }
+}
+
+AlbumData::from(Album::first())->wrap('data');
+```
+
+The JSON will look like this:
+
+```json
+{
+ "data" : {
+ "title" : "Whenever You Need Somebody",
+ "songs": {
+ "data" : [
+ {
+ "name" : "Never Gonna Give You Up",
+ "artist" : "Rick Astley"
+ },
+ {
+ "name" : "Giving Up on Love",
+ "artist" : "Rick Astley"
+ }
+ ]
+ }
+ }
+}
+```
+
+## Disabling wrapping
+
+Whenever a data object is wrapped due to the default wrap method or a global wrap key, it is possible to disable wrapping on a data object/collection:
+
+```php
+SongData::from(Song::first())->withoutWrapping();
+```
+
+## Getting a wrapped array
+
+By default, `toArray` and `toJson` will never wrap a data object or collection, but it is possible to get a wrapped array:
+
+```php
+SongData::from(Song::first())->wrap('data')->transform(wrapExecutionType: WrapExecutionType::Enabled);
+```
diff --git a/_docs/laravel-libs/laravel-data/changelog.md b/_docs/laravel-libs/laravel-data/changelog.md
new file mode 100644
index 0000000..dc9856e
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/changelog.md
@@ -0,0 +1,6 @@
+---
+title: Changelog
+weight: 7
+---
+
+All notable changes to laravel-data are documented [on GitHub](https://github.com/spatie/laravel-data/blob/main/CHANGELOG.md)
diff --git a/_docs/laravel-libs/laravel-data/getting-started/_index.md b/_docs/laravel-libs/laravel-data/getting-started/_index.md
new file mode 100644
index 0000000..84d5ab4
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/getting-started/_index.md
@@ -0,0 +1,4 @@
+---
+title: Getting started
+weight: 1
+---
diff --git a/_docs/laravel-libs/laravel-data/getting-started/quickstart.md b/_docs/laravel-libs/laravel-data/getting-started/quickstart.md
new file mode 100644
index 0000000..5b89492
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/getting-started/quickstart.md
@@ -0,0 +1,1028 @@
+---
+title: Quickstart
+weight: 1
+---
+
+In this quickstart, we'll guide you through the most important functionalities of the package and how to use them.
+
+First, you should [install the package](/docs/laravel-data/v4/installation-setup).
+
+We will create a blog with different posts, so let's start with the `PostData` object. A post has a title, some content, a status and a date when it was published:
+
+```php
+use Spatie\LaravelData\Data;
+
+class PostData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $content,
+ public PostStatus $status,
+ public ?CarbonImmutable $published_at
+ ) {
+ }
+}
+```
+
+Extending your data objects from the base `Data` object is the only requirement for using the package. We add the requirements for a post as public properties.
+
+The `PostStatus` is a native enum:
+
+```php
+enum PostStatus: string
+{
+ case draft = 'draft';
+ case published = 'published';
+ case archived = 'archived';
+}
+```
+
+We store this `PostData` object as `app/Data/PostData.php`, so we have all our data objects bundled in one directory, but you're free to store them wherever you want within your application.
+
+Tip: you can also quickly make a data object using the CLI: `php artisan make:data Post`, it will create a file `app/Data/PostData.php`.
+
+We can now create a `PostData` object just like any plain PHP object:
+
+```php
+$post = new PostData(
+ 'Hello laravel-data',
+ 'This is an introduction post for the new package',
+ PostStatus::published,
+ CarbonImmutable::now()
+);
+```
+
+The package also allows you to create these data objects from any type, for example, an array:
+
+```php
+$post = PostData::from([
+ 'title' => 'Hello laravel-data',
+ 'content' => 'This is an introduction post for the new package',
+ 'status' => PostStatus::published,
+ 'published_at' => CarbonImmutable::now(),
+]);
+```
+
+Or a `Post` model with the required properties:
+
+```php
+class Post extends Model
+{
+ protected $guarded = [];
+
+ protected $casts = [
+ 'status' => PostStatus::class,
+ 'published_at' => 'immutable_datetime',
+ ];
+}
+```
+
+Can be quickly transformed into a `PostData` object:
+
+```php
+PostData::from(Post::findOrFail($id));
+```
+
+## Using requests
+
+Let's say we have a Laravel request coming from the frontend with these properties. Our controller would then validate these properties, and then it would store them in a model; this can be done as such:
+
+```php
+class DataController
+{
+ public function __invoke(Request $request)
+ {
+ $request->validate($this->rules());
+
+ $postData = PostData::from([
+ 'title' => $request->input('title'),
+ 'content' => $request->input('content'),
+ 'status' => $request->enum('status', PostStatus::class),
+ 'published_at' => $request->has('published_at')
+ ? CarbonImmutable::createFromFormat(DATE_ATOM, $request->input('published_at'))
+ : null,
+ ]);
+
+ Post::create($postData->toArray());
+
+ return redirect()->back();
+ }
+
+ private function rules(): array
+ {
+ return [
+ 'title' => ['required', 'string'],
+ 'content' => ['required', 'string'],
+ 'status' => ['required', new Enum(PostStatus::class)],
+ 'published_at' => ['nullable', 'date'],
+ ];
+ }
+}
+```
+
+That's a lot of code to fill a data object, using laravel data we can remove a lot of code:
+
+```php
+class DataController
+{
+ public function __invoke(PostData $postData)
+ {
+ Post::create($postData->toArray());
+
+ return redirect()->back();
+ }
+}
+```
+
+Let's see what's happening:
+
+1) Laravel boots up, and the router directs to the `DataController`
+2) Because we're injecting `PostData`, two things happen
+ - `PostData` will generate validation rules based on the property types and validate the request
+ - The `PostData` object is automatically created from the request
+3) We're now in the `__invoke` method with a valid `PostData` object
+
+You can always check the generated validation rules of a data object like this:
+
+```php
+class DataController
+{
+ public function __invoke(Request $request)
+ {
+ dd(PostData::getValidationRules($request->toArray()));
+ }
+}
+```
+
+Which provides us with the following set of rules:
+
+```php
+array:4 [
+ "title" => array:2 [
+ 0 => "required"
+ 1 => "string"
+ ]
+ "content" => array:2 [
+ 0 => "required"
+ 1 => "string"
+ ]
+ "status" => array:2 [
+ 0 => "required"
+ 1 => Illuminate\Validation\Rules\Enum {
+ #type: "App\Enums\PostStatus"
+ }
+ ]
+ "published_at" => array:1 [
+ 0 => "nullable"
+ ]
+]
+```
+
+As you can see, we're missing the `date` rule on the `published_at` property. By default, this package will automatically generate the following rules:
+
+- `required` when a property cannot be `null`
+- `nullable` when a property can be `null`
+- `numeric` when a property type is `int`
+- `string` when a property type is `string`
+- `boolean` when a property type is `bool`
+- `numeric` when a property type is `float`
+- `array` when a property type is `array`
+- `enum:*` when a property type is a native enum
+
+You can read more about the process of automated rule generation [here](/docs/laravel-data/v4/as-a-data-transfer-object/request-to-data-object#content-automatically-inferring-rules-for-properties-1).
+
+We can easily add the date rule by using an attribute to our data object:
+
+```php
+class PostData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $content,
+ public PostStatus $status,
+ #[Date]
+ public ?CarbonImmutable $published_at
+ ) {
+ }
+}
+```
+
+Now our validation rules look like this:
+
+```php
+array:4 [
+ "title" => array:2 [
+ 0 => "required"
+ 1 => "string"
+ ]
+ "content" => array:2 [
+ 0 => "required"
+ 1 => "string"
+ ]
+ "status" => array:2 [
+ 0 => "required"
+ 1 => Illuminate\Validation\Rules\Enum {
+ #type: "App\Enums\PostStatus"
+ }
+ ]
+ "published_at" => array:2 [
+ 0 => "nullable"
+ 1 => "date"
+ ]
+]
+```
+
+There are [tons](/docs/laravel-data/v4/advanced-usage/validation-attributes) of validation rule attributes you can add to data properties. There's still much more you can do with validating data objects. Read more about it [here](/docs/laravel-data/v4/as-a-data-transfer-object/request-to-data-object#validating-a-request).
+
+Tip: By default, when creating a data object in a non request context, no validation is executed:
+
+```php
+$post = PostData::from([
+ // As long as PHP accepts the values for the properties, the object will be created
+]);
+```
+
+You can create validated objects without requests like this:
+
+```php
+$post = PostData::validateAndCreate([
+ // Before creating the object, each value will be validated
+]);
+```
+
+## Casting data
+
+Let's send the following payload to the controller:
+
+```json
+{
+ "title" : "Hello laravel-data",
+ "content" : "This is an introduction post for the new package",
+ "status" : "published",
+ "published_at" : "2021-09-24T13:31:20+00:00"
+}
+```
+
+We get the `PostData` object populated with the values in the JSON payload, neat! But how did the package convert the `published_at` string into a `CarbonImmutable` object?
+
+It is possible to define casts within the `data.php` config file. By default, the casts list looks like this:
+
+```php
+'casts' => [
+ DateTimeInterface::class => Spatie\LaravelData\Casts\DateTimeInterfaceCast::class,
+],
+```
+
+This code means that if a class property is of type `DateTime`, `Carbon`, `CarbonImmutable`, ... it will be automatically cast.
+
+You can create your own casts; read more about it [here](/docs/laravel-data/v4/advanced-usage/creating-a-cast).
+
+### Local casts
+
+Sometimes you need one specific cast in one specific data object; in such a case defining a local cast specific for the data object is a good option.
+
+Let's say we have an `Image` class:
+
+```php
+class Image
+{
+ public function __construct(
+ public string $file,
+ public int $size,
+ ) {
+ }
+}
+```
+
+There are two options how an `Image` can be created:
+
+a) From a file upload
+b) From an array when the image has been stored in the database
+
+Let's create a cast for this:
+
+```php
+use Illuminate\Http\UploadedFile;
+use Spatie\LaravelData\Casts\Cast;
+use Spatie\LaravelData\Casts\Uncastable;
+use Spatie\LaravelData\Support\DataProperty;
+use Str;
+
+class ImageCast implements Cast
+{
+ public function cast(DataProperty $property, mixed $value, array $properties, CreationContext $context): Image|Uncastable
+ {
+ // Scenario A
+ if ($value instanceof UploadedFile) {
+ $filename = $value->store('images', 'public');
+
+ return new Image(
+ $filename,
+ $value->getSize(),
+ );
+ }
+
+ // Scenario B
+ if (is_array($value)) {
+ return new Image(
+ $value['filename'],
+ $value['size'],
+ );
+ }
+
+ return Uncastable::create();
+ }
+}
+
+```
+
+Ultimately, we return `Uncastable`, telling the package to try other casts (if available) because this cast cannot cast the value.
+
+The last thing we need to do is add the cast to our property. We use the `WithCast` attribute for this:
+
+```php
+class PostData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $content,
+ public PostStatus $status,
+ #[WithCast(ImageCast::class)]
+ public ?Image $image,
+ #[Date]
+ public ?CarbonImmutable $published_at
+ ) {
+ }
+}
+```
+
+You can read more about casting [here](/docs/laravel-data/v4/as-a-data-transfer-object/casts).
+
+## Customizing the creation of a data object
+
+We've seen the powerful `from` method on data objects, you can throw anything at it, and it will cast the value into a data object. But what if it can't cast a specific type, or what if you want to change how a type is precisely cast into a data object?
+
+It is possible to manually define how a type is converted into a data object. What if we would like to support to create posts via an email syntax like this:
+
+```
+title|status|content
+```
+
+Creating a `PostData` object would then look like this:
+
+```php
+PostData::from('Hello laravel-data|draft|This is an introduction post for the new package');
+```
+
+To make this work, we need to add a magic creation function within our data class:
+
+```php
+class PostData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $content,
+ public PostStatus $status,
+ #[WithCast(ImageCast::class)]
+ public ?Image $image,
+ #[Date]
+ public ?CarbonImmutable $published_at
+ ) {
+ }
+
+ public static function fromString(string $post): PostData
+ {
+ $fields = explode('|', $post);
+
+ return new self(
+ $fields[0],
+ $fields[2],
+ PostStatus::from($fields[1]),
+ null,
+ null
+ );
+ }
+}
+```
+
+Magic creation methods allow you to create data objects from any type by passing them to the `from` method of a data
+object, you can read more about it [here](/docs/laravel-data/v4/as-a-data-transfer-object/creating-a-data-object#content-magical-creation).
+
+It can be convenient to transform more complex models than our `Post` into data objects because you can decide how a model
+would be mapped onto a data object.
+
+## Nesting data objects and arrays of data objects
+
+Now that we have a fully functional post-data object. We're going to create a new data object, `AuthorData`, that will store the name of an author and an array of posts the author wrote:
+
+```php
+use Spatie\LaravelData\Attributes\DataCollectionOf;
+
+class AuthorData extends Data
+{
+ /**
+ * @param array $posts
+ */
+ public function __construct(
+ public string $name,
+ public array $posts
+ ) {
+ }
+}
+```
+
+Notice that we've typed the `$posts` property as an array of `PostData` objects using a docblock. This will be very useful later on! The package always needs to know what type of data objects are stored in an array. Of course, when you're storing other types then data objects this is not required but recommended.
+
+We can now create an author object as such:
+
+```php
+new AuthorData(
+ 'Ruben Van Assche',
+ PostData::collect([
+ [
+ 'title' => 'Hello laravel-data',
+ 'content' => 'This is an introduction post for the new package',
+ 'status' => PostStatus::draft,
+ ],
+ [
+ 'title' => 'What is a data object',
+ 'content' => 'How does it work',
+ 'status' => PostStatus::published,
+ ],
+ ])
+);
+```
+
+As you can see, the `collect` method can create an array of the `PostData` objects.
+
+But there's another way; thankfully, our `from` method makes this process even more straightforward:
+
+```php
+AuthorData::from([
+ 'name' => 'Ruben Van Assche',
+ 'posts' => [
+ [
+ 'title' => 'Hello laravel-data',
+ 'content' => 'This is an introduction post for the new package',
+ 'status' => PostStatus::draft,
+ ],
+ [
+ 'title' => 'What is a data object',
+ 'content' => 'How does it work',
+ 'status' => PostStatus::published,
+ ],
+ ],
+]);
+```
+
+The data object is smart enough to convert an array of posts into an array of post data. Mapping data coming from the front end was never that easy!
+
+### Nesting objects
+
+Nesting an individual data object into another data object is perfectly possible. Remember the `Image` class we created? We needed a cast for it, but it is a perfect fit for a data object; let's create it:
+
+```php
+class ImageData extends Data
+{
+ public function __construct(
+ public string $filename,
+ public string $size,
+ ) {
+ }
+
+ public static function fromUploadedImage(UploadedFile $file): self
+ {
+ $stored = $file->store('images', 'public');
+
+ return new ImageData(
+ url($stored),
+ $file->getSize(),
+ );
+ }
+}
+```
+
+In our `ImageCast`, the image could be created from a file upload or an array; we'll handle that first case with the `fromUploadedImage` magic method. Because `Image` is now `ImageData,` the second case is automatically handled by the package, neat!
+
+We'll update our `PostData` object as such:
+
+```php
+class PostData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $content,
+ public PostStatus $status,
+ public ?ImageData $image,
+ #[Date]
+ public ?CarbonImmutable $published_at
+ ) {
+ }
+}
+```
+
+Creating a `PostData` object now can be done as such:
+
+```php
+return PostData::from([
+ 'title' => 'Hello laravel-data',
+ 'content' => 'This is an introduction post for the new package',
+ 'status' => PostStatus::published,
+ 'image' => [
+ 'filename' => 'images/8JQtgd0XaPtt9CqkPJ3eWFVV4BAp6JR9ltYAIKqX.png',
+ 'size' => 16524
+ ],
+ 'published_at' => CarbonImmutable::create(2020, 05, 16),
+]);
+```
+
+When we create the `PostData` object in a controller as such:
+
+```php
+public function __invoke(PostData $postData)
+{
+ return $postData;
+}
+```
+
+We get a validation error:
+
+```json
+{
+ "message": "The image must be an array. (and 2 more errors)",
+ "errors": {
+ "image": [
+ "The image must be an array."
+ ],
+ "image.filename": [
+ "The image.filename field is required."
+ ],
+ "image.size": [
+ "The image.size field is required."
+ ]
+ }
+}
+```
+
+This is a neat feature of data; it expects a nested `ImageData` data object when being created from the request, an array with the keys `filename` and `size`.
+
+We can completely skip validation for the `image` property by using the `WithoutValidation` attribute:
+
+```php
+class PostData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $content,
+ public PostStatus $status,
+ #[WithoutValidation]
+ public ?ImageData $image,
+ #[Date]
+ public ?CarbonImmutable $published_at
+ ) {
+ }
+}
+```
+
+It is possible to override the validation rules generated by the package by defining a static `rules` method on the data object:
+
+```php
+class PostData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $content,
+ public PostStatus $status,
+ public ?ImageData $image,
+ #[Date]
+ public ?CarbonImmutable $published_at
+ ) {
+ }
+
+ public static function rules(ValidationContext $context): array
+ {
+ return [
+ 'status' => ['nullable', 'in:published'],
+ ];
+ }
+}
+```
+
+Please notice that it is impossible to override rules for nested data objects; those are always generated based on the nested data object's properties.
+
+## Usage in controllers
+
+We've been creating many data objects from all sorts of values, time to change course and go the other way around and start transforming data objects into arrays.
+
+Let's say we have an API controller that returns a post:
+
+```php
+public function __invoke()
+{
+ return PostData::from([
+ 'title' => 'Hello laravel-data',
+ 'content' => 'This is an introduction post for the new package',
+ 'status' => PostStatus::published,
+ 'published_at' => CarbonImmutable::create(2020, 05, 16),
+ ]);
+}
+```
+
+By returning a data object in a controller, it is automatically converted to JSON:
+
+```json
+{
+ "title": "Hello laravel-data",
+ "content": "This is an introduction post for the new package",
+ "status": "published",
+ "image": null,
+ "published_at": "2020-05-16T00:00:00+00:00"
+}
+```
+
+You can also easily convert a data object into an array as such:
+
+```php
+$postData->toArray();
+```
+
+Which gives you an array like this:
+
+```php
+array:5 [
+ "title" => "Hello laravel-data"
+ "content" => "This is an introduction post for the new package"
+ "status" => "published"
+ "image" => null
+ "published_at" => "2020-05-16T00:00:00+00:00"
+]
+```
+
+It is possible to transform a data object into an array and keep complex types like the `PostStatus` and `CarbonImmutable`:
+
+```php
+$postData->all();
+```
+
+This will give the following array:
+
+```php
+array:5 [
+ "title" => "Hello laravel-data"
+ "content" => "This is an introduction post for the new package"
+ "status" => App\Enums\PostStatus {
+ +name: "published"
+ +value: "published"
+ }
+ "image" => null
+ "published_at" => Carbon\CarbonImmutable {
+ ...
+ }
+]
+
+```
+
+As you can see, if we transform a data object to JSON, the `CarbonImmutable` published at date is transformed into a string.
+
+## Using transformers
+
+A few sections ago, we used casts to cast simple types into complex types. Transformers work the other way around. They transform complex types into simple ones and transform a data object into a simpler structure like an array or JSON.
+
+Like the `DateTimeInterfaceCast`, we also have a `DateTimeInterfaceTransformer` that converts `DateTime,` `Carbon,`... objects into strings.
+
+This `DateTimeInterfaceTransformer` is registered in the `data.php` config file and will automatically be used when a data object needs to transform a `DateTimeInterface` object:
+
+```php
+'transformers' => [
+ DateTimeInterface::class => \Spatie\LaravelData\Transformers\DateTimeInterfaceTransformer::class,
+ \Illuminate\Contracts\Support\Arrayable::class => \Spatie\LaravelData\Transformers\ArrayableTransformer::class,
+],
+```
+
+Remember the image object we created earlier; we stored a file size and filename in the object. But that could be more useful; let's provide the URL to the file when transforming the object. Just like casts, transformers also can be local. Let's implement one for `Image`:
+
+```php
+class ImageTransformer implements Transformer
+{
+ public function transform(DataProperty $property, mixed $value, TransformationContext $context): string
+ {
+ if (! $value instanceof Image) {
+ throw new Exception("Not an image");
+ }
+
+ return url($value->filename);
+ }
+}
+```
+
+We can now use this transformer in the data object like this:
+
+```php
+class PostData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $content,
+ public PostStatus $status,
+ #[WithCast(ImageCast::class)]
+ #[WithTransformer(ImageTransformer::class)]
+ public ?Image $image,
+ #[Date]
+ public ?CarbonImmutable $published_at
+ ) {
+ }
+}
+```
+
+In our controller, we return the object as such:
+
+```php
+public function __invoke()
+{
+ return PostData::from([
+ 'title' => 'Hello laravel-data',
+ 'content' => 'This is an introduction post for the new package',
+ 'status' => PostStatus::published,
+ 'image' => [
+ 'filename' => 'images/8JQtgd0XaPtt9CqkPJ3eWFVV4BAp6JR9ltYAIKqX.png',
+ 'size' => 16524
+ ],
+ 'published_at' => CarbonImmutable::create(2020, 05, 16),
+ ]);
+}
+```
+
+Which leads to the following JSON:
+
+```php
+{
+ "title": "Hello laravel-data",
+ "content": "This is an introduction post for the new package",
+ "status": "published",
+ "image": "http://laravel-playbox.test/images/8JQtgd0XaPtt9CqkPJ3eWFVV4BAp6JR9ltYAIKqX.png",
+ "published_at": "2020-05-16T00:00:00+00:00"
+}
+```
+
+You can read more about transformers [here](/docs/laravel-data/v4/as-a-resource/transformers).
+
+## Generating a blueprint
+
+We can now send our posts as JSON to the front, but what if we want to create a new post? When using Inertia, for example, we might need an empty blueprint object like this that the user could fill in:
+
+```json
+{
+ "title" : null,
+ "content" : null,
+ "status" : null,
+ "image": null,
+ "published_at" : null
+}
+```
+
+Such an array can be generated with the `empty` method, which will return an empty array following the structure of your data object:
+
+```php
+PostData::empty();
+```
+
+Which will return the following array:
+
+```php
+[
+ 'title' => null,
+ 'content' => null,
+ 'status' => null,
+ 'image' => null,
+ 'published_at' => null,
+]
+```
+
+It is possible to set the status of the post to draft by default:
+
+```php
+PostData::empty([
+ 'status' => PostStatus::draft;
+]);
+```
+
+## Lazy properties
+
+For the last section of this quickstart, we will look at the `AuthorData` object again; let's say that we want to compose a list of all the authors. What if we had 100+ authors who have all written more than 100+ posts:
+
+```json
+[
+ {
+ "name" : "Ruben Van Assche",
+ "posts" : [
+ {
+ "title" : "Hello laravel-data",
+ "content" : "This is an introduction post for the new package",
+ "status" : "published",
+ "image" : "http://laravel-playbox.test/images/8JQtgd0XaPtt9CqkPJ3eWFVV4BAp6JR9ltYAIKqX.png",
+ "published_at" : "2021-09-24T13:31:20+00:00"
+ }
+
+ // ...
+ ]
+ },
+ {
+ "name" : "Freek van der Herten",
+ "posts" : [
+ {
+ "title" : "Hello laravel-event-sourcing",
+ "content" : "This is an introduction post for the new package",
+ "status" : "published",
+ "image" : "http://laravel-playbox.test/images/8JQtgd0XaPtt9CqkPJ3eWFVV4BAp6JR9ltYAIKqX.png"
+ "published_at" : "2021-09-24T13:31:20+00:00"
+ }
+
+ // ...
+ ]
+ }
+
+ // ...
+]
+```
+
+As you can see, this will quickly be a large set of data we would send over JSON, which we don't want to do. Since each author includes his name and all the posts, he has written.
+
+In the end, we only want something like this:
+
+```json
+[
+ {
+ "name" : "Ruben Van Assche"
+ },
+ {
+ "name" : "Freek van der Herten"
+ }
+
+ // ...
+]
+```
+
+This functionality can be achieved with lazy properties. Lazy properties are only added to a payload when we explicitly ask it. They work with closures that are executed only when this is required:
+
+```php
+class AuthorData extends Data
+{
+ /**
+ * @param Collection|Lazy $posts
+ */
+ public function __construct(
+ public string $name,
+ public Collection|Lazy $posts
+ ) {
+ }
+
+ public static function fromModel(Author $author)
+ {
+ return new self(
+ $author->name,
+ Lazy::create(fn() => PostData::collect($author->posts))
+ );
+ }
+}
+```
+
+When we now create a new author:
+
+```php
+$author = Author::create([
+ 'name' => 'Ruben Van Assche'
+]);
+
+$author->posts()->create([
+ [
+ 'title' => 'Hello laravel-data',
+ 'content' => 'This is an introduction post for the new package',
+ 'status' => 'draft',
+ 'published_at' => null,
+ ]
+]);
+
+AuthorData::from($author);
+```
+
+Transforming it into JSON looks like this:
+
+```json
+{
+ "name" : "Ruben Van Assche"
+}
+```
+
+If we want to include the posts, the only thing we need to do is this:
+
+```php
+$postData->include('posts')->toJson();
+```
+
+Which will result in this JSON:
+
+```json
+{
+ "name" : "Ruben Van Assche",
+ "posts" : [
+ {
+ "title" : "Hello laravel-data",
+ "content" : "This is an introduction post for the new package",
+ "status" : "published",
+ "published_at" : "2021-09-24T13:31:20+00:00"
+ }
+ ]
+}
+```
+
+Let's take this one step further. What if we want to only include the title of each post? We can do this by making all the other properties within the post data object also lazy:
+
+```php
+class PostData extends Data
+{
+ public function __construct(
+ public string|Lazy $title,
+ public string|Lazy $content,
+ public PostStatus|Lazy $status,
+ #[WithoutValidation]
+ #[WithCast(ImageCast::class)]
+ #[WithTransformer(ImageTransformer::class)]
+ public ImageData|Lazy|null $image,
+ #[Date]
+ public CarbonImmutable|Lazy|null $published_at
+ ) {
+ }
+
+ public static function fromModel(Post $post): PostData
+ {
+ return new self(
+ Lazy::create(fn() => $post->title),
+ Lazy::create(fn() => $post->content),
+ Lazy::create(fn() => $post->status),
+ Lazy::create(fn() => $post->image),
+ Lazy::create(fn() => $post->published_at)
+ );
+ }
+
+ public static function rules(ValidationContext $context): array
+ {
+ return [
+ 'image' => ['nullable', 'image'],
+ ];
+ }
+}
+```
+
+Now the only thing we need to do is include the title:
+
+```php
+$postData->include('posts.title')->toJson();
+```
+
+Which will result in this JSON:
+
+```json
+{
+ "name" : "Ruben Van Assche",
+ "posts" : [
+ {
+ "title" : "Hello laravel-data"
+ }
+ ]
+}
+```
+
+If we also want to include the status, we can do the following:
+
+```php
+$postData->include('posts.{title,status}')->toJson();
+```
+
+It is also possible to include all properties of the posts like this:
+
+```php
+$postData->include('posts.*')->toJson();
+```
+
+You can do quite a lot with lazy properties like including them:
+
+- when a model relation is loaded like Laravel API resources
+- when they are requested in the URL query
+- by default, with an option to exclude them
+
+And a lot more. You can read all about it [here](/docs/laravel-data/v4/as-a-resource/lazy-properties).
+
+## Conclusion
+
+So that's it, a quick overview of this package. We barely scratched the surface of what's possible with the package. There's still a lot more you can do with data objects like:
+
+- [casting](/docs/laravel-data/v4/advanced-usage/eloquent-casting) them into Eloquent models
+- [transforming](/docs/laravel-data/v4/advanced-usage/typescript) the structure to typescript
+- [working](/docs/laravel-data/v4/as-a-data-transfer-object/collections) with `DataCollections`
+- [optional properties](/docs/laravel-data/v4/as-a-data-transfer-object/optional-properties) not always required when creating a data object
+- [wrapping](/docs/laravel-data/v4/as-a-resource/wrapping) transformed data into keys
+- [mapping](/docs/laravel-data/v4/as-a-data-transfer-object/mapping-property-names) property names when creating or transforming a data object
+- [appending](/docs/laravel-data/v4/as-a-resource/appending-properties) extra data
+- [including](/docs/laravel-data/v4/as-a-resource/lazy-properties#content-using-query-strings) properties using the URL query string
+- [inertia](https://spatie.be/docs/laravel-data/v4/advanced-usage/use-with-inertia) support for lazy properties
+- and so much more ... you'll find all the information here in the docs
diff --git a/_docs/laravel-libs/laravel-data/installation-setup.md b/_docs/laravel-libs/laravel-data/installation-setup.md
new file mode 100644
index 0000000..b87d7a4
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/installation-setup.md
@@ -0,0 +1,219 @@
+---
+title: Installation & setup
+weight: 4
+---
+
+You can install the package via composer:
+
+```bash
+composer require spatie/laravel-data
+```
+
+Optionally, You can publish the config file with:
+
+```bash
+php artisan vendor:publish --provider="Spatie\LaravelData\LaravelDataServiceProvider" --tag="data-config"
+```
+
+This is the contents of the published config file:
+
+```php
+
+ DATE_ATOM,
+
+ /*
+ * When transforming or casting dates, the following timezone will be used to
+ * convert the date to the correct timezone. If set to null no timezone will
+ * be passed.
+ */
+ 'date_timezone' => null,
+
+ /*
+ * It is possible to enable certain features of the package, these would otherwise
+ * be breaking changes, and thus they are disabled by default. In the next major
+ * version of the package, these features will be enabled by default.
+ */
+ 'features' => [
+ 'cast_and_transform_iterables' => false,
+
+ /*
+ * When trying to set a computed property value, the package will throw an exception.
+ * You can disable this behaviour by setting this option to true, which will then just
+ * ignore the value being passed into the computed property and recalculate it.
+ */
+ 'ignore_exception_when_trying_to_set_computed_property_value' => false,
+ ],
+
+ /*
+ * Global transformers will take complex types and transform them into simple
+ * types.
+ */
+ 'transformers' => [
+ DateTimeInterface::class => \Spatie\LaravelData\Transformers\DateTimeInterfaceTransformer::class,
+ \Illuminate\Contracts\Support\Arrayable::class => \Spatie\LaravelData\Transformers\ArrayableTransformer::class,
+ BackedEnum::class => Spatie\LaravelData\Transformers\EnumTransformer::class,
+ ],
+
+ /*
+ * Global casts will cast values into complex types when creating a data
+ * object from simple types.
+ */
+ 'casts' => [
+ DateTimeInterface::class => Spatie\LaravelData\Casts\DateTimeInterfaceCast::class,
+ BackedEnum::class => Spatie\LaravelData\Casts\EnumCast::class,
+// Enumerable::class => Spatie\LaravelData\Casts\EnumerableCast::class,
+ ],
+
+ /*
+ * Rule inferrers can be configured here. They will automatically add
+ * validation rules to properties of a data object based upon
+ * the type of the property.
+ */
+ 'rule_inferrers' => [
+ Spatie\LaravelData\RuleInferrers\SometimesRuleInferrer::class,
+ Spatie\LaravelData\RuleInferrers\NullableRuleInferrer::class,
+ Spatie\LaravelData\RuleInferrers\RequiredRuleInferrer::class,
+ Spatie\LaravelData\RuleInferrers\BuiltInTypesRuleInferrer::class,
+ Spatie\LaravelData\RuleInferrers\AttributesRuleInferrer::class,
+ ],
+
+ /*
+ * Normalizers return an array representation of the payload, or null if
+ * it cannot normalize the payload. The normalizers below are used for
+ * every data object, unless overridden in a specific data object class.
+ */
+ 'normalizers' => [
+ Spatie\LaravelData\Normalizers\ModelNormalizer::class,
+ // Spatie\LaravelData\Normalizers\FormRequestNormalizer::class,
+ Spatie\LaravelData\Normalizers\ArrayableNormalizer::class,
+ Spatie\LaravelData\Normalizers\ObjectNormalizer::class,
+ Spatie\LaravelData\Normalizers\ArrayNormalizer::class,
+ Spatie\LaravelData\Normalizers\JsonNormalizer::class,
+ ],
+
+ /*
+ * Data objects can be wrapped into a key like 'data' when used as a resource,
+ * this key can be set globally here for all data objects. You can pass in
+ * `null` if you want to disable wrapping.
+ */
+ 'wrap' => null,
+
+ /*
+ * Adds a specific caster to the Symphony VarDumper component which hides
+ * some properties from data objects and collections when being dumped
+ * by `dump` or `dd`. Can be 'enabled', 'disabled' or 'development'
+ * which will only enable the caster locally.
+ */
+ 'var_dumper_caster_mode' => 'development',
+
+ /*
+ * It is possible to skip the PHP reflection analysis of data objects
+ * when running in production. This will speed up the package. You
+ * can configure where data objects are stored and which cache
+ * store should be used.
+ *
+ * Structures are cached forever as they'll become stale when your
+ * application is deployed with changes. You can set a duration
+ * in seconds if you want the cache to clear after a certain
+ * timeframe.
+ */
+ 'structure_caching' => [
+ 'enabled' => true,
+ 'directories' => [app_path('Data')],
+ 'cache' => [
+ 'store' => env('CACHE_STORE', env('CACHE_DRIVER', 'file')),
+ 'prefix' => 'laravel-data',
+ 'duration' => null,
+ ],
+ 'reflection_discovery' => [
+ 'enabled' => true,
+ 'base_path' => base_path(),
+ 'root_namespace' => null,
+ ],
+ ],
+
+ /*
+ * A data object can be validated when created using a factory or when calling the from
+ * method. By default, only when a request is passed the data is being validated. This
+ * behaviour can be changed to always validate or to completely disable validation.
+ */
+ 'validation_strategy' => \Spatie\LaravelData\Support\Creation\ValidationStrategy::OnlyRequests->value,
+
+ /*
+ * A data object can map the names of its properties when transforming (output) or when
+ * creating (input). By default, the package will not map any names. You can set a
+ * global strategy here, or override it on a specific data object.
+ */
+ 'name_mapping_strategy' => [
+ 'input' => null,
+ 'output' => null,
+ ],
+
+ /*
+ * When using an invalid include, exclude, only or except partial, the package will
+ * throw an exception. You can disable this behaviour by setting this option to true.
+ */
+ 'ignore_invalid_partials' => false,
+
+ /*
+ * When transforming a nested chain of data objects, the package can end up in an infinite
+ * loop when including a recursive relationship. The max transformation depth can be
+ * set as a safety measure to prevent this from happening. When set to null, the
+ * package will not enforce a maximum depth.
+ */
+ 'max_transformation_depth' => null,
+
+ /*
+ * When the maximum transformation depth is reached, the package will throw an exception.
+ * You can disable this behaviour by setting this option to true which will return an
+ * empty array.
+ */
+ 'throw_when_max_transformation_depth_reached' => true,
+
+ /*
+ * When using the `make:data` command, the package will use these settings to generate
+ * the data classes. You can override these settings by passing options to the command.
+ */
+ 'commands' => [
+
+ /*
+ * Provides default configuration for the `make:data` command. These settings can be overridden with options
+ * passed directly to the `make:data` command for generating single Data classes, or if not set they will
+ * automatically fall back to these defaults. See `php artisan make:data --help` for more information
+ */
+ 'make' => [
+
+ /*
+ * The default namespace for generated Data classes. This exists under the application's root namespace,
+ * so the default 'Data` will end up as '\App\Data', and generated Data classes will be placed in the
+ * app/Data/ folder. Data classes can live anywhere, but this is where `make:data` will put them.
+ */
+ 'namespace' => 'Data',
+
+ /*
+ * This suffix will be appended to all data classes generated by make:data, so that they are less likely
+ * to conflict with other related classes, controllers or models with a similar name without resorting
+ * to adding an alias for the Data object. Set to a blank string (not null) to disable.
+ */
+ 'suffix' => 'Data',
+ ],
+ ],
+
+ /*
+ * When using Livewire, the package allows you to enable or disable the synths
+ * these synths will automatically handle the data objects and their
+ * properties when used in a Livewire component.
+ */
+ 'livewire' => [
+ 'enable_synths' => false,
+ ],
+];
+```
diff --git a/_docs/laravel-libs/laravel-data/introduction.md b/_docs/laravel-libs/laravel-data/introduction.md
new file mode 100644
index 0000000..3e9bd7c
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/introduction.md
@@ -0,0 +1,58 @@
+---
+title: Introduction
+weight: 1
+---
+
+This package enables the creation of rich data objects which can be used in various ways. Using this package you only need to describe your data once:
+
+- instead of a form request, you can use a data object
+- instead of an API transformer, you can use a data object
+- instead of manually writing a typescript definition, you can use... 🥁 a data object
+
+A `laravel-data` specific object is just a regular PHP object that extends from `Data`:
+
+```php
+use Spatie\LaravelData\Data;
+
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+}
+```
+
+By extending from `Data` you enable a lot of new functionality like:
+
+- Automatically transforming data objects into resources (like the Laravel API resources)
+- Transform only the requested parts of data objects with lazy properties
+- Automatically creating data objects from request data and validating them
+- Automatically resolve validation rules for properties within a data object
+- Make it possible to construct a data object from any type you want
+- Add support for automatically validating data objects when creating them
+- Generate TypeScript definitions from your data objects you can use on the frontend
+- Save data objects as properties of an Eloquent model
+- And a lot more ...
+
+Why would you be using this package?
+
+- You can be sure that data is typed when it leaves your app and comes back again from the frontend which makes a lot less errors
+- You don't have to write the same properties three times (in a resource, in a data transfer object and in request validation)
+- You need to write a lot less of validation rules because they are obvious through PHP's type system
+- You get TypeScript versions of the data objects for free
+
+Let's dive right into it!
+
+## Are you a visual learner?
+
+In this talk, given at Laracon US, you'll see [an introduction to Laravel Data](https://www.youtube.com/watch?v=CrO_7Df1cBc).
+
+## We have badges!
+
+
+
+
+
+
diff --git a/_docs/laravel-libs/laravel-data/questions-issues.md b/_docs/laravel-libs/laravel-data/questions-issues.md
new file mode 100644
index 0000000..1c76ae3
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/questions-issues.md
@@ -0,0 +1,8 @@
+---
+title: Questions and issues
+weight: 6
+---
+
+Find yourself stuck using the package? Found a bug? Do you have general questions or suggestions for improving Laravel Data? Feel free to [create an issue on GitHub](https://github.com/spatie/laravel-data/issues), we'll try to address it as soon as possible.
+
+If you've found a bug regarding security please mail [freek@spatie.be](mailto:freek@spatie.be) instead of using the issue tracker.
diff --git a/_docs/laravel-libs/laravel-data/requirements.md b/_docs/laravel-libs/laravel-data/requirements.md
new file mode 100644
index 0000000..ab37db0
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/requirements.md
@@ -0,0 +1,8 @@
+---
+title: Requirements
+weight: 3
+---
+
+This package requires:
+- PHP 8.1 or higher
+- Laravel 10 or higher
diff --git a/_docs/laravel-libs/laravel-data/support-us.md b/_docs/laravel-libs/laravel-data/support-us.md
new file mode 100644
index 0000000..0453692
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/support-us.md
@@ -0,0 +1,8 @@
+---
+title: Support us
+weight: 2
+---
+
+We invest a lot of resources into creating [best in class open source packages](https://spatie.be/open-source). You can support us by [buying one of our paid products](https://spatie.be/open-source/support-us).
+
+We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on [our contact page](https://spatie.be/about-us). We publish all received postcards on [our virtual postcard wall](https://spatie.be/open-source/postcards).
diff --git a/_docs/laravel-libs/laravel-data/third-party-packages.md b/_docs/laravel-libs/laravel-data/third-party-packages.md
new file mode 100644
index 0000000..7efa4dc
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/third-party-packages.md
@@ -0,0 +1,12 @@
+---
+title: Third party packages
+weight: 5
+---
+
+Some community members created packages that extend the functionality of Laravel Data. Here's a list of them:
+
+- [laravel-typescript-transformer](https://github.com/spatie/laravel-typescript-transformer)
+- [laravel-data-openapi-generator](https://github.com/xolvionl/laravel-data-openapi-generator)
+- [laravel-data-json-schemas](https://github.com/BasilLangevin/laravel-data-json-schemas)
+
+Created a package yourself that you want to add to this list? Send us a PR!
diff --git a/_docs/laravel-libs/laravel-data/validation/_index.md b/_docs/laravel-libs/laravel-data/validation/_index.md
new file mode 100644
index 0000000..77dfeed
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/validation/_index.md
@@ -0,0 +1,4 @@
+---
+title: Validation
+weight: 3
+---
diff --git a/_docs/laravel-libs/laravel-data/validation/auto-rule-inferring.md b/_docs/laravel-libs/laravel-data/validation/auto-rule-inferring.md
new file mode 100644
index 0000000..50cadef
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/validation/auto-rule-inferring.md
@@ -0,0 +1,60 @@
+---
+title: Auto rule inferring
+weight: 2
+---
+
+The package will automatically infer validation rules from the data object. For example, for the following data class:
+
+```php
+class ArtistData extends Data{
+ public function __construct(
+ public string $name,
+ public int $age,
+ public ?string $genre,
+ ) {
+ }
+}
+```
+
+The package will generate the following validation rules:
+
+```php
+[
+ 'name' => ['required', 'string'],
+ 'age' => ['required', 'integer'],
+ 'genre' => ['nullable', 'string'],
+]
+```
+
+All these rules are inferred by `RuleInferrers`, special classes that will look at the types of properties and will add rules based upon that.
+
+Rule inferrers are configured in the `data.php` config file:
+
+```php
+/*
+ * Rule inferrers can be configured here. They will automatically add
+ * validation rules to properties of a data object based upon
+ * the type of the property.
+ */
+'rule_inferrers' => [
+ Spatie\LaravelData\RuleInferrers\SometimesRuleInferrer::class,
+ Spatie\LaravelData\RuleInferrers\NullableRuleInferrer::class,
+ Spatie\LaravelData\RuleInferrers\RequiredRuleInferrer::class,
+ Spatie\LaravelData\RuleInferrers\BuiltInTypesRuleInferrer::class,
+ Spatie\LaravelData\RuleInferrers\AttributesRuleInferrer::class,
+],
+```
+
+By default, five rule inferrers are enabled:
+
+- **SometimesRuleInferrer** will add a `sometimes` rule when the property is optional
+- **NullableRuleInferrer** will add a `nullable` rule when the property is nullable
+- **RequiredRuleInferrer** will add a `required` rule when the property is not nullable
+- **BuiltInTypesRuleInferrer** will add a rules which are based upon the built-in php types:
+ - An `int` or `float` type will add the `numeric` rule
+ - A `bool` type will add the `boolean` rule
+ - A `string` type will add the `string` rule
+ - A `array` type will add the `array` rule
+- **AttributesRuleInferrer** will make sure that rule attributes we described above will also add their rules
+
+It is possible to write your rule inferrers. You can find more information [here](/docs/laravel-data/v4/advanced-usage/creating-a-rule-inferrer).
diff --git a/_docs/laravel-libs/laravel-data/validation/introduction.md b/_docs/laravel-libs/laravel-data/validation/introduction.md
new file mode 100644
index 0000000..df02f56
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/validation/introduction.md
@@ -0,0 +1,325 @@
+---
+title: Introduction
+weight: 1
+---
+
+Laravel data, allows you to create data objects from all sorts of data. One of the most common ways to create a data object is from a request, and the data from a request cannot always be trusted.
+
+That's why it is possible to validate the data before creating the data object. You can validate requests but also arrays and other structures.
+
+The package will try to automatically infer validation rules from the data object, so you don't have to write them yourself. For example, a `?string` property will automatically have the `nullable` and `string` rules.
+
+### Important notice
+
+Validation is probably one of the coolest features of this package, but it is also the most complex one. We'll try to make it as straightforward as possible to validate data, but in the end, the Laravel validator was not written to be used in this way. So there are some limitations and quirks you should be aware of.
+
+In a few cases it might be easier to just create a custom request class with validation rules and then call `toArray` on the request to create a data object than trying to validate the data with this package.
+
+## When does validation happen?
+
+Validation will always happen BEFORE a data object is created, once a data object is created, it is assumed that the data is valid.
+
+At the moment, there isn't a way to validate data objects, so you should implement this logic yourself. We're looking into ways to make this easier in the future.
+
+Validation runs automatically in the following cases:
+
+- When injecting a data object somewhere and the data object gets created from the request
+- When calling the `from` method on a data object with a request
+
+On all other occasions, validation won't run automatically. You can always validate the data manually by calling the `validate` method on a data object:
+
+```php
+SongData::validate(
+ ['title' => 'Never gonna give you up']
+); // ValidationException will be thrown because 'artist' is missing
+```
+
+When you also want to create the object after validation was successful you can use `validateAndCreate`:
+
+```php
+SongData::validateAndCreate(
+ ['title' => 'Never gonna give you up', 'artist' => 'Rick Astley']
+); // returns a SongData object
+```
+
+### Validate everything
+
+It is possible to validate all payloads injected or passed to the `from` method by setting the `validation_strategy` config option to `Always`:
+
+```php
+'validation_strategy' => \Spatie\LaravelData\Support\Creation\ValidationStrategy::Always->value,
+```
+
+Completely disabling validation can be done by setting the `validation_strategy` config option to `Disabled`:
+
+```php
+'validation_strategy' => \Spatie\LaravelData\Support\Creation\ValidationStrategy::Disabled->value,
+```
+
+If you require a more fine-grained control over when validation should happen, you can use [data factories](/docs/laravel-data/v4/as-a-data-transfer-object/factories) to manually specify the validation strategy.
+
+## A quick glance at the validation functionality
+
+We've got a lot of documentation about validation and we suggest you read it all, but if you want to get a quick glance at the validation functionality, here's a quick overview:
+
+### Auto rule inferring
+
+The package will automatically infer validation rules from the data object. For example, for the following data class:
+
+```php
+class ArtistData extends Data{
+ public function __construct(
+ public string $name,
+ public int $age,
+ public ?string $genre,
+ ) {
+ }
+}
+```
+
+The package will generate the following validation rules:
+
+```php
+[
+ 'name' => ['required', 'string'],
+ 'age' => ['required', 'integer'],
+ 'genre' => ['nullable', 'string'],
+]
+```
+
+The package follows an algorithm to infer rules from the data object. You can read more about it [here](/docs/laravel-data/v4/validation/auto-rule-inferring).
+
+### Validation attributes
+
+It is possible to add extra rules as attributes to properties of a data object:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ #[Max(20)]
+ public string $artist,
+ ) {
+ }
+}
+```
+
+When you provide an artist with a length of more than 20 characters, the validation will fail.
+
+There's a complete [chapter](/docs/laravel-data/v4/validation/using-validation-attributes) dedicated to validation attributes.
+
+### Manual rules
+
+Sometimes you want to add rules manually, this can be done as such:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+
+ public static function rules(): array
+ {
+ return [
+ 'title' => ['required', 'string'],
+ 'artist' => ['required', 'string'],
+ ];
+ }
+}
+```
+
+You can read more about manual rules in its [dedicated chapter](/docs/laravel-data/v4/validation/manual-rules).
+
+### Using the container
+
+You can resolve a data object from the container.
+
+```php
+app(SongData::class);
+```
+
+We resolve a data object from the container, its properties will already be filled by the values of the request with matching key names.
+If the request contains data that is not compatible with the data object, a validation exception will be thrown.
+
+### Working with the validator
+
+We provide a few points where you can hook into the validation process. You can read more about it in the [dedicated chapter](/docs/laravel-data/v4/validation/working-with-the-validator).
+
+It is for example to:
+
+- overwrite validation messages & attributes
+- overwrite the validator itself
+- overwrite the redirect when validation fails
+- allow stopping validation after a failure
+- overwrite the error bag
+
+### Authorizing a request
+
+Just like with Laravel requests, it is possible to authorize an action for certain people only:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+
+ public static function authorize(): bool
+ {
+ return Auth::user()->name === 'Ruben';
+ }
+}
+```
+
+If the method returns `false`, then an `AuthorizationException` is thrown.
+
+## Validation of nested data objects
+
+When a data object is nested inside another data object, the validation rules will also be generated for that nested object.
+
+```php
+class SingleData{
+ public function __construct(
+ public ArtistData $artist,
+ public SongData $song,
+ ) {
+ }
+}
+```
+
+The validation rules for this class will be:
+
+```php
+[
+ 'artist' => ['array'],
+ 'artist.name' => ['required', 'string'],
+ 'artist.age' => ['required', 'integer'],
+ 'artist.genre' => ['nullable', 'string'],
+ 'song' => ['array'],
+ 'song.title' => ['required', 'string'],
+ 'song.artist' => ['required', 'string'],
+]
+```
+
+There are a few quirky things to keep in mind when working with nested data objects, you can read all about it [here](/docs/laravel-data/v4/validation/nesting-data).
+
+## Validation of nested data collections
+
+Let's say we want to create a data object like this from a request:
+
+```php
+class AlbumData extends Data
+{
+ /**
+ * @param array $songs
+ */
+ public function __construct(
+ public string $title,
+ public array $songs,
+ ) {
+ }
+}
+```
+
+Since the `SongData` has its own validation rules, the package will automatically apply them when resolving validation
+rules for this object.
+
+In this case the validation rules for `AlbumData` would look like this:
+
+```php
+[
+ 'title' => ['required', 'string'],
+ 'songs' => ['required', 'array'],
+ 'songs.*.title' => ['required', 'string'],
+ 'songs.*.artist' => ['required', 'string'],
+]
+```
+
+More info about nested data collections can be found [here](/docs/laravel-data/v4/validation/nesting-data).
+
+## Default values
+
+When you've set some default values for a data object, the validation rules will only be generated if something else than the default is provided.
+
+For example, when we have this data object:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title = 'Never Gonna Give You Up',
+ public string $artist = 'Rick Astley',
+ ) {
+ }
+}
+```
+
+And we try to validate the following data:
+
+```php
+SongData::validate(
+ ['title' => 'Giving Up On Love']
+);
+```
+
+Then the validation rules will be:
+
+```php
+[
+ 'title' => ['required', 'string'],
+]
+```
+
+## Mapping property names
+
+When mapping property names, the validation rules will be generated for the mapped property name:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ #[MapInputName('song_title')]
+ public string $title,
+ ) {
+ }
+}
+```
+
+The validation rules for this class will be:
+
+```php
+[
+ 'song_title' => ['required', 'string'],
+]
+```
+
+There's one small catch when the validation fails; the error message will be for the original property name, not the mapped property name. This is a small quirk we hope to solve as soon as possible.
+
+## Retrieving validation rules for a data object
+
+You can retrieve the validation rules a data object will generate as such:
+
+```php
+AlbumData::getValidationRules($payload);
+```
+
+This will produce the following array with rules:
+
+```php
+[
+ 'title' => ['required', 'string'],
+ 'songs' => ['required', 'array'],
+ 'songs.*.title' => ['required', 'string'],
+ 'songs.*.artist' => ['required', 'string'],
+]
+```
+
+### Payload requirement
+
+We suggest always providing a payload when generating validation rules. Because such a payload is used to determine which rules will be generated and which can be skipped.
diff --git a/_docs/laravel-libs/laravel-data/validation/manual-rules.md b/_docs/laravel-libs/laravel-data/validation/manual-rules.md
new file mode 100644
index 0000000..beb6554
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/validation/manual-rules.md
@@ -0,0 +1,223 @@
+---
+title: Manual rules
+weight: 4
+---
+
+It is also possible to write rules down manually in a dedicated method on the data object. This can come in handy when you want
+to construct a custom rule object which isn't possible with attributes:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+
+ public static function rules(): array
+ {
+ return [
+ 'title' => ['required', 'string'],
+ 'artist' => ['required', 'string'],
+ ];
+ }
+}
+```
+
+By overwriting a property's rules within the `rules` method, no other rules will be inferred automatically anymore for that property.
+
+This means that in the following example, only a `max:20` rule will be added, and not a `string` and `required` rule:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+
+ public static function rules(): array
+ {
+ return [
+ 'title' => ['max:20'],
+ 'artist' => ['max:20'],
+ ];
+ }
+}
+
+// The generated rules will look like this
+[
+ 'title' => ['max:20'],
+ 'artist' => ['max:20'],
+]
+```
+
+As a rule of thumb always follow these rules:
+
+Always use the array syntax for defining rules and not a single string which spits the rules by | characters.
+This is needed when using regexes those | can be seen as part of the regex
+
+## Merging manual rules
+
+Writing manual rules doesn't mean that you can't use the automatic rules inferring anymore. By adding the `MergeValidationRules` attribute to your data class, the rules will be merged:
+
+```php
+#[MergeValidationRules]
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+
+ public static function rules(): array
+ {
+ return [
+ 'title' => ['max:20'],
+ 'artist' => ['max:20'],
+ ];
+ }
+}
+
+// The generated rules will look like this
+[
+ 'title' => [required, 'string', 'max:20'],
+ 'artist' => [required, 'string', 'max:20'],
+]
+```
+
+## Using attributes
+
+It is even possible to use the validationAttribute objects within the `rules` method:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+
+ public static function rules(): array
+ {
+ return [
+ 'title' => [new Required(), new StringType()],
+ 'artist' => [new Required(), new StringType()],
+ ];
+ }
+}
+```
+
+
+You can even add dependencies to be automatically injected:
+
+```php
+use SongSettingsRepository;
+
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+
+ public static function rules(SongSettingsRepository $settings): array
+ {
+ return [
+ 'title' => [new RequiredIf($settings->forUser(auth()->user())->title_required), new StringType()],
+ 'artist' => [new Required(), new StringType()],
+ ];
+ }
+}
+```
+
+## Using context
+
+Sometimes a bit more context is required, in such a case a `ValidationContext` parameter can be injected as such:
+Additionally, if you need to access the data payload, you can use `$payload` parameter:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public string $artist,
+ ) {
+ }
+
+ public static function rules(ValidationContext $context): array
+ {
+ return [
+ 'title' => ['required'],
+ 'artist' => Rule::requiredIf($context->fullPayload['title'] !== 'Never Gonna Give You Up'),
+ ];
+ }
+}
+```
+
+By default, the provided payload is the whole request payload provided to the data object.
+If you want to generate rules in nested data objects, then a relative payload can be more useful:
+
+```php
+class AlbumData extends Data
+{
+ /**
+ * @param array $songs
+ */
+ public function __construct(
+ public string $title,
+ public array $songs,
+ ) {
+ }
+}
+
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ public ?string $artist,
+ ) {
+ }
+
+ public static function rules(ValidationContext $context): array
+ {
+ return [
+ 'title' => ['required'],
+ 'artist' => Rule::requiredIf($context->payload['title'] !== 'Never Gonna Give You Up'),
+ ];
+ }
+}
+```
+
+When providing such a payload:
+
+```php
+[
+ 'title' => 'Best songs ever made',
+ 'songs' => [
+ ['title' => 'Never Gonna Give You Up'],
+ ['title' => 'Heroes', 'artist' => 'David Bowie'],
+ ],
+];
+```
+
+The rules will be:
+
+```php
+[
+ 'title' => ['string', 'required'],
+ 'songs' => ['present', 'array'],
+ 'songs.*.title' => ['string', 'required'],
+ 'songs.*.artist' => ['string', 'nullable'],
+ 'songs.*' => [NestedRules(...)],
+]
+```
+
+It is also possible to retrieve the current path in the data object chain we're generating rules for right now by calling `$context->path`. In the case of our previous example this would be `songs.0` and `songs.1`;
+
+Make sure the name of the parameter is `$context` in the `rules` method, otherwise no context will be injected.
diff --git a/_docs/laravel-libs/laravel-data/validation/nesting-data.md b/_docs/laravel-libs/laravel-data/validation/nesting-data.md
new file mode 100644
index 0000000..f8402fa
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/validation/nesting-data.md
@@ -0,0 +1,129 @@
+---
+title: Nesting Data
+weight: 6
+---
+
+A data object can contain other data objects or collections of data objects. The package will make sure that also for these data objects validation rules will be generated.
+
+Let's take a look again at the data object from the [nesting](/docs/laravel-data/v4/as-a-data-transfer-object/nesting) section:
+
+```php
+class AlbumData extends Data
+{
+ public function __construct(
+ public string $title,
+ public ArtistData $artist,
+ ) {
+ }
+}
+```
+
+The validation rules for this class would be:
+
+```php
+[
+ 'title' => ['required', 'string'],
+ 'artist' => ['array'],
+ 'artist.name' => ['required', 'string'],
+ 'artist.age' => ['required', 'integer'],
+]
+```
+
+## Validating a nested collection of data objects
+
+When validating a data object like this
+
+```php
+class AlbumData extends Data
+{
+ /**
+ * @param array $songs
+ */
+ public function __construct(
+ public string $title,
+ public array $songs,
+ ) {
+ }
+}
+```
+
+In this case the validation rules for `AlbumData` would look like this:
+
+```php
+[
+ 'title' => ['required', 'string'],
+ 'songs' => ['present', 'array', new NestedRules()],
+]
+```
+
+The `NestedRules` class is a Laravel validation rule that will validate each item within the collection for the rules defined on the data class for that collection.
+
+## Nullable and Optional nested data
+
+If we make the nested data object nullable, the validation rules will change depending on the payload provided:
+
+```php
+class AlbumData extends Data
+{
+ public function __construct(
+ public string $title,
+ public ?ArtistData $artist,
+ ) {
+ }
+}
+```
+
+If no value for the nested object key was provided or the value is `null`, the validation rules will be:
+
+```php
+[
+ 'title' => ['required', 'string'],
+ 'artist' => ['nullable'],
+]
+```
+
+If, however, a value was provided (even an empty array), the validation rules will be:
+
+```php
+[
+ 'title' => ['required', 'string'],
+ 'artist' => ['array'],
+ 'artist.name' => ['required', 'string'],
+ 'artist.age' => ['required', 'integer'],
+]
+```
+
+The same happens when a property is made optional:
+
+```php
+class AlbumData extends Data
+{
+ public function __construct(
+ public string $title,
+ public ArtistData $artist,
+ ) {
+ }
+}
+```
+
+There's a small difference compared against nullable, though. When no value was provided for the nested object key, the validation rules will be:
+
+```php
+[
+ 'title' => ['required', 'string'],
+ 'artist' => ['present', 'array', new NestedRules()],
+]
+```
+
+However, when a value was provided (even an empty array or null), the validation rules will be:
+
+```php
+[
+ 'title' => ['required', 'string'],
+ 'artist' => ['array'],
+ 'artist.name' => ['required', 'string'],
+ 'artist.age' => ['required', 'integer'],
+]
+```
+
+We've written a [blog post](https://flareapp.io/blog/fixing-nested-validation-in-laravel) on the reasoning behind these variable validation rules based upon payload. And they are also the reason why calling `getValidationRules` on a data object always requires a payload to be provided.
diff --git a/_docs/laravel-libs/laravel-data/validation/skipping-validation.md b/_docs/laravel-libs/laravel-data/validation/skipping-validation.md
new file mode 100644
index 0000000..f5c9695
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/validation/skipping-validation.md
@@ -0,0 +1,66 @@
+---
+title: Skipping validation
+weight: 7
+---
+
+Sometimes you don't want properties to be automatically validated, for instance when you're manually overwriting the
+rules method like this:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $name,
+ ) {
+ }
+
+ public static function fromRequest(Request $request): static{
+ return new self("{$request->input('first_name')} {$request->input('last_name')}")
+ }
+
+ public static function rules(): array
+ {
+ return [
+ 'first_name' => ['required', 'string'],
+ 'last_name' => ['required', 'string'],
+ ];
+ }
+}
+```
+
+When a request is being validated, the rules will look like this:
+
+```php
+[
+ 'name' => ['required', 'string'],
+ 'first_name' => ['required', 'string'],
+ 'last_name' => ['required', 'string'],
+]
+```
+
+We know we never want to validate the `name` property since it won't be in the request payload, this can be done as
+such:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ #[WithoutValidation]
+ public string $name,
+ ) {
+ }
+}
+```
+
+Now the validation rules will look like this:
+
+```php
+[
+ 'first_name' => ['required', 'string'],
+ 'last_name' => ['required', 'string'],
+]
+```
+
+## Skipping validation for all properties
+
+By using [data factories](/docs/laravel-data/v4/as-a-data-transfer-object/factories) or setting the `validation_strategy` in the `data.php` config you can skip validation for all properties of a data class.
diff --git a/_docs/laravel-libs/laravel-data/validation/using-validation-attributes.md b/_docs/laravel-libs/laravel-data/validation/using-validation-attributes.md
new file mode 100644
index 0000000..1cfc035
--- /dev/null
+++ b/_docs/laravel-libs/laravel-data/validation/using-validation-attributes.md
@@ -0,0 +1,264 @@
+---
+title: Using validation attributes
+weight: 3
+---
+
+It is possible to add extra rules as attributes to properties of a data object:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ #[Uuid()]
+ public string $uuid,
+ #[Max(15), IP, StartsWith('192.')]
+ public string $ip,
+ ) {
+ }
+}
+```
+
+These rules will be merged together with the rules that are inferred from the data object.
+
+So it is not required to add the `required` and `string` rule, these will be added automatically. The rules for the
+above data object will look like this:
+
+```php
+[
+ 'uuid' => ['required', 'string', 'uuid'],
+ 'ip' => ['required', 'string', 'max:15', 'ip', 'starts_with:192.'],
+]
+```
+
+For each Laravel validation rule we've got a matching validation attribute, you can find a list of
+them [here](/docs/laravel-data/v4/advanced-usage/validation-attributes).
+
+## Referencing route parameters
+
+Sometimes you need a value within your validation attribute which is a route parameter.
+Like the example below where the id should be unique ignoring the current id:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ #[Unique('songs', ignore: new RouteParameterReference('song'))]
+ public int $id,
+ ) {
+ }
+}
+```
+
+If the parameter is a model and another property should be used, then you can do the following:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ #[Unique('songs', ignore: new RouteParameterReference('song', 'uuid'))]
+ public string $uuid,
+ ) {
+ }
+}
+```
+
+## Referencing the current authenticated user
+
+If you need to reference the current authenticated user in your validation attributes, you can use the
+`AuthenticatedUserReference`:
+
+```php
+use Spatie\LaravelData\Support\Validation\References\AuthenticatedUserReference;
+
+class UserData extends Data
+{
+ public function __construct(
+ public string $name,
+ #[Unique('users', 'email', ignore: new AuthenticatedUserReference())]
+ public string $email,
+ ) {
+ }
+}
+```
+
+When you need to reference a specific property of the authenticated user, you can do so like this:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ #[Max(new AuthenticatedUserReference('max_song_title_length'))]
+ public string $title,
+ ) {
+ }
+}
+```
+
+Using a different guard than the default one can be done by passing the guard name to the constructor:
+
+```php
+class UserData extends Data
+{
+ public function __construct(
+ public string $name,
+ #[Unique('users', 'email', ignore: new AuthenticatedUserReference(guard: 'api'))]
+ public string $email,
+ ) {
+ }
+}
+```
+
+## Referencing container dependencies
+
+If you need to reference a container dependency in your validation attributes, you can use the `ContainerReference`:
+
+```php
+use Spatie\LaravelData\Support\Validation\References\ContainerReference;
+
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ #[Max(new ContainerReference('max_song_title_length'))]
+ public string $artist,
+ ) {
+ }
+}
+```
+
+It might be more useful to use a property of the container dependency, which can be done like this:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ #[Max(new ContainerReference(SongSettings::class, 'max_song_title_length'))]
+ public string $artist,
+ ) {
+ }
+}
+```
+
+When your dependency requires specific parameters, you can pass them along:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ #[Max(new ContainerReference(SongSettings::class, 'max_song_title_length', parameters: ['repository' => 'redis']))]
+ public string $artist,
+ ) {
+ }
+}
+```
+
+
+## Referencing other fields
+
+It is possible to reference other fields in validation attributes:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ #[RequiredIf('title', 'Never Gonna Give You Up')]
+ public string $artist,
+ ) {
+ }
+}
+```
+
+These references are always relative to the current data object. So when being nested like this:
+
+```php
+class AlbumData extends Data
+{
+ public function __construct(
+ public string $album_name,
+ public SongData $song,
+ ) {
+ }
+}
+```
+
+The generated rules will look like this:
+
+```php
+[
+ 'album_name' => ['required', 'string'],
+ 'songs' => ['required', 'array'],
+ 'song.title' => ['required', 'string'],
+ 'song.artist' => ['string', 'required_if:song.title,"Never Gonna Give You Up"'],
+]
+```
+
+If you want to reference fields starting from the root data object you can do the following:
+
+```php
+class SongData extends Data
+{
+ public function __construct(
+ public string $title,
+ #[RequiredIf(new FieldReference('album_name', fromRoot: true), 'Whenever You Need Somebody')]
+ public string $artist,
+ ) {
+ }
+}
+```
+
+The rules will now look like this:
+
+```php
+[
+ 'album_name' => ['required', 'string'],
+ 'songs' => ['required', 'array'],
+ 'song.title' => ['required', 'string'],
+ 'song.artist' => ['string', 'required_if:album_name,"Whenever You Need Somebody"'],
+]
+```
+
+## Rule attribute
+
+One special attribute is the `Rule` attribute. With it, you can write rules just like you would when creating a custom
+Laravel request:
+
+```php
+// using an array
+#[Rule(['required', 'string'])]
+public string $property
+
+// using a string
+#[Rule('required|string')]
+public string $property
+
+// using multiple arguments
+#[Rule('required', 'string')]
+public string $property
+```
+
+## Creating your validation attribute
+
+It is possible to create your own validation attribute by extending the `CustomValidationAttribute` class, this class
+has a `getRules` method that returns the rules that should be applied to the property.
+
+```php
+#[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_PARAMETER)]
+class CustomRule extends CustomValidationAttribute
+{
+ /**
+ * @return array