QazMaps API v1
Геокодер, обратный геокодер, маршруты, матрица времени и расстояний, изохроны и карточки организаций по Казахстану. Базовый адрес — /v1 на этом сервере. Машиночитаемое описание — openapi.yaml (подходит для Postman, Insomnia и генераторов клиентов).
Быстрый старт
curl -H "X-Api-Key: $QAZMAPS_KEY" \
"https://<домен>/v1/geocode?q=%D0%B0%D0%B1%D0%B0%D1%8F%2052&limit=2"
Ответ — JSON. Координаты везде в WGS 84 и в порядке «долгота, широта» (lon,lat), как в GeoJSON. Строки запроса кодируйте в UTF-8 (encodeURIComponent).
Ключ
Каждый запрос, кроме /v1/openapi.yaml, передаёт ключ одним из способов:
| Способ | Пример | |
|---|---|---|
| Заголовок | X-Api-Key: qz_… | Предпочтительно |
| Параметр | ?key=qz_… | Удобно из браузера, но адрес с ключом оседает в истории и логах прокси |
Ключ показывается один раз при выдаче — у нас хранится только его хеш, восстановить ключ нельзя, можно выпустить новый. Ответы разрешены для любого источника (CORS *): ключ можно использовать из веб-приложения, но тогда его видят пользователи — заведите для фронтенда отдельный ключ.
Лимиты и учёт
У ключа есть лимит запросов в минуту (по тарифу). Можно сделать короткий всплеск до минутного лимита, дальше запросы восстанавливаются равномерно (лимит / 60 в секунду). Нормализация ограничена ещё и числом адресов в минуту — у тарифа свой лимит.
| Заголовок ответа | Смысл |
|---|---|
X-RateLimit-Limit | Лимит запросов в минуту для ключа |
X-RateLimit-Remaining | Сколько запросов можно сделать прямо сейчас |
X-RateLimit-Addresses-Limit, X-RateLimit-Addresses-Remaining | Только у /v1/normalize: лимит адресов в минуту и сколько адресов можно отправить сейчас |
X-Spend-Warning | Пакет «Бизнес»: cap-80 — расходы под потолком за месяц (сверх пакета и нормализация) достигли 80% потолка, cap-100 — потолок достигнут, over-package — расходы сверх пакета больше его месячной платы |
Retry-After | Только в ответе 429: через сколько секунд повторить |
2xx. Ошибочные запросы не тарифицируются, но расходуют лимит частоты. Единица учёта — запрос, у /matrix — элемент матрицы (пара «источник — цель», пары без пути бесплатны). Сутки считаются по времени Казахстана (UTC+5).Ошибки
Тело ошибки: {"error": "описание"}.
| Код | Когда |
|---|---|
400 | Неверные или недостающие параметры |
401 | Ключ не передан (API key required…) или не найден (invalid API key) |
402 | Пакет «Бизнес»: потолок расходов за месяц достигнут, а позиция пакета исчерпана (у нормализации — 1 000 бесплатных адресов месяца) — такие запросы отклоняются до конца месяца, запросы в пределах пакета работают |
403 | Ключ отключён (API key disabled) |
404 | Объект не найден |
413 | Запрос больше лимита: в нормализации — больше адресов, чем лимит ключа в минуту; в матрице — больше 2 500 элементов или 100 точек с одной стороны. Разбейте запрос |
429 | Превышен лимит — подождите Retry-After секунд |
5xx | Ошибка на нашей стороне — повторите позже |
Атрибуция
Каждый ответ с данными содержит поле attribution — строку, которую нужно показывать пользователям рядом с результатами (на карте, в списке, в карточке):
| Когда | attribution |
|---|---|
| Всегда | © OpenStreetMap contributors (ODbL) |
| В ответе есть адреса | © OpenStreetMap contributors (ODbL) · Адреса: «Открытые данные» data.egov.kz |
Где возможно, делайте «OpenStreetMap» ссылкой на openstreetmap.org/copyright. Все источники и лицензии — на странице /copyright.
Условия
- Данные OpenStreetMap доступны вам по лицензии ODbL 1.0. Полученные через API данные OSM и результаты на их основе можно хранить, обрабатывать и распространять на условиях ODbL: с атрибуцией, а производные базы данных — под той же лицензией. Эти условия не ограничивают ваши права на OSM-часть данных.
- Адреса адресного регистра — открытые данные портала data.egov.kz; их использование и повторная публикация свободны.
- Показывайте пользователям атрибуцию из поля
attribution. - Условия ограничивают только доступ к сервису: ключ выдаётся одному клиенту и не передаётся третьим лицам, действуют лимиты частоты и тариф. При нарушении ключ может быть отключён.
Полный текст условий на казахском и русском языках будет опубликован до запуска платных тарифов.
Поиск: /geocode
Адреса, улицы, населённые пункты и организации с автодополнением — по русским, казахским, альтернативным и старым названиям (переименованная улица находится по прежнему названию, совпавшее показывается в old_name). Опечатки допускаются. Выше — совпадение с начала слова, затем объекты внутри bbox, затем ближайшие к lon,lat (или к центру bbox; по умолчанию — к центру Алматы).
| Параметр | Тип | Описание |
|---|---|---|
q обязателен | string | Строка запроса, от 2 символов (обрезается до 100) |
lon, lat | number | Точка, рядом с которой искать (передавайте вместе) |
bbox | string | Видимая область minLon,minLat,maxLon,maxLat |
limit | integer | 1–30, по умолчанию 10 |
Ответ 200
{
"attribution": "© OpenStreetMap contributors (ODbL) · Адреса: «Открытые данные» data.egov.kz",
"results": [
{
"id": "37056",
"type": "address",
"ref": "a32544",
"name": "проспект Абая, 52",
"name_kk": "Абай даңғылы, 52",
"subtitle": "Бостандыкский район, Алматы",
"kind": "address",
"old_name": null,
"approx": false,
"post_index": null,
"lon": 76.913402,
"lat": 43.239724
}
]
}
Поле results[] | Описание |
|---|---|
type | place — населённый пункт или район, street — улица, address — дом, poi — организация |
ref | У организаций — ссылка на объект OSM (n…, w…, r…) для /places/{ref}; у адресов и улиц — внутренняя |
name, name_kk | Название на русском и казахском |
subtitle | Уточнение: рубрика, адрес, район и город |
kind | Рубрика организации (код) |
old_name | Прежнее название, по которому нашёлся объект |
approx | true — дом есть в адресном регистре, но не отмечен на карте: координаты приблизительные (точка улицы) |
id | Запись поискового индекса; меняется при обновлении данных — не храните |
Обратный геокодер: /reverse
«Что здесь?» — здание под точкой (или ближайший дом в радиусе ~40 м): адрес, этажность, контур и организации внутри.
| Параметр | Тип | Описание |
|---|---|---|
lon обязателен | number | Долгота |
lat обязателен | number | Широта |
Ответ 200
{
"attribution": "© OpenStreetMap contributors (ODbL) · Адреса: «Открытые данные» data.egov.kz",
"address": "улица Мукагали Макатаева, 127/1",
"address_kk": "Мұқағали Мақатаев көшесі, 127/1",
"post_index": null,
"area": "Алмалинский район, Алматы",
"levels": 3,
"building": { "type": "MultiPolygon", "coordinates": [ … ] },
"pois": [
{ "ref": "w247006982", "kind": "mall", "kind_label": "Торговый центр", "kind_label_kk": "Сауда орталығы",
"name": "ТРК Mega Park", "name_kk": "\"Mega Park\" СОК", "religion": null }
],
"lon": 76.92866,
"lat": 43.26374
}
Если здания или адреса в точке нет, соответствующие поля — null, pois — пустой массив.
Маршрут: /route
Маршрут на автомобиле, пешком или на велосипеде и до двух альтернатив — самый быстрый первым. Подсказки на русском. Пустой routes — маршрут построить нельзя (точки вне дорожного графа).
| Параметр | Тип | Описание |
|---|---|---|
from обязателен | string | Начало, lon,lat |
to обязателен | string | Конец, lon,lat |
mode | string | auto (по умолчанию), pedestrian, bicycle |
Ответ 200
{
"attribution": "© OpenStreetMap contributors (ODbL)",
"routes": [
{
"time": 530.3,
"length": 3.43,
"coordinates": [[76.928801, 43.238908], [76.928755, 43.239311], …],
"maneuvers": [
{ "text": "Двигайтесь на север.", "type": 3, "length": 0.045, "time": 16.3, "at": [76.928801, 43.238908] },
{ "text": "Поверните налево.", "type": 15, "length": 0.089, "time": 34.2, "at": [76.928755, 43.239311] }
]
}
]
}
Поле routes[] | Описание |
|---|---|
time | Время в пути, секунды |
length | Длина, км |
coordinates | Линия маршрута, точки [lon, lat] |
maneuvers | Манёвры: подсказка, тип (коды Valhalla), длина участка (км), время (с), точка |
Матрица: /matrix
Время в пути и расстояние по дорогам от каждого источника до каждой цели: распределение заказов по курьерам, ближайший склад, зоны обслуживания. Тело запроса — JSON.
| Поле тела | Тип | Описание |
|---|---|---|
sources обязательно | array | Точки отправления [lon, lat], от 1 до 100 |
targets обязательно | array | Точки назначения [lon, lat], от 1 до 100 |
mode | string | auto (по умолчанию), pedestrian, bicycle |
curl -X POST -H "X-Api-Key: $QAZMAPS_KEY" -H "Content-Type: application/json" \
-d '{"sources": [[76.945329, 43.244304], [76.8697, 43.2028]],
"targets": [[76.8697, 43.2028], [76.9286, 43.2389], [76.95, 43.26]]}' \
"https://<домен>/v1/matrix"
Ответ 200
{
"attribution": "© OpenStreetMap contributors (ODbL)",
"durations": [[1626, 477, 407], [0, 1226, 1884]],
"distances": [[10963, 2576, 2241], [0, 7627, 12768]]
}
| Поле | Описание |
|---|---|
durations[i][j] | Время в пути из sources[i] в targets[j], секунды; null — пути нет |
distances[i][j] | Расстояние по дорогам, метры; null — пути нет |
Точки привязываются к ближайшей дороге в радиусе до 35 км. Если хотя бы у одной точки дороги в этом радиусе нет, матрица не считается: весь запрос получает 400, номер точки в ответе не указан.
Лимиты. Не больше 2 500 элементов (источники × цели, например 50×50) и не больше 100 точек с каждой стороны, иначе 413: разбейте запрос на несколько. Источник и цель — не дальше 400 км друг от друга на автомобиле и 200 км пешком или на велосипеде, иначе 400. Учёт — по посчитанным элементам: запрос 50×50 — до 2 500 единиц, пары без пути (null) не тарифицируются. Лимит частоты расходуется как у остальных методов: один запрос — одна единица. Точки передаются только в теле запроса и не сохраняются.
Изохроны: /isochrone
Куда можно добраться из точки за заданное время: «доставим за 30 минут», пешая доступность магазина. Ответ — GeoJSON FeatureCollection (RFC 7946): по полигону на контур, от большего к меньшему, чтобы меньший рисовался поверх. Его можно сразу передать в источник geojson карты MapLibre.
| Параметр | Тип | Описание |
|---|---|---|
lon, lat обязательны | number | Точка, от которой считается время |
minutes обязателен | string | Время контуров в минутах через запятую: от 1 до 4 целых чисел от 1 до 60, например 10,20,30 |
mode | string | auto (по умолчанию), pedestrian, bicycle |
Ответ 200
{
"type": "FeatureCollection",
"attribution": "© OpenStreetMap contributors (ODbL)",
"features": [
{ "type": "Feature", "properties": { "minutes": 20 },
"geometry": { "type": "Polygon", "coordinates": [[[76.9406, 43.301635], [76.939846, 43.299653], …]] } },
{ "type": "Feature", "properties": { "minutes": 10 },
"geometry": { "type": "Polygon", "coordinates": [[[76.9306, 43.267144], [76.929002, 43.264497], …]] } }
]
}
properties.minutes — время контура в минутах. Точка привязывается к ближайшей дороге в радиусе до 35 км, и время считается от места привязки; если дороги в этом радиусе нет — 400. Учёт — за запрос, сколько бы контуров в нём ни было.
Организация: /places/{ref}
Карточка организации: название, рубрика, адрес на русском и казахском, район и теги OSM (часы работы, телефон, сайт…). ref — из поля ref ответов /geocode (у организаций) и /reverse.
Ответ 200
{
"attribution": "© OpenStreetMap contributors (ODbL) · Адреса: «Открытые данные» data.egov.kz",
"ref": "w247006982",
"kind": "mall",
"kind_label": "Торговый центр",
"kind_label_kk": "Сауда орталығы",
"name": "ТРК Mega Park",
"name_kk": "\"Mega Park\" СОК",
"address": "улица Мукагали Макатаева, 127/1",
"address_kk": "Мұқағали Мақатаев көшесі, 127/1",
"area": "Алмалинский район, Алматы",
"tags": { "phone": "+77021333093", "addr:street": "Мақатаев көшесі", "addr:housenumber": "127/1" },
"lon": 76.928662,
"lat": 43.263737
}
tags — теги OpenStreetMap как есть: opening_hours (формат OSM), phone, website, contact:* и др. Неизвестный ref — 404.