API v1 · Документация

MediaLAN Routing API

Сервис маршрутизации и геокодинга для доставки, такси и логистики. Построение маршрутов и работа с адресами — по простому HTTP API с ключами доступа.

1. О сервисе

MediaLAN Routing API — это HTTP-сервис маршрутизации и геокодинга, построенный на собственном развёртывании с данными OpenStreetMap. Сервис принимает координаты или адреса, возвращает оптимальные маршруты, расстояния, время в пути и адресные описания — всё, что нужно приложению доставки, такси или логистической платформе.

В отличие от публичных картографических API, сервис работает с фиксированным набором дорожных данных, не зависит от внешних квот картографических гигантов и предоставляет предсказуемую скорость ответов. Доступ организован по API-ключам с суточными квотами.

Кому подойдёт

🚚 Службы доставки

Расчёт маршрутов курьеров, стоимость поездки по расстоянию и времени, планирование логистики.

🚕 Такси-агрегаторы

Оценка стоимости поездки до подачи машины, построение маршрута в диспетчерской панели.

📦 Логистика и WMS

Оптимизация доставок, расчёт пробега транспорта, геокодация адресов клиентов.

🗺 Гео-стартапы

Быстрый старт картографического продукта без собственной роутинг-инфраструктуры.

📊 Аналитика

Транспортные расчёты, зоны доступности, офлайн-анализ дорожных сетей.

🏢 Внутренние системы

Маршрутизация внутри корпоративных приложений: от CRM до полевых выездных работ.

Возможности

  • Построение маршрутов между двумя точками — расстояние (метры), время (секунды) и полная геометрия (GeoJSON LineString или polyline) с ограничивающим прямоугольником (bbox) для автозума;
  • Прямой геокодинг — поиск координат по текстовому адресу с короткими человекочитаемыми метками («ул. Чичерина, 37Б, Челябинск»);
  • Обратный геокодинг — адрес по координатам с полной адресной структурой;
  • Контроль квот — остаток суточного лимита в каждом ответе и в заголовках X-RateLimit-*;
  • Статус ключа — метод status для мониторинга расхода запросов из вашего приложения.

Покрытие и профили

География данных: на данный момент на сервере загружены данные Уральского федерального округа (Челябинская, Свердловская, Курганская, Тюменская области, ХМАО — ЯНАО). Маршруты и адреса вне этих границ не строятся.

Профиль маршрутизации: текущая сборка использует профиль driving (автомобильный).

2. Тарифы и лимиты

Лимиты считаются в запросах за календарные сутки (сброс в 00:00 по московскому времени).

ТарифЗапросов в суткиСрок действияКак получить ключ
Демо 50 бессрочно Самостоятельно в личном кабинете (не более 1 ключа на аккаунт)
Базовый 5 000 по подписке Выдаётся администратором сервиса и привязывается к вашему логину (email)
Премиум 50 000 по подписке
Премиум + 100 000 по подписке
Методы route, geocode и reverse расходуют квоту (1 запрос = 1 единица). Метод status — бесплатный и квоту не расходует.

3. Быстрый старт

  1. Зарегистрируйтесь в личном кабинете (email и пароль).
  2. В разделе «Демо-ключ» нажмите «Сгенерировать демо-ключ» — ключ действует бессрочно и даёт 50 запросов в сутки.
  3. Выполните первый запрос:
curl -G "https://api.medialan74.ru/api/v1/route" \
     -H "X-API-Key: <ВАШ_КЛЮЧ>" \
     --data-urlencode "from=61.4030,55.1644" \
     --data-urlencode "to=61.3750,55.1900"

Ответ:

{
  "status": "ok",
  "data": {
    "distance": 5530.7,
    "duration": 604.4,
    "profile": "driving",
    "geometry": {
      "type": "LineString",
      "coordinates": [[61.40301, 55.16438], [61.40289, 55.16512], "..."]
    },
    "bbox": [[61.37, 55.16], [61.40, 55.19]]
  },
  "quota": {
    "limit": 50,
    "used": 1,
    "remaining": 49,
    "reset": "2026-10-17T00:00:00+03:00"
  }
}

Где distance — метры, duration — секунды, geometry — массив точек [долгота, широта] в порядке GeoJSON.

4. Авторизация

Типы ключей

Демо-ключКлюч по подписке
Лимит50 запросов/сутки5 000 / 50 000 / 100 000 (по тарифу)
Срок действиябессрочнопо условиям подписки, отзывается администратором
Количество1 на аккаунтпо договорённости
Выдачасамостоятельно в ЛКадминистратором сервиса

Ключ можно передать одним из трёх способов (приоритет — сверху вниз):

  1. Заголовок X-API-Key: <ключ> — рекомендуется;
  2. Заголовок Authorization: Bearer <ключ>;
  3. GET-параметр ?api_key=<ключ> — удобно для отладки из браузера.
Запросы без ключа или с неверным ключом отклоняются с кодом 401. Доступ к API без ключа технически невозможен. Не публикуйте ключ в открытых репозиториях и клиентском коде, доступном посторонним (например, в мобильных приложениях храните на бэкенде).

Квоты и заголовки

Счётчик суточных запросов сбрасывается в полночь (00:00, Europe/Moscow). В каждом ответе присутствует блок:

"quota": {
  "limit": 50,        // всего запросов в сутки
  "used": 12,         // израсходовано сегодня
  "remaining": 38,    // осталось
  "reset": "2026-10-17T00:00:00+03:00"   // когда сбросится
}

Та же информация дублируется в HTTP-заголовках:

  • X-RateLimit-Limit — суточный лимит;
  • X-RateLimit-Remaining — остаток;
  • X-RateLimit-Reset — время сброса (ISO 8601).

При исчерпании квоты API возвращает 429 — запрос не будет выполнен до следующих суток.

5. Методы API

Базовый URL: https://api.medialan74.ru/api/v1 · Все методы — GET · Формат ответа — JSON (UTF-8).

route — построение маршрута

GET /api/v1/route?from={lon1},{lat1}&to={lon2},{lat2}

требуется ключ расходует квоту Возвращает оптимальный маршрут между двумя точками: расстояние, время в пути и геометрию для отрисовки на карте.

Параметры

ПараметрТипОбязательностьОписание
fromstringобязательно Точка отправления в формате долгота,широта (например 61.4030,55.1644). WGS-84.
tostringобязательно Точка назначения, тот же формат.
profilestringопционально Профиль маршрутизации. Сейчас доступен driving (по умолчанию).
overviewstringопционально Детализация геометрии: full (по умолчанию), simplified, false.
geometriesstringопционально Формат геометрии: geojson (по умолчанию) или polyline.

Пример

curl -G "https://api.medialan74.ru/api/v1/route" \
     -H "X-API-Key: <ключ>" \
     --data-urlencode "from=61.4030,55.1644" \
     --data-urlencode "to=61.3750,55.1900" \
     --data-urlencode "profile=driving"

Ответ (200)

{
  "status": "ok",
  "data": {
    "distance": 5530.7,          // метры
    "duration": 604.4,           // секунды
    "profile": "driving",
    "geometry": {
      "type": "LineString",
      "coordinates": [[61.40301, 55.16438], [61.40289, 55.16512]]
    },
    "bbox": [[61.37, 55.16], [61.40, 55.19]]
  },
  "quota": { "limit": 50, "used": 3, "remaining": 47, "reset": "..." }
}

Ошибки метода

  • 400 invalid_params — координаты не переданы или не соответствуют формату lon,lat;
  • 400 invalid_profile — профиль не входит в список доступных;
  • 502 upstream_error — бэкенд маршрутизации не смог построить маршрут.

geocode — прямой геокодинг

GET /api/v1/geocode?q={адрес}&limit=5

требуется ключ расходует квоту Поиск координат по текстовому адресу. Возвращает до limit вариантов с короткой меткой (label) и полным адресом (display_name).

Параметры

ПараметрТипОбязательностьОписание
qstringобязательно Адресный запрос, минимум 3 символа (например: Челябинск ул. Чичерина 37Б).
limitintопционально Число результатов: 1–10, по умолчанию 5.

Пример

curl -G "https://api.medialan74.ru/api/v1/geocode" \
     -H "X-API-Key: <ключ>" \
     --data-urlencode "q=Челябинск ул. Чичерина 37Б" \
     --data-urlencode "limit=3"

Ответ (200)

{
  "status": "ok",
  "data": [
    {
      "label": "ул. Чичерина, 37Б, Челябинск",
      "display_name": "37Б, улица Чичерина, Калининский район, Челябинск, ...",
      "lat": 55.1751159,
      "lon": 61.3034954,
      "type": "house",
      "importance": 0.521
    }
  ],
  "quota": { "limit": 50, "used": 4, "remaining": 46, "reset": "..." }
}

Ошибки метода

  • 400 invalid_params — параметр q отсутствует или короче 3 символов;
  • 502 upstream_error — геокодер недоступен.

reverse — обратный геокодинг

GET /api/v1/reverse?lat={lat}&lon={lon}

требуется ключ расходует квоту Определяет адрес по координатам — например, по точке клика на карте или текущей позиции курьера.

Параметры

ПараметрТипОбязательностьОписание
latnumberобязательно Широта, от −90 до 90.
lonnumberобязательно Долгота, от −180 до 180.

Пример

curl -G "https://api.medialan74.ru/api/v1/reverse" \
     -H "X-API-Key: <ключ>" \
     --data-urlencode "lat=55.1751159" \
     --data-urlencode "lon=61.3034954"

Ответ (200)

{
  "status": "ok",
  "data": {
    "label": "ул. Чичерина, 37Б, Челябинск",
    "display_name": "37Б, улица Чичерина, Калининский район, Челябинск, ...",
    "lat": 55.1751159,
    "lon": 61.3034954,
    "address": {
      "house_number": "37Б",
      "road": "улица Чичерина",
      "city": "Челябинск",
      "postcode": "454128",
      "country": "Россия"
    }
  },
  "quota": { "limit": 50, "used": 5, "remaining": 45, "reset": "..." }
}

Ошибки метода

  • 400 invalid_params — координаты отсутствуют или вне допустимых диапазонов;
  • 502 upstream_error — адрес не найден или геокодер недоступен.

status — статус ключа и квоты

GET /api/v1/status

требуется ключ квоту не расходует Возвращает тип ключа, тариф и остаток суточной квоты. Используйте для индикаторов расхода в вашем приложении.

Ответ (200)

{
  "status": "ok",
  "data": {
    "key_type": "demo",        // demo | subscription
    "tariff": null,            // basic | premium | premium_plus | null
    "daily_limit": 50,
    "used_today": 5,
    "remaining": 45,
    "reset": "2026-10-17T00:00:00+03:00",
    "key_status": "active"
  },
  "quota": { "limit": 50, "used": 5, "remaining": 45, "reset": "..." }
}

6. Ошибки

Все ошибки возвращаются в едином формате:

{
  "status": "error",
  "error": {
    "code": "quota_exceeded",
    "message": "Суточная квота запросов исчерпана. Лимит: 50 запросов/сутки."
  }
}
HTTPКодЗначение
400invalid_paramsНекорректные или отсутствующие параметры запроса.
400invalid_profileУказан неизвестный профиль маршрутизации.
401missing_api_keyAPI-ключ не передан.
401invalid_api_keyКлюч не найден в системе.
403key_revokedКлюч отозван администратором.
403key_expiredСрок действия ключа истёк.
404unknown_endpointНеизвестный метод API.
405method_not_allowedДопустим только GET.
429quota_exceededСуточная квота исчерпана, попробуйте после сброса.
502upstream_errorОшибка бэкенда маршрутизации или геокодера.

7. Примеры интеграции

JavaScript (fetch)

const API = "https://api.medialan74.ru/api/v1";
const KEY = "<ВАШ_КЛЮЧ>";

async function buildRoute(from, to) {
  const url = new URL(API + "/route");
  url.searchParams.set("from", from);   // "61.4030,55.1644"
  url.searchParams.set("to", to);
  url.searchParams.set("profile", "driving");

  const res = await fetch(url, { headers: { "X-API-Key": KEY } });
  const json = await res.json();

  if (json.status !== "ok") {
    throw new Error(json.error.message);
  }
  console.log("Расстояние, м:", json.data.distance);
  console.log("Время, сек:", json.data.duration);
  console.log("Остаток квоты:", json.quota.remaining);
  return json.data;
}

PHP (cURL)

$ch = curl_init('https://api.medialan74.ru/api/v1/route?' . http_build_query([
    'from' => '61.4030,55.1644',
    'to'   => '61.3750,55.1900',
]));
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['X-API-Key: <ВАШ_КЛЮЧ>'],
]);
$response = json_decode(curl_exec($ch), true);

Python (requests)

import requests

r = requests.get(
    "https://api.medialan74.ru/api/v1/geocode",
    headers={"X-API-Key": "<ВАШ_КЛЮЧ>"},
    params={"q": "Челябинск ул. Чичерина 37Б", "limit": 3},
)
print(r.json()["data"][0]["label"])

8. Ограничения и рекомендации

  • Границы данных. На данный момент маршрутизация работает только в пределах (Уральского федерального округа). Точки за пределами вернут ошибку построения маршрута.
  • Производительность. Среднее время ответа route — десятки миллисекунд;
  • Кэширование. Рекомендуем кэшировать одинаковые запросы на вашей стороне — это экономит квоту.
  • Безопасность. Передавайте ключ только в заголовках; GET-параметр api_key предназначен для отладки.
  • Честное использование. Квоты защищают сервис от перегрузки; при необходимости бо́льших лимитов — свяжитесь с администратором для перехода на тариф выше.