Itsy Docs
Settings

Workspace API

A REST API that lets external booking engines and partner systems browse trips, check availability, and create orders in your workspace.

The Workspace API is a REST interface that allows external applications — such as custom booking websites, partner systems, or CRM integrations — to interact with your workspace programmatically. Through the API, external systems can browse your trips, check real-time availability and pricing, and create fully processed orders with automatic payment link generation.

How It Works

External applications authenticate using an API key included in every request. Once authenticated, they can list your trips, retrieve detailed product and pricing information, check availability for specific participant combinations, and submit orders. When an order is created through the API, Itsy handles everything automatically: client record creation, pricing calculation, payment link generation, and confirmation email delivery.

Authentication

Every request must include your API key in the x-api-key header. The key identifies your workspace and enforces the configured rate limit. See API Keys for how to create and manage keys.

Requests without a valid key receive a 401 Unauthorized response.

Available Endpoints

All endpoints are prefixed with /v1/. The full base URL depends on your environment.

Labels

List Labels

GET /v1/labels

Retrieve all active labels in your workspace. Labels are used to tag and categorize trips. External systems can use these labels to filter trips or build themed booking experiences.

Each label in the response includes its name and slug. Use the slug values when filtering trips by label.

Trip Categories

List Trip Categories

GET /v1/trips/categories

Retrieve all active trip categories in your workspace. Trip categories let you organize trips into groups such as "Day Tours", "Multi-day Adventures", or "Cruises".

Each category in the response includes its name and slug. Use the slug values when filtering trips by category.

Trips

List Trips

GET /v1/trips

Retrieve all bookable trips in your workspace with optional filters.

ParameterTypeDescription
departingFromDate (optional)Only trips departing on or after this date
departingToDate (optional)Only trips departing on or before this date
labelsRepeated string (optional)One or more label slugs to filter by
categoriesRepeated string (optional)One or more category slugs to filter by
pageNumber (optional)Page number, starting at 1
pageSizeNumber (optional)Items per page (default 25, max 100)

Only trips with future departures are returned. Static trips are filtered by their departure date, while dynamic trips are included if they have at least one upcoming departure within the requested date range.

Both labels and categories accept repeated query parameters to pass multiple values -- for example, ?labels=slug1&labels=slug2&categories=day-tours. Multiple values for the same filter are ORed together (match any of the listed label slugs, or any of the listed category slugs), while different filters are ANDed (trips must match the labels filter and the categories filter). Comma-separated values in a single parameter are not supported.

Each trip in the response includes:

FieldDescription
idThe trip's unique identifier (GUID)
nameTrip display name
slugURL-friendly identifier used in other endpoints
codeInternal trip code
typeTrip type (static or dynamic)
departingOnDeparture date (static trips)
lengthTrip length in days
durationsAvailable duration options (for duration-based trips)
labelsAssigned label names and slugs
categoryNameTrip category name
serieNameSeries name (if the trip belongs to a series)
productCountNumber of products available on the trip
allowDepositWhether deposit payment is available for this trip

Get Trip Details

GET /v1/trips/{slug}

Retrieve complete information for a single trip by its slug. The response includes everything from the list endpoint plus:

FieldDescription
descriptionFull trip description text
overrideDepositAmountTrip-specific deposit amount (overrides workspace default)
overrideDepositDayCountTrip-specific deposit day count (overrides workspace default)
bookingCutoffInDaysDays before departure when booking closes
groupsProduct groups, each containing its products with pricing and availability
ungroupedProductsProducts not assigned to any group

This gives an external system everything it needs to display a booking interface.

Get Trip Products

GET /v1/trips/{slug}/products

Retrieve the products available on a trip, with pricing calculated for a specific participant combination. Unlike Get Trip Details, this endpoint accepts participant counts so prices reflect the actual booking scenario.

ParameterTypeDescription
slugPath stringThe trip slug
adultsQuery numberNumber of adult participants
childrenQuery numberNumber of child participants
infantsQuery numberNumber of infant participants

The response includes product groups and ungrouped products, each with rate details, capacity, current availability, variants, and duration-specific pricing.

Get Field Requirements

GET /v1/trips/{slug}/fields

Retrieve the data fields required for clients and participants when booking a specific trip. The response contains two field maps:

Field MapDescription
clientFields for the booking client (e.g., first name, last name, email, phone). Each field is true if required, false if optional.
participantFields for each participant (e.g., name, passport number, nationality, date of birth). Each field is true if required, false if optional.

If the trip has custom field overrides, those take precedence over workspace defaults. This endpoint helps external booking forms collect the right information before submitting an order.

Check Availability

POST /v1/trips/{slug}/availability

Submit a participant combination and product selections to validate availability and get a price calculation.

What you send:

FieldDescription
adultsNumber of adult participants
childrenNumber of child participants
infantsNumber of infant participants
durationSelected duration (for duration-based trips)
productsList of product selections, each with a product ID, optional variant ID, and participant counts or indexes

What you receive:

FieldDescription
isValidWhether the booking is still available (checks capacity and booking cutoff)
errorMessageReason if the booking is not valid
totalPriceCalculated total for the selected products and participants
totalPricePerParticipantAverage price per person
depositDeposit details (see below)
lineItemsPer-product price breakdown

The deposit object includes:

FieldDescription
isAllowedWhether a deposit payment is available for this booking
disallowedReasonWhy deposits are not available (e.g., departure too soon)
amountDeposit amount to collect
balanceDueRemaining amount after the deposit
balanceDueOnDate when the remaining balance is due
fullPaymentDueDayCountDays before departure when full payment is required
daysUntilDepartureDays until the trip departs

Use this before creating an order to show customers accurate pricing and confirm availability.

Get Seat Maps

GET /v1/trips/{slug}/seats

Retrieve seat maps for one or more products on a trip. Products that have a seating layout return their seat grid with per-seat availability and pricing.

ParameterTypeDescription
slugPath stringThe trip slug
productsQuery stringComma-separated list of product IDs to fetch seat maps for

At least one product ID is required. Products without a seat map are silently omitted from the response.

Each seat map in the response includes:

FieldDescription
productIdThe product this seat map belongs to
totalRowsNumber of rows in the layout
totalColumnsNumber of columns in the layout
seatSelectionModeHow seats are selected (e.g., manual pick or automatic assignment)
totalSeatsTotal seats in the layout
availableSeatsSeats currently available for booking
seatsList of individual seats with row, column, label, per-participant-type rates, characteristics, and availability status

Use the Get Trip Products endpoint first to determine which products have a seat map (via the hasSeatMap flag), then request seat maps only for those products.

Orders

Create Order

POST /v1/orders

Submit a complete order with client details, participants, and product selections. Itsy processes the order end-to-end:

  1. Client matching — If a client with the same email exists, the existing record is used. Otherwise, a new client is created.
  2. Participant creation — All travelers are added to the order with their details.
  3. Pricing calculation — Product prices are calculated based on rate types, participant counts, and any promo codes.
  4. Payment setup — If a payment provider is configured, a payment link or form data is generated for the selected payment intention (full payment or deposit).
  5. Confirmation email — An order confirmation email is automatically sent to the client.
  6. Event publishing — Events are published for any configured actions (e.g., triggers on external order creation).

What you send:

FieldDescription
tripIdThe trip ID (GUID) to book
adultsNumber of adult participants
childrenNumber of child participants
infantsNumber of infant participants
durationSelected duration (for duration-based trips)
productsSelected products, each with product ID, optional variant ID, and participant assignments
clientClient details: first name, last name, email, and optional phone and unique ID
participantsParticipant details: type (adult/child/infant), name, and optional fields (email, phone, gender, nationality, address, passport details, date of birth)
promoCodeOptional discount code
paymentIntentionPayInFull or PayDeposit

What you receive:

FieldDescription
orderIdThe created order's unique identifier
orderCodeHuman-readable order reference code
priceTotal order price
depositAmountDeposit amount (if deposit payment was selected)
statusOrder status
paymentStatusPayment status
paymentProviderThe payment provider used (Stripe, Rapyd, Teya, or Straumur). Valitor is a legacy provider and is intentionally excluded from Workspace API responses.
paymentUrlURL to redirect the customer to for payment (if applicable)
paymentFormDataForm data for payment providers that use form submission instead of URL redirect
createdOnOrder creation timestamp
startingOnTrip start date
endingOnTrip end date
fullyPaidOnDate the order was fully paid (null until paid)
conflictsNon-fatal issues that occurred during order creation but did not prevent it (e.g., a seat reservation that lost a race to another booking). Empty on a clean success.

Find Order

GET /v1/orders/public-url

Look up an order by its code and client email, and receive a public URL where the customer can view their order. This is useful for building "find my order" flows in external booking engines.

ParameterTypeDescription
codeQuery stringThe order reference code
emailQuery stringThe client's email address

The response is the public URL for the order. If no matching order is found, a 404 Not Found is returned.

Get Order

GET /v1/orders/{orderId}

Retrieve the current status of an order created through the API. Use the order ID returned from the Create Order response.

FieldDescription
orderIdThe order's unique identifier
orderCodeHuman-readable order reference code
priceTotal order price
depositAmountDeposit amount
statusCurrent order status
paymentStatusCurrent payment status
createdOnOrder creation timestamp
startingOnTrip start date
endingOnTrip end date
fullyPaidOnDate the order was fully paid (null until paid)

Rate Limiting

Each API key has a configured rate limit (requests per minute). Requests exceeding the limit receive an error response. You can adjust the rate limit from the API Keys settings page.

What the API Can and Cannot Do

Can do:

  • List available labels and trip categories
  • Browse and filter trips by date range, labels, and categories
  • Retrieve full product and pricing details for a specific participant combination
  • Retrieve seat maps with per-seat availability and pricing for products with seating layouts
  • Check real-time availability and get accurate deposit calculations
  • Retrieve field requirements for booking forms (client and participant fields)
  • Create orders with automatic client matching, payment link generation, and confirmation emails
  • Look up an order by code and email to get its public URL
  • Track order status and payment status

Cannot do:

  • Modify or cancel existing orders, trips, or products
  • Access sensitive payment instrument details (e.g., full card numbers, CVV, bank account numbers); non-sensitive fields such as price, depositAmount, and paymentStatus remain available.
  • Manage clients or participants independently of orders
  • Access data from other workspaces
  • Bypass rate limits or authentication

How It Connects

  • API Keys — Each API key grants access to one workspace's API with a configured rate limit and environment.
  • Trips — The API exposes your trips, products, and pricing for external consumption.
  • Orders — Orders created through the API appear in your admin interface like any other order, with the origin marked as "Workspace API". Each order tracks which API key created it for auditing purposes.
  • Actions — Order creation triggers configured actions, so automations work the same for API-created orders.
  • Payment Providers — The API generates payment links using your configured payment provider (Stripe, Rapyd, Teya, or Straumur). Valitor is a legacy provider and is intentionally excluded from Workspace API responses.
  • Labels — External systems can list all labels and filter trips by label slugs to build themed or filtered booking experiences.
  • Trip Categories — External systems can list all categories and filter trips by category slugs to present organized booking options.

On this page