Ledgo API
Через REST API ваша программа, скрипт или AI-агент полностью управляет вашими данными в Ledgo: счета, категории, контакты, доходы и расходы, долги, регулярные платежи, мероприятия и отчёты.
Начало работы
- Откройте @ledgoapp → Настройки → «API и AI-агенты».
- Дайте токену название и нажмите «Создать». Сразу скопируйте токен — он показывается только один раз.
- Добавляйте к каждому запросу заголовок: Authorization: Bearer <token>.
Токены
Можно создать несколько токенов (у каждого своё название). В настройках токен можно временно выключить и снова включить или отозвать насовсем — запрос с отозванным или выключенным токеном вернёт 401. Токен открывает только /api/v1 и действует от вашего имени; никому его не передавайте.
Записи на подтверждение
Правила
- Деньги всегда с 2 знаками (x.xx); валюта всегда берётся из счёта — конвертации нет.
- Обмен между счетами в разных валютах — type: transfer, amount (списывается) и to_amount (зачисляется).
- Дата и время: ISO 8601 с часовым поясом (например 2026-10-30T13:45:00+05:00). Ваш пояс — в GET /me.
- Доход/расход указывает, для кого он (contact_id или contact_ids) — системные контакты «Я сам» и «Хозяйство» тоже контакты.
- Ошибки: 401 — токена нет, он выключен или отозван; 403 — этот путь не входит в API; 404 — не найдено; 422 — неверные данные ({message, errors}); 429 — слишком много запросов (120 в минуту).
Пример
curl https://ledgo.uz/api/v1/accounts \
-H "Authorization: Bearer $LEDGO_TOKEN"
curl -X POST https://ledgo.uz/api/v1/transactions \
-H "Authorization: Bearer $LEDGO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"type":"expense","amount":45000,"account_id":12,"note":"Lunch"}'
# → 201 {"transaction": {"id": 345, "is_pending": true, "source": "api", ...}}
curl -X POST https://ledgo.uz/api/v1/transactions \
-H "Authorization: Bearer $LEDGO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"type":"expense","amount":45000,"account_id":12,"contact_id":3,"auto_confirm":true}'
Для AI-агента
Передайте агенту OpenAPI-схему — он сам прочитает все пути и поля. Записи агента ждут подтверждения, поэтому его ошибка не попадёт в баланс незаметно: вы проверяете и подтверждаете.
https://ledgo.uz/api/v1/openapi.json
Профиль и настройки
GET /api/v1/me Кто вы: профиль, часовой пояс и число записей, ждущих подтверждения.
{"user": User (+ timezone), "pending_count": int}
PUT /api/v1/settings Меняет язык и основную валюту.
| Название | Тип | Где | |
|---|---|---|---|
| locale | string uz | ru | en | auto |
body | Язык; auto — как в Telegram. |
| base_currency | string UZS | USD | EUR | RUB | KZT | KGS | TJS | GBP | TRY | AED | JPY | CNY | KRW | CAD | CHF |
body | Основная валюта. |
{"user": User}
Счета
GET /api/v1/accounts Список счетов с текущим остатком.
{"accounts": Account[]}
POST /api/v1/accounts Добавляет счёт или карту.
Каждый счёт живёт в своей валюте, конвертации нет.
| Название | Тип | Где | |
|---|---|---|---|
| name * | string | body | Название (до 60 символов). |
| type * | string cash | card | bank |
body | Тип: наличные, карта или банк. |
| currency * | string UZS | USD | EUR | RUB | KZT | KGS | TJS | GBP | TRY | AED | JPY | CNY | KRW | CAD | CHF |
body | Валюта; после первой операции не меняется. |
| initial_balance | number | body | Начальный остаток, до 2 знаков. |
| color | string | body | Цвет. |
| icon | string | body | Иконка. |
| bank_name | string | body | Название банка. |
| last4 | string | body | Последние 4 цифры карты (для SMS банка). |
| is_archived | boolean | body | В архиве. |
| is_primary | boolean | body | Основной счёт (только один). |
{
"name": "Humo",
"type": "card",
"currency": "UZS",
"initial_balance": 1250000.5,
"bank_name": "Kapitalbank",
"last4": "4821"
}
{"account": Account}
PUT /api/v1/accounts/{account} Изменяет счёт.
name, type, currency отправляйте всегда; у счёта с операциями валюта молча не меняется.
| Название | Тип | Где | |
|---|---|---|---|
| account * | integer | path | ID счёта. |
| name * | string | body | Название (до 60 символов). |
| type * | string cash | card | bank |
body | Тип: наличные, карта или банк. |
| currency * | string UZS | USD | EUR | RUB | KZT | KGS | TJS | GBP | TRY | AED | JPY | CNY | KRW | CAD | CHF |
body | Валюта; после первой операции не меняется. |
| initial_balance | number | body | Начальный остаток, до 2 знаков. |
| color | string | body | Цвет. |
| icon | string | body | Иконка. |
| bank_name | string | body | Название банка. |
| last4 | string | body | Последние 4 цифры карты (для SMS банка). |
| is_archived | boolean | body | В архиве. |
| is_primary | boolean | body | Основной счёт (только один). |
{
"name": "Humo",
"type": "card",
"currency": "UZS",
"is_primary": true
}
{"account": Account}
DELETE /api/v1/accounts/{account} Удаляет счёт (с операциями — 422, архивируйте его).
| Название | Тип | Где | |
|---|---|---|---|
| account * | integer | path | ID счёта. |
{"ok": true}
Категории
GET /api/v1/categories Список категорий.
{"categories": Category[]}
POST /api/v1/categories Добавляет категорию.
| Название | Тип | Где | |
|---|---|---|---|
| type * | string income | expense |
body | Доход или расход. |
| name * | string | body | Название (до 40 символов). |
| icon | string | body | Иконка. |
| color | string | body | Цвет. |
{"category": Category}
PUT /api/v1/categories/{category} Изменяет категорию (тип не меняется).
| Название | Тип | Где | |
|---|---|---|---|
| category * | integer | path | ID категории. |
| name | string | body | Название (до 40 символов). |
| icon | string | body | Иконка. |
| color | string | body | Цвет. |
| is_archived | boolean | body | В архиве. |
{"category": Category}
DELETE /api/v1/categories/{category} Удаляет категорию; операции остаются без категории.
| Название | Тип | Где | |
|---|---|---|---|
| category * | integer | path | ID категории. |
{"ok": true}
Контакты
GET /api/v1/contacts Список контактов (системные «Я сам», «Хозяйство» — первыми).
{"contacts": Contact[]}
POST /api/v1/contacts Добавляет контакт.
Контакт отвечает, для кого или кому операция.
| Название | Тип | Где | |
|---|---|---|---|
| name * | string | body | Имя (до 80 символов). |
| type | string person | organization |
body | Человек или организация. |
| phone | string | body | Номер телефона. |
| note | string | body | Заметка (до 500 символов). |
| is_dependent | boolean | body | Находится на вашем иждивении (член семьи). |
| telegram_ids | array<integer> | body | Привязываемые аккаунты Telegram (чужие — 409). |
| main_telegram_id | integer | body | Основной аккаунт Telegram. |
| no_telegram | boolean | body | Отметить, что Telegram нет. |
{
"name": "Sardor",
"type": "person",
"phone": "+998901234567",
"note": "Ishxonadan"
}
{"contact": Contact}
GET /api/v1/contacts/{contact} Контакт: долги, последние 100 операций и сводка трат.
| Название | Тип | Где | |
|---|---|---|---|
| contact * | integer | path | ID контакта. |
| from | date | query | Начало периода трат (по умолчанию — начало месяца). |
| to | date | query | Конец периода трат (по умолчанию — конец месяца). |
{"contact": Contact, "net": [{currency, they_owe_me, i_owe, net}], "transactions": Transaction[], "debts": Debt[], "spend": {range, total, all_time, provided}}
PUT /api/v1/contacts/{contact} Изменяет контакт.
name отправляйте всегда; имя и тип системного контакта не меняются.
| Название | Тип | Где | |
|---|---|---|---|
| contact * | integer | path | ID контакта. |
| name * | string | body | Имя (до 80 символов). |
| type | string person | organization |
body | Человек или организация. |
| phone | string | body | Номер телефона. |
| note | string | body | Заметка (до 500 символов). |
| is_dependent | boolean | body | Находится на вашем иждивении (член семьи). |
{
"name": "Sardor Karimov",
"phone": "+998901234567",
"is_dependent": false
}
{"contact": Contact}
DELETE /api/v1/contacts/{contact} Удаляет контакт; операции остаются, связь снимается.
| Название | Тип | Где | |
|---|---|---|---|
| contact * | integer | path | ID контакта. |
{"ok": true}
POST
/api/v1/contacts/{contact}/merge
Объединяет контакт from с этим и удаляет его.
| Название | Тип | Где | |
|---|---|---|---|
| contact * | integer | path | ID остающегося контакта. |
| from * | integer | body | ID контакта, который вливается и удаляется. |
{"contact": Contact, "removed": int}
Операции
GET /api/v1/transactions Операции, новые первыми, по 30 на страницу.
| Название | Тип | Где | |
|---|---|---|---|
| type | string income | expense | transfer |
query | Тип. |
| account_id | integer | query | Счёт (включая входящие переводы); в ответе также totals. |
| category_id | integer | query | Категория. |
| activity_id | integer | query | Событие. |
| contact_id | integer | query | Контакт — как потребитель или поставщик. |
| from | date | query | С этого дня (в вашем часовом поясе). |
| to | date | query | По этот день (в вашем часовом поясе). |
| q | string | query | Поиск по заметке. |
| page | integer | query | Номер страницы. |
| pending_card | boolean | query | Только ожидающие подтверждения (карта и API). |
| uncategorized_card | boolean | query | Устаревший фильтр: операции по карте без категории. |
{"transactions": Transaction[], "current_page": int, "last_page": int, "total": int, "has_more": bool, "totals": {income, expense}|null}
POST /api/v1/transactions Записывает доход, расход или перевод.
С токеном разработчика запись создаётся с source: "api" и ждёт подтверждения (is_pending: true): подтвердите её в приложении или через confirm; пока она ждёт, контакт необязателен. Валюта берётся со счёта, сумма округляется до 2 знаков; для перевода между разными валютами укажите to_amount.
| Название | Тип | Где | |
|---|---|---|---|
| type * | string income | expense | transfer |
body | Тип. |
| amount * | number | body | Сумма в валюте счёта, до 2 знаков. |
| account_id * | integer | body | Счёт; валюта всегда берётся из него. |
| note | string | body | Заметка (до 500 символов). |
| occurred_at | date-time | body | Время, ISO 8601; отправляйте со смещением часового пояса (по умолчанию — сейчас). |
| category_id | integer | body | Категория того же типа (для перевода игнорируется). |
| contact_ids | array<integer> | body | Для кого (потребители), первый — основной; нужен для дохода/расхода. |
| contact_id | integer | body | Один потребитель (вместо contact_ids). |
| provider_id | integer | body | Кому заплачено / от кого (поставщик). |
| activity_ids | array<integer> | body | События (несколько). |
| activity_id | integer | body | Одно событие. |
| to_account_id | integer | body | Счёт получателя при переводе (обязателен). |
| to_amount | number | body | Зачисленная сумма при переводе (обязательна); при одной валюте приравнивается к amount. |
| auto_confirm | boolean | body | true — запись сразу подтверждена (тогда для дохода/расхода нужен контакт). |
{
"type": "expense",
"amount": 45000,
"account_id": 12,
"category_id": 3,
"contact_ids": [
1
],
"note": "Tushlik",
"occurred_at": "2026-10-30T13:15:00+05:00"
}
{"transaction": Transaction}
POST
/api/v1/transactions/confirm
Подтверждает ожидающие записи пакетом (без ids — все).
| Название | Тип | Где | |
|---|---|---|---|
| ids | array<integer> | body | Подтверждаемые записи (до 500). |
| contact_id | integer | body | Ставится операциям без контакта; если такие есть — обязателен. |
{"confirmed": int, "pending_count": int}
PUT /api/v1/transactions/{transaction} Изменяет запись — меняются только отправленные поля (тип не меняется).
С токеном разработчика неотправленные поля сохраняют значение; чтобы очистить, отправьте null (для списка — []). Ожидающую API-запись можно менять и без контакта. Записи долгов и регулярных платежей здесь не меняются (422).
| Название | Тип | Где | |
|---|---|---|---|
| transaction * | integer | path | ID записи. |
| amount | number | body | Сумма в валюте счёта, до 2 знаков. |
| account_id | integer | body | Счёт; валюта всегда берётся из него. |
| note | string | body | Заметка (до 500 символов). |
| occurred_at | date-time | body | Время, ISO 8601; отправляйте со смещением часового пояса (по умолчанию — сейчас). |
| category_id | integer | body | Категория того же типа (для перевода игнорируется). |
| contact_ids | array<integer> | body | Для кого (потребители), первый — основной; нужен для дохода/расхода. |
| contact_id | integer | body | Один потребитель (вместо contact_ids). |
| provider_id | integer | body | Кому заплачено / от кого (поставщик). |
| activity_ids | array<integer> | body | События (несколько). |
| activity_id | integer | body | Одно событие. |
| to_account_id | integer | body | Счёт получателя при переводе (обязателен). |
| to_amount | number | body | Зачисленная сумма при переводе (обязательна); при одной валюте приравнивается к amount. |
{
"amount": 52000,
"account_id": 12,
"category_id": 3,
"contact_ids": [
1
],
"note": "Tushlik, choy bilan",
"occurred_at": "2026-10-30T13:15:00+05:00"
}
{"transaction": Transaction}
DELETE /api/v1/transactions/{transaction} Удаляет запись (записи долгов и регулярных платежей — 422).
| Название | Тип | Где | |
|---|---|---|---|
| transaction * | integer | path | ID записи. |
{"ok": true}
POST /api/v1/transactions/{transaction}/confirm Подтверждает запись карты или API, при необходимости с категорией и контактом.
Доход/расход без контакта не подтверждается (422); сумма, счёт и дата не меняются.
| Название | Тип | Где | |
|---|---|---|---|
| transaction * | integer | path | ID записи (только карта или API). |
| category_id | integer | body | Категория (null — убрать). |
| contact_ids | array<integer> | body | Для кого, первый — основной. |
| contact_id | integer | body | Один потребитель. |
| provider_id | integer | body | Поставщик (null — убрать). |
{"transaction": Transaction}
PUT /api/v1/transactions/{transaction}/parts Делит сумму на части (пустой список — отменяет деление).
| Название | Тип | Где | |
|---|---|---|---|
| transaction * | integer | path | ID записи. |
| parts * | array<object> | body | Части (до 30): amount, contact_ids (обязательно), category_id, note; сумма частей равна сумме записи. |
{"transaction": Transaction}
Долги
GET /api/v1/debts Список долгов с оплатами и добавлениями.
{"debts": Debt[]}
POST /api/v1/debts Записывает новый долг.
Итог долга не хранится: начальная сумма + добавления − оплаты.
| Название | Тип | Где | |
|---|---|---|---|
| direction * | string they_owe_me | i_owe |
body | Кто должен: вам должны или вы должны. |
| person_name * | string | body | Имя человека (до 80 символов). |
| amount * | number | body | Начальная сумма, до 2 знаков. |
| currency * | string UZS | USD | EUR | RUB | KZT | KGS | TJS | GBP | TRY | AED | JPY | CNY | KRW | CAD | CHF |
body | Валюта долга. |
| note | string | body | Заметка (до 500 символов). |
| occurred_at | date-time | body | Время, ISO 8601; отправляйте со смещением часового пояса (по умолчанию — сейчас). |
| due_date | date | body | Срок возврата. |
| account_id | integer | body | Деньги проходят через этот счёт (той же валюты); без него — без движения денег. |
| category_id | integer | body | Категория движения денег (или покупки в долг). |
| contact_id | integer | body | Контакт. |
| activity_id | integer | body | Событие. |
| on_credit | boolean | body | Покупка в долг (только i_owe): расход сейчас, деньги при оплате; account_id игнорируется. |
{
"direction": "they_owe_me",
"person_name": "Sardor",
"contact_id": 5,
"amount": 2000000,
"currency": "UZS",
"account_id": 12,
"due_date": "2026-12-01",
"note": "Telefon uchun"
}
{"debt": Debt}
PUT /api/v1/debts/{debt} Частично изменяет долг (только отправленные поля).
| Название | Тип | Где | |
|---|---|---|---|
| debt * | integer | path | ID долга. |
| direction | string they_owe_me | i_owe |
body | Направление (у долга с движением денег не меняется). |
| person_name | string | body | Имя человека. |
| amount | number | body | Исправляет начальную сумму (и движение денег). |
| currency | string UZS | USD | EUR | RUB | KZT | KGS | TJS | GBP | TRY | AED | JPY | CNY | KRW | CAD | CHF |
body | Валюта (у долга с движением денег не меняется). |
| note | string | body | Заметка (до 500 символов). |
| due_date | date | body | Срок возврата. |
| contact_id | integer | body | Контакт (null — отвязать). |
| activity_id | integer | body | Событие (null — отвязать). |
{
"due_date": "2027-01-15",
"note": "Muddat uzaytirildi"
}
{"debt": Debt}
DELETE /api/v1/debts/{debt} Удаляет долг со всеми оплатами и движениями денег.
| Название | Тип | Где | |
|---|---|---|---|
| debt * | integer | path | ID долга. |
{"ok": true}
POST /api/v1/debts/{debt}/payments Записывает оплату долга (не больше остатка).
| Название | Тип | Где | |
|---|---|---|---|
| debt * | integer | path | ID долга. |
| amount * | number | body | Сумма в валюте долга, до 2 знаков. |
| note | string | body | Заметка (до 300 символов). |
| occurred_at | date-time | body | Время, ISO 8601; отправляйте со смещением часового пояса (по умолчанию — сейчас). |
| account_id | integer | body | Деньги проходят через этот счёт (валюта должна совпадать с долгом); без него меняется только долг. |
| category_id | integer | body | Категория движения денег (если указан счёт). |
{
"amount": 500000,
"account_id": 12,
"occurred_at": "2026-10-30T18:00:00+05:00"
}
{"debt": Debt}
PUT /api/v1/debts/{debt}/payments/{payment} Полностью заменяет оплату.
Без account_id движение денег удаляется.
| Название | Тип | Где | |
|---|---|---|---|
| debt * | integer | path | ID долга. |
| payment * | integer | path | ID оплаты. |
| amount * | number | body | Сумма в валюте долга, до 2 знаков. |
| note | string | body | Заметка (до 300 символов). |
| occurred_at | date-time | body | Время, ISO 8601; отправляйте со смещением часового пояса (по умолчанию — сейчас). |
| account_id | integer | body | Деньги проходят через этот счёт (валюта должна совпадать с долгом); без него меняется только долг. |
| category_id | integer | body | Категория движения денег (если указан счёт). |
{"debt": Debt}
DELETE /api/v1/debts/{debt}/payments/{payment} Удаляет оплату, баланс восстанавливается.
| Название | Тип | Где | |
|---|---|---|---|
| debt * | integer | path | ID долга. |
| payment * | integer | path | ID оплаты. |
{"debt": Debt}
POST /api/v1/debts/{debt}/additions Увеличивает долг («дал ещё»).
| Название | Тип | Где | |
|---|---|---|---|
| debt * | integer | path | ID долга. |
| amount * | number | body | Сумма в валюте долга, до 2 знаков. |
| note | string | body | Заметка (до 300 символов). |
| occurred_at | date-time | body | Время, ISO 8601; отправляйте со смещением часового пояса (по умолчанию — сейчас). |
| account_id | integer | body | Деньги проходят через этот счёт (валюта должна совпадать с долгом); без него меняется только долг. |
| category_id | integer | body | Категория движения денег (если указан счёт). |
{"debt": Debt}
PUT /api/v1/debts/{debt}/additions/{addition} Полностью заменяет добавление.
| Название | Тип | Где | |
|---|---|---|---|
| debt * | integer | path | ID долга. |
| addition * | integer | path | ID добавления. |
| amount * | number | body | Сумма в валюте долга, до 2 знаков. |
| note | string | body | Заметка (до 300 символов). |
| occurred_at | date-time | body | Время, ISO 8601; отправляйте со смещением часового пояса (по умолчанию — сейчас). |
| account_id | integer | body | Деньги проходят через этот счёт (валюта должна совпадать с долгом); без него меняется только долг. |
| category_id | integer | body | Категория движения денег (если указан счёт). |
{"debt": Debt}
DELETE /api/v1/debts/{debt}/additions/{addition} Удаляет добавление, баланс восстанавливается.
| Название | Тип | Где | |
|---|---|---|---|
| debt * | integer | path | ID долга. |
| addition * | integer | path | ID добавления. |
{"debt": Debt}
Регулярные платежи
GET /api/v1/recurrings Список регулярных платежей.
{"recurrings": Recurring[]}
POST /api/v1/recurrings Добавляет регулярный платёж.
Расписание не хранится — считается от starts_on и периода.
| Название | Тип | Где | |
|---|---|---|---|
| title * | string | body | Название (до 80 символов). |
| type * | string income | expense |
body | Тип: доход или расход. |
| amount * | number | body | Сумма за период, до 2 знаков. |
| currency * | string UZS | USD | EUR | RUB | KZT | KGS | TJS | GBP | TRY | AED | JPY | CNY | KRW | CAD | CHF |
body | Валюта; после первой оплаты не меняется. |
| account_id | integer | body | Счёт по умолчанию (той же валюты). |
| category_id | integer | body | Категория. |
| contact_id | integer | body | Контакт. |
| debt_id | integer | body | Погашение этого долга частями (той же валюты). |
| interval_unit * | string day | week | month | year |
body | Единица периода. |
| interval_count | integer | body | Раз в сколько единиц (1–60, по умолчанию 1). |
| anchor_day | integer | body | День платежа (1–31). |
| starts_on * | date | body | Дата начала. |
| ends_on | date | body | Дата окончания (не раньше начала). |
| total_periods | integer | body | Всего периодов (1–600). |
| auto_amount | boolean | body | Следующая сумма = последней оплаченной. |
| penalty_daily_amount | number | body | Пеня за день просрочки (сумма). |
| penalty_daily_percent | number | body | Пеня за день, % (0–100). |
| is_active | boolean | body | Активен ли (false — на паузе). |
| note | string | body | Заметка (до 500 символов). |
{
"title": "Internet",
"type": "expense",
"amount": 120000,
"currency": "UZS",
"account_id": 12,
"category_id": 7,
"interval_unit": "month",
"interval_count": 1,
"anchor_day": 5,
"starts_on": "2026-11-05"
}
{"recurring": Recurring}
PUT /api/v1/recurrings/{recurring} Частично изменяет регулярный платёж.
| Название | Тип | Где | |
|---|---|---|---|
| recurring * | integer | path | ID платежа. |
| title | string | body | Название (до 80 символов). |
| type | string income | expense |
body | Тип: доход или расход. |
| amount | number | body | Сумма за период, до 2 знаков. |
| currency | string UZS | USD | EUR | RUB | KZT | KGS | TJS | GBP | TRY | AED | JPY | CNY | KRW | CAD | CHF |
body | Валюта; после первой оплаты не меняется. |
| account_id | integer | body | Счёт по умолчанию (той же валюты). |
| category_id | integer | body | Категория. |
| contact_id | integer | body | Контакт. |
| debt_id | integer | body | Погашение этого долга частями (той же валюты). |
| interval_unit | string day | week | month | year |
body | Единица периода. |
| interval_count | integer | body | Раз в сколько единиц (1–60, по умолчанию 1). |
| anchor_day | integer | body | День платежа (1–31). |
| starts_on | date | body | Дата начала. |
| ends_on | date | body | Дата окончания (не раньше начала). |
| total_periods | integer | body | Всего периодов (1–600). |
| auto_amount | boolean | body | Следующая сумма = последней оплаченной. |
| penalty_daily_amount | number | body | Пеня за день просрочки (сумма). |
| penalty_daily_percent | number | body | Пеня за день, % (0–100). |
| is_active | boolean | body | Активен ли (false — на паузе). |
| note | string | body | Заметка (до 500 символов). |
{
"amount": 135000,
"is_active": true
}
{"recurring": Recurring}
DELETE /api/v1/recurrings/{recurring} Удаляет регулярный платёж со всеми записями и движениями денег.
| Название | Тип | Где | |
|---|---|---|---|
| recurring * | integer | path | ID платежа. |
{"ok": true}
POST /api/v1/recurrings/{recurring}/entries Отмечает период оплаченным (один период — одна запись).
| Название | Тип | Где | |
|---|---|---|---|
| recurring * | integer | path | ID платежа. |
| period_on * | date | body | За какой период (дата периода). |
| amount | number | body | Сумма; обязательна без debt_payment_id и transaction_id. |
| occurred_at | date-time | body | Время, ISO 8601; отправляйте со смещением часового пояса (по умолчанию — сейчас). |
| account_id | integer | body | Деньги с этого счёта (той же валюты); без него — только отметка. |
| category_id | integer | body | Категория (по умолчанию — из платежа). |
| note | string | body | Заметка (до 300 символов). |
| debt_payment_id | integer | body | Закрыть период существующей оплатой долга (новых денег нет). |
| transaction_id | integer | body | Закрыть период существующей операцией (например, по карте). |
{
"period_on": "2026-11-05",
"amount": 120000,
"account_id": 12
}
{"recurring": Recurring}
PUT /api/v1/recurrings/{recurring}/entries/{entry} Изменяет запись периода.
| Название | Тип | Где | |
|---|---|---|---|
| recurring * | integer | path | ID платежа. |
| entry * | integer | path | ID записи. |
| period_on * | date | body | За какой период (дата периода). |
| amount | number | body | Сумма. |
| occurred_at | date-time | body | Время, ISO 8601; отправляйте со смещением часового пояса (по умолчанию — сейчас). |
| account_id | integer | body | Деньги с этого счёта (той же валюты); без него — только отметка. |
| category_id | integer | body | Категория (по умолчанию — из платежа). |
| note | string | body | Заметка (до 300 символов). |
{"recurring": Recurring}
DELETE /api/v1/recurrings/{recurring}/entries/{entry} Удаляет запись периода.
| Название | Тип | Где | |
|---|---|---|---|
| recurring * | integer | path | ID платежа. |
| entry * | integer | path | ID записи. |
{"recurring": Recurring}
События
GET /api/v1/activities Список событий с итогами.
{"activities": Activity[]}
POST /api/v1/activities Добавляет событие.
| Название | Тип | Где | |
|---|---|---|---|
| title * | string | body | Название (до 80 символов). |
| icon | string | body | Иконка (эмодзи). |
| color | string | body | Цвет. |
| starts_on | date | body | Дата начала. |
| ends_on | date | body | Дата окончания. |
| is_closed | boolean | body | Закрыто ли. |
| note | string | body | Заметка (до 500 символов). |
| parent_id | integer | body | Родительское событие (не само и не вложенное). |
{"activity": Activity}
GET /api/v1/activities/{activity} Событие: операции, долги, вложенные события и по месяцам.
| Название | Тип | Где | |
|---|---|---|---|
| activity * | integer | path | ID события. |
{"activity": Activity, "transactions": Transaction[], "debts": Debt[], "children": Activity[], "monthly": array}
PUT /api/v1/activities/{activity} Частично изменяет событие.
| Название | Тип | Где | |
|---|---|---|---|
| activity * | integer | path | ID события. |
| title | string | body | Название (до 80 символов). |
| icon | string | body | Иконка (эмодзи). |
| color | string | body | Цвет. |
| starts_on | date | body | Дата начала. |
| ends_on | date | body | Дата окончания. |
| is_closed | boolean | body | Закрыто ли. |
| note | string | body | Заметка (до 500 символов). |
| parent_id | integer | body | Родительское событие (не само и не вложенное). |
{"activity": Activity}
DELETE /api/v1/activities/{activity} Удаляет событие; операции и долги остаются.
| Название | Тип | Где | |
|---|---|---|---|
| activity * | integer | path | ID события. |
{"ok": true}
Покупки
GET /api/v1/purchases Последние 50 покупок.
{"purchases": Purchase[]}
POST /api/v1/purchases Записывает покупку или общий счёт: оплаты, участники и долги разом.
| Название | Тип | Где | |
|---|---|---|---|
| title * | string | body | Название (до 120 символов). |
| contact_id | integer | body | Продавец (контакт). |
| category_id | integer | body | Категория расхода. |
| currency * | string UZS | USD | EUR | RUB | KZT | KGS | TJS | GBP | TRY | AED | JPY | CNY | KRW | CAD | CHF |
body | Валюта покупки. |
| occurred_at | date-time | body | Время, ISO 8601; отправляйте со смещением часового пояса (по умолчанию — сейчас). |
| note | string | body | Заметка (до 500 символов). |
| service_percent | number | body | Процент за обслуживание (0–100). |
| items | array<object> | body | Позиции: title, amount, shared_with (ключи участников: me или c<id контакта>). |
| participants | array<object> | body | Участники: contact_id (пусто — вы), kind (mine | owed — станет долгом). |
| participant_amounts | object | body | Доли без позиций: ключ (me, c<id>) → сумма. |
| payments | array<object> | body | Оплаты: account_id, amount — каждая станет расходом. |
| deferred | object | body | {amount} — часть к оплате позже, станет долгом продавцу. |
{"purchase": Purchase}
GET /api/v1/purchases/{purchase} Одна покупка.
| Название | Тип | Где | |
|---|---|---|---|
| purchase * | integer | path | ID покупки. |
{"purchase": Purchase}
DELETE /api/v1/purchases/{purchase} Удаляет покупку с оплатами и долгами.
| Название | Тип | Где | |
|---|---|---|---|
| purchase * | integer | path | ID покупки. |
{"ok": true}
Отчёт
GET /api/v1/stats Доходы и расходы за период, по каждой валюте отдельно.
Переводы не учитываются; валюты не суммируются.
| Название | Тип | Где | |
|---|---|---|---|
| from | date | query | Начало периода (по умолчанию — начало месяца). |
| to | date | query | Конец периода (по умолчанию — конец месяца). |
{"range": {from, to}, "expense": [{currency, category_id, total}], "income": [...], "daily": [{currency, type, date, total}], "totals": [{currency, income, expense}]}