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, 15 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 6.
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 6. 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 15 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.
amount_tolerance_pctint | NoneHow far an actual charge may differ from `expected_amount` and still count as this bill. Percent.
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 9 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.
split_bystr | NoneSeries axis. Empty for an ordinary chart; `tag` draws each tag listed in `filters_json` as its own series, so two tags compare side by side.
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).

merchant_budgets 5 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.
merchant_keystrThe normalised merchant name this budget applies to, matched against the same value on your transactions.
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.
currencystrISO 4217 code the budget was set in. Stamped once and never converted, so switching your home currency does not relabel it.
created_atdatetimeWhen the row was first created in Orbiq (UTC, ISO 8601).

receipts 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.
transaction_id_uuid.UUIDThe transaction this file is attached to. Join it to the transactions section.
content_typestrThe file type Orbiq detected from the bytes themselves, not from the name you uploaded it under.
byte_sizeintSize of the stored file in bytes, after camera metadata was removed.
original_filenamestr | NoneThe name the file had when you uploaded it. Display only.
uploaded_atdatetimeWhen you attached it (UTC, ISO 8601).

goals 24 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 the goal.
target_amountfloatWhat you are saving toward, or for a spending tracker, the limit. In `denomination_currency`.
current_amountfloatSaved so far on a manual savings goal, in `denomination_currency`. Account-linked goals and trackers work theirs out from transactions, so this is not their progress.
target_datedate | NoneThe date you want to get there by. Null if you set none.
account_id_uuid.UUID | NoneThe account a savings goal follows, whose balance is its progress. Null for a manual goal. Join it to the accounts section.
iconstrIcon key for display. Cosmetic; safe to ignore.
colorstrDisplay colour. Cosmetic; safe to ignore.
is_completedboolTrue once the goal was reached (or you marked it done).
completed_atdatetime | NoneWhen Orbiq first saw it reached (UTC). Null for goals reached before this was recorded.
last_celebrated_milestoneint | NoneThe highest of 25 / 50 / 75 / 100 percent already celebrated, so a restore does not celebrate it again.
denomination_currencystrISO 4217 code the goal is counted in. Transactions in other currencies are converted into it on their own date.
goal_typestrsavings (money you put aside) / category_tracker / tag_tracker (spending or income in chosen categories or tags).
tracked_category_idsstr | NoneTrackers: the categories being watched, as a JSON array of ids. Join them to the categories section.
tracked_tag_idsstr | NoneTrackers: the tags being watched, as a JSON array of ids.
track_expenseboolTrackers: true to count money out, false to count money in.
date_fromdate | NoneTrackers: the first day that counts.
date_todate | NoneTrackers: the last day that counts. Null means ongoing.
recurrencestr | NoneTrackers: monthly / quarterly / yearly to start over each period, or null for one long period.
goal_directionstrreach (get to the target) or stay_under (a limit not to go over).
starting_amountfloatTrackers: an amount counted as already done before `date_from`.
starting_yearsfloatTrackers: how many years that starting amount took, used to pace it.
filter_account_idsstr | NoneTrackers: only transactions from these accounts count, as a JSON array of ids. Null means every account.
created_atdatetimeWhen the row was first created in Orbiq (UTC, ISO 8601).

goal_contributions 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.
goal_id_uuid.UUIDThe goal this row belongs to. Join it to the goals section.
amountfloatHow much the saved amount changed, in the goal's `denomination_currency`. The rows of one goal add up to its `current_amount`.
kindstropening (what the goal had when Orbiq started recording it) / add (money added; negative means taken out) / adjust (you edited the saved amount; this is the change).
contributed_ondateThe day of the change, in your own time zone.
created_atdatetimeWhen the row was first created in Orbiq (UTC, ISO 8601).