Developers
Finmind HTTP API
Everything the public market pages show is available as JSON at the same address, without a login. The rest of the API serves the signed-in platform and needs a Finmind account's token, or, for an organisation's own systems, an organisation API key. This page says what exists today, with the limits as configured; the OpenAPI schema is the reference.
Base URL https://finmind.uz. Schema version 0.1.0. Checked against production on 2026-09-26.
Without a login
Public endpoints
These answer any caller. They are cached on the server for ten minutes and sent with a public Cache-Control header, so a client may cache them too. When the source read fails they answer 503 with a Retry-After header rather than a stale or empty body.
| Path | Returns | Rate limit |
|---|---|---|
GET /api/v1/public/market/instruments/ | Every UZSE share and bond Finmind tracks: ticker, ISIN, name, sector, last stored close, change since the previous stored session and its trade date; as_of is the latest session in the data. | 600 per minute |
GET /api/v1/public/market/stocks/<TICKER>/ | One share: the last session (open, high, low, close, volume, trade date), a year of daily closes, reported fundamentals, the issuer, its latest disclosures and other share classes. | 600 per minute |
GET /api/v1/public/market/bonds/<ISIN>/ | One bond: face value, coupon, frequency, issue and maturity dates, placed count, the last session, the close history and the issuer's disclosures. | 600 per minute |
GET /api/v1/public/market/disclosures/ | The fifty newest issuer disclosures from openinfo.uz: ticker, issuer, title, category, publication time and the source link. | 600 per minute |
GET /api/v1/blog/posts/ | The published blog posts in English and Uzbek; one post at /api/v1/blog/posts/<slug>/. | none |
GET /api/v1/health/ | Liveness: database and cache checks and the API version. | none |
Money and prices are JSON strings holding exact decimals, never floats. A trade_date is the exchange session day the stored close belongs to; a change is measured against the previous stored session, which for a thin share may be weeks earlier. Disclosures carry published_at in UTC and published_date on the Tashkent calendar.
Try it
Three requests that work today
Each example was run against production on 2026-09-26; the output shown is abridged to the fields named.
Instrument index, with the latest session in the data
curl -s https://finmind.uz/api/v1/public/market/instruments/Output, abridged
{"as_of": "2026-09-25",
"stocks": [{"ticker": "AGBA", "isin": "UZ7001560000", "name": "Agrobank ATB",
"share_class": "common", "sector": "Financials",
"last": "589", "change_pct": "-0.17", "trade_date": "2026-09-25"}, ...],
"bonds": [{"isin": "UZ6057687AE6", "ticker": "BFMT2B5",
"coupon_rate_pct": "27", "maturity_date": "2028-01-20",
"currency": "UZS", "last": "123998", "trade_date": "2026-09-25"}, ...]}One share: the last session and a year of closes
curl -s https://finmind.uz/api/v1/public/market/stocks/AGBA/Output, abridged
{"kind": "stock", "ticker": "AGBA", "isin": "UZ7001560000", "name": "Agrobank ATB",
"currency": "UZS", "exchange": "UZSE",
"issuer": {"sector": "Financials", "sub_industry": "Diversified Banks", ...},
"quote": {"last": "589", "prev_close": "590", "change": "-1", "change_pct": "-0.17",
"open": "609", "high": "609", "low": "589", "volume": "28615",
"trade_date": "2026-09-25", "prev_trade_date": "2026-09-24"},
"history": [..., {"date": "2026-09-25", "close": "589"}],
"fundamentals": {...}, "disclosures": [...], "other_share_classes": [...]}One bond by ISIN
curl -s https://finmind.uz/api/v1/public/market/bonds/UZ6057687AE6/Output, abridged
{"kind": "bond", "isin": "UZ6057687AE6", "ticker": "BFMT2B5",
"issuer": "BIZNES FINANS MIKROMOLIYA TASHKILOTI MChJ",
"face_value": "100000", "coupon_rate_pct": "27", "coupon_frequency_per_year": 12,
"issue_date": "2026-01-28", "maturity_date": "2028-01-20", "matured": false,
"quote": {"last": "123998", "prev_close": "120000", "change_pct": "3.33",
"trade_date": "2026-09-25", "prev_trade_date": "2026-09-24"},
"history": [...], "disclosures": [...]}Signed in
Authentication and entitlements
Every other endpoint needs a JSON Web Token obtained with a Finmind account's email and password. The token carries the person's own entitlements: an endpoint behind a paid feature answers 401 without a token and 403 with the code feature_locked when the Finmind account does not hold that feature. The free areas of the catalogue (the order book, learning) need only the token, and the tools of the Essentials plan, such as the portfolio, need that plan.
curl -s -X POST https://finmind.uz/api/v1/auth/token/ \
-H 'Content-Type: application/json' \
-d '{"email": "you@example.com", "password": "..."}'
# {"refresh": "...", "access": "..."}
curl -s https://finmind.uz/api/v1/portfolio/ \
-H 'Authorization: Bearer <access>'- Access token
- Valid 30 minutes. Sent as an Authorization: Bearer header.
- Refresh token
- Valid 7 days. POST it to /api/v1/auth/token/refresh/; each refresh returns a new pair and retires the old one.
- Two-factor Finmind accounts
- The first call answers twofa_required with a challenge instead of a token; the schema documents the second step.
- Sign out
- POST the refresh token to /api/v1/auth/logout/ to retire it.
For organisations
Organisation API keys
An organisation account (a fund, an insurer, a bank treasury) can give its own systems API keys. Owners and admins create them in the organisation's workspace, each with the scopes it needs, after confirming it is them. A key belongs to the organisation, not to a person, and it opens only that organisation's endpoints: never a person's own data, never another organisation's, never the members, keys or agreement.
curl -s https://finmind.uz/api/v1/orgs/<organisation>/market/instruments/ \
-H 'Authorization: Api-Key fm_org_<prefix>_<secret>'- Shown once
- The full key is shown once, when it is created. Finmind stores only a SHA-256 fingerprint of its secret and cannot show it again.
- Expiry
- 90 days unless chosen otherwise, 365 days at most. Up to 20 working keys per organisation.
- Rate limit
- 120 requests per minute for all of an organisation's keys together, and for each key, unless the contract says more; market data also keeps the public limit of 600 per minute, counted per organisation. A limited call answers 429 with a Retry-After header.
- When a key stops working
- Revoked, expired, the organisation suspended or closed, or its agreement no longer including API access: the answer is 401 with a code that says which. Revoked keys stay listed; nothing deletes one.
| Scope | Opens |
|---|---|
market:read | UZSE shares and bonds: the instrument index, one share, one bond. For the organisation's internal use, with the sources named in every answer./api/v1/orgs/<organisation>/market/instruments/ /api/v1/orgs/<organisation>/market/stocks/<TICKER>/ /api/v1/orgs/<organisation>/market/bonds/<ISIN>/ |
portfolios:read | The organisation's books: list, detail, valuation, stored valuations, allocation, holdings, transactions, deposits, manual instruments, price overrides, imports; and CSV or XLSX exports when the agreement includes data exports./api/v1/orgs/<organisation>/portfolios/ /api/v1/orgs/<organisation>/portfolios/<portfolio>/holdings/ /api/v1/orgs/<organisation>/portfolios/<portfolio>/valuation/ /api/v1/orgs/<organisation>/exports/ |
portfolios:import | Post a positions or transactions file to a book: preview, then commit. Each commit is audited with the file's hash and row counts./api/v1/orgs/<organisation>/portfolios/<portfolio>/import/preview/ /api/v1/orgs/<organisation>/portfolios/<portfolio>/import/commit/ |
reports:read | Generated organisation reports. No endpoint serves it yet. |
limits:read | Limit rules and their checks. No endpoint serves it yet. |
Market data through a key or in an export is for the organisation's internal use only and may not be redistributed; every answer carries a data_licence object naming the sources (uzse.uz, openinfo.uz, cbu.uz). The organisation's own positions and transactions are its own without that limit. Every import and every export is recorded on the organisation's audit log.
Limits
Rate limits, paging and versioning
These endpoints carry their own rate limits, counted per client address; there is no single limit shared across them. A limited call answers 429 with a Retry-After header.
| Endpoints | Rate limit |
|---|---|
| Four public market endpoints | 600/min |
| Obtaining a token | 10/min |
| Creating a Finmind account | 5/min |
| Contact form | 5/min |
| Assistant (signed in) | 20/min |
| Open-data lookups (signed in) | 30/min |
Lists are paged with page and page_size (50 by default, 500 at most). One version prefix, /api/v1, is served; a breaking change would arrive under a new prefix.
Stated plainly
What is not offered yet
- No personal API keys. A person's token is their own Finmind sign-in, valid for their own data and entitlements. API keys exist for organisation accounts only, and never open a person's own data.
- No browser calls from other websites. CORS allows finmind.uz only, so a page on another domain cannot call the API from the visitor's browser; a server, a script or a notebook can.
- No live quotes. Prices are the exchange's daily closes as stored; each carries the session day it belongs to, and a figure the source does not publish is null, never zero.
- No published deprecation policy yet. There is one version prefix and the schema states its version; we would rather say that than promise a policy we have not written.
Terms of use
Using the data
The API is covered by the terms of service. Personal use, research and a tool for your own investing are welcome. Bulk download, resale or redistribution of the data needs our written permission first: write to finmind_support@protonmail.com and say what you are building. Name the sources when you publish figures: the prices are the exchange's (uzse.uz) and the company facts and disclosures are openinfo.uz's, both read by Finmind.
Machine-readable neighbours: the disclosures feed at /feeds/disclosures.xml, the sitemap, and /llms.txt for language models.