TouricalDevelopers
Endpoints

Trips

List, fetch, create, and partially update trips in your tenant's catalog.

A trip is an itinerary — a multi-day plan with days, segments, stops, and pricing. Trips become bookable on the storefront once published.

MethodPathScope
GET/api/v1/tripstrips:read
POST/api/v1/tripstrips:write
GET/api/v1/trips/{id}trips:read
PATCH/api/v1/trips/{id}trips:write

The Trip object:

FieldTypeNotes
idstringOpaque, cuid-style.
tripNumberstringPer-tenant human-friendly reference, e.g. "TR-2026-00042". Not a counter — never parse it as a number.
titlestring1–200 chars.
statusenumdraft, active, sent, accepted, rejected, archived.
tripModeenumtailor_made or template.
dateModeenumdeparture_based or range_based.
publicSlugstring | nullSet when the trip is published to the storefront.
publishedAtISO 8601 | nullWhen the trip became publicly bookable.
unpublishedAtISO 8601 | nullWhen publishing was revoked.
startDateISO 8601 | nullStart of the trip window.
endDateISO 8601 | nullEnd of the trip window.
daysCountintegerTrip duration in days.
startCityIdstringLibrary city id for departure.
endCityIdstringLibrary city id for return.
transportModeenumown_fleet or outsourced.
pricingDisplayModeenumper_person, per_couple, total_group.
shortDescriptionstring | null≤ 500 chars.
longDescriptionstring | null≤ 8000 chars.
clientIdstring | nullWhen the trip is built for a specific CRM contact.
notesstring | nullOperator notes — never shown to travellers.
createdAtISO 8601
updatedAtISO 8601

GET /api/v1/trips

List trips visible to the tenant. Cursor-paginated, default order by id ascending.

Required scope — trips:read

Query parameters

NameTypeDefaultNotes
limitinteger50Max 100.
cursorstring—From a previous response's meta.cursor.
statusstring—Filter to one of the trip statuses. Unknown values are ignored.
publishedAt[gte]ISO 8601—Only trips published at or after this time.

Response 200 — application/json

{
  "data": [ /* Trip[] */ ],
  "meta": { "cursor": "trp_a1b2c3" | null, "hasMore": true | false }
}

Errors — 401 unauthorized, 403 (scope-required, or plan-required when the plan has no API access), 429 rate-limited.

GET/api/v1/tripsTry it

Requests are proxied through this docs site so CORS doesn't block the call. Use a sandbox token if you don't want test calls hitting live data.

Query parameters

limit
cursor
status
publishedAt[gte]
GET /api/v1/trips

POST /api/v1/trips

Create a new trip. The token's creator becomes the audit "actor" for the new row.

Required scope — trips:write

Request body — application/json

FieldTypeRequiredNotes
titlestringyes1–200 chars.
startDatestring (YYYY-MM-DD)yes
endDatestring (YYYY-MM-DD)noMust be ≥ startDate.
daysCountintegeryes1–365.
startCityIdstringyesLibrary city id.
endCityIdstringyesLibrary city id.
transportModeenumnoown_fleet (default) or outsourced.
pricingDisplayModeenumnoper_person (default), per_couple, total_group.
notesstringno≤ 2000 chars.
shortDescriptionstringno≤ 500 chars.
longDescriptionstringno≤ 8000 chars.
clientIdstringnoMust belong to your tenant.

Response 201 — application/json

{ "data": /* Trip */ }

Errors — 401 unauthorized; 403 — scope-required, plan-required, or forbidden when the plan's trip quota is full; 422 validation-failed (schema failures, and clientId does not belong to this tenant); 429 rate-limited.

POST/api/v1/tripsTry it

Creates a new trip in your tenant. Returns 201 with the Trip object.

Requests are proxied through this docs site so CORS doesn't block the call. Use a sandbox token if you don't want test calls hitting live data.

POST /api/v1/trips

GET /api/v1/trips/{id}

Fetch a single trip by id.

Required scope — trips:read

Path parameters

NameTypeRequiredNotes
idstringyesTrip id.

Response 200 — application/json

{ "data": /* Trip */ }

Errors — 401, 403 scope-required, 404 not-found.

GET/api/v1/trips/{id}Try it

Requests are proxied through this docs site so CORS doesn't block the call. Use a sandbox token if you don't want test calls hitting live data.

Path parameters

idrequired
GET /api/v1/trips/{id}

PATCH /api/v1/trips/{id}

Partial update. Fields omitted from the body are left unchanged.

Required scope — trips:write

Path parameters

NameTypeRequiredNotes
idstringyesTrip id.

Request body — application/json (all fields optional)

FieldTypeNotes
titlestring1–200 chars.
startDatestring (YYYY-MM-DD)
endDatestring (YYYY-MM-DD) | nullNull to clear. Must be ≥ startDate.
daysCountinteger1–365.
notesstring | null≤ 2000 chars.
shortDescriptionstring | null≤ 500 chars.
longDescriptionstring | null≤ 8000 chars.
clientIdstring | nullMust belong to your tenant, or null to detach.

Response 200 — application/json

{ "data": /* Trip */ }

Errors — 401, 403 scope-required, 404 not-found, 422 validation-failed, 429 rate-limited.

PATCH/api/v1/trips/{id}Try it

Requests are proxied through this docs site so CORS doesn't block the call. Use a sandbox token if you don't want test calls hitting live data.

Path parameters

idrequired
PATCH /api/v1/trips/{id}

On this page