List trips
GET/v1/trips
Lists the agency's live trips (archived ones are at GET /trips/archived), most recently changed first. Filter by q (text in the title), publication, commercialState, ownerId, updatedSince and up to 5 metadata[key]=value pairs, which must all match. For a polling trigger (n8n, Zapier), pass the last updatedAt you saw as updatedSince with sort=updatedAt, and follow nextCursor until it is null.
Permissions: trips:read · Kind: read · Cost: 1 unit · MCP tool list_trips
Path parameters
None.
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
limit |
integer | 1–100, default 25 | |
cursor |
string | max 500 chars | |
sort |
"updatedAt" | "-updatedAt" | "createdAt" | "-createdAt" | default "-updatedAt" | |
updatedSince |
datetime | ||
q |
string | max 200 chars | |
publication |
"draft" | "published" | ||
commercialState |
"nueva" | "propuesta_enviada" | "aceptada" | "reserva_provisional" | "reservada" | "rechazada" | "cancelada" | ||
ownerId |
uuid | ||
metadata |
object |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
object |
"list" | yes | |
data |
object[] | yes | |
data[].object |
"trip" | yes | |
data[].id |
uuid | yes | |
data[].code |
string | yes | |
data[].title |
string | yes | |
data[].startDate |
string | null | yes | |
data[].endDate |
string | null | yes | |
data[].publication |
"draft" | "published" | yes | |
data[].commercialState |
"nueva" | "propuesta_enviada" | "aceptada" | "reserva_provisional" | "reservada" | "rechazada" | "cancelada" | yes | |
data[].travelers |
integer | yes | |
data[].ownerId |
uuid | null | yes | |
data[].design |
object | null | yes | |
data[].design.version |
1 | yes | |
data[].design.originCity |
string | yes | |
data[].design.stops |
object[] | yes | max 60 items |
data[].design.returnCity |
string | null | yes | |
data[].design.returnTransfer |
object | null | yes | |
data[].design.originPlace |
object | default {"placeId":"","lat":null,"lng":null,"formattedAddress":""} | |
data[].design.returnPlace |
object | default {"placeId":"","lat":null,"lng":null,"formattedAddress":""} | |
data[].presentation |
object | yes | |
data[].presentation.logoUrl |
uri | null | ||
data[].presentation.brandColor |
string | null | ||
data[].presentation.fontFamily |
"inter" | "montserrat" | "poppins" | "lora" | "playfair" | "source-sans" | null | ||
data[].presentation.headerMedia |
object | null | ||
data[].profile |
object | yes | |
data[].profile.pace |
"relajado" | "equilibrado" | "intenso" | null | default null | |
data[].profile.profiles |
"primera_vez" | "repetidor" | "familia_ninos" | "pareja" | "grupo" | "senior" | "movilidad_reducida" | "cultural" | "gastronomico" | "naturaleza" | "fotografia" | "otaku" | "compras" | "presupuesto_ajustado" | "premium"[] | default [] | |
data[].profile.mobility |
"normal" | "reducida" | default "normal" | |
data[].profile.avoid |
string[] | default [] | |
data[].profile.notes |
string | default "" | |
data[].coverImageUrl |
string | null | yes | |
data[].coverage |
object | null | yes | |
data[].coverage.state |
"sin_cobros" | "pago_parcial" | "pagado" | yes | |
data[].coverage.percent |
integer | yes | |
data[].coverage.overpaid |
boolean | yes | |
data[].metadata |
object | yes | |
data[].appUrl |
string | null | yes | |
data[].publicUrl |
string | null | yes | |
data[].createdAt |
string | yes | |
data[].updatedAt |
string | yes | |
nextCursor |
string | null | 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 reached