Договоры
Договор оказания услуг между reKassa (Исполнитель) и организацией клиента (Заказчик). PDF собирается по шаблону на нашей стороне и отправляется в Didox как черновик «произвольного документа» с подтипом «Договор». Подписывают стороны в Didox своей ЭЦП.
| Метод | Доступ | Что делает |
|---|---|---|
GET /v1/portal/orgs/{id}/contracts |
contracts.read |
договоры организации |
POST /v1/portal/orgs/{id}/contracts |
contracts.manage |
сгенерировать (и сразу отправить в Didox) |
GET /v1/portal/contracts/{id} |
contracts.read |
договор |
POST /v1/portal/contracts/{id}/send |
contracts.manage |
отправить сгенерированный в Didox |
POST /v1/portal/contracts/{id}/sync |
contracts.read |
обновить статус из Didox сейчас |
DELETE /v1/portal/contracts/{id} |
contracts.manage |
удалить сгенерированный или черновик Didox |
GET /v1/portal/contracts/{id}/pdf |
contracts.read |
PDF — подписанный, если уже есть |
Доступы только у сотрудников reKassa, см. Роли и доступы.
Процесс
Заголовок раздела «Процесс»-
ЮЛ. Сотрудник находит реквизиты по ИНН (
GET /v1/orgs/lookup/{tin}) и добавляет организацию (POST /v1/portal/orgs). Статус организации — «Требуется договор». -
Договор.
POST /v1/portal/orgs/{id}/contracts. PDF собирается по шаблону; приsendToDidox: true(по умолчанию) сразу создаётся черновик в Didox — статусdraft. Организация — «Договор на подписании». -
Наша подпись. Сотрудник открывает черновик в Didox и подписывает его своей ЭЦП (E-IMZO). Сервер подписать не может: Didox требует ключ человека.
-
Опрос. Каждые 5 минут API спрашивает у Didox статусы договоров в
draftиsigned_by_us. Подписали мы — статусsigned_by_us. Обновить сразу —POST /v1/portal/contracts/{id}/sync. -
Подпись клиента. Клиент подписывает в своём Didox → статус
signed, подписанный PDF сохраняется у нас, организация — «Договор заключён».
Статусы
Заголовок раздела «Статусы»| Статус | Didox | Что значит | Что можно сделать |
|---|---|---|---|
generated |
— | PDF собран, в Didox не отправлен | отправить, удалить |
draft |
0 |
черновик в Didox, ждёт нашей подписи | подписать в Didox, удалить черновик |
signed_by_us |
1 |
подписан нами, ждёт подписи клиента | ждать |
signed |
3 |
подписан обеими сторонами — договор заключён | скачать подписанный PDF |
rejected |
4 |
клиент отказался | сгенерировать новый |
cancelled |
5 |
отменён после отправки | сгенерировать новый |
draft_deleted |
55 |
черновик удалён | сгенерировать новый |
Договорный статус организации (contractStatus) следует за её договорами:
contractStatus |
Когда |
|---|---|
contract_required |
нет договора в работе и заключённого — «Требуется договор» |
contract_in_progress |
есть договор в generated, draft или signed_by_us |
contract_signed |
есть договор в signed — «Договор заключён» |
Сгенерировать договор
Заголовок раздела «Сгенерировать договор»Все поля необязательные:
| Поле | По умолчанию | Описание |
|---|---|---|
contractDate |
сегодня (Ташкент) | дата договора, YYYY-MM-DD; срок — 1 год с автопролонгацией |
connectionPrice |
1500000.00 |
подключение за 1 кассу, сум |
monthlyPrice |
100000.00 |
абонентская плата за 1 кассу в месяц, сум |
sendToDidox |
true |
«Автоматически отправить в Didox» |
Номер — RK-{YY}-{NNNNN}, по порядку внутри года даты договора: RK-26-00001, RK-26-00002…
Суммы — строки с двумя знаками после запятой. В договоре — цены за единицу, без итоговой суммы:
оплата по факту, по счетам-фактурам.
curl -X POST https://api.rekassa.uz/v1/portal/orgs/{id}/contracts \ -H 'Authorization: Bearer <accessToken>' \ -H 'Content-Type: application/json' \ -d '{ "monthlyPrice": "90000" }'const response = await fetch(`https://api.rekassa.uz/v1/portal/orgs/${orgId}/contracts`, { method: 'POST', headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ monthlyPrice: '90000' }),})const contract = await response.json()Ответ 201:
{ "id": "01a0ddc2-b1c4-7d2e-9f3a-5e6b7c8d9e0f", "organizationId": "01a0ddc2-ad00-74b2-8bb5-edf1595576c3", "number": "RK-26-00001", "contractDate": "2026-09-26", "expireDate": "2027-09-26", "autoRenew": true, "status": "draft", "connectionPrice": "1500000.00", "monthlyPrice": "90000.00", "seller": { "name": "OOO REKASSA", "tin": "------", "address": "------", "director": "------", "account": "------", "mfo": "------" }, "buyer": { "name": "\"CLIENT\" MCHJ", "tin": "302936161", "address": "Toshkent, Yangi Olmazor 10", "director": "MIRZAYEV AHRORBEK", "account": "20208000900123456001", "mfo": "01158" }, "didoxDocumentId": "6729f3b2c1e4a50012345678", "didoxStatus": 0, "hasSignedPdf": false, "sentAt": "2026-09-26T12:48:10.000Z", "signedByUsAt": null, "signedAt": null, "lastSyncedAt": "2026-09-26T12:48:10.000Z", "syncError": null, "createdAt": "2026-09-26T12:48:09.000Z"}seller и buyer — реквизиты, как они напечатаны в PDF (снимок на момент генерации).
Неизвестные реквизиты печатаются как ------.
Ошибки: 409 contract_in_progress — у организации уже есть договор на подписании или
заключённый; 404 organization_not_found; 400 — неверная дата или сумма.
Отправить в Didox
Заголовок раздела «Отправить в Didox»Для договора в generated: создаёт черновик в Didox, статус — draft. Ошибки:
422 contract_state_invalid — договор уже отправлен; 502 didox_unavailable, 502 didox_rejected
(текст Didox — в details.reason); 503 didox_not_configured.
Обновить статус
Заголовок раздела «Обновить статус»Спрашивает статус у Didox сейчас, не дожидаясь опроса. Только для draft и signed_by_us,
иначе 422 contract_state_invalid. При переходе в signed скачивает подписанный PDF.
Удалить
Заголовок раздела «Удалить»generated удаляется у нас, у draft удаляется черновик в Didox (статус — draft_deleted).
Договор, подписанный нами, удалить нельзя: 422 contract_state_invalid. Ответ 204.
application/pdf: подписанный обеими сторонами, если он уже получен из Didox, иначе
сгенерированный. Имя файла — RK-26-00001.pdf или RK-26-00001-signed.pdf.
Список и договор
Заголовок раздела «Список и договор»Договоры организации, новые первыми, и один договор — в том же виде, что и ответ генерации.