UzMap
Maps, geocoding and routing for Uzbekistan. Vector tiles, place search, addresses, turn-by-turn directions, distance matrices and isochrones — served from one API, on one origin.
The data comes from OpenStreetMap and other openly licensed sources, processed into vector tiles and a search index. There is no proprietary data layer and no per-view licence: what you build with it is yours.
Two ways in#
A script tag, if you want a map on a page and have no build step:
<div id="map" style="width:100%;height:400px"></div>
<script src="https://uzmaps.ndc.uz/v1/uzmaps.js?apikey=YOUR_KEY"></script>
<script>
uzmaps.ready(function () {
new uzmaps.Map({ container: 'map', center: [69.2401, 41.2995], zoom: 12 });
});
</script>npm, if you have a bundler:
npm install @uzmaps/engine maplibre-glimport { UzMap } from '@uzmaps/engine';
const map = new UzMap({
container: 'map',
serverUrl: 'https://uzmaps.ndc.uz',
apiKey: 'YOUR_KEY',
center: [69.2401, 41.2995],
zoom: 12,
});Everything the map does over HTTP, you can call directly. The map is a client of the same API you are.
What is here#
| Quickstart | A working map, a search box and a route, in about ten minutes. |
| API keys and quotas | How keys work, why the origin allowlist matters more than secrecy, and what counts against a quota. |
| Script tag | The single-file browser build, for pages without a build step. |
@uzmaps/engine | The map: options, methods, events, overlays. |
| HTTP API | Search, places, routing, tiles — the reference. |
| Developer console | Projects, keys and usage at console.uzmaps.ndc.uz. |
| Self-hosting | Running the whole stack yourself. |
Conventions#
These hold everywhere in the API and the client libraries. They are worth reading once, because getting one wrong produces results that look almost right.
Coordinates are [longitude, latitude]. GeoJSON order, not the lat, lon you would say out loud. Tashkent
is [69.2401, 41.2995].
Distances are metres and durations are seconds. Always, including inside a distance matrix, and regardless of what the underlying engine reports internally.
Money, where it appears, is in tiyin — the minor unit of the som — and is an integer. Never a float.
A null distance or duration is an answer, not an error. In a matrix it means no route exists between that
pair. The rest of the matrix is still valid.
Getting a key#
Create one in the console. Sign up, and you get an organisation, a project and a free-tier key immediately.
A browser key is public — it ships inside your page, and anyone can read it out of the network tab. That is
true of every web mapping API and is not a flaw to engineer around. What protects it is the
origin allowlist: a key restricted to https://yourdomain.uz is useless to
someone who copies it, because their site sends a different Origin and the request is refused.
Attribution#
Map data © OpenStreetMap contributors, licensed under the ODbL. Attribution is required and is shown by the map's own control; if you build your own UI, you must display it yourself. See Map data and licensing for the full list of sources and their terms.