Daily Expenses 3 is Michel Carvajal's Encodemx personal-finance app for Android: a manual ledger for everyday cash, bank and card spending rather than a bank client. Users manage several accounts side by side, categorize expenses and income, set monthly budgets by category, schedule recurring bills and subscriptions, and review day, week, fortnight, month and year reports. Notes and receipt photos help document purchases, while multi-currency accounts, transfers and exports support household bookkeeping; automatic cloud backups and restore tools let users move the book to a new phone. The Spanish-first app comes from a Mexico-based independent developer and carries a 4.6-star rating on Google Play, serving households across Mexico, Spain, Argentina, Chile, Brazil and the United States that want an offline-first book rather than an open-banking dashboard. Money Lover, Wallet and Mobills are alternatives in the same personal-finance category; the Android version documented here is 3.682.G.
Expense-book snapshots link dated income and spending to accounts and categories through id_account and id_category. Movement rows carry amount, sign, detail, date_record and time_record, with confirmed and transfer flags for interpreting entries before aggregation. Account records add initial_balance, final_balance, positive_max and negative_max, alongside currency codes in the documented examples.
Budget records pair a budget amount with period, initial_date and final_date. Recurring operations retain repeat_number, each_number, next_date, amount and enabled, making schedules available separately from recorded spending. JSON snapshots organize rows under table and records; backup identifiers and metadata such as id_backup, date_creation and is_file distinguish saved copies and their formats. Currency conversion supplies base_code and conversion_rates for a common-currency view across accounts.
Budget-coaching teams can join spending by category to the matching budget period, while financial planners can use scheduled amounts and dates to forecast recurring commitments. Bookkeeping and expense-analytics tools can work from saved ledger snapshots, separating account transfers from spending and retaining the backup timestamp for context. openData Studio turns these ledger, budget, schedule and backup fields 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.
Log in and mint a sync token
POST
/illustrative/v1/expense-book/sign-inopenfinanceSigns a Daily Expenses 3 account in with email and password and returns the token that the ledger and migration calls attach, together with the account record and the user/subscription keys.
Auth: No token needed to call it: the body carries email and password, and the response returns the sync token plus the user's account and subscription keys.
- event
- password
- service
- device
- token
- user_accounts
- pk_user
- pk_subscription
- found
POST /illustrative/v1/expense-book/sign-in HTTP/1.1 Content-Type: application/json X-Token: <app_token> User-id: 0 email: [email protected] os: android { "event": "user-login", "data": { "email": "[email protected]", "password": "<PASSWORD>", "service": 1, "device": {} } }{ "status": true, "message": "OK", "found": 1, "data": { "token": "<TOKEN>", "pk_user": 18422, "pk_subscription": 0, "user_accounts": { "email": "[email protected]", "name": "Household book", "language": "es" }, "user_subscriptions": [] } }Migrate the full five-table ledger
POST
/illustrative/v1/expense-book/ledger-migrationopenfinanceUploads the whole local book in a single call: reset flag, user and subscription keys, per-table row counters, then the five row arrays for accounts, recurring operations, categories, budgets and movements.
Auth: X-Token app header plus User-id and email headers (os=android); the User-id is the pk_user returned by the login call.
- event
- reset
- user
- fk_user
- fk_subscription
- counters
- count_accounts
- count_automatics
- count_categories
- count_budgets
- count_movements
- table_accounts
- table_automatics
- table_categories
- table_budgets
- table_movements
POST /illustrative/v1/expense-book/ledger-migration HTTP/1.1 Content-Type: application/json X-Token: <app_token> User-id: 18422 email: [email protected] os: android { "event": "migration", "data": { "reset": 1, "user": { "email": "[email protected]", "version": "V3", "fk_user": 18422, "fk_subscription": 0 }, "counters": { "count_accounts": 3, "count_automatics": 12, "count_categories": 41, "count_budgets": 6, "count_movements": 2380 }, "table_accounts": [ { "_id": 1, "account": "Cash", "initial_balance": 1500.0, "balance": 842.35, "iso_code": "MXN" } ], "table_movements": [ { "_id": 9012, "account": "Cash", "category": "Groceries", "amount": 348.5, "sign": "-", "detail": "Supermarket", "date": "2026-10-24", "time": "19:42", "month": 10, "year": 2026, "transfer": 0 } ] } }{ "status": true, "message": "Migration completed", "found": 1 }Register a backup slot
POST
/illustrative/v1/expense-book/record-backup-registrationopenfinanceOpens a new backup record for the signed-in book and returns the id_backup that the record upload and restore calls key on.
Auth: No session token: the JSON body carries the stored id_user and the app reports whether the install is licensed through the automatic/message flags.
- id_user
- created_in
- automatic
- message
- id_backup
POST /illustrative/v1/expense-book/record-backup-registration HTTP/1.1 Content-Type: application/json { "id_user": "48211", "created_in": "V3", "automatic": "1", "message": "Automatic backup" }{ "success": true, "message": "Backup created", "id_backup": "b7f3c2a1-9d44-4e18-8a06-2f5c1d9e7b30" }List a user's backup history
POST
/illustrative/v1/expense-book/record-backup-historyopenfinancePages the cloud backup list shown on the restore screen: each row's id_backup, the app generation it was written in and its creation timestamp.
Auth: No session token: the caller sends the stored backup_email and receives only that email's backups.
- id_backup
- created_in
- date_creation
POST /illustrative/v1/expense-book/record-backup-history HTTP/1.1 Content-Type: application/json { "email": "[email protected]" }{ "success": true, "content": [ { "id_backup": "b7f3c2a1-9d44-4e18-8a06-2f5c1d9e7b30", "created_in": "V3", "date_creation": "2026-10-24 21:14:03" }, { "id_backup": "c81a5e02-31b7-49d0-9f22-7a6be4d1c055", "created_in": "V3", "date_creation": "2026-10-17 21:09:44" } ] }Upload the JSON record set
POST
/illustrative/v1/expense-book/record-backup-uploadopenfinanceWrites the serialized book into the backup slot: each entry names one backup_* table and its row array, as produced by the app's table serializer.
Auth: No session token: the JSON body carries id_backup, which scopes the write to one previously registered backup slot.
- id_backup
- content
- table
- records
- id_account
- id_category
- amount
- sign
- detail
- date_record
- time_record
- confirmed
- transfer
POST /illustrative/v1/expense-book/record-backup-upload HTTP/1.1 Content-Type: application/json { "id_backup": "b7f3c2a1-9d44-4e18-8a06-2f5c1d9e7b30", "content": [ { "table": "backup_accounts", "records": [ { "id_account": "1", "name": "Cash", "income": "8200.000000", "expense": "7357.650000", "initial_balance": "1500.000000", "final_balance": "842.350000", "iso_code": "MXN" } ] }, { "table": "backup_movements", "records": [ { "id_account": "1", "id_category": "7", "amount": "348.500000", "sign": "-", "detail": "Supermarket", "date_record": "2026-10-24", "time_record": "19:42:00", "confirmed": "1", "transfer": "0", "month": "10", "year": "2026" } ] } ] }{ "success": true, "message": "Records saved" }Download a backup for restore
POST
/illustrative/v1/expense-book/record-backup-restoreopenfinanceReturns the stored table set for one backup so the restore screen can rebuild accounts, budgets, recurring operations, categories and movements locally.
Auth: No session token: id_backup in the JSON body selects which stored book to return.
- id_backup
- content
- table
- records
- id_account
- id_category
- name
- initial_balance
- final_balance
- positive_max
- negative_max
- period
- budget
- initial_date
- final_date
- repeat_number
- each_number
- enabled
- amount
- next_date
POST /illustrative/v1/expense-book/record-backup-restore HTTP/1.1 Content-Type: application/json { "id_backup": "b7f3c2a1-9d44-4e18-8a06-2f5c1d9e7b30" }{ "success": true, "message": "OK", "content": [ { "table": "backup_accounts", "records": [ { "id_account": "1", "name": "Cash", "initial_balance": "1500.000000", "final_balance": "842.350000", "positive_max": "0.000000", "negative_max": "0.000000", "iso_code": "MXN", "selected": "1" } ] }, { "table": "backup_budgets", "records": [ { "id_account": "1", "id_category": "7", "period": "month", "budget": "3500.000000", "initial_date": "2026-10-01", "final_date": "2026-10-31" } ] }, { "table": "backup_automatics", "records": [ { "id_account": "1", "id_category": "12", "period": "month", "repeat_number": "0", "each_number": "1", "enabled": 1, "amount": "499.000000", "next_date": "2026-11-01" } ] } ] }Delete backup records in bulk
POST
/illustrative/v1/expense-book/record-backup-pruningopenfinanceRemoves one or more selected backups from the user's history when the storage screen prunes old copies.
Auth: No session token: the JSON body lists the id_backup values to remove from the caller's history.
- content
- id_backup
- success
- message
POST /illustrative/v1/expense-book/record-backup-pruning HTTP/1.1 Content-Type: application/json { "content": [ "c81a5e02-31b7-49d0-9f22-7a6be4d1c055", "d5e0f8c7-62a4-4b91-b3d8-08c7a2e9f144" ] }{ "success": true, "message": "Backups deleted" }Resolve a backup account by email
GET
/illustrative/v1/expense-book/file-owner-lookupopenfinanceFinds the backup account id for an email before the file-based backup screens list or upload SQLite copies.
Auth: No session token: the account email is the lookup key and the response returns the matching id_user.
- status
- found
- id_user
GET /illustrative/v1/expense-book/file-owner-lookup?email=user%40example.com HTTP/1.1{ "status": true, "found": true, "data": { "id_user": "48211", "email": "[email protected]" } }Create a file-backup account
POST
/illustrative/v1/expense-book/file-owner-registrationopenfinanceRegisters the email as a file-backup owner and returns the id_user used as the path parameter on upload, list and delete calls; the country and city fields come from the app's IP geolocation step.
Auth: No session token: the JSON body carries the email plus device, locale and licence flags; the response id_user is stored for later file uploads.
- password
- license
- ios
- version
- version_ios
- country_code
- city
- device_name
- device_model
- device_os_version
- id_user
POST /illustrative/v1/expense-book/file-owner-registration HTTP/1.1 Content-Type: application/json { "email": "[email protected]", "password": "", "license": "0", "ios": "0", "version": "3.682.G", "version_ios": "", "country_code": "MX", "city": "Ciudad de Mexico", "device_name": "", "device_model": "", "device_os_version": "" }{ "status": true, "data": { "id_user": "48211" } }Upload the SQLite book as a file
POST
/illustrative/v1/expense-book/sqlite-uploadopenfinanceUploads the raw SQLite database as a multipart file so a restore can copy back the exact local store, including rows the JSON exporter skips.
Auth: No session token: id_user and email identify the owner, and the database file rides as a multipart part named file.
- id_user
- created_in
- automatic
- file
- status
POST /illustrative/v1/expense-book/sqlite-upload?id_user=48211&email=user%40example.com HTTP/1.1 Content-Type: multipart/form-data; boundary=----FormBoundary ------FormBoundary Content-Disposition: form-data; name="id_user" 48211 ------FormBoundary Content-Disposition: form-data; name="created_in" V3 ------FormBoundary Content-Disposition: form-data; name="automatic" 0 ------FormBoundary Content-Disposition: form-data; name="file"; filename="database.sqlite" Content-Type: text/plain <SQLite bytes> ------FormBoundary--{ "status": true, "message": "File uploaded" }List SQLite file backups
GET
/illustrative/v1/expense-book/sqlite-historyopenfinanceLists the stored SQLite copies with their timestamps and an is_file flag so the restore screen can tell file backups from record backups.
Auth: No session token: id_user and email in the query string scope the returned backup list to one owner.
- id_user
- id_backup
- date_time
- backup
- date_creation
- is_file
GET /illustrative/v1/expense-book/sqlite-history?id_user=48211&email=user%40example.com HTTP/1.1{ "status": true, "found": true, "data": [ { "id_backup": "b7f3c2a1-9d44-4e18-8a06-2f5c1d9e7b30", "date_time": "2026-10-24 21:14", "backup": { "date_creation": "2026-10-24 21:14:03", "is_file": 1 } } ] }Mint a public backup link
GET
/illustrative/v1/expense-book/sqlite-share-linkopenfinanceTurns a stored backup file into a public URL, which the app shares when a user exports or hands the file to another install.
Auth: No session token: the email and file name identify the object; the response is a shareable URL.
- name
- data
GET /illustrative/v1/expense-book/sqlite-share-link?email=user%40example.com&name=database.sqlite HTTP/1.1{ "status": true, "data": "<RESOURCE_URL>" }Delete SQLite backups
DELETE
/illustrative/v1/expense-book/sqlite-removalopenfinanceClears an owner's stored SQLite copies from the file-backup service.
Auth: No session token: id_user and email in the query string identify the owner whose stored files are removed.
- id_user
- status
- message
DELETE /illustrative/v1/expense-book/sqlite-removal?id_user=48211&email=user%40example.com HTTP/1.1{ "status": true, "message": "Backups deleted" }Convert amounts to a base currency
GET
/illustrative/v1/expense-book/currency-conversion/{api_key}/{base_code}opendataSupplies the conversion rates that let a book hold accounts in different iso_code currencies and still total them in one display currency.
Auth: Static API key embedded in the path; no user authentication.
- result
- error-type
- base_code
- conversion_rates
GET /illustrative/v1/expense-book/currency-conversion/<API_KEY>/MXN HTTP/1.1{ "result": "success", "base_code": "MXN", "conversion_rates": { "MXN": 1, "USD": 0.0542, "EUR": 0.0498, "ARS": 62.41, "CLP": 51.77 } }Resolve the user's country and city
GET
/illustrative/v1/expense-book/install-locationopendataGeolocates the install so the app can prefill user_country_code and user_city, which then travel in the backup-account registration payload.
Auth: Static apikey query parameter; no user authentication.
- ip
- location.country_code2
- location.city
- location.latitude
- location.longitude
- timezone.name
GET /illustrative/v1/expense-book/install-location?apikey=<API_KEY> HTTP/1.1{ "data": { "ip": "189.203.44.17", "location": { "country_code2": "MX", "city": "Ciudad de Mexico", "latitude": 19.4326, "longitude": -99.1332 }, "timezone": { "name": "America/Mexico_City" } } }
Data categories
- accounts
- transactions
- categories
- budgets
- recurring-operations
- backups
- currencies
- geo-locale
Where teams use this data
Household ledger sync without the phone
A bookkeeping bot resolves a user's id_user by email, lists their backups, and pulls the table set for the newest id_backup so account balances and expense rows can be charted without a handset in the loop.
Budget-versus-spend coaching
A coaching dashboard joins backup_budgets rows (budget, initial_date, final_date, period) with backup_movements rows summed by id_category and sign, then flags categories running above their cap before month end.
Recurring-bill forecasting
Finance planners read backup_automatics to project the next charge date and amount from period, repeat_number, each_number, next_date, amount and the enabled flag, building a 90-day cash-flow forecast.
Multi-currency spend normalization
Analysts convert every movement tagged with a non-base iso_code using the app's exchange-rate source, then report a household's spend in one currency across accounts held in different countries.
Frequently asked questions
Which Daily Expenses 3 ledger records are documented?
The migration model groups accounts, recurring operations, categories, budgets and movements into five table arrays, with a row counter for each. The backup examples include account balances, dated movement amounts and category keys, budget amounts and date ranges, and recurring amounts with their next scheduled date.
How can an integration distinguish income, expenses and transfers?
Movement records carry amount and sign, plus id_account and id_category for grouping. The transfer flag identifies moves between accounts, so a spending report can treat transfers separately rather than counting them as ordinary purchases. Account examples also include income, expense and final_balance totals.
How do ledger migration, JSON backups and SQLite backups differ?
Sign-in returns a token and the pk_user account key for the migration flow, which sends five ledger table arrays with row counters. JSON backups use id_backup to identify a saved set of table and records objects. SQLite backups instead carry the database as a file; their history includes date_time, date_creation and is_file metadata.
What currency and location fields are available?
Account examples carry iso_code, while the conversion model supplies base_code and conversion_rates for common-currency calculations. Location fields include country, city, coordinates and timezone; country_code and city are used when registering a file-backup account, rather than describing where each purchase occurred.
Apps similar to Daily Expenses 3
- Money Lover - Money Manager — Money Lover is Finsify's personal-finance app for logging income and spending, setting budgets and reviewing charts, with recurring-payment reminders, savings goals and multi-currency support on Android and iOS.
- Wallet: Budget Expense Tracker — Wallet by BudgetBakers is a personal and family finance manager on iOS, Android and the web that tracks expenses, plans budgets and can import transactions from connected bank accounts, with Premium group sharing for couples and families.
- Mobills: Budget Planner — Mobills is a Brazilian personal-finance app and website that gathers expenses in one place, sets monthly budgets and can automatically connect bank accounts and cards on Android, iOS and the web.
- Spendee — Spendee is a personal-finance app from Prague-based SPENDEE a.s. that tracks cash, bank, e-wallet and crypto balances, imports connected-account transactions automatically, and supports shared wallets and category budgets.
- YNAB — YNAB (You Need A Budget) is a personal-finance app for iOS, Android and the web that lets people decide what their money is for before they spend it, with goal tracking and a subscription that can be shared with family.
- Monefy — Monefy is a personal expense-tracking app from Reflective Technologies ApS for iOS and Android that logs purchases, supports more than 150 currencies, and can share a budget with a partner over Google Drive or Dropbox.
- Goodbudget — Goodbudget is a household budgeting app from Dayspring Technologies for the web, Android and iPhone that uses a digital envelope budget system and can sync and share envelopes across a household.
- Money Manager Expense & Budget — Money Manager Expense & Budget by Realbyte Inc. is a personal-finance app for Android and iOS that records spending with double-entry bookkeeping, sets a monthly limit per category, and can attach receipt photos.
Topics
- Daily Expenses 3 Data API
- Daily Expenses 3 ledger fields
- expense tracker API
- budget and recurring payment data
- JSON and SQLite backup data
- Encodemx
- gastos diarios
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