Isochrone endpoint

Compute a travel-time area from a coordinate. Answers “everywhere you can reach within N minutes” by driving, walking, cycling, or transit.

GET https://{country}.yatmo.com/isochrone LicenseKey header

Computed live via the routing engine. Measured 165 to 212 ms for a 15 minute walking area in Brussels on 21 September 2026; transit areas take longer.

Request

Name In Type Description
travelMode required query string or int Either the name or the number, they are interchangeable: Driving or 1, Walking or 2, Bicycling or 3, Transit or 4. Both spellings return byte-identical responses.
latitude required query double Origin latitude.
longitude required query double Origin longitude.
numberOfSeconds required query int Travel-time limit in seconds. Standard values: 300 (5 min), 600 (10 min), 1200 (20 min). Larger values take much longer to compute.

Response

The body is a bare GeoJSON geometry, not a Feature and not a FeatureCollection. There is no features array to index into.

Handle both types. Code that assumes a Polygon will break on the first transit call. Set aside the zero-area pieces before drawing or testing containment.

The shape of the response, not an executable response:

{
  "type": "Polygon",
  "coordinates": [
    [ [lon, lat], [lon, lat], [lon, lat], [lon, lat] ]
  ]
}

Each ring is a list of [longitude, latitude] positions, in that order, whose first and last positions are identical: at least four positions per ring, as RFC 7946 requires. Complete, valid responses for the Grand-Place example: walking, Polygon and public transport, MultiPolygon.

Examples

curl -H 'LicenseKey: YOUR_KEY' \
  'https://be.yatmo.com/isochrone?travelMode=Walking&latitude=50.846714&longitude=4.352514&numberOfSeconds=900'
const url = 'https://be.yatmo.com/isochrone'
  + '?travelMode=Walking&latitude=50.846714&longitude=4.352514&numberOfSeconds=900';

const res = await fetch(url, { headers: { LicenseKey: 'YOUR_KEY' } });
const geometry = await res.json();

// Polygon and MultiPolygon nest their rings differently, so normalise once
// and the rest of your code stops caring which mode was requested.
const polygons = geometry.type === 'MultiPolygon'
  ? geometry.coordinates
  : [geometry.coordinates];

const ringCount = polygons.length;
const outerRing = polygons[0][0];          // [[lon, lat], [lon, lat], ...]

// Ready to hand to MapLibre, Leaflet or turf as a GeoJSON geometry:
map.getSource('reachable').setData(geometry);
$qs = http_build_query([
    'travelMode' => 'Walking',
    'latitude' => 50.846714,
    'longitude' => 4.352514,
    'numberOfSeconds' => 900,
]);
$ch = curl_init("https://be.yatmo.com/isochrone?$qs");
curl_setopt($ch, CURLOPT_HTTPHEADER, ['LicenseKey: YOUR_KEY']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$geometry = json_decode(curl_exec($ch), true);
curl_close($ch);

$polygons = $geometry['type'] === 'MultiPolygon'
    ? $geometry['coordinates']
    : [$geometry['coordinates']];
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("LicenseKey", "YOUR_KEY");

var qs = "travelMode=Walking&latitude=50.846714&longitude=4.352514&numberOfSeconds=900";
var json = await http.GetStringAsync($"https://be.yatmo.com/isochrone?{qs}");

using var doc = JsonDocument.Parse(json);
var type = doc.RootElement.GetProperty("type").GetString();  // Polygon or MultiPolygon

Variants

GET /isochrone/GetMultipleTimes?travelMode=Walking&latitude=50.846714&longitude=4.352514&language=EN

[
  { "label": "5 min",  "iso": { "type": "Polygon", "coordinates": [ ... ] } },
  { "label": "10 min", "iso": { "type": "Polygon", "coordinates": [ ... ] } },
  { "label": "20 min", "iso": { "type": "Polygon", "coordinates": [ ... ] } }
]

The label is already localised for the language you asked for, so it can be shown as is. Each iso follows the same rules as the single geometry above.

Notes

Travel time and isochrone API
Commute search and accessibility on property pages. Read more on yatmo.com.

See a travel-time area on a property page