Money Tracker ledger, cashbook and FX API
Money Tracker-Expense & Budget is Horoscope365's free personal-finance app (package com.freeman.moneymanager; sold in Chinese as 魔法记账). Households and small teams log income, expenses and account-to-account transfers, attach receipt photos, run a monthly total plus category budgets, keep several cash books — personal, team, business, project and AA split books — merge two logins into one family view, schedule rent and salary recurrences, and convert foreign amounts against a default currency. Android can turn other apps' payment notifications into pending ledger rows the user confirms; Premium unlocks voice and receipt capture, CSV/Excel/PDF/JSON bill import, an in-chat assistant, and a developer token under Settings → API. Google Play lists about 5 million downloads and a 4.8-star rating from roughly 330 thousand reviews, with ads and a yearly in-app subscription; the same product is on the App Store as id 6444122615 and on RuStore. It sits with Wallet, Spendee and other money-manager apps for people who want one ledger across cash, cards and shared books rather than a bank's own app.
Personal-ledger lines store amount in the book default currency and name the category as income_expenditure_category_id; live pocket balances arrive as currency_amount with a snapshot amount_time. Shared team books are addressed by cashbook_id, and FX posts consult user_default_currency_code before writing a currency_code. Household P&L bots, shared-book operations desks and travel-expense importers consume those fields; openData Studio turns them into callable open data.
Screenshots
API surface
The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.
Get personal transactions
POST
/v1/ledger/entries/searchopenfinanceLists the signed-in user's personal ledger. Default is the latest 50 rows by server_update_time (seconds); query mode (start_date/end_date/offset/type/category_id/account_id) filters on date_time milliseconds and returns meta. type 1=income 2=expense; an omitted type may mix transfers (3), balance adjustments (4) and AA rows (5/6).
Auth: Premium API token copied from the app's Settings → API screen (signed-in account with a yearly membership). Pass it as the form field token in application/x-www-form-urlencoded; do not send an Authorization header. An ordinary in-app login session is not accepted. The token stays valid until it is regenerated in the app.
- id
- user_id
- type
- income_expenditure_category_id
- from_account_id
- to_account_id
- date_time
- year
- month
- day
- amount
- remark
- add_time
- update_time
- server_add_time
- server_update_time
- is_server_delete
- meta.total
- meta.has_more
POST /v1/ledger/entries/search HTTP/1.1 Content-Type: application/x-www-form-urlencoded token=YOUR_API_TOKEN&start_date=2026-01-01&end_date=2026-01-31&limit=500&offset=0&type=2{ "status": "ok", "data": [ { "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "user_id": 12345, "type": 2, "income_expenditure_category_id": "1f7cca17-c34f-4fe2-9f63-01fa494ef008", "from_account_id": "", "to_account_id": "", "date_time": 1737475200000, "year": 2026, "month": 1, "day": 21, "amount": 35.5, "remark": "Lunch", "add_time": 1737500000000, "update_time": 1737500000000, "server_add_time": 1737500000, "server_update_time": 1737500000, "is_server_delete": 0 } ], "meta": { "mode": "query", "total": 128, "limit": 500, "offset": 0, "has_more": false, "start_date": "2026-01-01", "end_date": "2026-01-31" } }Add personal transaction
POST
/v1/ledger/entries/createopenfinancePosts one income (type=1) or expense (type=2) into the personal ledger. amount is in the entry currency; an optional currency_code (ISO 4217, taken from the currency list) converts it into the user's default currency. Cannot create transfers, balance adjustments or AA rows.
Auth: Premium API token copied from the app's Settings → API screen (signed-in account with a yearly membership). Pass it as the form field token in application/x-www-form-urlencoded; do not send an Authorization header. An ordinary in-app login session is not accepted. The token stays valid until it is regenerated in the app.
- id
- user_id
- type
- amount
- category_id
- account_id
- to_account_id
- date
- date_time
- year
- month
- day
- remark
- currency_code
- add_time
- server_add_time
POST /v1/ledger/entries/create HTTP/1.1 Content-Type: application/x-www-form-urlencoded token=YOUR_API_TOKEN&type=2&amount=35.50&category_id=1f7cca17-c34f-4fe2-9f63-01fa494ef008&date=2026-01-21&remark=Lunch{ "status": "ok", "data": { "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "user_id": 12345, "type": 2, "to_account_id": "", "date_time": 1737475200000, "year": 2026, "month": 1, "day": 21, "amount": 35.5, "remark": "Lunch", "add_time": 1737500000000, "update_time": 1737500000000, "server_add_time": 1737500000, "server_update_time": 1737500000, "is_server_delete": 0, "category_id": "1f7cca17-c34f-4fe2-9f63-01fa494ef008", "account_id": "" } }Get personal categories
POST
/v1/ledger/categories/listopendataReturns personal income (type=1) and expense (type=2) categories, including system defaults. title is often an i18n key such as category_food rather than localized display text; use id as the stable filter when adding or searching entries.
Auth: Premium API token copied from the app's Settings → API screen (signed-in account with a yearly membership). Pass it as the form field token in application/x-www-form-urlencoded; do not send an Authorization header. An ordinary in-app login session is not accepted. The token stays valid until it is regenerated in the app.
- id
- title
- type
POST /v1/ledger/categories/list HTTP/1.1 Content-Type: application/x-www-form-urlencoded token=YOUR_API_TOKEN{ "status": "ok", "data": [ { "id": "1f7cca17-c34f-4fe2-9f63-01fa494ef008", "title": "category_food", "type": 2 }, { "id": "c9e2b1aa-1111-4aaa-8bbb-0123456789ab", "title": "category_salary", "type": 1 } ] }Get personal accounts
POST
/v1/ledger/wallets/listopenbankingLists personal cash, card, virtual, investment and debt accounts. currency_amount is the live balance (a stored snapshot plus the flows after amount_time on the personal ledger, the same formula the app uses); amount_time in the response is set to the current time in milliseconds and is not written back.
Auth: Premium API token copied from the app's Settings → API screen (signed-in account with a yearly membership). Pass it as the form field token in application/x-www-form-urlencoded; do not send an Authorization header. An ordinary in-app login session is not accepted. The token stays valid until it is regenerated in the app.
- id
- name
- currency_id
- currency_code
- currency_amount
- amount_time
POST /v1/ledger/wallets/list HTTP/1.1 Content-Type: application/x-www-form-urlencoded token=YOUR_API_TOKEN{ "status": "ok", "data": [ { "id": "acc-uuid-example", "name": "Cash", "currency_id": "cur-uuid", "currency_code": "CNY", "currency_amount": 1234.56, "amount_time": 1737500000000 } ] }List joined cashbooks
POST
/v1/books/listopendataReturns the shared cashbooks (family, team, business, project, AA) the authenticated user has joined. The cashbook_id from this list is required on every book-scoped call.
Auth: Premium API token copied from the app's Settings → API screen (signed-in account with a yearly membership). Pass it as the form field token in application/x-www-form-urlencoded; do not send an Authorization header. An ordinary in-app login session is not accepted. The token stays valid until it is regenerated in the app.
- id
- name
POST /v1/books/list HTTP/1.1 Content-Type: application/x-www-form-urlencoded token=YOUR_API_TOKEN{ "status": "ok", "data": [ { "id": "1001", "name": "Family" }, { "id": "1002", "name": "Trip AA" } ] }Get cashbook transactions
POST
/v1/books/entries/searchopenfinanceSame query semantics as the personal entry search, scoped to a shared cashbook_id the user belongs to. An omitted type can mix AA shared expenses (5) and AA settlements (6) whose from_account_id/to_account_id may encode member ids.
Auth: Premium API token copied from the app's Settings → API screen (signed-in account with a yearly membership). Pass it as the form field token in application/x-www-form-urlencoded; do not send an Authorization header. An ordinary in-app login session is not accepted. The token stays valid until it is regenerated in the app.
- cashbook_id
- id
- user_id
- type
- income_expenditure_category_id
- from_account_id
- to_account_id
- date_time
- amount
- remark
- server_update_time
- is_server_delete
- meta.total
- meta.has_more
POST /v1/books/entries/search HTTP/1.1 Content-Type: application/x-www-form-urlencoded token=YOUR_API_TOKEN&cashbook_id=1001&start_date=2026-01-01&end_date=2026-03-31&limit=500&offset=0{ "status": "ok", "data": [ { "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "user_id": 12345, "type": 2, "income_expenditure_category_id": "1f7cca17-c34f-4fe2-9f63-01fa494ef008", "from_account_id": "", "to_account_id": "", "date_time": 1737475200000, "year": 2026, "month": 1, "day": 21, "amount": 35.5, "remark": "Lunch", "add_time": 1737500000000, "update_time": 1737500000000, "server_add_time": 1737500000, "server_update_time": 1737500000, "is_server_delete": 0 } ], "meta": { "mode": "query", "total": 42, "limit": 500, "offset": 0, "has_more": false, "start_date": "2026-01-01", "end_date": "2026-03-31" } }Add cashbook transaction
POST
/v1/books/entries/createopenfinancePosts one income or expense into a shared cashbook the user belongs to. Fails with a not-a-member error when cashbook_id is not in the user's joined book list. An optional currency_code converts the amount into the cashbook's default currency.
Auth: Premium API token copied from the app's Settings → API screen (signed-in account with a yearly membership). Pass it as the form field token in application/x-www-form-urlencoded; do not send an Authorization header. An ordinary in-app login session is not accepted. The token stays valid until it is regenerated in the app.
- cashbook_id
- id
- user_id
- type
- amount
- category_id
- account_id
- date
- currency_code
- date_time
- remark
- server_add_time
POST /v1/books/entries/create HTTP/1.1 Content-Type: application/x-www-form-urlencoded token=YOUR_API_TOKEN&cashbook_id=1001&type=2&amount=120.00&category_id=372f1424-2945-48d4-bf2c-15ede07a725b&date=2026-01-15{ "status": "ok", "data": { "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901", "user_id": 12345, "type": 2, "amount": 120.0, "category_id": "372f1424-2945-48d4-bf2c-15ede07a725b", "account_id": "", "date_time": 1736899200000, "year": 2026, "month": 1, "day": 15, "remark": "", "server_add_time": 1737500000, "server_update_time": 1737500000, "is_server_delete": 0 } }Get cashbook categories
POST
/v1/books/categories/listopendataReturns income/expense categories that belong to one shared cashbook. title may be an i18n key; pass id as category_id when adding cashbook entries.
Auth: Premium API token copied from the app's Settings → API screen (signed-in account with a yearly membership). Pass it as the form field token in application/x-www-form-urlencoded; do not send an Authorization header. An ordinary in-app login session is not accepted. The token stays valid until it is regenerated in the app.
- id
- title
- type
POST /v1/books/categories/list HTTP/1.1 Content-Type: application/x-www-form-urlencoded token=YOUR_API_TOKEN&cashbook_id=1001{ "status": "ok", "data": [ { "id": "372f1424-2945-48d4-bf2c-15ede07a725b", "title": "category_shopping", "type": 2 } ] }Get cashbook accounts
POST
/v1/books/wallets/listopenbankingLists accounts inside one shared cashbook, for the optional account_id when adding a cashbook entry. currency_amount is the live balance within that cashbook only (snapshot plus flows after amount_time); amount_time is the current time in milliseconds and is not persisted.
Auth: Premium API token copied from the app's Settings → API screen (signed-in account with a yearly membership). Pass it as the form field token in application/x-www-form-urlencoded; do not send an Authorization header. An ordinary in-app login session is not accepted. The token stays valid until it is regenerated in the app.
- id
- name
- currency_id
- currency_code
- currency_amount
- amount_time
POST /v1/books/wallets/list HTTP/1.1 Content-Type: application/x-www-form-urlencoded token=YOUR_API_TOKEN&cashbook_id=1001{ "status": "ok", "data": [ { "id": "acc-cashbook-uuid", "name": "Team wallet", "currency_id": "cur-uuid", "currency_code": "CNY", "currency_amount": 860.0, "amount_time": 1737500000000 } ] }Get currency list
POST
/v1/currencies/listopendataReturns every ISO 4217 currency the ledger accepts. Pass code (not an internal currency UUID) as currency_code when adding a personal or cashbook entry.
Auth: Premium API token copied from the app's Settings → API screen (signed-in account with a yearly membership). Pass it as the form field token in application/x-www-form-urlencoded; do not send an Authorization header. An ordinary in-app login session is not accepted. The token stays valid until it is regenerated in the app.
- code
- currency_name
- display_symbol
POST /v1/currencies/list HTTP/1.1 Content-Type: application/x-www-form-urlencoded token=YOUR_API_TOKEN{ "status": "ok", "data": [ { "code": "CNY", "currency_name": "Chinese Yuan", "display_symbol": "¥" }, { "code": "USD", "currency_name": "US Dollar", "display_symbol": "$" }, { "code": "EUR", "currency_name": "Euro", "display_symbol": "€" } ] }Get currency hint defaults
POST
/v1/currencies/defaultsopenfinanceReads the user's default currency and, when cashbook_id is sent, that book's default. Entry creation stores amount in the book default; a foreign currency_code conversion fails if the matching default is missing.
Auth: Premium API token copied from the app's Settings → API screen (signed-in account with a yearly membership). Pass it as the form field token in application/x-www-form-urlencoded; do not send an Authorization header. An ordinary in-app login session is not accepted. The token stays valid until it is regenerated in the app.
- user_default_currency_id
- user_default_currency_code
- cashbook_default_currency_id
- cashbook_default_currency_code
POST /v1/currencies/defaults HTTP/1.1 Content-Type: application/x-www-form-urlencoded token=YOUR_API_TOKEN&cashbook_id=1001{ "status": "ok", "data": { "user_default_currency_id": "uuid-or-null", "user_default_currency_code": "CNY", "cashbook_default_currency_id": "uuid-or-null", "cashbook_default_currency_code": "USD" } }
Data categories
- transactions
- accounts
- balances
- categories
- cashbooks
- currencies
- fx-defaults
Where teams use this data
Household monthly P&L
A budgeting bot pages the personal entry search (POST /v1/ledger/entries/search) in query mode (start_date, end_date, limit 500) and sums amount only where type is 1 or 2, grouping by income_expenditure_category_id so transfers (3) and balance adjustments (4, amount always 0) stay out of the P&L.
Shared-book operations desk
A family or shop integration calls POST /v1/books/list, then posts expenses with POST /v1/books/entries/create using that cashbook_id and a category_id from POST /v1/books/categories/list, failing closed when the token holder is not a member.
Net-worth snapshot
A wealth dashboard reads POST /v1/ledger/wallets/list and POST /v1/books/wallets/list and treats currency_amount as the live pocket balance (snapshot plus flows after amount_time), matching the on-device account view rather than summing the home-screen running total.
FX-aware capture
A travel-expense importer reads user_default_currency_code (and cashbook_default_currency_code) from POST /v1/currencies/defaults, checks ISO codes via POST /v1/currencies/list, then writes amount plus currency_code so the server stores the book-default amount.
Frequently asked questions
How does Money Tracker authenticate the developer API?
Premium members copy a long-lived token from Settings → API and send it as the form field token on every POST (application/x-www-form-urlencoded). An ordinary in-app login session is not accepted. Regenerating the token in the app invalidates the previous value immediately. The published limit is 1000 requests per IP per hour.
Can the API create transfers or AA split rows?
No. The entry-create calls for both the personal ledger and shared cashbooks only accept type 1 (income) or 2 (expense). The entry-search calls may still return type 3 (transfer), 4 (account balance adjustment, amount always 0 — read account_currency_amount), 5 (AA shared expense) and 6 (AA settlement) when those events were created in the app.
How do personal ledgers differ from cashbooks?
The personal ledger calls (entry search, entry create, category list, wallet list) cover the signed-in user's own book and must not send cashbook_id. Shared family, team, business, project and AA books go through the book list first, then the book-scoped calls, each of which requires cashbook_id. Family data sharing (two independent books merged in the UI) is separate from a multi-member cashbook.
Which fields hold live account balances?
The personal and cashbook wallet lists return currency_amount as the live balance in currency_code, using the same snapshot-plus-flows formula as the app. amount_time in the response is set to the current time in milliseconds and is not written back. The home-screen monthly/total balance is a running ledger remainder, not this account roll-up.
Apps similar to Money Tracker-Expense & Budget
- Wallet: Budget Expense Tracker — Wallet by BudgetBakers is a personal and family finance manager that combines expense tracking, smart budgeting and bank synchronization in one app.
- Spendee — Spendee is a money-manager app that tracks cash, bank accounts, e-wallets and crypto wallets, sets category budgets and offers shared wallets for couples, families and roommates.
- Money Manager Expense & Budget — Money Manager Expense & Budget by Realbyte is a personal-finance app that tracks spending, sets a monthly budget for each category, saves receipt photos and reviews weekly and monthly totals.
- AndroMoney — AndroMoney is a personal-finance tool for mobile and web that tracks daily expenses, sets monthly category budgets with exceed alerts, and supports multiple accounts and currencies.
- YNAB — YNAB (You Need a Budget) is an online personal budgeting program based on the envelope system, available in a web browser or as a mobile app.
- Goodbudget — Goodbudget is a home budget tracker for the web, Android and iPhone that uses virtual envelope budgeting so households can spend, save and share a budget.
- Toshl Finance — Toshl Finance is a personal-finance app on Android, iOS and the web that tracks expenses, organizes bills and budgets, and can connect financial accounts or import files.
- PocketGuard — PocketGuard is a money-management app that links accounts to track spending, build a personalized budget and show how much is left after bills, debts and savings.
Topics
- Money Tracker API
- 魔法记账 API
- expense tracker ledger
- cashbook transactions
- currency_amount
- income_expenditure_category_id
- Horoscope365
- open finance
Need this app's data API integrated?
We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.
- NDA + SOW on every engagement
- Delivery in 3–7 days
- Payment only after acceptance
- Work scoped to authorized use