Skip to content

Traffic ​

GET /v1/traffic/typical gives the usual speed on the roads inside a box, for the hour band of this moment. It is a typical speed, not a live one. The answer says "label": "ердийн" (typical). Show that word beside the layer, and never write "live" there.

The three bands ​

The band is read from the Ulaanbaatar clock at the moment of the call.

BandWhenIn plain words
am_peakMonday to Friday, 07:00 to 09:59Morning rush: people going to work and school.
pm_peakMonday to Friday, 17:00 to 19:59Evening rush: people going home.
off_peakEvery other hour, and all of Saturday and SundayThe rest of the week.

A trip counts in the band of its first stored point. The speed of a road is the total metres over the total seconds of the counted segments in that band.

Call it ​

Any key with tiles:read works, so the public map key does. The call counts like a tile request: no per-minute limit, and the answer is cached for 5 minutes. Send the box of the map view, at most 1 degree on each side. Draw from zoom 12 up.

sh
curl -H "Authorization: Bearer $DOCK_KEY" \
  "https://geo.dock.mn/v1/traffic/typical?bbox=106.91,47.912,106.925,47.924"

What a road needs to show ​

A road appears only when it passes the group rule: 3 or more organizations, and 5 or more trips after the biggest organization. All partners count together, and no organization is named. No trip, vehicle, time or organization is in the answer.

A road without enough traces is left out. Draw nothing there, not grey and not green: no road in the answer means no speed, not an empty road.

A real answer ​

Recorded from geo.dock.mn (API 0.96.1) on 2026-10-20, 17:12 Ulaanbaatar time, for the box around Sukhbaatar square. It was a Tuesday evening, so the band is pm_peak. No road in the box passes the group rule yet, so features is empty and typical.month is null. That is a correct answer, and the page draws nothing from it.

json
{
  "type": "FeatureCollection",
  "kind": "typical",
  "typical": {
    "label": "ердийн",
    "band": "pm_peak",
    "hours": "Monday to Friday, 17:00 to 19:59 Ulaanbaatar time",
    "month": null
  },
  "rule": {
    "min_orgs": 3,
    "min_trips_without_largest_org": 5,
    "orgs": "all partners together; test and internal organizations left out; no organization is named",
    "road": "an OSM way, from Valhalla map matching (Meili) of the stored points; the line is dock's current road with that OSM id",
    "segment": "two stored points of a trip 1 to 60 seconds apart, at 3 to 130 km/h, its midpoint more than 200 m from the first and last point of the trip, both points matched to the same way",
    "km_h": "the counted segments' total meters over their total seconds on the way, to 0.1",
    "period": "Ulaanbaatar calendar month, published 14 days after it ends"
  },
  "source": "trace",
  "source_date": null,
  "features": []
}

When a road passes the rule, it is one Feature with a LineString or MultiLineString and these properties: km_h (to 0.1), highway, name_mn and name_en (null when unknown). typical.month is the newest closed month that has any road in the box, as YYYY-MM.

In the JS SDK the call is dock.trafficTypical(bbox). The full field list is in the API reference.