{"openapi":"3.1.0","info":{"title":"Almaty Traffic Lab — сервис маршрутизации","version":"0.0.1","description":"Демонстрационный HTTP API по ключу (X-ATL-Key или Authorization: Bearer); заявка — на странице карты /about. Координаты WGS84: {lat, lon}, геометрии: [lon, lat]. Данные © OpenStreetMap contributors, ODbL. CORS разрешён для всех источников, у ключа может быть ограничение Origin; X-ATL-Graph присутствует во всех ответах. Лимиты: 120 запросов/мин с IP, по ключу 300/мин по умолчанию, заявки 5/час с IP. Ошибки возвращаются как {error: {code, message}}."},"paths":{"/v1/corrections":{"post":{"operationId":"corrections","security":[{"ApiKeyAuth":[]}],"summary":"Уточнение полос и разметки","description":"D33: один участок, один way, направление по OSM. attribute=layout объединяет атрибуты; ours/proposed содержат одинаковые ключи. lanes — обычные полосы без выделенки и кармана; null — неизвестно. bus_lane задаёт одну выделенку и сторону по ходу движения. pocket/turns/crosswalk относятся к direction. UUID установки необязателен, consent=true обязателен. Транспорт: website пустой, formElapsedMs от 3000 до 86400000. 10 попыток за скользящий час с IP и общие лимиты D28. До ответа запись синхронизируется на том. 503 при недоступном журнале. Данные карты напрямую не меняются.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionRequest"},"example":{"linkId":"w4489474_0_f","osmWayId":4489474,"direction":"forward","attribute":"layout","ours":{"lanes":{"forward":2,"backward":null},"bus_lane":{"present":false}},"proposed":{"lanes":{"forward":2,"backward":2},"bus_lane":{"present":true,"direction":"forward","side":"right"}},"installationId":"11111111-1111-4111-8111-111111111111","consent":true,"website":"","formElapsedMs":5000}}}},"responses":{"200":{"description":"Успешный ответ","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionResponse"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"413":{"description":"Тело уточнения превышает 8192 байт","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Журнал недоступен"}}}},"/v1/corrections/stats":{"get":{"operationId":"correctionsStats","security":[{"ApiKeyAuth":[]}],"summary":"Статистика уточнений","description":"received — всего квитанций, accepted/rejected — окончательные решения, pending — ожидают разбора. Решения читаются с тома без перезапуска. Принятое уточнение не означает, что правка уже внесена в OSM. Журнал недоступен — 503, а не ложные нули.","responses":{"200":{"description":"Успешный ответ","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionsStats"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Журнал недоступен"}}}},"/v1/cameras":{"get":{"operationId":"cameras","security":[{"ApiKeyAuth":[]}],"summary":"Камеры контроля скорости","description":"Весь слой города: OSM и подтверждённые сообщения пользователей. Bearings — курс движения от севера по часовой стрелке; linkIds — направленные линки. ETag / If-None-Match, 304 без тела. Ориентируйтесь на знаки.","responses":{"200":{"description":"Успешный ответ","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CamerasResponse"}}}},"304":{"description":"Слой не изменился; тело отсутствует","headers":{"ETag":{"schema":{"type":"string"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/camera-reports":{"post":{"operationId":"cameraReports","security":[{"ApiKeyAuth":[]}],"summary":"Сообщение о камере","description":"Точка и курс, UUID установки и отдельное consent=true. До 20 сообщений за скользящие 24 часа на установку плюс общие лимиты D28. Три установки в 30 м и ±45° за 30 дней подтверждают камеру. absent только копится. При недоступном журнале — 503.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CameraReportRequest"},"example":{"lat":43.238,"lon":76.957,"bearingDeg":90,"kind":"present","installationId":"11111111-1111-4111-8111-111111111111","consent":true}}}},"responses":{"200":{"description":"Успешный ответ","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CameraReportResponse"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Журнал недоступен"}}}},"/v1/meta":{"get":{"operationId":"meta","security":[{"ApiKeyAuth":[]}],"summary":"Метаданные загруженной сети","description":"Версия графа, границы, число объектов (в том числе signalNodeCount — узлов со светофором), происхождение скоростей, статистика наблюдений (observed: linkCount, pointCount, lastAt — те же числа, что на /v1/observed/stats) и атрибуция OSM.","responses":{"200":{"description":"Успешный ответ","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaResponse"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/snap":{"post":{"operationId":"snap","security":[{"ApiKeyAuth":[]}],"summary":"Место остановки автомобиля","description":"Привязка точки к подъезду, зданию или дороге. Расстояния offsetM и walkM — в метрах.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapRequest"},"example":{"point":{"lat":43.352,"lon":77.04}}}}},"responses":{"200":{"description":"Успешный ответ","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapResponse"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/route":{"post":{"operationId":"route","security":[{"ApiKeyAuth":[]}],"summary":"Маршрут между двумя точками","description":"transport: car (по умолчанию) или bus. Явно переданный режим возвращается в Route.transport и альтернативах; без поля сохраняется прежний ответ. Bus разрешает автобусные дороги. Профиль автобусов используется при ≥8 проездах за ≥3 дня; иначе автомобильная модель с минимумом 60% лимита на выделенке (допущение). Остановки не учитываются. Маршрут минимизирует обобщённую стоимость: время проезда × вес класса + длина × 0,05 с/м + штрафы и ожидание (D29, допущение владельца). Веса trunk/primary/secondary и их съездов — 1,0; tertiary и съездов — 1,05; unclassified/residential — 1,50; living_street/service — 1,5. durationS и steps[].durationS — честное время без весов предпочтения. Расстояние — метры, длительность — секунды, geometry — пары [lon, lat]. departAtMin: 0–1440 минут от полуночи Алматы (UTC+5), без значения — текущее местное время. traffic (по умолчанию) учитывает трафик; free_flow — только ограничения скорости. Вне зоны модели (скорость линка — эвристика) к времени добавляется ожидаемая задержка на регулируемых перекрёстках: 10–20 с на перекрёсток, направо вдвое меньше. Без светофора добавляется уступка с младшей улицы на магистраль/через неё: 15 с налево/прямо, 5 с направо; с местной на tertiary — 5 с. Уступка в пик ×1,6, вне пика ×1, ночью ×0, только при эвристике входящего линка. В free_flow обеих задержек нет; веса выбора пути сохраняются. Пример: Аэропорт → Абая/Достык.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteRequest"},"example":{"from":{"lat":43.352,"lon":77.04},"to":{"lat":43.238,"lon":76.957},"departAtMin":480,"traffic":"traffic","alternatives":2,"transport":"car"}}}},"responses":{"200":{"description":"Успешный ответ","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteResponse"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/matrix":{"post":{"operationId":"matrix","security":[{"ApiKeyAuth":[]}],"summary":"Матрица времени и расстояний","description":"От 1 до 100 точек отдельно в origins и destinations. durationsS[i][j] — секунды, distancesM[i][j] — метры; null означает недостижимость. departAtMin: 0–1440 минут по Алматы (UTC+5), без значения — текущее местное время. traffic по умолчанию, free_flow — без трафика.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixRequest"},"example":{"origins":[{"lat":43.352,"lon":77.04}],"destinations":[{"lat":43.238,"lon":76.957}],"departAtMin":480}}}},"responses":{"200":{"description":"Успешный ответ","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixResponse"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/geocode":{"post":{"operationId":"geocode","security":[{"ApiKeyAuth":[]}],"summary":"Поиск по адресу, зданию и заведению OSM и Overture на русском, казахском и английском, с опечатками","description":"query — 1–200 символов; limit — 1–20 результатов, по умолчанию 5. near задаёт предпочтительную точку; score — оценка 0–1. source: osm или overture; слой Overture необязателен, его релиз и число мест доступны в meta.overture.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeocodeRequest"},"example":{"query":"Traveler's","limit":5,"near":{"lat":43.238,"lon":76.957}}}}},"responses":{"200":{"description":"Успешный ответ","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeocodeResponse"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/geocode/reverse":{"post":{"operationId":"reverseGeocode","security":[{"ApiKeyAuth":[]}],"summary":"Адрес рядом с точкой","description":"Ближайшее здание, distanceM в метрах. Если адрес не найден, поле result отсутствует.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReverseGeocodeRequest"},"example":{"point":{"lat":43.238,"lon":76.957}}}}},"responses":{"200":{"description":"Успешный ответ","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReverseGeocodeResponse"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/probes":{"post":{"operationId":"probes","security":[{"ApiKeyAuth":[]}],"summary":"Приём GPS-трека","description":"transport: car (по умолчанию) или bus. Журнал содержит тег transport рядом с хешем vehicleId. Автобусные точки привязываются к автобусному графу и не меняют живые скорости, профили поездок и калибровку car. От 2 до 2000 точек. vehicleId — непрозрачный идентификатор длиной 1–64 символа, без номера машины и персональных данных. tsMs — миллисекунды Unix, speedMps — м/с, headingDeg — 0–360 градусов. Скорости сопоставленных линков speedKph — км/ч. Сервис не хранит точки и vehicleId: в журнал наблюдений (ATL_OBSERVED_LOG) попадают время, id линка, скорость, длина проезда, качество привязки и короткий хеш vehicleId.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProbesRequest"},"example":{"vehicleId":"demo-vehicle","points":[{"lat":43.352,"lon":77.04,"tsMs":1791788400000},{"lat":43.351,"lon":77.039,"tsMs":1791788410000}]}}}},"responses":{"200":{"description":"Успешный ответ","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProbesResponse"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/observed/stats":{"get":{"operationId":"observedStats","security":[{"ApiKeyAuth":[]}],"summary":"Статистика наблюдений","description":"byTransport: { car, bus } содержит linkCount, pointCount и lastAt по каждому транспорту в сохраняемых файлах журнала и очереди. Старые записи без тега считаются car. Верхний linkCount относится к автомобильному ObservedStore, pointCount — ко всему журналу. Сколько линков имеют скорость по GPS-трекам (linkCount), сколько строк в журнале наблюдений (pointCount: по строке на проезд линка в принятом треке; журнал ведётся, если задан ATL_OBSERVED_LOG, иначе число считается с запуска процесса) и когда было последнее наблюдение (lastAt, ISO 8601 UTC; поля нет, пока наблюдений не было). Те же числа лежат в /v1/meta в поле observed.","responses":{"200":{"description":"Успешный ответ","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObservedStats"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/access-requests":{"post":{"operationId":"accessRequests","security":[],"summary":"Заявка на доступ к API","description":"Без ключа, до 5 заявок в час с IP. Данные хранятся до ответа, не дольше 90 дней; публичного чтения нет.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessRequest"},"example":{"name":"Тестовый заявитель","email":"test@example.com","purpose":"Проверить интеграцию маршрутов","consent":true}}}},"responses":{"200":{"description":"Успешный ответ","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessResponse"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/healthz":{"get":{"operationId":"health","security":[],"summary":"Проверка работоспособности HTTP-сервиса","description":"Возвращает status: ok после загрузки данных и создания Router; не вычисляет маршрут.","responses":{"200":{"description":"Успешный ответ","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/cities":{"get":{"operationId":"cities","summary":"Города Казахстана","description":"90 городов из официального КАТО НК РК 11-2025, актуализация 18.09.2026. Только Алматы доступен для маршрутизации; isAvailable не означает покрытие всей страны.","security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"responses":{"200":{"description":"Проверенный каталог","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityCatalog"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/city-launch-requests":{"post":{"operationId":"cityLaunchRequest","summary":"Заявка разработчику на запуск города","description":"Только после явного подтверждения. Случайный UUID установки, UUID заявки повторяется при retry. Сервер сохраняет запись на постоянный том до 201; повтор установки/города возвращает прежнюю квитанцию с duplicate=true и 200. Письма/сообщения не отправляются. До 5 заявок в час с IP вместе с access-requests; обычная авторизация и лимиты ключа сохраняются.","security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityLaunchRequest"},"example":{"cityId":"710000000","installationId":"11111111-1111-4111-8111-111111111111","requestId":"22222222-2222-4222-8222-222222222222","consent":true}}}},"responses":{"200":{"description":"Эта установка уже запрашивала город; квитанция прежней записи","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityLaunchReceipt"}}}},"201":{"description":"Новая заявка сохранена","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityLaunchReceipt"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Город уже доступен или UUID использован для другой заявки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityLaunchError"}}}},"413":{"description":"Тело превышает 2048 байт","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityLaunchError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Хранилище или доступ разработчика не настроены/недоступны","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityLaunchError"}}}}}}},"/v1/admin/city-launch-requests":{"get":{"operationId":"cityLaunchInbox","summary":"Журнал заявок для разработчика","description":"Нужны обычный API-ключ и отдельный секрет ATL_CITY_REQUESTS_ADMIN_KEY в X-ATL-Admin-Key. Публичный мобильный ключ сам по себе не даёт чтение. UUID установки в ответ не включается.","security":[{"ApiKeyAuth":[],"CityInboxAuth":[]},{"BearerAuth":[],"CityInboxAuth":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":100}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"maximum":100000,"default":0}}],"responses":{"200":{"description":"Страница журнала","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityLaunchInbox"}}}},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Город уже доступен или UUID использован для другой заявки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityLaunchError"}}}},"413":{"description":"Тело превышает 2048 байт","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityLaunchError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Хранилище или доступ разработчика не настроены/недоступны","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityLaunchError"}}}}}}},"/v1/admin/corrections":{"get":{"summary":"Выгрузка уточнений для проверки","description":"API-ключ плюс X-ATL-Admin-Key = ATL_CITY_REQUESTS_ADMIN_KEY. limit 1–100 (100), offset 0–100000 (0). Ответ: corrections, total, nextOffset. Записи содержат id, at, поля уточнения, status и reason при наличии решения; HMAC и UUID не выдаются. Cache-Control: no-store. После разбора содержимое удаляется из журнала при старте/ежечасной очистке; для истории сохранить выгрузку до решения.","security":[{"ApiKeyAuth":[],"CityInboxAuth":[]},{"BearerAuth":[],"CityInboxAuth":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":100}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"maximum":100000,"default":0}}],"responses":{"200":{"description":"Страница уточнений без идентификаторов установок"},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Город уже доступен или UUID использован для другой заявки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityLaunchError"}}}},"413":{"description":"Тело превышает 2048 байт","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityLaunchError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Хранилище или доступ разработчика не настроены/недоступны","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityLaunchError"}}}}}}},"/v1/admin/camera-reports":{"get":{"summary":"Сводка кандидатов камер","description":"Обычный API-ключ и X-ATL-Admin-Key (ATL_CITY_REQUESTS_ADMIN_KEY). Кандидаты: present, absent, installations за 30 дней, status osm/pending/confirmed/unbound. Идентификаторы установок и HMAC не выдаются.","security":[{"ApiKeyAuth":[],"CityInboxAuth":[]},{"BearerAuth":[],"CityInboxAuth":[]}],"responses":{"200":{"description":"Сводка кандидатов"},"400":{"description":"bad_request: Невалидный JSON или поля запроса; out_of_bbox: Точка вне границ графа; too_many_points: Слишком много точек","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized: Нет ключа, ключ неизвестен или Origin не разрешён","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"no_route: Маршрут не найден; not_found: Объект или путь не найден","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Город уже доступен или UUID использован для другой заявки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityLaunchError"}}}},"413":{"description":"Тело превышает 2048 байт","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityLaunchError"}}}},"429":{"description":"rate_limited: Лимит запросов; повторить через Retry-After секунд","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}},"Retry-After":{"description":"Секунд до следующего запроса","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"internal: Внутренняя ошибка","headers":{"X-ATL-Graph":{"description":"Идентификатор загруженного графа","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Хранилище или доступ разработчика не настроены/недоступны","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CityLaunchError"}}}}}}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-ATL-Key"},"BearerAuth":{"type":"http","scheme":"bearer"},"CityInboxAuth":{"type":"apiKey","in":"header","name":"X-ATL-Admin-Key"}},"schemas":{"CorrectionRequest":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"linkId":{"type":"string","maxLength":100,"pattern":"^w\\d+_\\d+_[fb]$"},"osmWayId":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"direction":{"type":"string","enum":["forward","backward"]},"attribute":{"type":"string","enum":["layout","lanes","bus_lane","pocket","turns","crosswalk"]},"ours":{"type":"object","properties":{"lanes":{"type":"object","properties":{"forward":{"anyOf":[{"type":"integer","minimum":0,"maximum":20},{"type":"null"}]},"backward":{"anyOf":[{"type":"integer","minimum":0,"maximum":20},{"type":"null"}]}},"required":["forward","backward"],"additionalProperties":false},"bus_lane":{"anyOf":[{"oneOf":[{"type":"object","properties":{"present":{"type":"boolean","const":false}},"required":["present"],"additionalProperties":false},{"type":"object","properties":{"present":{"type":"boolean","const":true},"direction":{"type":"string","enum":["forward","backward"]},"side":{"type":"string","enum":["left","right","middle"]}},"required":["present","direction","side"],"additionalProperties":false}]},{"type":"null"}]},"pocket":{"anyOf":[{"oneOf":[{"type":"object","properties":{"present":{"type":"boolean","const":false}},"required":["present"],"additionalProperties":false},{"type":"object","properties":{"present":{"type":"boolean","const":true},"lengthM":{"anyOf":[{"type":"integer","minimum":1,"maximum":500},{"type":"null"}]}},"required":["present","lengthM"],"additionalProperties":false}]},{"type":"null"}]},"turns":{"anyOf":[{"maxItems":20,"type":"array","items":{"maxItems":6,"type":"array","items":{"type":"string","enum":["left","through","right","uturn","merge","diverge"]}}},{"type":"null"}]},"crosswalk":{"type":["boolean","null"]}},"additionalProperties":false},"proposed":{"type":"object","properties":{"lanes":{"type":"object","properties":{"forward":{"anyOf":[{"type":"integer","minimum":0,"maximum":20},{"type":"null"}]},"backward":{"anyOf":[{"type":"integer","minimum":0,"maximum":20},{"type":"null"}]}},"required":["forward","backward"],"additionalProperties":false},"bus_lane":{"anyOf":[{"oneOf":[{"type":"object","properties":{"present":{"type":"boolean","const":false}},"required":["present"],"additionalProperties":false},{"type":"object","properties":{"present":{"type":"boolean","const":true},"direction":{"type":"string","enum":["forward","backward"]},"side":{"type":"string","enum":["left","right","middle"]}},"required":["present","direction","side"],"additionalProperties":false}]},{"type":"null"}]},"pocket":{"anyOf":[{"oneOf":[{"type":"object","properties":{"present":{"type":"boolean","const":false}},"required":["present"],"additionalProperties":false},{"type":"object","properties":{"present":{"type":"boolean","const":true},"lengthM":{"anyOf":[{"type":"integer","minimum":1,"maximum":500},{"type":"null"}]}},"required":["present","lengthM"],"additionalProperties":false}]},{"type":"null"}]},"turns":{"anyOf":[{"maxItems":20,"type":"array","items":{"maxItems":6,"type":"array","items":{"type":"string","enum":["left","through","right","uturn","merge","diverge"]}}},{"type":"null"}]},"crosswalk":{"type":["boolean","null"]}},"additionalProperties":false},"note":{"type":"string","maxLength":300},"installationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"consent":{"type":"boolean","const":true},"website":{"default":"","type":"string","maxLength":0},"formElapsedMs":{"type":"integer","minimum":3000,"maximum":86400000}},"required":["linkId","osmWayId","direction","attribute","ours","proposed","consent","formElapsedMs"],"additionalProperties":false},"CameraReportRequest":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lon":{"type":"number","minimum":-180,"maximum":180},"bearingDeg":{"type":"number","minimum":0,"exclusiveMaximum":360},"kind":{"type":"string","enum":["present","absent"]},"installationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"consent":{"type":"boolean","const":true}},"required":["lat","lon","bearingDeg","kind","installationId","consent"]},"CityLaunchRequest":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"cityId":{"type":"string","pattern":"^\\d{9}$"},"installationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"requestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"consent":{"type":"boolean","const":true}},"required":["cityId","installationId","requestId","consent"],"additionalProperties":false},"AccessRequest":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"organization":{"type":"string","maxLength":120},"email":{"type":"string","maxLength":120,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"purpose":{"type":"string","minLength":10,"maxLength":1000},"consent":{"type":"boolean","const":true}},"required":["name","email","purpose","consent"]},"SnapRequest":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"point":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"]}},"required":["point"]},"RouteRequest":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"transport":{"type":"string","enum":["car","bus"]},"alternatives":{"default":0,"type":"integer","minimum":0,"maximum":2},"from":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"]},"to":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"]},"departAtMin":{"type":"number","minimum":0,"maximum":1440},"traffic":{"default":"traffic","type":"string","enum":["traffic","free_flow"]}},"required":["from","to"]},"MatrixRequest":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"origins":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"]}},"destinations":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"]}},"departAtMin":{"type":"number","minimum":0,"maximum":1440},"traffic":{"default":"traffic","type":"string","enum":["traffic","free_flow"]}},"required":["origins","destinations"]},"GeocodeRequest":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":200},"limit":{"default":5,"type":"integer","minimum":1,"maximum":20},"near":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"]}},"required":["query"]},"ReverseGeocodeRequest":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"point":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"]}},"required":["point"]},"ProbesRequest":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"transport":{"type":"string","enum":["car","bus"]},"vehicleId":{"type":"string","minLength":1,"maxLength":64},"points":{"minItems":2,"maxItems":2000,"type":"array","items":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"tsMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"speedMps":{"type":"number","minimum":0},"headingDeg":{"type":"number","minimum":0,"maximum":360}},"required":["lat","lon","tsMs"]}}},"required":["vehicleId","points"]},"CorrectionResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","pattern":"^C-\\d{6,15}$"},"status":{"type":"string","const":"received"}},"required":["id","status"],"additionalProperties":false},"CorrectionsStats":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"received":{"type":"integer","minimum":0,"maximum":9007199254740991},"accepted":{"type":"integer","minimum":0,"maximum":9007199254740991},"rejected":{"type":"integer","minimum":0,"maximum":9007199254740991},"pending":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["received","accepted","rejected","pending"],"additionalProperties":false},"CamerasResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"graphId":{"type":"string","minLength":1},"cameras":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"osmId":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"lat":{"type":"number","minimum":-90,"maximum":90},"lon":{"type":"number","minimum":-180,"maximum":180},"linkIds":{"minItems":1,"type":"array","items":{"type":"string","minLength":1}},"bearings":{"minItems":1,"type":"array","items":{"type":"number","minimum":0,"exclusiveMaximum":360}},"maxspeedKph":{"type":"number","exclusiveMinimum":0},"directionSource":{"type":"string","enum":["tag","oneway","both","snapped"]},"source":{"type":"string","enum":["osm","users"]}},"required":["id","lat","lon","linkIds","bearings","maxspeedKph","directionSource","source"],"additionalProperties":false}}},"required":["graphId","cameras"],"additionalProperties":false},"CameraReportResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true}},"required":["ok"],"additionalProperties":false},"CityCatalog":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^\\d{9}$"},"name":{"type":"string","minLength":1},"nameKK":{"type":"string","minLength":1},"region":{"type":"string","minLength":1},"regionKK":{"type":"string","minLength":1},"regionId":{"type":"string","pattern":"^\\d{9}$"},"isAvailable":{"type":"boolean"},"aliases":{"minItems":1,"type":"array","items":{"type":"string","minLength":1}},"sourceRow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["id","name","nameKK","region","regionKK","regionId","isAvailable","aliases","sourceRow"],"additionalProperties":false}},"CityLaunchReceipt":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"requestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"cityId":{"type":"string","pattern":"^\\d{9}$"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"duplicate":{"type":"boolean"}},"required":["requestId","cityId","createdAt","duplicate"],"additionalProperties":false},"CityLaunchInbox":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"requests":{"type":"array","items":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"cityId":{"type":"string","pattern":"^\\d{9}$"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"duplicate":{"type":"boolean"}},"required":["requestId","cityId","createdAt","duplicate"],"additionalProperties":false}},"total":{"type":"integer","minimum":0,"maximum":9007199254740991},"nextOffset":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]}},"required":["requests","total","nextOffset"],"additionalProperties":false},"CityLaunchError":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"AccessResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true}},"required":["ok"],"additionalProperties":false},"SnapResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"snap":{"type":"object","properties":{"snapped":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"],"additionalProperties":false},"linkId":{"type":"string","minLength":1},"offsetM":{"type":"number","minimum":0},"walkM":{"type":"number","minimum":0},"method":{"type":"string","enum":["entrance","building","road"]},"entranceId":{"type":"string","minLength":1},"buildingId":{"type":"string","minLength":1},"access":{"type":"string","enum":["yes","destination"]},"zoneId":{"type":"integer","minimum":0,"maximum":9007199254740991},"behindBarrier":{"type":"boolean"}},"required":["snapped","linkId","offsetM","walkM","method","access","behindBarrier"],"additionalProperties":false}},"required":["snap"],"additionalProperties":false},"RouteResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"alternatives":{"type":"array","items":{"type":"object","properties":{"lanePath":{"type":"object","properties":{"geometry":{"minItems":2,"type":"array","items":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}],"items":false,"minItems":2,"maxItems":2}},"sections":{"type":"array","items":{"type":"object","properties":{"firstLinkIndex":{"type":"integer","minimum":0,"maximum":9007199254740991},"lastLinkIndex":{"type":"integer","minimum":0,"maximum":9007199254740991},"geometryStart":{"type":"integer","minimum":0,"maximum":9007199254740991},"geometryEnd":{"type":"integer","minimum":0,"maximum":9007199254740991},"networkLinkId":{"type":"string","minLength":1},"entryLaneIndex":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"laneIndex":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"connectorId":{"type":"string","minLength":1},"fallback":{"type":"string","enum":["missing_data","missing_connector","insufficient_room"]},"axis":{"type":"string","enum":["raised","approach"]}},"required":["firstLinkIndex","lastLinkIndex","geometryStart","geometryEnd","entryLaneIndex","laneIndex"],"additionalProperties":false}},"linkGeometryIndex":{"type":"array","items":{"type":"integer","minimum":0,"maximum":9007199254740991}},"links":{"type":"array","items":{"type":"object","properties":{"linkId":{"type":"string","minLength":1},"laneIndex":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"entryLaneIndex":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"networkLinkId":{"type":"string","minLength":1},"connectorId":{"type":"string","minLength":1},"fallback":{"type":"string","enum":["missing_data","missing_connector","insufficient_room"]},"axis":{"type":"string","enum":["raised","approach"]}},"required":["linkId","laneIndex","entryLaneIndex"],"additionalProperties":false}},"changes":{"type":"array","items":{"type":"object","properties":{"linkId":{"type":"string","minLength":1},"networkLinkId":{"type":"string","minLength":1},"fromLaneIndex":{"type":"integer","minimum":0,"maximum":9007199254740991},"toLaneIndex":{"type":"integer","minimum":0,"maximum":9007199254740991},"startM":{"type":"number","minimum":0},"endM":{"type":"number","minimum":0},"geometryStart":{"type":"integer","minimum":0,"maximum":9007199254740991},"geometryEnd":{"type":"integer","minimum":0,"maximum":9007199254740991},"late":{"type":"boolean"}},"required":["linkId","networkLinkId","fromLaneIndex","toLaneIndex","startM","endM","geometryStart","geometryEnd","late"],"additionalProperties":false}},"transitions":{"type":"array","items":{"type":"object","properties":{"networkLinkId":{"type":"string","minLength":1},"laneIndex":{"type":"integer","minimum":0,"maximum":9007199254740991},"toAxis":{"type":"boolean"},"startM":{"type":"number","minimum":0},"endM":{"type":"number","minimum":0},"geometryStart":{"type":"integer","minimum":0,"maximum":9007199254740991},"geometryEnd":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["networkLinkId","laneIndex","toAxis","startM","endM","geometryStart","geometryEnd"],"additionalProperties":false}}},"required":["geometry","linkGeometryIndex","links","changes"],"additionalProperties":false},"transport":{"type":"string","enum":["car","bus"]},"cameras":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lon":{"type":"number","minimum":-180,"maximum":180},"distanceAlongM":{"type":"number","minimum":0},"maxspeedKph":{"type":"number","exclusiveMinimum":0},"source":{"type":"string","enum":["osm","users"]}},"required":["id","lat","lon","distanceAlongM","maxspeedKph","source"],"additionalProperties":false}},"geometry":{"minItems":2,"type":"array","items":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}],"items":false,"minItems":2,"maxItems":2}},"distanceM":{"type":"number","minimum":0},"durationS":{"type":"number","minimum":0},"freeFlowDurationS":{"type":"number","minimum":0},"departAtMin":{"type":"number","minimum":0,"maximum":1440},"pickup":{"type":"object","properties":{"snapped":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"],"additionalProperties":false},"linkId":{"type":"string","minLength":1},"offsetM":{"type":"number","minimum":0},"walkM":{"type":"number","minimum":0},"method":{"type":"string","enum":["entrance","building","road"]},"entranceId":{"type":"string","minLength":1},"buildingId":{"type":"string","minLength":1},"access":{"type":"string","enum":["yes","destination"]},"zoneId":{"type":"integer","minimum":0,"maximum":9007199254740991},"behindBarrier":{"type":"boolean"}},"required":["snapped","linkId","offsetM","walkM","method","access","behindBarrier"],"additionalProperties":false},"dropoff":{"type":"object","properties":{"snapped":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"],"additionalProperties":false},"linkId":{"type":"string","minLength":1},"offsetM":{"type":"number","minimum":0},"walkM":{"type":"number","minimum":0},"method":{"type":"string","enum":["entrance","building","road"]},"entranceId":{"type":"string","minLength":1},"buildingId":{"type":"string","minLength":1},"access":{"type":"string","enum":["yes","destination"]},"zoneId":{"type":"integer","minimum":0,"maximum":9007199254740991},"behindBarrier":{"type":"boolean"}},"required":["snapped","linkId","offsetM","walkM","method","access","behindBarrier"],"additionalProperties":false},"sources":{"type":"object","properties":{"model":{"type":"number","minimum":0,"maximum":1},"heuristic":{"type":"number","minimum":0,"maximum":1},"observed":{"type":"number","minimum":0,"maximum":1}},"required":["model","heuristic","observed"],"additionalProperties":false},"steps":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"distanceM":{"type":"number","minimum":0},"durationS":{"type":"number","minimum":0},"geometryIndex":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["distanceM","durationS","geometryIndex"],"additionalProperties":false}},"linkIds":{"type":"array","items":{"type":"string","minLength":1}},"warnings":{"default":[],"type":"array","items":{"type":"string"}},"linkSources":{"default":[],"type":"array","items":{"type":"string","enum":["model","heuristic","observed"]}},"linkGeometryIndex":{"default":[],"type":"array","items":{"type":"integer","minimum":0,"maximum":9007199254740991}},"trailingServiceM":{"default":0,"type":"number","minimum":0}},"required":["geometry","distanceM","durationS","freeFlowDurationS","departAtMin","pickup","dropoff","sources","steps","linkIds","warnings","linkSources","linkGeometryIndex","trailingServiceM"],"additionalProperties":false}},"route":{"type":"object","properties":{"lanePath":{"type":"object","properties":{"geometry":{"minItems":2,"type":"array","items":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}],"items":false,"minItems":2,"maxItems":2}},"sections":{"type":"array","items":{"type":"object","properties":{"firstLinkIndex":{"type":"integer","minimum":0,"maximum":9007199254740991},"lastLinkIndex":{"type":"integer","minimum":0,"maximum":9007199254740991},"geometryStart":{"type":"integer","minimum":0,"maximum":9007199254740991},"geometryEnd":{"type":"integer","minimum":0,"maximum":9007199254740991},"networkLinkId":{"type":"string","minLength":1},"entryLaneIndex":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"laneIndex":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"connectorId":{"type":"string","minLength":1},"fallback":{"type":"string","enum":["missing_data","missing_connector","insufficient_room"]},"axis":{"type":"string","enum":["raised","approach"]}},"required":["firstLinkIndex","lastLinkIndex","geometryStart","geometryEnd","entryLaneIndex","laneIndex"],"additionalProperties":false}},"linkGeometryIndex":{"type":"array","items":{"type":"integer","minimum":0,"maximum":9007199254740991}},"links":{"type":"array","items":{"type":"object","properties":{"linkId":{"type":"string","minLength":1},"laneIndex":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"entryLaneIndex":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"networkLinkId":{"type":"string","minLength":1},"connectorId":{"type":"string","minLength":1},"fallback":{"type":"string","enum":["missing_data","missing_connector","insufficient_room"]},"axis":{"type":"string","enum":["raised","approach"]}},"required":["linkId","laneIndex","entryLaneIndex"],"additionalProperties":false}},"changes":{"type":"array","items":{"type":"object","properties":{"linkId":{"type":"string","minLength":1},"networkLinkId":{"type":"string","minLength":1},"fromLaneIndex":{"type":"integer","minimum":0,"maximum":9007199254740991},"toLaneIndex":{"type":"integer","minimum":0,"maximum":9007199254740991},"startM":{"type":"number","minimum":0},"endM":{"type":"number","minimum":0},"geometryStart":{"type":"integer","minimum":0,"maximum":9007199254740991},"geometryEnd":{"type":"integer","minimum":0,"maximum":9007199254740991},"late":{"type":"boolean"}},"required":["linkId","networkLinkId","fromLaneIndex","toLaneIndex","startM","endM","geometryStart","geometryEnd","late"],"additionalProperties":false}},"transitions":{"type":"array","items":{"type":"object","properties":{"networkLinkId":{"type":"string","minLength":1},"laneIndex":{"type":"integer","minimum":0,"maximum":9007199254740991},"toAxis":{"type":"boolean"},"startM":{"type":"number","minimum":0},"endM":{"type":"number","minimum":0},"geometryStart":{"type":"integer","minimum":0,"maximum":9007199254740991},"geometryEnd":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["networkLinkId","laneIndex","toAxis","startM","endM","geometryStart","geometryEnd"],"additionalProperties":false}}},"required":["geometry","linkGeometryIndex","links","changes"],"additionalProperties":false},"transport":{"type":"string","enum":["car","bus"]},"cameras":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"lat":{"type":"number","minimum":-90,"maximum":90},"lon":{"type":"number","minimum":-180,"maximum":180},"distanceAlongM":{"type":"number","minimum":0},"maxspeedKph":{"type":"number","exclusiveMinimum":0},"source":{"type":"string","enum":["osm","users"]}},"required":["id","lat","lon","distanceAlongM","maxspeedKph","source"],"additionalProperties":false}},"geometry":{"minItems":2,"type":"array","items":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}],"items":false,"minItems":2,"maxItems":2}},"distanceM":{"type":"number","minimum":0},"durationS":{"type":"number","minimum":0},"freeFlowDurationS":{"type":"number","minimum":0},"departAtMin":{"type":"number","minimum":0,"maximum":1440},"pickup":{"type":"object","properties":{"snapped":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"],"additionalProperties":false},"linkId":{"type":"string","minLength":1},"offsetM":{"type":"number","minimum":0},"walkM":{"type":"number","minimum":0},"method":{"type":"string","enum":["entrance","building","road"]},"entranceId":{"type":"string","minLength":1},"buildingId":{"type":"string","minLength":1},"access":{"type":"string","enum":["yes","destination"]},"zoneId":{"type":"integer","minimum":0,"maximum":9007199254740991},"behindBarrier":{"type":"boolean"}},"required":["snapped","linkId","offsetM","walkM","method","access","behindBarrier"],"additionalProperties":false},"dropoff":{"type":"object","properties":{"snapped":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"],"additionalProperties":false},"linkId":{"type":"string","minLength":1},"offsetM":{"type":"number","minimum":0},"walkM":{"type":"number","minimum":0},"method":{"type":"string","enum":["entrance","building","road"]},"entranceId":{"type":"string","minLength":1},"buildingId":{"type":"string","minLength":1},"access":{"type":"string","enum":["yes","destination"]},"zoneId":{"type":"integer","minimum":0,"maximum":9007199254740991},"behindBarrier":{"type":"boolean"}},"required":["snapped","linkId","offsetM","walkM","method","access","behindBarrier"],"additionalProperties":false},"sources":{"type":"object","properties":{"model":{"type":"number","minimum":0,"maximum":1},"heuristic":{"type":"number","minimum":0,"maximum":1},"observed":{"type":"number","minimum":0,"maximum":1}},"required":["model","heuristic","observed"],"additionalProperties":false},"steps":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"distanceM":{"type":"number","minimum":0},"durationS":{"type":"number","minimum":0},"geometryIndex":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["distanceM","durationS","geometryIndex"],"additionalProperties":false}},"linkIds":{"type":"array","items":{"type":"string","minLength":1}},"warnings":{"default":[],"type":"array","items":{"type":"string"}},"linkSources":{"default":[],"type":"array","items":{"type":"string","enum":["model","heuristic","observed"]}},"linkGeometryIndex":{"default":[],"type":"array","items":{"type":"integer","minimum":0,"maximum":9007199254740991}},"trailingServiceM":{"default":0,"type":"number","minimum":0}},"required":["geometry","distanceM","durationS","freeFlowDurationS","departAtMin","pickup","dropoff","sources","steps","linkIds","warnings","linkSources","linkGeometryIndex","trailingServiceM"],"additionalProperties":false},"graphId":{"type":"string","minLength":1}},"required":["route","graphId"],"additionalProperties":false},"MatrixResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"durationsS":{"type":"array","items":{"type":"array","items":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]}}},"distancesM":{"type":"array","items":{"type":"array","items":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]}}},"origins":{"type":"array","items":{"type":"object","properties":{"snapped":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"],"additionalProperties":false},"linkId":{"type":"string","minLength":1},"offsetM":{"type":"number","minimum":0},"walkM":{"type":"number","minimum":0},"method":{"type":"string","enum":["entrance","building","road"]},"entranceId":{"type":"string","minLength":1},"buildingId":{"type":"string","minLength":1},"access":{"type":"string","enum":["yes","destination"]},"zoneId":{"type":"integer","minimum":0,"maximum":9007199254740991},"behindBarrier":{"type":"boolean"}},"required":["snapped","linkId","offsetM","walkM","method","access","behindBarrier"],"additionalProperties":false}},"destinations":{"type":"array","items":{"type":"object","properties":{"snapped":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"],"additionalProperties":false},"linkId":{"type":"string","minLength":1},"offsetM":{"type":"number","minimum":0},"walkM":{"type":"number","minimum":0},"method":{"type":"string","enum":["entrance","building","road"]},"entranceId":{"type":"string","minLength":1},"buildingId":{"type":"string","minLength":1},"access":{"type":"string","enum":["yes","destination"]},"zoneId":{"type":"integer","minimum":0,"maximum":9007199254740991},"behindBarrier":{"type":"boolean"}},"required":["snapped","linkId","offsetM","walkM","method","access","behindBarrier"],"additionalProperties":false}},"departAtMin":{"type":"number","minimum":0,"maximum":1440},"graphId":{"type":"string","minLength":1}},"required":["durationsS","distancesM","origins","destinations","departAtMin","graphId"],"additionalProperties":false},"GeocodeResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"street":{"type":"string"},"housenumber":{"type":"string"},"name":{"type":"string"},"category":{"type":"string"},"poiId":{"type":"string","minLength":1},"source":{"type":"string","enum":["osm","overture"]},"lat":{"type":"number"},"lon":{"type":"number"},"buildingId":{"type":"string","minLength":1},"score":{"type":"number","minimum":0,"maximum":1}},"required":["label","lat","lon","buildingId","score"],"additionalProperties":false}}},"required":["results"],"additionalProperties":false},"ReverseGeocodeResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"result":{"type":"object","properties":{"label":{"type":"string"},"street":{"type":"string"},"housenumber":{"type":"string"},"name":{"type":"string"},"category":{"type":"string"},"poiId":{"type":"string","minLength":1},"source":{"type":"string","enum":["osm","overture"]},"lat":{"type":"number"},"lon":{"type":"number"},"buildingId":{"type":"string","minLength":1},"score":{"type":"number","minimum":0,"maximum":1},"distanceM":{"type":"number","minimum":0}},"required":["label","lat","lon","buildingId","score","distanceM"],"additionalProperties":false}},"additionalProperties":false},"ProbesResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"matched":{"type":"array","items":{"type":"object","properties":{"linkId":{"type":"string","minLength":1},"enterTsMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"exitTsMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"speedKph":{"type":"number","exclusiveMinimum":0}},"required":["linkId","enterTsMs","exitTsMs","speedKph"],"additionalProperties":false}},"rejectedPoints":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["matched","rejectedPoints"],"additionalProperties":false},"MetaResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"transports":{"type":"array","items":{"type":"string","enum":["car","bus"]}},"overture":{"type":"object","properties":{"release":{"type":"string","minLength":1},"count":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["release","count"],"additionalProperties":false},"graphId":{"type":"string","minLength":1},"bboxId":{"type":"string","minLength":1},"bbox":{"type":"object","properties":{"south":{"type":"number"},"west":{"type":"number"},"north":{"type":"number"},"east":{"type":"number"}},"required":["south","west","north","east"],"additionalProperties":false},"nodeCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"linkCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"serviceLinkCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"restrictionCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"buildingCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"entranceCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"signalNodeCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"osmSnapshotAt":{"type":"string"},"speedFromOsmShare":{"type":"number","minimum":0,"maximum":1},"profiles":{"type":"object","properties":{"source":{"type":"string","enum":["model","heuristic","observed"]},"linkCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"firstSlotMin":{"type":"number"},"slotMinutes":{"type":"number"},"slotCount":{"type":"number"},"description":{"type":"string"}},"required":["source","linkCount","firstSlotMin","slotMinutes","slotCount","description"],"additionalProperties":false},"observedLinkCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"observed":{"type":"object","properties":{"linkCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"pointCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"lastAt":{"type":"string"},"byTransport":{"type":"object","properties":{"car":{"type":"object","properties":{"linkCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"pointCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"lastAt":{"type":"string"}},"required":["linkCount","pointCount"],"additionalProperties":false},"bus":{"type":"object","properties":{"linkCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"pointCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"lastAt":{"type":"string"}},"required":["linkCount","pointCount"],"additionalProperties":false}},"required":["car","bus"],"additionalProperties":false}},"required":["linkCount","pointCount"],"additionalProperties":false},"attribution":{"type":"string","const":"© OpenStreetMap contributors, ODbL"}},"required":["graphId","bboxId","bbox","nodeCount","linkCount","serviceLinkCount","restrictionCount","buildingCount","entranceCount","speedFromOsmShare","observedLinkCount","attribution"],"additionalProperties":false},"ObservedStats":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"linkCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"pointCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"lastAt":{"type":"string"},"byTransport":{"type":"object","properties":{"car":{"type":"object","properties":{"linkCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"pointCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"lastAt":{"type":"string"}},"required":["linkCount","pointCount"],"additionalProperties":false},"bus":{"type":"object","properties":{"linkCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"pointCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"lastAt":{"type":"string"}},"required":["linkCount","pointCount"],"additionalProperties":false}},"required":["car","bus"],"additionalProperties":false}},"required":["linkCount","pointCount"],"additionalProperties":false},"ApiError":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["bad_request","out_of_bbox","no_route","too_many_points","not_found","internal","unauthorized","rate_limited"]},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"HealthResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"status":{"type":"string","const":"ok"}},"required":["status"],"additionalProperties":false}}}}