Orbiq

← Trust & governance

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.

CommitmentMechanism
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.

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

FieldTypeMeaning
id_uuid.UUIDStable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it.
namestrThe name you gave it.
institutionstrThe bank or provider you typed or that the import detected.
account_typestrchequing / savings / credit / cash / investment.
default_currencystrISO 4217 code this account is denominated in. Added in format version 3.
credit_limitfloat | NoneCredit limit, for utilization tracking. Null unless it is a card.
statement_dayint | NoneDay of month the statement closes. Null if unknown.
payment_due_dayint | NoneDay of month payment is due. Null if unknown.
utilization_targetfloat | NoneThe utilization percentage you asked to be warned above.
created_atdatetimeWhen the row was first created in Orbiq (UTC, ISO 8601).

categories 6 fields · 19 rows in the sample

FieldTypeMeaning
id_uuid.UUIDStable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it.
namestrThe name you gave it.
iconstr | NoneIcon key for display. Cosmetic; safe to ignore.
is_incomeboolTrue when money in this category comes toward you.
category_classstrexpense / income / investment / investment_return / transfer / debt_principal. This is what decides which bucket a transaction lands in — not the account type.
created_atdatetimeWhen the row was first created in Orbiq (UTC, ISO 8601).

rules 6 fields · 0 rows in the sample

FieldTypeMeaning
id_uuid.UUIDStable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it.
patternstrThe text Orbiq matches against a description to auto-apply the category.
category_id_uuid.UUIDThe category this row points at. Join it to the categories section.
priorityintLower numbers win when two rules both match.
sourcestrWhether the rule was created by you or learned from a correction you made.
created_atdatetimeWhen the row was first created in Orbiq (UTC, ISO 8601).

budgets 4 fields · 0 rows in the sample

FieldTypeMeaning
id_uuid.UUIDStable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it.
category_id_uuid.UUIDThe category this row points at. Join it to the categories section.
amountfloatFor 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_typestrHow the budget is expressed — a fixed amount or a share.

budget_limits 3 fields · 0 rows in the sample

FieldTypeMeaning
id_uuid.UUIDStable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it.
monthly_limitfloatThe overall monthly ceiling for the limit row.
enabledintWhether the limit is currently active.

transactions 15 fields · 181 rows in the sample

FieldTypeMeaning
id_uuid.UUIDStable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it.
account_id_uuid.UUIDThe account it belongs to. Join it to the accounts section.
datedateThe date of the transaction itself (ISO 8601), not the date it was imported.
descriptionstrThe description as it arrived from your statement, screenshot or file. Never rewritten.
amountfloatFor 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_amountfloatThe amount in the currency it actually happened in, before any conversion.
original_currencystrISO 4217 code of that original amount. Added in format version 3.
exchange_ratefloatThe 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 | NoneThe category this row points at. Join it to the categories section.
is_expenseboolTrue when money left. Sign convention is carried here rather than in the amount's sign.
notesstr | NoneAnything you typed on the transaction.
import_hashstrFingerprint used to recognise the same row on a re-import so it is not duplicated.
auto_categorizedboolTrue when Orbiq chose the category rather than you.
spread_over_monthsint | NoneFor a cost spread across months, how many. 1 or null means it was not spread.
created_atdatetimeWhen the row was first created in Orbiq (UTC, ISO 8601).

recurring_payments 14 fields · 0 rows in the sample

FieldTypeMeaning
id_uuid.UUIDStable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it.
namestrThe name you gave it.
description_patternstr | NoneWhat Orbiq matches to recognise the next instance of this recurring payment.
account_id_uuid.UUID | NoneThe account it belongs to. Join it to the accounts section.
category_id_uuid.UUID | NoneThe category this row points at. Join it to the categories section.
frequencystrweekly / biweekly / monthly / quarterly / annual.
expected_amountfloatWhat it usually costs.
amount_variesboolTrue for bills that change every cycle, like utilities.
next_due_datedateWhen the next one is expected.
last_seen_datedate | NoneWhen it last actually appeared in your ledger.
is_confirmedboolTrue once you confirmed this really is recurring.
is_activeboolFalse when you have stopped tracking it.
auto_payboolWhether you marked it as paid automatically.
created_atdatetimeWhen the row was first created in Orbiq (UTC, ISO 8601).

saved_charts 8 fields · 0 rows in the sample

FieldTypeMeaning
id_uuid.UUIDStable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it.
namestrThe name you gave it.
chart_typestrbar / line / pie / area.
metricstrWhat is being measured.
group_bystrWhat it is broken down by.
filters_jsonstrThe saved filter set, as JSON.
sort_orderintPosition in your saved-chart list.
created_atdatetimeWhen the row was first created in Orbiq (UTC, ISO 8601).

import_logs 7 fields · 0 rows in the sample

FieldTypeMeaning
id_uuid.UUIDStable identifier. Restoring a file that still contains this id will skip the row rather than duplicate it.
filenamestrThe file you imported.
institutionstrThe bank or provider you typed or that the import detected.
rows_importedintHow many rows landed.
rows_skippedintHow many were recognised as already present.
rows_errorintHow many could not be parsed.
imported_atdatetimeWhen the import ran (UTC).