Your data is yours
The question that actually stops people signing up for a product built by one person is not "is this any good?". It is "what happens to my ledger when he loses interest?" That is a reasonable fear and it cannot be argued away. It can only be answered with mechanisms, so here are the mechanisms.
Download the format before you sign up
This is the exact file Orbiq gives you, built from the public demo ledger and from nothing else. Open it, load it into a spreadsheet, check the arithmetic. You do not need an account to do any of that.
Download sample export (.zip, 13 KB) or the raw .json
The zip is the JSON plus its README and field manifest. In the app itself you
get the single .json — no bundle, no proprietary container.
The commitments, and the mechanism behind each one
A promise with no mechanism behind it is decoration. Each row names the thing that makes it true.
| Commitment | Mechanism |
|---|---|
| You can take everything, any time, without asking. | Settings → Download my data, gated by an emailed code that proves you control the account's email. One code, one export. Shipped and in use. |
| The export is the whole ledger, not a summary. | Nine sections covering every entity Orbiq stores for you — the field list below is read directly out of the exporter's source, not transcribed from it. |
| Foreign transactions keep their currency and their rate. | original_amount, original_currency and
exchange_rate travel with every row, so
amount = original_amount × exchange_rate reconciles outside Orbiq.
Format version 3. |
| The format is documented and versioned. | The version field at the top of the file. Columns may be added — a
restore applies defaults for anything an older file predates, so newer Orbiq always
reads older backups. Removing a column is a breaking change and is announced
before it ships. |
| The published format cannot drift from the real one. | A build gate regenerates this page and the sample from the exporter's own column lists and fails if they disagree, or if a new column has no documented meaning. |
| You can put it back. | The same file uploads into a fresh account and rebuilds it. Rows already present are skipped rather than duplicated. |
| Nothing here is a lock-in format. | Plain JSON, UTF-8, ISO-8601 dates, ISO-4217 currency codes. No proprietary container, no encryption you need us to undo. |
If Orbiq shuts down
Draft — the specific numbers are the founder's call and are not final. Published here so the shape is visible and can be argued with, rather than written after it would matter.
- Notice by email before the service stops, sent to every account with data in it — not a banner someone has to be logged in to see.
- Exports keep working through the notice period and beyond it, for a stated number of days after the last day of service.
- The format specification on this page stays published even after the app is gone, so a file you saved years earlier is still readable.
- No user data is transferred as an asset in any wind-down. The ledger is not part of what gets sold. If the company is wound up, the data is deleted, not inherited.
Reconciling dividends and reinvestment
The detail that shows whether an export was designed by someone who thought about how you would actually check it.
A dividend arrives as one transaction, in a category whose category_class is
investment_return. The reinvestment that follows leaves as a separate
transaction, class investment. Two rows, two dates, two exchange rates —
never netted into one.
So when you total your investment categories to work out what you actually put in, do not subtract dividends from it. They are income that arrived; the reinvestment that followed is separately recorded as capital deployed. Netting them understates both, and neither figure would tie to a statement afterwards.
You will not find a market value, a holding count or an unrealised gain anywhere in the file. Orbiq records money that moved and does not price assets, so it will not produce a portfolio figure it has no basis for.
Every field in the file
Format version 3. Generated from
backend/app/routers/backup.py — if the exporter changes and this does not, the
build fails.
accounts 10 fields · 4 rows in the sample
| Field | Type | Meaning |
|---|---|---|
id | _uuid.UUID | Stable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it. |
name | str | The name you gave it. |
institution | str | The bank or provider you typed or that the import detected. |
account_type | str | chequing / savings / credit / cash / investment. |
default_currency | str | ISO 4217 code this account is denominated in. Added in format version 3. |
credit_limit | float | None | Credit limit, for utilization tracking. Null unless it is a card. |
statement_day | int | None | Day of month the statement closes. Null if unknown. |
payment_due_day | int | None | Day of month payment is due. Null if unknown. |
utilization_target | float | None | The utilization percentage you asked to be warned above. |
created_at | datetime | When the row was first created in Orbiq (UTC, ISO 8601). |
categories 6 fields · 19 rows in the sample
| Field | Type | Meaning |
|---|---|---|
id | _uuid.UUID | Stable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it. |
name | str | The name you gave it. |
icon | str | None | Icon key for display. Cosmetic; safe to ignore. |
is_income | bool | True when money in this category comes toward you. |
category_class | str | expense / income / investment / investment_return / transfer / debt_principal. This is what decides which bucket a transaction lands in — not the account type. |
created_at | datetime | When the row was first created in Orbiq (UTC, ISO 8601). |
rules 6 fields · 0 rows in the sample
| Field | Type | Meaning |
|---|---|---|
id | _uuid.UUID | Stable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it. |
pattern | str | The text Orbiq matches against a description to auto-apply the category. |
category_id | _uuid.UUID | The category this row points at. Join it to the categories section. |
priority | int | Lower numbers win when two rules both match. |
source | str | Whether the rule was created by you or learned from a correction you made. |
created_at | datetime | When the row was first created in Orbiq (UTC, ISO 8601). |
budgets 4 fields · 0 rows in the sample
| Field | Type | Meaning |
|---|---|---|
id | _uuid.UUID | Stable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it. |
category_id | _uuid.UUID | The category this row points at. Join it to the categories section. |
amount | float | For a budget: the amount allocated. For a transaction: the amount in your home currency, converted at the rate on that transaction's own date. |
allocation_type | str | How the budget is expressed — a fixed amount or a share. |
budget_limits 3 fields · 0 rows in the sample
| Field | Type | Meaning |
|---|---|---|
id | _uuid.UUID | Stable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it. |
monthly_limit | float | The overall monthly ceiling for the limit row. |
enabled | int | Whether the limit is currently active. |
transactions 15 fields · 181 rows in the sample
| Field | Type | Meaning |
|---|---|---|
id | _uuid.UUID | Stable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it. |
account_id | _uuid.UUID | The account it belongs to. Join it to the accounts section. |
date | date | The date of the transaction itself (ISO 8601), not the date it was imported. |
description | str | The description as it arrived from your statement, screenshot or file. Never rewritten. |
amount | float | For a budget: the amount allocated. For a transaction: the amount in your home currency, converted at the rate on that transaction's own date. |
original_amount | float | The amount in the currency it actually happened in, before any conversion. |
original_currency | str | ISO 4217 code of that original amount. Added in format version 3. |
exchange_rate | float | The rate captured on this transaction's own date, used to produce `amount`. Added in format version 3. `amount` = `original_amount` × `exchange_rate`. |
category_id | _uuid.UUID | None | The category this row points at. Join it to the categories section. |
is_expense | bool | True when money left. Sign convention is carried here rather than in the amount's sign. |
notes | str | None | Anything you typed on the transaction. |
import_hash | str | Fingerprint used to recognise the same row on a re-import so it is not duplicated. |
auto_categorized | bool | True when Orbiq chose the category rather than you. |
spread_over_months | int | None | For a cost spread across months, how many. 1 or null means it was not spread. |
created_at | datetime | When the row was first created in Orbiq (UTC, ISO 8601). |
recurring_payments 14 fields · 0 rows in the sample
| Field | Type | Meaning |
|---|---|---|
id | _uuid.UUID | Stable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it. |
name | str | The name you gave it. |
description_pattern | str | None | What Orbiq matches to recognise the next instance of this recurring payment. |
account_id | _uuid.UUID | None | The account it belongs to. Join it to the accounts section. |
category_id | _uuid.UUID | None | The category this row points at. Join it to the categories section. |
frequency | str | weekly / biweekly / monthly / quarterly / annual. |
expected_amount | float | What it usually costs. |
amount_varies | bool | True for bills that change every cycle, like utilities. |
next_due_date | date | When the next one is expected. |
last_seen_date | date | None | When it last actually appeared in your ledger. |
is_confirmed | bool | True once you confirmed this really is recurring. |
is_active | bool | False when you have stopped tracking it. |
auto_pay | bool | Whether you marked it as paid automatically. |
created_at | datetime | When the row was first created in Orbiq (UTC, ISO 8601). |
saved_charts 8 fields · 0 rows in the sample
| Field | Type | Meaning |
|---|---|---|
id | _uuid.UUID | Stable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it. |
name | str | The name you gave it. |
chart_type | str | bar / line / pie / area. |
metric | str | What is being measured. |
group_by | str | What it is broken down by. |
filters_json | str | The saved filter set, as JSON. |
sort_order | int | Position in your saved-chart list. |
created_at | datetime | When the row was first created in Orbiq (UTC, ISO 8601). |
import_logs 7 fields · 0 rows in the sample
| Field | Type | Meaning |
|---|---|---|
id | _uuid.UUID | Stable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it. |
filename | str | The file you imported. |
institution | str | The bank or provider you typed or that the import detected. |
rows_imported | int | How many rows landed. |
rows_skipped | int | How many were recognised as already present. |
rows_error | int | How many could not be parsed. |
imported_at | datetime | When the import ran (UTC). |