Search or browse the catalog
GET/v1/catalog/entities
The agency's catalog (products, destinations and places): destinations (destino), places (punto), accommodation (alojamiento), activities and services. Filters: kind and tag. Without q, browses the most recently changed entries first, paged by nextCursor — and takes updatedSince, externalId, includeDeleted and deletedOnly. For a polling trigger, pass the last updatedAt you saw as updatedSince with includeDeleted=true, and follow nextCursor until it is null. With q, returns one page of the best matches, ranked, with no cursor. Summaries only; GET /catalog/entities/{entityId} returns an entry in full.
Permissions: catalog:read · Kind: read · Cost: 1 unit · MCP tool search_catalog
Path parameters
None.
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
q |
string | max 200 chars | |
tag |
string | max 60 chars | |
limit |
integer | 1–100, default 25 | |
cursor |
string | max 500 chars | |
kind |
"destino" | "punto" | "alojamiento" | "actividad" | "servicio" | ||
updatedSince |
datetime | Only entries changed at or after this instant — a polling trigger's watermark (deletes and restores count as changes). | |
externalId |
string | The entry with this external id. max 200 chars | |
includeDeleted |
boolean | "true" | "false" | Also return deleted entries (deletedAt set) — what a sync needs to see deletions. |
|
deletedOnly |
boolean | "true" | "false" | Only deleted entries — what can be restored. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
object |
"list" | yes | |
data |
object[] | yes | |
data[].object |
"catalog_entity_summary" | yes | |
data[].id |
uuid | yes | |
data[].kind |
"destino" | "punto" | "alojamiento" | "actividad" | "servicio" | yes | |
data[].name |
string | yes | |
data[].placeId |
string | yes | |
data[].cityKey |
string | yes | |
data[].externalId |
string | yes | |
data[].tags |
string[] | yes | |
data[].partOf |
string | null | yes | |
data[].category |
string | yes | |
data[].coverUrl |
string | null | yes | |
data[].updatedAt |
string | yes | |
data[].deletedAt |
string | null | 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