For investors and partners

Everything we've built.
Nothing we haven't.

Finmind is a pay-per-feature financial platform for Uzbekistan: portfolio, brokerage, market data, tax, wealth planning and personal finance in one system. This page is its register. Every figure below is read from the running platform as the page renders, or stamped with the day we measured it.

Deciding whether to fund

You are in the right place. The register below is the whole company, limits included.

Deciding whether to buy

Banks, insurers, funds and regulators have their own surface. Finmind for institutions.

The company

What Finmind is

A financial-intelligence platform for Uzbekistan: capital markets, FX, commodities and macro data consolidated from official sources, with portfolio, accounting, the country's real personal income-tax engine, credit, insurance, pension and advisory built on top. Sold per feature, time-boxed monthly or annual. No subscription tiers.

Features live today
75
from the catalogue API, this render
Product categories
10
from the catalogue API, this render
Price per feature
1 000,00 UZS / month
from the catalogue API, this render
Upstream systems live
11 of 26
backend/apps/integrations/catalog.py → 26 entries (11 live / 8 partial / 4 designed / 3 blocked), counted 2026-08-29 after the KATM credit bureau (katm) was declared alongside the first-party bank catalogues (uz_bank_deposits, uz_bank_loans, uz_card_products); the development table `integrations` trails until its next seed run
Backend tests
1 753+
pytest --collect-only -q --ignore=apps/oneid → "1753 tests collected" on the measurement date (apps/oneid is a module still being wired up; its tests are EXCLUDED from this count rather than counted optimistically)
Automation engines, one order seam
6
backend/apps/{brokerage,stoploss,algotrading,aitrader,copytrade,autopilot}, one engine each

Live figures read this render; measured figures observed 23.08.2026 against the running system. Sources printed beneath each.

Real or null

A price on Finmind comes from a named source or it is null. An unknown renders as “n/a” with a machine-readable reason, never as a placeholder number.

Live or measured, labelled either way

Counts and prices marked live are read from the platform's own API as this page renders. Everything else is measured: observed once, on 23.08.2026, with the command or file that produced it printed further down. There is no third category.

Decimal, never float

Money is exact decimal end to end. NUMERIC in the database, strings on the wire, BigInt arithmetic in the browser. No money value ever touches a float.

Cited, not asserted

Tax computations carry their Tax Code article basis, and a statutory parameter cannot be saved at all without naming the decree that set it.

The market

Why Uzbekistan, and why this shape

Uzbekistan's financial infrastructure publishes more than most people use: the exchange posts its asking prices, the central bank its rates and gold prices, the disclosure portal its filings, the tax code its every article. What does not exist is the layer that joins them for a person or an institution: there is no e-filing API, no broker fill callback, no open-banking framework, and the instruments, share classes and statutory parameters are local in ways imported software gets wrong.

That gap is the company. Everything hard about this market (the notation on an official document, the decree behind a statutory number, a venue that admits an execution in exactly one place) is work a generic platform will not do and a local one must. The limits chapter below names each of those constraints and what we built against it, because how a platform handles what it cannot know is the product.

We publish no market-size estimate here. A TAM slide is a claim about other people's money; this register confines itself to claims about our own work.

The proof

One order nobody typed

On 06.08.2026 a take-profit rule, row 21 in our own stop-loss table, was armed and then left alone. Five days later, on 11.08.2026 at 13:26:00 Tashkent time, the monitor saw the target trade with real executed size and fired it. Nine seconds after that, at 13:26:09, the order was at the exchange and the broker had returned its own order id 1829 (11.08.2026).

The rule placed a real sell order, 6 171 148 shares of UZNF at 5,55 UZS, which is 34 249 871,40 UZS at that limit, with nobody watching. The two halves are not a coincidence of timing: rule 21 stores placed_order_id = 53, a foreign key to brokerage order #53. Both rows are quoted below with the query that returns them.

We stop the sentence there on purpose. There is no fill callback from this broker, no push of any kind, and the single place it ever admits that an order executed is its own live order list. On 23.08.2026 we built the reader for exactly that list; it copies the broker's executed quantity and average price onto the order and writes nothing else. It also does not backfill: an order the broker has stopped listing keeps a genuinely unknown fill state rather than a flattering one. That rule is why the order above is still not called a fill (the reader post-dates it) and why 0 orders on this platform carry an observed execution today. “Accepted and resting at the exchange” remains the strongest thing we can honestly say about any order sent through this broker, this one included.

Orders that reached the broker, of 44 recorded
33
Accepted, each with the broker's own order id
12
Rejected: 21 by the broker, 9 by our own pre-flight
30

The whole ledger, because a partial one is worse than none. 44 order rows exist all-time. 33 of them left this platform and reached the broker; 9 never did, because our own pre-flight refused them first (a closed market, not enough order-available cash, an instrument we could not label, or a limit price already outside the published band); and 2 were cancelled before submission. We count those 9 as ours, not as broker traffic, because they are.

Of the broker's 21 refusals we keep the broker's own message word-for-word on 18 of them and append a short plain-language hint that is plainly ours, not the broker's; the remaining 3 arrived with no usable text at all and fall back to our own generic sentence rather than to a reason the broker never gave. We rewrite nothing and delete nothing. A platform that hides its refusals cannot be audited.

5 of all those rejections were our own defect: a decimal-padding bug in the order payload, one refusal on 24 July 2026 and four on 27 July, root-caused and fixed on 27.07.2026 and none since. July produced 21 rejections in all; the other 16 that month, and every rejection after it, are ordinary market refusals, 9 of them on 04.08.2026, where the limit price sat outside the exchange's band for that day. (measured 23.08.2026 against brokerage order #53; pg: select count(*) from brokerage_orders where submitted_at is not null or error like 'Broker rejected:%' or error = 'The broker rejected the order. Check the price, quantity and account balance.'.)

pg: select * from stop_loss_orders where id = 21 (kind target, status executed, UZNF)
pg: select * from brokerage_orders where id = 53
pg: select round(quantity * limit_price, 2) from brokerage_orders where id = 53

What is built

Every feature, read from the catalogue

This grid is generated from the production feature catalogue at request time, the same catalogue the in-app pricing page and the billing system read. It is not a slide, and nothing can appear here that a user cannot buy.

Personal Finance

13 features

A double-entry ledger under the whole household: holdings and imported broker statements book into it, budgets and spending analytics read out of it, and the local shapes, the family budget and the gap (rotating savings circle), are first-class objects, not skins on a generic app.

Portfolio & Holdings1 000,00 UZS/moLive Portfolio Snapshot1 000,00 UZS/moStatement Import1 000,00 UZS/moPersonal Accounting1 000,00 UZS/moBudgeting1 000,00 UZS/moSpending Analytics1 000,00 UZS/moBill & Subscription Reminders1 000,00 UZS/moDebt Payoff Planner1 000,00 UZS/moCard & Account Vault1 000,00 UZS/moFamily Budget1 000,00 UZS/moSavings Circle1 000,00 UZS/moSavings Goals1 000,00 UZS/moReports & Export1 000,00 UZS/mo

Wealth & Retirement

9 features

The long-horizon half. Returns deflated by the real published CPI rather than an assumed rate; volatility, VaR and drawdown in Decimal; look-through exposure that sees the issuers inside your funds; both statutory pension projections resolved from cited decrees; zakat against a nisab built from the real gold spot. A figure the data cannot support comes back null with its reason, never as a comforting number.

Tax Reporting1 000,00 UZS/moReal Returns1 000,00 UZS/moPortfolio Risk1 000,00 UZS/moPortfolio X-ray1 000,00 UZS/moCredit Score & History1 000,00 UZS/moPension Tracker1 000,00 UZS/moFIRE / Retirement Projection1 000,00 UZS/moZakat Calculator1 000,00 UZS/moIslamic Finance & Halal Screening1 000,00 UZS/mo

Markets & Data

16 features

The warehouse and everything that reads it: prices, the sovereign yield curve, issuer disclosures, corporate actions, macro series, the index and the screener. Every row traces to a named upstream or is not there at all.

Market Data1 000,00 UZS/moBonds (UZSE)1 000,00 UZS/moYield Curve1 000,00 UZS/moExchange (UZCE) & Debt Market1 000,00 UZS/moCompany Profiles1 000,00 UZS/moDisclosures Feed1 000,00 UZS/moMacroeconomic Dashboard1 000,00 UZS/moInterbank Rates1 000,00 UZS/moDividends & Coupons1 000,00 UZS/moInvestor Calendar1 000,00 UZS/moAdvanced Charts1 000,00 UZS/moWatchlists1 000,00 UZS/moPrice Alerts1 000,00 UZS/moUCI Index1 000,00 UZS/moMarket Analytics1 000,00 UZS/moStock Screener1 000,00 UZS/mo

Commodities & Real Assets

4 features

Gold at the central bank's own published bar prices, UZEX commodity trading, and real-estate reference data.

Gold (CBU)1 000,00 UZS/moGlobal Commodities1 000,00 UZS/moUZEX Commodities1 000,00 UZS/moReal Estate1 000,00 UZS/mo

Global & Crypto

3 features

Outside the country: US equities and crypto quotes, plus the connection layer for foreign exchanges and brokers.

Wall Street1 000,00 UZS/moCrypto Markets1 000,00 UZS/moExchange & Broker Connections1 000,00 UZS/mo

Trading & Automation

8 features

Everything that can move real money, all of it through one validated order seam: broker sync, live tickets, protective brackets, the AI lab, copy trading and algo trading. Autopilot ships inside Algo Trading: one entitlement, not a second SKU.

Brokerage Sync1 000,00 UZS/moLive Trading1 000,00 UZS/moStop-Loss & Take-Profit Orders1 000,00 UZS/moAI Trading Lab1 000,00 UZS/moCopy Trading & Top Traders1 000,00 UZS/moAlgo Trading & Autopilot1 000,00 UZS/moFund Baskets1 000,00 UZS/moBroker Statements1 000,00 UZS/mo

Research & Analysis

5 features

Valuations, predictions and company analysis. Where a ratio cannot be computed it is emitted as null with the reason recorded, per instrument and per ratio, rather than as a plausible multiple.

Company Valuations1 000,00 UZS/moPrice Projections1 000,00 UZS/moStock vs Bond Comparison1 000,00 UZS/moStock & Cross-Asset Comparison1 000,00 UZS/moCompany Analysis1 000,00 UZS/mo

Rates & Comparisons

7 features

The comparisons households actually shop on (deposits, loans, cards, insurance and commercial FX) across the licensed local providers, from their own published terms. Under the same heading, where those banks physically are: 6,600+ ATMs, branches and currency-exchange offices from the Central Bank's own register, every one geocoded, so a rate comparison ends at an address you can walk to rather than a number on a page.

Commercial FX Rates1 000,00 UZS/moFX Best Rate1 000,00 UZS/moDeposits Comparison1 000,00 UZS/moLoans Comparison1 000,00 UZS/moCards Comparison1 000,00 UZS/moInsurance Comparison1 000,00 UZS/moBank Network Map1 000,00 UZS/mo

Advisory & Assurance

6 features

Advisory surfaces and the assistant, which proposes and then waits: nothing it suggests acts until the user explicitly approves it. Alongside them, auditing and compliance workspaces, for the users who have to prove something to somebody.

Investment Advisory1 000,00 UZS/moFinancial Advisory1 000,00 UZS/moTax Minimization & Advisory1 000,00 UZS/moAI Assistant1 000,00 UZS/moPortfolio Audit1 000,00 UZS/moCompliance1 000,00 UZS/mo

Learn

4 features

Tutorials, progress streaks, and a beginner simulator that fills against real last prices while being wired to no broker at all.

Tutorials & Courses1 000,00 UZS/moBeginner Simulator1 000,00 UZS/moMoney Rules Cheatsheet1 000,00 UZS/moMilestones & Streaks1 000,00 UZS/mo

Prices as returned by the catalogue API when this page rendered. They are set by a platform administrator and take effect on this page's next render, which is why the figure above is a current price and not a permanent one. Full descriptions are on the landing page.

Under the hood

What the code actually does

Each claim below is written against the code as it runs today. No roadmap items appear on this page.

Brokerage integration at the protocol level

Finmind speaks the UZSE broker terminal protocol (fondbozori.uz) natively, not as a screen-scrape, and live order placement works: 12 of our orders have been accepted by the broker and carry its own order id.

  • The login cryptography is locked to test vectors byte-for-byte (SHA-1 → base64 → nonce → MD5 → base64), asserted by both the Python client's tests and the Go client's.
  • The sync client is data-inquiry only, and that is enforced by a test that greps the module for order-path tokens, not merely by intention.
  • Read-only sync of cash and holdings with freshness tracking, so a user sees exactly when their snapshot was taken.
  • An execution can be recorded at all only by asking the broker: a reconciliation sweep reads its own live order list and copies the executed quantity it reports, never infers one. A partial stays open, a zero is not an observation, a shrinking figure is an anomaly rather than an update, and nothing is backfilled. So 0 orders here carry an observed execution today, which the limits below state in full.
  • Broker statements can also be imported from files, so a portfolio never depends on a live connection.

Market data that is sourced, cached and honest

Every price traces to a named source: the exchange, the central bank, the state disclosure portal. Or it is null.

  • The live order book comes from the exchange's own published asking-prices file: one fetch covers the whole market, cached for seconds and shared across all users, with a last-good snapshot for upstream hiccups.
  • A non-positive price is dropped, not displayed: an empty side of the book is honest, a fabricated zero is not.
  • Issuer profiles, disclosures and corporate actions from openinfo.uz; official rates and gold-bar prices from cbu.uz; consumer prices from narxtahlil.uz; global markets and crypto from Yahoo Finance and CoinGecko.
  • Valuation ratios that cannot be computed are emitted as null with the reason recorded, per instrument, per ratio.

An assistant that asks permission

The AI assistant answers questions about the user's own portfolio, and when asked to act it proposes an action that does nothing until the user explicitly approves it.

  • An approved action executes through the same validated order path as a manual order: same gates, same audit trail, same dry-run rules.
  • Rejecting a proposal cancels it; there is no path from chat to execution that skips approval.
  • From Telegram the assistant answers but cannot trade: the proposed action is discarded before it leaves the bridge and the execution module is never even imported.
  • Statistical projections ship with the warning attached to every response: an estimate of past price behaviour, not advice and not a promise.

A religious decision we refuse to guess at

Shari'a screening to AAOIFI Standard 21 and Meezan Bank's criteria: one decisive business screen plus 7 financial ratios, across all 106 listed tickers on the exchange. 106 of 106 carry a curated sector ruling, so the business screen is never skipped for want of one. We ran it across the whole exchange, and this is what came back.

  • 13 tickers permissible, 84 impermissible, 9 undetermined with a machine-readable reason (9 = 4 interim-only filings + 4 unusable filings + 1 unclassified business). The market is dominated by conventional banks and insurers, and no ratio rescues a business that is impermissible in itself.
  • Sector classification is curated by hand for 89 issuers against each one's officially stated activity, not inferred from its name.
  • “Debt” means real interest-bearing borrowing, read from the NSBU Form-1 line items. Not total liabilities, which would sweep in trade payables and wrongly fail a debt-free company.
  • No Uzbek issuer discloses its non-compliant income, so the 5% purity screen is ALWAYS reported unavailable: every one of those 13 passes is “halal subject to income purity” at medium confidence, never a confident halal.
  • A screen we cannot compute is reported as unavailable with its reason, and never silently skipped to reach a verdict.

The wealth side, held to the same rule

The honesty discipline is not confined to the order path. The clearest proof is the insurance needs-analysis engine: it joins income (the employer-certificate accruals on tax schedule 2.1), outstanding debt balances, household dependants, short-term liquid assets from the accounting ledger and the user's own savings goals. When an input is missing it returns “cannot assess” with the missing list, never a need of zero.

  • Every multiplier in that engine is labelled a named industry convention and explicitly not Uzbek law, is surfaced in the response and can be overridden per call. Amounts in another currency convert at the latest central-bank rate or are excluded and reported, never summed at face value.
  • Real returns deflate nominal so'm with the actual published CPI series, chained month by month into a price level. A date the series does not cover degrades to null with the exact period used disclosed. It never invents an index.
  • Portfolio risk is annualized volatility, historical AND parametric VaR, maximum drawdown, beta against a UZSE benchmark and HHI concentration, the statistics computed in Decimal, not float, and nothing persisted.
  • Portfolio X-ray looks through fund holdings to the underlying issuers by each fund's active constituent weights, and rolls both share classes of one issuer together by ISIN rather than by ticker suffix.
  • Both statutory pension projections resolve every input from the cited-parameter table or the primary text of the pension law; an unconfigured parameter yields null with a stated reason. Zakat's nisab is built from the real gold spot and the real USD rate, or it is null.

Security posture, including the boring parts

The controls an institutional reader probes for, stated plainly.

  • Brokerage credentials are Fernet-encrypted with a key that exists only in the environment: no default key, no per-process fallback. If the key is missing, every encrypt and decrypt raises. We refuse rather than persist plaintext.
  • Optional Telegram two-factor login can only be enabled after a live code was actually delivered and verified, so nobody's account can become gated on an undeliverable code. Codes are hashed, expiring, attempt-capped and single-use.
  • Two-factor is core security and is deliberately not a paid feature. It is sold to nobody.
  • Anything secret-like is masked by default and revealed per item behind an eye icon; list views render only the masked shape.

Built for Uzbekistan, not localized to it

The hard, local problems are the moat: the tax code, the exchange's actual publishing habits, the instruments people here actually hold.

  • Savings circles and family budgets, how households here actually save, as first-class features rather than skins.
  • Deposit, loan, card and insurance comparison across local banks and insurers, with the state insurance register handled honestly (see the limits below).
  • UZS as exact tiyin arithmetic, local number notation on official documents, share classes modelled explicitly rather than guessed from a ticker suffix.
  • Uzbek apostrophe forms are normalised before any name match, so “O‘zbekiston” and “O'zbekiston” are one issuer and not two.

Automation

6 ways to trade, one door

Every engine below places its orders through the same validated seam as a hand-typed ticket: same checks, same audit trail, same dry-run rules. Here is what each one does, in one line.

Manual ticket

A human types an order; it is validated, priced against a live reference and either dry-run or sent.

Protective brackets

Standing stop-loss and take-profit rules our own monitor evaluates. The broker's order form has no stop field, so these are synthetic (see the limits).

Stop-loss
If the market trades at or below the stop with real executed size, place a plain limit sell for the live-sellable quantity.
Take-profit
The mirror image on the upside: the rule that produced the sale described above.

Signal algorithms

Four textbook signals plus a scheduler, each evaluated on a beat and each writing its reasoning to an audit row.

MA crossover
Buy when the fast moving average crosses above the slow one; sell on the opposite cross.
Momentum
Act when the N-day return passes a threshold the owner set.
Mean reversion
Act on the z-score of price against its own rolling mean.
DCA
A scheduled fixed-amount buy on an interval, regardless of signal.
TWAP scheduler
Slice one parent quantity into timed child orders instead of hitting a thin book at once.

AI Trading Lab

A model-driven strategy that may suggest, paper-trade or trade live, and a live order passes 10 checks, in order, before it exists.

The gate
Global switch, live mode, armed and not killed, broker live switch, symbol allowlist, Shari'a screen, position cap, daily loss limit, daily trade count, then full order validation.

Copy trading

Mirror another trader's orders sized as a percentage of your own portfolio, never raw share counts.

Sizing
The leader's trade is converted to a share of their portfolio, then re-applied to yours and capped per position.
Identity
Leaders appear under an alias, never an email; consent to be copyable is on by default and switched off in settings.

Autopilot

Three standing plans the owner specified, each a draft until armed and each fill-gated rather than optimistic.

Recurring buy
Spend a fixed SUM on an interval, but only after the previous order actually reached a filled state; an unknown fill waits rather than stacking buys.
Standing entry
Wait for a stock you do not hold to trade inside your price range, then buy from a fixed budget, never above your maximum.
Average down
When price falls a step below your average cost, buy a tranche that is re-verified to lower the blended average before it goes out; equal-to-average never fires.

Usage, stated exactly. 9 protective rules have run to a conclusion in the development database: 3 triggered on real executed size and placed their order (one of them is the order above) and 6 were cancelled by their owner before they ever fired. 0 are armed today, and 0 autopilot plans have ever been created here at all. We would rather decompose the count than let a total imply live cover that is not there (measured 23.08.2026; pg: select status, count(*) from stop_loss_orders → cancelled 6, executed 3).

Autopilot is one of the 6 engines but is not a separate row in the catalogue above: it ships inside Algo Trading and is gated by that one entitlement. One purchase, not a second SKU.

Money safety

What stands between an algorithm and your money

Automation that can spend real money is a liability question before it is a feature. These are the controls, not a philosophy.

Two switches, or it is a paper trade
An order reaches the broker only when the platform-wide live switch AND that user's own live-trading opt-in are both on. Either one off and the order is persisted as a dry run and the broker is never contacted. Both default to off.
Draft until armed
Every automated rule (bracket, algorithm, AI strategy, copy follow, autopilot plan) is created inert. It is evaluated only after its owner explicitly arms it, and pausing is one click.
Kill switches above the strategies
A global setting stops the AI engine, another stops the autopilot sweep, another stops the Telegram bridge, independently of what any user has armed. A single strategy can also be killed on its own.
Caps re-derived, never counted
The autopilot's per-run, per-plan-per-day, per-user-per-day and total-budget caps are recomputed from its own run audit on every evaluation rather than kept as a counter that can drift; the AI lab enforces a position-size cap, a daily loss limit and a daily trade count the same way. A figure that cannot be established blocks the run. It never defaults to zero.
At most once per slot
Concurrent workers claim an evaluation through a unique constraint (autopilot) or an atomic status change (stop-loss), so two beats firing together can never double-buy or double-sell.
Pre-trade validation, every path
One validator guards manual and automated orders alike: the security must be listed with a real ISIN, a reference price must exist, quantity must be positive, a sell can never exceed the sellable quantity, and a limit outside the exchange's published band is refused.
Confirmation before anything acts
The assistant proposes; the user approves. A proposal that is not approved does nothing, and there is no path from a chat message, in the app or on Telegram, to an order.
Anything that can act is audited
Strategy evaluations, mirrored trades, assistant actions, autopilot runs and broker rejections are written down with their reasons and are reviewable after the fact. A rejection pauses the plan that caused it instead of retrying money into a failing pipe.

Tax and compliance

A real tax engine, down to the form

Finmind computes Uzbekistan's annual personal income-tax declaration (form 172) from the user's own ledger: the page-1 identity block, all 10 page-2 income schedules and the 12 computation rows of page 3.

The document itself

  • Exports to PDF, XLSX, DOCX and JSON.
  • In the notation the authority itself uses: 4 734 047,14 and 01.04.2026, not US formatting.
  • It refuses to render at all without a font that can draw Uzbek and Cyrillic glyphs: a silently corrupted tax document is worse than a failed download.
  • A value the engine does not know renders as “—”, never as a zero, and the warning explaining why travels inside the exported document.

Cited, line by line

  • Computed rows carry their Tax Code article basis, verified against the Code's own text, including the exchange-traded securities exemption most generic tools miss (worked through below).
  • A citation that turned out to be wrong is corrected in the code and the correction is recorded; we do not quietly re-point a footnote.
  • Where the law is genuinely unsettled for a case, the row says pending rather than picking the answer that flatters the taxpayer.

Statutory parameters

Minimum wage, BHM, the pension base and the INPS rate are effective-dated named parameters: 12 rows spanning 01.01.2019 to 01.09.2026, each citing the decree that set it (PP-4086, PF-196, PF-108, PF-91, PF-115).

One of those rows exists because an operator-supplied placeholder was ten times too low; it was superseded by the decree amount and the row records that it was. The citation is not a convention. The database refuses an uncited parameter through chk_statparam_source_ref_present.

measured 23.08.2026 · pg: select count(*) from tax_statutory_parameters; select distinct source_ref from tax_statutory_parameters → PP-4086, PF-196, PF-108, PF-91, PF-115

What that one citation is worth, worked through

A generic engine treats a securities gain as ordinary income at the general rate. The Code does not: a gain on emission securities realised on the stock exchange is exempt outright. On a hypothetical 1 000 000,00 UZS of gain on UZSE-traded shares:

120 000,00

what a 12% engine charges

Tax Code Art. 381 §1, cited in backend/apps/tax/form172.py:491 basis="Art. 375 item 9 with Arts. 327-329; Art. 381 §1 (12%)"

0,00

what the Code actually charges

Tax Code Art. 378 item 7, 2nd indent; from 17.04.2025 Art. 327 §17 (O'RQ-1057); backend/apps/tax/form172.py:492-498 relief_basis on schedule row 8

120 000,00

the difference, per million of gain

arithmetic performed in this page, in exact minor units, on the two rates cited beside it. Not a measurement and not anyone's actual saving.

What remains is not a tax and we do not net it against the figures above, because it has a different base: a fee of 0.01% that the SELLER pays on the TRANSACTION value of an exchange trade in emission securities. The issuer is excluded, and the Code never calls it a trading tax (Tax Code Art. 327 §16; backend/apps/tax/form172.py:500-505 note (0.01% on exchange trades, 0.3% organised off-exchange)). A worked example is not advice, and the declaration the engine produces states its basis on every row.

Provenance

26 doors, and which ones are open

Every upstream the platform touches lives in one registry with an evidence rule: an integration may be marked live only when a named code path talks to it AND we have observed the data it wrote, with a row count and a date. Here is the whole board, including the ones we cannot open.

11live8partial4designed3blockedsnapshot of the registry, 23.08.2026

Live(11)

a named code path talks to it and we have observed the data it wrote

Central Bank of Uzbekistan (cbu.uz)

Official UZS FX rates, policy rate, gold-bar prices, bank registry and the sovereign yield curve.

CoinGecko crypto prices (api.coingecko.com)

Crypto asset prices and market caps for the global-markets crypto strip.

Gold spot feeds (gold-api.com, Yahoo GC=F)

International gold spot price (XAU/USD) for the gold page and real-return math.

Narx-Tahlil price monitor (narxtahlil.uz)

Official consumer product price statistics for the cost-of-living view.

OpenInfo corporate disclosure portal (openinfo.uz)

Issuer disclosures, daily equity OHLCV bars, issuer fundamentals and the day-aggregate screener behind live quotes.

State Statistics Committee SIAT (stat.uz)

Official macro indicators (CPI, GDP and friends) for the macro dashboard.

Central Securities Depository (uzcsd.uz)

Corporate actions (dividends, meetings) from the depository's public register.

Uzbek Commodity Exchange (uzex.uz)

Commodity trade register and weekly exchange quotes for the commodities view.

Uzbek Republican Currency Exchange (uzrvb.uz)

Weighted FX rates and volumes, the interbank/repo money-market curve and government-bond auctions.

Tashkent Stock Exchange (uzse.uz)

Real-time trade tape, authoritative share registry (shares outstanding/par) and bond listings.

Yahoo Finance quotes (query1.finance.yahoo.com)

Global market quotes (US indices, big tickers) for the world-markets strip.

Partial(8)

it works, but only for part of what the upstream could give us

Fondbozori WTS brokerage terminal (fondbozori.uz)

Read-only brokerage account sync (cash, securities, statements) and live order routing to UZSE.

What it is waiting on: Every endpoint sits behind the terminal login; there is no public API. Account sync and order entry work. The venue pushes no fill confirmation; the only evidence of an execution is its own order list, which we now reconcile against; nothing has been observed through it yet.

Telegram Bot API (api.telegram.org)

Price alerts and notifications, two-factor codes, and the chat bridge.

What it is waiting on: Bot token in hand; notifications and the chat bridge run. The bridge deliberately cannot place an order.

Uzbek commercial banks (rate aggregators)

Deposit, loan and card rates across Uzbek banks for the comparison tables.

What it is waiting on: Rates only, via public aggregators. A direct bank connection would need a per-bank agreement; we hold none.

Uzbek bank deposit catalogue (official sites)

Deposit products read from each bank's own pages, with the terms that decide whether one is good: minimum, capitalisation, replenishment and the early-withdrawal penalty.

What it is waiting on: Read from each bank's own site, so coverage is whatever they publish: five of the 35 CBU-registered banks expose parseable deposit terms today. There is no bank API and no open-banking framework in Uzbekistan to ask for more.

Uzbek bank loan catalogue (official sites)

Loan products with the bank's own nominal and effective rates, term and amount ranges, collateral and subsidy conditions, never a rate we computed ourselves.

What it is waiting on: Five banks publish parseable loan terms out of 35 registered. We store the bank's own effective rate and never compute one to fill the gap, so a bank that publishes only a nominal rate stays partial.

Uzbek bank card catalogue (official sites)

Cards banks sell: categories, payment networks, fees and the perks exactly as each bank states them.

What it is waiting on: Three banks publish a parseable card tariff table. None of those pages prints its own updated-on date, so rows are stamped with the fetch time and say so rather than implying the bank confirmed them today.

National open-data portal (data.egov.uz)

Public state registers of licensed financial institutions: the MFO/bank-office directory, microcredit organisations, pawnshops, payment organisations and operators, e-money systems, bank auditors and the geocoded ATM register.

What it is waiting on: Read-only and GET-only, and the two registers we most want, licensed insurers and securities issuers, provably are not published there. The insurer list is served from a different upstream and labelled as such rather than borrowing this one's credibility.

NAPP e-OSGO / ERSP insurance register (e-osgo.uz, ersp.e-osgo.uz)

Two halves. Working: the public ERSP participant roster, the only machine-readable list of Uzbek insurers reachable without a contract. Blocked: per-policy OSGO verification against the state register, which would replace trusting user-typed policy data.

What it is waiting on: The participant roster is reachable and parsed. Per-policy verification is not: it needs an accredited-consumer agreement with the regulator plus an E-IMZO credential, and the public policy register is captcha-gated, which is why the insurance checker records rather than verifies.

Designed(4)

researched and specified; nothing is talking to it yet

Ministry of Employment services (mehnat.uz)

Employment records for income verification and tax pre-fill.

What it is waiting on: Reachability research still open.

Unified government services portal (my.gov.uz)

Government e-services relevant to personal finance, surfaced in-platform.

What it is waiting on: Reachability research still open.

Tax committee taxpayer cabinet (my.soliq.uz)

Pull the taxpayer's own income and withholding data to pre-fill the form-172 declaration we already generate offline.

What it is waiting on: Needs a per-taxpayer OAuth session signed with E-IMZO, or a Soliq-servis agreement. Neither is something we can write our way into.

State pension system (Extrabudgetary Pension Fund)

Pull real accumulative-pension balances instead of manual entry.

What it is waiting on: Reachability research still open; we have not claimed a route we have not found.

Blocked(3)

an external gate we cannot open by writing code

KATM credit bureau (infokredit.uz)

Credit score, the bureau's own scoring class and contract history, read from the report the subject downloads themselves.

What it is waiting on: Credit bureau. No consent-free API exists: a report is released only to the subject, or to a contracted member with consent, under Law O'RQ-301. Until membership, the product reads the report the subject downloads from my.gov.uz, in their own browser.

OneID national SSO (id.egov.uz)

National single sign-on returning verified PINFL, INN/STIR and passport data: no manual identity entry.

What it is waiting on: National SSO. Requires a registered client under a paid contract with the state operator, free only for state bodies.

Paynet Xolis (QR payments)

Accept feature payments by QR and confirm them automatically.

What it is waiting on: Xolis itself publishes no developer API or callback at all. The operator protocols that ARE published are already implemented here, and none is switched on, because the merchant credential only exists after a signed agreement this project does not hold. Each adapter reports itself unconfigured and its callback answers 503 rather than confirming a payment.

Signed in, this board is read live from the platform's own registry endpoint. Signed out, it is the snapshot of 23.08.2026: a front-end test asserts that snapshot still matches the backend registry file, so it cannot quietly drift out of date.

Due diligence, pre-answered

Limits we state plainly

You would find these in diligence anyway. We would rather you hear them from us, because how a platform handles what it does not know is the product.

  1. 01

    The broker never tells us an order filled, so we ask, and we never assume

    There is no fill callback here and no push of any kind. The one place this venue admits an execution is its own live order list, whose rows carry an executed quantity and an average price, and reading that list is the ONLY way a fill is ever written on this platform: a sweep and an on-demand endpoint copy what the broker says onto the order and write nothing else. The rules are deliberately unflattering. A partial stays “submitted”, because the rest is still working and still cancellable; a zero is never written as an observation; an order the broker stops listing is left alone, because absence is not evidence of a fill; a figure smaller than one already seen is reported as an anomaly instead of applied, since a fill cannot un-happen; and there is no backfill at all. That last rule is why the autonomous order above is still not called a fill (the reader was built after it) and why 0 orders here carry an observed execution today. Anything that depends on a fill, the recurring-buy plan for instance, reports “fill unknown” and waits rather than stacking real money on an order that may never have executed.

  2. 02

    Our stop-losses live on our servers, not the exchange's

    The broker's verified order form has no stop-trigger field (the gateway raises if you try), so a stop is a rule our own monitor evaluates before placing a plain limit sell. The exchange never held it. If our monitor is down, the stop does not fire. We would rather you knew that from us than discovered it on a bad day.

  3. 03

    We built the 10-rung order book; the venue serves an empty one

    The depth wiring speaks the terminal's exact call and the panel renders up to 10 rungs, but every call to that endpoint has come back empty with zeros. And every one of those calls, all of them, was placed outside trading hours. The in-session probe is still owed and we will not pretend otherwise. The one real live book is the exchange's public asking-prices file, the whole market in a single fetch, cached for seconds and shared across users, and that is what the panel honestly renders. If the in-session probe is also empty, the remaining step is a market-data entitlement request to the broker rather than code; until it runs, that is a hypothesis, not a fact about the venue.

  4. 04

    We take payment by hand, on purpose (for now)

    The code for automatic collection exists: 3 operator protocols are implemented against their published specifications (Paynet UWS, CLICK's shop API and the Payme merchant JSON-RPC). 0 of them are switched on. What no operator hands out without a signed merchant agreement is the credential, so each adapter reports itself unconfigured and names the settings it lacks, and their callback endpoint answers 503 rather than pretending to confirm a payment. Xolis, the QR product people here actually use, publishes no developer API at all. So a purchase is a server-priced request, a reference QR that is explicitly ours and not provider-signed, an out-of-band payment, and a human approval that creates the time-boxed grant. It does not scale to a hundred thousand users and we know it: the code is written, the agreements are not.

  5. 05

    Copy trading is opt-out, not opt-in

    A user's profile allows their trades to be mirrored by default (the leaderboard would be empty otherwise), under an alias, never an email, and the switch is in settings. We would rather volunteer that here than have a privacy reviewer find it.

  6. 06

    The insurance register has a captcha, so we record, not verify

    The state register of compulsory insurance policies, ersp.e-osgo.uz, requires a captcha and offers no API. We record what the policyholder saw and link to the authoritative register; we do not claim an automated verification we cannot perform. What we did build behind that limit is an import keyed on the register's OWN identity, the series and number it prints (e.g. EUID 0386126): pasting the same block twice updates one policy instead of minting a second, a legacy row still matches by its alphanumeric-reduced policy number, the fields the register does not know (surrender value, beneficiary, private notes) are never touched, the premium is never silently rewritten, and every field the paste does change is reported back with its old and new value.

  7. 07

    There is no e-filing API, so the taxpayer files

    The taxpayer cabinet offers no public API for submitting the declaration. Finmind computes and renders the exact document, in the authority's own notation, and the taxpayer files it. We will not pretend to a submission channel that does not exist.

  8. 08

    Some statutory numbers are unknowable right now, so we say “pending”

    Several caps in the tax code are multiples of decree-set amounts that are not always published in advance. When a decree is missing, the affected rows render as pending with an explanation. A declaration that quietly guessed would be worse than one that waits.

  9. 09

    The deterministic parser is proven; the language model is not

    The assistant understands money instructions through a deterministic intent parser that runs FIRST and handles everything it recognises: holdings, net worth, prices, orders, standing plans. The language model only sees what that parser did not understand, anything it proposes is rebuilt by the same proposal builders and still requires the user's explicit approval and the same order validation, so no order-safety property depends on the model. What we have not done is prove the model half end to end: the API key in the container has never been probed live, and if the provider rejects it the assistant falls back to the parser silently. We would rather tell you that than let you assume an LLM you have not seen work.

  10. 10

    We have no traction metrics to show you, so this page shows none

    No user counts, no AUM, no revenue claims, no testimonials, no logos. What we can demonstrate is the running system itself, every feature in the catalogue above, driven live, with its own gaps named as we reach them. We would rather earn the other numbers than assert them.

How it is built

House rules, enforced in code

These are not aspirations. They are constraints the codebase holds today, several of them at the database level.

Money is exact, end to end
NUMERIC(38,2) in the database (146 columns of it), decimal strings on the wire, BigInt minor-unit arithmetic in the browser. And the rule is checkable in one query rather than taken on trust: the schema contains 0 double-precision or real columns, anywhere, of any kind.
null is not zero
An unknown value is null with a machine-readable reason and renders as “n/a”. Zero is a claim; we only make it when a source did.
Every row has an owner
Portfolio, orders, messages, declarations: owner-scoped at the query level. One user's data is structurally invisible to another.
Gating is server-side
Feature entitlements are enforced as API permissions on the backend, not as hidden buttons in the interface.
Cited, or it does not save
A statutory parameter without a source reference cannot exist: chk_statparam_source_ref_present is a database CHECK constraint, not a code convention or a review habit.
Refuse rather than corrupt
The declaration PDF will not render at all without a font that can draw Uzbek and Cyrillic glyphs. A silently corrupted tax document is worse than a failed download.

Business model

Pay per feature, priced per market

No subscription tiers. Every feature is purchased individually and time-boxed, monthly or annual.

A user buys exactly the features they need (a pensioner tracking deposits pays for different things than a day trader) and every entitlement is time-boxed, granted explicitly, and enforced as a server-side permission rather than a hidden button.

Current price per feature

1 000,00 UZS / month

10 000,00 UZS / year

Read from the catalogue API as this page rendered. It is an introductory, market-entry price: set by a platform administrator, changeable from the admin surface at any time, and reflected here on the next render. It is not a unit-economics claim, and no revenue figure appears on this page because there is none to report.

See the full catalogue

How we actually take the money

Four steps, and the honest reason the third one is manual.

  1. 1 · Priced on the server. The amount comes from the catalogue row, not from the browser. A client never prices its own purchase.
  2. 2 · A reference QR. It carries our own payment reference and amount. It is explicitly not a provider-signed payload, and the API says so on every payment.
  3. 3 · Paid out of band, approved by a human. A sysadmin checks the money actually arrived; that approval, and nothing else, creates the time-boxed entitlement.
  4. 4 · Append-only afterwards. Every state change appends an event, and there is no delete endpoint: a payment row cannot be removed, only superseded.

Why manual, exactly: the QR product people here actually use publishes no developer API or callback at all. The two operators that do publish a merchant protocol are already implemented (3 adapters in all, written against their own specifications) and 0 of them are switched on, because the credential is the part that only exists after a signed agreement. Each one reports itself unconfigured and names the settings it is missing, and the callback endpoint answers 503 instead of confirming a payment nobody verified. The day an agreement is signed, approval becomes automatic; until then we would rather approve by hand than claim a verification we cannot perform.

Evidence

How you can check us

None of these is a traction metric. They are the size and shape of the thing itself, and every one is reproducible in an afternoon with us in the room.

Published figures and how to reproduce them
FigureWhat it isHow to reproduce it
1 753+backend tests collected by pytest, and risingpytest --collect-only -q --ignore=apps/oneid → "1753 tests collected" on the measurement date (apps/oneid is a module still being wired up; its tests are EXCLUDED from this count rather than counted optimistically)
108+backend test files, and risingfind backend \( -name 'test_*.py' -o -name '*_test.py' \) | wc -l
38+front-end assertion suites run with node --test, and risingfind frontend -name '*.test.mjs' -not -path '*/node_modules/*' | wc -l
146NUMERIC(38,2) columns: the money scale, the most common numeric shape in the schemapg: select count(*) from information_schema.columns where table_schema='public' and data_type='numeric' and numeric_precision=38 and numeric_scale=2
0double precision or real columns in the entire schema: the “money is never a float” rule, stated as a fact about the database rather than as a coding habitpg: select count(*) from information_schema.columns where table_schema='public' and data_type in ('double precision','real')
0orders on this platform carry an execution observed from the broker: the reconciler writes only what the broker's own order list returns today and never backfills, so no order here has ever been called filledpg: select column_name from information_schema.columns where table_name='brokerage_orders' → the observed-fill columns (filled_quantity, avg_fill_price, fills_checked_at) arrive with backend/apps/brokerage/migrations/0004_order_observed_fills.py and are not in the development database yet, so no row can hold one; the only writer is backend/apps/brokerage/fills.py, whose NO BACKFILL rule leaves an order the broker no longer lists genuinely unknown
13listed tickers came back permissible, and every one of them is “halal subject to income purity” at medium confidence, because the purity screen cannot be run herepython manage.py shell -c "from apps.islamic.screening import screen_universe, screen_prices; rows, cov = screen_universe(prices=screen_prices()); print(cov['halal'], cov['haram'], cov['undetermined'])" → 13 84 9
84came back impermissible: the exchange is dominated by conventional banks and insurers, whose core business no ratio can rescuepython: screen_universe() coverage['haram'] (same command as halalPermissible)
9are reported undetermined with a machine-readable reason: 4 whose only filings cover an unfinished year, 4 whose filings yield no computable ratio, 1 whose issuer record stops at a risky sector with no sub-industry. None is guessed either waypython: screen_universe() coverage['reasons'] → {statements_interim: 4, statements_unusable: 4, business_unclassified: 1}
18 358daily price barspg: select count(*) from prices
5 920official currency ratespg: select count(*) from currency_rates
2 429sovereign yield-curve pointspg: select count(*) from yield_curve_points
552issuer disclosurespg: select count(*) from disclosures
546corporate actionspg: select count(*) from corporate_actions
154imported issuer financial reportspg: select count(*) from fundamentals_statement_report
141macro indicator seriespg: select count(*) from macro_indicator_series
110instruments: 106 stock rows and 4 bond rowspg: select type, count(*) from instruments group by type
67bond listingspg: select count(*) from bonds
35licensed banks from the central bank's registerpg: select count(*) from cbu_banks
51insurance products from 10 insurerspg: select count(*) from insurance_products
users, assets under management, revenue: there are none to report, so the cell is blank rather than absentnothing to run: the platform is pre-revenue and pre-launch

All measured 23.08.2026 against the running system. These counts move (the warehouse grows every day the schedulers run and the test count grows with every change), which is exactly why each one is stamped with a date and a command instead of being presented as timeless. A figure printed with a + is a floor: it was true on the measurement date and can only have grown since, so run the command beside it and expect to get more, never less. Backend tests: at least, measured 23.08.2026 · pytest --collect-only -q --ignore=apps/oneid → "1753 tests collected" on the measurement date (apps/oneid is a module still being wired up; its tests are EXCLUDED from this count rather than counted optimistically).

The raise

There is a live fundraise. This page states no terms.

Stage, amount, valuation and use of funds are conversations, not web copy: we would rather answer your questions directly than publish a number this register cannot bind to a source. What we bring to that conversation is everything above, driven live.

Ask for a walkthrough and we will drive the running system with you watching: the catalogue, the declaration export, the order ticket, and the rejected orders, which are the part that tells you whether the rest is real.

Contact details read from the platform's own public settings as this page rendered. Change them in the admin surface and they change here.

Blog

Latest from Finmind

News, guides and market commentary: investing, personal finance and Uzbekistan's capital markets. Written in the sysadmin console; published posts only.

29 Jul 2026 · Saidbek Rahimbekov

Stocks

Stock definition. Types of stocks

Read the full post

Heading 1

Heading 2

Stock

  • Common stock
  • Preferred stock

As Warren Buffet said,

Contact

Questions, feedback or a feature request. Your message reaches the team directly and we reply by email.

Your message goes straight to the Finmind team.