Developers
The 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. 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
The 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.
The 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 account does not hold that feature. The free areas of the catalogue (portfolio, the order book, learning) need only the token.
curl -s -X POST https://finmind.uz/api/v1/auth/token/ \
-H 'Content-Type: application/json' \
-d '{"email": "[email protected]", "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 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.
Limits
Rate limits, paging and versioning
There is no global rate limit; the endpoints below carry their own, counted per client address. A limited call answers 429 with a Retry-After header.
| Endpoints | Rate limit |
|---|---|
| The four public market endpoints | 600/min |
| Obtaining a token | 10/min |
| Creating a Finmind account | 5/min |
| The contact form | 5/min |
| The 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 API keys. A token is a person's own Finmind sign-in, valid for their own data and entitlements; there is no separate developer credential yet.
- 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 [email protected] 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.