Ledgo API Token olish

Ledgo API

REST API orqali o'z dasturingiz, skriptingiz yoki AI agentingiz Ledgo'dagi ma'lumotlaringizni to'liq boshqaradi: hisoblar, kategoriyalar, kontaktlar, kirim-chiqim, qarzlar, muntazam to'lovlar, tadbirlar va hisobot.

Base URL https://ledgo.uz/api/v1 OpenAPI sxemasi ↗

Boshlash

  1. @ledgoapp ni oching → Sozlamalar → «API va AI agentlar».
  2. Tokenga nom bering va «Yaratish» ni bosing. Tokenni darhol nusxalab oling — u faqat bir marta ko'rsatiladi.
  3. Har so'rovga sarlavha qo'shing: Authorization: Bearer <token>.

Tokenlar

Bir nechta token yaratishingiz mumkin (har biriga o'z nomi). Sozlamalarda tokenni vaqtincha o'chirib, keyin qayta yoqishingiz yoki butunlay bekor qilishingiz mumkin — bekor qilingan yoki o'chiq token bilan so'rov 401 qaytaradi. Token faqat /api/v1 ni ochadi va sizning hisobingiz nomidan ishlaydi; uni hech kimga bermang.

Tasdiq kutadigan yozuvlar

API orqali qo'shilgan kirim-chiqim odatda TASDIQ KUTADI (is_pending: true, source: "api") — xuddi karta bildirishnomasidan kelgan yozuv kabi. Siz uni ilovadagi tasdiq ro'yxatida ko'rib tasdiqlaysiz yoki POST /transactions/{id}/confirm bilan. Kutib turganda kontakt shart emas. Darhol tasdiqlangan yozish uchun "auto_confirm": true yuboring — unda kirim/chiqim uchun kontakt (contact_id) shart.

Qoidalar

Misol

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 agent uchun

OpenAPI sxemasini agentingizga bering — u barcha yo'llar va maydonlarni o'zi o'qiydi. Agent yozgan yozuvlar tasdiq kutgani uchun uning xatosi balansingizga sezdirmasdan tushib qolmaydi: siz ko'rib tasdiqlaysiz.

https://ledgo.uz/api/v1/openapi.json

Profil va sozlamalar

GET /api/v1/me Siz kimsiz: profil, vaqt zonasi va tasdiq kutayotgan yozuvlar soni.
Javob

{"user": User (+ timezone), "pending_count": int}

PUT /api/v1/settings Til va asosiy valyutani o'zgartiradi.
Parametrlar
NomiTuriQayerda
locale string
uz | ru | en | auto
body Til; auto — Telegram tiliga ergashadi.
base_currency string
UZS | USD | EUR | RUB | KZT | KGS | TJS | GBP | TRY | AED | JPY | CNY | KRW | CAD | CHF
body Asosiy valyuta.
Javob

{"user": User}

Hisoblar

GET /api/v1/accounts Hisoblar ro'yxati joriy qoldiq bilan.
Javob

{"accounts": Account[]}

POST /api/v1/accounts Yangi hisob yoki karta qo'shadi.

Har hisob o'z valyutasida turadi, konvertatsiya yo'q.

Parametrlar
NomiTuriQayerda
name * string body Nomi (60 belgigacha).
type * string
cash | card | bank
body Turi: naqd, karta yoki bank.
currency * string
UZS | USD | EUR | RUB | KZT | KGS | TJS | GBP | TRY | AED | JPY | CNY | KRW | CAD | CHF
body Valyuta; amal yozilgandan keyin o'zgarmaydi.
initial_balance number body Boshlang'ich qoldiq, 2 xonagacha.
color string body Rang.
icon string body Belgi.
bank_name string body Bank nomi.
last4 string body Kartaning oxirgi 4 raqami (bank xabarlarini ulash uchun).
is_archived boolean body Arxivdami.
is_primary boolean body Asosiy hisob (faqat bittasi bo'ladi).
So'rov misoli
{
    "name": "Humo",
    "type": "card",
    "currency": "UZS",
    "initial_balance": 1250000.5,
    "bank_name": "Kapitalbank",
    "last4": "4821"
}
Javob

{"account": Account}

PUT /api/v1/accounts/{account} Hisobni tahrirlaydi.

name, type, currency har safar yuborilsin; amal bor hisobda valyuta jimgina o'zgarmaydi.

Parametrlar
NomiTuriQayerda
account * integer path Hisob ID si.
name * string body Nomi (60 belgigacha).
type * string
cash | card | bank
body Turi: naqd, karta yoki bank.
currency * string
UZS | USD | EUR | RUB | KZT | KGS | TJS | GBP | TRY | AED | JPY | CNY | KRW | CAD | CHF
body Valyuta; amal yozilgandan keyin o'zgarmaydi.
initial_balance number body Boshlang'ich qoldiq, 2 xonagacha.
color string body Rang.
icon string body Belgi.
bank_name string body Bank nomi.
last4 string body Kartaning oxirgi 4 raqami (bank xabarlarini ulash uchun).
is_archived boolean body Arxivdami.
is_primary boolean body Asosiy hisob (faqat bittasi bo'ladi).
So'rov misoli
{
    "name": "Humo",
    "type": "card",
    "currency": "UZS",
    "is_primary": true
}
Javob

{"account": Account}

DELETE /api/v1/accounts/{account} Hisobni o'chiradi (amali bor hisob — 422, uni arxivlang).
Parametrlar
NomiTuriQayerda
account * integer path Hisob ID si.
Javob

{"ok": true}

Kategoriyalar

GET /api/v1/categories Kategoriyalar ro'yxati.
Javob

{"categories": Category[]}

POST /api/v1/categories Yangi kategoriya qo'shadi.
Parametrlar
NomiTuriQayerda
type * string
income | expense
body Kirim yoki chiqim.
name * string body Nomi (40 belgigacha).
icon string body Belgi.
color string body Rang.
Javob

{"category": Category}

PUT /api/v1/categories/{category} Kategoriyani tahrirlaydi (turi o'zgarmaydi).
Parametrlar
NomiTuriQayerda
category * integer path Kategoriya ID si.
name string body Nomi (40 belgigacha).
icon string body Belgi.
color string body Rang.
is_archived boolean body Arxivdami.
Javob

{"category": Category}

DELETE /api/v1/categories/{category} Kategoriyani o'chiradi; yozuvlar kategoriyasiz qoladi.
Parametrlar
NomiTuriQayerda
category * integer path Kategoriya ID si.
Javob

{"ok": true}

Kontaktlar

GET /api/v1/contacts Kontaktlar ro'yxati (tizim kontaktlari «O'zim», «Ro'zg'or» boshida).
Javob

{"contacts": Contact[]}

POST /api/v1/contacts Yangi kontakt qo'shadi.

Kontakt — kirim/chiqim kim uchun yoki kimga ekanini bildiradi.

Parametrlar
NomiTuriQayerda
name * string body Ismi (80 belgigacha).
type string
person | organization
body Odam yoki tashkilot.
phone string body Telefon raqami.
note string body Izoh (ko'pi bilan 500 belgi).
is_dependent boolean body Qaramog'ingizdagi odam (oila a'zosi).
telegram_ids array<integer> body Biriktiriladigan Telegram accountlari (boshqa kontaktniki bo'lsa — 409).
main_telegram_id integer body Asosiy Telegram account.
no_telegram boolean body Telegrami yo'q deb belgilash.
So'rov misoli
{
    "name": "Sardor",
    "type": "person",
    "phone": "+998901234567",
    "note": "Ishxonadan"
}
Javob

{"contact": Contact}

GET /api/v1/contacts/{contact} Kontakt: qarzlar, so'nggi 100 yozuv va sarf jamlanmasi.
Parametrlar
NomiTuriQayerda
contact * integer path Kontakt ID si.
from date query Sarf davri boshi (berilmasa — oy boshi).
to date query Sarf davri oxiri (berilmasa — oy oxiri).
Javob

{"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} Kontaktni tahrirlaydi.

name har safar yuborilsin; tizim kontaktining nomi va turi o'zgarmaydi.

Parametrlar
NomiTuriQayerda
contact * integer path Kontakt ID si.
name * string body Ismi (80 belgigacha).
type string
person | organization
body Odam yoki tashkilot.
phone string body Telefon raqami.
note string body Izoh (ko'pi bilan 500 belgi).
is_dependent boolean body Qaramog'ingizdagi odam (oila a'zosi).
So'rov misoli
{
    "name": "Sardor Karimov",
    "phone": "+998901234567",
    "is_dependent": false
}
Javob

{"contact": Contact}

DELETE /api/v1/contacts/{contact} Kontaktni o'chiradi; yozuvlar qoladi, faqat bog'lanish uziladi.
Parametrlar
NomiTuriQayerda
contact * integer path Kontakt ID si.
Javob

{"ok": true}

POST /api/v1/contacts/{contact}/merge from kontaktini shu kontaktga qo'shib, uni o'chiradi.
Parametrlar
NomiTuriQayerda
contact * integer path Qoladigan kontakt ID si.
from * integer body Qo'shilib o'chadigan kontakt ID si.
Javob

{"contact": Contact, "removed": int}

Kirim-chiqimlar

GET /api/v1/transactions Yozuvlar, yangisi oldin, 30 tadan sahifalab.
Parametrlar
NomiTuriQayerda
type string
income | expense | transfer
query Turi.
account_id integer query Hisob (kirgan va chiqqan o'tkazmalar ham); javobda totals ham keladi.
category_id integer query Kategoriya.
activity_id integer query Tadbir.
contact_id integer query Kontakt — iste'molchi yoki xizmat ko'rsatuvchi sifatida.
from date query Shu kundan (sizning vaqt zonangizda).
to date query Shu kungacha (sizning vaqt zonangizda).
q string query Izoh bo'yicha qidiruv.
page integer query Sahifa raqami.
pending_card boolean query Faqat tasdiq kutayotganlar (karta va API yozuvlari).
uncategorized_card boolean query Eski filtr: kategoriyasiz karta yozuvlari.
Javob

{"transactions": Transaction[], "current_page": int, "last_page": int, "total": int, "has_more": bool, "totals": {income, expense}|null}

POST /api/v1/transactions Kirim, chiqim yoki o'tkazma yozadi.

Dasturchi tokeni bilan yozuv source: "api" va tasdiq kutadi (is_pending: true): uni ilovada yoki confirm orqali tasdiqlang; kutayotganda kontakt ixtiyoriy. Valyuta hisobdan olinadi, summa 2 xonaga yaxlitlanadi; har xil valyutali o'tkazmada to_amount kiritiladi.

Parametrlar
NomiTuriQayerda
type * string
income | expense | transfer
body Turi.
amount * number body Summa, hisob valyutasida, 2 xonagacha.
account_id * integer body Hisob; valyuta doim shundan olinadi.
note string body Izoh (ko'pi bilan 500 belgi).
occurred_at date-time body Vaqti, ISO 8601, vaqt zonasi siljishi bilan yuboring (berilmasa — hozir).
category_id integer body Yozuv turidagi kategoriya (o'tkazmada e'tiborsiz).
contact_ids array<integer> body Kim uchun (iste'molchilar), birinchisi asosiy; kirim/chiqimda kerak.
contact_id integer body Bitta iste'molchi (contact_ids o'rniga).
provider_id integer body Kimga to'langan / kimdan kelgan (xizmat ko'rsatuvchi).
activity_ids array<integer> body Tadbirlar (bir nechta).
activity_id integer body Bitta tadbir.
to_account_id integer body O'tkazmada qabul qiluvchi hisob (shart).
to_amount number body O'tkazmada kirgan summa (shart); valyuta bir xil bo'lsa amount ga tenglanadi.
auto_confirm boolean body true — darhol tasdiqlangan yoziladi (unda kirim/chiqimga kontakt shart).
So'rov misoli
{
    "type": "expense",
    "amount": 45000,
    "account_id": 12,
    "category_id": 3,
    "contact_ids": [
        1
    ],
    "note": "Tushlik",
    "occurred_at": "2026-10-30T13:15:00+05:00"
}
Javob

{"transaction": Transaction}

POST /api/v1/transactions/confirm Tasdiq kutayotgan yozuvlarni birdan tasdiqlaydi (ids siz — hammasini).
Parametrlar
NomiTuriQayerda
ids array<integer> body Tasdiqlanadigan yozuvlar (500 tagacha).
contact_id integer body Kontaktsiz kirim/chiqimlarga qo'yiladi; ular bo'lsa — shart.
Javob

{"confirmed": int, "pending_count": int}

PUT /api/v1/transactions/{transaction} Yozuvni tahrirlaydi — faqat yuborilgan maydonlar o'zgaradi (turi o'zgarmaydi).

Dasturchi tokeni bilan yuborilmagan maydon o'z qiymatini saqlaydi; tozalash uchun null (ro'yxatga []) yuboring. Tasdiq kutayotgan API yozuvi kontaktsiz ham tahrirlanadi. Qarz va rejali to'lov yozuvlari bu yerdan tahrirlanmaydi (422).

Parametrlar
NomiTuriQayerda
transaction * integer path Yozuv ID si.
amount number body Summa, hisob valyutasida, 2 xonagacha.
account_id integer body Hisob; valyuta doim shundan olinadi.
note string body Izoh (ko'pi bilan 500 belgi).
occurred_at date-time body Vaqti, ISO 8601, vaqt zonasi siljishi bilan yuboring (berilmasa — hozir).
category_id integer body Yozuv turidagi kategoriya (o'tkazmada e'tiborsiz).
contact_ids array<integer> body Kim uchun (iste'molchilar), birinchisi asosiy; kirim/chiqimda kerak.
contact_id integer body Bitta iste'molchi (contact_ids o'rniga).
provider_id integer body Kimga to'langan / kimdan kelgan (xizmat ko'rsatuvchi).
activity_ids array<integer> body Tadbirlar (bir nechta).
activity_id integer body Bitta tadbir.
to_account_id integer body O'tkazmada qabul qiluvchi hisob (shart).
to_amount number body O'tkazmada kirgan summa (shart); valyuta bir xil bo'lsa amount ga tenglanadi.
So'rov misoli
{
    "amount": 52000,
    "account_id": 12,
    "category_id": 3,
    "contact_ids": [
        1
    ],
    "note": "Tushlik, choy bilan",
    "occurred_at": "2026-10-30T13:15:00+05:00"
}
Javob

{"transaction": Transaction}

DELETE /api/v1/transactions/{transaction} Yozuvni o'chiradi (qarz va rejali to'lov yozuvlari — 422).
Parametrlar
NomiTuriQayerda
transaction * integer path Yozuv ID si.
Javob

{"ok": true}

POST /api/v1/transactions/{transaction}/confirm Karta yoki API yozuvini tasdiqlaydi, kerak bo'lsa kategoriya va kontakt bilan.

Kirim/chiqimda kontakt bo'lmasa tasdiqlanmaydi (422); summa, hisob va sanaga tegilmaydi.

Parametrlar
NomiTuriQayerda
transaction * integer path Yozuv ID si (faqat karta yoki API yozuvi).
category_id integer body Kategoriya (null — olib tashlash).
contact_ids array<integer> body Kim uchun, birinchisi asosiy.
contact_id integer body Bitta iste'molchi.
provider_id integer body Xizmat ko'rsatuvchi (null — olib tashlash).
Javob

{"transaction": Transaction}

PUT /api/v1/transactions/{transaction}/parts Summani qismlarga bo'ladi (bo'sh ro'yxat — bo'lishni bekor qiladi).
Parametrlar
NomiTuriQayerda
transaction * integer path Yozuv ID si.
parts * array<object> body Qismlar (30 tagacha): amount, contact_ids (shart), category_id, note; yig'indisi yozuv summasiga teng.
Javob

{"transaction": Transaction}

Qarzlar

GET /api/v1/debts Qarzlar ro'yxati to'lov va qo'shimchalari bilan.
Javob

{"debts": Debt[]}

POST /api/v1/debts Yangi qarz yozadi.

Qarz jami saqlanmaydi: boshlang'ich + qo'shimchalar − to'lovlar.

Parametrlar
NomiTuriQayerda
direction * string
they_owe_me | i_owe
body Kim qarzdor: sizga qarzdor yoki siz qarzdorsiz.
person_name * string body Odamning ismi (80 belgigacha).
amount * number body Boshlang'ich summa, 2 xonagacha.
currency * string
UZS | USD | EUR | RUB | KZT | KGS | TJS | GBP | TRY | AED | JPY | CNY | KRW | CAD | CHF
body Qarz valyutasi.
note string body Izoh (ko'pi bilan 500 belgi).
occurred_at date-time body Vaqti, ISO 8601, vaqt zonasi siljishi bilan yuboring (berilmasa — hozir).
due_date date body Qaytarish muddati.
account_id integer body Pul shu hisobdan o'tadi (valyutasi teng); berilmasa — pul harakatisiz.
category_id integer body Pul harakati (yoki qarzga xarid) kategoriyasi.
contact_id integer body Kontakt.
activity_id integer body Tadbir.
on_credit boolean body Qarzga xarid (faqat i_owe): xarajat hozir, pul to'langanda; account_id e'tiborsiz.
So'rov misoli
{
    "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"
}
Javob

{"debt": Debt}

PUT /api/v1/debts/{debt} Qarzni qisman tahrirlaydi (faqat yuborilgan maydonlar).
Parametrlar
NomiTuriQayerda
debt * integer path Qarz ID si.
direction string
they_owe_me | i_owe
body Yo'nalish (pul harakati bor qarzda o'zgarmaydi).
person_name string body Odamning ismi.
amount number body Boshlang'ich summani tuzatadi (pul harakati ham).
currency string
UZS | USD | EUR | RUB | KZT | KGS | TJS | GBP | TRY | AED | JPY | CNY | KRW | CAD | CHF
body Valyuta (pul harakati bor qarzda o'zgarmaydi).
note string body Izoh (ko'pi bilan 500 belgi).
due_date date body Qaytarish muddati.
contact_id integer body Kontakt (null — uzish).
activity_id integer body Tadbir (null — uzish).
So'rov misoli
{
    "due_date": "2027-01-15",
    "note": "Muddat uzaytirildi"
}
Javob

{"debt": Debt}

DELETE /api/v1/debts/{debt} Qarzni barcha to'lovlari va pul harakatlari bilan o'chiradi.
Parametrlar
NomiTuriQayerda
debt * integer path Qarz ID si.
Javob

{"ok": true}

POST /api/v1/debts/{debt}/payments Qarzga to'lov yozadi (qoldiqdan oshmasin).
Parametrlar
NomiTuriQayerda
debt * integer path Qarz ID si.
amount * number body Summa, qarz valyutasida, 2 xonagacha.
note string body Izoh (ko'pi bilan 300 belgi).
occurred_at date-time body Vaqti, ISO 8601, vaqt zonasi siljishi bilan yuboring (berilmasa — hozir).
account_id integer body Pul shu hisobdan o'tadi (valyutasi qarznikiga teng bo'lsin); berilmasa — faqat qarz yoziladi.
category_id integer body Pul harakatining kategoriyasi (hisob berilganda).
So'rov misoli
{
    "amount": 500000,
    "account_id": 12,
    "occurred_at": "2026-10-30T18:00:00+05:00"
}
Javob

{"debt": Debt}

PUT /api/v1/debts/{debt}/payments/{payment} To'lovni to'liq almashtiradi.

account_id yuborilmasa pul harakati olib tashlanadi.

Parametrlar
NomiTuriQayerda
debt * integer path Qarz ID si.
payment * integer path To'lov ID si.
amount * number body Summa, qarz valyutasida, 2 xonagacha.
note string body Izoh (ko'pi bilan 300 belgi).
occurred_at date-time body Vaqti, ISO 8601, vaqt zonasi siljishi bilan yuboring (berilmasa — hozir).
account_id integer body Pul shu hisobdan o'tadi (valyutasi qarznikiga teng bo'lsin); berilmasa — faqat qarz yoziladi.
category_id integer body Pul harakatining kategoriyasi (hisob berilganda).
Javob

{"debt": Debt}

DELETE /api/v1/debts/{debt}/payments/{payment} To'lovni o'chiradi, balans tiklanadi.
Parametrlar
NomiTuriQayerda
debt * integer path Qarz ID si.
payment * integer path To'lov ID si.
Javob

{"debt": Debt}

POST /api/v1/debts/{debt}/additions Qarz ustiga qo'shadi («yana berdi»).
Parametrlar
NomiTuriQayerda
debt * integer path Qarz ID si.
amount * number body Summa, qarz valyutasida, 2 xonagacha.
note string body Izoh (ko'pi bilan 300 belgi).
occurred_at date-time body Vaqti, ISO 8601, vaqt zonasi siljishi bilan yuboring (berilmasa — hozir).
account_id integer body Pul shu hisobdan o'tadi (valyutasi qarznikiga teng bo'lsin); berilmasa — faqat qarz yoziladi.
category_id integer body Pul harakatining kategoriyasi (hisob berilganda).
Javob

{"debt": Debt}

PUT /api/v1/debts/{debt}/additions/{addition} Qo'shimchani to'liq almashtiradi.
Parametrlar
NomiTuriQayerda
debt * integer path Qarz ID si.
addition * integer path Qo'shimcha ID si.
amount * number body Summa, qarz valyutasida, 2 xonagacha.
note string body Izoh (ko'pi bilan 300 belgi).
occurred_at date-time body Vaqti, ISO 8601, vaqt zonasi siljishi bilan yuboring (berilmasa — hozir).
account_id integer body Pul shu hisobdan o'tadi (valyutasi qarznikiga teng bo'lsin); berilmasa — faqat qarz yoziladi.
category_id integer body Pul harakatining kategoriyasi (hisob berilganda).
Javob

{"debt": Debt}

DELETE /api/v1/debts/{debt}/additions/{addition} Qo'shimchani o'chiradi, balans tiklanadi.
Parametrlar
NomiTuriQayerda
debt * integer path Qarz ID si.
addition * integer path Qo'shimcha ID si.
Javob

{"debt": Debt}

Rejali to'lovlar

GET /api/v1/recurrings Rejali to'lovlar ro'yxati.
Javob

{"recurrings": Recurring[]}

POST /api/v1/recurrings Yangi rejali to'lov qo'shadi.

Jadval saqlanmaydi — starts_on va davrdan hisoblanadi.

Parametrlar
NomiTuriQayerda
title * string body Nomi (80 belgigacha).
type * string
income | expense
body Turi: kirim yoki chiqim.
amount * number body Har davr summasi, 2 xonagacha.
currency * string
UZS | USD | EUR | RUB | KZT | KGS | TJS | GBP | TRY | AED | JPY | CNY | KRW | CAD | CHF
body Valyuta; birinchi to'lovdan keyin o'zgarmaydi.
account_id integer body Odatiy hisob (valyutasi to'lovnikiga teng).
category_id integer body Kategoriya.
contact_id integer body Kontakt.
debt_id integer body Shu qarzni bo'lib to'lash (valyutasi teng bo'lsin).
interval_unit * string
day | week | month | year
body Davr birligi.
interval_count integer body Necha birlikda bir marta (1–60, odatda 1).
anchor_day integer body To'lov kuni (1–31).
starts_on * date body Boshlanish sanasi.
ends_on date body Tugash sanasi (boshlanishdan oldin emas).
total_periods integer body Jami davrlar soni (1–600).
auto_amount boolean body Keyingi summa oxirgi to'langanga tenglashsin.
penalty_daily_amount number body Kechikish uchun kunlik jarima summasi.
penalty_daily_percent number body Kunlik jarima foizi (0–100).
is_active boolean body Faolmi (false — to'xtatilgan).
note string body Izoh (ko'pi bilan 500 belgi).
So'rov misoli
{
    "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"
}
Javob

{"recurring": Recurring}

PUT /api/v1/recurrings/{recurring} Rejali to'lovni qisman tahrirlaydi.
Parametrlar
NomiTuriQayerda
recurring * integer path Rejali to'lov ID si.
title string body Nomi (80 belgigacha).
type string
income | expense
body Turi: kirim yoki chiqim.
amount number body Har davr summasi, 2 xonagacha.
currency string
UZS | USD | EUR | RUB | KZT | KGS | TJS | GBP | TRY | AED | JPY | CNY | KRW | CAD | CHF
body Valyuta; birinchi to'lovdan keyin o'zgarmaydi.
account_id integer body Odatiy hisob (valyutasi to'lovnikiga teng).
category_id integer body Kategoriya.
contact_id integer body Kontakt.
debt_id integer body Shu qarzni bo'lib to'lash (valyutasi teng bo'lsin).
interval_unit string
day | week | month | year
body Davr birligi.
interval_count integer body Necha birlikda bir marta (1–60, odatda 1).
anchor_day integer body To'lov kuni (1–31).
starts_on date body Boshlanish sanasi.
ends_on date body Tugash sanasi (boshlanishdan oldin emas).
total_periods integer body Jami davrlar soni (1–600).
auto_amount boolean body Keyingi summa oxirgi to'langanga tenglashsin.
penalty_daily_amount number body Kechikish uchun kunlik jarima summasi.
penalty_daily_percent number body Kunlik jarima foizi (0–100).
is_active boolean body Faolmi (false — to'xtatilgan).
note string body Izoh (ko'pi bilan 500 belgi).
So'rov misoli
{
    "amount": 135000,
    "is_active": true
}
Javob

{"recurring": Recurring}

DELETE /api/v1/recurrings/{recurring} Rejali to'lovni barcha yozuvlari va pul harakatlari bilan o'chiradi.
Parametrlar
NomiTuriQayerda
recurring * integer path Rejali to'lov ID si.
Javob

{"ok": true}

POST /api/v1/recurrings/{recurring}/entries Bir davrni to'langan deb yozadi (bir davr — bir yozuv).
Parametrlar
NomiTuriQayerda
recurring * integer path Rejali to'lov ID si.
period_on * date body Qaysi davr uchun (davr sanasi).
amount number body Summa; debt_payment_id yoki transaction_id berilmasa shart.
occurred_at date-time body Vaqti, ISO 8601, vaqt zonasi siljishi bilan yuboring (berilmasa — hozir).
account_id integer body Pul shu hisobdan (valyutasi teng); berilmasa — faqat belgi.
category_id integer body Kategoriya (berilmasa — rejaliniki).
note string body Izoh (ko'pi bilan 300 belgi).
debt_payment_id integer body Davrni qarzning mavjud to'lovi bilan yopish (yangi pul yozilmaydi).
transaction_id integer body Davrni mavjud kirim/chiqim bilan yopish (masalan, karta yozuvi).
So'rov misoli
{
    "period_on": "2026-11-05",
    "amount": 120000,
    "account_id": 12
}
Javob

{"recurring": Recurring}

PUT /api/v1/recurrings/{recurring}/entries/{entry} Davr yozuvini tahrirlaydi.
Parametrlar
NomiTuriQayerda
recurring * integer path Rejali to'lov ID si.
entry * integer path Yozuv ID si.
period_on * date body Qaysi davr uchun (davr sanasi).
amount number body Summa.
occurred_at date-time body Vaqti, ISO 8601, vaqt zonasi siljishi bilan yuboring (berilmasa — hozir).
account_id integer body Pul shu hisobdan (valyutasi teng); berilmasa — faqat belgi.
category_id integer body Kategoriya (berilmasa — rejaliniki).
note string body Izoh (ko'pi bilan 300 belgi).
Javob

{"recurring": Recurring}

DELETE /api/v1/recurrings/{recurring}/entries/{entry} Davr yozuvini o'chiradi.
Parametrlar
NomiTuriQayerda
recurring * integer path Rejali to'lov ID si.
entry * integer path Yozuv ID si.
Javob

{"recurring": Recurring}

Tadbirlar

GET /api/v1/activities Tadbirlar ro'yxati jamlanmasi bilan.
Javob

{"activities": Activity[]}

POST /api/v1/activities Yangi tadbir qo'shadi.
Parametrlar
NomiTuriQayerda
title * string body Nomi (80 belgigacha).
icon string body Belgi (emoji).
color string body Rang.
starts_on date body Boshlanish sanasi.
ends_on date body Tugash sanasi.
is_closed boolean body Yopilganmi.
note string body Izoh (ko'pi bilan 500 belgi).
parent_id integer body Ota tadbir (o'zi yoki ichidagisi bo'lolmaydi).
Javob

{"activity": Activity}

GET /api/v1/activities/{activity} Tadbir: yozuvlar, qarzlar, ichidagi tadbirlar va oylar bo'yicha.
Parametrlar
NomiTuriQayerda
activity * integer path Tadbir ID si.
Javob

{"activity": Activity, "transactions": Transaction[], "debts": Debt[], "children": Activity[], "monthly": array}

PUT /api/v1/activities/{activity} Tadbirni qisman tahrirlaydi.
Parametrlar
NomiTuriQayerda
activity * integer path Tadbir ID si.
title string body Nomi (80 belgigacha).
icon string body Belgi (emoji).
color string body Rang.
starts_on date body Boshlanish sanasi.
ends_on date body Tugash sanasi.
is_closed boolean body Yopilganmi.
note string body Izoh (ko'pi bilan 500 belgi).
parent_id integer body Ota tadbir (o'zi yoki ichidagisi bo'lolmaydi).
Javob

{"activity": Activity}

DELETE /api/v1/activities/{activity} Tadbirni o'chiradi; yozuvlar va qarzlar joyida qoladi.
Parametrlar
NomiTuriQayerda
activity * integer path Tadbir ID si.
Javob

{"ok": true}

Xaridlar

GET /api/v1/purchases So'nggi 50 ta xarid.
Javob

{"purchases": Purchase[]}

POST /api/v1/purchases Xarid yoki bo'lingan xarajat yozadi: to'lovlar, ishtirokchilar va qarzlar birga.
Parametrlar
NomiTuriQayerda
title * string body Nomi (120 belgigacha).
contact_id integer body Sotuvchi (kontakt).
category_id integer body Chiqim kategoriyasi.
currency * string
UZS | USD | EUR | RUB | KZT | KGS | TJS | GBP | TRY | AED | JPY | CNY | KRW | CAD | CHF
body Xarid valyutasi.
occurred_at date-time body Vaqti, ISO 8601, vaqt zonasi siljishi bilan yuboring (berilmasa — hozir).
note string body Izoh (ko'pi bilan 500 belgi).
service_percent number body Xizmat haqi foizi (0–100).
items array<object> body Pozitsiyalar: title, amount, shared_with (ishtirokchi kalitlari: me yoki c<kontakt id>).
participants array<object> body Ishtirokchilar: contact_id (bo'sh — siz), kind (mine | owed — qarz bo'ladi).
participant_amounts object body Pozitsiyasiz bo'lishda ulushlar: kalit (me, c<id>) → summa.
payments array<object> body To'lovlar: account_id, amount — har biri chiqim bo'ladi.
deferred object body {amount} — keyin to'lanadigan qism, sotuvchiga qarz bo'ladi.
Javob

{"purchase": Purchase}

GET /api/v1/purchases/{purchase} Bitta xarid.
Parametrlar
NomiTuriQayerda
purchase * integer path Xarid ID si.
Javob

{"purchase": Purchase}

DELETE /api/v1/purchases/{purchase} Xaridni to'lovlari va qarzlari bilan o'chiradi.
Parametrlar
NomiTuriQayerda
purchase * integer path Xarid ID si.
Javob

{"ok": true}

Hisobot

GET /api/v1/stats Davr bo'yicha kirim/chiqim, har valyuta alohida.

O'tkazmalar sanalmaydi; valyutalar qo'shilmaydi.

Parametrlar
NomiTuriQayerda
from date query Davr boshi (berilmasa — oy boshi).
to date query Davr oxiri (berilmasa — oy oxiri).
Javob

{"range": {from, to}, "expense": [{currency, category_id, total}], "income": [...], "daily": [{currency, type, date, total}], "totals": [{currency, income, expense}]}