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.

Public endpoints, what they return and their limit
PathReturnsRate 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.

Rate limits by endpoint group
EndpointsRate limit
The four public market endpoints600/min
Obtaining a token10/min
Creating a Finmind account5/min
The contact form5/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.