Get a route
GET/v1/catalog/routes/{routeId}
Returns one route in full. A route is a day's walk through catalog places: stops in order, each a catalog place (punto) or activity (actividad) by placeId, with its own visit minutes (ownMinutes, null = the place's) and the LEG that arrives at it from the previous stop (mode: walking | transit | driving | bicycling, minutes, prose). intro and closing are the texts before and after. rules are how the planner uses it (structured: true lets it propose the route as a whole day). destinos and durationMin are derived when it is saved; a leg marked stale was measured for a different previous stop.
Permissions: catalog:read · Kind: read · Cost: 1 unit · MCP tool get_route
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
routeId |
uuid | yes |
Query parameters
None.
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
object |
"route" | yes | |
id |
uuid | yes | |
title |
string | yes | |
externalId |
string | yes | |
intro |
object[] | yes | |
stops |
object[] | yes | |
stops[].placeId |
string | yes | |
stops[].name |
string | yes | The place's name — or the stop's stored title when its place no longer resolves. |
stops[].placeMinutes |
integer | null | yes | The place's own visit minutes; null when the place is gone. |
stops[].ownMinutes |
integer | null | yes | This route's override for the stop; null = the place's. |
stops[].leg |
object | null | yes | How you get here from the previous stop; null on the first stop, or when nothing is known. |
stops[].leg.mode |
"walking" | "transit" | "driving" | "bicycling" | null | yes | |
stops[].leg.minutes |
integer | null | yes | |
stops[].leg.prose |
object[] | yes | |
stops[].leg.source |
string | yes | Provenance: source (authored), routes (measured by Google), manual (typed). |
stops[].leg.stale |
boolean | yes | true: measured for a different previous stop — the minutes no longer describe this leg. |
closing |
object[] | yes | |
rules |
object | yes | |
rules.structured |
boolean | yes | |
rules.base |
string | yes | |
rules.tipo |
"dia_entero" | "medio_dia" | "excursion" | "tematica" | "con_experiencias" | "llegada" | null | yes | |
rules.duracion |
"medio_dia" | "dia_entero" | "dia_entero_largo" | null | yes | |
rules.ritmo |
"relajado" | "equilibrado" | "intenso" | null | yes | |
rules.incompatibleDias |
"lunes" | "martes" | "miercoles" | "jueves" | "viernes" | "sabado" | "domingo"[] | yes | |
rules.requiereReserva |
boolean | yes | |
rules.notasUso |
string[] | yes | |
destinos |
object[] | yes | Every destino the stops sit in (derived when the route is saved). |
destinos[].id |
uuid | yes | |
destinos[].name |
string | yes | |
durationMin |
integer | null | yes | The route's computed length in minutes; null while never computed. |
updatedAt |
string | yes |
Errors
Errors are problem details. Besides the refusals described above, any call like this one can return:
invalid_request— Invalid requestunauthorized— Missing or invalid API keyinsufficient_scope— Missing permissionrate_limited— Rate limit reachednot_found— Not found