TouricalDevelopers
Endpoints

Clients

Manage CRM contacts — individuals or companies — in your tenant.

A client is a CRM contact. Used to attribute trips to a specific party, drive email automations, and reconcile invoices.

MethodPathScope
GET/api/v1/clientsclients:read
POST/api/v1/clientsclients:write
GET/api/v1/clients/{id}clients:read

The Client object:

FieldTypeNotes
idstringOpaque client id.
kindenumindividual or company.
displayNamestringHuman-readable name.
legalNamestring | nullUsed on invoices when set.
emailstring | null
phonestring | null
countryIsostring | nullISO 3166-1 alpha-2.
languagestring | nullBCP 47-ish (e.g. en, fr).
currencystring | nullISO 4217.
vatIdstring | null
tagsstring[]Free-form, max 20 tags, each ≤ 40 chars.
notesstring | nullInternal, never shown to the client.
archivedAtISO 8601 | nullSet when the client was archived.
createdAtISO 8601
updatedAtISO 8601

A successful POST also emits a client.created webhook event to any active subscriptions for the tenant.


GET /api/v1/clients

List clients in the tenant. Cursor-paginated.

Required scope — clients:read

Query parameters

NameTypeDefaultNotes
limitinteger50Max 100.
cursorstring—From a previous response.
kindenum—individual or company. Unknown values are ignored.
archivedenum—true returns only archived; false returns only non-archived; omitted returns both.

Response 200

{
  "data": [ /* Client[] */ ],
  "meta": { "cursor": "cli_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/clientsTry 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
kind
archived
GET /api/v1/clients

POST /api/v1/clients

Create a new CRM contact. Triggers a client.created webhook on success.

Required scope — clients:write

Request body

FieldTypeRequiredNotes
kindenumyesindividual or company.
displayNamestringyes1–200 chars.
legalNamestringno≤ 200 chars.
emailstringnoValid email, ≤ 320 chars.
phonestringno≤ 40 chars.
countryIsostringnoExactly 2 chars, ISO 3166-1 alpha-2.
languagestringno≤ 20 chars.
currencystringnoExactly 3 chars, ISO 4217.
vatIdstringno≤ 40 chars.
notesstringno≤ 2000 chars.
tagsstring[]noMax 20 entries, each ≤ 40 chars.

Response 201

{ "data": /* Client */ }

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

POST/api/v1/clientsTry it

Creates a new CRM contact and emits a client.created webhook on success.

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/clients

GET /api/v1/clients/{id}

Fetch a single client by id.

Required scope — clients:read

Path parameters

NameTypeRequiredNotes
idstringyesClient id.

Response 200

{ "data": /* Client */ }

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

GET/api/v1/clients/{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/clients/{id}

On this page