Download OpenAPI specification:
Xola booking and experience management platform API.
This API provides comprehensive functionality for managing experiences, bookings, users, events, and all aspects of the booking lifecycle for tour and activity operators.
This API supports two authentication mechanisms:
X-API-KEY headerUse the Authorization header for Basic auth or the X-API-KEY header for API key authentication.
Xola's API uses a versioning scheme based on dates. The latest available version is 2025-07-07.
Specify the desired API version in the x-api-version header for all requests:
x-api-version: 2025-07-07
Recommended: Always include the x-api-version header in your requests to ensure consistent and predictable responses.
If the x-api-version header is not provided, the API will use the version configured for the seller account associated with the request. This default version may differ between seller accounts, which can lead to inconsistent behavior across accounts.
For best results and to avoid unexpected changes, always specify the API version explicitly in your requests.
Uploads a file and stores it as an Asset. Returns the created Asset object.
Supported file types:
The file must be sent as multipart/form-data with the field name file.
Authorization: Requires a valid authenticated user (ROLE_USER).
| file required | string <binary> The file to upload (JPEG, PNG, GIF, WebP, or PDF) |
{- "id": "507f1f77bcf86cd799439099",
- "name": "safety-guidelines.pdf",
- "type": "application/pdf",
- "createdAt": "2024-01-15T10:30:00Z",
- "createdBy": {
- "id": "507f191e810c19729de860ea"
}
}Fetches a paginated list of abandoned purchases for the authenticated seller.
Abandoned purchases are draft purchases that customers started but didn't complete. They're automatically filtered to exclude soft-deleted purchases.
Results are ordered by creation date (newest first).
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
object (DateTimeFilterSchema) Examples: createdAt[summary]=Find records where field exists (not null)&createdAt[value]=[object Object] createdAt[summary]=Find records where field is null/missing&createdAt[value]=[object Object] createdAt[summary]=Date range filtering&createdAt[value]=[object Object] createdAt[summary]=Range using comma-separated string&createdAt[value]=[object Object] createdAt[summary]=Using period for today&createdAt[value]=[object Object] createdAt[summary]=Using period for last week&createdAt[value]=[object Object] createdAt[summary]=Exact date-time match&createdAt[value]=[object Object] createdAt[summary]=After specific date&createdAt[value]=[object Object] Filter by creation timestamp. Supports date-time filtering operations. | |
object (DateTimeFilterSchema) Examples: updatedAt[summary]=Find records where field exists (not null)&updatedAt[value]=[object Object] updatedAt[summary]=Find records where field is null/missing&updatedAt[value]=[object Object] updatedAt[summary]=Date range filtering&updatedAt[value]=[object Object] updatedAt[summary]=Range using comma-separated string&updatedAt[value]=[object Object] updatedAt[summary]=Using period for today&updatedAt[value]=[object Object] updatedAt[summary]=Using period for last week&updatedAt[value]=[object Object] updatedAt[summary]=Exact date-time match&updatedAt[value]=[object Object] updatedAt[summary]=After specific date&updatedAt[value]=[object Object] Filter by last update timestamp. Supports date-time filtering operations. | |
| customerEmail | string <email> Example: customerEmail=john.doe@example.com Filter by customer email address |
| customerName | string Example: customerName=John Doe Filter by customer name (partial match) |
| status | string Default: "abandon" Value: "abandon" Example: status=abandon Filter by purchase status |
| expand | string Example: expand=items,reminders Comma-separated list of fields to expand in response |
| include | string Example: include=audits Comma-separated list of additional fields to include |
| sort | string Example: sort=createdAt,-updatedAt Sort order (comma-separated fields) |
{- "data": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "object": "purchase",
- "status": "abandon",
- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "currency": "USD",
- "amount": 150,
- "baseAmount": 150,
- "balance": 150,
- "rollbackReason": "payment_timeout",
- "draftCreatedAt": "2024-01-15T09:30:00Z",
- "convertedAt": null,
- "deletedAt": null,
- "deletedBy": null,
- "createdAt": "2024-01-15T09:30:00Z",
- "updatedAt": "2024-01-15T09:35:00Z",
- "seller": {
- "id": "60f7b3c4e4b0a1234567890d"
}, - "organizer": {
- "id": "60f7b3c4e4b0a1234567890c"
}, - "items": [
- {
- "id": "60f7b3c4e4b0a1234567890b",
- "object": "scheduled_experience_purchase_item",
- "status": "abandoned",
- "amount": 150,
- "name": "Sunset Mountain Hiking Tour",
- "arrivalDate": "2024-02-15",
- "arrivalTime": "17:00",
- "product": {
- "id": "60f7b3c4e4b0a1234567890e"
}
}
]
}
], - "paging": {
- "next": null
}
}Fetches a specific abandoned purchase by its unique identifier.
This endpoint provides detailed information about an abandoned purchase, including all items, customer information, and associated reminders.
Authentication: Requires either seller authentication OR customer authentication using client secret. When authenticated as a customer, only purchases belonging to that customer are accessible.
| id required | string Example: 60f7b3c4e4b0a1234567890a Unique identifier of the abandoned purchase |
{- "id": "60f7b3c4e4b0a1234567890a",
- "object": "purchase",
- "status": "abandon",
- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "customerPhone": "+1-555-123-4567",
- "currency": "USD",
- "amount": 150,
- "created": "2024-01-15T14:30:00Z",
- "updated": "2024-01-15T15:45:00Z",
- "seller": {
- "id": "60f7b3c4e4b0a1234567890d"
}, - "organizer": {
- "id": "60f7b3c4e4b0a1234567890c"
}, - "items": [
- {
- "id": "60f7b3c4e4b0a1234567890b",
- "object": "scheduled_experience_purchase_item",
- "status": "abandoned",
- "amount": 150,
- "baseAmount": 150,
- "name": "Sunset Mountain Hiking Tour",
- "desc": "Experience the beauty of a mountain sunset on this guided hiking tour",
- "arrivalDate": "2024-02-15",
- "arrivalTime": "17:00",
- "product": {
- "id": "60f7b3c4e4b0a1234567890e"
}
}
], - "reminders": [ ]
}Updates specific properties of an abandoned purchase.
This endpoint supports updating the status of individual purchase items, particularly for marking items as "emailed" or "dismissed" for tracking recovery campaign effectiveness.
Authentication: Requires seller authentication only.
| id required | string Example: 60f7b3c4e4b0a1234567890a Unique identifier of the abandoned purchase |
required | Array of objects non-empty Items to update with new status |
{- "items": [
- {
- "id": "60f7b3c4e4b0a1234567890b",
- "status": "emailed"
}
]
}{- "id": "60f7b3c4e4b0a1234567890a",
- "object": "purchase",
- "status": "abandon",
- "internalStatus": "committed",
- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "customerLocale": "en-US",
- "customerTimezoneName": "America/New_York",
- "phone": "+1234567890",
- "phoneCanonical": "1234567890",
- "currency": "USD",
- "amount": 150,
- "amounts": {
- "property1": 0.1,
- "property2": 0.1
}, - "balances": {
- "property1": 0.1,
- "property2": 0.1
}, - "balance": 0,
- "payNow": 50,
- "dueNow": 50,
- "minimumDue": 25,
- "affiliatePayment": 15,
- "referenceId": "EXT-BOOKING-123",
- "source": "website",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "organizer": {
- "id": "507f1f77bcf86cd799439011"
}, - "partnerSeller": {
- "id": "507f1f77bcf86cd799439011"
}, - "partner": {
- "id": "string",
- "object": "string"
}, - "affiliate": {
- "id": "507f1f77bcf86cd799439011"
}, - "conversation": {
- "id": "507f1f77bcf86cd799439011"
}, - "waitlist": {
- "id": "507f1f77bcf86cd799439011"
}, - "travelers": [
- {
- "id": "507f1f77bcf86cd799439011"
}
], - "items": [
- {
- "id": "60f7b3c4e4b0a1234567890b",
- "object": "experience_purchase_item",
- "status": "confirmed",
- "amount": 75,
- "currency": "USD",
- "quantity": 2,
- "product": {
- "id": "507f1f77bcf86cd799439011"
}, - "productName": "City Walking Tour",
- "purchase": {
- "id": "507f1f77bcf86cd799439011"
}, - "source": "website",
- "lineItems": [
- {
- "id": "60f7b3c4e4b0a1234567890c",
- "object": "line_item",
- "type": "fee",
- "name": "Service Fee",
- "code": "SERVICE_FEE_001",
- "price": 25,
- "amount": 50,
- "quantity": 2,
- "destination": "seller",
- "visibility": "all",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "unit": {
- "id": "507f1f77bcf86cd799439011"
}, - "template": {
- "id": "507f1f77bcf86cd799439011"
}, - "meta": { }
}
], - "parentProduct": {
- "id": "string",
- "object": "string"
}, - "clientId": "client-item-abc123",
- "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T11:45:00Z",
- "pickupLocation": "Grand Canyon Visitor Center, S Entrance Rd, Grand Canyon Village, AZ 86023",
- "ticket": [
- {
- "code": "XOLA-ABC123",
- "provider": "xola",
- "createdAt": "2024-01-15T10:30:00+00:00",
- "meta": { }
}
], - "referenceId": "RESALE-REF-001",
- "deposit": {
- "enabled": true,
- "amount": 50
}
}
], - "lineItems": [
- {
- "id": "60f7b3c4e4b0a1234567890c",
- "object": "line_item",
- "type": "fee",
- "name": "Service Fee",
- "code": "SERVICE_FEE_001",
- "price": 25,
- "amount": 50,
- "quantity": 2,
- "destination": "seller",
- "visibility": "all",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "unit": {
- "id": "507f1f77bcf86cd799439011"
}, - "template": {
- "id": "507f1f77bcf86cd799439011"
}, - "meta": { }
}
], - "tags": [
- {
- "id": "string",
- "system": false,
- "type": "string"
}
], - "notes": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "text": "Customer requested window seat",
- "type": "general",
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "reminders": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "type": "follow_up",
- "title": "Follow up with customer",
- "description": "Customer asked about group discounts",
- "status": "active",
- "remindAt": "2023-12-08T10:00:00Z",
- "completed": false,
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "paymentReminders": [
- {
- "id": "60f7b3c4e4b0a1234567890d",
- "type": "invoice_traveler",
- "amount": 100,
- "dueAt": "2023-12-08T10:00:00Z",
- "sentAt": "2019-08-24T14:15:22Z",
- "status": "pending"
}
], - "splitPayment": {
- "enabled": false
}, - "trackingData": {
- "source": "string",
- "medium": "string",
- "campaign": "string",
- "referrer": "string",
- "ip": "string",
- "fbp": "string",
- "fbc": "string",
- "userAgent": "string",
- "gaClientId": "string",
- "clientIpAddress": "string"
}, - "telemetry": {
- "sessionId": "string",
- "userAgent": "string",
- "screenResolution": "string",
- "timezone": "string"
}, - "meta": { },
- "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T11:45:00Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "requiresCaptcha": false,
- "termsAgreedAt": "2023-12-07T10:25:00Z",
- "releaseHoldAt": "2023-12-07T12:00:00Z",
- "notifyAt": "2023-12-07T09:00:00Z",
- "migratedAt": "2023-12-07T08:00:00Z",
- "commissionRefundProcessedAt": "2023-12-07T16:00:00Z",
- "rollbackReason": "payment_failed",
- "draftCreatedAt": "2024-01-15T09:30:00Z",
- "convertedAt": "2024-01-15T10:45:00Z",
- "deletedAt": "2024-01-15T11:00:00Z",
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}Affiliates are partners who make bookings on behalf of guests where there is either a discounting or commission component to the relationship. Each affiliate is given a unique code so that you can track commissions, accounts receivable, and accounts payable for each affiliate.
Retrieve a list of affiliates. Access is controlled based on authentication and authorization.
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
| expand | string Value: "purchaseRule" You can expand multiple objects at the same time by providing a comma-separated list of values |
| code | string Example: code=JTA001 Filter affiliates by their internal code. This performs a case-insensitive exact match. When used without authentication, only exact matches are returned. When used with authentication, partial matches may be supported. |
| status | string Enum: "active" "inactive" "pending" Example: status=active Filter affiliates by their current status |
| seller | string Example: seller=507f1f77bcf86cd799439011 Filter affiliates by seller ID (required when using code filter without authentication) |
{- "data": [
- {
- "object": "affiliate",
- "name": "John's Travel Agency",
- "email": "john@travelagency.com",
- "code": "JTA001",
- "status": "active",
- "phone": "+1234567890",
- "address": "123 Main St, City, State 12345",
- "notes": "Preferred partner for corporate bookings",
- "allowChildren": false,
- "children": [
- "60f7b3c4e4b0a1234567890b",
- "60f7b3c4e4b0a1234567890c"
], - "parent": "60f7b3c4e4b0a1234567890d",
- "voucher": false,
- "delegated": true,
- "purchaseRulesPermanentIds": [
- "rule_123",
- "rule_456"
], - "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "id": "60f7b3c4e4b0a1234567890a",
- "createdAt": "2023-07-15T10:30:00Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedAt": "2023-07-20T14:45:00Z",
- "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "deletedAt": null,
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "paging": {
- "next": "string",
- "_es": true
}
}Create a new affiliate for the authenticated user's seller account.
Affiliate data to create
| object | string Object type identifier Value: "affiliate" |
| name required | string Full name of the affiliate |
string or null <email> Email address of the affiliate | |
| code | string or null Internal code referring to this affiliate (cannot contain spaces, quotes, <, >, &) |
| status required | string Enum: "active" "inactive" "pending" Current status of the affiliate:
|
| phone | string or null Phone number of the affiliate |
| address | string or null Physical address of the affiliate |
| url | string or null <uri> Website URL of the affiliate |
| notes | string or null Internal notes about the affiliate |
| allowChildren | boolean Whether this affiliate is allowed to create child affiliates |
| children | Array of strings or null List of child affiliate IDs that report under this affiliate |
| parent | string or null ID of the parent affiliate if this is a child affiliate |
| voucher | boolean Whether this affiliate operates as a voucher-based partner |
| delegated | boolean Whether this affiliate has delegated access rights |
| purchaseRulesPermanentIds | Array of strings or null List of purchase rule permanent IDs associated with this affiliate |
required | object (ObjectReference) Seller this affiliate belongs to |
{- "object": "affiliate",
- "name": "John's Travel Agency",
- "email": "john@travelagency.com",
- "code": "JTA001",
- "status": "active",
- "phone": "+1234567890",
- "address": "123 Main St, City, State 12345",
- "notes": "Preferred partner for corporate bookings",
- "allowChildren": false,
- "children": [
- "60f7b3c4e4b0a1234567890b",
- "60f7b3c4e4b0a1234567890c"
], - "parent": "60f7b3c4e4b0a1234567890d",
- "voucher": false,
- "delegated": true,
- "purchaseRulesPermanentIds": [
- "rule_123",
- "rule_456"
], - "seller": {
- "id": "507f1f77bcf86cd799439011"
}
}{- "object": "affiliate",
- "name": "John's Travel Agency",
- "email": "john@travelagency.com",
- "code": "JTA001",
- "status": "active",
- "phone": "+1234567890",
- "address": "123 Main St, City, State 12345",
- "notes": "Preferred partner for corporate bookings",
- "allowChildren": false,
- "children": [
- "60f7b3c4e4b0a1234567890b",
- "60f7b3c4e4b0a1234567890c"
], - "parent": "60f7b3c4e4b0a1234567890d",
- "voucher": false,
- "delegated": true,
- "purchaseRulesPermanentIds": [
- "rule_123",
- "rule_456"
], - "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "id": "60f7b3c4e4b0a1234567890a",
- "createdAt": "2023-07-15T10:30:00Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedAt": "2023-07-20T14:45:00Z",
- "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "deletedAt": null,
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}Retrieve a specific affiliate by ID.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| expand | string Value: "purchaseRule" You can expand multiple objects at the same time by providing a comma-separated list of values |
{- "object": "affiliate",
- "name": "John's Travel Agency",
- "email": "john@travelagency.com",
- "code": "JTA001",
- "status": "active",
- "phone": "+1234567890",
- "address": "123 Main St, City, State 12345",
- "notes": "Preferred partner for corporate bookings",
- "allowChildren": false,
- "children": [
- "60f7b3c4e4b0a1234567890b",
- "60f7b3c4e4b0a1234567890c"
], - "parent": "60f7b3c4e4b0a1234567890d",
- "voucher": false,
- "delegated": true,
- "purchaseRulesPermanentIds": [
- "rule_123",
- "rule_456"
], - "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "id": "60f7b3c4e4b0a1234567890a",
- "createdAt": "2023-07-15T10:30:00Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedAt": "2023-07-20T14:45:00Z",
- "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "deletedAt": null,
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}Update an existing affiliate's information.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
Updated affiliate data
| object | string Object type identifier Value: "affiliate" |
| name required | string Full name of the affiliate |
string or null <email> Email address of the affiliate | |
| code | string or null Internal code referring to this affiliate (cannot contain spaces, quotes, <, >, &) |
| status required | string Enum: "active" "inactive" "pending" Current status of the affiliate:
|
| phone | string or null Phone number of the affiliate |
| address | string or null Physical address of the affiliate |
| url | string or null <uri> Website URL of the affiliate |
| notes | string or null Internal notes about the affiliate |
| allowChildren | boolean Whether this affiliate is allowed to create child affiliates |
| children | Array of strings or null List of child affiliate IDs that report under this affiliate |
| parent | string or null ID of the parent affiliate if this is a child affiliate |
| voucher | boolean Whether this affiliate operates as a voucher-based partner |
| delegated | boolean Whether this affiliate has delegated access rights |
| purchaseRulesPermanentIds | Array of strings or null List of purchase rule permanent IDs associated with this affiliate |
required | object (ObjectReference) Seller this affiliate belongs to |
{- "object": "affiliate",
- "name": "John's Travel Agency",
- "email": "john@travelagency.com",
- "code": "JTA001",
- "status": "active",
- "phone": "+1234567890",
- "address": "123 Main St, City, State 12345",
- "notes": "Preferred partner for corporate bookings",
- "allowChildren": false,
- "children": [
- "60f7b3c4e4b0a1234567890b",
- "60f7b3c4e4b0a1234567890c"
], - "parent": "60f7b3c4e4b0a1234567890d",
- "voucher": false,
- "delegated": true,
- "purchaseRulesPermanentIds": [
- "rule_123",
- "rule_456"
], - "seller": {
- "id": "507f1f77bcf86cd799439011"
}
}{- "object": "affiliate",
- "name": "John's Travel Agency",
- "email": "john@travelagency.com",
- "code": "JTA001",
- "status": "active",
- "phone": "+1234567890",
- "address": "123 Main St, City, State 12345",
- "notes": "Preferred partner for corporate bookings",
- "allowChildren": false,
- "children": [
- "60f7b3c4e4b0a1234567890b",
- "60f7b3c4e4b0a1234567890c"
], - "parent": "60f7b3c4e4b0a1234567890d",
- "voucher": false,
- "delegated": true,
- "purchaseRulesPermanentIds": [
- "rule_123",
- "rule_456"
], - "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "id": "60f7b3c4e4b0a1234567890a",
- "createdAt": "2023-07-15T10:30:00Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedAt": "2023-07-20T14:45:00Z",
- "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "deletedAt": null,
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}Soft delete an affiliate.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Create a payment transaction to pay an affiliate.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
Payment transaction details
| amount required | number <float> Transaction amount (positive for collect, will be negated for pay operations) |
| description | string or null Description of the transaction |
| reference | string or null External reference for the transaction |
{- "amount": 100.5,
- "description": "Commission payment for July bookings",
- "reference": "PAY-2023-001"
}{- "object": "affiliate",
- "name": "John's Travel Agency",
- "email": "john@travelagency.com",
- "code": "JTA001",
- "status": "active",
- "phone": "+1234567890",
- "address": "123 Main St, City, State 12345",
- "notes": "Preferred partner for corporate bookings",
- "allowChildren": false,
- "children": [
- "60f7b3c4e4b0a1234567890b",
- "60f7b3c4e4b0a1234567890c"
], - "parent": "60f7b3c4e4b0a1234567890d",
- "voucher": false,
- "delegated": true,
- "purchaseRulesPermanentIds": [
- "rule_123",
- "rule_456"
], - "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "id": "60f7b3c4e4b0a1234567890a",
- "createdAt": "2023-07-15T10:30:00Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedAt": "2023-07-20T14:45:00Z",
- "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "deletedAt": null,
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}Create a collection transaction to collect money from an affiliate.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
Collection transaction details
| amount required | number <float> Transaction amount (positive for collect, will be negated for pay operations) |
| description | string or null Description of the transaction |
| reference | string or null External reference for the transaction |
{- "amount": 100.5,
- "description": "Commission payment for July bookings",
- "reference": "PAY-2023-001"
}{- "object": "affiliate",
- "name": "John's Travel Agency",
- "email": "john@travelagency.com",
- "code": "JTA001",
- "status": "active",
- "phone": "+1234567890",
- "address": "123 Main St, City, State 12345",
- "notes": "Preferred partner for corporate bookings",
- "allowChildren": false,
- "children": [
- "60f7b3c4e4b0a1234567890b",
- "60f7b3c4e4b0a1234567890c"
], - "parent": "60f7b3c4e4b0a1234567890d",
- "voucher": false,
- "delegated": true,
- "purchaseRulesPermanentIds": [
- "rule_123",
- "rule_456"
], - "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "id": "60f7b3c4e4b0a1234567890a",
- "createdAt": "2023-07-15T10:30:00Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedAt": "2023-07-20T14:45:00Z",
- "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "deletedAt": null,
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}Create a new named API key user for the specified seller. An API key is automatically
generated and assigned to the user. The API key user can then authenticate using the
generated key via the X-API-KEY header.
Authorization Requirements:
CREATE_API_KEY_USER permission on the sellerValidation Rules:
name is required and must be unique (case-insensitive) among all delegates of the sellerroles is required and must contain at least one valid roleBehavior:
ROLE_API_KEY as a direct role| id required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439011 Seller ID to create the API key user for |
| name required | string Human-readable name for the API key user. Must be unique (case-insensitive) among all delegates of the seller. |
| roles required | Array of strings Items Enum: "ROLE_RESERVATION" "ROLE_GUIDE_MANAGER" "ROLE_ACCOUNTANT" "ROLE_CURATOR" "ROLE_GUIDE" "ROLE_SELLER_ADMIN" "ROLE_RESERVATION_LITE" "ROLE_MARKETER" "ROLE_EQUIPMENT_MANAGER" List of permission roles to assign. At least one role is required. Only the following roles are allowed for API key users:
|
{- "name": "My Integration",
- "roles": [
- "ROLE_RESERVATION"
]
}{- "id": "507f1f77bcf86cd799439011",
- "object": "api_key_user",
- "type": 4,
- "name": "My Integration",
- "enabled": true,
- "seller": {
- "id": "507f1f77bcf86cd799439022"
}, - "roles": [
- "ROLE_RESERVATION"
]
}Retrieve a list of all API key users for the specified seller. The API keys
in the response are masked (only first 4 characters shown, followed by ******).
Authorization Requirements:
VIEW_API_KEY_USERS permission on the sellerNote: To retrieve the full (unmasked) API key, use the single GET endpoint
(GET /sellers/{id}/apiKeys/{apiKeyId}).
| id required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439011 Seller ID to list API key users for |
{- "data": [
- {
- "id": "507f1f77bcf86cd799439011",
- "object": "api_key_user",
- "type": 4,
- "name": "My Integration",
- "enabled": true,
- "seller": {
- "id": "507f1f77bcf86cd799439022"
}, - "roles": [
- "ROLE_RESERVATION"
], - "apiKey": "a1b2******"
}, - {
- "id": "507f1f77bcf86cd799439012",
- "object": "api_key_user",
- "type": 4,
- "name": "Reporting Tool",
- "enabled": true,
- "seller": {
- "id": "507f1f77bcf86cd799439022"
}, - "roles": [
- "ROLE_ACCOUNTANT"
], - "apiKey": "x9y8******"
}
]
}Retrieve details for a specific API key user, including the full (unmasked) API key.
Authorization Requirements:
VIEW_API_KEY_USERS permission on the sellerImportant: This is the only endpoint that returns the full API key value. The list endpoint returns masked keys.
| id required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439011 Seller ID that owns the API key user |
| apiKeyId required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439012 ID of the API key user to retrieve |
{- "id": "507f1f77bcf86cd799439012",
- "object": "api_key_user",
- "type": 4,
- "name": "My Integration",
- "enabled": true,
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "roles": [
- "ROLE_RESERVATION",
- "ROLE_CURATOR"
], - "apiKey": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"
}Update the name or enabled status of an API key user.
Authorization Requirements:
EDIT_API_KEY_USER permission on the sellerNote: Permissions/roles are NOT updated through this endpoint. Use the dedicated permission endpoints to add or remove permissions:
PUT /sellers/{id}/apiKeys/{apiKeyId}/permissions/{permissionId} to add a permissionDELETE /sellers/{id}/apiKeys/{apiKeyId}/permissions/{permissionId} to remove a permission| id required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439011 Seller ID that owns the API key user |
| apiKeyId required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439012 ID of the API key user to update |
| name | string Updated human-readable name for the API key user |
| enabled | boolean Enable or disable the API key user |
{- "name": "Updated Integration Name"
}{- "id": "507f1f77bcf86cd799439012",
- "object": "api_key_user",
- "type": 4,
- "name": "Updated Integration Name",
- "enabled": true,
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "roles": [
- "ROLE_RESERVATION",
- "ROLE_CURATOR"
]
}Delete an API key user and revoke their access. This permanently removes the API key user's delegate from the seller, nulls out the API key, and disables the user account.
Authorization Requirements:
DELETE_API_KEY_USER permission on the sellerSide Effects:
| id required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439011 Seller ID that owns the API key user |
| apiKeyId required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439012 ID of the API key user to delete |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Grant a specific permission to an API key user. The permission must be from the restricted set of roles allowed for API key users.
Authorization Requirements:
EDIT_API_KEY_USER permission on the sellerAllowed Permissions:
ROLE_RESERVATION - Booking and reservation managementROLE_GUIDE_MANAGER - Guide management and schedulingROLE_ACCOUNTANT - Financial and accounting accessROLE_CURATOR - Content and experience managementROLE_GUIDE - Guide-specific accessROLE_SELLER_ADMIN - Full administrative accessROLE_RESERVATION_LITE - Limited reservation accessROLE_MARKETER - Marketing and promotion toolsROLE_EQUIPMENT_MANAGER - Equipment and resource management| id required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439011 Seller ID that owns the API key user |
| apiKeyId required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439012 ID of the API key user |
| permissionId required | string Enum: "ROLE_RESERVATION" "ROLE_GUIDE_MANAGER" "ROLE_ACCOUNTANT" "ROLE_CURATOR" "ROLE_GUIDE" "ROLE_SELLER_ADMIN" "ROLE_RESERVATION_LITE" "ROLE_MARKETER" "ROLE_EQUIPMENT_MANAGER" Example: ROLE_CURATOR The permission role to add |
{- "errors": {
- "roles": {
- "reason": "invalid_permission",
- "message": "Permission not allowed for API key users"
}
}
}Remove a specific permission from an API key user.
Authorization Requirements:
EDIT_API_KEY_USER permission on the seller| id required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439011 Seller ID that owns the API key user |
| apiKeyId required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439012 ID of the API key user |
| permissionId required | string Enum: "ROLE_RESERVATION" "ROLE_GUIDE_MANAGER" "ROLE_ACCOUNTANT" "ROLE_CURATOR" "ROLE_GUIDE" "ROLE_SELLER_ADMIN" "ROLE_RESERVATION_LITE" "ROLE_MARKETER" "ROLE_EQUIPMENT_MANAGER" Example: ROLE_CURATOR The permission role to remove |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Retrieve all blackout schedules for a specific user. Blackout schedules define periods when experiences are unavailable.
| userId required | string Example: 507f1f77bcf86cd799439011 Unique identifier for the user |
{- "data": [
- {
- "id": "507f1f77bcf86cd799439011",
- "name": "Weekend Blackout",
- "repeat": "weekly",
- "days": [
- 0,
- 6
], - "start": "2024-01-01T00:00:00-08:00",
- "end": "2024-12-31T23:59:59-08:00",
- "type": "unavailable",
- "timeRanges": [ ],
- "createdAt": "2024-01-15T10:30:00Z",
- "updatedAt": "2024-01-15T10:30:00Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439012"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439012"
}
}
]
}Create a new blackout schedule for a user. This is the primary endpoint. Blackout schedules automatically set the type to 'unavailable' and affect all user experiences.
| userId required | string Example: 507f1f77bcf86cd799439011 Unique identifier for the user |
Blackout schedule data to create
| name | string Human readable name for the blackout schedule |
| repeat required | string Enum: "weekly" "custom" The repeating frequency of this blackout schedule |
| days | Array of integers[ items [ 0 .. 6 ] ] Days of the week for weekly schedules. 0 = Sunday, 6 = Saturday |
| start | string <date> Start date in YYYY-MM-DD format |
| end | string or null <date> End date in YYYY-MM-DD format, or null for no end date |
| dates | Array of strings <date> [ items <date >^(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9... ] Custom dates in YYYY-MM-DD format (required if repeat = "custom") |
Array of objects (TimeRange) Optional time ranges for more granular blackout control |
{- "name": "Weekday Maintenance",
- "repeat": "weekly",
- "days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "start": "2024-12-01",
- "end": "2024-12-31"
}{- "id": "507f1f77bcf86cd799439014",
- "name": "Weekday Maintenance",
- "repeat": "weekly",
- "days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "start": "2024-12-01T00:00:00-08:00",
- "end": "2024-12-31T23:59:59-08:00",
- "type": "unavailable",
- "timeRanges": [ ],
- "createdAt": "2024-01-16T15:30:00Z",
- "updatedAt": "2024-01-16T15:30:00Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439012"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439012"
}
}Update an existing blackout schedule for a user. All provided fields will be updated, and any omitted fields will retain their current values.
| userId required | string Example: 507f1f77bcf86cd799439011 Unique identifier for the user |
| scheduleId required | string Example: 507f1f77bcf86cd799439013 Unique identifier for the blackout schedule |
Blackout schedule data to update
| name | string Human readable name for the blackout schedule |
| repeat | string Enum: "weekly" "custom" The repeating frequency of this blackout schedule |
| days | Array of integers[ items [ 0 .. 6 ] ] Days of the week for weekly schedules. 0 = Sunday, 6 = Saturday |
| start | string <date> Start date in YYYY-MM-DD format |
| end | string or null <date> End date in YYYY-MM-DD format, or null for no end date |
| dates | Array of strings <date> [ items <date >^(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9... ] Custom dates in YYYY-MM-DD format (applicable if repeat = "custom") |
| type | string Value: "unavailable" Blackout schedules are always unavailable type (may be included in request) |
Array of objects (TimeRange) Time ranges for granular blackout control |
{- "dates": [
- "2024-12-24",
- "2024-12-25",
- "2024-12-26"
]
}{- "id": "68a2d4524046afeb370e0e98",
- "name": "Updated Schedule",
- "days": [
- 1,
- 2
], - "start": "2025-08-30T00:00:00-04:00",
- "repeat": "weekly",
- "type": "unavailable",
- "createdAt": "2025-08-18T07:20:50+00:00",
- "updatedAt": "2025-08-29T13:00:02+00:00",
- "timeRanges": [
- {
- "startTime": 1215,
- "endTime": 1630
}
]
}Delete an existing blackout schedule for a user. This will remove the blackout and make previously blocked times available again according to other schedules.
| userId required | string Example: 507f1f77bcf86cd799439011 Unique identifier for the user |
| scheduleId required | string Example: 507f1f77bcf86cd799439013 Unique identifier for the blackout schedule to delete |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Alternative endpoint to retrieve all blackout schedules for a specific user. Same functionality as /blackout but with different URL pattern.
| userId required | string Example: 507f1f77bcf86cd799439011 Unique identifier for the user |
{- "data": [
- {
- "id": "507f1f77bcf86cd799439011",
- "name": "Weekend Blackout",
- "repeat": "weekly",
- "days": [
- 0,
- 6
], - "start": "2024-01-01T00:00:00-08:00",
- "end": "2024-12-31T23:59:59-08:00",
- "type": "unavailable",
- "timeRanges": [ ],
- "createdAt": "2024-01-15T10:30:00Z",
- "updatedAt": "2024-01-15T10:30:00Z"
}
]
}Alternative endpoint for creating a new blackout schedule for a user. This endpoint only creates new schedules and does not update existing ones.
| userId required | string Example: 507f1f77bcf86cd799439011 Unique identifier for the user |
Blackout schedule data to create
| name | string Human readable name for the blackout schedule |
| repeat required | string Enum: "weekly" "custom" The repeating frequency of this blackout schedule |
| days | Array of integers[ items [ 0 .. 6 ] ] Days of the week for weekly schedules. 0 = Sunday, 6 = Saturday |
| start | string <date> Start date in YYYY-MM-DD format |
| end | string or null <date> End date in YYYY-MM-DD format, or null for no end date |
| dates | Array of strings <date> [ items <date >^(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9... ] Custom dates in YYYY-MM-DD format (required if repeat = "custom") |
Array of objects (TimeRange) Optional time ranges for more granular blackout control |
{- "repeat": "weekly",
- "days": [
- 1
], - "start": "2076-12-14",
- "end": "2076-12-14"
}{- "id": "507f1f77bcf86cd799439015",
- "repeat": "weekly",
- "days": [
- 1
], - "start": "2076-12-14T00:00:00-10:00",
- "end": "2076-12-14T23:59:59-10:00",
- "type": "unavailable",
- "timeRanges": [ ],
- "createdAt": "2024-01-16T17:00:00Z",
- "updatedAt": "2024-01-16T17:00:00Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439012"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439012"
}
}Alternative endpoint for updating an existing blackout schedule for a user. This endpoint matches the actual API usage pattern with /blackoutSchedules.
| userId required | string Example: 65bbde2d1b8c18afc407eee6 Unique identifier for the user |
| scheduleId required | string Example: 68a2d4524046afeb370e0e98 Unique identifier for the blackout schedule |
| seller | string Example: seller=65bbde2d1b8c18afc407eee6 Seller ID for authorization context |
Blackout schedule data to update
| name | string Human readable name for the blackout schedule |
| repeat | string Enum: "weekly" "custom" The repeating frequency of this blackout schedule |
| days | Array of integers[ items [ 0 .. 6 ] ] Days of the week for weekly schedules. 0 = Sunday, 6 = Saturday |
| start | string <date> Start date in YYYY-MM-DD format |
| end | string or null <date> End date in YYYY-MM-DD format, or null for no end date |
| dates | Array of strings <date> [ items <date >^(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9... ] Custom dates in YYYY-MM-DD format (applicable if repeat = "custom") |
| type | string Value: "unavailable" Blackout schedules are always unavailable type (may be included in request) |
Array of objects (TimeRange) Time ranges for granular blackout control |
{- "id": "68a2d4524046afeb370e0e98",
- "days": [
- 1,
- 2
], - "start": "2025-08-30",
- "repeat": "weekly",
- "type": "unavailable",
- "createdAt": "2025-08-18T03:20:50-04:00",
- "updatedAt": "2025-08-29T08:13:15-04:00",
- "name": "name",
- "timeRanges": [
- {
- "startTime": 1215,
- "endTime": 1630
}
], - "end": null
}{- "id": "68a2d4524046afeb370e0e98",
- "name": "name",
- "days": [
- 1,
- 2
], - "start": "2025-08-30T00:00:00-04:00",
- "repeat": "weekly",
- "type": "unavailable",
- "createdAt": "2025-08-18T07:20:50+00:00",
- "updatedAt": "2025-08-29T13:00:02+00:00",
- "timeRanges": [
- {
- "startTime": 1215,
- "endTime": 1630
}
]
}Alternative endpoint for deleting an existing blackout schedule for a user. This endpoint matches the /blackoutSchedules URL pattern.
| userId required | string Example: 65bbde2d1b8c18afc407eee6 Unique identifier for the user |
| scheduleId required | string Example: 68a2d4524046afeb370e0e98 Unique identifier for the blackout schedule to delete |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Buttons allow you to logically group experiences or gifts for use on websites and are a great way to have themed landing pages with checkout offerings mirroring the theme.
Each button can be embedded on your website by following the instructions to implement our JavaScript-based checkout widget.
Xola offers four kinds of online checkout options:
Retrieve all buttons for a seller with optional filtering
| seller required | string Filter by seller ID |
| type | string Enum: "gift" "checkout" "timeline" "day" Filter by button type |
| expand | string Expand related objects. You can expand multiple objects by providing a comma-separated list. |
{- "data": [
- {
- "id": "507f1f77bcf86cd799439011",
- "object": "button",
- "name": "Summer Tours",
- "type": "checkout",
- "seller": {
- "id": "507f191e810c19729de860ea"
}, - "items": [
- {
- "object": "experience_button_item",
- "name": "Sunset Kayak Tour",
- "sequence": 0,
- "product": {
- "id": "507f191e810c19729de860eb"
}
}
], - "autoApplyCode": null,
- "createdAt": "2024-01-15T10:30:00+00:00",
- "createdBy": {
- "id": "507f191e810c19729de860ec"
}, - "updatedAt": "2024-01-15T10:30:00+00:00"
}
], - "paging": {
- "next": null
}
}Create a new button for a seller
| name required | string Name of the button |
| type required | string Enum: "gift" "checkout" "timeline" "day" Type of button |
required | object (ObjectReference) Reference to the seller |
Array of objects (ButtonItemRequest) List of items in this button | |
| autoApplyCode | string or null Coupon code to auto-apply when button is used |
CheckoutPreference (object) or null Checkout preferences for this button. Overrides seller-level checkout preferences when set. Set to null to clear and fall back to seller-level preferences. |
{- "name": "Summer Tours",
- "type": "checkout",
- "seller": {
- "id": "507f191e810c19729de860ea"
}, - "items": [
- {
- "object": "experience_button_item",
- "name": "Sunset Kayak Tour",
- "product": {
- "id": "507f191e810c19729de860eb"
}, - "sequence": 0
}
], - "autoApplyCode": null,
- "checkoutPreference": {
- "flowWeights": {
- "mvp": 0.7,
- "single_page": 0.3
}, - "x2Probability": 0.5
}
}{- "id": "507f1f77bcf86cd799439011",
- "object": "button",
- "name": "Summer Tours",
- "type": "checkout",
- "seller": {
- "id": "507f191e810c19729de860ea"
}, - "items": [
- {
- "object": "experience_button_item",
- "name": "Sunset Kayak Tour",
- "sequence": 0,
- "product": {
- "id": "507f191e810c19729de860eb"
}
}
], - "autoApplyCode": null,
- "createdAt": "2024-01-15T10:30:00+00:00",
- "createdBy": {
- "id": "507f191e810c19729de860ec"
}, - "updatedAt": "2024-01-15T10:30:00+00:00"
}Retrieve a button by its ID.
This endpoint is publicly accessible and cached for performance.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| seller | string (id) ^[0-9a-fA-F]{24}$ Example: seller=507f191e810c19729de860ea Seller ID. When provided, the button is returned in the context of this seller.
For partner experiences, this authorizes the seller's access to the product and
enriches the response with |
| expand | string Expand related objects. You can expand multiple objects by providing a comma-separated list. |
{- "id": "507f1f77bcf86cd799439011",
- "object": "button",
- "name": "Summer Tours",
- "type": "checkout",
- "seller": {
- "id": "507f191e810c19729de860ea"
}, - "items": [
- {
- "object": "experience_button_item",
- "name": "Sunset Kayak Tour",
- "sequence": 0,
- "product": {
- "id": "507f191e810c19729de860eb"
}
}, - {
- "object": "package_button_item",
- "name": "Full Day Package",
- "sequence": 1,
- "product": {
- "id": "507f191e810c19729de860eb"
}, - "package": {
- "id": "507f191e810c19729de860ed"
}
}
], - "autoApplyCode": "SUMMER20",
- "checkoutPreference": {
- "flowWeights": {
- "mvp": 0.7,
- "single_page": 0.3
}, - "x2Probability": 0.5
}, - "createdAt": "2024-01-15T10:30:00+00:00",
- "createdBy": {
- "id": "507f191e810c19729de860ec"
}, - "updatedAt": "2024-01-20T14:00:00+00:00",
- "updatedBy": {
- "id": "507f191e810c19729de860ec"
}
}Update an existing button
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| name | string Name of the button |
| type | string Enum: "gift" "checkout" "timeline" "day" Type of button |
Array of objects (ButtonItemRequest) List of items in this button | |
| autoApplyCode | string or null Coupon code to auto-apply when button is used |
CheckoutPreference (object) or null Checkout preferences for this button. Overrides seller-level checkout preferences when set. Set to null to clear and fall back to seller-level preferences. |
{- "name": "Summer Tours - Updated",
- "items": [
- {
- "object": "experience_button_item",
- "name": "Sunset Kayak Tour",
- "product": {
- "id": "507f191e810c19729de860eb"
}, - "sequence": 0
}, - {
- "object": "gift_offer_button_item",
- "name": "Gift Card",
- "product": {
- "id": "507f191e810c19729de860ef"
}, - "sequence": 1
}
], - "autoApplyCode": "SUMMER25",
- "checkoutPreference": {
- "x2Probability": 0.8
}
}{- "name": "Summer Tours",
- "type": "checkout",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "autoApplyCode": "SUMMER20",
- "id": "507f1f77bcf86cd799439011",
- "object": "button",
- "items": [
- {
- "name": "Sunset Kayak Tour",
- "sequence": 0,
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "product": {
- "id": "507f1f77bcf86cd799439011",
- "partner": {
- "id": "507f1f77bcf86cd799439011"
}
}, - "object": "experience_button_item"
}
], - "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedAt": "2019-08-24T14:15:22Z",
- "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "checkoutPreference": {
- "flowWeights": {
- "mvp": 0.7,
- "single_page": 0.3
}, - "x2Probability": 0.5
}, - "archivedAt": "2019-08-24T14:15:22Z",
- "archivedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}Retrieve a paginated list of catalog items with optional filtering
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
| seller | string Example: seller=507f1f77bcf86cd799439011 Filter by seller ID |
| product | string Example: product=507f1f77bcf86cd799439011 Filter by product ID |
| unitType | string Enum: "demographic" "merchandise" "pickup" "membership" Example: unitType=demographic Filter by unit type |
| type | string Enum: "quantity" "choices" "boolean" Example: type=quantity Filter by catalog item type |
| visibility | string Enum: "public" "private" Example: visibility=public Filter by visibility level |
{- "data": [
- {
- "id": "6721deb1accdc7036a0dd34b",
- "object": "product_catalog_item",
- "name": "Adults",
- "type": "quantity",
- "caption": "Caption Adult",
- "unitType": "demographic",
- "template": {
- "id": "65bbde2d1b8c18afc407eee8",
- "code": "adult",
- "type": "demographic"
}, - "seller": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "required": false,
- "visibility": "public",
- "createdBy": {
- "id": "65bbdc82a7d64cc4710c1b20"
}, - "createdAt": "2024-02-01T18:08:45+00:00",
- "updatedAt": "2025-03-04T13:45:31+00:00",
- "overrideParent": false,
- "parent": {
- "id": "65bbde2d1b8c18afc407eee9"
}, - "product": {
- "id": "6718b46c698afc969806fd92"
}, - "prices": {
- "price": {
- "min": 34,
- "max": 80
}, - "priceWithTaxes": {
- "min": 551,
- "max": 597
}, - "priceWithTaxesAndFees": {
- "min": 567.53,
- "max": 614.91
}
}, - "sequence": 10000
}
], - "next": null
}Create a new global or product-specific catalog item
| name required | string Display name of the catalog item |
| type required | string Enum: "quantity" "choices" "choices_item" "boolean" Type of catalog item input control |
| unitType required | string Enum: "demographic" "merchandise" "pickup" "membership" Unit type classification for the catalog item |
| object required | string Discriminator field identifying the catalog item type Value: "global_catalog_item" |
required | object (ObjectReference) A reference to another object containing only its ID. Use the |
required | object (ObjectReference) A reference to another object containing only its ID. Use the |
| caption | string Additional descriptive text for the catalog item |
| visibility | string Default: "public" Enum: "public" "private" "none" Visibility level of the catalog item. Use |
| required | boolean Default: false Whether this catalog item is required for purchase |
| sequence | integer >= 0 Sort order sequence for displaying catalog items |
| defaultChoice | string Default selection for choice-type catalog items |
{- "name": "Adults",
- "type": "quantity",
- "unitType": "demographic",
- "object": "global_catalog_item",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "template": {
- "id": "65bbde2d1b8c18afc407eee8"
}, - "caption": "Adult participants",
- "required": false,
- "visibility": "public"
}{- "id": "6721deb1accdc7036a0dd34b",
- "object": "global_catalog_item",
- "name": "Adults",
- "type": "quantity",
- "caption": "Adult participants",
- "unitType": "demographic",
- "template": {
- "id": "65bbde2d1b8c18afc407eee8",
- "code": "adult",
- "type": "demographic"
}, - "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "required": false,
- "visibility": "public",
- "createdBy": {
- "id": "65bbdc82a7d64cc4710c1b20"
}, - "createdAt": "2024-02-01T18:08:45+00:00",
- "updatedAt": "2024-02-01T18:08:45+00:00"
}Bulk update ware catalog items (price, SKU, barcode, status) using an ops array.
All catalog items in the batch must belong to the same seller and the same ware.
The ware must not have updatesPending set to true.
Validation Rules:
id (alphanumeric, hyphens, underscores), op: "update", and a data object with id plus at least one additional field.id values must not be duplicated across operations.draft ↔ published are allowed. Publishing requires both a price and a SKU.pricePerUnit.price must be non-negative.strikeThroughPrice must be non-negative if provided.Authorization:
ROLE_USER with EDIT_CATALOG_ITEM permission.required | Array of objects non-empty Array of update operations to perform. All items must belong to the same seller and ware. |
{- "ops": [
- {
- "id": "op-1",
- "op": "update",
- "data": {
- "id": "6721deb1accdc7036a0dd34b",
- "pricePerUnit": {
- "price": 25,
- "priceType": "absolute"
}, - "sku": "TSHIRT-SM-RED",
- "status": "published"
}
}, - {
- "id": "op-2",
- "op": "update",
- "data": {
- "id": "6721deb1accdc7036a0dd34c",
- "barcode": "1234567890123",
- "strikeThroughPrice": 35
}
}
]
}[- {
- "id": "6721deb1accdc7036a0dd34b",
- "object": "ware_catalog_item",
- "name": "T-Shirt - Small / Red",
- "type": "quantity",
- "unitType": "merchandise",
- "status": "published",
- "sku": "TSHIRT-SM-RED",
- "pricePerUnit": {
- "price": 25,
- "priceType": "absolute"
}, - "variantGroupOptions": [
- "680a1b2c3d4e5f6a7b8c9d01",
- "680a1b2c3d4e5f6a7b8c9d02"
], - "product": {
- "id": "6718b46c698afc969806fd92"
}, - "seller": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "createdAt": "2025-04-01T10:00:00+00:00",
- "updatedAt": "2025-04-27T14:30:00+00:00"
}
]Retrieve a specific catalog item by its unique identifier.
Ware catalog items: Returns a 422 validation error if the item has status: "stale".
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "id": "6721deb1accdc7036a0dd34b",
- "object": "product_catalog_item",
- "name": "Adults",
- "type": "quantity",
- "caption": "Caption Adult",
- "unitType": "demographic",
- "template": {
- "id": "65bbde2d1b8c18afc407eee8",
- "code": "adult",
- "type": "demographic"
}, - "seller": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "required": false,
- "visibility": "public",
- "createdBy": {
- "id": "65bbdc82a7d64cc4710c1b20"
}, - "createdAt": "2024-02-01T18:08:45+00:00",
- "updatedAt": "2025-03-04T13:45:31+00:00",
- "overrideParent": false,
- "parent": {
- "id": "65bbde2d1b8c18afc407eee9"
}, - "product": {
- "id": "6718b46c698afc969806fd92"
}, - "prices": {
- "price": {
- "min": 34,
- "max": 80
}, - "priceWithTaxes": {
- "min": 551,
- "max": 597
}, - "priceWithTaxesAndFees": {
- "min": 567.53,
- "max": 614.91
}
}, - "sequence": 10000
}Update an existing catalog item by ID.
Ware catalog items (ware_catalog_item):
status, photo, pricePerUnit, strikeThroughPrice, barcode, sku. Unknown keys are rejected.422 with reason updates_pending if the parent ware has pending updates or is locked.status: "stale") and deleted (status: "deleted") items cannot be updated.draft ↔ published are allowed. Publishing requires both a valid price and a SKU.| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| name | string Display name of the catalog item |
| caption | string Additional descriptive text for the catalog item |
| visibility | string Enum: "public" "private" Visibility level of the catalog item |
| required | boolean Whether this catalog item is required for purchase |
| sequence | integer >= 0 Sort order sequence for displaying catalog items |
| defaultChoice | string Default selection for choice-type catalog items |
| price | number <float> >= 0 Price override for this catalog item |
| overrideParent | boolean Whether this item overrides its global parent |
| status | string Enum: "draft" "published" Status of the ware catalog item. Only |
| sku | string Stock keeping unit identifier. Must be unique per seller. Required to publish. |
string or null Barcode for the catalog item | |
object Price per unit for ware catalog items | |
number or null Display-only original price (for showing discounts) |
{- "name": "Adults updated name",
- "caption": "Updated caption",
- "price": 50,
- "sequence": 10050000
}{- "id": "6721deb1accdc7036a0dd34b",
- "object": "product_catalog_item",
- "name": "Adults updated name",
- "type": "quantity",
- "caption": "Updated caption",
- "unitType": "demographic",
- "template": {
- "id": "65bbde2d1b8c18afc407eee8",
- "code": "adult",
- "type": "demographic"
}, - "seller": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "required": false,
- "visibility": "public",
- "createdBy": {
- "id": "65bbdc82a7d64cc4710c1b20"
}, - "createdAt": "2024-02-01T18:08:45+00:00",
- "updatedAt": "2025-03-04T13:45:31+00:00",
- "sequence": 10050000
}Soft delete a catalog item by ID. The item will be marked as deleted but not permanently removed. If the catalog item is linked to products, the deletion will be rejected with a 409 conflict error.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| cascade | boolean Default: false Whether to cascade delete related items |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Upload and attach a photo to a catalog item
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| file required | string <binary> Image file to upload |
{- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}Retrieve the photo for a catalog item. Returns a redirect to the actual image URL. Supports optional size parameter for image resizing.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| size | string Example: size=bg Image size filter:
|
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Retrieve a specific media item for a catalog item by media ID
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| mediaId required | string Example: 507f1f77bcf86cd799439011 Media ID to retrieve |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Remove a specific media item from a catalog item
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| mediaId required | string Example: 507f1f77bcf86cd799439011 Media ID to delete |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Retrieve a paginated list of collection nodes.
Authorization:
seller filter is specified, the user must be authenticated.| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
| seller | string Example: seller=507f1f77bcf86cd799439011 Filter by seller ID |
| object | string Enum: "group_collection_node" "product_collection_node" "catalog_item_collection_node" Example: object=group_collection_node Filter by collection node type |
| product | string Example: product=507f1f77bcf86cd799439011 Filter by product ID (for product_collection_node) |
| catalogItem | string Example: catalogItem=507f1f77bcf86cd799439011 Filter by catalog item ID (for catalog_item_collection_node) |
| path | string Example: path=507f1f77bcf86cd799439011 Filter by node path (exact match or prefix) |
| expand | string Example: expand=children Comma-separated list of fields to expand |
{- "data": [
- {
- "id": "6721deb1accdc7036a0dd34b",
- "object": "group_collection_node",
- "name": "Summer Collection",
- "description": "Products for the summer season",
- "sequence": 101000,
- "seller": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "createdAt": "2025-01-15T10:00:00+00:00",
- "updatedAt": "2025-01-15T10:00:00+00:00",
- "childrenCount": {
- "product_collection_node": 3,
- "catalog_item_collection_node": 2
}
}
], - "next": null
}Create a new collection node. Supports group nodes (for organizing other nodes) as well as product and catalog item leaf nodes.
Group collection nodes may include a children array to create child nodes in the same request.
Authorization:
ROLE_USER.| object required | string Enum: "group_collection_node" "product_collection_node" "catalog_item_collection_node" The type of collection node to create |
| name | string Display name of the collection node |
| description | string Optional description |
| sequence | integer Ordering sequence number (auto-assigned if not provided) |
| path | string Hierarchical path of ancestor IDs. Omit for root-level nodes. |
required | object (CollectionNodeSeller) Seller reference |
object (CollectionNodeProduct) Product reference | |
object (CollectionNodeCatalogItem) Catalog item reference | |
| children | Array of objects (CollectionNodeRequest) Child nodes to create (only valid for group_collection_node) |
{- "object": "group_collection_node",
- "name": "Summer Collection",
- "description": "Products for the summer season",
- "seller": {
- "id": "65bbde2d1b8c18afc407eee6"
}
}{- "id": "6721deb1accdc7036a0dd34b",
- "object": "group_collection_node",
- "name": "Summer Collection",
- "description": "Products for the summer season",
- "sequence": 101000,
- "seller": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "createdAt": "2025-01-15T10:00:00+00:00",
- "updatedAt": "2025-01-15T10:00:00+00:00"
}Perform bulk create and/or delete operations on collection nodes.
Each operation in ops must include a client-supplied id (for identifying errors in the response),
an op type (create or delete), and a data object.
Supported operations:
create: Create a new collection node. data must include object and other required create fields.
Only product_collection_node and catalog_item_collection_node are supported for bulk create.delete: Delete an existing collection node by data.id.Op id rules:
id must be a non-empty string of letters, digits, hyphens, or underscores.id values must be unique within the request.Error handling:
422 response is returned with details keyed by op id.
Individual operation errors include the op id and error information.Authorization:
ROLE_USER.required | Array of objects non-empty Array of operations to perform |
{- "ops": [
- {
- "id": "op-create-1",
- "op": "create",
- "data": {
- "object": "product_collection_node",
- "product": {
- "id": "6718b46c698afc969806fd92"
}, - "seller": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "path": "6721deb1accdc7036a0dd34b"
}
}, - {
- "id": "op-delete-1",
- "op": "delete",
- "data": {
- "id": "6721deb1accdc7036a0dd340"
}
}
]
}{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Retrieve a specific collection node by its unique identifier.
Authorization:
VIEW_COLLECTION_NODE permission on the node.ROLE_PRODUCT_COLLECTIONS enabled.| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| expand | string Example: expand=children Comma-separated list of fields to expand |
{- "id": "6721deb1accdc7036a0dd34b",
- "object": "group_collection_node",
- "name": "Summer Collection",
- "description": "Products for the summer season",
- "sequence": 101000,
- "seller": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "childrenCount": {
- "product_collection_node": 3,
- "catalog_item_collection_node": 2
}, - "createdAt": "2025-01-15T10:00:00+00:00",
- "updatedAt": "2025-01-15T10:00:00+00:00"
}Update an existing collection node by ID.
Allowed fields: name, description, sequence, photo, path.
For group_collection_node, children updates are also allowed.
Authorization:
EDIT_COLLECTION_NODE permission on the node.| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| expand | string Example: expand=children Comma-separated list of fields to expand |
| name | string Display name of the collection node |
| description | string Optional description |
| sequence | integer Ordering sequence number |
| path | string Hierarchical path (used to move node to a different parent) |
Media (object) or null Set to null to remove the photo (group nodes only) | |
Array of objects Child node operations (only valid for group_collection_node).
Each item must include an |
{- "name": "Updated Summer Collection",
- "description": "Updated description",
- "sequence": 102000
}{- "id": "6721deb1accdc7036a0dd34b",
- "object": "group_collection_node",
- "name": "Updated Summer Collection",
- "description": "Updated description",
- "sequence": 102000,
- "seller": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "createdAt": "2025-01-15T10:00:00+00:00",
- "updatedAt": "2025-01-16T09:00:00+00:00"
}Soft delete a collection node by ID.
For group_collection_node, all descendant nodes are also deleted recursively.
Authorization:
DELETE_COLLECTION_NODE permission on the node.| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Upload and attach a photo to a group collection node.
Authorization:
EDIT_COLLECTION_NODE permission on the node.| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| file required | string <binary> Image file to upload |
{- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}Retrieve the photo for a collection node. Returns a redirect to the actual image URL. Supports optional size parameters for image resizing.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| size | string Example: size=bg Image size filter:
|
| width | integer Example: width=800 Desired image width in pixels |
| height | integer Example: height=600 Desired image height in pixels |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Conversations are lists of messages exchanged between Sellers and Travelers that are related to a specific Order. For example, Xola commonly sends booking confirmation notifications via email or SMS, and Sellers may opt to send additional reminder and check-in notices before the start of an Event. Each of these will show up as a message inside of the Conversation history attached to the Purchase.
Retrieve a paginated list of conversations
| participant required | string ID of participant to filter conversations by |
| seller | string Filter conversations by seller ID |
| tag | string Value: "unread" Filter conversations by participant tag (e.g., 'unread') |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
{- "data": [
- {
- "id": "507f1f77bcf86cd799439011",
- "purchase": {
- "id": "507f191e810c19729de860eb"
}, - "seller": {
- "id": "507f191e810c19729de860ea"
}, - "participants": [
- {
- "id": "507f191e810c19729de860ea",
- "name": "Adventure Tours Co",
- "tags": [ ],
- "reminder": 0,
- "type": 1
}, - {
- "id": "507f191e810c19729de860ec",
- "name": "John Doe",
- "tags": [
- "unread"
], - "reminder": 0,
- "type": 2
}
], - "messages": [
- {
- "object": "message",
- "id": "507f1f77bcf86cd799439012",
- "from": "507f191e810c19729de860ea",
- "type": "email",
- "system": true,
- "channels": [
- "email"
], - "formats": [
- {
- "type": "email",
- "subject": "Trip Confirmation",
- "body": "Your trip has been confirmed!"
}
], - "to": [ ],
- "createdAt": "2024-01-15T10:30:00Z"
}
], - "createdAt": "2024-01-15T10:00:00Z",
- "updatedAt": "2024-01-15T10:30:00Z"
}
], - "paging": {
}
}Create a new conversation for a specific purchase. The conversation will automatically include participants based on the purchase (seller and traveler/organizer).
required | object Purchase to associate with the conversation |
{- "purchase": {
- "id": "507f191e810c19729de860eb"
}
}{- "id": "507f1f77bcf86cd799439011",
- "purchase": {
- "id": "507f191e810c19729de860eb"
}, - "seller": {
- "id": "507f191e810c19729de860ea"
}, - "participants": [
- {
- "id": "507f191e810c19729de860ea",
- "name": "Adventure Tours Co",
- "tags": [ ],
- "reminder": 0,
- "type": 1
}, - {
- "id": "507f191e810c19729de860ec",
- "name": "John Doe",
- "tags": [ ],
- "reminder": 0,
- "type": 2
}
], - "messages": [ ],
- "createdAt": "2024-01-15T10:00:00Z",
- "updatedAt": "2024-01-15T10:00:00Z"
}Broadcast messages to participants across multiple conversations based on filtering criteria. This endpoint allows sending either email or SMS messages to participants (travelers, guides, etc.) with reservations matching the specified filters.
Filtering Logic:
events array is provided, messages are sent to participants with reservations for those specific eventsevents is not provided, date parameter is required to filter by reservation dateexperiences array is ignored if events is providedfuture flag can include future reservations when using date-based filtering| seller required | string Seller ID to send messages from |
| subject | string Message subject (required for email messages) |
| body required | string Message body content |
| type | string Default: "email" Enum: "email" "sms" Message type (defaults to email if not specified) |
| includeGuides | boolean Default: false Whether to include guides in the message broadcast |
required | object Filters for selecting which conversations to send messages to. Either 'events' or 'date' must be provided. |
{- "subject": "Important Trip Update",
- "body": "Due to weather conditions, your trip departure time has changed to 9:30 AM.",
- "type": "email",
- "includeGuides": false,
- "filters": {
- "events": [
- "507f1f77bcf86cd799439011",
- "507f1f77bcf86cd799439012"
]
}
}{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Get detailed information about a specific conversation including all messages and participants.
| id required | string Conversation ID |
{- "id": "507f1f77bcf86cd799439011",
- "purchase": {
- "id": "507f191e810c19729de860eb"
}, - "seller": {
- "id": "507f191e810c19729de860ea"
}, - "participants": [
- {
- "id": "507f191e810c19729de860ea",
- "name": "Adventure Tours Co",
- "tags": [ ],
- "reminder": 0,
- "type": 1
}, - {
- "id": "507f191e810c19729de860ec",
- "name": "John Doe",
- "tags": [
- "unread"
], - "reminder": 0,
- "type": 2
}
], - "messages": [
- {
- "object": "message",
- "id": "507f1f77bcf86cd799439012",
- "from": "507f191e810c19729de860ea",
- "type": "email",
- "system": true,
- "channels": [
- "email"
], - "formats": [
- {
- "type": "email",
- "subject": "Trip Confirmation",
- "body": "Your adventure booking has been confirmed for January 20th!"
}
], - "to": [ ],
- "createdAt": "2024-01-15T10:30:00Z",
- "updatedAt": "2024-01-15T10:30:00Z"
}, - {
- "object": "message",
- "id": "507f1f77bcf86cd799439013",
- "from": "507f191e810c19729de860ec",
- "type": "email",
- "system": false,
- "channels": [
- "email"
], - "formats": [
- {
- "type": "email",
- "subject": "Re: Trip Confirmation",
- "body": "Thank you! Looking forward to the trip."
}
], - "to": [ ],
- "createdAt": "2024-01-15T14:15:00Z",
- "updatedAt": "2024-01-15T14:15:00Z"
}
], - "createdAt": "2024-01-15T10:00:00Z",
- "updatedAt": "2024-01-15T14:15:00Z"
}Remove a specific tag from a conversation participant. This is commonly used to mark conversations as read by removing the "unread" tag.
| id required | string Conversation ID |
| participantId required | string Participant ID |
| tag required | string Value: "unread" Tag to remove |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Xola offers the following varieties of coupons:
All coupons, with the exception of Vouchers, are applied before taxes & fees. Vouchers are applied after taxes & fees, just like a method of payment.
All coupon types support the ability to place the following restrictions at redemption:
A coupon cannot be directly used. It must have "codes" associated with it. A code may be configured to be limited use or unlimited use. Xola will keep track of the number of code usages.
{
"id": "5acc4fa307876c4f798b4567",
"name": "Winter Sale",
"amount": 20,
"type": "discount",
"algorithm": "percent",
"source": "xola",
"seller": {
"id": "57e4a620c683b1c01e8b4575"
},
"bookBySchedule": {
"id": "5b05c8ed07876c8a108b457e",
"repeat": "weekly",
"days": [0, 1, 2, 3, 4, 5, 6],
"start": "2018-08-31T15:00:00+00:00",
"end": "2018-12-31T14:59:59+00:00",
"type": "available",
"timeRanges": [],
"blackouts": []
},
"arrivalSchedule": {
"id": "5b05c8ed07876c8a108b457f",
"repeat": "weekly",
"days": [0, 1, 2, 3, 4, 5, 6],
"start": "2018-10-31T15:00:00+00:00",
"end": "2018-12-31T14:59:59+00:00",
"type": "available",
"timeRanges": [],
"blackouts": [
{
"repeat": "weekly",
"days": [2],
"start": "2018-12-24T15:00:00+00:00",
"end": "2018-12-25T14:59:59+00:00",
"type": "unavailable",
"timeRanges": [],
"id": "5b05c8ed07876c8a108b4580"
}
]
},
"createdAt": "2018-04-10T05:46:11+00:00",
"createdBy": {
"id": "4f293e17536e86bc66000000"
},
"updatedAt": "2018-05-23T20:02:53+00:00",
"experiences": {
"all": true,
"experiences": []
},
"tags": [
{
"system": true,
"id": "winter is coming"
}
]
}
Get all coupons based on filters. This endpoint will NOT return coupon codes but it will return total uses for all codes in this coupon.
To retrieve coupons, either the seller or experience must be specified as a filter.
Optionally you may specify arrival or arrivalTime filters to restrict the response to
coupons that can only be applied to orders with the specified arrival date & time.
There are two varieties of coupon:
Rules to calculate a discount coupon
Discount coupons rely on the type and algorithm attributes that determine how the coupon value is calculated:
amount as an absolute value or a percent valueperson) or a flat discount for the entire booking (discount)| expand | string Value: "purchaseRule" You can expand multiple objects at the same time by providing a comma-separated list of values |
| seller | string Example: seller=65bbde2d1b8c18afc407eee6 Seller ID to filter coupons by (required unless experience is specified) |
| experience | string Example: experience=68652ca5ff69705d380c1ef0 Experience ID to filter coupons by (required unless seller is specified) |
| code | string Example: code=SUMMER2025 Specific coupon code to search for |
| arrival | string <date> Example: arrival=2025-09-15 Arrival date to filter applicable coupons |
| arrivalTime | string <date-time> Example: arrivalTime=2025-09-15T14:30:00Z Arrival date and time to filter applicable coupons |
| limit | integer [ 1 .. 100 ] Default: 20 Maximum number of results to return |
| skip | integer >= 0 Default: 0 Number of results to skip for pagination |
{- "data": [
- {
- "id": "68b704c3bc33ee2ba00b07e2",
- "name": "Summer Sale",
- "limit": 100,
- "type": "discount",
- "source": "xola",
- "excludeTaxFee": true,
- "amount": 10,
- "algorithm": "absolute",
- "experiences": {
- "all": false,
- "experiences": [
- "68652ca5ff69705d380c1ef0"
]
}, - "seller": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "createdAt": "2025-09-02T14:52:51+00:00",
- "createdBy": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "tags": [ ],
- "triggers": [ ],
- "rewards": [ ],
- "terms": [ ],
- "promotions": [ ]
}
], - "paging": {
- "next": null
}
}Create a new coupon with purchase rules and optional initial coupon codes.
Sample request for discount coupon:
Purchase Rules: Modern coupons use purchase rules instead of the deprecated triggers/rewards system. Purchase rules define:
| name required | string Name of the coupon |
| type required | string Enum: "discount" "person" "unlock" "voucher" "bxgy" Type of coupon:
|
| algorithm | string Enum: "percent" "absolute" Algorithm used to calculate discount:
|
| amount | number <float> >= 0 Discount amount (percentage or absolute value based on algorithm) |
integer or null Maximum number of times the coupon can be used (null for unlimited) | |
| source | string Enum: "xola" "gift" "store_credit" "groupon" "membership" Source/origin of the coupon:
|
| excludeTaxFee | boolean Default: false Whether to exclude taxes and fees when applying the coupon |
Array of objects (Tag) Tags associated with the coupon | |
object (SelectedExperiences) Experiences this coupon can be applied to | |
required | object (ObjectReference) Seller who owns this coupon |
Discount Coupon Purchase Rule (object) or BXGY Coupon Purchase Rule (object) or Voucher Coupon Purchase Rule (object) Purchase rule configuration for the coupon | |
Array of objects (CouponCodeInput) Initial coupon codes to create with the coupon | |
string or null How to handle duplicate codes:
| |
| purchaseAmount | number <float> >= 0 Original purchase amount for voucher coupons |
| maxDemographics | integer >= 1 Maximum number of demographics the voucher can be applied to |
| paymentMethod | string Payment method used for voucher (e.g., Groupon, Living Social) |
Array of strings or null Permissions required to use this coupon |
{- "type": "discount",
- "name": "Summer Sale 10% Off",
- "limit": 100,
- "tags": [
- {
- "id": "summer-promo"
}
], - "excludeTaxFee": true,
- "seller": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "algorithm": "absolute",
- "amount": 10,
- "source": "xola",
- "experiences": {
- "all": false,
- "experiences": [
- "68652ca5ff69705d380c1ef0"
]
}, - "codes": [
- {
- "code": "SUMMER10",
- "uses": 0
}
], - "duplicate": null
}{- "name": "Summer Sale 20% Off",
- "type": "discount",
- "algorithm": "absolute",
- "amount": 10,
- "limit": 100,
- "source": "xola",
- "excludeTaxFee": false,
- "tags": [
- {
- "id": "string",
- "system": false,
- "type": "string"
}
], - "experiences": {
- "all": false,
- "experiences": [
- "68652ca5ff69705d380c1ef0",
- "67ff84b97e19ac1ec80fd362"
]
}, - "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "id": "68b704c3bc33ee2ba00b07e2",
- "purchaseRulePermanentId": "68b704c4bc33ee2ba00b07e5",
- "purchaseRule": {
- "name": "string",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": true,
- "required": true,
- "sequence": 0,
- "processActionsForIgnoredValidations": true,
- "shouldCheckFieldValueForIgnoredValidations": true,
- "tags": [
- {
- "id": "string",
- "system": false,
- "type": "string"
}
], - "meta": { },
- "id": "string",
- "object": "purchase_rule",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "deletedAt": "2019-08-24T14:15:22Z",
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "filter": {
- "id": "string",
- "object": "all_filter",
- "operator": "string",
- "errorCode": "string",
- "errorMessage": "string",
- "validationLevel": "ignore",
- "parameterizedErrorMessage": "string",
- "field": "string",
- "operand": [ ],
- "aggregator": {
- "id": "string",
- "object": "string",
- "operator": "string"
}, - "operandAggregator": {
- "id": "string",
- "object": "string",
- "operator": "string"
}
}, - "actions": [
- {
- "_remove": true,
- "id": "string",
- "object": "copy_line_item_action",
- "template": {
- "id": "string",
- "object": "line_item_template",
- "name": "string",
- "description": "string",
- "type": "string",
- "amount": 0.1,
- "amountType": "string"
}, - "shortcut": { },
- "modifiers": [
- {
- "id": "string",
- "field": "string",
- "operation": "set",
- "aggregator": {
- "id": "string",
- "object": "bxgy_discount_aggregator",
- "operator": "string",
- "operand": null
}
}
]
}
]
}, - "balance": 0.1,
- "triggers": [
- { }
], - "rewards": [
- { }
], - "terms": [
- { }
], - "promotions": [
- { }
], - "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedAt": "2019-08-24T14:15:22Z",
- "deletedAt": "2019-08-24T14:15:22Z",
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "purchaseAmount": 80,
- "maxDemographics": 2,
- "paymentMethod": "Groupon",
- "permissions": [
- "ROLE_SELLER_ADMIN",
- "ROLE_RESERVATION_LITE"
]
}Retrieve a specific coupon by its ID. To retrieve a coupon, you must have VIEW_COUPON permission.
The response includes complete coupon details including associated purchase rules (when expanded).
| id required | string Example: 68b704c3bc33ee2ba00b07e2 Coupon ID |
| expand | string Value: "purchaseRule" You can expand multiple objects at the same time by providing a comma-separated list of values |
{- "id": "68b704c3bc33ee2ba00b07e2",
- "name": "Summer Sale",
- "limit": 100,
- "type": "discount",
- "source": "xola",
- "excludeTaxFee": true,
- "amount": 10,
- "algorithm": "absolute",
- "experiences": {
- "all": false,
- "experiences": [
- "68652ca5ff69705d380c1ef0"
]
}, - "seller": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "purchaseRulePermanentId": "68b704c4bc33ee2ba00b07e5",
- "purchaseRule": {
- "id": "68b704c4bc33ee2ba00b07e5",
- "name": "Purchase rule for coupon Summer Sale",
- "object": "purchase_item_rule",
- "seller": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "actions": [ ],
- "createdAt": "2025-09-02T14:52:51+00:00",
- "updatedAt": "2025-09-02T14:52:51+00:00",
- "createdBy": {
- "id": "65bbde2d1b8c18afc407eee6"
}
}, - "createdAt": "2025-09-02T14:52:51+00:00",
- "createdBy": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "tags": [ ],
- "triggers": [ ],
- "rewards": [ ],
- "terms": [ ],
- "promotions": [ ]
}Update an existing coupon's properties. You must have EDIT_COUPON permission.
Note: Some fields like purchase rules may have restrictions on updates depending on usage.
| id required | string Example: 68b704c3bc33ee2ba00b07e2 Coupon ID |
| name required | string Name of the coupon |
| type required | string Enum: "discount" "person" "unlock" "voucher" "bxgy" Type of coupon:
|
| algorithm | string Enum: "percent" "absolute" Algorithm used to calculate discount:
|
| amount | number <float> >= 0 Discount amount (percentage or absolute value based on algorithm) |
integer or null Maximum number of times the coupon can be used (null for unlimited) | |
| source | string Enum: "xola" "gift" "store_credit" "groupon" "membership" Source/origin of the coupon:
|
| excludeTaxFee | boolean Default: false Whether to exclude taxes and fees when applying the coupon |
Array of objects (Tag) Tags associated with the coupon | |
object (SelectedExperiences) Experiences this coupon can be applied to | |
required | object (ObjectReference) Seller who owns this coupon |
Discount Coupon Purchase Rule (object) or BXGY Coupon Purchase Rule (object) or Voucher Coupon Purchase Rule (object) Purchase rule configuration for the coupon | |
Array of objects (CouponCodeInput) Initial coupon codes to create with the coupon | |
string or null How to handle duplicate codes:
| |
| purchaseAmount | number <float> >= 0 Original purchase amount for voucher coupons |
| maxDemographics | integer >= 1 Maximum number of demographics the voucher can be applied to |
| paymentMethod | string Payment method used for voucher (e.g., Groupon, Living Social) |
Array of strings or null Permissions required to use this coupon |
{- "name": "Updated Summer Sale",
- "type": "discount",
- "limit": 200,
- "excludeTaxFee": false,
- "algorithm": "percent",
- "amount": 15,
- "seller": {
- "id": "65bbde2d1b8c18afc407eee6"
}
}{- "name": "Summer Sale 20% Off",
- "type": "discount",
- "algorithm": "absolute",
- "amount": 10,
- "limit": 100,
- "source": "xola",
- "excludeTaxFee": false,
- "tags": [
- {
- "id": "string",
- "system": false,
- "type": "string"
}
], - "experiences": {
- "all": false,
- "experiences": [
- "68652ca5ff69705d380c1ef0",
- "67ff84b97e19ac1ec80fd362"
]
}, - "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "id": "68b704c3bc33ee2ba00b07e2",
- "purchaseRulePermanentId": "68b704c4bc33ee2ba00b07e5",
- "purchaseRule": {
- "name": "string",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": true,
- "required": true,
- "sequence": 0,
- "processActionsForIgnoredValidations": true,
- "shouldCheckFieldValueForIgnoredValidations": true,
- "tags": [
- {
- "id": "string",
- "system": false,
- "type": "string"
}
], - "meta": { },
- "id": "string",
- "object": "purchase_rule",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "deletedAt": "2019-08-24T14:15:22Z",
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "filter": {
- "id": "string",
- "object": "all_filter",
- "operator": "string",
- "errorCode": "string",
- "errorMessage": "string",
- "validationLevel": "ignore",
- "parameterizedErrorMessage": "string",
- "field": "string",
- "operand": [ ],
- "aggregator": {
- "id": "string",
- "object": "string",
- "operator": "string"
}, - "operandAggregator": {
- "id": "string",
- "object": "string",
- "operator": "string"
}
}, - "actions": [
- {
- "_remove": true,
- "id": "string",
- "object": "copy_line_item_action",
- "template": {
- "id": "string",
- "object": "line_item_template",
- "name": "string",
- "description": "string",
- "type": "string",
- "amount": 0.1,
- "amountType": "string"
}, - "shortcut": { },
- "modifiers": [
- {
- "id": "string",
- "field": "string",
- "operation": "set",
- "aggregator": {
- "id": "string",
- "object": "bxgy_discount_aggregator",
- "operator": "string",
- "operand": null
}
}
]
}
]
}, - "balance": 0.1,
- "triggers": [
- { }
], - "rewards": [
- { }
], - "terms": [
- { }
], - "promotions": [
- { }
], - "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedAt": "2019-08-24T14:15:22Z",
- "deletedAt": "2019-08-24T14:15:22Z",
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "purchaseAmount": 80,
- "maxDemographics": 2,
- "paymentMethod": "Groupon",
- "permissions": [
- "ROLE_SELLER_ADMIN",
- "ROLE_RESERVATION_LITE"
]
}Soft delete a coupon by setting the deletedAt timestamp. You must have EDIT_COUPON permission.
Note: This does not immediately void associated coupon codes.
| id required | string Example: 68b704c3bc33ee2ba00b07e2 Coupon ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}A Coupon cannot be used unless it has codes associated with it.
Each coupon code has a user-specified identifier (code) that must be unique across all active coupon campaigns. Its usage may be limited or left open for unlimited use. Usage of coupons is tracked at the code level to measure the efficacy of your coupon campaign.
The list of codes for a given coupon would typically be specified during coupon creation within the codes property. Alternately, you may use these endpoints to operate at a per-code level.
{
"id": "5acc50ef07876cf24d8b456f",
"code": "23voucher",
"coupon": {
"id": "5acc50ef07876cf24d8b456c"
},
"status": 100,
"orders": [],
"uses": 0
}
Returns a paginated list of coupon codes associated with a specific coupon. You must have VIEW_COUPON permission for the parent coupon.
| id required | string Example: 68b704c3bc33ee2ba00b07e2 Coupon ID |
| limit | integer [ 1 .. 100 ] Default: 20 Maximum number of results to return |
| skip | integer >= 0 Default: 0 Number of results to skip for pagination |
{- "data": [
- {
- "id": "68b704c5bc33ee2ba00b07e3",
- "code": "SUMMER10",
- "status": 100,
- "uses": 3,
- "limit": null,
- "coupon": {
- "id": "68b704c3bc33ee2ba00b07e2"
}, - "objects": [
- "order1",
- "order2",
- "order3"
], - "createdAt": "2025-09-02T14:52:52+00:00"
}, - {
- "id": "68b704c6bc33ee2ba00b07e4",
- "code": "SUMMER20",
- "status": 100,
- "uses": 0,
- "limit": null,
- "coupon": {
- "id": "68b704c3bc33ee2ba00b07e2"
}, - "objects": [ ],
- "createdAt": "2025-09-02T14:52:52+00:00"
}
], - "paging": {
- "next": null
}
}Create one or more coupon codes for a specific coupon. You must have EDIT_COUPON permission.
Batch Creation:
batch=true query parameter to create multiple codes at onceDuplicate Handling:
duplicate query parameter to control behavior when codes already exist| id required | string Example: 68b704c3bc33ee2ba00b07e2 Coupon ID |
| batch | boolean Default: false Whether to create multiple codes in batch mode |
| duplicate | string Enum: "void" "skip" How to handle duplicate codes:
|
| code required | string^[^\s<>&"']+$ The coupon code to create |
| uses | integer >= 0 Default: 0 Initial usage count (typically 0) |
{- "code": "NEWCODE123",
- "uses": 0
}""Retrieve details of a specific coupon code. You must have VIEW_COUPON permission.
| id required | string Example: 68b704c3bc33ee2ba00b07e2 Coupon ID |
| codeId required | string Example: 68b704c5bc33ee2ba00b07e3 Coupon code ID |
{- "id": "68b704c5bc33ee2ba00b07e3",
- "code": "SUMMER10",
- "status": 100,
- "uses": 3,
- "limit": null,
- "coupon": {
- "id": "68b704c3bc33ee2ba00b07e2"
}, - "objects": [
- "order1",
- "order2",
- "order3"
], - "createdAt": "2025-09-02T14:52:52+00:00",
- "updatedAt": "2025-09-02T15:30:15+00:00"
}Update a specific coupon code. You must have EDIT_COUPON permission.
Restrictions:
| id required | string Example: 68b704c3bc33ee2ba00b07e2 Coupon ID |
| codeId required | string Example: 68b704c5bc33ee2ba00b07e3 Coupon code ID |
| code required | string^[^\s<>&"']+$ Updated coupon code |
| status | integer Value: 400 Status can only be set to void (400) |
{- "code": "UPDATEDCODE"
}{- "code": "SUMMER2025",
- "status": 100,
- "uses": 5,
- "limit": 10,
- "id": "68b704c5bc33ee2ba00b07e3",
- "coupon": {
- "id": "507f1f77bcf86cd799439011"
}, - "objects": [
- "string"
], - "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedAt": "2019-08-24T14:15:22Z",
- "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "deletedAt": "2019-08-24T14:15:22Z",
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}Void a specific coupon code to prevent it from being used against future orders. You must have EDIT_COUPON permission.
Note: Cannot void the special 'iin-discount' code.
| id required | string Example: 68b704c3bc33ee2ba00b07e2 Coupon ID |
| codeId required | string Example: 68b704c5bc33ee2ba00b07e3 Coupon code ID |
{- "errors": {
- "property1": "string",
- "property2": "string"
}
}Search for coupon codes across all coupons. This is a utility endpoint for code lookup. Results depend on user permissions and seller access.
Required Parameters:
seller must be specified, or code must be provided for unauthenticated searchesPermissions:
VIEW_COUPON_CODE permission: Can search all codes for the seller| expand | string Value: "coupon" You can expand multiple objects at the same time by providing a comma-separated list of values |
| code | string Example: code=SUMMER10 Specific code to search for (required for unauthenticated searches) |
| seller | string Example: seller=65bbde2d1b8c18afc407eee6 Seller ID to filter by (required unless searching by code only) |
| coupon | string Example: coupon=68b704c3bc33ee2ba00b07e2 Coupon ID to filter codes by specific coupon |
| status | integer Enum: 100 200 400 Example: status=100 Filter by coupon code status:
|
| limit | integer [ 1 .. 100 ] Default: 20 Maximum number of results to return |
| skip | integer >= 0 Default: 0 Number of results to skip for pagination |
{- "data": [
- {
- "code": "SUMMER2025",
- "status": 100,
- "uses": 5,
- "limit": 10,
- "id": "68b704c5bc33ee2ba00b07e3",
- "coupon": {
- "id": "507f1f77bcf86cd799439011"
}, - "objects": [
- "string"
], - "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedAt": "2019-08-24T14:15:22Z",
- "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "deletedAt": "2019-08-24T14:15:22Z",
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "paging": {
- "next": "string",
- "_es": true
}
}Retrieve a list of delegates for the specified user. Delegates are users who have been granted specific permissions to act on behalf of the user's account.
Authorization Requirements:
ROLE_USER or higherVIEW_USER_DELEGATES permission for the target user, ORROLE_APP_STOREPermission Filtering:
Use the permission query parameter to filter delegates by a specific permission role.
| id required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439011 User ID to get delegates for |
| permission | string Example: permission=ROLE_BOOKING_ENGINE Filter delegates by specific permission role |
[- {
- "id": "507f1f77bcf86cd799439011",
- "permissions": [
- {
- "name": "ROLE_BOOKING_ENGINE",
- "selectedExperiences": {
- "all": true,
- "experiences": [ ]
}
}
], - "user": {
- "id": "507f1f77bcf86cd799439011",
- "name": "John Smith",
- "email": "john.smith@example.com",
- "phone": "+1-555-123-4567",
- "username": "john.smith@example.com",
- "emailCanonical": "john.smith@example.com",
- "usernameCanonical": "john.smith@example.com",
- "enabled": true,
- "type": 3,
- "lastLogin": "2024-03-12T15:55:31+00:00",
- "roles": [
- "ROLE_USER",
- "ROLE_BOOKING_ENGINE"
], - "remoteCards": [ ],
- "delegates": [ ]
}
}, - {
- "id": "507f1f77bcf86cd799439012",
- "permissions": [
- {
- "name": "ROLE_GUIDE"
}
], - "user": {
- "id": "507f1f77bcf86cd799439012",
- "name": "Jane Doe",
- "email": "jane.doe@example.com",
- "phone": "+1-555-987-6543",
- "username": "jane.doe@example.com",
- "emailCanonical": "jane.doe@example.com",
- "usernameCanonical": "jane.doe@example.com",
- "enabled": true,
- "type": 3,
- "lastLogin": "2024-03-13T10:25:15+00:00",
- "roles": [
- "ROLE_USER",
- "ROLE_GUIDE"
], - "remoteCards": [ ],
- "delegates": [ ]
}
}
]Add a new delegate to the specified user account. If a user with the provided email already exists in Xola, that user will be added as the delegate. If no user exists with the email, a new user will be created and a verification email will be sent.
Important: This endpoint creates the delegate but does not grant any permissions.
The permissions array in the response will always be empty. Use the individual
permission endpoints (PUT /users/{id}/delegates/{delegateId}/permissions/{permission})
to grant specific permissions to the delegate.
Authorization Requirements:
ROLE_USER or higher EDIT_USER_DELEGATES permission for the target userEmail Notifications:
Business Rules:
| id required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439011 User ID to create delegate for |
| name | string Full name of the delegate |
| email required | string <email> Email address of the delegate |
| phone | string Phone number of the delegate |
{- "name": "John Smith",
- "email": "john.smith@example.com",
- "phone": "+1-555-123-4567"
}{- "id": "507f1f77bcf86cd799439014",
- "permissions": [ ],
- "user": {
- "id": "507f1f77bcf86cd799439014",
- "enabled": true,
- "remoteCards": [ ],
- "name": "Jane Doe",
- "email": "jane.doe@example.com",
- "phone": "+1-555-987-6543",
- "emailCanonical": "jane.doe@example.com",
- "username": "jane.doe@example.com",
- "usernameCanonical": "jane.doe@example.com",
- "delegates": [ ]
}, - "name": "Jane Doe",
- "email": "jane.doe@example.com",
- "enabled": true
}Retrieve details for a specific delegate of the user account.
Authorization Requirements:
ROLE_USER or higherVIEW_USER_DELEGATES permission for the target user, ORROLE_APP_STORE| id required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439011 User ID that owns the delegate |
| delegateId required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439012 ID of the delegate user to retrieve |
{- "id": "507f1f77bcf86cd799439012",
- "permissions": [
- {
- "name": "ROLE_BOOKING_ENGINE",
- "selectedExperiences": {
- "all": true,
- "experiences": [ ]
}
}
], - "user": {
- "id": "507f1f77bcf86cd799439012",
- "name": "John Smith",
- "email": "john.smith@example.com",
- "phone": "+1-555-123-4567",
- "username": "john.smith@example.com",
- "emailCanonical": "john.smith@example.com",
- "usernameCanonical": "john.smith@example.com",
- "enabled": true,
- "type": 3,
- "lastLogin": "2024-03-12T15:55:31+00:00",
- "roles": [
- "ROLE_USER"
], - "remoteCards": [ ],
- "delegates": [ ]
}
}Create a new delegate or update permissions for an existing delegate. This endpoint performs an upsert operation - if the delegate doesn't exist, it will be created.
Authorization Requirements:
ROLE_USER or higherEDIT_USER_DELEGATES permission for the target user, ORPermission Management:
Special Cases:
| id required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439011 User ID that will own the delegate |
| delegateId required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439012 ID of the user to be added/updated as delegate |
required | Array of objects (PermissionRequest) List of permissions to grant to the delegate (replaces existing permissions) |
{- "permissions": [
- {
- "name": "ROLE_RESERVATION"
}
]
}{- "id": "507f1f77bcf86cd799439012",
- "permissions": [
- {
- "name": "ROLE_RESERVATION"
}, - {
- "name": "ROLE_ACCOUNTANT"
}
], - "user": {
- "id": "507f1f77bcf86cd799439012",
- "name": "John Smith",
- "email": "john.smith@example.com",
- "phone": "+1-555-123-4567",
- "username": "john.smith@example.com",
- "emailCanonical": "john.smith@example.com",
- "usernameCanonical": "john.smith@example.com",
- "enabled": true,
- "type": 3,
- "lastLogin": "2024-03-12T15:55:31+00:00",
- "roles": [
- "ROLE_USER"
], - "remoteCards": [ ],
- "delegates": [ ]
}
}Remove a delegate from the user account. This revokes all delegated permissions and access to the account.
Authorization Requirements:
ROLE_USER or higherEDIT_USER_DELEGATES permission for the target user, ORSide Effects:
Special Cases:
| id required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439011 User ID that owns the delegate |
| delegateId required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439012 ID of the delegate user to remove |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Grant a specific permission to a delegate or update an existing permission. This is the primary way to manage individual permissions for delegates after they have been created.
Authorization Requirements:
ROLE_USER or higherEDIT_USER_DELEGATES permission for the target userPermission Management:
Special Cases:
| id required | string^[0-9a-fA-F]{24}$ Example: 65bbde2d1b8c18afc407eee6 User ID that owns the delegate |
| delegateId required | string^[0-9a-fA-F]{24}$ Example: 68b86d40fc7a6260d70f44ae ID of the delegate user to grant permission to |
| permission required | string Example: ROLE_CURATOR The permission role to grant |
| name required | string Name of the permission role (see Permission schema for available roles) |
object (SelectedExperiencesRequest) Request payload for specifying experience-level granularity for permissions |
{- "name": "ROLE_CURATOR"
}{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}An event represents a collection of bookings for one experience at a scheduled date and time. This object keeps track of the capacity of that particular timeslot for the experience. In Xola's seller interface, events are what are shown on the dashboard.
Fetch all events based on specific filters. An event represents a collection of bookings for one experience that departs at a specific time. Events are automatically created when bookings are made or can be manually created.
Supports roster export format when format=roster parameter is used.
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
| expand | string Enum: "experience" "resource" "guide" "schedule" You can expand multiple objects at the same time by providing a comma-separated list of values |
| seller | string Filter events by seller ID |
| experience | string Filter events by experience ID |
| guide | string Filter events by assigned guide ID |
| start | integer <int64> Example: start=1734256800 Start of the date range to filter events by, as a Unix timestamp
(integer seconds since the epoch, UTC). Events whose |
| end | integer <int64> Example: end=1736935200 End of the date range to filter events by, as a Unix timestamp
(integer seconds since the epoch, UTC). Defaults to one month after
|
| offset | integer Example: offset=-19800 Timezone offset, in seconds, applied to the |
| format | string Default: "json" Enum: "json" "roster" Response format (use 'roster' for Excel export) |
| open | integer >= 0 Filter by minimum open capacity |
| closed | boolean Default: false Include closed events |
{- "data": [
- {
- "id": "507f1f77bcf86cd799439011",
- "start": "2024-12-15T10:00:00Z",
- "actualStart": "2024-12-15T10:00:00-05:00",
- "end": "2024-12-15T12:00:00Z",
- "title": "Morning Kayak Tour",
- "experience": {
- "id": "507f1f77bcf86cd799439012"
}, - "groupId": null,
- "max": 12,
- "open": 3,
- "private": false,
- "virtualMeeting": false,
- "quantity": {
- "reserved": 0,
- "confirmed": 9,
- "pending": 0,
- "canceled": 0,
- "total": 9
}, - "seller": {
- "id": "507f1f77bcf86cd799439013"
}, - "orders": [
- "507f1f77bcf86cd799439014"
], - "purchaseItems": [
- "507f1f77bcf86cd799439015"
], - "guides": [
- {
- "status": "confirmed",
- "guide": {
- "id": "507f1f77bcf86cd799439017"
}, - "assignedBy": "507f1f77bcf86cd799439018"
}
], - "object": "event"
}
], - "paging": {
- "next": null
}
}Create a new event (trip) for an experience. A trip represents a collection of bookings for one experience that departs at the same time. Events are usually created automatically when bookings are made, but this endpoint allows manual creation for assigning guides or modifying capacity.
required | object |
| start required | string <date-time> Start date and time for the event |
| title | string Optional title override |
| max | integer >= 0 Maximum capacity override |
Array of objects | |
Array of objects (ResourceUsageInput) Resources to assign to this event | |
| manual | boolean Default: false Flag to create a manual event outside of configured schedules |
{- "experience": {
- "id": "507f1f77bcf86cd799439012"
}, - "start": "2024-12-15T10:00:00Z",
- "max": 12
}{- "id": "507f1f77bcf86cd799439011",
- "start": "2024-12-15T10:00:00Z",
- "actualStart": "2024-12-15T10:00:00-05:00",
- "end": "2024-12-15T12:00:00Z",
- "title": "Morning Kayak Tour",
- "experience": {
- "id": "507f1f77bcf86cd799439012"
}, - "groupId": null,
- "max": 12,
- "open": 12,
- "private": false,
- "virtualMeeting": false,
- "quantity": {
- "reserved": 0,
- "confirmed": 0,
- "pending": 0,
- "canceled": 0,
- "total": 0
}, - "seller": {
- "id": "507f1f77bcf86cd799439013"
}, - "orders": [ ],
- "purchaseItems": [ ],
- "guides": [ ],
- "object": "event",
- "createdAt": "2024-12-14T15:30:00Z",
- "createdBy": "507f1f77bcf86cd799439018"
}Fetch a specific event (trip) by ID. An event represents a collection of bookings for one experience that departs at a specific time.
Supports roster export format when format=roster parameter is used.
| id required | string Event ID |
| expand | string Enum: "experience" "resource" "guide" "schedule" You can expand multiple objects at the same time by providing a comma-separated list of values |
| format | string Default: "json" Enum: "json" "roster" Response format (use 'roster' for Excel export) |
{- "id": "507f1f77bcf86cd799439011",
- "start": "2024-12-15T10:00:00Z",
- "actualStart": "2024-12-15T10:00:00-05:00",
- "end": "2024-12-15T12:00:00Z",
- "title": "Morning Kayak Tour",
- "experience": {
- "id": "507f1f77bcf86cd799439012"
}, - "groupId": null,
- "max": 12,
- "open": 3,
- "private": false,
- "virtualMeeting": false,
- "quantity": {
- "reserved": 0,
- "confirmed": 9,
- "pending": 0,
- "canceled": 0,
- "total": 9
}, - "seller": {
- "id": "507f1f77bcf86cd799439013"
}, - "orders": [
- "507f1f77bcf86cd799439014"
], - "purchaseItems": [
- "507f1f77bcf86cd799439015"
], - "guides": [
- {
- "status": "confirmed",
- "guide": {
- "id": "507f1f77bcf86cd799439017"
}, - "assignedBy": "507f1f77bcf86cd799439018"
}
], - "object": "event"
}Update an event's properties. Currently only supports updating the max capacity. Updating the max capacity allows you to override the maximum trip capacity configured in the experience configuration.
| id required | string Event ID |
| max required | integer >= 0 Maximum capacity override |
| manual | boolean Default: false Flag to reopen a closed event as manual |
{- "max": 15
}{- "id": "string",
- "start": "2019-08-24T14:15:22Z",
- "actualStart": "2019-08-24T14:15:22Z",
- "end": "2019-08-24T14:15:22Z",
- "title": "string",
- "experience": {
- "id": "507f1f77bcf86cd799439011"
}, - "groupId": "string",
- "max": 0,
- "open": 0,
- "private": true,
- "virtualMeeting": true,
- "quantity": {
- "reserved": 0,
- "confirmed": 0,
- "pending": 0,
- "canceled": 0,
- "total": 0
}, - "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "orders": [
- "string"
], - "purchaseItems": [
- "string"
], - "guides": [
- {
- "status": "pending",
- "guide": {
- "id": "507f1f77bcf86cd799439011"
}, - "assignedBy": "string"
}
], - "object": "event",
- "manual": true,
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": "string",
- "updated": "2019-08-24T14:15:22Z",
- "notes": [
- {
- "id": "507f1f77bcf86cd799439011",
- "text": "Customer requested a window seat",
- "created": "2019-08-24T14:15:22Z",
- "updated": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": false
}
], - "aggregation": {
- "demographics": { },
- "addOns": { },
- "guestStatus": { },
- "orderNotes": [
- "string"
]
}, - "resourceUsages": [
- {
- "id": "string",
- "resource": {
- "id": "507f1f77bcf86cd799439011"
}, - "quantity": 1,
- "manuallyAssignedAt": "2019-08-24T14:15:22Z",
- "manuallyAssignedBy": "string"
}
], - "organizer": { }
}Partially update an event's properties. This is an alias for the PUT operation and supports the same functionality.
| id required | string Event ID |
| max required | integer >= 0 Maximum capacity override |
| manual | boolean Default: false Flag to reopen a closed event as manual |
{- "max": 0,
- "manual": false
}{- "id": "string",
- "start": "2019-08-24T14:15:22Z",
- "actualStart": "2019-08-24T14:15:22Z",
- "end": "2019-08-24T14:15:22Z",
- "title": "string",
- "experience": {
- "id": "507f1f77bcf86cd799439011"
}, - "groupId": "string",
- "max": 0,
- "open": 0,
- "private": true,
- "virtualMeeting": true,
- "quantity": {
- "reserved": 0,
- "confirmed": 0,
- "pending": 0,
- "canceled": 0,
- "total": 0
}, - "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "orders": [
- "string"
], - "purchaseItems": [
- "string"
], - "guides": [
- {
- "status": "pending",
- "guide": {
- "id": "507f1f77bcf86cd799439011"
}, - "assignedBy": "string"
}
], - "object": "event",
- "manual": true,
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": "string",
- "updated": "2019-08-24T14:15:22Z",
- "notes": [
- {
- "id": "507f1f77bcf86cd799439011",
- "text": "Customer requested a window seat",
- "created": "2019-08-24T14:15:22Z",
- "updated": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": false
}
], - "aggregation": {
- "demographics": { },
- "addOns": { },
- "guestStatus": { },
- "orderNotes": [
- "string"
]
}, - "resourceUsages": [
- {
- "id": "string",
- "resource": {
- "id": "507f1f77bcf86cd799439011"
}, - "quantity": 1,
- "manuallyAssignedAt": "2019-08-24T14:15:22Z",
- "manuallyAssignedBy": "string"
}
], - "organizer": { }
}Delete a manual type event which has no orders. Only events that were manually created and have no associated bookings can be deleted.
| id required | string Event ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Send the trip roster to the seller and any assigned guides through email. This action triggers email delivery of the event participant list.
| id required | string Event ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Get all guides currently assigned to an event. Returns basic guide information for each assigned guide.
| id required | string Event ID |
[- {
- "id": "6787755aab90821c3b053613",
- "object": "user_profile",
- "bio": "",
- "name": "Guide 1",
- "phone": "5555555",
- "user": {
- "id": "67877559ab90821c3b053612"
}, - "seller": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "schedules": [
- {
- "id": "678775c41778b1a2da085374",
- "name": "all the time",
- "days": [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6
], - "start": "2025-01-15T05:00:00+00:00",
- "repeat": "weekly",
- "type": "available",
- "createdAt": "2025-01-15T08:45:56+00:00",
- "updatedAt": "2025-01-15T08:45:56+00:00"
}
], - "createdBy": {
- "id": "65bbde2d1b8c18afc407eee6"
}, - "updatedAt": "2025-01-15T08:45:56+00:00",
- "guidePermission": {
- "canModifySchedules": true,
- "modifySchedulesOffset": 30
}
}
]Add a guide to an event. Only users with guide management permissions can add guides to events. The system will check for guide availability conflicts with other events.
| id required | string Event ID |
required | object |
{- "guide": {
- "id": "507f1f77bcf86cd799439017"
}
}{- "status": "confirmed",
- "guide": {
- "id": "507f1f77bcf86cd799439017"
}, - "assignedBy": "507f1f77bcf86cd799439018"
}Update an event guide assignment. Supports updating the guide's status (e.g., to confirm or decline). The authenticated user must be the guide themselves.
When setting status to declined, the seller's guide notification
preference allowDecline must permit it. If decline is not allowed, a
403 Forbidden response is returned.
| id required | string Event ID |
| guideId required | string Guide ID |
| status | string Enum: "pending" "confirmed" "declined" New status for the guide assignment. Setting to |
{- "status": "pending"
}{- "status": "pending",
- "guide": {
- "id": "507f1f77bcf86cd799439011"
}, - "assignedBy": "string"
}Remove a guide from an event. This will unassign the guide from the specified event.
| id required | string Event ID |
| guideId required | string Guide ID to remove |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Confirm a guide's assignment to an event. This updates the guide's status to confirmed. Typically invoked via a link in the guide's assignment notification email.
| id required | string Event ID |
| guideId required | string Guide ID to confirm |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Decline a guide's assignment to an event. This updates the guide's status to declined and sends a notification email to the user who originally assigned the guide (or the seller as a fallback).
Typically invoked via a link in the guide's assignment notification email.
Triggers a guide_declined_to_seller notification to the assigner.
If the seller's allowDecline guide notification preference is set to
false, the decline is not processed and an HTML page with a
decline_not_allowed status is returned instead.
| id required | string Event ID |
| guideId required | string Guide ID to decline |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Add a note to an event. When the event belongs to a group, the note is attached to the primary event of the group.
Requires the EDIT_EVENT_NOTES permission on the event.
| id required | string Example: 507f1f77bcf86cd799439011 Event ID |
| text required | string Note content |
{- "text": "Guide running 10 minutes late"
}{- "id": "507f1f77bcf86cd799439011",
- "text": "Customer requested a window seat",
- "created": "2019-08-24T14:15:22Z",
- "updated": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": false
}Update the text of an existing event note.
Requires the EDIT_EVENT_NOTES permission on the event.
| id required | string Example: 507f1f77bcf86cd799439011 Event ID |
| noteId required | string Example: 507f1f77bcf86cd799439013 Note ID |
| text required | string Updated note content |
| system | boolean Whether the note is a system-generated note. |
{- "text": "Guide arrived - tour started on time"
}{- "id": "507f1f77bcf86cd799439011",
- "text": "Customer requested a window seat",
- "created": "2019-08-24T14:15:22Z",
- "updated": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": false
}Delete an event note.
Requires the EDIT_EVENT_NOTES permission on the event.
| id required | string Example: 507f1f77bcf86cd799439011 Event ID |
| noteId required | string Example: 507f1f77bcf86cd799439013 Note ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Retrieve a paginated list of experiences. This endpoint supports various filtering and search options.
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
| expand | string Enum: "demographic" "partnerSeller" "purchaseRule" "purchaseRuleLink" You can expand multiple objects at the same time by providing a comma-separated list of values |
| seller | string Example: seller=507f1f77bcf86cd799439020 Filter by seller ID |
| category | string Example: category=Water Sports Filter by category name |
| name | string Example: name=kayaking Search experiences by name |
| geo | string^-?\d+\.?\d*,-?\d+\.?\d*(,-?\d+\.?\d*)?$ Example: geo=36.1069,-112.1129,50 Geographic coordinates for location-based filtering (lat,lng or lat,lng,radius_km) |
| priceSchemes_price | string^[\d\.]+(-[\d\.]+)?$ Example: priceSchemes_price=50,200 Price filtering - single value (max price) or range (min,max) |
| agent | boolean Example: agent=true Filter experiences available to authenticated agent/delegate |
| partnerExperiences | boolean Include experiences from partner sellers |
| partnerSeller | string Example: partnerSeller=507f1f77bcf86cd799439090 Filter experiences from specific partner seller |
| deleted | boolean Include soft-deleted experiences (admin only) |
| sort | string^[a-zA-Z_]+(\[(asc|desc)\])?$ Examples:
Sort field with optional direction. Format: field[asc] or field[desc] |
{- "data": [
- {
- "id": "507f1f77bcf86cd799439011",
- "object": "experience",
- "name": "Grand Canyon Kayaking Adventure",
- "desc": "Join us for an unforgettable kayaking adventure through the stunning Grand Canyon rapids.",
- "price": 149.99,
- "currency": "USD",
- "excerpt": "Thrilling kayaking through stunning canyon rapids",
- "priceType": "person",
- "category": "Water Sports",
- "complete": true,
- "visible": true,
- "seller": {
- "id": "507f1f77bcf86cd799439020"
}, - "createdAt": "2023-08-15T10:30:00Z",
- "updatedAt": "2023-08-16T14:20:00Z"
}
],
}Create a new experience for the authenticated seller account.
| name required | string [ 1 .. 255 ] characters Experience name or title |
| desc | string Full description of the experience |
| excerpt | string <= 500 characters Short description or summary of the experience |
| price | number <float> >= 0 Base price of the experience |
| currency | string^[A-Z]{3}$ Currency code (ISO 4217) |
| priceType | string Default: "person" Enum: "person" "outing" Pricing scheme (per person or per outing) |
| guestType | string Default: "normal" Enum: "normal" "passenger" Type of guests in this experience |
required | ObjectReference (object) or string Seller ID or reference |
| category | string Category name for the experience |
| duration | integer >= 1 Duration to block inventory in minutes |
| eventDuration | integer >= 1 Publicly visible duration of the experience in minutes |
| requireAdult | boolean Default: false Whether at least one adult is required for booking |
object (LocationInput) Location input for creating/updating geographic locations | |
| pickupAddress | string <= 500 characters Pickup address for the experience |
| scheduleType | string Enum: "open" "day" "time" Type of scheduling for this experience |
| cancellationPolicy | string The cancellation policy for this experience |
| other | string Other considerations or notes |
| sortDemographics | boolean Default: false Whether demographics should be sorted by label |
| isScheduled | boolean Deprecated Whether this experience uses scheduling (legacy field) |
| balanceDueOffset | integer >= 0 Minutes before arrival to send balance due reminder |
| balanceDueReminder | boolean Whether to send balance due reminders |
| autoChargeOnDepositReminder | boolean When true, automatically charge the outstanding balance on deposit reminder instead of just sending a reminder email |
| cutoff | integer >= 1 Cutoff time for bookings in minutes |
| cutoffType | string Enum: "pre_start" "pre_end" "pre_opening_end" Type of cutoff:
|
| alternateCutoff | integer >= 1 Alternate cutoff when bookings exist |
| arrivalOffset | integer Meet X minutes before scheduled time |
| visible | boolean Whether the experience is publicly visible |
| complete | boolean Whether the experience setup is complete |
| reviewed | boolean Whether the experience has been reviewed |
| customerNamePreference | string Enum: "required" "optional_confirmation" "optional_no_confirmation" "not_collected" Customer name collection preference |
| allowedPrivacies | Array of strings Items Enum: "private" "public" Allowed privacy levels for bookings |
| purchaseExpirationOffset | integer >= 0 Minutes from purchase when experience expires (non-scheduled) |
| firstCheckinExpirationOffset | integer >= 0 Minutes from first check-in when expires |
| businessHours | string Deprecated Business hours for customer communications (deprecated — use the |
Array of objects (ScheduleInput) Structured opening-hours schedules. Each entry is a Schedule object with
| |
| paymentMethod | string Enum: "cc" "later" Payment method accepted |
| requireGuestIdentification | boolean Default: true Whether purchase item guests require identification data. When set to false, guests do not need any identification information to complete a booking. |
| requireCCForSources | Array of strings Sources requiring credit card collection |
| emailFooter | string Custom email footer |
object (GroupOptionsInput) Group options input for creating/updating | |
object (DownDepositInput) Down deposit input for creating/updating | |
object (FutureCutoffInput) Future cutoff input for creating/updating | |
object (VirtualMeetingPreferenceInput) Virtual meeting preference input for creating/updating | |
object (CatalogPreferenceInput) Catalog preference input | |
object (UpsellPreferenceInput) Upsell preference input for creating/updating experiences | |
Array of objects (ScheduleInput) Schedule configurations | |
| included | Array of strings Items included in the experience |
| notIncluded | Array of strings Items NOT included in the experience |
Array of objects (MediaInput) Media items to associate with experience | |
Array of objects (MediaInput) PDF attachments for the experience | |
Array of objects (TravelerNotificationPreference) Experience-level overrides for traveler notification recipients. When provided, replaces the entire set of notification overrides for this experience. If a notification type is not included in this list, the system default recipients are used. System defaults:
| |
CheckoutPreference (object) or null Checkout preferences for this experience. Overrides seller-level checkout preferences when set. Set to null to clear and fall back to seller-level preferences. |
{- "name": "Grand Canyon Kayaking Adventure",
- "seller": "507f1f77bcf86cd799439020",
- "desc": "Join us for an unforgettable kayaking adventure through the stunning Grand Canyon rapids. Perfect for beginners and experienced paddlers alike.",
- "excerpt": "Thrilling kayaking through canyon rapids",
- "price": 149.99,
- "currency": "USD",
- "priceType": "person",
- "category": "Water Sports",
- "duration": 180,
- "eventDuration": 150,
- "scheduleType": "time",
- "geo": {
- "lat": 36.1069,
- "lng": -112.1129,
- "address": "Grand Canyon National Park, AZ"
}, - "pickupAddress": "Grand Canyon Village, AZ 86023",
- "requireAdult": false,
- "cancellationPolicy": "Free cancellation up to 24 hours before the experience",
- "checkoutPreference": {
- "flowWeights": {
- "mvp": 0.7,
- "single_page": 0.3
}, - "x2Probability": 0.5
}
}{- "id": "507f1f77bcf86cd799439011",
- "object": "experience",
- "name": "Grand Canyon Kayaking Adventure",
- "desc": "Join us for an unforgettable kayaking adventure through the stunning Grand Canyon rapids.",
- "price": 149.99,
- "currency": "USD",
- "priceType": "person",
- "category": "Water Sports",
- "duration": 180,
- "eventDuration": 150,
- "complete": false,
- "visible": false,
- "reviewed": false,
- "seller": {
- "id": "507f1f77bcf86cd799439020"
}, - "createdAt": "2023-08-15T10:30:00Z",
- "updatedAt": "2023-08-15T10:30:00Z"
}Retrieve detailed information about a specific experience.
Use the expand parameter to include related data in a single request:
schedules: Include schedule configurationsseller: Include detailed seller information| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| expand | string Enum: "demographic" "partnerSeller" "purchaseRule" "purchaseRuleLink" You can expand multiple objects at the same time by providing a comma-separated list of values |
{- "id": "507f1f77bcf86cd799439011",
- "object": "experience",
- "name": "Grand Canyon Kayaking Adventure",
- "desc": "Join us for an unforgettable kayaking adventure through the stunning Grand Canyon rapids.",
- "excerpt": "Thrilling kayaking through canyon rapids",
- "price": 149.99,
- "currency": "USD",
- "priceType": "person",
- "guestType": "normal",
- "category": "Water Sports",
- "duration": 180,
- "eventDuration": 150,
- "scheduleType": "time",
- "complete": true,
- "visible": true,
- "reviewed": true,
- "requireAdult": false,
- "requireGuestIdentification": true,
- "earlyReturn": false,
- "isScheduled": true,
- "balanceDueOffset": 7,
- "balanceDueReminder": false,
- "autoChargeOnDepositReminder": false,
- "geo": {
- "lat": 36.1069,
- "lng": -112.1129,
- "address": "Grand Canyon National Park, AZ"
}, - "pickupAddress": "Grand Canyon Village, AZ 86023",
- "cancellationPolicy": "Free cancellation up to 24 hours before the experience",
- "sortDemographics": false,
- "seller": {
- "id": "507f1f77bcf86cd799439020"
}, - "photo": null,
- "schedules": [
- {
- "id": "507f1f77bcf86cd799439040",
- "type": "available",
- "repeat": "weekly",
- "departure": "fixed",
- "times": [
- 540,
- 840
], - "priceDelta": 0
}
], - "demographics": [ ],
- "addOns": [ ],
- "createdAt": "2023-08-15T10:30:00Z",
- "updatedAt": "2023-08-16T14:20:00Z"
}Update an existing experience. Only the provided fields will be updated; other fields remain unchanged.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| name required | string [ 1 .. 255 ] characters Experience name or title |
| desc | string Full description of the experience |
| excerpt | string <= 500 characters Short description or summary of the experience |
| price | number <float> >= 0 Base price of the experience |
| currency | string^[A-Z]{3}$ Currency code (ISO 4217) |
| priceType | string Default: "person" Enum: "person" "outing" Pricing scheme (per person or per outing) |
| guestType | string Default: "normal" Enum: "normal" "passenger" Type of guests in this experience |
required | ObjectReference (object) or string Seller ID or reference |
| category | string Category name for the experience |
| duration | integer >= 1 Duration to block inventory in minutes |
| eventDuration | integer >= 1 Publicly visible duration of the experience in minutes |
| requireAdult | boolean Default: false Whether at least one adult is required for booking |
object (LocationInput) Location input for creating/updating geographic locations | |
| pickupAddress | string <= 500 characters Pickup address for the experience |
| scheduleType | string Enum: "open" "day" "time" Type of scheduling for this experience |
| cancellationPolicy | string The cancellation policy for this experience |
| other | string Other considerations or notes |
| sortDemographics | boolean Default: false Whether demographics should be sorted by label |
| isScheduled | boolean Deprecated Whether this experience uses scheduling (legacy field) |
| balanceDueOffset | integer >= 0 Minutes before arrival to send balance due reminder |
| balanceDueReminder | boolean Whether to send balance due reminders |
| autoChargeOnDepositReminder | boolean When true, automatically charge the outstanding balance on deposit reminder instead of just sending a reminder email |
| cutoff | integer >= 1 Cutoff time for bookings in minutes |
| cutoffType | string Enum: "pre_start" "pre_end" "pre_opening_end" Type of cutoff:
|
| alternateCutoff | integer >= 1 Alternate cutoff when bookings exist |
| arrivalOffset | integer Meet X minutes before scheduled time |
| visible | boolean Whether the experience is publicly visible |
| complete | boolean Whether the experience setup is complete |
| reviewed | boolean Whether the experience has been reviewed |
| customerNamePreference | string Enum: "required" "optional_confirmation" "optional_no_confirmation" "not_collected" Customer name collection preference |
| allowedPrivacies | Array of strings Items Enum: "private" "public" Allowed privacy levels for bookings |
| purchaseExpirationOffset | integer >= 0 Minutes from purchase when experience expires (non-scheduled) |
| firstCheckinExpirationOffset | integer >= 0 Minutes from first check-in when expires |
| businessHours | string Deprecated Business hours for customer communications (deprecated — use the |
Array of objects (ScheduleInput) Structured opening-hours schedules. Each entry is a Schedule object with
| |
| paymentMethod | string Enum: "cc" "later" Payment method accepted |
| requireGuestIdentification | boolean Default: true Whether purchase item guests require identification data. When set to false, guests do not need any identification information to complete a booking. |
| requireCCForSources | Array of strings Sources requiring credit card collection |
| emailFooter | string Custom email footer |
object (GroupOptionsInput) Group options input for creating/updating | |
object (DownDepositInput) Down deposit input for creating/updating | |
object (FutureCutoffInput) Future cutoff input for creating/updating | |
object (VirtualMeetingPreferenceInput) Virtual meeting preference input for creating/updating | |
object (CatalogPreferenceInput) Catalog preference input | |
object (UpsellPreferenceInput) Upsell preference input for creating/updating experiences | |
Array of objects (ScheduleInput) Schedule configurations | |
| included | Array of strings Items included in the experience |
| notIncluded | Array of strings Items NOT included in the experience |
Array of objects (MediaInput) Media items to associate with experience | |
Array of objects (MediaInput) PDF attachments for the experience | |
Array of objects (TravelerNotificationPreference) Experience-level overrides for traveler notification recipients. When provided, replaces the entire set of notification overrides for this experience. If a notification type is not included in this list, the system default recipients are used. System defaults:
| |
CheckoutPreference (object) or null Checkout preferences for this experience. Overrides seller-level checkout preferences when set. Set to null to clear and fall back to seller-level preferences. |
{- "name": "Grand Canyon Advanced Kayaking Adventure",
- "seller": "507f1f77bcf86cd799439020",
- "desc": "Updated description with more advanced techniques and longer duration.",
- "price": 179.99,
- "duration": 240,
- "eventDuration": 210,
- "requireAdult": true,
- "cancellationPolicy": "Free cancellation up to 48 hours before the experience",
- "checkoutPreference": {
- "x2Probability": 0.8
}
}{- "id": "507f1f77bcf86cd799439011",
- "object": "experience",
- "name": "Kayaking Adventure in the Grand Canyon",
- "desc": "Join us for an unforgettable kayaking adventure through the stunning Grand Canyon rapids.",
- "price": 149.99,
- "currency": "USD",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "photo": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "medias": [
- {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "catalog": {
- "items": [
- {
- "object": "global_catalog_item",
- "id": "string",
- "name": "string",
- "type": "quantity",
- "caption": "string",
- "unitType": "demographic",
- "visibility": "public",
- "sku": "string",
- "required": false,
- "photo": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "defaultChoice": "string",
- "sequence": 0,
- "template": {
- "id": "string",
- "code": "adult",
- "type": "demographic"
}, - "unit": {
- "id": "string"
}, - "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "items": [
- null
], - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "terms": [
- {
- "object": "catalog_term",
- "type": "products",
- "name": "string",
- "caption": "string",
- "value": 0.1
}
], - "promotions": [
- {
- "object": "catalog_promotion",
- "type": "absolute_discount_per_purchase",
- "name": "string",
- "caption": "string",
- "value": 0.1
}
], - "priceTiers": {
- "property1": {
- "quantityStart": [
- 0
], - "priceType": "per_person"
}, - "property2": {
- "quantityStart": [
- 0
], - "priceType": "per_person"
}
}, - "priceExpiresAt": "2019-08-24T14:15:22Z"
}, - "status": "published",
- "emailFooter": "Thank you for booking with us!",
- "meta": { },
- "checkoutPreference": {
- "flowWeights": {
- "mvp": 0.7,
- "single_page": 0.3
}, - "x2Probability": 0.5
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "reviewPreference": {
- "id": "review_pref_123",
- "destination": "tripAdvisor",
- "sendReviewEmailToAllTravelers": true,
- "reviewTemplate": "Please leave us a review at our custom platform",
- "enableSmartReview": false,
- "smartReviewThreshold": 4
}, - "excerpt": "Thrilling kayaking adventure through Grand Canyon rapids",
- "guestType": "normal",
- "paymentMethod": "cc",
- "cancellationPolicy": "Free cancellation up to 24 hours before the experience",
- "other": "Participants should bring sunscreen and water",
- "addOns": [ ],
- "downDeposit": {
- "enabled": true,
- "amountType": "percentage",
- "amount": 50,
- "balanceDueOffset": 7
}, - "sortDemographics": false,
- "cancellation": {
- "refundPercentage": 100,
- "cutoff": {
- "duration": 1440,
- "strategy": "string"
}, - "paymentMethods": [
- "cc",
- "store_credit"
]
}, - "requireGuestIdentification": true,
- "notifications": [
- {
- "type": "trip_reminder_to_traveler",
- "recipients": "travelers"
}
], - "group": {
- "orderMin": 1,
- "orderMax": 8,
- "outingMin": 2,
- "outingMax": 12,
- "outingMinCutoff": 60
}, - "requireCCForSources": [ ],
- "updated": "2023-08-16T14:20:00Z",
- "terms": {
- "id": "507f1f77bcf86cd799439100",
- "termsLegal": "By booking this experience, you agree to our terms...",
- "termsCustomer": "Please arrive 15 minutes early..."
}, - "category": "Water Sports",
- "complete": true,
- "reviewed": true,
- "requireAdult": false,
- "earlyReturn": false,
- "priceSchemes": {
- "data": [
- {
- "id": "507f1f77bcf86cd799439013",
- "demographic": {
- "id": "507f1f77bcf86cd799439011"
}, - "price": 99.99,
- "minQuantity": 1,
- "maxQuantity": 10
}
]
}, - "pickupAddress": "123 Adventure St, Grand Canyon, AZ 86023",
- "isScheduled": true,
- "geo": {
- "lat": 36.1069,
- "lng": -112.1129,
- "address": "Grand Canyon National Park, AZ",
- "name": "Grand Canyon Visitor Center",
- "formattedAddress": "S Entrance Rd, Grand Canyon Village, AZ 86023, USA"
}, - "travelerPreference": {
- "reschedule": {
- "cutoff": {
- "duration": 1440,
- "strategy": "string"
}, - "priceChangePolicy": {
- "priceIncreasePolicy": "payment_before_modification",
- "priceDecreasePolicy": "retain_price"
}
}, - "cancellation": {
- "refundPercentage": 100,
- "cutoff": {
- "duration": 1440,
- "strategy": "string"
}, - "paymentMethods": [
- "cc",
- "store_credit"
]
}, - "questionnaire": { },
- "allowPayment": { }
}, - "included": [
- "Equipment",
- "Guide",
- "Safety briefing"
], - "notIncluded": [
- "Food",
- "Transportation"
], - "attachments": [
- {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "resources": [
- {
- "id": "507f1f77bcf86cd799439200",
- "resource": {
- "id": "507f1f77bcf86cd799439011"
}, - "priority": 100
}
], - "demographics": [ ],
- "schedules": [
- {
- "id": "507f1f77bcf86cd799439012",
- "name": "Morning Tours",
- "type": "available",
- "repeat": "weekly",
- "days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "dates": [
- "2023-08-15",
- "2023-08-16"
], - "start": "2023-08-01",
- "end": "2023-12-31",
- "source": "manual",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "expiresAt": "2024-01-01T00:00:00Z",
- "departure": "fixed",
- "times": [
- 900,
- 1400
], - "priceDelta": 0,
- "priceOverride": false,
- "allowedPrivacies": [
- "public"
], - "timeRanges": [
- { }
], - "openingHoursPerDay": [
- {
- "day": 1,
- "timeRange": {
- "startTime": 900,
- "endTime": 1700
}
}
]
}
], - "waiverPreference": {
- "remoteId": "template_123",
- "multiLinkDayInterval": "P7D",
- "remoteSystem": "waiver_system_123",
}, - "guidePreference": {
- "includeGuideInfo": true,
- "referGuideAs": "tour guide",
- "guideNotAssigned": {
- "enabled": true,
- "offset": 24,
- "type": "guide_not_assigned"
}, - "guideNotConfirmedToGuide": {
- "enabled": true,
- "offset": 24,
- "type": "guide_not_assigned"
}, - "guideNotConfirmedToSeller": {
- "enabled": true,
- "offset": 24,
- "type": "guide_not_assigned"
}, - "requireConfirmation": true,
- "allowDecline": false
}, - "virtualMeeting": {
- "enabled": true,
- "startOffset": 30,
- "blockEntryOffset": 15,
- "payment": "full"
}, - "checkInPreference": {
- "enabled": true,
- "validations": [ ]
}, - "purchaseExpirationOffset": 10080,
- "firstCheckinExpirationOffset": 1440,
- "businessHours": "Monday-Friday 9AM-5PM PST",
- "openingHours": [ ],
- "customerNamePreference": "required",
- "checkInValiditySummary": {
- "enabled": true,
- "type": "qr_code",
- "timeWindow": {
- "before": 60,
- "after": 15
}, - "requirements": [
- "government_id",
- "waiver_signature"
], - "location": {
- "required": true,
- "radius": 100,
- "coordinates": {
- "lat": 36.1069,
- "lng": -112.1129,
- "address": "Grand Canyon National Park, AZ",
- "name": "Grand Canyon Visitor Center",
- "formattedAddress": "S Entrance Rd, Grand Canyon Village, AZ 86023, USA"
}
}, - "validationRules": [
- {
- "rule": "minimum_age_verification",
- "description": "Guests must be at least 18 years old",
- "required": true
}
]
}, - "balanceDueOffset": 1440,
- "balanceDueReminder": false,
- "autoChargeOnDepositReminder": false,
- "inventory": {
- "assignmentOrder": "priority",
- "allowPartialAssignment": true
}, - "duration": 120,
- "eventDuration": 90,
- "allowedPrivacies": [
- "public",
- "private"
], - "cutoff": 60,
- "cutoffType": "pre_start",
- "alternateCutoff": 30,
- "arrivalOffset": 15,
- "futureCutoff": {
- "enabled": true,
- "cutoffType": "days",
- "cutoffValue": 365
}, - "waitlist": {
- "id": "507f1f77bcf86cd799439011",
- "enabled": true,
- "enabledForCheckout": true,
- "enabledForBackOffice": true,
- "enabledForCappedEvents": true,
- "checkoutMessage": "Join our waitlist to be notified when spots become available",
- "inviteDelay": 5,
- "notification": {
- "enabled": true,
- "strategies": [
- "all"
], - "minOpenSeatPercentage": 75
}, - "limit": {
- "enabled": true,
- "max": 20
}
}, - "upsellPreference": {
- "id": "507f1f77bcf86cd799439011",
- "enabled": true,
- "hidePrivacyToggle": false,
- "privacySelector": "upsell",
- "title": "Upgrade to private experience",
- "description": "Your experience may be shared with another party. If you prefer to attend with just your group, use this option to block off the remaining spots"
}, - "catalogPreference": {
- "defaultDemographicQuantity": 1
}, - "scheduleType": "time",
- "qrCodePreference": {
- "enabled": true,
- "ticketGenerationStrategy": "booking",
- "ticketSyntax": "ticketCode"
}, - "visible": true
}Delete an experience. This is typically a soft delete operation.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Upload photos or videos for an experience. The request body should contain the raw image/video data.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| qqfile | string Example: qqfile=canyon-adventure.jpg Legacy file upload parameter for filename (used by legacy upload clients). When present, indicates file upload via XHR with filename in query parameter. |
| caption | string Example: caption=Stunning canyon views during kayaking Optional caption for the uploaded media |
{- "id": "507f1f77bcf86cd799439030",
- "type": "image",
- "caption": "Stunning canyon views during kayaking",
- "size": 1024000,
- "createdAt": "2023-08-16T09:15:00Z"
}Update metadata for an existing media item (such as caption or display order).
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| mediaId required | string Example: 507f1f77bcf86cd799439030 Media item identifier |
| caption | string <= 500 characters Updated caption for the media |
| order | integer >= 0 Display order (0 = first) |
{- "caption": "Updated caption - Epic canyon adventures await",
- "order": 1
}{- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}Remove a media item from the experience. This permanently deletes the media file.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| mediaId required | string Example: 507f1f77bcf86cd799439030 Media item identifier |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Returns the fees that are applicable to this experience, including processing fees, service fees, and any other charges that may apply to bookings.
Used primarily for pricing calculations and displaying total costs to customers.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
[- {
- "id": "507f1f77bcf86cd799439070",
- "name": "Processing Fee",
- "type": "processing",
- "amount": 2.99,
- "percentage": null,
- "currency": "USD",
- "description": "Credit card processing fee"
}, - {
- "id": "507f1f77bcf86cd799439071",
- "name": "Service Fee",
- "type": "service",
- "amount": null,
- "percentage": 3.5,
- "currency": "USD",
- "description": "Platform service fee"
}
]Get a list of future dates that have availability for the given experience.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| quantity | integer >= 1 Default: 1 Example: quantity=2 Minimum quantity/seats required for availability |
| limit | integer [ 1 .. 20 ] Default: 5 Example: limit=10 Maximum number of dates to return |
| privacy | string Enum: "public" "private" Example: privacy=public Privacy level for the booking (public/private) |
| startDate | string <date> Example: startDate=2023-09-01 Start date for availability search (YYYY-MM-DD) |
| overrideFutureCutoff | boolean Default: false Whether to override future booking cutoff restrictions |
| package | string Example: package=507f1f77bcf86cd799439030 Package ID to filter upcoming dates. When provided, only dates available for the specified package are returned. |
[- "2023-09-15",
- "2023-09-16",
- "2023-09-18",
- "2023-09-20",
- "2023-09-22"
]Returns a static map image showing the pickup location for the experience.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Returns check-in validation rules and requirements for the experience.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "enabled": true,
- "type": "qr_code",
- "timeWindow": {
- "before": 60,
- "after": 15
}, - "requirements": [
- "government_id",
- "waiver_signature"
], - "location": {
- "required": true,
- "radius": 100
}
}Upload PDF attachments for an experience. These attachments are typically sent as part of order confirmation emails when bookings are created.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| qqfile | string Example: qqfile=booking-instructions.pdf Filename when uploading via XHR |
{- "success": 1,
- "attachment": {
- "id": "507f1f77bcf86cd799439080",
- "type": "document",
- "url": "/uploads/experiences/507f1f77bcf86cd799439011/507f1f77bcf86cd799439080.pdf",
- "size": 245760,
- "caption": "Important information for your booking",
- "createdAt": "2023-08-16T09:15:00Z"
}
}Update an existing attachment's metadata or replace the file content.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| attachmentId required | string Example: 507f1f77bcf86cd799439080 Attachment identifier |
| qqfile | string Filename when uploading via XHR |
| caption | string <= 500 characters Updated caption for the attachment |
| title | string <= 255 characters Updated title for the attachment |
{- "caption": "Updated booking instructions with new meeting point",
- "title": "Booking Instructions v2"
}{- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}Delete an attachment and remove it from the experience. This permanently removes the file from storage.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| attachmentId required | string Example: 507f1f77bcf86cd799439080 Attachment identifier |
{- "id": "507f1f77bcf86cd799439080",
- "unlinkResult": true
}Assigns a pre-existing resource (inventory item) to an experience. Resources are fixed assets that can be utilized across multiple experiences. You must have the Inventory feature enabled for this endpoint to work.
Resource Concepts:
Restrictions:
| id required | string Example: 507f191e810c19729de860ea The unique identifier of the experience |
required | object (ObjectReference) Reference to the resource to assign |
{- "resource": {
- "id": "507f1f77bcf86cd799439011"
}
}{- "id": "507f1f77bcf86cd799439012",
- "resource": {
- "id": "507f1f77bcf86cd799439011",
- "type": "equipment",
- "name": "Kayak",
- "seller": {
- "id": "507f191e810c19729de860ea"
}, - "capacity": 2,
- "count": 5,
- "schedules": [ ],
- "createdAt": "2024-01-01T10:00:00Z"
}, - "priority": 100
}Remove the assignment of a resource (inventory item) from an experience. This will also remove the resource from all existing events for this experience.
| id required | string Example: 507f191e810c19729de860ea The unique identifier of the experience |
| resourceId required | string Example: 507f1f77bcf86cd799439011 The unique identifier of the resource to unassign |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Create or update the waitlist preference for an experience. This configures how the waitlist feature behaves for the experience, including where it is enabled (checkout, back office, capped events), the checkout message, the invite delay, notification strategy, and the per-slot limit.
Waitlists are only supported on scheduled experiences; a request against a
non-scheduled experience is rejected with a
cannot_support_waitlist_feature_for_non_scheduled_experience validation error.
Authorization:
EDIT_EXPERIENCE permission on the experience.| id required | string Example: 507f1f77bcf86cd799439011 Experience ID |
| enabled | boolean Whether waitlist is globally enabled |
| enabledForCheckout | boolean Whether waitlist is enabled for the checkout app |
| enabledForBackOffice | boolean Whether waitlist is enabled for back office |
| enabledForCappedEvents | boolean Whether waitlist is enabled for events whose capacity is capped |
| checkoutMessage | string <= 600 characters Message to show on checkout when waitlist is available |
| inviteDelay | integer >= 0 Delay time in minutes after slots open before sending waitlist invite emails |
object (WaitlistNotificationPreferenceInput) Waitlist notification strategy input | |
object (WaitlistLimitPreferenceInput) Waitlist size limitation input |
{- "enabled": true,
- "enabledForCheckout": true,
- "enabledForCappedEvents": true,
- "checkoutMessage": "Join our waitlist to be notified when spots become available",
- "inviteDelay": 5,
- "notification": {
- "enabled": true,
- "strategies": [
- "all"
]
}, - "limit": {
- "enabled": true,
- "max": 20
}
}{- "id": "507f1f77bcf86cd799439011",
- "enabled": true,
- "enabledForCheckout": true,
- "enabledForBackOffice": true,
- "enabledForCappedEvents": true,
- "checkoutMessage": "Join our waitlist to be notified when spots become available",
- "inviteDelay": 5,
- "notification": {
- "enabled": true,
- "strategies": [
- "all"
], - "minOpenSeatPercentage": 75
}, - "limit": {
- "enabled": true,
- "max": 20
}
}Create or update the waitlist preference for an experience. Behaves identically to the POST method.
Waitlists are only supported on scheduled experiences; a request against a
non-scheduled experience is rejected with a
cannot_support_waitlist_feature_for_non_scheduled_experience validation error.
Authorization:
EDIT_EXPERIENCE permission on the experience.| id required | string Example: 507f1f77bcf86cd799439011 Experience ID |
| enabled | boolean Whether waitlist is globally enabled |
| enabledForCheckout | boolean Whether waitlist is enabled for the checkout app |
| enabledForBackOffice | boolean Whether waitlist is enabled for back office |
| enabledForCappedEvents | boolean Whether waitlist is enabled for events whose capacity is capped |
| checkoutMessage | string <= 600 characters Message to show on checkout when waitlist is available |
| inviteDelay | integer >= 0 Delay time in minutes after slots open before sending waitlist invite emails |
object (WaitlistNotificationPreferenceInput) Waitlist notification strategy input | |
object (WaitlistLimitPreferenceInput) Waitlist size limitation input |
{- "enabled": true,
- "enabledForCheckout": true,
- "enabledForBackOffice": true,
- "enabledForCappedEvents": true,
- "checkoutMessage": "Join our waitlist to be notified when spots become available",
- "inviteDelay": 5,
- "notification": {
- "enabled": true,
- "strategies": [
- "all"
], - "minOpenSeatPercentage": 75
}, - "limit": {
- "enabled": true,
- "max": 20
}
}{- "id": "507f1f77bcf86cd799439011",
- "enabled": true,
- "enabledForCheckout": true,
- "enabledForBackOffice": true,
- "enabledForCappedEvents": true,
- "checkoutMessage": "Join our waitlist to be notified when spots become available",
- "inviteDelay": 5,
- "notification": {
- "enabled": true,
- "strategies": [
- "all"
], - "minOpenSeatPercentage": 75
}, - "limit": {
- "enabled": true,
- "max": 20
}
}Create or update the reschedule preference for an experience's traveler preference. This configures how self-service rescheduling behaves for travelers, including cutoff timing and price change policies.
Also available via the alias endpoint /experiences/{id}/travelerPreference/arrival.
Price Change Policy:
priceIncreasePolicy: Controls whether payment is required before or after modificationpriceDecreasePolicy: Controls whether to refund the price difference or retain the original priceAuthorization:
EDIT_EXPERIENCE permission on the experience.| id required | string Example: 507f1f77bcf86cd799439011 Experience ID |
object Cutoff timing configuration for rescheduling | |
object Policy for handling price changes during self-service modifications |
{- "cutoff": {
- "duration": 1440,
- "strategy": "cutoff"
}, - "priceChangePolicy": {
- "priceIncreasePolicy": "payment_before_modification",
- "priceDecreasePolicy": "retain_price"
}
}{- "reschedule": {
- "cutoff": {
- "duration": 1440,
- "strategy": "cutoff"
}, - "priceChangePolicy": {
- "priceIncreasePolicy": "payment_before_modification",
- "priceDecreasePolicy": "retain_price"
}
}, - "cancellation": null,
- "questionnaire": null,
- "allowPayment": null
}Create or update the reschedule preference for an experience's traveler preference. Behaves identically to the POST method.
Authorization:
EDIT_EXPERIENCE permission on the experience.| id required | string Example: 507f1f77bcf86cd799439011 Experience ID |
object Cutoff timing configuration for rescheduling | |
object Policy for handling price changes during self-service modifications |
{- "cutoff": {
- "duration": 1440,
- "strategy": "string"
}, - "priceChangePolicy": {
- "priceIncreasePolicy": "payment_before_modification",
- "priceDecreasePolicy": "retain_price"
}
}{- "reschedule": {
- "cutoff": {
- "duration": 1440,
- "strategy": "string"
}, - "priceChangePolicy": {
- "priceIncreasePolicy": "payment_before_modification",
- "priceDecreasePolicy": "retain_price"
}
}, - "cancellation": {
- "refundPercentage": 100,
- "cutoff": {
- "duration": 1440,
- "strategy": "string"
}, - "paymentMethods": [
- "cc",
- "store_credit"
]
}, - "questionnaire": { },
- "allowPayment": { }
}Remove the reschedule preference from an experience's traveler preference.
Authorization:
EDIT_EXPERIENCE permission on the experience.| id required | string Example: 507f1f77bcf86cd799439011 Experience ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Retrieve the questionnaire form that applies to a specific experience. The system will first look for an experience-specific form, and if none exists, it will fall back to the seller's global questionnaire.
| id required | string Example: 507f191e810c19729de860eb The unique identifier of the experience |
{- "id": "507f1f77bcf86cd799439011",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "product": {
- "id": "507f1f77bcf86cd799439011"
}, - "productType": "experience",
- "organizerOnly": true,
- "fields": [
- {
- "label": "Full Name",
- "description": "Please enter your full legal name as it appears on your ID",
- "type": "text",
- "width": 3,
- "suffix": "lbs",
- "help": "This information helps us provide proper equipment",
- "required": true,
- "roster": false,
- "readonly": false,
- "organizerOnly": true,
- "displayStep": "afterPayment",
- "visibility": "all",
- "seq": 1,
- "options": [
- "None",
- "Vegetarian",
- "Vegan",
- "Gluten-free"
], - "id": "60f1f7bc5f6d2a3b4c8e9d12"
}
], - "optionalSourcesList": [
- "direct",
- "partner"
], - "deletedAt": "2019-08-24T14:15:22Z"
}Returns all feature flags configured for a specific user account.
Feature flags control access to various features and capabilities within the system. This endpoint requires VIEW_USER_FEATURES permission on the target user.
Authorization:
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "googleAnalytics": true,
- "advancedReporting": false,
- "mobileApp": true,
- "customBranding": true
}Returns the value of a specific feature flag for a user.
Public Features: Some features are publicly accessible without authentication:
Authorization:
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| feature required | string Example: googleAnalytics The name/key of the feature flag to retrieve |
trueActivates a feature flag for a seller account. This endpoint enables specific features for sellers based on their subscription plan and permissions.
Authorization:
Feature Validation:
Side Effects:
| id required | string (id) ^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439012 The seller ID |
| featureId required | string Example: advancedReporting The feature ID to activate |
Feature ID in request body (alternative to path parameter)
| id | string The feature ID to activate |
{- "id": "mobileApp"
}{- "id": "advancedReporting"
}Alternative PUT method for activating a feature flag for a seller account. Behaves identically to the POST method.
See the POST method documentation for complete details on authorization, validation, and side effects.
| id required | string (id) ^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439012 The seller ID |
| featureId required | string Example: advancedReporting The feature ID to activate |
Feature ID in request body (alternative to path parameter)
| id | string The feature ID to activate |
{- "id": "mobileApp"
}{- "id": "advancedReporting"
}Deactivates a feature flag for a seller account. This removes access to the specified feature for the seller.
Authorization:
Side Effects:
Important: Deactivating a feature may affect the seller's subscription package eligibility and will notify Xola staff for review.
| id required | string (id) ^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439012 The seller ID |
| featureId required | string Example: advancedReporting The feature ID to deactivate |
{- "errors": {
- "id": "Feature advancedReporting does not exist"
}
}Forms (also called "questionnaires") are collections of questions that you can ask travelers during or after the order creation flow.
In the Xola Seller App, this corresponds to the Global or Product-specific Questionnaire. These questions may be presented to a purchaser during or immediately after the checkout process.
Forms may be required or optional, and may be requested for each member of a booking party, or only the party organizer.
Retrieve a paginated list of forms.
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
| seller | string Filter forms by seller ID |
| productType | string Enum: "experience" "package" "membership" Filter forms by product type |
{- "data": [
- {
- "id": "507f1f77bcf86cd799439011",
- "seller": {
- "id": "507f191e810c19729de860ea"
}, - "product": {
- "id": "507f191e810c19729de860eb"
}, - "productType": "experience",
- "organizerOnly": true,
- "fields": [
- {
- "id": "60f1f7bc5f6d2a3b4c8e9d12",
- "label": "Full Name",
- "type": "text",
- "width": 3,
- "required": true,
- "organizerOnly": true,
- "displayStep": "beforePayment",
- "visibility": "all"
}, - {
- "id": "60f1f7bc5f6d2a3b4c8e9d13",
- "label": "Phone Number",
- "type": "phone",
- "width": 3,
- "required": true,
- "organizerOnly": true,
- "displayStep": "afterPayment",
- "visibility": "all"
}
], - "optionalSourcesList": [ ]
}
], - "next": null
}Create a new questionnaire form. Forms can be either:
Only one form can exist per product. If a product-specific form already exists, a conflict error will be returned.
required | object (ObjectReference) Reference to the seller who will own this form |
ObjectReference (object) or null Reference to specific product. Omit for global forms. | |
| productType | string Default: "experience" Enum: "experience" "package" "membership" Type of product this form is designed for |
required | Array of objects (FormFieldBase) List of form fields to create |
| optionalSourcesList | Array of strings Default: [] List of booking sources for which questionnaire completion is optional |
{- "seller": {
- "id": "507f191e810c19729de860ea"
}, - "productType": "experience",
- "optionalSourcesList": [ ],
- "fields": [
- {
- "label": "Full Name",
- "type": "text",
- "width": 3,
- "required": true,
- "organizerOnly": true,
- "displayStep": "beforePayment",
- "visibility": "all"
}, - {
- "label": "Phone Number",
- "type": "phone",
- "width": 3,
- "required": true,
- "organizerOnly": true,
- "displayStep": "afterPayment",
- "visibility": "all"
}
]
}{- "id": "507f1f77bcf86cd799439011",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "product": {
- "id": "507f1f77bcf86cd799439011"
}, - "productType": "experience",
- "organizerOnly": true,
- "fields": [
- {
- "label": "Full Name",
- "description": "Please enter your full legal name as it appears on your ID",
- "type": "text",
- "width": 3,
- "suffix": "lbs",
- "help": "This information helps us provide proper equipment",
- "required": true,
- "roster": false,
- "readonly": false,
- "organizerOnly": true,
- "displayStep": "afterPayment",
- "visibility": "all",
- "seq": 1,
- "options": [
- "None",
- "Vegetarian",
- "Vegan",
- "Gluten-free"
], - "id": "60f1f7bc5f6d2a3b4c8e9d12"
}
], - "optionalSourcesList": [
- "direct",
- "partner"
], - "deletedAt": "2019-08-24T14:15:22Z"
}Get detailed information about a specific form by its ID
| id required | string Example: 507f1f77bcf86cd799439011 The unique identifier of the form |
{- "id": "507f1f77bcf86cd799439011",
- "seller": {
- "id": "507f191e810c19729de860ea"
}, - "product": {
- "id": "507f191e810c19729de860eb"
}, - "productType": "experience",
- "organizerOnly": false,
- "fields": [
- {
- "id": "60f1f7bc5f6d2a3b4c8e9d12",
- "label": "Full Name",
- "type": "text",
- "width": 3,
- "required": true,
- "organizerOnly": true,
- "displayStep": "beforePayment",
- "visibility": "all",
- "seq": 1
}, - {
- "id": "60f1f7bc5f6d2a3b4c8e9d13",
- "label": "Emergency Contact",
- "type": "phone",
- "width": 3,
- "required": true,
- "organizerOnly": true,
- "displayStep": "afterPayment",
- "visibility": "all",
- "seq": 2,
- "description": "Please provide an emergency contact number"
}, - {
- "id": "60f1f7bc5f6d2a3b4c8e9d14",
- "label": "Dietary Restrictions",
- "type": "select",
- "width": 4,
- "required": false,
- "organizerOnly": false,
- "displayStep": "afterPayment",
- "visibility": "all",
- "seq": 3,
- "options": [
- "None",
- "Vegetarian",
- "Vegan",
- "Gluten-free",
- "Other"
], - "description": "Please select any dietary restrictions"
}
], - "optionalSourcesList": [
- "direct"
]
}Update an existing form. This endpoint allows updating:
Field types cannot be changed through this endpoint. If a field type needs to be changed, the field must be removed and recreated.
| id required | string Example: 507f1f77bcf86cd799439011 The unique identifier of the form |
Array of objects (FormFieldUpdate) List of fields to update. Include 'id' for existing fields to update them, or omit 'id' to create new fields. Fields not included will be removed. | |
| optionalSourcesList | Array of strings Updated list of optional booking sources |
{- "fields": [
- {
- "id": "60f1f7bc5f6d2a3b4c8e9d12",
- "label": "Updated Full Name",
- "description": "Please enter your full legal name",
- "type": "text",
- "width": 3,
- "required": true,
- "organizerOnly": true,
- "displayStep": "beforePayment",
- "visibility": "all"
}, - {
- "label": "New Emergency Contact",
- "type": "phone",
- "width": 3,
- "required": true,
- "organizerOnly": true,
- "displayStep": "afterPayment",
- "visibility": "all"
}
], - "optionalSourcesList": [
- "direct",
- "partner"
]
}{- "id": "507f1f77bcf86cd799439011",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "product": {
- "id": "507f1f77bcf86cd799439011"
}, - "productType": "experience",
- "organizerOnly": true,
- "fields": [
- {
- "label": "Full Name",
- "description": "Please enter your full legal name as it appears on your ID",
- "type": "text",
- "width": 3,
- "suffix": "lbs",
- "help": "This information helps us provide proper equipment",
- "required": true,
- "roster": false,
- "readonly": false,
- "organizerOnly": true,
- "displayStep": "afterPayment",
- "visibility": "all",
- "seq": 1,
- "options": [
- "None",
- "Vegetarian",
- "Vegan",
- "Gluten-free"
], - "id": "60f1f7bc5f6d2a3b4c8e9d12"
}
], - "optionalSourcesList": [
- "direct",
- "partner"
], - "deletedAt": "2019-08-24T14:15:22Z"
}Soft delete a form. The form will be marked as deleted but not physically removed from the database. Once deleted, the form will no longer appear in API responses and cannot be used for new bookings.
| id required | string Example: 507f1f77bcf86cd799439011 The unique identifier of the form |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Retrieve the questionnaire form that applies to a specific experience. The system will first look for an experience-specific form, and if none exists, it will fall back to the seller's global questionnaire.
| id required | string Example: 507f191e810c19729de860eb The unique identifier of the experience |
{- "id": "507f1f77bcf86cd799439011",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "product": {
- "id": "507f1f77bcf86cd799439011"
}, - "productType": "experience",
- "organizerOnly": true,
- "fields": [
- {
- "label": "Full Name",
- "description": "Please enter your full legal name as it appears on your ID",
- "type": "text",
- "width": 3,
- "suffix": "lbs",
- "help": "This information helps us provide proper equipment",
- "required": true,
- "roster": false,
- "readonly": false,
- "organizerOnly": true,
- "displayStep": "afterPayment",
- "visibility": "all",
- "seq": 1,
- "options": [
- "None",
- "Vegetarian",
- "Vegan",
- "Gluten-free"
], - "id": "60f1f7bc5f6d2a3b4c8e9d12"
}
], - "optionalSourcesList": [
- "direct",
- "partner"
], - "deletedAt": "2019-08-24T14:15:22Z"
}Retrieve the global questionnaire form for a seller. This form applies to all experiences when no experience-specific form exists.
| id required | string Example: 507f191e810c19729de860ea The unique identifier of the seller |
{- "id": "507f1f77bcf86cd799439011",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "product": {
- "id": "507f1f77bcf86cd799439011"
}, - "productType": "experience",
- "organizerOnly": true,
- "fields": [
- {
- "label": "Full Name",
- "description": "Please enter your full legal name as it appears on your ID",
- "type": "text",
- "width": 3,
- "suffix": "lbs",
- "help": "This information helps us provide proper equipment",
- "required": true,
- "roster": false,
- "readonly": false,
- "organizerOnly": true,
- "displayStep": "afterPayment",
- "visibility": "all",
- "seq": 1,
- "options": [
- "None",
- "Vegetarian",
- "Vegan",
- "Gluten-free"
], - "id": "60f1f7bc5f6d2a3b4c8e9d12"
}
], - "optionalSourcesList": [
- "direct",
- "partner"
], - "deletedAt": "2019-08-24T14:15:22Z"
}Retrieve the questionnaire that applies to a specific item within a purchase. This is useful for purchases with multiple items that may have different questionnaires.
| id required | string Example: 507f191e810c19729de860ec The unique identifier of the purchase |
| itemId required | string Example: 507f191e810c19729de860ed The unique identifier of the purchase item |
{- "id": "507f1f77bcf86cd799439011",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "product": {
- "id": "507f1f77bcf86cd799439011"
}, - "productType": "experience",
- "organizerOnly": true,
- "fields": [
- {
- "label": "Full Name",
- "description": "Please enter your full legal name as it appears on your ID",
- "type": "text",
- "width": 3,
- "suffix": "lbs",
- "help": "This information helps us provide proper equipment",
- "required": true,
- "roster": false,
- "readonly": false,
- "organizerOnly": true,
- "displayStep": "afterPayment",
- "visibility": "all",
- "seq": 1,
- "options": [
- "None",
- "Vegetarian",
- "Vegan",
- "Gluten-free"
], - "id": "60f1f7bc5f6d2a3b4c8e9d12"
}
], - "optionalSourcesList": [
- "direct",
- "partner"
], - "deletedAt": "2019-08-24T14:15:22Z"
}Upload one or more photos for photo-type fields in a purchase item's form response.
Photos are uploaded via multipart form data with a photos key containing an associative array
where each key is the field label and the value is the photo file.
Supported image types: JPEG, PNG, GIF, WebP (max 5MB per file).
If a photo field response already exists for the given label, the photo will be replaced. Label matching is case-insensitive.
Permission: Requires EDIT_PURCHASE_FORM_RESPONSE permission.
Validation Errors:
missing_photos: No photos were provided in the requestno_form_for_product: No questionnaire is configured for this purchase item's productunknown_label: The provided label does not match any photo field in the formfile_too_large: Photo file exceeds maximum size of 5MBinvalid_file_extension: Only JPEG, PNG, GIF, and WebP files are allowedinvalid_image_type: Only JPEG, PNG, GIF, and WebP images are allowedmime_type_mismatch: File extension does not match the image typeupload_failed: File storage upload failed| id required | string Example: 507f191e810c19729de860ec The unique identifier of the purchase |
| purchaseItemId required | string Example: 507f191e810c19729de860ed The unique identifier of the purchase item |
required | object An associative array of photo files keyed by field label. Each key should match the label of a photo-type field in the form. |
{ "photos": { "ID Photo": "(binary file data)" } }
{- "id": "507f191e810c19729de860ee",
- "name": "John Doe",
- "fields": [
- {
- "id": "60f1f7bc5f6d2a3b4c8e9d12",
- "type": "photo",
- "label": "ID Photo",
- "value": "questionnaire/photos/507f191e810c19729de860ec/507f191e810c19729de860ed/60f1f7bc5f6d2a3b4c8e9d12.jpg",
- "roster": false
}
]
}Retrieve an uploaded photo for a specific photo-type field in a purchase item's form response. Returns the image binary with appropriate Content-Type and Content-Disposition headers.
Label matching is case-insensitive.
Permission: Requires EDIT_PURCHASE_FORM_RESPONSE permission.
Returns 404 if the purchase item, form response, or photo file is not found.
Returns a validation error with reason invalid_type if the field exists but is not a photo field.
| id required | string Example: 507f191e810c19729de860ec The unique identifier of the purchase |
| purchaseItemId required | string Example: 507f191e810c19729de860ed The unique identifier of the purchase item |
| fieldLabel required | string Example: ID Photo The label of the photo field to retrieve (case-insensitive) |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Gift certificates allow customers to purchase a specific activity, or a redeemable dollar amount, for their friends or family. Whenever a Gift is purchased it generates a special code, and this code can be used to pay for any new or existing booking.
Retrieve all gift offers with optional filtering and pagination
| expand | string Enum: "experience" "purchaseRule" You can expand multiple objects at the same time by providing a comma-separated list of values |
| skip | integer >= 0 Default: 0 Number of items to skip |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| seller | string Filter by seller ID |
| system | boolean Filter by system generated gift offers. This typically includes one gift offer per experience. |
| baseGiftProduct | boolean Filter for "Choose an amount" type gift offers. |
{- "data": [
- {
- "name": "string",
- "desc": "string",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "price": 0.1,
- "minimumPrice": 0.1,
- "currency": "string",
- "type": "fixed",
- "status": "string",
- "system": true,
- "baseGiftProduct": true,
- "emailReminder": true,
- "emailReminderDays": 0,
- "id": "string",
- "photo": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "medias": [
- {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "experience": {
- "id": "507f1f77bcf86cd799439011"
}, - "purchaseRule": {
- "id": "string"
}, - "redemptionPurchaseRule": {
- "id": "string"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedAt": "2019-08-24T14:15:22Z",
- "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "deletedAt": "2019-08-24T14:15:22Z",
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "paging": {
- "next": "string",
- "_es": true
}
}Create a new gift offer for a seller
| expand | string Enum: "experience" "purchaseRule" You can expand multiple objects at the same time by providing a comma-separated list of values |
| name required | string |
| desc | string Description of the gift offer |
required | object (ObjectReference) A reference to another object containing only its ID. Use the |
| price | number <float> Price of the gift offer |
| minimumPrice | number <float> Minimum price for variable gift offers |
| currency | string Currency code (e.g., USD) |
| type | string Enum: "fixed" "variable" Type of gift offer |
| status | string |
| system | boolean Whether this is a system gift offer |
| baseGiftProduct | boolean Whether this is a base gift product |
| emailReminder | boolean Whether to send email reminders |
| emailReminderDays | integer Days before expiry to send reminder |
| experience | string Experience ID to associate with this gift offer |
| photo | string Media ID for the gift offer photo |
{- "name": "string",
- "desc": "string",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "price": 0.1,
- "minimumPrice": 0.1,
- "currency": "string",
- "type": "fixed",
- "status": "string",
- "system": true,
- "baseGiftProduct": true,
- "emailReminder": true,
- "emailReminderDays": 0,
- "experience": "string",
- "photo": "string"
}{- "name": "string",
- "desc": "string",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "price": 0.1,
- "minimumPrice": 0.1,
- "currency": "string",
- "type": "fixed",
- "status": "string",
- "system": true,
- "baseGiftProduct": true,
- "emailReminder": true,
- "emailReminderDays": 0,
- "id": "string",
- "photo": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "medias": [
- {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "experience": {
- "id": "507f1f77bcf86cd799439011"
}, - "purchaseRule": {
- "id": "string"
}, - "redemptionPurchaseRule": {
- "id": "string"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedAt": "2019-08-24T14:15:22Z",
- "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "deletedAt": "2019-08-24T14:15:22Z",
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}Retrieve a gift offer by its ID
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| expand | string Enum: "experience" "purchaseRule" You can expand multiple objects at the same time by providing a comma-separated list of values |
{- "name": "string",
- "desc": "string",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "price": 0.1,
- "minimumPrice": 0.1,
- "currency": "string",
- "type": "fixed",
- "status": "string",
- "system": true,
- "baseGiftProduct": true,
- "emailReminder": true,
- "emailReminderDays": 0,
- "id": "string",
- "photo": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "medias": [
- {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "experience": {
- "id": "507f1f77bcf86cd799439011"
}, - "purchaseRule": {
- "id": "string"
}, - "redemptionPurchaseRule": {
- "id": "string"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedAt": "2019-08-24T14:15:22Z",
- "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "deletedAt": "2019-08-24T14:15:22Z",
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}Update an existing gift offer
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| expand | string Enum: "experience" "purchaseRule" You can expand multiple objects at the same time by providing a comma-separated list of values |
| name required | string |
| desc | string Description of the gift offer |
required | object (ObjectReference) A reference to another object containing only its ID. Use the |
| price | number <float> Price of the gift offer |
| minimumPrice | number <float> Minimum price for variable gift offers |
| currency | string Currency code (e.g., USD) |
| type | string Enum: "fixed" "variable" Type of gift offer |
| status | string |
| system | boolean Whether this is a system gift offer |
| baseGiftProduct | boolean Whether this is a base gift product |
| emailReminder | boolean Whether to send email reminders |
| emailReminderDays | integer Days before expiry to send reminder |
| experience | string Experience ID to associate with this gift offer |
| photo | string Media ID for the gift offer photo |
{- "name": "string",
- "desc": "string",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "price": 0.1,
- "minimumPrice": 0.1,
- "currency": "string",
- "type": "fixed",
- "status": "string",
- "system": true,
- "baseGiftProduct": true,
- "emailReminder": true,
- "emailReminderDays": 0,
- "experience": "string",
- "photo": "string"
}{- "name": "string",
- "desc": "string",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "price": 0.1,
- "minimumPrice": 0.1,
- "currency": "string",
- "type": "fixed",
- "status": "string",
- "system": true,
- "baseGiftProduct": true,
- "emailReminder": true,
- "emailReminderDays": 0,
- "id": "string",
- "photo": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "medias": [
- {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "experience": {
- "id": "507f1f77bcf86cd799439011"
}, - "purchaseRule": {
- "id": "string"
}, - "redemptionPurchaseRule": {
- "id": "string"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedAt": "2019-08-24T14:15:22Z",
- "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "deletedAt": "2019-08-24T14:15:22Z",
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}Upload a photo/media file for a gift offer.
XHR Upload: Send raw binary data in request body with Content-Type header set to the image MIME type. Use the qqfile query parameter to specify the filename.
Form Upload: Send as multipart/form-data with the file in the qqfile field.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| qqfile | string Example: qqfile=gift-image.jpg Legacy file upload parameter for filename (used by legacy upload clients). Optional for form uploads; for XHR uploads, use this parameter to provide the original file name and preserve it on the server. |
{- "success": 1,
- "media": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "photo": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
}Retrieve a media file for a gift offer with optional resizing
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| mediaId required | string Media ID or "default" for the default image |
| size | string Image size filter (bg for background, or other size options) |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Update the caption for a specific media item
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| mediaId required | string The media ID to update |
| caption | string New caption for the media |
{- "caption": "string"
}{- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}Gratuities record tips left for experience bookings. A gratuity captures the tip amount, an optional comment, the payment used to collect it, and references back to the booking it relates to - the experience purchase item, the guide, and the event.
Gratuities are created against an experience purchase item; experience products are the only products that support gratuities.
Creating a gratuity is a traveler-facing action: it can be performed by the purchase organizer or by any traveler on the booking. When a non-traveler user creates a gratuity, they must attribute it to a traveler that belongs to the purchase.
Listing and retrieving gratuities is scoped to the requesting account: a seller sees their own gratuities, delegates see gratuities for the seller accounts they manage (guide-only delegates see only gratuities that reference them as a guide), and administrators see all.
A gratuity starts in the pending status. Once it has been reconciled into a payout it moves to reconciled. The status field reflects this lifecycle, and the list endpoint can be filtered by it.
The list endpoint can produce an asynchronous export instead of an inline list by setting the format query parameter. An export requires a seller and returns a 202 Accepted with an export job; poll the jobs endpoint with the returned job ID to track progress and retrieve the generated file.
Create a gratuity for an experience purchase item. Gratuities are only supported on experience products.
This endpoint may be used by the purchase organizer or any traveler on the
booking. When called by a non-traveler user, a traveler reference is
required and must belong to the purchase.
| id required | string Example: 507f1f77bcf86cd799439011 ID of the experience purchase item to tip. |
Gratuity to create
| amount required | number <float> > 0 The gratuity amount. Must be greater than zero. |
| comment required | string A comment describing the gratuity. |
required | object (GratuityPaymentRequest) The payment used to collect the gratuity. The required fields depend on the
|
object Reference to the Stripe payment intent. Required when the payment
| |
object The traveler the gratuity is attributed to. Required when the request is made by a non-traveler user; the traveler must belong to the purchase. |
{- "amount": 20,
- "comment": "Thanks for a great tour!",
- "payment": {
- "method": "cash",
- "amount": 20
}
}{- "object": "gratuity",
- "id": "507f1f77bcf86cd799439099",
- "amount": 20,
- "comment": "Thanks for a great tour!",
- "status": "pending",
- "seller": {
- "id": "507f1f77bcf86cd799439010"
}, - "createdAt": "2026-06-29T10:30:00+00:00",
- "createdBy": {
- "id": "507f1f77bcf86cd799439021"
}, - "payment": {
- "method": "cash",
- "amount": 20
}, - "references": [
- {
- "id": "507f1f77bcf86cd799439030",
- "object": "scheduled_experience_purchase_item"
}
]
}Retrieve a paginated list of gratuities. Results are automatically scoped to the gratuities the authenticated user is allowed to see: a seller sees their own gratuities; delegates see gratuities for the seller accounts they manage (guide-only delegates see only gratuities that reference them as a guide); administrators see all.
Set the format query parameter to request an asynchronous export instead
of an inline list. When exporting, the seller parameter is required and
the response is a 202 Accepted with an export job to poll.
| seller | string Example: seller=507f1f77bcf86cd799439010 Filter by seller ID. Required when |
| references | string Example: references=507f1f77bcf86cd799439011 Filter by a referenced object ID (for example a purchase item, event,
or guide). Supports |
| references_object | string Enum: "scheduled_experience_purchase_item" "user_profile" "event" Example: references_object=scheduled_experience_purchase_item Filter by referenced object type. Supports |
| status | string Enum: "pending" "reconciled" Example: status=pending Filter by reconciliation status. |
| createdAt | string Example: createdAt=2026-01-01,2026-12-31 Filter by creation time. Supports comparison operators
( |
| sort | string Example: sort=-createdAt Comma-separated list of fields to sort by, each optionally prefixed
with |
| expand | string Example: expand=transaction,references.scheduled_experience_purchase_item Comma-separated list of related objects to expand inline rather than
returning ID references. Use |
| format | string Value: "csv" Example: format=csv When set, an asynchronous export job is created instead of returning an
inline list. Requires |
| skip | integer >= 0 Default: 0 Number of items to skip |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
{- "data": [
- {
- "object": "gratuity",
- "id": "507f1f77bcf86cd799439099",
- "amount": 20,
- "comment": "Thanks for a great tour!",
- "status": "pending",
- "seller": {
- "id": "507f1f77bcf86cd799439010"
}, - "createdAt": "2026-06-29T10:30:00+00:00",
- "createdBy": {
- "id": "507f1f77bcf86cd799439021"
}, - "payment": {
- "method": "cash",
- "amount": 20
}, - "references": [
- {
- "id": "507f1f77bcf86cd799439030",
- "object": "scheduled_experience_purchase_item"
}
]
}
], - "paging": {
- "next": null
}
}Retrieve a single gratuity by its ID. Access is limited to the gratuity's seller, seller delegates, and administrators.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| expand | string Example: expand=transaction Comma-separated list of related objects to expand inline. Use
|
{- "object": "gratuity",
- "id": "507f1f77bcf86cd799439099",
- "amount": 20,
- "comment": "Thanks for a great tour!",
- "status": "pending",
- "seller": {
- "id": "507f1f77bcf86cd799439010"
}, - "createdAt": "2026-06-29T10:30:00+00:00",
- "createdBy": {
- "id": "507f1f77bcf86cd799439021"
}, - "payment": {
- "method": "cash",
- "amount": 20
}, - "references": [
- {
- "id": "507f1f77bcf86cd799439030",
- "object": "scheduled_experience_purchase_item"
}
]
}Retrieve a paginated list of guides belonging to a specific seller. Supports filtering by availability for events.
| id required | string Seller ID |
| name | string Example: name=Sarah Filter guides by name (partial match) |
| events | string Event ID to check guide availability against |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
{- "data": [
- {
- "id": "507f1f77bcf86cd799439011",
- "object": "user_profile",
- "name": "Sarah Johnson",
- "bio": "Experienced outdoor guide",
- "phone": "+1-617-555-1234",
- "picture": null,
- "user": {
- "id": "507f191e810c19729de860eb"
}, - "seller": {
- "id": "507f191e810c19729de860ea"
}, - "schedules": [ ],
- "createdBy": {
- "id": "507f191e810c19729de860ec"
}, - "updatedAt": "2024-01-15T10:30:00Z",
- "deletedAt": null,
- "deletedBy": null,
- "guidePermission": {
- "canModifySchedules": true,
- "modifySchedulesOffset": 60
}, - "overlappingEvents": {
- "enabled": false,
- "forceConfirm": true
}
}
], - "paging": {
- "next": null
}
}Create a new guide for a seller. Can create a guide for an existing user or create a new user account.
| id required | string Seller ID |
| name required | string Full name of the guide |
| bio | string or null Biography or description of the guide |
| phone | string or null Phone number of the guide |
Media (object) or null Profile picture of the guide | |
Array of objects (BaseSchedule) Guide availability schedules | |
GuidePermissionPreference (object) or null Permissions related to guide schedule modifications | |
OverlappingEventsPreference (object) or null Preferences for handling overlapping event assignments | |
required | object User account information for the guide |
{- "name": "Sarah Johnson",
- "bio": "Experienced outdoor guide with 10 years in adventure tourism",
- "phone": "+1-617-555-1234",
- "user": {
- "email": "sarah@example.com"
}, - "guidePermission": {
- "canModifySchedules": true,
- "modifySchedulesOffset": 60
}, - "overlappingEvents": {
- "enabled": false,
- "forceConfirm": true
}
}{- "id": "507f1f77bcf86cd799439011",
- "object": "user_profile",
- "name": "Sarah Johnson",
- "bio": "Experienced outdoor guide with 10 years in adventure tourism",
- "phone": "+1-617-555-1234",
- "picture": null,
- "user": {
- "id": "507f191e810c19729de860eb"
}, - "seller": {
- "id": "507f191e810c19729de860ea"
}, - "schedules": [ ],
- "createdBy": {
- "id": "507f191e810c19729de860ec"
}, - "updatedAt": "2024-01-15T10:30:00Z",
- "deletedAt": null,
- "deletedBy": null,
- "guidePermission": {
- "canModifySchedules": true,
- "modifySchedulesOffset": 60
}, - "overlappingEvents": {
- "enabled": false,
- "forceConfirm": true
}
}Get detailed information about a specific guide.
| id required | string Seller ID |
| guideId required | string Guide ID |
{- "id": "507f1f77bcf86cd799439011",
- "object": "user_profile",
- "name": "Sarah Johnson",
- "bio": "Experienced outdoor guide with 10 years in adventure tourism",
- "phone": "+1-617-555-1234",
- "picture": null,
- "user": {
- "id": "507f191e810c19729de860eb"
}, - "seller": {
- "id": "507f191e810c19729de860ea"
}, - "schedules": [ ],
- "createdBy": {
- "id": "507f191e810c19729de860ec"
}, - "updatedAt": "2024-01-15T10:30:00Z",
- "deletedAt": null,
- "deletedBy": null,
- "guidePermission": {
- "canModifySchedules": true,
- "modifySchedulesOffset": 60
}, - "overlappingEvents": {
- "enabled": false,
- "forceConfirm": true
}
}Update information for an existing guide.
| id required | string Seller ID |
| guideId required | string Guide ID |
| name | string Updated full name of the guide |
| bio | string or null Updated biography or description of the guide |
| phone | string or null Updated phone number of the guide |
Media (object) or null Updated profile picture of the guide | |
Array of objects (BaseSchedule) Updated guide availability schedules | |
GuidePermissionPreference (object) or null Updated permissions related to guide schedule modifications | |
OverlappingEventsPreference (object) or null Updated preferences for handling overlapping event assignments |
{- "bio": "Senior outdoor guide with 15 years in adventure tourism"
}{- "id": "507f1f77bcf86cd799439011",
- "object": "user_profile",
- "name": "Sarah Johnson",
- "bio": "Senior outdoor guide with 15 years in adventure tourism",
- "phone": "+1-617-555-1234",
- "picture": null,
- "user": {
- "id": "507f191e810c19729de860eb"
}, - "seller": {
- "id": "507f191e810c19729de860ea"
}, - "schedules": [ ],
- "createdBy": {
- "id": "507f191e810c19729de860ec"
}, - "updatedAt": "2024-01-16T14:20:00Z",
- "deletedAt": null,
- "deletedBy": null,
- "guidePermission": {
- "canModifySchedules": false,
- "modifySchedulesOffset": 120
}, - "overlappingEvents": {
- "enabled": true,
- "forceConfirm": false
}
}Delete a guide. The guide cannot be deleted if they are assigned to future events.
| id required | string Seller ID |
| guideId required | string Guide ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Upload a profile picture or other media for a guide.
| id required | string Seller ID |
| guideId required | string Guide ID |
| picture required | string <binary> Profile picture file to upload |
{- "id": "507f1f77bcf86cd799439013",
- "caption": "Guide profile picture",
- "type": "image",
- "size": 1024000,
- "createdAt": "2024-01-15T10:30:00Z"
}Delete a specific media item (profile picture) from a guide.
| id required | string Seller ID |
| guideId required | string Guide ID |
| mediaId required | string Media ID to delete |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Redirects to the guide's profile picture URL.
| id required | string Seller ID |
| guideId required | string Guide ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Retrieve the status and details of an asynchronous job. Jobs are created by async operations such as CSV purchase imports and dispute evidence exports.
Job Types:
POST /purchases with CSV file uploadexportDisputeEvidence - created by GET /purchases/{id}/disputeEvidence. Includes additional fields: url (S3 download URL), filename (zip file name), purchase (purchase ID).Poll this endpoint to track job progress. Terminal statuses:
completed - job finished successfullyerror - job failed (see error details in response)stale - job timed out or became stale| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "id": "507f1f77bcf86cd799439011",
- "status": "completed",
- "progress": 100,
- "createdAt": "2024-01-15T10:30:00Z",
- "updatedAt": "2024-01-15T10:31:00Z"
}A LineItemTemplate is the blueprint for a line item. It stores the initial schema for the different types of line items (demographics, add-ons, taxes, fees, coupon discounts) that can be added to a purchase. Every line item uses a template to set initial values for fields like type, destination, visibility, and name; purchase rules then operate on the resulting line items to modify certain fields.
When creating a purchase, the traveler (or whoever is placing the purchase) begins by selecting a set of line item templates (typically demographics and add-ons) and adding line items for these into their purchase. Purchase rules can then operate on the purchase to update price, amount, and other fields, and to add any other line items if required. In general, there is a line item template for each demographic, add-on, tax/fee, or coupon a seller has configured. A LineItemTemplate shares most of its fields with the LineItems created from it.
Retrieve a paginated list of line item templates for the authenticated seller.
Supports filtering and pagination. Returns both LineItemTemplate and UnitLineItemTemplate objects depending on the template type.
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
{- "data": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "object": "line_item_template",
- "type": "fee",
- "name": "Service Fee",
- "destination": "seller",
- "visible": true,
- "system": false,
- "includeInAmount": false,
- "seller": {
- "id": "60f7b3c4e4b0a1234567890b"
}, - "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T11:45:00Z"
}, - {
- "id": "60f7b3c4e4b0a1234567890c",
- "object": "unit_line_item_template",
- "type": "fee",
- "name": "Adult",
- "destination": "seller",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "unit": {
- "id": "60f7b3c4e4b0a1234567890d"
}, - "seller": {
- "id": "60f7b3c4e4b0a1234567890b"
}, - "createdAt": "2023-12-07T12:00:00Z",
- "updatedAt": "2023-12-07T12:30:00Z"
}
], - "paging": {
- "next": null
}
}Create a new line item template. The template type determines whether a basic LineItemTemplate or UnitLineItemTemplate is created.
For unit-based templates, include the object field set to "unit_line_item_template" and
provide a unit reference.
| type required | string Enum: "tax" "fee" "discount" "coupon_discount" "partner_fee" "processing_fee" "sub_total" "package_discount" "affiliate_discount" "affiliate_commission" "affiliate_deposit" "feeable_taxable_adjustment" Type of the line item template |
| destination required | string Enum: "seller" "xola" Where the line item is directed |
| visible required | boolean Whether the line item is visible to customers |
| includeInAmount required | boolean Whether to include this line item in the total amount calculation |
required | object (ObjectReference) Reference to the seller who owns this template |
| source | string Enum: "seller" "traveler" Source of the line item template (for partner fee items) |
| visibility | string Enum: "all" "none" "xola" "seller" "traveler" "affiliate" "guide" Visibility setting for the line item |
| lineItemObject | string Default: "line_item" The object type for line items created from this template |
| name | string Human-readable name of the line item template |
| code | string Unique code identifier for the template |
| refundToTraveler | boolean Whether the partner fee can be refunded to traveler (valid only if paid by traveler) |
| refundToSeller | boolean Whether the partner fee can be refunded to seller |
| excludeFromUnitPrice | boolean Whether to exclude from tax calculation for prices shown during checkout |
{- "type": "fee",
- "destination": "seller",
- "visible": true,
- "includeInAmount": false,
- "seller": {
- "id": "60f7b3c4e4b0a1234567890b"
}, - "name": "Service Fee"
}{- "id": "60f7b3c4e4b0a1234567890a",
- "object": "unit_line_item_template",
- "type": "fee",
- "name": "Adult",
- "destination": "seller",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "unit": {
- "id": "60f7b3c4e4b0a1234567890d"
}, - "seller": {
- "id": "60f7b3c4e4b0a1234567890b"
}, - "createdBy": {
- "id": "60f7b3c4e4b0a1234567890b"
}, - "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T10:30:00Z"
}Retrieve a specific line item template by its unique identifier.
Returns either a LineItemTemplate or UnitLineItemTemplate object depending on the template type.
| id required | string Example: 507f1f77bcf86cd799439011 Unique identifier of the line item template |
{- "id": "60f7b3c4e4b0a1234567890a",
- "object": "unit_line_item_template",
- "type": "fee",
- "name": "Adult",
- "code": "ADULT_001",
- "destination": "seller",
- "visibility": "all",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "lineItemObject": "line_item",
- "unit": {
- "id": "60f7b3c4e4b0a1234567890d"
}, - "seller": {
- "id": "60f7b3c4e4b0a1234567890b"
}, - "createdBy": {
- "id": "60f7b3c4e4b0a1234567890b"
}, - "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T11:45:00Z"
}Update an existing line item template with new data.
Only provided fields will be updated. Immutable fields like object and id cannot be changed.
| id required | string Example: 507f1f77bcf86cd799439011 Unique identifier of the line item template |
| type required | string Enum: "tax" "fee" "discount" "coupon_discount" "partner_fee" "processing_fee" "sub_total" "package_discount" "affiliate_discount" "affiliate_commission" "affiliate_deposit" "feeable_taxable_adjustment" Type of the line item template |
| destination required | string Enum: "seller" "xola" Where the line item is directed |
| visible required | boolean Whether the line item is visible to customers |
| includeInAmount required | boolean Whether to include this line item in the total amount calculation |
required | object (ObjectReference) Reference to the seller who owns this template |
| source | string Enum: "seller" "traveler" Source of the line item template (for partner fee items) |
| visibility | string Enum: "all" "none" "xola" "seller" "traveler" "affiliate" "guide" Visibility setting for the line item |
| lineItemObject | string Default: "line_item" The object type for line items created from this template |
| name | string Human-readable name of the line item template |
| code | string Unique code identifier for the template |
| refundToTraveler | boolean Whether the partner fee can be refunded to traveler (valid only if paid by traveler) |
| refundToSeller | boolean Whether the partner fee can be refunded to seller |
| excludeFromUnitPrice | boolean Whether to exclude from tax calculation for prices shown during checkout |
{- "type": "fee",
- "destination": "xola",
- "visible": false,
- "includeInAmount": true,
- "seller": {
- "id": "60f7b3c4e4b0a1234567890b"
}
}{- "id": "60f7b3c4e4b0a1234567890a",
- "object": "unit_line_item_template",
- "type": "fee",
- "name": "Adult",
- "destination": "seller",
- "visible": true,
- "system": false,
- "includeInAmount": false,
- "unit": {
- "id": "60f7b3c4e4b0a1234567890d"
}, - "seller": {
- "id": "60f7b3c4e4b0a1234567890b"
}, - "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T15:45:00Z"
}Soft delete a line item template. The template will be marked as deleted but preserved in the database for audit purposes.
Deleted templates will not appear in list responses unless specifically requested.
| id required | string Example: 507f1f77bcf86cd799439011 Unique identifier of the line item template |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Retrieves a list of message templates for the authenticated user's accessible sellers.
Results can be filtered by seller and the existence of specific message channels (email or SMS). Supports pagination and sorting.
| seller | string Example: seller=60f7d1234567890abcdef123 Filter templates by seller ID |
| exists | string Examples:
Comma-separated list of fields that must exist.
Common values: |
object (DateTimeFilterSchema) Examples: deletedAt[summary]=Find records where field exists (not null)&deletedAt[value]=[object Object] deletedAt[summary]=Find records where field is null/missing&deletedAt[value]=[object Object] deletedAt[summary]=Date range filtering&deletedAt[value]=[object Object] deletedAt[summary]=Range using comma-separated string&deletedAt[value]=[object Object] deletedAt[summary]=Using period for today&deletedAt[value]=[object Object] deletedAt[summary]=Using period for last week&deletedAt[value]=[object Object] deletedAt[summary]=Exact date-time match&deletedAt[value]=[object Object] deletedAt[summary]=After specific date&deletedAt[value]=[object Object] Filter by deletion timestamp. Supports date-time filtering operations. | |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
{- "data": [
- {
- "id": "60f7d1234567890abcdef123",
- "name": "Booking Confirmation",
- "email": {
- "subject": "Your booking is confirmed!",
- "body": "Hi {{purchase.customerName}}, your booking for {{purchase.productName}} is confirmed."
}, - "sms": {
- "body": "Hi {{purchase.customerName}}, your {{purchase.productName}} booking is confirmed!"
}, - "locale": "en",
- "seller": {
- "id": "60f7d1234567890abcdef456"
}, - "createdBy": {
- "id": "60f7d1234567890abcdef789"
}, - "createdAt": "2024-01-15T10:30:00Z",
- "updatedBy": {
- "id": "60f7d1234567890abcdef789"
}, - "updatedAt": "2024-01-15T14:20:00Z"
}
], - "next": "",
- "_es": false
}Creates a new message template for the specified seller.
A message template must include at least one message channel (email and/or SMS).
You can specify channels using either the email/sms properties or the channels array.
| seller | string Seller ID (can be provided as query parameter or in request body) |
| name required | string <= 255 characters Descriptive name for the message template |
object (MessageContentRequest) Email content configuration for this template | |
object (MessageContentRequest) SMS content configuration for this template | |
Array of objects (ChannelRequest) Alternative way to specify multiple message channels (email and/or SMS) | |
| locale | string <locale> The locale/language for this message template |
object (ObjectReference) Reference to the seller that will own this message template (required for POST requests) |
{- "name": "Booking Confirmation",
- "email": {
- "subject": "Your booking is confirmed!",
- "body": "Hi {{purchase.customerName|first_name}}, thank you for booking {{purchase.productName}} for {{purchase.quantity}} guests on {{purchase.arrivalDate}}. If you have any questions, give us a call at {{seller.phone}}. Best wishes, {{seller.name}}"
}, - "sms": {
- "body": "Hi {{purchase.customerName|first_name}}, your {{purchase.productName}} booking is confirmed! Questions? Call {{seller.phone}}"
}, - "locale": "en",
- "seller": {
- "id": "60f7d1234567890abcdef456"
}
}{- "id": "60f7d1234567890abcdef123",
- "name": "Booking Confirmation",
- "email": {
- "subject": "Your booking is confirmed!",
- "body": "Hi {{purchase.customerName|first_name}}, thank you for booking {{purchase.productName}}..."
}, - "sms": {
- "body": "Hi {{purchase.customerName|first_name}}, your {{purchase.productName}} booking is confirmed!"
}, - "locale": "en",
- "seller": {
- "id": "60f7d1234567890abcdef456"
}, - "createdBy": {
- "id": "60f7d1234567890abcdef789"
}, - "createdAt": "2024-01-15T10:30:00Z"
}Retrieves a specific message template by ID
| id required | string Example: 507f1f77bcf86cd799439011 Message template ID |
{- "id": "60f7d1234567890abcdef123",
- "name": "Booking Confirmation",
- "email": {
- "subject": "Your booking is confirmed!",
- "body": "Hi {{purchase.customerName|first_name}}, thank you for booking {{purchase.productName}} for {{purchase.quantity}} guests on {{purchase.arrivalDate}}. If you have any questions, give us a call at {{seller.phone}}. Best wishes, {{seller.name}}"
}, - "sms": {
- "body": "Hi {{purchase.customerName|first_name}}, your {{purchase.productName}} booking is confirmed! Questions? Call {{seller.phone}}"
}, - "locale": "en",
- "seller": {
- "id": "60f7d1234567890abcdef456"
}, - "createdBy": {
- "id": "60f7d1234567890abcdef789"
}, - "createdAt": "2024-01-15T10:30:00Z",
- "updatedBy": {
- "id": "60f7d1234567890abcdef789"
}, - "updatedAt": "2024-01-15T14:20:00Z"
}Updates an existing message template.
All updatable fields should be provided in the request body. The template cannot be updated if it has been soft-deleted.
| id required | string Example: 507f1f77bcf86cd799439011 Message template ID |
| name required | string <= 255 characters Descriptive name for the message template |
object (MessageContentRequest) Email content configuration for this template | |
object (MessageContentRequest) SMS content configuration for this template | |
Array of objects (ChannelRequest) Alternative way to specify multiple message channels (email and/or SMS) | |
| locale | string <locale> The locale/language for this message template |
object (ObjectReference) Reference to the seller that will own this message template (required for POST requests) |
{- "name": "Updated Booking Confirmation",
- "email": {
- "subject": "Your booking is confirmed! (Updated)",
- "body": "Hi {{purchase.customerName|first_name}}, thank you for booking {{purchase.productName}} for {{purchase.quantity}} guests on {{purchase.arrivalDate}}. Updated message. If you have any questions, give us a call at {{seller.phone}}. Best wishes, {{seller.name}}"
}, - "sms": {
- "body": "Hi {{purchase.customerName|first_name}}, your {{purchase.productName}} booking is confirmed! Updated. Questions? Call {{seller.phone}}"
}, - "locale": "en"
}{- "id": "60f7d1234567890abcdef123",
- "name": "Updated Booking Confirmation",
- "email": {
- "subject": "Your booking is confirmed! (Updated)",
- "body": "Hi {{purchase.customerName|first_name}}, thank you for booking {{purchase.productName}}... Updated message..."
}, - "sms": {
- "body": "Hi {{purchase.customerName|first_name}}, your {{purchase.productName}} booking is confirmed! Updated."
}, - "locale": "en",
- "seller": {
- "id": "60f7d1234567890abcdef456"
}, - "createdBy": {
- "id": "60f7d1234567890abcdef789"
}, - "createdAt": "2024-01-15T10:30:00Z",
- "updatedBy": {
- "id": "60f7d1234567890abcdef999"
}, - "updatedAt": "2024-01-15T16:45:00Z"
}Soft-deletes a message template by setting the deletedAt timestamp.
The template will no longer appear in regular API responses but can still be retrieved
using the deletedAt[exists]=true filter parameter.
| id required | string Example: 507f1f77bcf86cd799439011 Message template ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Sends messages (email and/or SMS) to customers using a message template.
This endpoint can:
The messages will be sent to customers associated with the filtered orders/purchases.
Template Variables: Message content supports Twig template variables like:
{{purchase.customerName}} - Customer's full name{{purchase.customerName|first_name}} - Customer's first name{{purchase.productName}} - Product/experience name(s){{purchase.arrivalDate}} - Arrival date{{purchase.quantity}} - Number of guests{{seller.name}} - Seller name{{seller.phone}} - Seller phone{{seller.email}} - Seller email| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
required | MessageTemplateReference (object) or InlineMessageTemplate (object) Either a reference to an existing template or inline template content |
required | object (MessageFilters) Criteria to select which customers receive the message |
| from | string <email> Sender email address (for email messages) |
Array of objects (MessageRecipient) Specific recipients (optional - usually determined by filters) | |
| dryRun | boolean Default: false When true, returns a preview without actually sending messages |
{- "messageTemplate": {
- "id": "60f7d1234567890abcdef123"
}, - "filters": {
- "event": "60f7d1234567890abcdef456"
}, - "from": "bookings@example.com",
- "to": [
- {
- "type": "traveler",
- "id": "60f7d1234567890abcdef789"
}
]
}{- "id": "60f7d1234567890abcdef123",
- "name": "Trip Reminder Template",
- "email": {
- "subject": "Your trip reminder",
- "body": "Hi John, your Adventure Tour experience is tomorrow at 9:00 AM. We're looking forward to seeing you!"
}, - "sms": {
- "body": "Hi John, your Adventure Tour trip is tomorrow at 9:00 AM!"
}, - "locale": "en",
- "seller": {
- "id": "60f7d1234567890abcdef456"
}, - "createdBy": {
- "id": "60f7d1234567890abcdef789"
}, - "createdAt": "2024-01-15T10:30:00Z"
}Generates a preview of rendered message content using template variables and customer data.
This endpoint renders the specified email template with actual or dummy data to show how the final message will appear. Returns HTML content suitable for preview display.
The template field in the request body determines which email layout to render.
Depending on the template type, different fields are required or optional:
purchase.confirmation: Requires experience to look up a purchase for that experience.purchase.gift.certificate: Requires giftOffer to look up a gift purchase.purchase.reminder.review: The experience field is optional. If provided,
the preview uses purchase data for that experience. If omitted, the endpoint falls back to the
authenticated seller's context (using the seller's review preferences and a recent purchase from
the seller's catalog). A ValidationException is returned if neither an experience nor a
resolvable seller is available. Optionally accepts customHTML to render a custom review
reminder template body.communication.email / communication.sms: Requires messageTemplate
with a reference to an existing template.| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| template required | string Enum: "purchase.confirmation" "purchase.gift.certificate" "purchase.reminder.review" "communication.email" "communication.sms" The template type identifier that determines which email layout to render. Supported values:
|
| experience | string^[0-9a-fA-F]{24}$ Experience (product) ID used to generate preview data.
Required for |
| giftOffer | string^[0-9a-fA-F]{24}$ Gift offer ID used to generate preview data.
Required for |
MessageTemplateReference (object) or InlineMessageTemplate (object) Message template reference or inline content.
Required for | |
| customHTML | string Custom HTML content to render in place of the default review template body.
Only applicable to |
{- "template": "purchase.confirmation",
- "experience": "60f7d1234567890abcdef123"
}<h1>How was your Adventure Tour?</h1> <p>Hi John, we hope you enjoyed your experience!</p> <p>We'd love to hear your feedback.</p>
Creates a new message within an existing conversation.
Supports three types of messages:
body and from fieldsformats, channels, and from fields.
Required when targeting plugin channels. Both formats and channels must be non-empty.meta.template fieldFor v2 sellers, messages are handled differently than v1 sellers.
| id required | string Example: 507f1f77bcf86cd799439011 Conversation ID |
| body required | string <= 10000 characters Message content |
| from required | string <email> Sender email address |
{- "body": "Thank you for your inquiry. We'll get back to you shortly.",
- "from": "507f191e810c19729de860ea"
}{- "object": "message",
- "id": "60f7d1234567890abcdef456",
- "from": "507f191e810c19729de860ea",
- "type": "email",
- "system": false,
- "channels": [
- "email"
], - "formats": [
- {
- "type": "email",
- "subject": "Your trip is confirmed",
- "body": "Hi! Your adventure booking is confirmed for January 20th."
}
], - "to": [ ],
- "createdAt": "2024-01-15T10:30:00Z"
}Partially updates a message within a conversation.
Currently supports updating the body of a text-type format for messages
sent via plugin channels only (not email or sms).
The request body must include a formats array with text-type format objects.
| id required | string Example: 507f1f77bcf86cd799439011 Conversation ID |
| messageId required | string Example: 60f7d1234567890abcdef456 Message ID |
required | Array of objects non-empty Array of format objects to update. Only |
{- "formats": [
- {
- "type": "text",
- "body": "Updated message content for the plugin channel."
}
]
}{- "id": "60f7d1234567890abcdef456"
}Soft-deletes a message within a conversation.
The message is not permanently removed - deletedAt and deletedBy fields
are set on the message document. The message will still appear in conversation
responses but will have the deletedAt timestamp set.
| id required | string Example: 507f1f77bcf86cd799439011 Conversation ID |
| messageId required | string Example: 60f7d1234567890abcdef456 Message ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Updates delivery status and error information for a message. Used by external systems to report delivery status.
| id required | string Example: 507f1f77bcf86cd799439011 Conversation ID |
| messageId required | string Example: 60f7d1234567890abcdef456 Message ID |
| status required | string Enum: "pending" "sent" "delivered" "failed" "read" Delivery status |
| error | string Error description if delivery failed |
{- "status": "delivered"
}{- "id": "60f7d1234567890abcdef456"
}Packages bundle multiple experiences so they can be sold together as a single offering, optionally at a discount. A package is a kind of product, so it shares many fields with experiences - name, description, pricing, media, and cancellation policy - while adding the experiences it bundles and how they are grouped.
The seller account must have packages enabled. Listing and retrieving packages is available to any authenticated user, while creating, updating, and deleting a package requires access to the seller account (ownership, or a curator or seller-admin delegation on it).
A package defines the experiences it bundles through selectedProducts - an ordered list where each entry references an experience and carries a sequence position that controls its display order within the package.
The type field controls how guest demographics are handled across the bundled experiences:
demographics_shared: the package uses one shared set of demographics that applies to every bundled experience.demographics_varies: each bundled experience keeps its own demographics.A package can define its own schedules to control when it is available for booking, independently of the schedules of the experiences it bundles.
Each package can have a primary photo and additional images. Images are uploaded as raw binary data (or as multipart/form-data) and can be resized on the server when retrieved. The primary photo cannot be deleted.
Retrieve a paginated list of packages for a seller. The seller query
parameter is required.
| seller required | string Example: seller=507f1f77bcf86cd799439011 ID of the seller whose packages to list. |
| id | string Example: id=507f1f77bcf86cd799439012 Filter packages by ID. Supports an exact match ( |
| expand | string Enum: "selectedProducts" "experiences" "seller" "seller.name" "form" Example: expand=selectedProducts Comma-separated list of related objects to expand inline rather than returning ID references. |
| skip | integer >= 0 Default: 0 Number of items to skip |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
{- "data": [
- {
- "object": "package",
- "id": "507f1f77bcf86cd799439011",
- "name": "Adventure Weekend Bundle",
- "excerpt": "Two thrilling experiences for one great price.",
- "desc": "Combine our zip-line tour and white-water rafting trip.",
- "price": 199,
- "currency": "USD",
- "priceType": "person",
- "type": "demographics_shared",
- "status": "published",
- "seller": {
- "id": "507f1f77bcf86cd799439010"
}, - "selectedProducts": [
- {
- "product": {
- "id": "507f1f77bcf86cd799439021"
}, - "sequence": 0
}, - {
- "product": {
- "id": "507f1f77bcf86cd799439022"
}, - "sequence": 1
}
]
}
], - "paging": {
- "next": null
}
}Create a new package for a seller. The request must include a seller
reference, and the authenticated user must be allowed to create packages
for that seller (owner, or a curator / seller-admin delegate, with the
packages feature enabled).
The experiences included in the package are configured through
selectedProducts.
Package to create
| name required | string Package name. |
| excerpt required | string Short summary of the package. |
| desc required | string Full package description. |
| price | number <float> >= 0 Package price. |
| currency | string ISO currency code. |
| priceType | string Default: "person" Enum: "person" "outing" Whether the price is charged per person or per outing. |
| guestType | string Default: "normal" Enum: "normal" "passenger" How guests are counted for this package. |
| type | string Default: "demographics_shared" Enum: "demographics_shared" "demographics_varies" Whether demographics are shared across the bundled experiences or vary per experience. |
| minimumTransitDuration | integer Suggested minimum time, in minutes, between the bundled experiences. |
| paymentMethod | string Enum: "later" "cc" Accepted payment method for the package. |
| cancellationPolicy | string Cancellation policy text. |
| other | string Additional information shown to travelers. |
| allowedCouponTypes | Array of strings Items Enum: "discount" "unlock" Coupon types that may be applied to this package. |
object The seller that owns the package. Required when creating a package; ignored on update (the existing seller is retained). | |
Array of objects (SelectedProductRequest) Experiences included in the package, in display order. | |
object Reference to an existing media item to use as the primary photo. |
{- "name": "Adventure Weekend Bundle",
- "excerpt": "Two thrilling experiences for one great price.",
- "desc": "Combine our zip-line tour and white-water rafting trip.",
- "price": 199,
- "currency": "USD",
- "priceType": "person",
- "type": "demographics_shared",
- "seller": {
- "id": "507f1f77bcf86cd799439010"
}, - "selectedProducts": [
- {
- "product": {
- "id": "507f1f77bcf86cd799439021"
}, - "sequence": 0
}, - {
- "product": {
- "id": "507f1f77bcf86cd799439022"
}, - "sequence": 1
}
]
}{- "object": "package",
- "id": "507f1f77bcf86cd799439011",
- "name": "Adventure Weekend Bundle",
- "excerpt": "Two thrilling experiences for one great price.",
- "desc": "Combine our zip-line tour and white-water rafting trip.",
- "price": 199,
- "currency": "USD",
- "priceType": "person",
- "type": "demographics_shared",
- "status": "draft",
- "seller": {
- "id": "507f1f77bcf86cd799439010"
}, - "selectedProducts": [
- {
- "product": {
- "id": "507f1f77bcf86cd799439021"
}, - "sequence": 0
}, - {
- "product": {
- "id": "507f1f77bcf86cd799439022"
}, - "sequence": 1
}
]
}Retrieve a single package by its ID.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| expand | string Enum: "selectedProducts" "experiences" "seller" "seller.name" "form" Example: expand=selectedProducts,form Comma-separated list of related objects to expand inline rather than returning ID references. |
{- "object": "package",
- "id": "507f1f77bcf86cd799439011",
- "name": "Adventure Weekend Bundle",
- "excerpt": "Two thrilling experiences for one great price.",
- "desc": "Combine our zip-line tour and white-water rafting trip.",
- "price": 199,
- "currency": "USD",
- "priceType": "person",
- "type": "demographics_shared",
- "status": "published",
- "seller": {
- "id": "507f1f77bcf86cd799439010"
}, - "selectedProducts": [
- {
- "product": {
- "id": "507f1f77bcf86cd799439021"
}, - "sequence": 0
}
]
}Update an existing package. The authenticated user must be allowed to edit the package (owner, or a curator / seller-admin delegate, with the packages feature enabled).
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
Package fields to update
| name required | string Package name. |
| excerpt required | string Short summary of the package. |
| desc required | string Full package description. |
| price | number <float> >= 0 Package price. |
| currency | string ISO currency code. |
| priceType | string Default: "person" Enum: "person" "outing" Whether the price is charged per person or per outing. |
| guestType | string Default: "normal" Enum: "normal" "passenger" How guests are counted for this package. |
| type | string Default: "demographics_shared" Enum: "demographics_shared" "demographics_varies" Whether demographics are shared across the bundled experiences or vary per experience. |
| minimumTransitDuration | integer Suggested minimum time, in minutes, between the bundled experiences. |
| paymentMethod | string Enum: "later" "cc" Accepted payment method for the package. |
| cancellationPolicy | string Cancellation policy text. |
| other | string Additional information shown to travelers. |
| allowedCouponTypes | Array of strings Items Enum: "discount" "unlock" Coupon types that may be applied to this package. |
object The seller that owns the package. Required when creating a package; ignored on update (the existing seller is retained). | |
Array of objects (SelectedProductRequest) Experiences included in the package, in display order. | |
object Reference to an existing media item to use as the primary photo. |
{- "name": "Adventure Weekend Bundle (Updated)",
- "excerpt": "Now with an extra activity.",
- "desc": "Three experiences, one price.",
- "selectedProducts": [
- {
- "product": {
- "id": "507f1f77bcf86cd799439021"
}, - "sequence": 0
}, - {
- "product": {
- "id": "507f1f77bcf86cd799439023"
}, - "sequence": 1
}
]
}{- "name": "Adventure Weekend Bundle",
- "excerpt": "Two thrilling experiences for one great price.",
- "desc": "Combine our zip-line tour and white-water rafting trip.",
- "price": 199,
- "currency": "USD",
- "priceType": "person",
- "guestType": "normal",
- "type": "demographics_shared",
- "minimumTransitDuration": 30,
- "paymentMethod": "later",
- "cancellationPolicy": "string",
- "other": "string",
- "allowedCouponTypes": [
- "discount"
], - "object": "package",
- "id": "507f1f77bcf86cd799439011",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "status": "draft",
- "selectedProducts": [
- {
- "product": {
- "id": "507f1f77bcf86cd799439011"
}, - "sequence": 0
}
], - "photo": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "medias": [
- {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "catalog": {
- "items": [
- {
- "object": "global_catalog_item",
- "id": "string",
- "name": "string",
- "type": "quantity",
- "caption": "string",
- "unitType": "demographic",
- "visibility": "public",
- "sku": "string",
- "required": false,
- "photo": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "defaultChoice": "string",
- "sequence": 0,
- "template": {
- "id": "string",
- "code": "adult",
- "type": "demographic"
}, - "unit": {
- "id": "string"
}, - "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "items": [
- null
], - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "terms": [
- {
- "object": "catalog_term",
- "type": "products",
- "name": "string",
- "caption": "string",
- "value": 0.1
}
], - "promotions": [
- {
- "object": "catalog_promotion",
- "type": "absolute_discount_per_purchase",
- "name": "string",
- "caption": "string",
- "value": 0.1
}
], - "priceTiers": {
- "property1": {
- "quantityStart": [
- 0
], - "priceType": "per_person"
}, - "property2": {
- "quantityStart": [
- 0
], - "priceType": "per_person"
}
}, - "priceExpiresAt": "2019-08-24T14:15:22Z"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updated": "2019-08-24T14:15:22Z",
- "deletedAt": "2019-08-24T14:15:22Z",
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}
}Soft-delete a package (sets a deletedAt timestamp and removes its
seller associations). The authenticated user must be allowed to delete
the package.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Upload a photo for a package. The body of the request should contain the raw image data.
XHR Upload: Send raw binary data in the request body with the
Content-Type header set to the image MIME type. Use the qqfile query
parameter to specify the filename.
Form Upload: Send as multipart/form-data with the file in the
qqfile field.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| qqfile | string Example: qqfile=package-image.jpg Original file name, used to preserve the filename on the server (used by legacy upload clients). |
{- "success": 1,
- "media": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "photo": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
}Retrieve a package image. Filters allow the image to be resized on the
server; if no filters are specified, the original image is returned. The
bg size returns a large, blurred image suitable for use as a page
background.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| media required | string Example: 507f1f77bcf86cd799439041 Media ID, or |
| size | string Example: size=bg Image size filter (e.g. |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Update the caption for a media item on a package.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| media required | string Example: 507f1f77bcf86cd799439041 ID of the media item to update. |
| caption | string New caption for the media item. |
{- "caption": "Sunset over the canyon"
}{- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}Remove a media item from a package. The package's primary photo cannot be deleted.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| media required | string Example: 507f1f77bcf86cd799439041 ID of the media item to delete. |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}A Purchase represents a booking made on a seller's account. A Purchase is associated with two related resources: PurchaseItems (the individual reservations within the booking) and LineItems (the financial entries that make up its payment summary). All pricing-related components of a booking are consolidated into line items, which makes pricing calculations on a purchase straightforward.
Payment-related line items (payments, refunds, gift coupons, vouchers, partner fees, processing fees) are added at the Purchase level, while reservation-related line items (demographics, add-ons, taxes, discounts) are added at the PurchaseItem level.
Retrieve a paginated list of purchases. Supports filtering, searching, and various query parameters.
Supports two modes:
search, kiosk, or dashboard parameters are provided along with sellerFor export functionality, include a format parameter to receive a job ID for asynchronous processing.
Affiliate Access:
Affiliates with product-level permissions (selectedExperiences) can access purchases containing items
for their assigned experiences. If an affiliate has access to all experiences for a seller, they can view
all of that seller's purchases. Otherwise, only purchases with items matching their permitted experience IDs
are returned.
| seller | string Example: seller=60f7b3c4e4b0a1234567890a Filter purchases by seller ID |
| organizer | string Example: organizer=60f7b3c4e4b0a1234567890b Filter purchases by organizer/customer ID |
| status | Array of strings Items Enum: "draft" "waitlist" "abandon" "hold" "committed" Example: status=committed,hold Filter by purchase status(es) |
| search | string Example: search=john@example.com Search query for customer names, emails, or purchase details |
| kiosk | boolean Enable kiosk mode for simplified UI (triggers Elasticsearch) |
| dashboard | boolean Enable dashboard mode (triggers Elasticsearch) |
object (DateTimeFilterSchema) Examples: createdAt[summary]=Find records where field exists (not null)&createdAt[value]=[object Object] createdAt[summary]=Find records where field is null/missing&createdAt[value]=[object Object] createdAt[summary]=Date range filtering&createdAt[value]=[object Object] createdAt[summary]=Range using comma-separated string&createdAt[value]=[object Object] createdAt[summary]=Using period for today&createdAt[value]=[object Object] createdAt[summary]=Using period for last week&createdAt[value]=[object Object] createdAt[summary]=Exact date-time match&createdAt[value]=[object Object] createdAt[summary]=After specific date&createdAt[value]=[object Object] Filter by creation timestamp. Supports date-time filtering operations. | |
object (DateTimeFilterSchema) Examples: updatedAt[summary]=Find records where field exists (not null)&updatedAt[value]=[object Object] updatedAt[summary]=Find records where field is null/missing&updatedAt[value]=[object Object] updatedAt[summary]=Date range filtering&updatedAt[value]=[object Object] updatedAt[summary]=Range using comma-separated string&updatedAt[value]=[object Object] updatedAt[summary]=Using period for today&updatedAt[value]=[object Object] updatedAt[summary]=Using period for last week&updatedAt[value]=[object Object] updatedAt[summary]=Exact date-time match&updatedAt[value]=[object Object] updatedAt[summary]=After specific date&updatedAt[value]=[object Object] Filter by last update timestamp. Supports date-time filtering operations. | |
object Example: id[gt]=60f7b3c4e4b0a1234567890a Filter by purchase ID using MongoDB query operators | |
| sort | string Example: sort=createdAt,-updatedAt Sort field(s). Multiple fields can be comma-separated.
Prefix with |
| limit | integer [ 1 .. 100 ] Example: limit=25 Number of results per page |
| offset | integer >= 0 Number of results to skip |
| expand | Array of strings Items Enum: "items" "seller" "organizer" "travelers" "conversation" "breakdown" Example: expand=items,seller Additional resources to include in response:
|
| include | Array of strings Additional fields to include in response |
| format | string Enum: "csv" "xlsx" Example: format=csv Export format - returns job ID for async processing instead of data |
string or object Example: items_product=60f7b3c4e4b0a1234567890a Filter purchases by product (experience) ID. Filters based on the products associated with purchase items. Supports the following operators:
Values must be valid 24-character hex MongoDB ObjectIds. | |
| etl | boolean Enable ETL mode for data extraction (admin only) |
{- "data": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "object": "purchase",
- "status": "committed",
- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "currency": "USD",
- "amount": 150,
- "balance": 0,
- "seller": {
- "id": "60f7b3c4e4b0a1234567890b"
}, - "organizer": {
- "id": "60f7b3c4e4b0a1234567890c"
}, - "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T11:45:00Z",
- "items": [
- {
- "id": "60f7b3c4e4b0a1234567890d",
- "object": "scheduled_experience_purchase_item",
- "status": "confirmed",
- "amount": 150,
- "arrivalDateTime": "2023-12-15T14:00:00Z"
}
]
}
], - "paging": {
- "next": null
}
}Create a new purchase. Supports both regular purchases and partner purchases.
The system automatically detects partner purchases based on payload content.
Use the dryRun parameter to validate purchase data without persisting.
The validationLevel parameter controls validation strictness:
error: Full validationinfo: Basic validation onlywarning: Skip validationignore: No validation| dryRun | boolean Default: false Validate purchase without persisting (returns 200 instead of 201) |
| validationLevel | string Default: "ignore" Enum: "error" "info" "warning" "ignore" Level of validation to apply |
| expand | Array of strings Items Enum: "items" "seller" "organizer" "travelers" "breakdown" Example: expand=items,seller Additional resources to include in response |
| id | string or null Purchase ID (null for new purchases) |
| status | string Enum: "draft" "waitlist" "abandon" "hold" "committed" Purchase status |
| customerName required | string Name of the customer |
| customerEmail required | string <email> Email address of the customer |
| customerLocale | string Customer's preferred locale |
| customerTimezoneName | string Customer's timezone |
| phone | string Customer's phone number |
| currency | string Currency code (ISO 4217) |
| payNow | number or null <float> Deposit amount to pay now |
| referenceId | string External booking reference |
| source | string Source where purchase originated |
required | object (ObjectReference) Seller ID reference |
object (ObjectReference) Customer/organizer ID reference | |
required | Array of objects (PurchaseItemRequest) Purchase items to include |
Array of any (PurchaseLineItemRequest) Top-level line items for the purchase (payment and refund line items) | |
object (purchases_SplitPaymentPreferenceRequest) Split payment configuration | |
Array of objects (PaymentReminder) Payment reminder configuration | |
| releaseHoldAt | string <date-time> When to release hold (for draft purchases) |
object Additional metadata |
Creates a purchase for a day-scheduled experience with adult demographics
{- "lineItems": [ ],
- "items": [
- {
- "arrivalDate": "2025-09-01",
- "privacy": "public",
- "product": {
- "id": "68596b702ef9757f080a59ae"
}, - "quantity": 1,
- "lineItems": [
- {
- "object": "line_item",
- "type": "demographic",
- "quantity": 1,
- "template": {
- "id": "68592497b76cfaee140484b8"
}, - "amount": 100
}, - {
- "object": "line_item",
- "type": "demographic",
- "quantity": 0,
- "template": {
- "id": "68592497b76cfaee140484bb"
}, - "amount": 0
}, - {
- "object": "line_item",
- "type": "demographic",
- "quantity": 0,
- "template": {
- "id": "68592497b76cfaee140484be"
}, - "amount": 0
}
], - "balanceDueOffset": 0,
- "guests": [ ],
- "status": "draft",
- "object": "scheduled_experience_purchase_item",
- "guestStatus": "pending",
- "timeslot": {
- "product": "68596b702ef9757f080a59ae",
- "time": null,
- "scheduleType": "day",
- "date": "2025-09-01",
- "arrivalDatetime": "2025-09-01T00:00:00-04:00",
- "end": "2025-09-02T23:59:59-04:00",
- "privacy": "public",
- "id": "68596b702ef9757f080a59ae_2025-09-01_685bb85cc6c0e91eea92abe4",
- "capacity": {
- "open": 448,
- "max": 449
}, - "canBook": true,
- "units": [
- {
- "price": 100,
- "id": "68592497b76cfaee140484b7",
- "type": "demographic",
- "code": "adult",
- "template": {
- "id": "68592497b76cfaee140484b8"
}, - "priceType": "person"
}, - {
- "price": 12,
- "id": "68592497b76cfaee140484ba",
- "type": "demographic",
- "code": "child",
- "template": {
- "id": "68592497b76cfaee140484bb"
}, - "priceType": "person"
}, - {
- "price": 14,
- "id": "68592497b76cfaee140484bd",
- "type": "demographic",
- "code": "senior",
- "template": {
- "id": "68592497b76cfaee140484be"
}, - "priceType": "person"
}
]
}, - "purchase": {
- "id": null
}
}
], - "seller": {
- "id": "68592497b76cfaee140484b6"
}, - "splitPayment": {
- "enabled": false
}, - "currency": "USD",
- "status": "draft",
- "id": null,
- "payNow": null,
- "customerName": "John Doe",
- "customerEmail": "customer@example.com",
- "phone": ""
}{- "id": "60f7b3c4e4b0a1234567890a",
- "object": "purchase",
- "status": "committed",
- "internalStatus": "committed",
- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "customerLocale": "en-US",
- "customerTimezoneName": "America/New_York",
- "phone": "+1234567890",
- "phoneCanonical": "1234567890",
- "currency": "USD",
- "amount": 150,
- "amounts": {
- "property1": 0.1,
- "property2": 0.1
}, - "balances": {
- "property1": 0.1,
- "property2": 0.1
}, - "balance": 0,
- "payNow": 50,
- "dueNow": 50,
- "minimumDue": 25,
- "affiliatePayment": 15,
- "referenceId": "EXT-BOOKING-123",
- "source": "website",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "organizer": {
- "id": "507f1f77bcf86cd799439011"
}, - "partnerSeller": {
- "id": "507f1f77bcf86cd799439011"
}, - "partner": {
- "id": "string",
- "object": "string"
}, - "affiliate": {
- "id": "507f1f77bcf86cd799439011"
}, - "conversation": {
- "id": "507f1f77bcf86cd799439011"
}, - "waitlist": {
- "id": "507f1f77bcf86cd799439011"
}, - "travelers": [
- {
- "id": "507f1f77bcf86cd799439011"
}
], - "items": [
- {
- "id": "60f7b3c4e4b0a1234567890b",
- "object": "experience_purchase_item",
- "status": "confirmed",
- "amount": 75,
- "currency": "USD",
- "quantity": 2,
- "product": {
- "id": "507f1f77bcf86cd799439011"
}, - "productName": "City Walking Tour",
- "purchase": {
- "id": "507f1f77bcf86cd799439011"
}, - "source": "website",
- "lineItems": [
- {
- "id": "60f7b3c4e4b0a1234567890c",
- "object": "line_item",
- "type": "fee",
- "name": "Service Fee",
- "code": "SERVICE_FEE_001",
- "price": 25,
- "amount": 50,
- "quantity": 2,
- "destination": "seller",
- "visibility": "all",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "unit": {
- "id": "507f1f77bcf86cd799439011"
}, - "template": {
- "id": "507f1f77bcf86cd799439011"
}, - "meta": { }
}
], - "parentProduct": {
- "id": "string",
- "object": "string"
}, - "clientId": "client-item-abc123",
- "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T11:45:00Z",
- "pickupLocation": "Grand Canyon Visitor Center, S Entrance Rd, Grand Canyon Village, AZ 86023",
- "ticket": [
- {
- "code": "XOLA-ABC123",
- "provider": "xola",
- "createdAt": "2024-01-15T10:30:00+00:00",
- "meta": { }
}
], - "referenceId": "RESALE-REF-001",
- "deposit": {
- "enabled": true,
- "amount": 50
}
}
], - "lineItems": [
- {
- "id": "60f7b3c4e4b0a1234567890c",
- "object": "line_item",
- "type": "fee",
- "name": "Service Fee",
- "code": "SERVICE_FEE_001",
- "price": 25,
- "amount": 50,
- "quantity": 2,
- "destination": "seller",
- "visibility": "all",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "unit": {
- "id": "507f1f77bcf86cd799439011"
}, - "template": {
- "id": "507f1f77bcf86cd799439011"
}, - "meta": { }
}
], - "tags": [
- {
- "id": "string",
- "system": false,
- "type": "string"
}
], - "notes": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "text": "Customer requested window seat",
- "type": "general",
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "reminders": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "type": "follow_up",
- "title": "Follow up with customer",
- "description": "Customer asked about group discounts",
- "status": "active",
- "remindAt": "2023-12-08T10:00:00Z",
- "completed": false,
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "paymentReminders": [
- {
- "id": "60f7b3c4e4b0a1234567890d",
- "type": "invoice_traveler",
- "amount": 100,
- "dueAt": "2023-12-08T10:00:00Z",
- "sentAt": "2019-08-24T14:15:22Z",
- "status": "pending"
}
], - "splitPayment": {
- "enabled": false
}, - "trackingData": {
- "source": "string",
- "medium": "string",
- "campaign": "string",
- "referrer": "string",
- "ip": "string",
- "fbp": "string",
- "fbc": "string",
- "userAgent": "string",
- "gaClientId": "string",
- "clientIpAddress": "string"
}, - "telemetry": {
- "sessionId": "string",
- "userAgent": "string",
- "screenResolution": "string",
- "timezone": "string"
}, - "meta": { },
- "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T11:45:00Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "requiresCaptcha": false,
- "termsAgreedAt": "2023-12-07T10:25:00Z",
- "releaseHoldAt": "2023-12-07T12:00:00Z",
- "notifyAt": "2023-12-07T09:00:00Z",
- "migratedAt": "2023-12-07T08:00:00Z",
- "commissionRefundProcessedAt": "2023-12-07T16:00:00Z"
}Retrieve a specific purchase by its ID.
Special handling for ticket exports: When context=tickets and format is specified,
returns a job ID for asynchronous ticket generation instead of purchase data.
Response context varies based on user type:
Conditional Fields:
minimumDue: Included in the response when the purchase is in draft status and has a traveler source.| id required | string Example: 60f7b3c4e4b0a1234567890a Purchase ID |
| expand | Array of strings Items Enum: "items" "seller" "organizer" "travelers" "conversation" "breakdown" Example: expand=items,seller Additional resources to include in response |
| include | Array of strings Additional fields to include in response |
| context | string Value: "tickets" Special context for different response formats |
| format | string Enum: "pdf" "csv" Export format for tickets (requires context=tickets) |
{- "id": "60f7b3c4e4b0a1234567890a",
- "object": "purchase",
- "status": "committed",
- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "phone": "+1234567890",
- "currency": "USD",
- "amount": 150,
- "balance": 0,
- "payNow": 50,
- "seller": {
- "id": "60f7b3c4e4b0a1234567890b"
}, - "organizer": {
- "id": "60f7b3c4e4b0a1234567890c"
}, - "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T11:45:00Z",
- "items": [
- {
- "id": "60f7b3c4e4b0a1234567890d",
- "object": "scheduled_experience_purchase_item",
- "status": "confirmed",
- "amount": 150,
- "productName": "City Walking Tour",
- "arrivalDateTime": "2023-12-15T14:00:00Z",
- "lineItems": [
- {
- "id": "60f7b3c4e4b0a123456789a0",
- "object": "line_item",
- "type": "demographic",
- "name": "Adult",
- "quantity": 2,
- "price": 75,
- "amount": 150
}
]
}
], - "lineItems": [
- {
- "id": "60f7b3c4e4b0a123456789a1",
- "object": "line_item",
- "type": "payment",
- "name": "Credit Card Payment",
- "amount": 50,
- "destination": "seller"
}
]
}Update an existing purchase using partial data (PATCH semantics).
Supports two update modes:
Standard PATCH with 'items' property: Update purchase properties and items directly (customerName, status, guests, etc.)
parentProduct: null on an item to split it out of its parent package.
The Package tag is removed and Package → Split / Multi-item tags are added.
Use _retainDiscount: true at the top level to keep the package discount.items[].status: canceled.
If the experience cancellation policy has multiple refund methods configured (paymentMethods), also set
items[].refundMethod to either cc (credit card refund) or store_credit. This field is conditionally
required when multiple refund methods are available.Operations-based PATCH with 'ops' property: Use the ops array to perform specific operations
addLineItem, addLineItemWithPayment, addCode, removeLineItemaddFulfillmentUnit, fulfillFulfillmentUnit, removeFulfillmentUnit, returnFulfillmentUnitLine item operations:
addLineItem: Add a line item to a purchase or specific purchase itemaddLineItemWithPayment: Add a line item with associated payment processingaddCode: Apply discount codes, coupons, or other promotional codesremoveLineItem: Remove existing line items (limited to specific types)Ware fulfillment unit operations (path: /items/{itemId}/fulfillmentUnits):
addFulfillmentUnit: Add fulfillment units to a ware purchase item. Requires unit.id (must be a ware-type unit whose template is purchasable for the ware) and quantity.fulfillFulfillmentUnit: Mark pending fulfillment units as fulfilled. Requires unit.id and quantity.removeFulfillmentUnit: Remove pending (unfulfilled) fulfillment units. Requires unit.id and quantity.returnFulfillmentUnit: Return or damage fulfilled units. Requires unit.id and quantity. Use _damaged: true to mark as damaged.Important: Ware line items (type
ware) cannot be created, updated, or modified via the standardlineItemsproperty oraddLineItem/removeLineItemops. All modifications to ware quantities must be performed via thefulfillmentUnitsops path.
Path format for operations:
/lineItems for purchase-level operations/items/{itemId}/lineItems for item-specific line item operations/items/{itemId}/fulfillmentUnits for ware fulfillment unit operationsError strategy:
Set errorStrategy to continue_on_failure to process remaining operations even when one fails.
Automatically acquires a lock on the purchase during update to prevent concurrent modifications.
Use dryRun parameter to validate changes without persisting them.
The validationLevel parameter controls validation strictness during updates.
| id required | string Example: 60f7b3c4e4b0a1234567890a Purchase ID |
| dryRun | boolean Default: false Validate update without persisting changes |
| validationLevel | string Default: "ignore" Enum: "error" "info" "warning" "ignore" Level of validation to apply |
| expand | Array of strings Items Enum: "items" "seller" "organizer" "travelers" "breakdown" Additional resources to include in response |
| customerName | string |
| customerEmail | string <email> |
| phone | string |
| status | string Enum: "draft" "waitlist" "abandon" "hold" "committed" |
| payNow | number <float> |
Array of objects Purchase items to update | |
Array of objects Line items to update | |
| _retainDiscount | boolean Default: false When performing a package split operation (setting |
| _partialRefund | number <float> Partial refund amount for guest change operations |
| _partialRefundLabel | string Custom label for the adjustment line item created during partial refund operations. Defaults to "Change guests" if not provided. The label appears in the line item name as "{label} (partial refund)" or "{label} (no refund)". |
object Additional metadata to update | |
Array of any (PatchOperation) non-empty Array of operations to perform on the purchase. Use this when adding/removing line items, applying codes, or managing fulfillment units for ware purchases. | |
| errorStrategy | string Default: "stop_on_failure" Enum: "stop_on_failure" "continue_on_failure" Controls how errors are handled when processing multiple operations:
|
Updates purchase items with new guest information and ticket codes
{- "items": [
- {
- "id": "68b1a8a99e5927ad94049442",
- "guests": [
- {
- "name": "Seniors #1",
- "unit": {
- "id": "68592497b76cfaee140484bd"
}, - "source": "default"
}, - {
- "name": "Children #2",
- "unit": {
- "id": "68592497b76cfaee140484ba"
}, - "source": "default"
}, - {
- "id": "68b1a8a99e5927ad94049407",
- "name": "Tester18 Test",
- "formResponse": {
- "id": "68b1a8aad8bbf7d46706d7d5",
- "name": "Tester18 Test",
- "fields": [
- {
- "type": "textarea",
- "label": "Medical conditions",
- "value": "",
- "roster": false,
- "displayStep": null
}
], - "source": "xola"
}, - "unit": {
- "id": "68592497b76cfaee140484b7"
}, - "template": {
- "id": "68592497b76cfaee140484b8"
}, - "ticketCode": "c628wuxydpck",
- "primary": true,
- "guestStatus": "pending",
- "checkIns": [ ]
}, - {
- "id": "68b1a8ac3754c131850053a5",
- "name": "Children #1",
- "unit": {
- "id": "68592497b76cfaee140484ba"
}, - "template": {
- "id": "68592497b76cfaee140484bb"
}, - "ticketCode": "5rfjw7o3ybgg",
- "primary": false,
- "guestStatus": "pending",
- "checkIns": [ ]
}
]
}
]
}{- "id": "60f7b3c4e4b0a1234567890a",
- "object": "purchase",
- "status": "committed",
- "customerName": "John Updated Doe",
- "customerEmail": "john.updated@example.com",
- "phone": "+1987654321",
- "currency": "USD",
- "items": [ ],
- "amount": 155,
- "balance": 0,
- "updatedAt": "2023-12-07T12:00:00Z"
}Create or completely replace a draft purchase (PUT semantics).
This endpoint is specifically for draft purchases only. For updating other purchase statuses, use PATCH /api/purchases/{id} instead.
If the purchase doesn't exist, creates a new one. If it exists and is in draft status, replaces it entirely with the provided data.
Automatically acquires a lock during operation to prevent concurrent modifications.
| id required | string Example: 60f7b3c4e4b0a1234567890a Purchase ID |
| validationLevel | string Default: "ignore" Enum: "error" "info" "warning" "ignore" Level of validation to apply |
| expand | Array of strings Items Enum: "items" "seller" "organizer" "travelers" "breakdown" Additional resources to include in response |
| id | string or null Purchase ID (null for new purchases) |
| status | string Enum: "draft" "waitlist" "abandon" "hold" "committed" Purchase status |
| customerName required | string Name of the customer |
| customerEmail required | string <email> Email address of the customer |
| customerLocale | string Customer's preferred locale |
| customerTimezoneName | string Customer's timezone |
| phone | string Customer's phone number |
| currency | string Currency code (ISO 4217) |
| payNow | number or null <float> Deposit amount to pay now |
| referenceId | string External booking reference |
| source | string Source where purchase originated |
required | object (ObjectReference) Seller ID reference |
object (ObjectReference) Customer/organizer ID reference | |
required | Array of objects (PurchaseItemRequest) Purchase items to include |
Array of any (PurchaseLineItemRequest) Top-level line items for the purchase (payment and refund line items) | |
object (purchases_SplitPaymentPreferenceRequest) Split payment configuration | |
Array of objects (PaymentReminder) Payment reminder configuration | |
| releaseHoldAt | string <date-time> When to release hold (for draft purchases) |
object Additional metadata |
Replace draft purchase with complete experience booking including multiple guests
{- "lineItems": [ ],
- "items": [
- {
- "arrivalDate": "2025-09-01",
- "arrivalTime": 2000,
- "privacy": "public",
- "product": {
- "id": "68a9d4b1564b84624f08b304"
}, - "quantity": 2,
- "lineItems": [
- {
- "object": "line_item",
- "type": "demographic",
- "quantity": 2,
- "template": {
- "id": "68592497b76cfaee140484b8"
}, - "amount": 200
}, - {
- "object": "line_item",
- "type": "demographic",
- "quantity": 0,
- "template": {
- "id": "68592497b76cfaee140484bb"
}, - "amount": 0
}
], - "balanceDueOffset": 0,
- "guests": [
- {
- "id": "68b5b603da7ed5c60b0d0d77",
- "name": "sachin",
- "unit": {
- "id": "68592497b76cfaee140484b7"
}, - "template": {
- "id": "68592497b76cfaee140484b8"
}, - "primary": true,
- "guestStatus": "pending",
- "checkInCount": 0,
- "checkIns": [ ]
}, - {
- "id": "68b5b611a11f3ba68604b3f1",
- "name": "Adults #2",
- "unit": {
- "id": "68592497b76cfaee140484b7"
}, - "template": {
- "id": "68592497b76cfaee140484b8"
}, - "primary": false,
- "guestStatus": "pending",
- "checkInCount": 0,
- "checkIns": [ ]
}
], - "status": "draft",
- "object": "scheduled_experience_purchase_item",
- "guestStatus": "pending",
- "timeslot": {
- "product": "68a9d4b1564b84624f08b304",
- "time": 2000,
- "scheduleType": "time",
- "date": "2025-09-01",
- "arrivalDatetime": "2025-09-01T20:00:00-04:00",
- "end": "2025-09-01T20:59:59-04:00",
- "privacy": "public",
- "id": "68a9d4b1564b84624f08b304_2025-09-01_2000_68a9d4f4346644ef904b1518",
- "capacity": {
- "open": 5,
- "max": 5
}, - "canBook": true,
- "units": [
- {
- "price": 50,
- "id": "68592497b76cfaee140484ba",
- "type": "demographic",
- "code": "child",
- "template": {
- "id": "68592497b76cfaee140484bb"
}, - "priceType": "person"
}, - {
- "price": 100,
- "id": "68592497b76cfaee140484b7",
- "type": "demographic",
- "code": "adult",
- "template": {
- "id": "68592497b76cfaee140484b8"
}, - "priceType": "person"
}
]
}, - "id": "68b5b603da7ed5c60b0d0dab",
- "purchase": {
- "id": "68b5b603da7ed5c60b0d0daa"
}
}
], - "seller": {
- "id": "68592497b76cfaee140484b6"
}, - "splitPayment": {
- "enabled": false
}, - "paymentReminders": [ ],
- "currency": "USD",
- "status": "draft",
- "id": "68b5b603da7ed5c60b0d0daa",
- "payNow": null,
- "customerEmail": "sachin@xola.com",
- "customerName": "sachin",
- "phone": ""
}{- "id": "60f7b3c4e4b0a1234567890a",
- "object": "purchase",
- "status": "draft",
- "customerName": "Jane Smith",
- "customerEmail": "jane.smith@example.com",
- "currency": "USD",
- "amount": 100,
- "payNow": 100,
- "items": [ ],
- "seller": {
- "id": "60f7b3c4e4b0a1234567890b"
}, - "organizer": {
- "id": "60f7b3c4e4b0a123456789a0"
}, - "updatedAt": "2023-12-07T12:30:00Z"
}Release or rollback a purchase that is in HOLD status.
This operation is only allowed for purchases with STATUS_HOLD. It effectively cancels the purchase and releases any inventory holds or temporary reservations.
Automatically acquires a lock during operation to prevent concurrent modifications.
| id required | string Example: 60f7b3c4e4b0a1234567890a Purchase ID |
{- "error": {
- "code": "status_not_hold",
- "message": "Purchase not in HOLD state"
}
}Create a payment or refund line item on a purchase. This endpoint is used for post-booking payment collection and refund processing.
Supports two line item types based on the object field:
payment_line_item: Record a payment (amount should be negative, representing money collected)refund_line_item: Record a refundUse dryRun=true to preview changes without persisting them.
Use force=true to bypass balance validation checks. When force is not set or false:
Authorization:
CREATE_PURCHASE_LINE_ITEM permission on the purchase.| id required | string Example: 60f7b3c4e4b0a1234567890a Purchase ID |
| dryRun | boolean Default: false Preview changes without persisting (returns 200 instead of 201) |
| force | boolean Default: false Bypass balance validation checks. When true:
|
| id | string Line item ID (for updates) |
| object required | string Payment line item object type Value: "payment_line_item" |
| type required | string Payment line item type Value: "payment" |
| code | string Coupon, gift, store credit, affiliate, or voucher code to apply as the payment.
Required when |
required | object Payment method information |
| status | string Default: "pending" Enum: "pending" "complete" "failed" "canceled" Payment status |
| amount required | number <float> Payment amount (negative for payments made) |
| includeInAmount | boolean Default: true Whether to include this line item in the total amount |
{- "object": "payment_line_item",
- "type": "payment",
- "amount": -50,
- "payment": {
- "method": "cc",
- "card": "693a238dc8ecc07b930fcb8d"
}
}{- "id": "60f7b3c4e4b0a1234567890c",
- "object": "line_item",
- "type": "fee",
- "name": "Service Fee",
- "code": "SERVICE_FEE_001",
- "price": 25,
- "amount": 50,
- "quantity": 2,
- "destination": "seller",
- "visibility": "all",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "unit": {
- "id": "507f1f77bcf86cd799439011"
}, - "template": {
- "id": "507f1f77bcf86cd799439011"
}, - "meta": { }
}Update an existing payment line item on a purchase. Only payment line items can be updated via this endpoint.
Use dryRun=true to preview changes without persisting them.
Authorization:
EDIT_PURCHASE_LINE_ITEM permission on the purchase.| id required | string Example: 60f7b3c4e4b0a1234567890a Purchase ID |
| lineItemId required | string Example: 60f7b3c4e4b0a123456789a1 Line item ID |
| dryRun | boolean Default: false Preview changes without persisting |
| id | string Line item ID (for updates) |
| object required | string Payment line item object type Value: "payment_line_item" |
| type required | string Payment line item type Value: "payment" |
| code | string Coupon, gift, store credit, affiliate, or voucher code to apply as the payment.
Required when |
required | object Payment method information |
| status | string Default: "pending" Enum: "pending" "complete" "failed" "canceled" Payment status |
| amount required | number <float> Payment amount (negative for payments made) |
| includeInAmount | boolean Default: true Whether to include this line item in the total amount |
{- "id": "68b81b65f672ff33c205606d",
- "object": "payment_line_item",
- "type": "payment",
- "code": "DISCOUNT20",
- "payment": {
- "method": "cc",
- "card": "693a238dc8ecc07b930fcb8d"
}, - "status": "complete",
- "amount": -262.71,
- "includeInAmount": true
}{- "id": "60f7b3c4e4b0a1234567890c",
- "object": "line_item",
- "type": "fee",
- "name": "Service Fee",
- "code": "SERVICE_FEE_001",
- "price": 25,
- "amount": 50,
- "quantity": 2,
- "destination": "seller",
- "visibility": "all",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "unit": {
- "id": "507f1f77bcf86cd799439011"
}, - "template": {
- "id": "507f1f77bcf86cd799439011"
}, - "meta": { }
}Delete a payment or refund line item from a purchase.
Use dryRun=true to preview changes without persisting them.
Authorization:
DELETE_PURCHASE_LINE_ITEM permission on the purchase.| id required | string Example: 60f7b3c4e4b0a1234567890a Purchase ID |
| lineItemId required | string Example: 60f7b3c4e4b0a123456789a1 Line item ID |
| dryRun | boolean Default: false Preview changes without persisting |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Retrieve remote card summaries associated with a purchase.
Remote cards are external payment methods or cards associated with the purchase, typically from third-party payment processors or gift card systems.
| id required | string Example: 60f7b3c4e4b0a1234567890a Purchase ID |
[- {
- "id": "gc_1234567890abcdef",
- "type": "gift_card",
- "balance": 50,
- "currency": "USD",
- "lastFour": "5678",
- "expiresAt": "2024-12-31T23:59:59Z"
}, - {
- "id": "sc_abcdef1234567890",
- "type": "store_credit",
- "balance": 25.5,
- "currency": "USD",
- "lastFour": "0000",
- "expiresAt": null
}
]Creates an asynchronous job to collect dispute evidence for a purchase.
This endpoint initiates the collection of all relevant evidence (communications, emails, waivers, etc.) for disputes associated with the purchase. The evidence is compiled into a zip file and uploaded to S3.
Returns a 202 Accepted response with the job object. Poll the job endpoint (GET /jobs/{id})
to track progress. When the job completes, the response will include the url to download
the evidence zip file.
Authorization:
VIEW_PURCHASE_DISPUTE_EVIDENCE permission on the purchase.| id required | string Example: 60f7b3c4e4b0a1234567890a Purchase ID |
{- "id": "507f1f77bcf86cd799439011",
- "type": "exportDisputeEvidence",
- "status": "pending",
- "progress": 0,
- "url": null,
- "filename": null,
- "purchase": "60f7b3c4e4b0a1234567890a",
- "createdAt": "2024-01-15T10:30:00Z",
- "updatedAt": "2024-01-15T10:30:00Z"
}Redirects to the appropriate checkout URL for paying an invoice.
This endpoint determines whether to use v1 or x2 checkout based on the seller's configuration settings and returns a 302 redirect response to the correct checkout page.
The response is a 302 redirect to the checkout URL where the customer can complete the invoice payment. The specific checkout version (v1 or x2) is determined automatically based on the seller's settings.
| id required | string Example: 60f7b3c4e4b0a1234567890a Purchase ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Add a note to a purchase (order).
Requires the CREATE_PURCHASE_NOTES permission on the purchase.
| id required | string Example: 507f1f77bcf86cd799439011 Purchase ID |
| text required | string Note content |
{- "text": "Customer paid remaining balance in cash"
}{- "id": "507f1f77bcf86cd799439011",
- "text": "Customer requested a window seat",
- "created": "2019-08-24T14:15:22Z",
- "updated": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": false
}Update the text of an existing purchase note.
Requires the EDIT_PURCHASE_NOTES permission on the purchase.
| id required | string Example: 507f1f77bcf86cd799439011 Purchase ID |
| noteId required | string Example: 507f1f77bcf86cd799439013 Note ID |
| text required | string Updated note content |
| system | boolean Whether the note is a system-generated note. |
{- "text": "Customer paid remaining balance in cash (receipt #4821)"
}{- "id": "507f1f77bcf86cd799439011",
- "text": "Customer requested a window seat",
- "created": "2019-08-24T14:15:22Z",
- "updated": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": false
}Delete a purchase note.
Requires the DELETE_PURCHASE_NOTES permission on the purchase.
| id required | string Example: 507f1f77bcf86cd799439011 Purchase ID |
| noteId required | string Example: 507f1f77bcf86cd799439013 Note ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Submit a review for a specific item within a purchase. The seller and experience
are resolved from the purchase item; when the request is made by an authenticated
traveler, that traveler is recorded as the reviewer.
Rating fields (responsible, safe, unique, value, rating) are optional and
are typically supplied only for traveler reviews. redirectedTo is set when smart
review redirection applies.
Permission required: CREATE_PURCHASE_REVIEW
| id required | string Example: 64f7b3c4e4b0a1234567890c Purchase ID |
| itemId required | string Example: 64f7b3c4e4b0a1234567890a Purchase item ID within the purchase |
| name required | string Name of the reviewer. Required. |
string <email> Email of the reviewer | |
| review | string Free-text review comment on the experience |
| responsible | integer Traveler rating for how responsible the operator was |
| safe | integer Traveler rating for how safe the experience felt |
| unique | integer Traveler rating for how unique the experience was |
| value | integer Traveler rating for value for money |
| rating | number <float> Overall rating given by the traveler |
| redirectedTo | string Enum: "tripAdvisor" "yelp" "googlePlus" External platform the traveler was redirected to when smart review is enabled |
| feedback | string Additional free-text feedback on the experience |
{- "name": "John Doe",
- "email": "johndoe@example.com",
- "review": "Fantastic tour, would book again!",
- "responsible": 5,
- "safe": 5,
- "unique": 4,
- "value": 4,
- "rating": 4.5
}{- "id": "60f7d1234567890abcdef123",
- "name": "John Doe",
- "email": "johndoe@example.com",
- "review": "Fantastic tour, would book again!",
- "responsible": 5,
- "safe": 5,
- "unique": 4,
- "value": 4,
- "rating": 4.5,
- "redirectedTo": "tripAdvisor",
- "feedback": "The guide was very knowledgeable.",
- "experience": {
- "id": "507f1f77bcf86cd799439011"
}, - "traveler": {
- "id": "507f1f77bcf86cd799439011"
}, - "seller": {
- "id": "507f1f77bcf86cd799439011"
}
}Submit a review by referencing the purchase and experience directly. The matching
purchase item is resolved from the purchase and experience, then the review is created
the same way as POST /purchases/{id}/items/{itemId}/review.
Permission required: ROLE_USER
| name required | string Name of the reviewer. Required. |
string <email> Email of the reviewer | |
| review | string Free-text review comment on the experience |
| responsible | integer Traveler rating for how responsible the operator was |
| safe | integer Traveler rating for how safe the experience felt |
| unique | integer Traveler rating for how unique the experience was |
| value | integer Traveler rating for value for money |
| rating | number <float> Overall rating given by the traveler |
| redirectedTo | string Enum: "tripAdvisor" "yelp" "googlePlus" External platform the traveler was redirected to when smart review is enabled |
| feedback | string Additional free-text feedback on the experience |
required | object (ObjectReference) A reference to another object containing only its ID. Use the |
required | object (ObjectReference) A reference to another object containing only its ID. Use the |
{- "purchase": {
- "id": "64f7b3c4e4b0a1234567890c"
}, - "experience": {
- "id": "64f7b3c4e4b0a1234567890b"
}, - "name": "John Doe",
- "review": "Fantastic tour, would book again!",
- "rating": 4.5
}{- "id": "60f7d1234567890abcdef123",
- "name": "John Doe",
- "email": "johndoe@example.com",
- "review": "Fantastic tour, would book again!",
- "responsible": 5,
- "safe": 5,
- "unique": 4,
- "value": 4,
- "rating": 4.5,
- "redirectedTo": "tripAdvisor",
- "feedback": "The guide was very knowledgeable.",
- "experience": {
- "id": "507f1f77bcf86cd799439011"
}, - "traveler": {
- "id": "507f1f77bcf86cd799439011"
}, - "seller": {
- "id": "507f1f77bcf86cd799439011"
}
}Retrieve the questionnaire that applies to a specific item within a purchase. This is useful for purchases with multiple items that may have different questionnaires.
| id required | string Example: 507f191e810c19729de860ec The unique identifier of the purchase |
| itemId required | string Example: 507f191e810c19729de860ed The unique identifier of the purchase item |
{- "id": "507f1f77bcf86cd799439011",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "product": {
- "id": "507f1f77bcf86cd799439011"
}, - "productType": "experience",
- "organizerOnly": true,
- "fields": [
- {
- "label": "Full Name",
- "description": "Please enter your full legal name as it appears on your ID",
- "type": "text",
- "width": 3,
- "suffix": "lbs",
- "help": "This information helps us provide proper equipment",
- "required": true,
- "roster": false,
- "readonly": false,
- "organizerOnly": true,
- "displayStep": "afterPayment",
- "visibility": "all",
- "seq": 1,
- "options": [
- "None",
- "Vegetarian",
- "Vegan",
- "Gluten-free"
], - "id": "60f1f7bc5f6d2a3b4c8e9d12"
}
], - "optionalSourcesList": [
- "direct",
- "partner"
], - "deletedAt": "2019-08-24T14:15:22Z"
}Upload one or more photos for photo-type fields in a purchase item's form response.
Photos are uploaded via multipart form data with a photos key containing an associative array
where each key is the field label and the value is the photo file.
Supported image types: JPEG, PNG, GIF, WebP (max 5MB per file).
If a photo field response already exists for the given label, the photo will be replaced. Label matching is case-insensitive.
Permission: Requires EDIT_PURCHASE_FORM_RESPONSE permission.
Validation Errors:
missing_photos: No photos were provided in the requestno_form_for_product: No questionnaire is configured for this purchase item's productunknown_label: The provided label does not match any photo field in the formfile_too_large: Photo file exceeds maximum size of 5MBinvalid_file_extension: Only JPEG, PNG, GIF, and WebP files are allowedinvalid_image_type: Only JPEG, PNG, GIF, and WebP images are allowedmime_type_mismatch: File extension does not match the image typeupload_failed: File storage upload failed| id required | string Example: 507f191e810c19729de860ec The unique identifier of the purchase |
| purchaseItemId required | string Example: 507f191e810c19729de860ed The unique identifier of the purchase item |
required | object An associative array of photo files keyed by field label. Each key should match the label of a photo-type field in the form. |
{ "photos": { "ID Photo": "(binary file data)" } }
{- "id": "507f191e810c19729de860ee",
- "name": "John Doe",
- "fields": [
- {
- "id": "60f1f7bc5f6d2a3b4c8e9d12",
- "type": "photo",
- "label": "ID Photo",
- "value": "questionnaire/photos/507f191e810c19729de860ec/507f191e810c19729de860ed/60f1f7bc5f6d2a3b4c8e9d12.jpg",
- "roster": false
}
]
}Retrieve an uploaded photo for a specific photo-type field in a purchase item's form response. Returns the image binary with appropriate Content-Type and Content-Disposition headers.
Label matching is case-insensitive.
Permission: Requires EDIT_PURCHASE_FORM_RESPONSE permission.
Returns 404 if the purchase item, form response, or photo file is not found.
Returns a validation error with reason invalid_type if the field exists but is not a photo field.
| id required | string Example: 507f191e810c19729de860ec The unique identifier of the purchase |
| purchaseItemId required | string Example: 507f191e810c19729de860ed The unique identifier of the purchase item |
| fieldLabel required | string Example: ID Photo The label of the photo field to retrieve (case-insensitive) |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}A PurchaseItem represents an individual reservation within a booking (a Purchase). A single Purchase can contain multiple PurchaseItems. Each PurchaseItem carries its own reservation-related line items (demographics, add-ons, taxes, discounts), so pricing can be calculated per reservation and then rolled up to the purchase total.
Retrieve a paginated list of purchase items. Supports filtering by various criteria and export functionality.
Supports export functionality - include a format parameter to receive a job ID for asynchronous processing.
| seller required | string Example: seller=60f7b3c4e4b0a1234567890a Filter purchase items by seller ID (required for exports) |
| product | string Example: product=64f7b3c4e4b0a1234567890b Filter purchase items by product ID |
| arrivalDate | string <date> Example: arrivalDate=2024-07-01 Filter purchase items by arrival date (YYYY-MM-DD) |
| event | string Example: event=64f7b3c4e4b0a1234567890c Filter purchase items by event ID |
| format | string Enum: "csv" "xlsx" Example: format=csv Export format - when provided, returns a job ID for async processing |
| limit | integer [ 1 .. 100 ] Default: 20 Example: limit=20 Maximum number of items to return per page |
| offset | integer >= 0 Default: 0 Number of items to skip for pagination |
{- "data": [
- {
- "id": "64f7b3c4e4b0a1234567890a",
- "object": "experience_purchase_item",
- "status": "confirmed",
- "amount": 150,
- "currency": "USD",
- "quantity": 2,
- "product": {
- "id": "64f7b3c4e4b0a1234567890b"
}, - "purchase": {
- "id": "64f7b3c4e4b0a1234567890c"
}, - "lineItems": [ ],
- "createdAt": "2024-01-15T10:30:00Z",
- "updatedAt": "2024-01-15T10:30:00Z"
}
], - "paging": {
- "next": null
}
}Retrieve a specific purchase item by its ID. Supports expanding related objects.
Access control:
| id required | string Example: 64f7b3c4e4b0a1234567890a Purchase item ID |
| expand | Array of strings Items Enum: "purchase" "product" "traveler" "schedule" Example: expand=purchase,product Comma-separated list of related objects to expand |
{- "id": "64f7b3c4e4b0a1234567890a",
- "object": "experience_purchase_item",
- "status": "confirmed",
- "amount": 150,
- "currency": "USD",
- "quantity": 2,
- "product": {
- "id": "64f7b3c4e4b0a1234567890b"
}, - "purchase": {
- "id": "64f7b3c4e4b0a1234567890c"
}, - "lineItems": [
- {
- "id": "64f7b3c4e4b0a1234567890d",
- "object": "line_item",
- "type": "demographic",
- "amount": 75,
- "name": "Adult",
- "quantity": 2
}
], - "createdAt": "2024-01-15T10:30:00Z",
- "updatedAt": "2024-01-15T10:30:00Z"
}Add a line item (e.g., discount, fee, adjustment) to a specific purchase item within a purchase.
Common line item types:
adjustment: Manual price adjustmentdiscount: Discount applicationfee: Additional feetax: Tax calculationImportant: Line items of type
wareare not supported via this endpoint. Ware quantities are managed exclusively through thePATCH /purchases/{id}endpoint using theops fulfillmentUnitspath with operations such asaddFulfillmentUnitandremoveFulfillmentUnit.
Use dryRun=true to preview changes without persisting them.
| id required | string Example: 64f7b3c4e4b0a1234567890c Purchase ID |
| itemId required | string Example: 64f7b3c4e4b0a1234567890a Purchase item ID within the purchase |
| dryRun | boolean Default: false Preview changes without persisting (returns 200 instead of 201) |
| object required | string Standard line item object type Value: "line_item" |
| type required | string Enum: "tax" "fee" "discount" "demographic" "merchandise" "equipment" "service" "gift" "pickup" "membership" "adjustment" "feeable_taxable_adjustment" Type of line item |
required | object Line item template reference |
| quantity | integer or null Quantity (null for non-unit-based items like fees/taxes) |
| price | number or null <float> Price per unit (null for fixed amount items), use this only for taxed_adjustment and adjustment type lineItems |
| amount required | number <float> Total amount for this line item, use this only for gift type lineItems |
| includeInAmount | boolean Default: true Whether to include this line item in the total amount, use this only for tax and fee type lineItems |
| code | string Line item code |
| destination | string Enum: "seller" "xola" "affiliate" "xola_partner" Where the line item amount is allocated |
{- "object": "line_item",
- "type": "fee",
- "amount": 30,
- "quantity": 1,
- "template": {
- "id": "68592498b76cfaee14048573"
}
}{- "id": "64f7b3c4e4b0a1234567890e",
- "object": "line_item",
- "type": "fee",
- "amount": 30,
- "name": "Additional Fee",
- "quantity": 1
}Remove or void a specific line item from a purchase item. This creates a voiding line item rather than physically deleting the record for audit trail purposes.
Use dryRun=true to preview changes without persisting them.
Note: Line items that are already voided cannot be voided again.
| id required | string Example: 64f7b3c4e4b0a1234567890c Purchase ID |
| itemId required | string Example: 64f7b3c4e4b0a1234567890a Purchase item ID within the purchase |
| lineItemId required | string Example: 64f7b3c4e4b0a1234567890e Line item ID to delete/void |
| dryRun | boolean Default: false Preview changes without persisting |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Redirects to the appropriate checkout URL for paying a gratuity on a purchase item.
This endpoint determines whether to use v1 or x2 checkout based on the seller's configuration settings and returns a 302 redirect response to the correct checkout page where the customer can complete the gratuity payment.
| id required | string Example: 60f7b3c4e4b0a1234567890a Purchase ID |
| itemId required | string Example: 60f7b3c4e4b0a1234567890b Purchase item ID within the purchase |
| algorithm | string Example: algorithm=percent Gratuity calculation algorithm (e.g., "percent", "fixed") |
| amount | string Example: amount=18 Gratuity amount (interpretation depends on algorithm) |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Purchase rules are the driving mechanism for performing all pricing-based calculations on a purchase. A purchase rule is, simply put, a bundling of a filter and a set of actions. If the filter conditions pass for the resource the rule is acting on, the rule performs its list of actions on that same resource. The only actions a purchase rule can perform are to insert, update, or remove line items.
Most rules a seller defines operate on a PurchaseItem (experience pricing, taxes, discounts). A few Xola-defined rules operate at the Purchase level (partner fees, processing fees). These are represented by two kinds of rule: one operates on a purchase, and one operates on an item — otherwise they look exactly the same.
field and an expected operand); a multiple rule filter combines several conditions with the logical operators AND and OR.lineItems field — it can only add or modify line items, and within a line item it can only modify one of price, quantity, amount, or multiplier. The main action types are insert, update, upsert, and copy. Each action uses a modifier (which field to change, how, and by what value) and an aggregator (which computes that value from the purchase) to determine the change.Retrieve a paginated list of purchase rules
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
| active | boolean Filter by active status |
| required | boolean Filter by required status |
| system | boolean Filter by system status |
| object | string Enum: "purchase_rule" "purchase_item_rule" Filter by rule type |
{- "data": [
- {
- "name": "string",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": true,
- "required": true,
- "sequence": 0,
- "processActionsForIgnoredValidations": true,
- "shouldCheckFieldValueForIgnoredValidations": true,
- "tags": [
- {
- "id": "string",
- "system": false,
- "type": "string"
}
], - "meta": { },
- "id": "string",
- "object": "purchase_rule",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "deletedAt": "2019-08-24T14:15:22Z",
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "filter": {
- "id": "string",
- "object": "all_filter",
- "operator": "string",
- "errorCode": "string",
- "errorMessage": "string",
- "validationLevel": "ignore",
- "parameterizedErrorMessage": "string",
- "field": "string",
- "operand": [ ],
- "aggregator": {
- "id": "string",
- "object": "string",
- "operator": "string"
}, - "operandAggregator": {
- "id": "string",
- "object": "string",
- "operator": "string"
}
}, - "actions": [
- {
- "_remove": true,
- "id": "string",
- "object": "copy_line_item_action",
- "template": {
- "id": "string",
- "object": "line_item_template",
- "name": "string",
- "description": "string",
- "type": "string",
- "amount": 0.1,
- "amountType": "string"
}, - "shortcut": { },
- "modifiers": [
- {
- "id": "string",
- "field": "string",
- "operation": "set",
- "aggregator": {
- "id": "string",
- "object": "bxgy_discount_aggregator",
- "operator": "string",
- "operand": null
}
}
]
}
]
}
], - "paging": {
- "next": "string",
- "_es": true
}
}Create a new purchase rule with filters and actions
| name required | string Name of the purchase rule |
required | object (ObjectReference) Seller this rule belongs to |
| system | boolean Whether this is a system purchase rule |
| required | boolean If set to true, this rule has to pass for the purchase to be created |
| sequence | integer The sequence in which this rule should apply |
| processActionsForIgnoredValidations | boolean Indicates if the action can still be processed if this rule validation fails |
| shouldCheckFieldValueForIgnoredValidations | boolean Indicates if a more granular error compare should be performed for ignored errors |
Array of objects Tags associated with this rule | |
object Additional metadata for the rule | |
| object required | string Must be purchase_item_rule for demographic pricing Value: "purchase_item_rule" |
required | Array of objects (DemographicPricingAction) List of demographic pricing actions for different templates |
{- "name": "string",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": true,
- "required": true,
- "sequence": 0,
- "processActionsForIgnoredValidations": true,
- "shouldCheckFieldValueForIgnoredValidations": true,
- "tags": [
- {
- "id": "public",
- "system": false
}, - {
- "id": "per_person",
- "system": false
}, - {
- "id": "flat",
- "system": false
}
], - "meta": { },
- "object": "purchase_item_rule",
- "actions": [
- {
- "id": "string",
- "object": "update_line_item_action",
- "template": {
- "id": "507f1f77bcf86cd799439011",
- "object": "line_item_template",
- "name": "string",
- "description": "string",
- "type": "string",
- "amount": 0.1,
- "amountType": "string"
}, - "shortcut": { },
- "modifiers": [
- {
- "id": "string",
- "field": "price",
- "operation": "set",
- "aggregator": {
- "id": "string",
- "object": "return_value_aggregator",
- "operator": "string",
- "operand": null
}
}
], - "filter": {
- "id": "string",
- "object": "equals_filter",
- "operator": "string",
- "errorCode": "string",
- "errorMessage": "string",
- "validationLevel": "ignore",
- "parameterizedErrorMessage": "string",
- "field": "template.id",
- "operand": "string",
- "aggregator": {
- "id": "string",
- "object": "string",
- "operator": "string"
}, - "operandAggregator": {
- "id": "string",
- "object": "string",
- "operator": "string"
}
}
}
]
}{- "name": "string",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": true,
- "required": true,
- "sequence": 0,
- "processActionsForIgnoredValidations": true,
- "shouldCheckFieldValueForIgnoredValidations": true,
- "tags": [
- {
- "id": "string",
- "system": false,
- "type": "string"
}
], - "meta": { },
- "id": "string",
- "object": "purchase_rule",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "deletedAt": "2019-08-24T14:15:22Z",
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "filter": {
- "id": "string",
- "object": "all_filter",
- "operator": "string",
- "errorCode": "string",
- "errorMessage": "string",
- "validationLevel": "ignore",
- "parameterizedErrorMessage": "string",
- "field": "string",
- "operand": [ ],
- "aggregator": {
- "id": "string",
- "object": "string",
- "operator": "string"
}, - "operandAggregator": {
- "id": "string",
- "object": "string",
- "operator": "string"
}
}, - "actions": [
- {
- "_remove": true,
- "id": "string",
- "object": "copy_line_item_action",
- "template": {
- "id": "string",
- "object": "line_item_template",
- "name": "string",
- "description": "string",
- "type": "string",
- "amount": 0.1,
- "amountType": "string"
}, - "shortcut": { },
- "modifiers": [
- {
- "id": "string",
- "field": "string",
- "operation": "set",
- "aggregator": {
- "id": "string",
- "object": "bxgy_discount_aggregator",
- "operator": "string",
- "operand": null
}
}
]
}
]
}Retrieve a specific purchase rule by its ID
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "name": "string",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": true,
- "required": true,
- "sequence": 0,
- "processActionsForIgnoredValidations": true,
- "shouldCheckFieldValueForIgnoredValidations": true,
- "tags": [
- {
- "id": "string",
- "system": false,
- "type": "string"
}
], - "meta": { },
- "id": "string",
- "object": "purchase_rule",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "deletedAt": "2019-08-24T14:15:22Z",
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "filter": {
- "id": "string",
- "object": "all_filter",
- "operator": "string",
- "errorCode": "string",
- "errorMessage": "string",
- "validationLevel": "ignore",
- "parameterizedErrorMessage": "string",
- "field": "string",
- "operand": [ ],
- "aggregator": {
- "id": "string",
- "object": "string",
- "operator": "string"
}, - "operandAggregator": {
- "id": "string",
- "object": "string",
- "operator": "string"
}
}, - "actions": [
- {
- "_remove": true,
- "id": "string",
- "object": "copy_line_item_action",
- "template": {
- "id": "string",
- "object": "line_item_template",
- "name": "string",
- "description": "string",
- "type": "string",
- "amount": 0.1,
- "amountType": "string"
}, - "shortcut": { },
- "modifiers": [
- {
- "id": "string",
- "field": "string",
- "operation": "set",
- "aggregator": {
- "id": "string",
- "object": "bxgy_discount_aggregator",
- "operator": "string",
- "operand": null
}
}
]
}
]
}Update an existing purchase rule
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| name required | string Name of the purchase rule |
required | object (ObjectReference) Seller this rule belongs to |
| system | boolean Whether this is a system purchase rule |
| required | boolean If set to true, this rule has to pass for the purchase to be created |
| sequence | integer The sequence in which this rule should apply |
| processActionsForIgnoredValidations | boolean Indicates if the action can still be processed if this rule validation fails |
| shouldCheckFieldValueForIgnoredValidations | boolean Indicates if a more granular error compare should be performed for ignored errors |
Array of objects Tags associated with this rule | |
object Additional metadata for the rule | |
| object required | string Must be purchase_item_rule for demographic pricing Value: "purchase_item_rule" |
required | Array of objects (DemographicPricingAction) List of demographic pricing actions for different templates |
{- "name": "string",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": true,
- "required": true,
- "sequence": 0,
- "processActionsForIgnoredValidations": true,
- "shouldCheckFieldValueForIgnoredValidations": true,
- "tags": [
- {
- "id": "public",
- "system": false
}, - {
- "id": "per_person",
- "system": false
}, - {
- "id": "flat",
- "system": false
}
], - "meta": { },
- "object": "purchase_item_rule",
- "actions": [
- {
- "id": "string",
- "object": "update_line_item_action",
- "template": {
- "id": "507f1f77bcf86cd799439011",
- "object": "line_item_template",
- "name": "string",
- "description": "string",
- "type": "string",
- "amount": 0.1,
- "amountType": "string"
}, - "shortcut": { },
- "modifiers": [
- {
- "id": "string",
- "field": "price",
- "operation": "set",
- "aggregator": {
- "id": "string",
- "object": "return_value_aggregator",
- "operator": "string",
- "operand": null
}
}
], - "filter": {
- "id": "string",
- "object": "equals_filter",
- "operator": "string",
- "errorCode": "string",
- "errorMessage": "string",
- "validationLevel": "ignore",
- "parameterizedErrorMessage": "string",
- "field": "template.id",
- "operand": "string",
- "aggregator": {
- "id": "string",
- "object": "string",
- "operator": "string"
}, - "operandAggregator": {
- "id": "string",
- "object": "string",
- "operator": "string"
}
}
}
]
}{- "name": "string",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": true,
- "required": true,
- "sequence": 0,
- "processActionsForIgnoredValidations": true,
- "shouldCheckFieldValueForIgnoredValidations": true,
- "tags": [
- {
- "id": "string",
- "system": false,
- "type": "string"
}
], - "meta": { },
- "id": "string",
- "object": "purchase_rule",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "deletedAt": "2019-08-24T14:15:22Z",
- "deletedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "filter": {
- "id": "string",
- "object": "all_filter",
- "operator": "string",
- "errorCode": "string",
- "errorMessage": "string",
- "validationLevel": "ignore",
- "parameterizedErrorMessage": "string",
- "field": "string",
- "operand": [ ],
- "aggregator": {
- "id": "string",
- "object": "string",
- "operator": "string"
}, - "operandAggregator": {
- "id": "string",
- "object": "string",
- "operator": "string"
}
}, - "actions": [
- {
- "_remove": true,
- "id": "string",
- "object": "copy_line_item_action",
- "template": {
- "id": "string",
- "object": "line_item_template",
- "name": "string",
- "description": "string",
- "type": "string",
- "amount": 0.1,
- "amountType": "string"
}, - "shortcut": { },
- "modifiers": [
- {
- "id": "string",
- "field": "string",
- "operation": "set",
- "aggregator": {
- "id": "string",
- "object": "bxgy_discount_aggregator",
- "operator": "string",
- "operand": null
}
}
]
}
]
}Delete a purchase rule by marking it as deleted
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Retrieve a paginated list of purchase rule links with optional filtering. Supports filtering by entities, purchase rules, tags, and other criteria.
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
| expand | string Value: "purchaseRule" You can expand multiple objects at the same time by providing a comma-separated list of values |
| purchaseRules.purchaseRulePermanentId | string^[a-f\d]{24}$ Example: purchaseRules.purchaseRulePermanentId=507f1f77bcf86cd799439014 Filter by purchase rule permanent ID |
| entities.id | string Example: entities.id=507f1f77bcf86cd799439012 Filter by entity ID |
| entities.object | string Enum: "experience" "seller" Example: entities.object=experience Filter by entity type |
| tags._id | string Example: tags._id=507f1f77bcf86cd799439015 Filter by tag ID |
object (DateTimeFilterSchema) Examples: createdAt[summary]=Find records where field exists (not null)&createdAt[value]=[object Object] createdAt[summary]=Find records where field is null/missing&createdAt[value]=[object Object] createdAt[summary]=Date range filtering&createdAt[value]=[object Object] createdAt[summary]=Range using comma-separated string&createdAt[value]=[object Object] createdAt[summary]=Using period for today&createdAt[value]=[object Object] createdAt[summary]=Using period for last week&createdAt[value]=[object Object] createdAt[summary]=Exact date-time match&createdAt[value]=[object Object] createdAt[summary]=After specific date&createdAt[value]=[object Object] Filter by creation timestamp. Supports date-time filtering operations. | |
object (DateTimeFilterSchema) Examples: updatedAt[summary]=Find records where field exists (not null)&updatedAt[value]=[object Object] updatedAt[summary]=Find records where field is null/missing&updatedAt[value]=[object Object] updatedAt[summary]=Date range filtering&updatedAt[value]=[object Object] updatedAt[summary]=Range using comma-separated string&updatedAt[value]=[object Object] updatedAt[summary]=Using period for today&updatedAt[value]=[object Object] updatedAt[summary]=Using period for last week&updatedAt[value]=[object Object] updatedAt[summary]=Exact date-time match&updatedAt[value]=[object Object] updatedAt[summary]=After specific date&updatedAt[value]=[object Object] Filter by last update timestamp. Supports date-time filtering operations. | |
object (DateTimeFilterSchema) Examples: deletedAt[summary]=Find records where field exists (not null)&deletedAt[value]=[object Object] deletedAt[summary]=Find records where field is null/missing&deletedAt[value]=[object Object] deletedAt[summary]=Date range filtering&deletedAt[value]=[object Object] deletedAt[summary]=Range using comma-separated string&deletedAt[value]=[object Object] deletedAt[summary]=Using period for today&deletedAt[value]=[object Object] deletedAt[summary]=Using period for last week&deletedAt[value]=[object Object] deletedAt[summary]=Exact date-time match&deletedAt[value]=[object Object] deletedAt[summary]=After specific date&deletedAt[value]=[object Object] Filter by deletion timestamp. Supports date-time filtering operations. |
{- "data": [
- {
- "id": "507f1f77bcf86cd799439011",
- "name": "VIP Experience Rules",
- "purchaseRules": [
- {
- "id": "507f1f77bcf86cd799439013",
- "purchaseRulePermanentId": "507f1f77bcf86cd799439014",
- "purchaseRule": {
- "id": "507f1f77bcf86cd799439014"
}, - "sequence": 0,
- "createdAt": "2023-12-07T10:00:00Z",
- "updatedAt": "2023-12-07T12:00:00Z"
}
], - "entities": [
- {
- "id": "507f1f77bcf86cd799439012",
- "object": "experience"
}
], - "seller": {
- "id": "507f1f77bcf86cd799439010"
}, - "createdBy": {
- "id": "507f1f77bcf86cd799439016"
}, - "tags": [ ],
- "createdAt": "2023-12-07T10:00:00Z",
- "updatedAt": "2023-12-07T12:00:00Z",
- "deletedAt": null
}
], - "count": 1,
- "paging": {
- "next": null
}
}Create a new purchase rule link that associates purchase rules with entities in a specific sequence.
| name | string Human-readable name for the purchase rule link |
required | Array of objects (SequencedPurchaseRuleRequest) Array of sequenced purchase rules to associate |
required | Array of objects Entities (experiences, sellers) this rule link should apply to |
object (ObjectReference) A reference to another object containing only its ID. Use the | |
Array of objects Tags to associate with this purchase rule link |
{- "name": "VIP Experience Rules",
- "entities": [
- {
- "id": "507f1f77bcf86cd799439012",
- "object": "experience"
}
], - "purchaseRules": [
- {
- "purchaseRulePermanentId": "507f1f77bcf86cd799439014",
- "sequence": 0
}
], - "seller": {
- "id": "507f1f77bcf86cd799439010"
}
}{- "id": "507f1f77bcf86cd799439011",
- "name": "VIP Experience Rules",
- "purchaseRules": [
- {
- "id": "507f1f77bcf86cd799439013",
- "purchaseRulePermanentId": "507f1f77bcf86cd799439014",
- "purchaseRule": {
- "id": "507f1f77bcf86cd799439014"
}, - "sequence": 0,
- "createdAt": "2023-12-07T10:00:00Z",
- "updatedAt": "2023-12-07T12:00:00Z"
}
], - "entities": [
- {
- "id": "507f1f77bcf86cd799439012",
- "object": "experience"
}
], - "seller": {
- "id": "507f1f77bcf86cd799439010"
}, - "createdBy": {
- "id": "507f1f77bcf86cd799439016"
}, - "tags": [ ],
- "createdAt": "2023-12-07T10:00:00Z",
- "updatedAt": "2023-12-07T12:00:00Z",
- "deletedAt": null
}Retrieve a specific purchase rule link by its ID with optional field expansion.
| id required | string^[a-f\d]{24}$ Example: 507f1f77bcf86cd799439011 Purchase rule link identifier |
| expand | string Value: "purchaseRule" You can expand multiple objects at the same time by providing a comma-separated list of values |
{- "id": "507f1f77bcf86cd799439011",
- "name": "VIP Experience Rules",
- "purchaseRules": [
- {
- "id": "507f1f77bcf86cd799439013",
- "purchaseRulePermanentId": "507f1f77bcf86cd799439014",
- "purchaseRule": {
- "id": "507f1f77bcf86cd799439014"
}, - "sequence": 0,
- "createdAt": "2023-12-07T10:00:00Z",
- "updatedAt": "2023-12-07T12:00:00Z"
}
], - "entities": [
- {
- "id": "507f1f77bcf86cd799439012",
- "object": "experience"
}
], - "seller": {
- "id": "507f1f77bcf86cd799439010"
}, - "createdBy": {
- "id": "507f1f77bcf86cd799439016"
}, - "tags": [ ],
- "createdAt": "2023-12-07T10:00:00Z",
- "updatedAt": "2023-12-07T12:00:00Z",
- "deletedAt": null
}Update a specific purchase rule link. This operation replaces the entire resource. Use PATCH for partial updates if supported.
| id required | string^[a-f\d]{24}$ Example: 507f1f77bcf86cd799439011 Purchase rule link identifier |
| name | string Human-readable name for the purchase rule link |
required | Array of objects (SequencedPurchaseRuleRequest) Array of sequenced purchase rules to associate |
required | Array of objects Entities (experiences, sellers) this rule link should apply to |
object (ObjectReference) A reference to another object containing only its ID. Use the | |
Array of objects Tags to associate with this purchase rule link |
{- "name": "Updated VIP Experience Rules",
- "entities": [
- {
- "id": "507f1f77bcf86cd799439012",
- "object": "experience"
}
], - "purchaseRules": [
- {
- "purchaseRulePermanentId": "507f1f77bcf86cd799439014",
- "sequence": 0
}
]
}{- "id": "507f1f77bcf86cd799439011",
- "name": "Updated VIP Experience Rules",
- "purchaseRules": [
- {
- "id": "507f1f77bcf86cd799439013",
- "purchaseRulePermanentId": "507f1f77bcf86cd799439014",
- "purchaseRule": {
- "id": "507f1f77bcf86cd799439014"
}, - "sequence": 0,
- "createdAt": "2023-12-07T10:00:00Z",
- "updatedAt": "2023-12-07T15:30:00Z"
}
], - "entities": [
- {
- "id": "507f1f77bcf86cd799439012",
- "object": "experience"
}
], - "seller": {
- "id": "507f1f77bcf86cd799439010"
}, - "createdBy": {
- "id": "507f1f77bcf86cd799439016"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439016"
}, - "tags": [ ],
- "createdAt": "2023-12-07T10:00:00Z",
- "updatedAt": "2023-12-07T15:30:00Z",
- "deletedAt": null
}Delete a specific purchase rule link. This operation soft-deletes the resource by setting the deletedAt timestamp.
| id required | string^[a-f\d]{24}$ Example: 507f1f77bcf86cd799439011 Purchase rule link identifier |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Retrieve a paginated list of resources.
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
| event | string Get resources for a specific event ID with availability information |
| product | string Get resources for a specific product/experience ID with availability information |
| start | string <date-time> Example: start=2024-01-15T09:00:00 Start time for product resource availability (valid only when 'product' is specified) |
| seller | string Filter resources by seller ID (required if neither |
| name | string Example: name=kayak Filter resources by name (partial match) |
{- "data": [
- {
- "id": "507f1f77bcf86cd799439011",
- "type": "equipment",
- "name": "Kayak",
- "seller": {
- "id": "507f191e810c19729de860ea"
}, - "capacity": 2,
- "count": 5,
- "schedules": [ ],
- "createdAt": "2024-01-01T10:00:00Z"
}
], - "paging": {
- "next": null
}
}Create a new resource (equipment or guide). The resource will be automatically associated with the authenticated user's seller account unless a different seller is specified.
For equipment resources with custom allocation strategy, the resource will be automatically added to the prioritized resource list.
| type required | string Enum: "equipment" "guide" Type of resource to create |
| name required | string Name of the resource |
| seller | string Seller ID (will default to authenticated user if not provided) |
| capacity | integer >= 1 Capacity per unit (equipment only) |
| count | integer >= 1 Number of units available (equipment only) |
{- "type": "equipment",
- "name": "Double Kayak",
- "capacity": 2,
- "count": 3
}{- "id": "507f1f77bcf86cd799439011",
- "type": "equipment",
- "name": "Double Kayak",
- "seller": {
- "id": "507f191e810c19729de860ea"
}, - "capacity": 2,
- "count": 3,
- "schedules": [ ],
- "createdAt": "2024-01-15T10:30:00Z"
}Retrieve detailed information about a specific resource
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "id": "507f1f77bcf86cd799439011",
- "type": "equipment",
- "name": "Raft",
- "seller": {
- "id": "507f191e810c19729de860ea"
}, - "capacity": 10,
- "count": 5,
- "schedules": [ ],
- "createdAt": "2024-01-01T10:00:00Z"
}Update an existing resource. Only provided fields will be updated. This endpoint triggers resource update events for equipment resources.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| name | string Updated name of the resource |
| capacity | integer >= 1 Updated capacity per unit (equipment only) |
| count | integer >= 1 Updated number of units available (equipment only) |
{- "name": "Premium Kayak"
}{- "id": "507f1f77bcf86cd799439011",
- "type": "equipment",
- "name": "Premium Kayak",
- "seller": {
- "id": "507f191e810c19729de860ea"
}, - "capacity": 3,
- "count": 2,
- "schedules": [ ],
- "createdAt": "2024-01-01T10:00:00Z"
}Soft delete a resource by setting the deletedAt timestamp. Resources that are associated with experiences cannot be deleted and will return a conflict error.
For equipment resources with custom allocation strategy, the resource will be automatically removed from the prioritized resource list.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Assigns a pre-existing resource (inventory item) to an experience. Resources are fixed assets that can be utilized across multiple experiences. You must have the Inventory feature enabled for this endpoint to work.
Resource Concepts:
Restrictions:
| id required | string Example: 507f191e810c19729de860ea The unique identifier of the experience |
required | object (ObjectReference) Reference to the resource to assign |
{- "resource": {
- "id": "507f1f77bcf86cd799439011"
}
}{- "id": "507f1f77bcf86cd799439012",
- "resource": {
- "id": "507f1f77bcf86cd799439011",
- "type": "equipment",
- "name": "Kayak",
- "seller": {
- "id": "507f191e810c19729de860ea"
}, - "capacity": 2,
- "count": 5,
- "schedules": [ ],
- "createdAt": "2024-01-01T10:00:00Z"
}, - "priority": 100
}Remove the assignment of a resource (inventory item) from an experience. This will also remove the resource from all existing events for this experience.
| id required | string Example: 507f191e810c19729de860ea The unique identifier of the experience |
| resourceId required | string Example: 507f1f77bcf86cd799439011 The unique identifier of the resource to unassign |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Create schedules for an Experience. This allows you to build activity schedules that define when your trip departs. Combining schedules also allows for dynamic pricing that adjusts based on time or day. You can create as many schedules as you would like.
Sample Request:
// Every weekday 8AM, 12PM, 6PM
{
"name": "Weekdays",
"repeat": "weekly",
"days": [1,2,3,4,5],
"departure": "fixed",
"times": [800, 1200, 1800],
"type": "available",
"priceDelta": 0
}
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
Schedule configuration data
| id | string Schedule identifier (for updates) |
| name | string Name for this schedule |
| type required | string Default: "available" Enum: "available" "blackout" Type of schedule |
| repeat | string Enum: "weekly" "custom" How the schedule repeats |
| days | Array of integers[ items [ 0 .. 6 ] ] Days of week (0=Sunday, 1=Monday, etc.) for weekly repeats |
| dates | Array of strings <date> [ items <date > ] Specific dates when this schedule applies |
| start | string <date> Start date for recurring schedules |
| end | string <date> End date for recurring schedules |
| source | string Source of the schedule |
| departure | string Enum: "fixed" "varies" "openingHours" Whether departure time is fixed, varies, or driven by opening-hours windows.
|
| times | Array of integers[ items [ 0 .. 2359 ] ] Start times in HHMM format (e.g., 900 = 9:00 AM, 1800 = 6:00 PM) |
| priceDelta | number <float> Default: 0 Price adjustment for this schedule |
| priceOverride | boolean Whether this schedule overrides base pricing |
| allowedPrivacies | Array of strings Items Enum: "private" "public" Allowed privacy levels |
Array of objects (OpeningHoursPerDay) Per-weekday opening hour windows. Required when |
{- "name": "Weekday Tours",
- "repeat": "weekly",
- "days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "departure": "fixed",
- "times": [
- 800,
- 1200,
- 1800
], - "type": "available",
- "priceDelta": 0
}{- "id": "507f1f77bcf86cd799439014",
- "name": "Weekday Tours",
- "repeat": "weekly",
- "days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "departure": "fixed",
- "times": [
- 800,
- 1200,
- 1800
], - "type": "available",
- "priceDelta": 0,
- "priceOverride": false,
- "allowedPrivacies": [
- "public"
], - "start": "2024-01-01",
- "createdAt": "2024-01-15T10:30:00Z",
- "updatedAt": "2024-01-15T10:30:00Z"
}Update an existing schedule for an experience. All schedule properties can be modified.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| scheduleId required | string Example: 507f1f77bcf86cd799439014 Schedule ID to update |
Updated schedule configuration
| id | string Schedule identifier (for updates) |
| name | string Name for this schedule |
| type required | string Default: "available" Enum: "available" "blackout" Type of schedule |
| repeat | string Enum: "weekly" "custom" How the schedule repeats |
| days | Array of integers[ items [ 0 .. 6 ] ] Days of week (0=Sunday, 1=Monday, etc.) for weekly repeats |
| dates | Array of strings <date> [ items <date > ] Specific dates when this schedule applies |
| start | string <date> Start date for recurring schedules |
| end | string <date> End date for recurring schedules |
| source | string Source of the schedule |
| departure | string Enum: "fixed" "varies" "openingHours" Whether departure time is fixed, varies, or driven by opening-hours windows.
|
| times | Array of integers[ items [ 0 .. 2359 ] ] Start times in HHMM format (e.g., 900 = 9:00 AM, 1800 = 6:00 PM) |
| priceDelta | number <float> Default: 0 Price adjustment for this schedule |
| priceOverride | boolean Whether this schedule overrides base pricing |
| allowedPrivacies | Array of strings Items Enum: "private" "public" Allowed privacy levels |
Array of objects (OpeningHoursPerDay) Per-weekday opening hour windows. Required when |
{- "name": "Updated Weekday Tours",
- "repeat": "weekly",
- "days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "departure": "fixed",
- "times": [
- 900,
- 1300,
- 1700
], - "type": "available",
- "priceDelta": 5
}{- "id": "507f1f77bcf86cd799439012",
- "name": "Morning Tours",
- "type": "available",
- "repeat": "weekly",
- "days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "dates": [
- "2023-08-15",
- "2023-08-16"
], - "start": "2023-08-01",
- "end": "2023-12-31",
- "source": "manual",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "expiresAt": "2024-01-01T00:00:00Z",
- "departure": "fixed",
- "times": [
- 900,
- 1400
], - "priceDelta": 0,
- "priceOverride": false,
- "allowedPrivacies": [
- "public"
], - "timeRanges": [
- { }
], - "openingHoursPerDay": [
- {
- "day": 1,
- "timeRange": {
- "startTime": 900,
- "endTime": 1700
}
}
]
}Delete a schedule from an experience. This will remove all future occurrences of the schedule.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| scheduleId required | string Example: 507f1f77bcf86cd799439014 Schedule ID to delete |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Add a new opening-hours schedule to an experience. Opening-hours schedules define the days and time windows during which an experience is open for walk-in or pre_opening_end cutoff enforcement.
Permission required: EDIT_EXPERIENCE_OPENING_SCHEDULES
Validation rules:
openingHoursPerDay entry must have an endTime greater than its startTime.Sample Request:
{
"name": "Summer Hours",
"repeat": "weekly",
"departure": "openingHours",
"start": "2024-06-01",
"end": "2024-08-31",
"openingHoursPerDay": [
{"day": 1, "timeRange": {"startTime": 900, "endTime": 1700}},
{"day": 2, "timeRange": {"startTime": 900, "endTime": 1700}},
{"day": 3, "timeRange": {"startTime": 900, "endTime": 1700}},
{"day": 4, "timeRange": {"startTime": 900, "endTime": 1700}},
{"day": 5, "timeRange": {"startTime": 900, "endTime": 1700}}
]
}
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
Opening-hours schedule configuration
| id | string Schedule identifier (for updates) |
| name | string Name for this schedule |
| type required | string Type of schedule |
| repeat | string Enum: "weekly" "custom" How the schedule repeats |
| days | Array of integers[ items [ 0 .. 6 ] ] Days of week (0=Sunday, 1=Monday, etc.) for weekly repeats |
| dates | Array of strings <date> [ items <date > ] Specific dates when this schedule applies |
| start required | string <date> Start date for recurring schedules |
| end | string <date> End date for recurring schedules |
| source | string Source of the schedule |
| departure | string Value: "openingHours" Always set to |
required | Array of objects (OpeningHoursPerDay) non-empty Per-weekday time windows for this schedule. At least one entry is required. Duplicate entries for the same day are ignored (first occurrence wins). |
{- "name": "Weekday Hours",
- "type": "available",
- "repeat": "weekly",
- "departure": "openingHours",
- "start": "2024-06-01",
- "openingHoursPerDay": [
- {
- "day": 1,
- "timeRange": {
- "startTime": 900,
- "endTime": 1700
}
}, - {
- "day": 2,
- "timeRange": {
- "startTime": 900,
- "endTime": 1700
}
}, - {
- "day": 3,
- "timeRange": {
- "startTime": 900,
- "endTime": 1700
}
}, - {
- "day": 4,
- "timeRange": {
- "startTime": 900,
- "endTime": 1700
}
}, - {
- "day": 5,
- "timeRange": {
- "startTime": 900,
- "endTime": 1700
}
}
]
}{- "id": "507f1f77bcf86cd799439030",
- "name": "Weekday Hours",
- "type": "available",
- "repeat": "weekly",
- "departure": "openingHours",
- "openingHoursPerDay": [
- {
- "day": 1,
- "timeRange": {
- "startTime": 900,
- "endTime": 1700
}
}, - {
- "day": 2,
- "timeRange": {
- "startTime": 900,
- "endTime": 1700
}
}, - {
- "day": 3,
- "timeRange": {
- "startTime": 900,
- "endTime": 1700
}
}, - {
- "day": 4,
- "timeRange": {
- "startTime": 900,
- "endTime": 1700
}
}, - {
- "day": 5,
- "timeRange": {
- "startTime": 900,
- "endTime": 1700
}
}
], - "createdAt": "2024-01-15T10:30:00Z",
- "updatedAt": "2024-01-15T10:30:00Z"
}Update an existing opening-hours schedule on an experience.
Permission required: EDIT_EXPERIENCE_OPENING_SCHEDULES
Validation rules:
openingHoursPerDay entry must have an endTime greater than its startTime.| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| openingHourId required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439030 Opening-hours schedule ID to update |
Updated opening-hours schedule configuration
| id | string Schedule identifier (for updates) |
| name | string Name for this schedule |
| type required | string Type of schedule |
| repeat | string Enum: "weekly" "custom" How the schedule repeats |
| days | Array of integers[ items [ 0 .. 6 ] ] Days of week (0=Sunday, 1=Monday, etc.) for weekly repeats |
| dates | Array of strings <date> [ items <date > ] Specific dates when this schedule applies |
| start required | string <date> Start date for recurring schedules |
| end | string <date> End date for recurring schedules |
| source | string Source of the schedule |
| departure | string Value: "openingHours" Always set to |
required | Array of objects (OpeningHoursPerDay) non-empty Per-weekday time windows for this schedule. At least one entry is required. Duplicate entries for the same day are ignored (first occurrence wins). |
{- "name": "Extended Weekday Hours",
- "type": "available",
- "repeat": "weekly",
- "departure": "openingHours",
- "start": "2024-06-01",
- "openingHoursPerDay": [
- {
- "day": 1,
- "timeRange": {
- "startTime": 900,
- "endTime": 1800
}
}, - {
- "day": 2,
- "timeRange": {
- "startTime": 900,
- "endTime": 1800
}
}, - {
- "day": 3,
- "timeRange": {
- "startTime": 900,
- "endTime": 1800
}
}, - {
- "day": 4,
- "timeRange": {
- "startTime": 900,
- "endTime": 1800
}
}, - {
- "day": 5,
- "timeRange": {
- "startTime": 900,
- "endTime": 1800
}
}
]
}{- "id": "507f1f77bcf86cd799439012",
- "name": "Morning Tours",
- "type": "available",
- "repeat": "weekly",
- "days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "dates": [
- "2023-08-15",
- "2023-08-16"
], - "start": "2023-08-01",
- "end": "2023-12-31",
- "source": "manual",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "expiresAt": "2024-01-01T00:00:00Z",
- "departure": "fixed",
- "times": [
- 900,
- 1400
], - "priceDelta": 0,
- "priceOverride": false,
- "allowedPrivacies": [
- "public"
], - "timeRanges": [
- { }
], - "openingHoursPerDay": [
- {
- "day": 1,
- "timeRange": {
- "startTime": 900,
- "endTime": 1700
}
}
]
}Remove an opening-hours schedule from an experience.
Permission required: EDIT_EXPERIENCE_OPENING_SCHEDULES
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| openingHourId required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439030 Opening-hours schedule ID to delete |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Add a new availability schedule to a guide. Guide schedules define when guides are available for assignments.
Required fields: type, days, start
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| guideId required | string Example: 507f1f77bcf86cd799439012 Guide ID |
Guide schedule configuration
| id | string Schedule identifier (for updates) |
| name | string Name for this schedule |
| type required | string Type of schedule |
| repeat | string Enum: "weekly" "custom" How the schedule repeats |
| days | Array of integers[ items [ 0 .. 6 ] ] Days of week (0=Sunday, 1=Monday, etc.) for weekly repeats |
| dates | Array of strings <date> [ items <date > ] Specific dates when this schedule applies |
| start | string <date> Start date for recurring schedules |
| end | string <date> End date for recurring schedules |
| source | string Source of the schedule |
Array of objects (baseSchedule_TimeRange) Time ranges when the guide is available |
{- "type": "available",
- "repeat": "weekly",
- "days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "start": "2024-01-01",
- "timeRanges": [
- {
- "startTime": 900,
- "endTime": 1700
}
]
}{- "id": "507f1f77bcf86cd799439012",
- "name": "Morning Tours",
- "type": "available",
- "repeat": "weekly",
- "days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "dates": [
- "2023-08-15",
- "2023-08-16"
], - "start": "2023-08-01",
- "end": "2023-12-31",
- "source": "manual",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "expiresAt": "2024-01-01T00:00:00Z"
}Update an existing schedule for a guide.
Required fields: type, days
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| guideId required | string Example: 507f1f77bcf86cd799439012 Guide ID |
| scheduleId required | string Example: 507f1f77bcf86cd799439015 Schedule ID to update |
Updated guide schedule configuration
| id | string Schedule identifier (for updates) |
| name | string Name for this schedule |
| type required | string Type of schedule |
| repeat | string Enum: "weekly" "custom" How the schedule repeats |
| days | Array of integers[ items [ 0 .. 6 ] ] Days of week (0=Sunday, 1=Monday, etc.) for weekly repeats |
| dates | Array of strings <date> [ items <date > ] Specific dates when this schedule applies |
| start | string <date> Start date for recurring schedules |
| end | string <date> End date for recurring schedules |
| source | string Source of the schedule |
Array of objects (baseSchedule_TimeRange) Updated time ranges when the guide is available |
{- "type": "available",
- "repeat": "weekly",
- "days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "timeRanges": [
- {
- "startTime": 800,
- "endTime": 1800
}
]
}{- "id": "507f1f77bcf86cd799439012",
- "name": "Morning Tours",
- "type": "available",
- "repeat": "weekly",
- "days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "dates": [
- "2023-08-15",
- "2023-08-16"
], - "start": "2023-08-01",
- "end": "2023-12-31",
- "source": "manual",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "expiresAt": "2024-01-01T00:00:00Z"
}Delete a schedule from a guide. Use the force query parameter to force deletion even if there are conflicts.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| guideId required | string Example: 507f1f77bcf86cd799439012 Guide ID |
| scheduleId required | string Example: 507f1f77bcf86cd799439015 Schedule ID to delete |
| force | boolean Default: false Example: force=true Force deletion even if there are conflicts |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Add a new schedule to a resource. Resource schedules define when equipment or resources are available for use.
Use the force query parameter to force creation even if there are conflicts.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| force | boolean Default: false Force creation even if there are conflicts |
Resource schedule configuration
| id | string Schedule identifier (for updates) |
| name | string Name for this schedule |
| type required | string Type of schedule |
| repeat | string Enum: "weekly" "custom" How the schedule repeats |
| days | Array of integers[ items [ 0 .. 6 ] ] Days of week (0=Sunday, 1=Monday, etc.) for weekly repeats |
| dates | Array of strings <date> [ items <date > ] Specific dates when this schedule applies |
| start | string <date> Start date for recurring schedules |
| end | string <date> End date for recurring schedules |
| source | string Source of the schedule |
{- "name": "Summer Kayak Availability",
- "type": "available",
- "repeat": "weekly",
- "start": "2024-06-01",
- "end": "2024-08-31"
}{- "id": "507f1f77bcf86cd799439012",
- "name": "Morning Tours",
- "type": "available",
- "repeat": "weekly",
- "days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "dates": [
- "2023-08-15",
- "2023-08-16"
], - "start": "2023-08-01",
- "end": "2023-12-31",
- "source": "manual",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "expiresAt": "2024-01-01T00:00:00Z"
}Update an existing schedule for a resource.
Use the force query parameter to force update even if there are conflicts.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| scheduleId required | string Example: 507f1f77bcf86cd799439016 Schedule ID to update |
| force | boolean Default: false Force update even if there are conflicts |
Updated resource schedule configuration
| id | string Schedule identifier (for updates) |
| name | string Name for this schedule |
| type required | string Type of schedule |
| repeat | string Enum: "weekly" "custom" How the schedule repeats |
| days | Array of integers[ items [ 0 .. 6 ] ] Days of week (0=Sunday, 1=Monday, etc.) for weekly repeats |
| dates | Array of strings <date> [ items <date > ] Specific dates when this schedule applies |
| start | string <date> Start date for recurring schedules |
| end | string <date> End date for recurring schedules |
| source | string Source of the schedule |
{- "name": "Extended Summer Availability",
- "type": "available",
- "repeat": "weekly",
- "start": "2024-05-01",
- "end": "2024-09-30"
}{- "id": "507f1f77bcf86cd799439012",
- "name": "Morning Tours",
- "type": "available",
- "repeat": "weekly",
- "days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "dates": [
- "2023-08-15",
- "2023-08-16"
], - "start": "2023-08-01",
- "end": "2023-12-31",
- "source": "manual",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "expiresAt": "2024-01-01T00:00:00Z"
}Delete a schedule from a resource.
Use the force query parameter to force deletion even if there are conflicts.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| scheduleId required | string Example: 507f1f77bcf86cd799439016 Schedule ID to delete |
| force | boolean Default: false Force deletion even if there are conflicts |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Creates a new seller account. For internal use or admin creation. Public requests require reCAPTCHA validation. Admin-created accounts require a password.
| X-RECAPTCHA-RESPONSE | string reCAPTCHA response token (required for public requests) |
| bankAccount | string^[a-zA-Z0-9]+$ Bank account number for payouts |
| bankAccountType | string Enum: "checking" "savings" Type of bank account |
| bankRouting | string Bank routing number for payouts |
| businessType | string Enum: "business" "individual" Type of business entity |
| city | string City |
| company | string Legal company name |
| communicationEmail | string <email> Email address for customer communications |
| country | string Country name |
| countryCode | string^[A-Z]{2}$ ISO 3166-1 alpha-2 country code |
| currency | string^[A-Z]{3}$ ISO 4217 currency code |
string <email> Primary email address | |
| emailFooter | string Custom footer text for outgoing emails |
object (Location) Geographic location with coordinates and optional address | |
| geoNameId | integer GeoNames database ID for location |
| name | string Company or business name |
| personName | string Name of the person who created the account (populated during self-registration) |
| phone | string Contact phone number |
| registrationPath | string Enum: "xola_admin" "self_registration" How the seller account was created |
| state | string State or province |
| statementDescriptor | string <= 22 characters ^[^><'"]*$ Text that appears on customer credit card statements |
| streetAddress | string Street address |
| timezone | number <float> Deprecated Timezone offset as a float |
| timezoneName | string Timezone identifier |
| website | string <uri> Company website URL |
| zip | string <= 10 characters ZIP or postal code |
| taxId | string EIN (business) or SSN (individual) of the bank account holder (only last 4 digits are stored) |
| password | string >= 6 characters Password for new seller account (required for admin-created accounts) |
| createStripeAccount | boolean Default: true Whether to create a Stripe managed account |
{- "email": "newbusiness@example.com",
- "name": "Mystic Mountain Tours",
- "company": "Mystic Mountain Tours",
- "businessType": "business",
- "phone": "+1-555-123-4567",
- "country": "United States",
- "countryCode": "US"
}{- "bankAccount": "1234567890",
- "bankAccountType": "checking",
- "bankRouting": "123456789",
- "businessType": "business",
- "city": "Boulder",
- "company": "Mystic Mountain Tours LLC",
- "communicationEmail": "bookings@mystic-mountain-tours.com",
- "country": "United States",
- "countryCode": "US",
- "currency": "USD",
- "email": "info@mystic-mountain-tours.com",
- "emailFooter": "Thank you for choosing Mystic Mountain Tours!",
- "geo": {
- "lat": 36.1069,
- "lng": -112.1129,
- "address": "Grand Canyon National Park, AZ",
- "name": "Grand Canyon Visitor Center",
- "formattedAddress": "S Entrance Rd, Grand Canyon Village, AZ 86023, USA"
}, - "geoNameId": 5294810,
- "name": "Mystic Mountain Tours",
- "personName": "John Smith",
- "phone": "+1-555-123-4567",
- "registrationPath": "self_registration",
- "state": "Colorado",
- "statementDescriptor": "MYSTIC MOUNTAIN TOURS",
- "streetAddress": "456 Mountain View Road",
- "timezone": -7,
- "timezoneName": "America/Denver",
- "zip": "80301",
- "id": "507f1f77bcf86cd799439011",
- "version": 2,
- "enabled": true,
- "balance": 1250.5,
- "disputedBalance": 0,
- "unrecoveredBalance": 0,
- "locale": "en_US",
- "picture": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "medias": [
- {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "acceptedCards": [
- "visa",
- "mastercard",
- "amex"
], - "allowedGateways": [
- "stripe_xola",
- "stripe_oauth"
], - "defaultGateway": "stripe",
- "fees": [
- {
- "id": "string",
- "name": "string",
- "type": "string",
- "amount": 0,
- "percentage": 0,
- "applicableOn": "string"
}
], - "pluginFees": {
- "property1": { },
- "property2": { }
}, - "processingFeeFormulas": [
- {
- "method": "cc",
- "methodCategory": "card",
- "sources": [
- {
- "name": "checkout",
- "formula": "0.029 * %amount% + 0.30",
- "variableRate": 2.9,
- "fixedRate": 0.3
}
]
}
], - "partnerFeeFormulas": [
- {
- "partnerId": "string",
- "percentage": 0,
- "fixed": 0
}
], - "paymentMethods": [
- {
- "id": "string",
- "name": "string",
- "type": "string",
- "enabled": true
}
], - "remoteCards": [
- {
- "id": "string",
- "last4": "string",
- "brand": "string",
- "expiryMonth": 0,
- "expiryYear": 0
}
], - "remoteGateways": [
- {
- "id": "string",
- "gateway": "string",
- "name": "string",
- "enabled": true
}
], - "plans": [
- {
- "id": "string",
- "name": "string",
- "schedule": "string",
- "enabled": true
}
], - "subscriptionPlan": {
- "id": "string",
- "name": "string",
- "package": { },
- "addOns": [
- { }
]
}, - "stripeAccount": {
- "id": "string",
- "remoteId": "string",
- "accountType": "string",
- "country": "string",
- "enabled": true
}, - "topUpSource": {
- "id": "string",
- "type": "string",
- "last4": "string"
}, - "autoAccept": {
- "enabled": true,
- "conditions": { }
}, - "blackoutSchedules": [
- {
- "startDate": "2019-08-24",
- "endDate": "2019-08-24",
- "reason": "string"
}
], - "terms": {
- "termsLegal": "string",
- "termsHuman": "string"
}, - "preferences": {
- "booking": {
- "allowMultiItemOrders": true,
- "reservationLimit": 0
}, - "notifications": [
- {
- "type": "string",
- "channels": [
- {
- "type": "string",
- "enabled": true,
- "offset": "string",
- "negativeOffset": true
}
]
}
], - "communicationChannels": {
- "enabledChannels": [
- "email",
- "sms"
]
}, - "google": { },
- "network": { },
- "reviewPreference": {
- "id": "string",
- "destination": "off",
- "sendReviewEmailToAllTravelers": true,
- "enableSmartReview": true,
- "smartReviewThreshold": 2
}, - "gratuity": {
- "enabled": true,
- "options": [
- {
- "algorithm": "percent",
- "amount": 18
}
], - "addToReviewReminder": false,
- "message": "string",
- "commentLabel": "string",
- "enabledSources": [
- "checkout",
- "office"
], - "experiences": { }
}
}, - "roles": [
- "ROLE_SELLER",
- "ROLE_INVENTORY"
], - "delegates": [
- {
- "id": "string",
- "permissions": [
- "string"
], - "user": {
- "id": "string",
- "name": "string",
- "email": "string",
- "enabled": true
}
}
], - "meta": {
- "createCard": true,
- "xola_domain": "xola.com"
}, - "customerNotes": {
- "property1": {
- "note": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}, - "property2": {
- "note": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
}, - "bankAccountLast4": "7890",
- "bankRoutingLast4": "6789",
- "taxIdLast4": "1234",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Searches and retrieves a list of sellers based on various filters. Supports different contexts like agent view, Google Reserve, and partner search.
Results are paginated and can be filtered by various criteria.
| agent | boolean Default: false Return sellers for agent context |
| filter | string Value: "googleReserve" Example: filter=googleReserve Special filter type |
| context | string Default: "public" Enum: "public" "admin" "xolaPartner" Example: context=admin Response context for data formatting |
| seller | string Example: seller=507f1f77bcf86cd799439011 Seller ID for context-based filtering |
| etl | boolean Default: false ETL mode for higher limits (admin only) |
| limit | integer [ 1 .. 100 ] Default: 20 Example: limit=50 Number of results per page |
| offset | integer >= 0 Default: 0 Number of results to skip |
| q | string Example: q=mystic mountain tours Search query for seller names |
| country | string Example: country=United States Filter by country |
| enabled | boolean Example: enabled=true Filter by enabled status |
{- "data": [
- {
- "bankAccount": "1234567890",
- "bankAccountType": "checking",
- "bankRouting": "123456789",
- "businessType": "business",
- "city": "Boulder",
- "company": "Mystic Mountain Tours LLC",
- "communicationEmail": "bookings@mystic-mountain-tours.com",
- "country": "United States",
- "countryCode": "US",
- "currency": "USD",
- "email": "info@mystic-mountain-tours.com",
- "emailFooter": "Thank you for choosing Mystic Mountain Tours!",
- "geo": {
- "lat": 36.1069,
- "lng": -112.1129,
- "address": "Grand Canyon National Park, AZ",
- "name": "Grand Canyon Visitor Center",
- "formattedAddress": "S Entrance Rd, Grand Canyon Village, AZ 86023, USA"
}, - "geoNameId": 5294810,
- "name": "Mystic Mountain Tours",
- "personName": "John Smith",
- "phone": "+1-555-123-4567",
- "registrationPath": "self_registration",
- "state": "Colorado",
- "statementDescriptor": "MYSTIC MOUNTAIN TOURS",
- "streetAddress": "456 Mountain View Road",
- "timezone": -7,
- "timezoneName": "America/Denver",
- "zip": "80301",
- "id": "507f1f77bcf86cd799439011",
- "version": 2,
- "enabled": true,
- "balance": 1250.5,
- "disputedBalance": 0,
- "unrecoveredBalance": 0,
- "locale": "en_US",
- "picture": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "medias": [
- {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "acceptedCards": [
- "visa",
- "mastercard",
- "amex"
], - "allowedGateways": [
- "stripe_xola",
- "stripe_oauth"
], - "defaultGateway": "stripe",
- "fees": [
- {
- "id": "string",
- "name": "string",
- "type": "string",
- "amount": 0,
- "percentage": 0,
- "applicableOn": "string"
}
], - "pluginFees": {
- "property1": { },
- "property2": { }
}, - "processingFeeFormulas": [
- {
- "method": "cc",
- "methodCategory": "card",
- "sources": [
- {
- "name": "checkout",
- "formula": "0.029 * %amount% + 0.30",
- "variableRate": 2.9,
- "fixedRate": 0.3
}
]
}
], - "partnerFeeFormulas": [
- {
- "partnerId": "string",
- "percentage": 0,
- "fixed": 0
}
], - "paymentMethods": [
- {
- "id": "string",
- "name": "string",
- "type": "string",
- "enabled": true
}
], - "remoteCards": [
- {
- "id": "string",
- "last4": "string",
- "brand": "string",
- "expiryMonth": 0,
- "expiryYear": 0
}
], - "remoteGateways": [
- {
- "id": "string",
- "gateway": "string",
- "name": "string",
- "enabled": true
}
], - "plans": [
- {
- "id": "string",
- "name": "string",
- "schedule": "string",
- "enabled": true
}
], - "subscriptionPlan": {
- "id": "string",
- "name": "string",
- "package": { },
- "addOns": [
- { }
]
}, - "stripeAccount": {
- "id": "string",
- "remoteId": "string",
- "accountType": "string",
- "country": "string",
- "enabled": true
}, - "topUpSource": {
- "id": "string",
- "type": "string",
- "last4": "string"
}, - "autoAccept": {
- "enabled": true,
- "conditions": { }
}, - "blackoutSchedules": [
- {
- "startDate": "2019-08-24",
- "endDate": "2019-08-24",
- "reason": "string"
}
], - "terms": {
- "termsLegal": "string",
- "termsHuman": "string"
}, - "preferences": {
- "booking": {
- "allowMultiItemOrders": true,
- "reservationLimit": 0
}, - "notifications": [
- {
- "type": "string",
- "channels": [
- {
- "type": "string",
- "enabled": true,
- "offset": "string",
- "negativeOffset": true
}
]
}
], - "communicationChannels": {
- "enabledChannels": [
- "email",
- "sms"
]
}, - "google": { },
- "network": { },
- "reviewPreference": {
- "id": "string",
- "destination": "off",
- "sendReviewEmailToAllTravelers": true,
- "enableSmartReview": true,
- "smartReviewThreshold": 2
}, - "gratuity": {
- "enabled": true,
- "options": [
- {
- "algorithm": "percent",
- "amount": 18
}
], - "addToReviewReminder": false,
- "message": "string",
- "commentLabel": "string",
- "enabledSources": [
- "checkout",
- "office"
], - "experiences": { }
}
}, - "roles": [
- "ROLE_SELLER",
- "ROLE_INVENTORY"
], - "delegates": [
- {
- "id": "string",
- "permissions": [
- "string"
], - "user": {
- "id": "string",
- "name": "string",
- "email": "string",
- "enabled": true
}
}
], - "meta": {
- "createCard": true,
- "xola_domain": "xola.com"
}, - "customerNotes": {
- "property1": {
- "note": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}, - "property2": {
- "note": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
}, - "bankAccountLast4": "7890",
- "bankRoutingLast4": "6789",
- "taxIdLast4": "1234",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
], - "next": "/api/sellers?offset=50&limit=50",
- "_es": true
}Updates an existing seller's information. Supports both full replacement (PUT) and partial updates (PATCH semantics). Some fields like email changes may require multi-factor authentication.
Version migration from V1 to V2 requires special permissions.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| bankAccount | string^[a-zA-Z0-9]+$ Bank account number for payouts |
| bankAccountType | string Enum: "checking" "savings" Type of bank account |
| bankRouting | string Bank routing number for payouts |
| businessType | string Enum: "business" "individual" Type of business entity |
| city | string City |
| company | string Legal company name |
| communicationEmail | string <email> Email address for customer communications |
| country | string Country name |
| countryCode | string^[A-Z]{2}$ ISO 3166-1 alpha-2 country code |
| currency | string^[A-Z]{3}$ ISO 4217 currency code |
string <email> Primary email address | |
| emailFooter | string Custom footer text for outgoing emails |
object (Location) Geographic location with coordinates and optional address | |
| geoNameId | integer GeoNames database ID for location |
| name | string Company or business name |
| personName | string Name of the person who created the account (populated during self-registration) |
| phone | string Contact phone number |
| registrationPath | string Enum: "xola_admin" "self_registration" How the seller account was created |
| state | string State or province |
| statementDescriptor | string <= 22 characters ^[^><'"]*$ Text that appears on customer credit card statements |
| streetAddress | string Street address |
| timezone | number <float> Deprecated Timezone offset as a float |
| timezoneName | string Timezone identifier |
| website | string <uri> Company website URL |
| zip | string <= 10 characters ZIP or postal code |
| taxId | string EIN (business) or SSN (individual) of the bank account holder (only last 4 digits are stored) |
| password | string >= 6 characters Password for new seller account (required for admin-created accounts) |
| createStripeAccount | boolean Default: true Whether to create a Stripe managed account |
{- "name": "Updated Company Name",
- "phone": "+1-555-987-6543",
}{- "bankAccount": "1234567890",
- "bankAccountType": "checking",
- "bankRouting": "123456789",
- "businessType": "business",
- "city": "Boulder",
- "company": "Mystic Mountain Tours LLC",
- "communicationEmail": "bookings@mystic-mountain-tours.com",
- "country": "United States",
- "countryCode": "US",
- "currency": "USD",
- "email": "info@mystic-mountain-tours.com",
- "emailFooter": "Thank you for choosing Mystic Mountain Tours!",
- "geo": {
- "lat": 36.1069,
- "lng": -112.1129,
- "address": "Grand Canyon National Park, AZ",
- "name": "Grand Canyon Visitor Center",
- "formattedAddress": "S Entrance Rd, Grand Canyon Village, AZ 86023, USA"
}, - "geoNameId": 5294810,
- "name": "Mystic Mountain Tours",
- "personName": "John Smith",
- "phone": "+1-555-123-4567",
- "registrationPath": "self_registration",
- "state": "Colorado",
- "statementDescriptor": "MYSTIC MOUNTAIN TOURS",
- "streetAddress": "456 Mountain View Road",
- "timezone": -7,
- "timezoneName": "America/Denver",
- "zip": "80301",
- "id": "507f1f77bcf86cd799439011",
- "version": 2,
- "enabled": true,
- "balance": 1250.5,
- "disputedBalance": 0,
- "unrecoveredBalance": 0,
- "locale": "en_US",
- "picture": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "medias": [
- {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "acceptedCards": [
- "visa",
- "mastercard",
- "amex"
], - "allowedGateways": [
- "stripe_xola",
- "stripe_oauth"
], - "defaultGateway": "stripe",
- "fees": [
- {
- "id": "string",
- "name": "string",
- "type": "string",
- "amount": 0,
- "percentage": 0,
- "applicableOn": "string"
}
], - "pluginFees": {
- "property1": { },
- "property2": { }
}, - "processingFeeFormulas": [
- {
- "method": "cc",
- "methodCategory": "card",
- "sources": [
- {
- "name": "checkout",
- "formula": "0.029 * %amount% + 0.30",
- "variableRate": 2.9,
- "fixedRate": 0.3
}
]
}
], - "partnerFeeFormulas": [
- {
- "partnerId": "string",
- "percentage": 0,
- "fixed": 0
}
], - "paymentMethods": [
- {
- "id": "string",
- "name": "string",
- "type": "string",
- "enabled": true
}
], - "remoteCards": [
- {
- "id": "string",
- "last4": "string",
- "brand": "string",
- "expiryMonth": 0,
- "expiryYear": 0
}
], - "remoteGateways": [
- {
- "id": "string",
- "gateway": "string",
- "name": "string",
- "enabled": true
}
], - "plans": [
- {
- "id": "string",
- "name": "string",
- "schedule": "string",
- "enabled": true
}
], - "subscriptionPlan": {
- "id": "string",
- "name": "string",
- "package": { },
- "addOns": [
- { }
]
}, - "stripeAccount": {
- "id": "string",
- "remoteId": "string",
- "accountType": "string",
- "country": "string",
- "enabled": true
}, - "topUpSource": {
- "id": "string",
- "type": "string",
- "last4": "string"
}, - "autoAccept": {
- "enabled": true,
- "conditions": { }
}, - "blackoutSchedules": [
- {
- "startDate": "2019-08-24",
- "endDate": "2019-08-24",
- "reason": "string"
}
], - "terms": {
- "termsLegal": "string",
- "termsHuman": "string"
}, - "preferences": {
- "booking": {
- "allowMultiItemOrders": true,
- "reservationLimit": 0
}, - "notifications": [
- {
- "type": "string",
- "channels": [
- {
- "type": "string",
- "enabled": true,
- "offset": "string",
- "negativeOffset": true
}
]
}
], - "communicationChannels": {
- "enabledChannels": [
- "email",
- "sms"
]
}, - "google": { },
- "network": { },
- "reviewPreference": {
- "id": "string",
- "destination": "off",
- "sendReviewEmailToAllTravelers": true,
- "enableSmartReview": true,
- "smartReviewThreshold": 2
}, - "gratuity": {
- "enabled": true,
- "options": [
- {
- "algorithm": "percent",
- "amount": 18
}
], - "addToReviewReminder": false,
- "message": "string",
- "commentLabel": "string",
- "enabledSources": [
- "checkout",
- "office"
], - "experiences": { }
}
}, - "roles": [
- "ROLE_SELLER",
- "ROLE_INVENTORY"
], - "delegates": [
- {
- "id": "string",
- "permissions": [
- "string"
], - "user": {
- "id": "string",
- "name": "string",
- "email": "string",
- "enabled": true
}
}
], - "meta": {
- "createCard": true,
- "xola_domain": "xola.com"
}, - "customerNotes": {
- "property1": {
- "note": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}, - "property2": {
- "note": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
}, - "bankAccountLast4": "7890",
- "bankRoutingLast4": "6789",
- "taxIdLast4": "1234",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Partially updates a seller's information. Only provided fields are updated, other fields remain unchanged. Alias for PUT with same behavior.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| bankAccount | string^[a-zA-Z0-9]+$ Bank account number for payouts |
| bankAccountType | string Enum: "checking" "savings" Type of bank account |
| bankRouting | string Bank routing number for payouts |
| businessType | string Enum: "business" "individual" Type of business entity |
| city | string City |
| company | string Legal company name |
| communicationEmail | string <email> Email address for customer communications |
| country | string Country name |
| countryCode | string^[A-Z]{2}$ ISO 3166-1 alpha-2 country code |
| currency | string^[A-Z]{3}$ ISO 4217 currency code |
string <email> Primary email address | |
| emailFooter | string Custom footer text for outgoing emails |
object (Location) Geographic location with coordinates and optional address | |
| geoNameId | integer GeoNames database ID for location |
| name | string Company or business name |
| personName | string Name of the person who created the account (populated during self-registration) |
| phone | string Contact phone number |
| registrationPath | string Enum: "xola_admin" "self_registration" How the seller account was created |
| state | string State or province |
| statementDescriptor | string <= 22 characters ^[^><'"]*$ Text that appears on customer credit card statements |
| streetAddress | string Street address |
| timezone | number <float> Deprecated Timezone offset as a float |
| timezoneName | string Timezone identifier |
| website | string <uri> Company website URL |
| zip | string <= 10 characters ZIP or postal code |
| taxId | string EIN (business) or SSN (individual) of the bank account holder (only last 4 digits are stored) |
| password | string >= 6 characters Password for new seller account (required for admin-created accounts) |
| createStripeAccount | boolean Default: true Whether to create a Stripe managed account |
{- "bankAccount": "1234567890",
- "bankAccountType": "checking",
- "bankRouting": "123456789",
- "businessType": "business",
- "city": "Boulder",
- "company": "Mystic Mountain Tours LLC",
- "communicationEmail": "bookings@mystic-mountain-tours.com",
- "country": "United States",
- "countryCode": "US",
- "currency": "USD",
- "email": "info@mystic-mountain-tours.com",
- "emailFooter": "Thank you for choosing Mystic Mountain Tours!",
- "geo": {
- "lat": 36.1069,
- "lng": -112.1129,
- "address": "Grand Canyon National Park, AZ",
- "name": "Grand Canyon Visitor Center",
- "formattedAddress": "S Entrance Rd, Grand Canyon Village, AZ 86023, USA"
}, - "geoNameId": 5294810,
- "name": "Mystic Mountain Tours",
- "personName": "John Smith",
- "phone": "+1-555-123-4567",
- "registrationPath": "self_registration",
- "state": "Colorado",
- "statementDescriptor": "MYSTIC MOUNTAIN TOURS",
- "streetAddress": "456 Mountain View Road",
- "timezone": -7,
- "timezoneName": "America/Denver",
- "zip": "80301",
- "taxId": "12-3456789",
- "password": "securePassword123",
- "createStripeAccount": true
}{- "bankAccount": "1234567890",
- "bankAccountType": "checking",
- "bankRouting": "123456789",
- "businessType": "business",
- "city": "Boulder",
- "company": "Mystic Mountain Tours LLC",
- "communicationEmail": "bookings@mystic-mountain-tours.com",
- "country": "United States",
- "countryCode": "US",
- "currency": "USD",
- "email": "info@mystic-mountain-tours.com",
- "emailFooter": "Thank you for choosing Mystic Mountain Tours!",
- "geo": {
- "lat": 36.1069,
- "lng": -112.1129,
- "address": "Grand Canyon National Park, AZ",
- "name": "Grand Canyon Visitor Center",
- "formattedAddress": "S Entrance Rd, Grand Canyon Village, AZ 86023, USA"
}, - "geoNameId": 5294810,
- "name": "Mystic Mountain Tours",
- "personName": "John Smith",
- "phone": "+1-555-123-4567",
- "registrationPath": "self_registration",
- "state": "Colorado",
- "statementDescriptor": "MYSTIC MOUNTAIN TOURS",
- "streetAddress": "456 Mountain View Road",
- "timezone": -7,
- "timezoneName": "America/Denver",
- "zip": "80301",
- "id": "507f1f77bcf86cd799439011",
- "version": 2,
- "enabled": true,
- "balance": 1250.5,
- "disputedBalance": 0,
- "unrecoveredBalance": 0,
- "locale": "en_US",
- "picture": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "medias": [
- {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "acceptedCards": [
- "visa",
- "mastercard",
- "amex"
], - "allowedGateways": [
- "stripe_xola",
- "stripe_oauth"
], - "defaultGateway": "stripe",
- "fees": [
- {
- "id": "string",
- "name": "string",
- "type": "string",
- "amount": 0,
- "percentage": 0,
- "applicableOn": "string"
}
], - "pluginFees": {
- "property1": { },
- "property2": { }
}, - "processingFeeFormulas": [
- {
- "method": "cc",
- "methodCategory": "card",
- "sources": [
- {
- "name": "checkout",
- "formula": "0.029 * %amount% + 0.30",
- "variableRate": 2.9,
- "fixedRate": 0.3
}
]
}
], - "partnerFeeFormulas": [
- {
- "partnerId": "string",
- "percentage": 0,
- "fixed": 0
}
], - "paymentMethods": [
- {
- "id": "string",
- "name": "string",
- "type": "string",
- "enabled": true
}
], - "remoteCards": [
- {
- "id": "string",
- "last4": "string",
- "brand": "string",
- "expiryMonth": 0,
- "expiryYear": 0
}
], - "remoteGateways": [
- {
- "id": "string",
- "gateway": "string",
- "name": "string",
- "enabled": true
}
], - "plans": [
- {
- "id": "string",
- "name": "string",
- "schedule": "string",
- "enabled": true
}
], - "subscriptionPlan": {
- "id": "string",
- "name": "string",
- "package": { },
- "addOns": [
- { }
]
}, - "stripeAccount": {
- "id": "string",
- "remoteId": "string",
- "accountType": "string",
- "country": "string",
- "enabled": true
}, - "topUpSource": {
- "id": "string",
- "type": "string",
- "last4": "string"
}, - "autoAccept": {
- "enabled": true,
- "conditions": { }
}, - "blackoutSchedules": [
- {
- "startDate": "2019-08-24",
- "endDate": "2019-08-24",
- "reason": "string"
}
], - "terms": {
- "termsLegal": "string",
- "termsHuman": "string"
}, - "preferences": {
- "booking": {
- "allowMultiItemOrders": true,
- "reservationLimit": 0
}, - "notifications": [
- {
- "type": "string",
- "channels": [
- {
- "type": "string",
- "enabled": true,
- "offset": "string",
- "negativeOffset": true
}
]
}
], - "communicationChannels": {
- "enabledChannels": [
- "email",
- "sms"
]
}, - "google": { },
- "network": { },
- "reviewPreference": {
- "id": "string",
- "destination": "off",
- "sendReviewEmailToAllTravelers": true,
- "enableSmartReview": true,
- "smartReviewThreshold": 2
}, - "gratuity": {
- "enabled": true,
- "options": [
- {
- "algorithm": "percent",
- "amount": 18
}
], - "addToReviewReminder": false,
- "message": "string",
- "commentLabel": "string",
- "enabledSources": [
- "checkout",
- "office"
], - "experiences": { }
}
}, - "roles": [
- "ROLE_SELLER",
- "ROLE_INVENTORY"
], - "delegates": [
- {
- "id": "string",
- "permissions": [
- "string"
], - "user": {
- "id": "string",
- "name": "string",
- "email": "string",
- "enabled": true
}
}
], - "meta": {
- "createCard": true,
- "xola_domain": "xola.com"
}, - "customerNotes": {
- "property1": {
- "note": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}, - "property2": {
- "note": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
}, - "bankAccountLast4": "7890",
- "bankRoutingLast4": "6789",
- "taxIdLast4": "1234",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Retrieves detailed information about a specific seller. Response content varies based on admin access and expand parameters.
Permission-based response fields:
ROLE_BOOKING_ENGINE delegate permission for the seller,
the response includes additional fields under preferences:preferences.communicationChannels — the seller's enabled communication channels.preferences.notifications — the seller's notification preferences configuration.| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| admin | boolean Default: false Example: admin=true Include admin-only fields (requires admin role) |
| expand | string Example: expand=defaultGateway,subscriptionPlan Comma-separated list of related objects to expand |
| exclude | string Example: exclude=preferences,meta Comma-separated list of fields to exclude from response |
{- "bankAccount": "1234567890",
- "bankAccountType": "checking",
- "bankRouting": "123456789",
- "businessType": "business",
- "city": "Boulder",
- "company": "Mystic Mountain Tours LLC",
- "communicationEmail": "bookings@mystic-mountain-tours.com",
- "country": "United States",
- "countryCode": "US",
- "currency": "USD",
- "email": "info@mystic-mountain-tours.com",
- "emailFooter": "Thank you for choosing Mystic Mountain Tours!",
- "geo": {
- "lat": 36.1069,
- "lng": -112.1129,
- "address": "Grand Canyon National Park, AZ",
- "name": "Grand Canyon Visitor Center",
- "formattedAddress": "S Entrance Rd, Grand Canyon Village, AZ 86023, USA"
}, - "geoNameId": 5294810,
- "name": "Mystic Mountain Tours",
- "personName": "John Smith",
- "phone": "+1-555-123-4567",
- "registrationPath": "self_registration",
- "state": "Colorado",
- "statementDescriptor": "MYSTIC MOUNTAIN TOURS",
- "streetAddress": "456 Mountain View Road",
- "timezone": -7,
- "timezoneName": "America/Denver",
- "zip": "80301",
- "id": "507f1f77bcf86cd799439011",
- "version": 2,
- "enabled": true,
- "balance": 1250.5,
- "disputedBalance": 0,
- "unrecoveredBalance": 0,
- "locale": "en_US",
- "picture": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "medias": [
- {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "acceptedCards": [
- "visa",
- "mastercard",
- "amex"
], - "allowedGateways": [
- "stripe_xola",
- "stripe_oauth"
], - "defaultGateway": "stripe",
- "fees": [
- {
- "id": "string",
- "name": "string",
- "type": "string",
- "amount": 0,
- "percentage": 0,
- "applicableOn": "string"
}
], - "pluginFees": {
- "property1": { },
- "property2": { }
}, - "processingFeeFormulas": [
- {
- "method": "cc",
- "methodCategory": "card",
- "sources": [
- {
- "name": "checkout",
- "formula": "0.029 * %amount% + 0.30",
- "variableRate": 2.9,
- "fixedRate": 0.3
}
]
}
], - "partnerFeeFormulas": [
- {
- "partnerId": "string",
- "percentage": 0,
- "fixed": 0
}
], - "paymentMethods": [
- {
- "id": "string",
- "name": "string",
- "type": "string",
- "enabled": true
}
], - "remoteCards": [
- {
- "id": "string",
- "last4": "string",
- "brand": "string",
- "expiryMonth": 0,
- "expiryYear": 0
}
], - "remoteGateways": [
- {
- "id": "string",
- "gateway": "string",
- "name": "string",
- "enabled": true
}
], - "plans": [
- {
- "id": "string",
- "name": "string",
- "schedule": "string",
- "enabled": true
}
], - "subscriptionPlan": {
- "id": "string",
- "name": "string",
- "package": { },
- "addOns": [
- { }
]
}, - "stripeAccount": {
- "id": "string",
- "remoteId": "string",
- "accountType": "string",
- "country": "string",
- "enabled": true
}, - "topUpSource": {
- "id": "string",
- "type": "string",
- "last4": "string"
}, - "autoAccept": {
- "enabled": true,
- "conditions": { }
}, - "blackoutSchedules": [
- {
- "startDate": "2019-08-24",
- "endDate": "2019-08-24",
- "reason": "string"
}
], - "terms": {
- "termsLegal": "string",
- "termsHuman": "string"
}, - "preferences": {
- "booking": {
- "allowMultiItemOrders": true,
- "reservationLimit": 0
}, - "notifications": [
- {
- "type": "string",
- "channels": [
- {
- "type": "string",
- "enabled": true,
- "offset": "string",
- "negativeOffset": true
}
]
}
], - "communicationChannels": {
- "enabledChannels": [
- "email",
- "sms"
]
}, - "google": { },
- "network": { },
- "reviewPreference": {
- "id": "string",
- "destination": "off",
- "sendReviewEmailToAllTravelers": true,
- "enableSmartReview": true,
- "smartReviewThreshold": 2
}, - "gratuity": {
- "enabled": true,
- "options": [
- {
- "algorithm": "percent",
- "amount": 18
}
], - "addToReviewReminder": false,
- "message": "string",
- "commentLabel": "string",
- "enabledSources": [
- "checkout",
- "office"
], - "experiences": { }
}
}, - "roles": [
- "ROLE_SELLER",
- "ROLE_INVENTORY"
], - "delegates": [
- {
- "id": "string",
- "permissions": [
- "string"
], - "user": {
- "id": "string",
- "name": "string",
- "email": "string",
- "enabled": true
}
}
], - "meta": {
- "createCard": true,
- "xola_domain": "xola.com"
}, - "customerNotes": {
- "property1": {
- "note": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}, - "property2": {
- "note": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
}, - "bankAccountLast4": "7890",
- "bankRoutingLast4": "6789",
- "taxIdLast4": "1234",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Enables a seller account by setting enabled status to true. Also reactivates associated subscription plans if applicable.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Disables a seller account by setting enabled status to false. Also deactivates the account and associated subscription plans.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Updates the list of payment gateways allowed for a seller. Admin-only endpoint. Automatically creates Stripe managed accounts if Xola Stripe platform gateway is enabled and seller doesn't have one.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| allowedGateways required | Array of strings Items Enum: "stripe_xola" "stripe_xola_canada" "stripe_oauth" "stripe_api_key" "authorize_net_aim" "authorize_net_cim" "cybersource" List of allowed payment gateway types. Available options:
|
{- "allowedGateways": [
- "stripe_xola",
- "stripe_oauth"
]
}[- "stripe_xola",
- "stripe_oauth"
]Updates Know Your Customer (KYC) information for a seller. This information is used for payment processing compliance.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| accountHolderName required | string Legal name of the account holder |
| dateOfBirth required | string <date> Date of birth of the account holder |
{- "accountHolderName": "John Smith",
- "dateOfBirth": "1985-03-15"
}[- null
]Alias for POST /sellers/{id}/kycInfo
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| accountHolderName required | string Legal name of the account holder |
| dateOfBirth required | string <date> Date of birth of the account holder |
{- "accountHolderName": "John Smith",
- "dateOfBirth": "1985-03-15"
}[- null
]Creates a Stripe Account Session for rendering embedded Stripe Connect components.
This endpoint generates a clientSecret that can be used to initialize Stripe embedded
components such as payment_method_settings, disputes_list, and payment_disputes on the seller's dashboard.
Requirements:
VIEW_SELLER_SEMI_PRIVATE_DATA permission at the route level.Supported Components and Permissions:
payment_method_settings: Allows sellers to manage their payment method settings. This component is in preview and requires a Stripe beta header. Requires EDIT_USER_STRIPE_ACCOUNT permission.disputes_list: Displays a list of disputes for the seller's Stripe account. Automatically enables destination_on_behalf_of_charge_management and dispute_management features, while disabling capture_payments and refund_management. Requires VIEW_SELLER_STRIPE_DISPUTES permission.payment_disputes: Displays and manages payment disputes. Enables destination_on_behalf_of_charge_management and dispute_management features, while disabling refund_management. Requires EDIT_SELLER_STRIPE_DISPUTES permission.| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
required | object non-empty A map of Stripe embedded component names to their configuration. Each key is a component name, and the value is the component-specific configuration object. |
{- "components": {
- "payment_method_settings": { }
}
}{- "clientSecret": "acss_secret_abc123..."
}Add a note to a customer (traveler) on the given seller account.
Requires the EDIT_USER_CUSTOMERS permission on the seller.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| travelerId required | string Example: 507f1f77bcf86cd799439012 Traveler (customer) ID |
| text required | string Note content |
{- "text": "VIP customer - offer complimentary upgrade"
}{- "id": "507f1f77bcf86cd799439011",
- "text": "Customer requested a window seat",
- "created": "2019-08-24T14:15:22Z",
- "updated": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": false
}Update the text of an existing customer note. System-generated notes
cannot be edited and return a 403 response.
Requires the EDIT_USER_CUSTOMERS permission on the seller.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| travelerId required | string Example: 507f1f77bcf86cd799439012 Traveler (customer) ID |
| noteId required | string Example: 507f1f77bcf86cd799439013 Note ID |
| text required | string Updated note content |
| system | boolean Whether the note is a system-generated note. |
{- "text": "VIP customer - complimentary upgrade already applied"
}{- "id": "507f1f77bcf86cd799439011",
- "text": "Customer requested a window seat",
- "created": "2019-08-24T14:15:22Z",
- "updated": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": false
}Delete a customer note. System-generated notes cannot be removed and
return a 403 response.
Requires the EDIT_USER_CUSTOMERS permission on the seller.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| travelerId required | string Example: 507f1f77bcf86cd799439012 Traveler (customer) ID |
| noteId required | string Example: 507f1f77bcf86cd799439013 Note ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Uploads the primary picture/logo for a seller account. This sets the main profile image displayed for the seller.
Supports both xhr upload (with qqfile parameter) and form upload.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| qqfile | string Example: qqfile=logo.jpg Filename for xhr upload |
| qqfile | string <binary> Image file to upload |
| target | string Target usage for the media |
{- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z",
- "target": "string"
}Uploads additional media files for a seller account (beyond the primary logo). These can include promotional images, videos, or documents.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| qqfile | string Example: qqfile=promo-image.jpg Filename for xhr upload |
| qqfile | string <binary> Media file to upload |
| target | string Target usage for the media |
{- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z",
- "target": "string"
}Retrieves all media files associated with a seller account. Results can be filtered by target usage and media type.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| target | string Example: target=checkout_banner Filter by target usage |
| type | string Enum: "photo" "video" "document" Example: type=photo Filter by media type |
[- {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z",
- "target": "string"
}
]Retrieves a specific media file for a seller, with optional resizing. Returns a redirect to the actual media file URL.
Parameter Precedence: If both width AND height are specified, they take precedence over the size preset. If only width OR only height is provided (not both), the size preset will be used instead. If neither width/height nor size is provided, the original image is returned.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| mediaId required | string Example: 507f1f77bcf86cd799439012 Media file ID |
| width | integer [ 1 .. 2000 ] Example: width=300 Desired image width in pixels |
| height | integer [ 1 .. 2000 ] Example: height=200 Desired image height in pixels |
| size | string Enum: "small" "medium" "large" "thumbnail" Example: size=medium Predefined size preset with specific dimensions:
|
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Activates a feature flag for a seller account. This endpoint enables specific features for sellers based on their subscription plan and permissions.
Authorization:
Feature Validation:
Side Effects:
| id required | string (id) ^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439012 The seller ID |
| featureId required | string Example: advancedReporting The feature ID to activate |
Feature ID in request body (alternative to path parameter)
| id | string The feature ID to activate |
{- "id": "mobileApp"
}{- "id": "advancedReporting"
}Alternative PUT method for activating a feature flag for a seller account. Behaves identically to the POST method.
See the POST method documentation for complete details on authorization, validation, and side effects.
| id required | string (id) ^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439012 The seller ID |
| featureId required | string Example: advancedReporting The feature ID to activate |
Feature ID in request body (alternative to path parameter)
| id | string The feature ID to activate |
{- "id": "mobileApp"
}{- "id": "advancedReporting"
}Deactivates a feature flag for a seller account. This removes access to the specified feature for the seller.
Authorization:
Side Effects:
Important: Deactivating a feature may affect the seller's subscription package eligibility and will notify Xola staff for review.
| id required | string (id) ^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439012 The seller ID |
| featureId required | string Example: advancedReporting The feature ID to deactivate |
{- "errors": {
- "id": "Feature advancedReporting does not exist"
}
}Create a new check-in rule for ticket validation during guest check-in process. Rules can be mandatory or optional and can display validation results on tickets.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| name required | string Name of the check-in rule |
| required | boolean Whether this rule must be validated during guest check-in |
| showOnTicket | boolean Whether validation result appears on the ticket |
| passText | string Text to show on ticket if the rule passes validation |
| failText | string Text to show on ticket if the rule fails validation |
{- "name": "Age Verification",
- "required": true,
- "showOnTicket": true,
- "passText": "Age verified ✓",
- "failText": "Age verification required"
}{- "name": "Age Verification",
- "required": true,
- "showOnTicket": true,
- "passText": "Age verified ✓",
- "failText": "Age verification required",
- "id": "507f1f77bcf86cd799439011"
}Update an existing check-in rule by ID
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| ruleId required | string Example: 507f1f77bcf86cd799439012 Check-in rule ID |
| name required | string Name of the check-in rule |
| required | boolean Whether this rule must be validated during guest check-in |
| showOnTicket | boolean Whether validation result appears on the ticket |
| passText | string Text to show on ticket if the rule passes validation |
| failText | string Text to show on ticket if the rule fails validation |
{- "name": "Age Verification",
- "required": true,
- "showOnTicket": true,
- "passText": "Age verified ✓",
- "failText": "Age verification required"
}{- "name": "Age Verification",
- "required": true,
- "showOnTicket": true,
- "passText": "Age verified ✓",
- "failText": "Age verification required",
- "id": "507f1f77bcf86cd799439011"
}Remove a check-in rule by ID
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| ruleId required | string Example: 507f1f77bcf86cd799439012 Check-in rule ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Configure custom styling preferences for user interface customization. Requires admin role permissions.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| seller | string or null <uri> URL pointing to a remote CSS file for seller interface customization |
| checkout | string or null <uri> URL pointing to a remote CSS file for checkout page customization |
| checkoutV2 | string or null <uri> URL pointing to a remote CSS file for the V2 checkout page customization |
| traveler | string or null <uri> URL pointing to a remote CSS file for traveler interface customization |
| ticket | string or null <uri> URL pointing to a remote CSS file for order ticket page customization |
{
}{
}Configure custom styling preferences for user interface customization. Requires admin role permissions.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| seller | string or null <uri> URL pointing to a remote CSS file for seller interface customization |
| checkout | string or null <uri> URL pointing to a remote CSS file for checkout page customization |
| checkoutV2 | string or null <uri> URL pointing to a remote CSS file for the V2 checkout page customization |
| traveler | string or null <uri> URL pointing to a remote CSS file for traveler interface customization |
| ticket | string or null <uri> URL pointing to a remote CSS file for order ticket page customization |
{
}{
}Configure booking behavior preferences including post-booking actions, order limitations, and itemization settings.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| postBookingAction | string or null Action to be performed post booking |
| allowMultiItemOrders | boolean or null Whether to allow multiple items in a single order (deprecated) |
| allowMultiplePrivateEvents | boolean or null Whether multiple private events can be created for the same timeslot |
| allowPastDates | boolean or null Whether past dates are available when making a booking or switching arrival/experience |
| allowBookingEngineOrderModification | boolean or null Whether booking engine orders can be modified by the seller |
| timeslotReservationLimit | integer or null >= 1 Maximum number of reserved reservations allowed for any given time slot, across all experiences |
| reservationLimit | integer or null >= 1 Maximum number of experience items an order should be limited to in case of MIST booking |
object or null Order itemization settings | |
| defaultPriceStrategyForPurchaseEdit | string or null Default strategy for the retain price toggle in all purchase modification screens |
{- "postBookingAction": "goToDashboard",
- "allowMultiItemOrders": true,
- "allowMultiplePrivateEvents": false,
- "allowPastDates": false,
- "allowBookingEngineOrderModification": false,
- "timeslotReservationLimit": 10,
- "reservationLimit": 5,
- "orderItemization": {
- "enabled": false
}, - "defaultPriceStrategyForPurchaseEdit": "retain"
}{- "postBookingAction": "goToDashboard",
- "allowMultiItemOrders": true,
- "allowMultiplePrivateEvents": false,
- "allowPastDates": false,
- "allowBookingEngineOrderModification": false,
- "timeslotReservationLimit": 10,
- "reservationLimit": 5,
- "orderItemization": {
- "enabled": true
}, - "defaultPriceStrategyForPurchaseEdit": "retain"
}Configure payment processing preferences including billing requirements, 3D Secure settings, tax calculation, and fraud prevention.
Note: V2 sellers cannot disable 3D Secure - contact support for assistance.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| requireAdditionalBillingInfo | boolean Whether to require additional billing information during card payment |
| threeDSecureEnabled | boolean Whether 3D Secure transactions are enabled |
| taxAssessedOn | string Enum: "promotional_value" "purchase_value" How tax is calculated when voucher is applied |
| refundProcessingFee | boolean Whether CC processing fee is returned upon full order refund |
| enforcePostalCode | boolean Whether postal code is required during billing |
object Fraud prevention settings |
{- "requireAdditionalBillingInfo": true,
- "threeDSecureEnabled": true,
- "taxAssessedOn": "purchase_value",
- "refundProcessingFee": false,
- "fraud": {
- "threeDSecureTriggerAmount": 100,
- "identityVerification": {
- "enabled": true,
- "selectedExperiences": {
- "all": true,
- "experiences": [ ]
}
}
}
}{- "requireAdditionalBillingInfo": true,
- "threeDSecureEnabled": true,
- "taxAssessedOn": "purchase_value",
- "refundProcessingFee": false,
- "enforcePostalCode": true,
- "fraud": {
- "threeDSecureTriggerAmount": 100,
- "identityVerification": {
- "enabled": false,
- "selectedExperiences": {
- "all": true,
- "experiences": [ ]
}
}
}
}Configure custom branding preferences including SMTP settings for branded emails. All SMTP fields are required when configuring custom email branding.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| emailFooter | string or null Custom footer text for email templates |
| receiptFooter | string or null Custom footer text for receipt emails |
object or null Custom SMTP configuration for branded emails (all fields required when configuring) |
{- "customSmtp": {
- "host": "smtp.example.com",
- "port": 587,
- "userName": "noreply@example.com",
- "password": "password123"
}
}{- "emailFooter": "Thank you for choosing our service!",
- "receiptFooter": "Visit our website for more information",
- "customSmtp": {
- "host": "smtp.example.com",
- "port": 587,
- "userName": "noreply@example.com",
- "password": "password123",
- "encryption": "tls"
}
}Configure custom branding preferences including SMTP settings for branded emails. All SMTP fields are required when configuring custom email branding.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| emailFooter | string or null Custom footer text for email templates |
| receiptFooter | string or null Custom footer text for receipt emails |
object or null Custom SMTP configuration for branded emails (all fields required when configuring) |
{- "emailFooter": "Thank you for choosing our service!",
- "receiptFooter": "Visit our website for more information",
- "customSmtp": {
- "host": "smtp.example.com",
- "port": 587,
- "userName": "noreply@example.com",
- "password": "password123",
- "encryption": "tls"
}
}{- "emailFooter": "Thank you for choosing our service!",
- "receiptFooter": "Visit our website for more information",
- "customSmtp": {
- "host": "smtp.example.com",
- "port": 587,
- "userName": "noreply@example.com",
- "password": "password123",
- "encryption": "tls"
}
}Configure checkout process preferences including price display options and themes.
Price display options:
Some options require specific permissions (X2 checkout).
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| priceDisplay | string Enum: "hide" "range" "lowest" "base" How pricing information is displayed during checkout:
|
| includeFees | boolean Include taxes and fees in the final price displayed on checkout |
| displayEventDuration | boolean Display duration of event on checkout |
| showTaxesAndFeesBreakdown | boolean Show a taxes and fees breakdown in the checkout app |
| showExcerptInTile | boolean Show the product excerpt in the multi-item checkout tile |
object or null Checkout theme configuration | |
| x2Probability | number [ 0 .. 1 ] X2 checkout probability (requires X2 checkout permission) |
object or null Checkout flow weights configuration | |
Array of objects Footer links configuration |
{- "priceDisplay": "range"
}{- "priceDisplay": "range",
- "includeFees": false,
- "displayEventDuration": true,
- "showTaxesAndFeesBreakdown": true,
- "showExcerptInTile": false,
- "theme": {
- "id": "507f1f77bcf86cd799439011"
}, - "x2Probability": 1,
- "flowWeights": {
- "property1": 0,
- "property2": 0
},
}Configure checkout process preferences including price display options and themes.
Price display options:
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| priceDisplay | string Enum: "hide" "range" "lowest" "base" How pricing information is displayed during checkout:
|
| includeFees | boolean Include taxes and fees in the final price displayed on checkout |
| displayEventDuration | boolean Display duration of event on checkout |
| showTaxesAndFeesBreakdown | boolean Show a taxes and fees breakdown in the checkout app |
| showExcerptInTile | boolean Show the product excerpt in the multi-item checkout tile |
object or null Checkout theme configuration | |
| x2Probability | number [ 0 .. 1 ] X2 checkout probability (requires X2 checkout permission) |
object or null Checkout flow weights configuration | |
Array of objects Footer links configuration |
{- "priceDisplay": "range",
- "includeFees": false,
- "displayEventDuration": true,
- "showTaxesAndFeesBreakdown": true,
- "showExcerptInTile": false,
- "theme": {
- "id": "507f1f77bcf86cd799439011"
}, - "x2Probability": 1,
- "flowWeights": {
- "property1": 0,
- "property2": 0
},
}{- "priceDisplay": "range",
- "includeFees": false,
- "displayEventDuration": true,
- "showTaxesAndFeesBreakdown": true,
- "showExcerptInTile": false,
- "theme": {
- "id": "507f1f77bcf86cd799439011"
}, - "x2Probability": 1,
- "flowWeights": {
- "property1": 0,
- "property2": 0
},
}Configure date picker widget preferences including theme, format, and locale settings
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| displayType | string Enum: "none" "price" "count" Type of information to display on date picker:
|
| priceDisplay | string Enum: "lowest" "highest" Which price to display when displayType is 'price':
|
| unavailableMessage | string or null <= 15 characters Custom message to show when a date is unavailable (max 15 characters) |
| unavailableScheduleMessage | string or null Custom message to show when a schedule is not available for the date |
| showUnavailableTimes | boolean or null Whether to show unavailable time slots in front-office datepicker |
| displayCountMax | integer or null >= 0 Show availability count only if below this value |
| showNextDayTimeslotsTill | integer or null [ 0 .. 2359 ] Time in military format - show next day timeslots until this time |
| showCurrentDayTimeslotsAfter | integer or null [ 0 .. 2359 ] Time in military format - hide current day timeslots before this time |
{- "displayType": "price",
- "priceDisplay": "highest",
- "unavailableMessage": "Sold Out",
- "unavailableScheduleMessage": "No times available",
- "showUnavailableTimes": false,
- "displayCountMax": 10,
- "showNextDayTimeslotsTill": 200,
- "showCurrentDayTimeslotsAfter": 600
}{- "displayType": "price",
- "priceDisplay": "highest",
- "unavailableMessage": "Sold Out",
- "unavailableScheduleMessage": "No times available",
- "showUnavailableTimes": false,
- "displayCountMax": 10,
- "showNextDayTimeslotsTill": 200,
- "showCurrentDayTimeslotsAfter": 600
}Configure gift certificate preferences including email templates and additional experience visibility
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| enabled | boolean or null Whether gift feature is enabled |
| showAdditionalExperiences | boolean or null Whether additional bookable experiences are included in gift emails |
| customerPhoneRequired | boolean or null Whether customer phone number is mandatory upon purchase |
| captchaEnabled | boolean or null Whether captcha is enabled for gift purchases |
| allowMultiItemGifts | boolean or null Whether to allow multiple items in gift purchases (deprecated) |
| showDemographics | boolean or null Whether to show demographics in gift purchase flow (deprecated) |
{- "showAdditionalExperiences": true
}{- "enabled": true,
- "showAdditionalExperiences": true,
- "customerPhoneRequired": true,
- "captchaEnabled": true,
- "allowMultiItemGifts": true,
- "showDemographics": true
}Configure notification preferences for all notification types. Updates the complete notification preferences configuration.
Abandoned Recovery Preferences:
The abandoned_recovery_to_traveler type supports configurable multi-email recovery sequences.
Each email channel can have a different offset, and a send window (sendStartTime/sendEndTime)
can restrict when emails are sent. If a computed send time falls outside the window, it is
delayed to the next window start.
Validation:
For abandoned_recovery_to_traveler, all enabled email channel offsets must be at least
240 minutes (4 hours) apart. If violated, a 400 error is returned with:
{
"channels": {
"reason": "invalid_offset_gaps",
"message": "Reminder offsets must be at least 4 hours apart."
}
}
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
Array of objects (NotificationPreferenceRequest) Array of notification preferences |
{- "preferences": [
- {
- "type": "booking_confirmation",
- "channels": [
- {
- "type": "email",
- "enabled": true,
- "offset": "PT0S",
- "negativeOffset": false
}
]
}, - {
- "type": "booking_reminder",
- "channels": [
- {
- "type": "email",
- "enabled": true,
- "offset": "PT1H",
- "negativeOffset": true
}
]
}
]
}{- "preferences": [
- {
- "type": "booking_confirmation",
- "channels": [
- {
- "type": "email",
- "enabled": true,
- "offset": "PT1H",
- "negativeOffset": false
}
], - "sendStartTime": 900,
- "sendEndTime": 2100
}
]
}Configure notification preferences for all notification types. Updates the complete notification preferences configuration.
See POST endpoint for details on abandoned_recovery_to_traveler type,
send window configuration, and offset gap validation.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
Array of objects (NotificationPreferenceRequest) Array of notification preferences |
{- "preferences": [
- {
- "type": "booking_confirmation",
- "channels": [
- {
- "type": "email",
- "enabled": true,
- "offset": "PT1H",
- "negativeOffset": false
}
], - "sendStartTime": 900,
- "sendEndTime": 2100
}
]
}{- "preferences": [
- {
- "type": "booking_confirmation",
- "channels": [
- {
- "type": "email",
- "enabled": true,
- "offset": "PT1H",
- "negativeOffset": false
}
], - "sendStartTime": 900,
- "sendEndTime": 2100
}
]
}Update a specific notification preference by notification type. The notification type in the URL must match the type field in the request body.
For abandoned_recovery_to_traveler type, optional sendStartTime and sendEndTime
fields can be included to configure a send window (military time format).
All enabled email channel offsets must be at least 240 minutes (4 hours) apart,
or a 400 error with reason invalid_offset_gaps is returned.
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| notificationType required | string Example: abandoned_recovery_to_traveler Notification type to update |
| type required | string Type of notification. Common values include |
required | Array of objects Notification channels and their settings. For |
| sendStartTime | integer [ 0 .. 2359 ] Start of the send window in military |
| sendEndTime | integer [ 0 .. 2359 ] End of the send window in military |
{- "type": "booking_confirmation",
- "channels": [
- {
- "type": "email",
- "enabled": true,
- "offset": "PT0S",
- "negativeOffset": false
}
]
}{- "preferences": [
- {
- "type": "booking_confirmation",
- "channels": [
- {
- "type": "email",
- "enabled": true,
- "offset": "PT1H",
- "negativeOffset": false
}
], - "sendStartTime": 900,
- "sendEndTime": 2100
}
]
}Configure Google Analytics, Tag Manager, and advertising integration preferences
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| gtmId | string or null Google Tag Manager ID specified for this user |
Array of objects Array of Google Places associated with the user |
{- "gtmId": "GTM-XXXXXXX",
- "places": [
- {
- "placeId": "ChIJN1t_tDeuEmsRUsoyG83frY4",
- "name": "Google Sydney",
- "address": "48 Pirrama Rd, Pyrmont NSW 2009, Australia"
}
]
}{- "gtmId": "GTM-XXXXXXX",
- "places": [
- {
- "placeId": "string",
- "name": "string",
- "address": "string"
}
]
}Create a new conversion tracking configuration for marketing platforms
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| enabled | boolean or null Whether this conversion tracking is enabled |
| label | string or null Label/name for this tracking configuration |
| code | string or null Code template with variables for conversion tracking. Available variables: order.amount, order.purchaseAmount, order.currency, order.id, order.productId, order.productName, order.productType, order.quantity, order.arrival, order.couponCode, session, order.seller.id, order.seller.name, order.seller.city, order.seller.state, order.seller.country, order.seller.countryCode |
{- "enabled": false,
- "label": "Facebook Conversion Tracking",
- "code": "fbq('track', 'Purchase');"
}{- "enabled": true,
- "label": "Facebook Conversion Tracking",
- "code": "gtag('event', 'purchase', { value: {{order.amount}}, currency: '{{order.currency}}' });",
- "id": "507f1f77bcf86cd799439011"
}Update an existing conversion tracking configuration
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| trackingId required | string Example: 507f1f77bcf86cd799439012 Conversion tracking ID |
| enabled | boolean or null Whether this conversion tracking is enabled |
| label | string or null Label/name for this tracking configuration |
| code | string or null Code template with variables for conversion tracking. Available variables: order.amount, order.purchaseAmount, order.currency, order.id, order.productId, order.productName, order.productType, order.quantity, order.arrival, order.couponCode, session, order.seller.id, order.seller.name, order.seller.city, order.seller.state, order.seller.country, order.seller.countryCode |
{- "enabled": true,
- "label": "Facebook Conversion Tracking",
- "code": "gtag('event', 'purchase', { value: {{order.amount}}, currency: '{{order.currency}}' });"
}{- "enabled": true,
- "label": "Facebook Conversion Tracking",
- "code": "gtag('event', 'purchase', { value: {{order.amount}}, currency: '{{order.currency}}' });",
- "id": "507f1f77bcf86cd799439011"
}Configure Facebook Pixel tracking for conversion monitoring and remarketing
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| enabled | boolean Whether Facebook Pixel tracking is enabled |
| facebookPixelId | string Facebook Pixel ID |
| allowAdvancedConversionTracking | boolean Whether to allow advanced conversion tracking |
| accessToken | string Facebook access token for advanced features |
{- "enabled": false,
- "facebookPixelId": "123456789012345",
- "allowAdvancedConversionTracking": false,
- "accessToken": "EAABwzLixnjYBAJWY5OlkUF3..."
}{- "enabled": false,
- "facebookPixelId": "123456789012345",
- "allowAdvancedConversionTracking": false,
- "accessToken": "EAABwzLixnjYBAJWY5OlkUF3..."
}Configure affiliate program settings including commission rates and cookie duration
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| allowLogin | boolean Whether affiliates should be allowed to login into Xola |
object Affiliate credit line configuration |
{- "allowLogin": false,
- "affiliateCreditLine": {
- "enabled": false,
- "enableLowBalanceWarning": false,
- "creditLimitPercentageForWarning": 20,
- "lowBalanceReminderInterval": "P2D"
}
}{- "allowLogin": false,
- "affiliateCreditLine": {
- "enabled": false,
- "enableLowBalanceWarning": false,
- "creditLimitPercentageForWarning": 20,
- "lowBalanceReminderInterval": "P2D"
}
}Configure inventory and booking automation preferences
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| allocationStrategy | string Enum: "smallest_first" "largest_first" "custom_assignment" Strategy to be used while assigning resources to events:
|
Array of objects Sorted list of resources (only for custom_assignment strategy) |
{- "allocationStrategy": "largest_first",
- "prioritizedResources": [ ]
}{- "allocationStrategy": "largest_first",
- "prioritizedResources": [
- {
- "resourceId": "507f1f77bcf86cd799439011",
- "priority": 1
}, - {
- "resourceId": "507f1f77bcf86cd799439012",
- "priority": 2
}
]
}Configure customer review and rating collection preferences
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| destination | string Enum: "off" "xola" "googlePlus" "tripAdvisor" "yelp" "custom" Review destination platform |
| reviewTemplate | string or null Custom review template (required when destination is 'custom') |
| reviewLink | string or null <uri> Custom review link URL (required when destination is 'googlePlus') |
| sendReviewEmailToAllTravelers | boolean Whether to send review email to all travelers in the booking.
Note: For experience-level review preference endpoints
( |
| enableSmartReview | boolean Whether to enable smart review redirection. When enabled, travelers who leave a
rating greater than or equal to |
| smartReviewThreshold | integer [ 2 .. 5 ] Minimum rating required to redirect a traveler to the external review platform when smart review is enabled. Must be between 2 and 5 (inclusive). Defaults to 4. |
{- "destination": "xola",
- "reviewTemplate": null,
- "reviewLink": null,
- "sendReviewEmailToAllTravelers": false
}{- "destination": "xola",
- "reviewTemplate": "Please leave us a review at our custom platform",
- "sendReviewEmailToAllTravelers": false,
- "enableSmartReview": false,
- "smartReviewThreshold": 4
}Update customer review and rating collection preferences
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| destination | string Enum: "off" "xola" "googlePlus" "tripAdvisor" "yelp" "custom" Review destination platform |
| reviewTemplate | string or null Custom review template (required when destination is 'custom') |
| reviewLink | string or null <uri> Custom review link URL (required when destination is 'googlePlus') |
| sendReviewEmailToAllTravelers | boolean Whether to send review email to all travelers in the booking.
Note: For experience-level review preference endpoints
( |
| enableSmartReview | boolean Whether to enable smart review redirection. When enabled, travelers who leave a
rating greater than or equal to |
| smartReviewThreshold | integer [ 2 .. 5 ] Minimum rating required to redirect a traveler to the external review platform when smart review is enabled. Must be between 2 and 5 (inclusive). Defaults to 4. |
{- "destination": "xola",
- "reviewTemplate": "Please leave us a review at our custom platform",
- "sendReviewEmailToAllTravelers": false,
- "enableSmartReview": false,
- "smartReviewThreshold": 4
}{- "destination": "xola",
- "reviewTemplate": "Please leave us a review at our custom platform",
- "sendReviewEmailToAllTravelers": false,
- "enableSmartReview": false,
- "smartReviewThreshold": 4
}Remove review and rating collection preferences
| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Configure split payment preferences for a specific user. Split payment allows customers to pay in multiple installments with configurable deadlines.
Key Features:
| id required | string Example: 507f1f77bcf86cd799439011 User ID |
| isEnabled | boolean Whether split payment option is enabled for this user |
| paymentDeadline | integer >= 1 Payment deadline in minutes after booking creation |
| autoChargeOnDeadline | boolean Whether to automatically charge the remaining balance when payment deadline is reached |
{- "isEnabled": true,
- "paymentDeadline": 1440,
- "autoChargeOnDeadline": false
}{- "isEnabled": true,
- "paymentDeadline": 1440,
- "autoChargeOnDeadline": false
}Configure availability timeline display preferences for a specific user. Controls how availability information is shown in calendar and booking widgets.
Display Options:
| id required | string Example: 507f1f77bcf86cd799439011 User ID |
| showUnavailable | boolean Whether to display unavailable dates/times on the timeline |
| unavailableMessage | string or null <= 15 characters Custom message to display for unavailable dates (maximum 15 characters) |
| showPrice | boolean Whether to display pricing information on timeline items |
| showOpen | boolean Whether to show available/open slots on the timeline |
| maxDays | integer or null >= 1 Maximum number of days to display in the timeline |
| showOpenMax | integer or null >= 1 Maximum number of open slots to display per day |
| showExcerpt | boolean Whether to display additional excerpt/description information |
{- "showUnavailable": true,
- "unavailableMessage": "Sold Out",
- "showPrice": true,
- "showOpen": true,
- "maxDays": 365,
- "showOpenMax": 10,
- "showExcerpt": false
}{- "showUnavailable": true,
- "unavailableMessage": "Sold Out",
- "showPrice": true,
- "showOpen": true,
- "maxDays": 365,
- "showOpenMax": 10,
- "showExcerpt": false
}Create or update the data retention preference for a seller. When enabled, maskable customer PII (personally identifiable information) associated with purchase items will automatically be cleared after the specified duration following the purchase fulfillment date.
Duration Constraints:
P180D, P1Y, P6M)P180D (180 days)enabled is trueAuthorization:
EDIT_USER_DATA_RETENTION_PREFERENCE permission on the seller| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| enabled | boolean Whether automatic data retention (PII masking) is enabled for the seller |
| duration | string or null ISO 8601 duration after purchase fulfillment date when maskable customer data should
be cleared. Required when |
{- "enabled": true,
- "duration": "P365D"
}{- "enabled": true,
- "duration": "P365D"
}Create or update the data retention preference for a seller. When enabled, maskable customer PII (personally identifiable information) associated with purchase items will automatically be cleared after the specified duration following the purchase fulfillment date.
Duration Constraints:
P180D, P1Y, P6M)P180D (180 days)enabled is trueAuthorization:
EDIT_USER_DATA_RETENTION_PREFERENCE permission on the seller| id required | string Example: 507f1f77bcf86cd799439011 Seller ID |
| enabled | boolean Whether automatic data retention (PII masking) is enabled for the seller |
| duration | string or null ISO 8601 duration after purchase fulfillment date when maskable customer data should
be cleared. Required when |
{- "enabled": true,
- "duration": "P365D"
}{- "enabled": true,
- "duration": "P365D"
}Retrieve the global questionnaire form for a seller. This form applies to all experiences when no experience-specific form exists.
| id required | string Example: 507f191e810c19729de860ea The unique identifier of the seller |
{- "id": "507f1f77bcf86cd799439011",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "product": {
- "id": "507f1f77bcf86cd799439011"
}, - "productType": "experience",
- "organizerOnly": true,
- "fields": [
- {
- "label": "Full Name",
- "description": "Please enter your full legal name as it appears on your ID",
- "type": "text",
- "width": 3,
- "suffix": "lbs",
- "help": "This information helps us provide proper equipment",
- "required": true,
- "roster": false,
- "readonly": false,
- "organizerOnly": true,
- "displayStep": "afterPayment",
- "visibility": "all",
- "seq": 1,
- "options": [
- "None",
- "Vegetarian",
- "Vegan",
- "Gluten-free"
], - "id": "60f1f7bc5f6d2a3b4c8e9d12"
}
], - "optionalSourcesList": [
- "direct",
- "partner"
], - "deletedAt": "2019-08-24T14:15:22Z"
}The Timeslots API returns availability and pricing data for a given experience at a specific date and time. This is a more advanced version of the availability API, and provides additional data beyond just the availability.
The main attributes in a timeslot object are:
| Attribute | Type | Definition |
|---|---|---|
product |
string | The experience which this timeslot is for |
date |
string | The date for this timeslot as a YYYY-MM-DD string |
time |
int | The time for this timeslot in military format as an integer |
arrivalDatetime |
string | The exact arrival date and time as an ISO datetime string |
end |
string | The end time for this timeslot as an ISO datetime string |
capacity.open |
int | The availability for this timeslot |
capacity.max |
int | The max quantity that can be booked for this timeslot |
privacy |
string | The privacy supported for this experience. Possible values: public, private |
scheduleType |
string | The schedule type for this experience. Possible values: day, time. A scheduleType of time indicates a specific start and end time, while day indicates an "all day" experience with no fixed timeslots |
units |
Unit[] | A list of all purchasable demographics (and merchandise) with their price for the particular timeslot. Optional |
canBook |
boolean | A simple flag which indicates if a booking can be placed for this timeslot. Optional |
canWaitlist |
boolean | A simple flag which indicates if a waitlist entry can be placed for this timeslot. Present only if canBook is false |
Sample timeslot
{
"product": "65bb71b277c4c31b7c0cdcba",
"time": 1500,
"scheduleType": "time",
"date": "2025-05-13",
"arrivalDatetime": "2025-05-13T15:00:00-04:00",
"end": "2025-05-13T15:59:59-04:00",
"privacy": "public",
"id": "65bb71b277c4c31b7c0cdcba_2025-05-13",
"capacity": {
"open": 5,
"max": 5
},
"canBook": true,
"units": [
{
"price": 100,
"id": "65798d7f7d106453ee05c767",
"type": "demographic",
"code": "adult",
"priceType": "person"
},
{
"price": 50,
"id": "65798d807d106453ee05c76a",
"type": "demographic",
"code": "child",
"priceType": "person"
}
]
}
Retrieve available timeslots for experiences. This is a public endpoint that provides detailed schedule information including available time slots, capacity, pricing, and additional data based on included fields.
This endpoint does not require authentication for basic usage. However,
authenticated requests from booking engine users (ROLE_BOOKING_ENGINE) unlock
additional behavior:
includeFees: When provided, controls whether taxes and fees are included
in unit prices returned in the response. This parameter is accepted for
authenticated booking engine users as well as other authenticated users.source handling: For booking engine users, the source is
automatically set from the user's configured default source. There is no need
to pass source explicitly.For unauthenticated (checkout) requests, the source defaults to checkout and
includeFees is determined by the seller's checkout preferences.
Supports comma-separated values for array parameters and comprehensive filtering options for capacity, guides, resources, and schedule types.
Booking Engine Users: For authenticated booking engine users (ROLE_BOOKING_ENGINE),
the source is automatically set from the user's default source. The includeFees
query parameter is accepted to control whether unit prices include taxes and fees.
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
string or Array of strings Example: product=507f1f77bcf86cd799439011,507f1f77bcf86cd799439012 Filter by product/experience ID(s). Can be a single ID or comma-separated list. | |
| seller | string Example: seller=507f1f77bcf86cd799439013 Filter by seller ID |
string or string or Array of strings Examples:
Start date/time for timeslots. Can be:
| |
| end | string <date> Example: end=2024-12-20 End date for timeslots (used with start parameter) |
| timezone | string Example: timezone=America/New_York Timezone for the timeslots (IANA timezone identifier) |
string or Array of strings Example: scheduleType=time,day Filter by schedule type(s). Can be comma-separated list. | |
| capacity.open[gt] | integer >= 0 Example: capacity.open[gt]=5 Filter timeslots with open capacity greater than specified value |
| capacity_open[gt] | integer >= 0 Example: capacity_open[gt]=5 Alternative syntax for capacity.open[gt] (underscores instead of dots) |
| capacity_reserved | integer >= 0 Example: capacity_reserved=10 Filter by reserved capacity |
string or Array of strings Example: guide=507f1f77bcf86cd799439015 Filter by assigned guide ID(s). Can be comma-separated list. | |
string or Array of strings Example: resource=507f1f77bcf86cd799439016 Filter by resource ID(s). Can be comma-separated list. | |
| event | string Example: event=507f1f77bcf86cd799439017 Filter by event ID |
| waitlistCount[gt] | integer >= 0 Filter timeslots with waitlist count greater than specified value |
| privacy | string Default: "public" Enum: "public" "private" Example: privacy=public Filter by privacy level |
| includeFees | boolean Example: includeFees=true When true, unit prices in the response include taxes and fees. For unauthenticated (checkout) requests, this is automatically set from the seller's checkout preference. For authenticated booking engine users, this parameter is accepted directly. For other authenticated users, the parameter is passed through when provided. |
| allowPastSlots | boolean Default: false Include past time slots in results |
| package | string Example: package=507f1f77bcf86cd799439018 Package ID for package-specific availability |
| source | string Example: source=checkout The pricing source context. For booking engine users ( |
| id[gt] | string Example: id[gt]=507f1f77bcf86cd799439011_2024-12-15_900 Pagination cursor - get timeslots with ID greater than specified value |
{- "data": [
- {
- "id": "65bb71b277c4c31b7c0cdcba_2025-05-13_1500",
- "product": "65bb71b277c4c31b7c0cdcba",
- "date": "2025-05-13",
- "time": 1500,
- "scheduleType": "time",
- "arrivalDatetime": "2025-05-13T15:00:00-04:00",
- "end": "2025-05-13T15:59:59-04:00",
- "capacity": {
- "open": 5,
- "max": 10
}, - "privacy": "public",
- "canBook": true,
- "units": [
- {
- "id": "65798d7f7d106453ee05c767",
- "type": "demographic",
- "code": "adult",
- "price": 100,
- "priceType": "person"
}, - {
- "id": "65798d7f7d106453ee05c768",
- "type": "demographic",
- "code": "child",
- "price": 50,
- "priceType": "person"
}
]
}, - {
- "id": "65bb71b277c4c31b7c0cdcba_2025-05-13_1700",
- "product": "65bb71b277c4c31b7c0cdcba",
- "date": "2025-05-13",
- "time": 1700,
- "scheduleType": "time",
- "arrivalDatetime": "2025-05-13T17:00:00-04:00",
- "end": "2025-05-13T17:59:59-04:00",
- "capacity": {
- "open": 0,
- "max": 10
}, - "privacy": "public",
- "canBook": false,
- "canWaitlist": true,
- "units": [
- {
- "id": "65798d7f7d106453ee05c767",
- "type": "demographic",
- "code": "adult",
- "price": 100,
- "priceType": "person"
}
]
}
], - "expand": { },
- "paging": {
- "next": null
}, - "_hasCachedData": false
}Transactions track all movement of money in Xola. For any exchange of money from one user to another (e.g. a consumer paying a seller), a new transaction is created. This is true even if the exchange of money happened offline (e.g. physical cash).
Transactions in Xola track movement in several directions:
Transactions are Immutable
Transactions, once created, are never modified. Once fetched, you may cache transactions locally if required.
Every transaction has a type attribute that indicates the nature of the transaction. Currently Xola has the following transaction types:
| Type | Description |
|---|---|
purchase |
The traveler paid an amount to the seller for a purchase. This could reflect creation of a new purchase, or an additional charge on a pre-existing purchase. |
purchase_affiliate |
|
refund |
A purchase was refunded — the seller refunded some money back to the traveler. |
deposit |
The traveler paid a deposit amount to the seller for a purchase. |
balance |
The seller collected the balance amount from a deposit (which was previously collected towards a purchase). |
payout |
A payout was initiated from Xola to the seller's bank account. All payout transactions are reflected in the payouts report. |
auto_payout |
An automatic payout was initiated from Xola to the seller's bank account. All payout transactions are reflected in the payouts report. |
payout_adjust |
|
affiliate |
Reflects collecting payment or crediting an affiliate with an amount for their bookings. |
modify |
|
subscription |
Xola charging the seller for their subscription fees. In this situation the seller's registered credit card would be charged. |
Retrieve a paginated list of transactions. Transactions track all movement of money in Xola, including customer payments, seller payouts, refunds, and adjustments.
Transactions are returned in descending order of creation date by default.
Supports comprehensive filtering by seller, type, amount, date ranges, payment methods, and more.
For export functionality, include a format parameter to receive a job ID for asynchronous processing.
Cash flow exports include a TAGS column that may contain contextual labels. For stripe_paydown
transactions, the TAGS field is automatically populated with "Stripe Debt Payment". For other
transactions with an associated order or purchase, TAGS contains deposit indicators and any
order/purchase tags.
ETL Mode: When etl=true is specified (admin only), the endpoint returns data optimized for
extract-transform-load operations with higher limits and different sorting.
| seller | string Example: seller=60f7b3c4e4b0a1234567890a Filter transactions by seller ID |
| type | Array of strings Items Enum: "purchase" "purchase_affiliate" "refund" "refund_commission" "deposit" "balance" "payout" "affiliate" "modify" "subscription" "subscription_refund" "payout_adjust" "redeem" "gratuity" "partner_reconcile_auto" "partner_reconcile_manual" "partner_purchase" "stripe_paydown" Example: type=purchase,refund Filter by transaction type(s) |
| source | Array of strings Items Enum: "xola" "admin" "checkout" "office" "partner" "affiliate_credit_top_up" "kiosk" "traveler" "refund" "import" "gift" "stripe" "gratuity" Example: source=checkout,office Filter by transaction source(s) |
| method | Array of strings (TransactionMethod) Items Enum: "ACH" "Wire" "PayPal" "Check" "Cash" "Other" "Credit Card" "Electronic" "Voucher" "Affiliate Deposit" "Gift" "Store Credit" "Xola Pay" "Plugin" "Klarna" "Afterpay Clearpay" "Affirm" "Zip" Example: method=Credit Card,PayPal Filter by payment method(s) |
| affiliates | string Example: affiliates=60f7b3c4e4b0a1234567890b Filter by affiliate ID |
| partners | string Example: partners=60f7b3c4e4b0a1234567890c Filter by partner ID |
| payout | string Example: payout=60f7b3c4e4b0a1234567890d Filter by payout ID |
| order_id | string Example: order_id=60f7b3c4e4b0a1234567890e Filter by order ID |
| items_product | string Example: items_product=60f7b3c4e4b0a1234567890f Filter by product ID in transaction items |
number or object Example: balance=1000 Filter by balance amount. Supports exact match or range operators:
| |
number or object Example: items_gross=150 Filter by gross amount in transaction items | |
number or object Example: items_commission=15 Filter by commission amount in transaction items | |
number or object Example: items_net=135 Filter by net amount in transaction items | |
object (DateTimeFilterSchema) Examples: createdAt[summary]=Find records where field exists (not null)&createdAt[value]=[object Object] createdAt[summary]=Find records where field is null/missing&createdAt[value]=[object Object] createdAt[summary]=Date range filtering&createdAt[value]=[object Object] createdAt[summary]=Range using comma-separated string&createdAt[value]=[object Object] createdAt[summary]=Using period for today&createdAt[value]=[object Object] createdAt[summary]=Using period for last week&createdAt[value]=[object Object] createdAt[summary]=Exact date-time match&createdAt[value]=[object Object] createdAt[summary]=After specific date&createdAt[value]=[object Object] Filter by creation timestamp. Supports date-time filtering operations. | |
object (DateTimeFilterSchema) Examples: updatedAt[summary]=Find records where field exists (not null)&updatedAt[value]=[object Object] updatedAt[summary]=Find records where field is null/missing&updatedAt[value]=[object Object] updatedAt[summary]=Date range filtering&updatedAt[value]=[object Object] updatedAt[summary]=Range using comma-separated string&updatedAt[value]=[object Object] updatedAt[summary]=Using period for today&updatedAt[value]=[object Object] updatedAt[summary]=Using period for last week&updatedAt[value]=[object Object] updatedAt[summary]=Exact date-time match&updatedAt[value]=[object Object] updatedAt[summary]=After specific date&updatedAt[value]=[object Object] Filter by last update timestamp. Supports date-time filtering operations. | |
object (DateTimeFilterSchema) Examples: escrowedAt[summary]=Find records where field exists (not null)&escrowedAt[value]=[object Object] escrowedAt[summary]=Find records where field is null/missing&escrowedAt[value]=[object Object] escrowedAt[summary]=Date range filtering&escrowedAt[value]=[object Object] escrowedAt[summary]=Range using comma-separated string&escrowedAt[value]=[object Object] escrowedAt[summary]=Using period for today&escrowedAt[value]=[object Object] escrowedAt[summary]=Using period for last week&escrowedAt[value]=[object Object] escrowedAt[summary]=Exact date-time match&escrowedAt[value]=[object Object] escrowedAt[summary]=After specific date&escrowedAt[value]=[object Object] Filter by escrow timestamp. Used for payment processing and transaction filtering. | |
object (DateTimeFilterSchema) Examples: arrivalDateTime[summary]=Find records where field exists (not null)&arrivalDateTime[value]=[object Object] arrivalDateTime[summary]=Find records where field is null/missing&arrivalDateTime[value]=[object Object] arrivalDateTime[summary]=Date range filtering&arrivalDateTime[value]=[object Object] arrivalDateTime[summary]=Range using comma-separated string&arrivalDateTime[value]=[object Object] arrivalDateTime[summary]=Using period for today&arrivalDateTime[value]=[object Object] arrivalDateTime[summary]=Using period for last week&arrivalDateTime[value]=[object Object] arrivalDateTime[summary]=Exact date-time match&arrivalDateTime[value]=[object Object] arrivalDateTime[summary]=After specific date&arrivalDateTime[value]=[object Object] Filter by arrival date and time. Commonly used for booking and event filtering. | |
object (DateTimeFilterSchema) Examples: summary=Find records where field exists (not null)&value=[object Object] summary=Find records where field is null/missing&value=[object Object] summary=Date range filtering&value=[object Object] summary=Range using comma-separated string&value=[object Object] summary=Using period for today&value=[object Object] summary=Using period for last week&value=[object Object] summary=Exact date-time match&value=[object Object] summary=After specific date&value=[object Object] Filter by realization date/time from transaction items | |
| remoteTransactions_cardSummary_brand | string Example: remoteTransactions_cardSummary_brand=visa Filter by credit card brand |
| stripeEvent_remoteSystem | string Example: stripeEvent_remoteSystem=connect Filter by Stripe remote system |
| remoteId | string Example: remoteId=ch_1F0v3H4dlNciCrXqxiARO2o3 Filter by remote transaction ID |
object Example: exists[payout]=false&exists[gratuity]=true Check for field existence | |
| createdBy | string Example: createdBy=60f7b3c4e4b0a1234567890g Filter by creator user ID |
| context | string Value: "report" Special context for data retrieval:
|
| etl | boolean Default: false Enable ETL mode for bulk data extraction (admin only) |
| format | string Enum: "csv" "excel" "json" Example: format=csv Export format - returns a job ID for asynchronous processing |
| include | string Example: include=id,amount,type,createdAt Comma-separated list of fields to include in response |
| fields | string Example: fields=id,amount,type,createdAt Alias for 'include' parameter |
| exclude | string Example: exclude=meta,remoteTransactions Comma-separated list of fields to exclude from response |
| sort | string Example: sort=createdAt,-amount Sort order (comma-separated fields) |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
{- "data": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "amount": 150,
- "earning": 142.5,
- "balance": 1250.75,
- "currency": "USD",
- "type": "purchase",
- "source": "checkout",
- "method": "Credit Card",
- "seller": {
- "id": "60f7b3c4e4b0a1234567890b"
}, - "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T10:30:00Z"
}, - {
- "id": "60f7b3c4e4b0a1234567890c",
- "amount": -25,
- "earning": -25,
- "balance": 1225.75,
- "currency": "USD",
- "type": "refund",
- "source": "admin",
- "method": "Credit Card",
- "seller": {
- "id": "60f7b3c4e4b0a1234567890b"
}, - "createdAt": "2023-12-06T15:45:00Z",
- "updatedAt": "2023-12-06T15:45:00Z"
}
], - "meta": {
- "balance": 1250.75
}, - "paging": {
- "next": "/transactions?limit=20&offset=20"
}
}Create a new transaction. Only admin users with appropriate permissions can create transactions.
Supports creating various transaction types including:
Transactions created via API are marked with source 'admin'.
| amount required | number <float> Transaction amount |
| earning | number <float> Seller earnings after commission |
| currency required | string Currency code (ISO 4217) |
| type required | string Enum: "purchase" "purchase_affiliate" "refund" "refund_commission" "deposit" "balance" "payout" "affiliate" "modify" "subscription" "subscription_refund" "payout_adjust" "redeem" "gratuity" "partner_reconcile_auto" "partner_reconcile_manual" "partner_purchase" "stripe_paydown" Type of transaction |
| method | string (TransactionMethod) Enum: "ACH" "Wire" "PayPal" "Check" "Cash" "Other" "Credit Card" "Electronic" "Voucher" "Affiliate Deposit" "Gift" "Store Credit" "Xola Pay" "Plugin" "Klarna" "Afterpay Clearpay" "Affirm" "Zip" Payment method used for this transaction:
|
| source | string Enum: "xola" "admin" "checkout" "office" "partner" "affiliate_credit_top_up" "kiosk" "traveler" "refund" "import" "gift" "stripe" "gratuity" Transaction source |
| comment | string Additional comments |
required | object (ObjectReference) Seller reference |
| affiliates | Array of strings Affiliate IDs (for affiliate transactions) |
object Additional metadata |
{- "amount": 150,
- "earning": 142.5,
- "currency": "USD",
- "type": "purchase",
- "method": "Credit Card",
- "source": "checkout",
- "comment": "Booking payment",
- "seller": {
- "id": "60f7b3c4e4b0a1234567890a"
}
}{- "id": "60f7b3c4e4b0a1234567890d",
- "amount": 150,
- "earning": 142.5,
- "balance": 1393.25,
- "currency": "USD",
- "type": "purchase",
- "source": "admin",
- "method": "Credit Card",
- "seller": {
- "id": "60f7b3c4e4b0a1234567890a"
}, - "createdAt": "2023-12-07T12:00:00Z",
- "updatedAt": "2023-12-07T12:00:00Z"
}Apply batch operations to update transaction properties. Currently supports updating Stripe gateway fees.
Operations are processed individually, and the endpoint returns HTTP 207 (Multi-Status) if any operations fail. Successful operations are applied immediately, while failed operations are returned with error details.
Supported Operations:
setStripeChargeFee: Update the gateway fee for a Stripe charge transactionsetStripeRefundFee: Update the gateway fee for a Stripe refund transactionRequired Permission: ROLE_ADMIN_GATEWAY_FEES
| op required | string Enum: "setStripeChargeFee" "setStripeRefundFee" Operation to perform:
|
| value required | number <float> Fee amount to set (negative for refunds) |
required | object Filter criteria to identify which transactions to update |
[- {
- "op": "setStripeChargeFee",
- "value": 2.19,
- "filter": {
- "chargeId": "ch_1F0v3H4dlNciCrXqxiARO2o3"
}
}, - {
- "op": "setStripeChargeFee",
- "value": 3.44,
- "filter": {
- "chargeId": "ch_1F0v3H4dlNciCrXqxiARO2o4"
}
}
][- {
- "op": "setStripeChargeFee",
- "value": 3.44,
- "filter": {
- "chargeId": "ch_invalid"
}, - "error": {
- "filter": {
- "reason": "no_matching_transaction",
- "message": "No transaction was found matching this filter"
}
}
}, - {
- "op": "setStripeChargeFee",
- "value": 0,
- "filter": {
- "chargeId": "ch_invalid2"
}, - "error": {
- "filter": {
- "reason": "no_matching_transaction",
- "message": "No transaction was found matching this filter"
}
}
}
]Retrieve a single transaction by its ID. The response includes the complete transaction details with all available fields.
Authorization rules are applied to ensure users can only access transactions they have permission to view.
| id required | string Example: 60f7b3c4e4b0a1234567890a Transaction ID |
{- "id": "60f7b3c4e4b0a1234567890a",
- "amount": 150,
- "earning": 142.5,
- "balance": 1250.75,
- "currency": "USD",
- "type": "purchase",
- "source": "checkout",
- "method": "Credit Card",
- "comment": null,
- "coupon": "SAVE10",
- "seller": {
- "id": "60f7b3c4e4b0a1234567890b"
}, - "order": {
- "id": "60f7b3c4e4b0a1234567890c"
}, - "purchase": {
- "id": "60f7b3c4e4b0a1234567890d"
}, - "affiliates": [ ],
- "partners": [ ],
- "items": [
- {
- "id": "60f7b3c4e4b0a1234567890e",
- "gross": 150,
- "net": 142.5,
- "commission": 7.5,
- "name": "Kayak Tour - 2 Adults",
- "quantity": 2,
- "arrivalDateTime": "2023-12-15T09:00:00Z"
}
], - "remoteTransactions": [
- {
- "gateway": "Stripe",
- "remoteId": "ch_1F0v3H4dlNciCrXqxiARO2o3",
- "amount": 150,
- "currency": "USD",
- "status": "succeeded",
- "cardSummary": {
- "brand": "visa",
- "last4": "4242",
- "expMonth": 12,
- "expYear": 2025
}
}
], - "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T10:30:00Z",
- "createdBy": {
- "id": "60f7b3c4e4b0a1234567890f"
}
}Retrieve aggregated transaction summary data calculated through database aggregation.
Provides totals, averages, and breakdowns by transaction type and payment method. Supports the same filtering parameters as the transaction list endpoint.
Authorization rules are applied to ensure users can only access summary data for transactions they have permission to view.
| seller | string Example: seller=60f7b3c4e4b0a1234567890a Filter summary by seller ID |
| type | Array of strings Items Enum: "purchase" "purchase_affiliate" "refund" "refund_commission" "deposit" "balance" "payout" "affiliate" "modify" "subscription" "subscription_refund" "payout_adjust" "redeem" "gratuity" "partner_reconcile_auto" "partner_reconcile_manual" "partner_purchase" "stripe_paydown" Filter by transaction type(s) |
| source | Array of strings Items Enum: "xola" "admin" "checkout" "office" "partner" "affiliate_credit_top_up" "kiosk" "traveler" "refund" "import" "gift" "stripe" "gratuity" Filter by transaction source(s) |
object (DateTimeFilterSchema) Examples: createdAt[summary]=Find records where field exists (not null)&createdAt[value]=[object Object] createdAt[summary]=Find records where field is null/missing&createdAt[value]=[object Object] createdAt[summary]=Date range filtering&createdAt[value]=[object Object] createdAt[summary]=Range using comma-separated string&createdAt[value]=[object Object] createdAt[summary]=Using period for today&createdAt[value]=[object Object] createdAt[summary]=Using period for last week&createdAt[value]=[object Object] createdAt[summary]=Exact date-time match&createdAt[value]=[object Object] createdAt[summary]=After specific date&createdAt[value]=[object Object] Filter by creation timestamp. Supports date-time filtering operations. | |
| method | Array of strings Filter by payment method(s) |
{- "totalAmount": 15750,
- "totalEarnings": 14962.5,
- "transactionCount": 125,
- "averageAmount": 126,
- "byType": {
- "purchase": {
- "count": 98,
- "amount": 14700,
- "earnings": 13965
}, - "refund": {
- "count": 15,
- "amount": -1125,
- "earnings": -1068.75
}, - "payout": {
- "count": 12,
- "amount": 2175,
- "earnings": 2175
}
}, - "byMethod": {
- "Credit Card": {
- "count": 85,
- "amount": 12750
}, - "PayPal": {
- "count": 18,
- "amount": 2700
}, - "Cash": {
- "count": 22,
- "amount": 300
}
}
}A user on Xola can represent any one of three entities:
seller property indicating its owner.When a multipart/form-data request is sent with a file field containing a CSV,
this endpoint enqueues a traveler import job instead of creating a single user account.
The CSV file is processed asynchronously. A job response is returned immediately with
a job ID that can be polled via GET /jobs/{id} to track progress.
ROLE_IMPORT permission. Returns 403 Forbidden without it.Required columns:
name - Full name of the travelerOptional columns:
email - Email address (used for duplicate detection)phone - Phone numbermarketingconsent - Marketing consent valuenotes, note1, note2, etc. - Notes attached to the traveler (any column matching note(s)?(\d+)?)Any additional columns not matching the above are stored as custom data fields on the traveler.
If a traveler with the same email already exists for the seller, that row is skipped and counted as a failure with the reason "skipped: already exists".
file - The CSV file to import (required)seller - The seller ID to import travelers for (required)| file required | string <binary> CSV file containing traveler data to import |
| seller required | string (id) ^[0-9a-fA-F]{24}$ Seller ID to import travelers for |
{- "data": [
- {
- "id": "507f1f77bcf86cd799439011",
- "status": "new"
}
]
}Retrieve a paginated list of users. When a seller parameter is provided, only travelers
(customers) for that seller are returned and additional traveler-specific filter parameters
become available.
When querying with seller (which implies type=traveler), the following filter parameters
are supported: name, email, phone, lifetimeValue, createdAt, updated,
tags._id, marketingConsents.value, and isOrganizer.
When a format parameter is included (e.g., format=xlsx), the endpoint triggers an
asynchronous export job and returns a 202 Accepted response with a job object. Poll
the /jobs/{id} endpoint to track progress. The export includes these columns by default:
ID, NAME, IS_ORGANIZER, EMAIL, OTHER_EMAILS, OTHER_NAMES, PHONE, OTHER_PHONES, VALUE,
REFERRAL_SOURCE, CREATED, UPDATED, TAGS, plus any marketing consent columns.
Use filters[excludedColumns] to omit specific columns from the export output. Valid values
include: id, name, isOrganizer, email, additionalEmails, additionalNames, phone,
additionalPhones, lifetimeValue, data.howDidYouHearAboutUs, createdAt, updated,
tags._id, marketingConsents.
seller parameter is required unless the caller has admin privileges.VIEW_USER_CUSTOMERS permission on the seller.| seller | string (id) ^[0-9a-fA-F]{24}$ Example: seller=507f1f77bcf86cd799439012 Seller ID. Required for non-admin callers. When provided, only travelers (type=2) belonging to this seller are returned and traveler-specific filters become available. |
| type | integer Enum: 1 2 3 Example: type=2 User type filter. Automatically set to
|
| search | string Example: search=john@example.com Free-text search across name, email, and phone fields. If a 24-character hex string is provided, it is treated as an ID lookup. |
| name | string Example: name=John Filter travelers by name (string filter). Only available when |
string <email> Example: email=john@example.com Filter travelers by email address (case-insensitive, trimmed). Only available when
| |
| phone | string Example: phone=+1-555-0123 Filter travelers by phone number (string filter). Only available when |
object Filter travelers by lifetime value (numeric filter). Supports operators like
| |
object (DateTimeFilterSchema) Examples: createdAt[summary]=Find records where field exists (not null)&createdAt[value]=[object Object] createdAt[summary]=Find records where field is null/missing&createdAt[value]=[object Object] createdAt[summary]=Date range filtering&createdAt[value]=[object Object] createdAt[summary]=Range using comma-separated string&createdAt[value]=[object Object] createdAt[summary]=Using period for today&createdAt[value]=[object Object] createdAt[summary]=Using period for last week&createdAt[value]=[object Object] createdAt[summary]=Exact date-time match&createdAt[value]=[object Object] createdAt[summary]=After specific date&createdAt[value]=[object Object] Filter travelers by creation date. Supports date-time filtering operations.
Only available when | |
object (DateTimeFilterSchema) Examples: updated[summary]=Find records where field exists (not null)&updated[value]=[object Object] updated[summary]=Find records where field is null/missing&updated[value]=[object Object] updated[summary]=Date range filtering&updated[value]=[object Object] updated[summary]=Range using comma-separated string&updated[value]=[object Object] updated[summary]=Using period for today&updated[value]=[object Object] updated[summary]=Using period for last week&updated[value]=[object Object] updated[summary]=Exact date-time match&updated[value]=[object Object] updated[summary]=After specific date&updated[value]=[object Object] Filter travelers by last updated timestamp. Supports date-time filtering operations.
Only available when | |
| tags._id | string Example: tags._id=VIP Filter travelers by tag ID (string filter). Only available when |
| marketingConsents.value | string Example: marketingConsents.value=true Filter travelers by marketing consent value (string filter). Only available when
|
| isOrganizer | boolean Example: isOrganizer=true Filter travelers by whether they are an organizer (boolean filter). Only available
when |
| format | string Value: "xlsx" Example: format=xlsx Export format. When provided, triggers an asynchronous export job and returns a 202 response with job details instead of the user list. |
| filters[excludedColumns] | string Example: filters[excludedColumns]=additionalEmails,additionalPhones,marketingConsents Comma-separated list of columns to exclude from the export output. Only applicable
when |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
{- "data": [
- {
- "id": "507f1f77bcf86cd799439011",
- "name": "John Smith",
- "email": "john.smith@example.com",
- "username": "john.smith@example.com",
- "phone": "+1-555-0123",
- "type": 2,
- "enabled": true,
- "lifetimeValue": 1250,
- "tags": [
- {
- "id": "VIP",
- "system": false
}
]
}, - {
- "id": "507f1f77bcf86cd799439022",
- "name": "Jane Doe",
- "email": "jane.doe@example.com",
- "username": "jane.doe@example.com",
- "type": 2,
- "enabled": true,
- "lifetimeValue": 300
}
],
}Returns the full user profile for the currently authenticated user, including id, email, apiKey, name, roles, and preferences.
Uses the authentication headers (X-API-KEY or Authorization) to identify the user.
{- "id": "507f1f77bcf86cd799439011",
- "name": "John Smith",
- "email": "john.smith@example.com",
- "username": "john.smith@example.com",
- "apiKey": "xola_test_1234567890abcdef",
- "roles": [
- "ROLE_SELLER",
- "ROLE_SELLER_ADMIN"
], - "type": 1,
- "enabled": true
}Returns the API key for the authenticated user. This endpoint is for the current user only.
If the user doesn't have an API key, one will be generated automatically. The API key can be
reset by providing the reset=true query parameter.
| reset | boolean Default: false Example: reset=true Whether to reset/regenerate the API key |
[- "my_api_key_1234567890abcdef"
]Returns details about a specific user account.
Private Access: With the private=true parameter, private data is returned
based on authorization level. The seller parameter is required when requesting private data.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| private | boolean Default: false Example: private=true Whether to return private user data (requires authentication and seller parameter) |
| seller | string (id) ^[0-9a-fA-F]{24}$ Example: seller=507f1f77bcf86cd799439012 Seller ID (required when private=true, used for authorization) |
{- "id": "507f1f77bcf86cd799439011",
- "name": "John Smith",
- "email": "john.smith@example.com",
- "phone": "+1-555-0123",
- "username": "john.smith@example.com",
- "type": 2,
- "enabled": true,
- "lastLogin": "2024-01-15T10:30:00Z",
- "remoteCards": [
- {
- "id": "card_123456",
- "last4": "4242",
- "brand": "visa",
- "expMonth": 12,
- "expYear": 2025
}
]
}Records that a user has accepted the Xola Terms of Service for a specific version.
The acceptance is recorded with the IP address from which the request was made and the timestamp of acceptance.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| version required | string^\d{4}\.\d{2}\.\d{2}$ Version identifier of the Terms of Service being accepted (YYYY.MM.DD format) |
{- "version": "2024.01.15"
}""Resends the email confirmation message to a user who has not yet activated their account.
This endpoint can only be used for users whose accounts are not yet enabled (activated). If the user's account is already enabled, a validation error will be returned.
A new confirmation token is generated and the confirmation email is sent to the user's registered email address.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
""Returns the user's profile picture. If the user has uploaded a custom picture, that is returned. Otherwise, the response will redirect to their Gravatar image, or fall back to an initials-based image if no Gravatar exists.
The response is always a redirect (HTTP 302) to the actual image URL, which may be hosted on external services like Gravatar or Xola's media servers.
You can control the size of the returned image using query parameters:
size parameter for predefined sizeswidth and height parameters for custom dimensions| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| size | string Default: "small_square" Enum: "small" "medium" "large" "small_square" "medium_square" "large_square" "logo" "email" Example: size=small_square Predefined image size |
| width | integer [ 1 .. 2000 ] Example: width=150 Custom image width in pixels (used with height parameter) |
| height | integer [ 1 .. 2000 ] Example: height=150 Custom image height in pixels (used with width parameter) |
| rounded | boolean Default: true Example: rounded=true Whether to return a rounded/circular image |
{- "errors": {
- "size": "Invalid image size"
}
}Returns the user's unique short code. If the user doesn't have a short code yet, one will be generated automatically.
Short codes are 5-character unique identifiers that can be used for quick user identification or referencing.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "id": "507f1f77bcf86cd799439011",
- "shortCode": "AB1C2"
}Updates user information including personal details, contact information, and preferences.
Context Handling:
id is "me" or matches the authenticated user's ID, the user updates their own profileAuthorization Rules:
Special Features:
mergedTo fieldcard data is providedValidation:
Merge Behavior:
When mergedTo is provided, the following validation rules are bypassed:
traveler_lite_creation group) is skippedThe source user's data is merged into the target user, the source user is removed,
and email notifications can be controlled via _emailOverrides.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| name | string or null User's full name |
string or null <email> User's email address (must be unique within seller context) | |
| newEmail | string or null <email> New email address when current user is changing their own email |
| phone | string or null User's phone number (updates are seller-scoped) |
| username | string or null User's username (typically same as email) |
| locale | string or null Enum: "en-US" "es-ES" "fr-FR" "de-DE" "it-IT" "pt-BR" User's preferred locale/language |
| timezone | string or null User's timezone |
object (ObjectReference) Reference to the seller context (for traveler updates) | |
object Target user to merge this user account into. When this field is provided, all field-level validation (including email format and duplicate email checks) is bypassed. The source user's data is merged into the target user account, and the source user is subsequently removed. | |
| data | object or null Custom data fields and preferences |
object or null Payment card to associate with user | |
object or null Email sending overrides for specific operations |
{- "name": "John Doe Smith",
- "email": "john.smith.updated@example.com",
- "phone": "+1-555-0199"
}{- "id": "507f1f77bcf86cd799439011",
- "name": "John Doe Smith",
- "email": "john.smith.updated@example.com",
- "phone": "+1-555-0199",
- "username": "john.smith@example.com",
- "type": 2,
- "enabled": true,
- "lastLogin": "2024-01-15T10:30:00Z",
- "tags": [
- {
- "id": "VIP Customer",
- "system": false,
- "type": "customer"
}
]
}Returns a paginated list of seller accounts that the authenticated user has delegate access to.
This endpoint provides information about all the seller accounts the current user can act on behalf of, including the seller's name, company information, and basic profile details.
limit - Number of results to return per page. Capped at 500. Defaults to the server's configured page size.skip - Number of results to skip. Must be >= 0. Defaults to 0.The response includes a paging object with a next field containing the URL for the next page,
or null when there are no more results.
| limit | integer [ 1 .. 500 ] Default: 20 Number of items to return per page. Maximum value is 500. |
| skip | integer >= 0 Default: 0 Number of items to skip |
{- "data": [
- {
- "id": "507f1f77bcf86cd799439012",
- "name": "Adventure Tours LLC",
- "company": "Adventure Tours LLC",
- "type": 1
}, - {
- "id": "507f1f77bcf86cd799439013",
- "name": "City Bike Rentals",
- "company": "City Bike Rentals",
- "type": 1
}
],
}Returns all feature flags configured for a specific user account.
Feature flags control access to various features and capabilities within the system. This endpoint requires VIEW_USER_FEATURES permission on the target user.
Authorization:
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "googleAnalytics": true,
- "advancedReporting": false,
- "mobileApp": true,
- "customBranding": true
}Returns the value of a specific feature flag for a user.
Public Features: Some features are publicly accessible without authentication:
Authorization:
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| feature required | string Example: googleAnalytics The name/key of the feature flag to retrieve |
trueFetch a list of waivers. By default, only returns waivers that are not linked to any purchases.
If the seller has multi-link day interval configured, waivers created within that interval are included regardless of their link status.
| seller | string Example: seller=507f1f77bcf86cd799439011 Seller ID to fetch waivers for. If not provided, uses the authenticated user's account. |
| unlinked | boolean Default: true Filter for unlinked waivers. When true (default), returns only waivers that are linkable. |
| traveler | string Example: traveler=507f1f77bcf86cd799439012 Filter waivers by participant traveler ID. Returns waivers where any participant is linked to the specified traveler. |
| search | string Example: search=john doe Search term to filter waivers. Searches across participant name, email, and phone. |
| expand | string Value: "purchase" You can expand multiple objects at the same time by providing a comma-separated list of values |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
| sort | string Default: "-id" Enum: "id" "-id" "createdAt" "-createdAt" "signedAt" "-signedAt" Example: sort=-createdAt Sort field and direction. Use minus (-) prefix for descending order. IMPORTANT: Specifying a sort order may impact performance. |
{- "data": [
- {
- "id": "507f1f77bcf86cd799439013",
- "remoteId": "123e4567-e89b-12d3-a456-426614174000",
- "remoteSystem": "507f1f77bcf86cd799439011",
- "customerEmail": "customer@example.com",
- "waiverTypeId": "waiver-template-123",
- "signedAt": "2024-03-15T14:30:00Z",
- "tags": [
- "high-risk",
- "adult"
], - "participants": [
- {
- "id": "507f1f77bcf86cd799439019",
- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "dateOfBirth": "1990-05-15",
- "phone": "+1-555-123-4567",
- "traveler": {
- "id": "507f1f77bcf86cd799439011"
}, - "answers": [
- {
- "label": "Emergency Contact",
- "type": "text",
- "value": "Emergency contact name"
}
]
}
], - "itemId": "507f1f77bcf86cd799439012",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "experiences": [
- {
- "id": "507f1f77bcf86cd799439011"
}
], - "purchases": [
- {
- "id": "507f1f77bcf86cd799439011"
}
], - "createdAt": "2024-03-15T14:35:00Z",
- "updatedAt": "2024-03-15T16:20:00Z"
}
], - "paging": {
- "next": "string",
- "_es": true
}
}Endpoint for processing waiver completion from external waiver systems.
This endpoint is typically called by waiver plugins when a customer completes signing a waiver. The waiver will be automatically linked to purchases if participants contact info can be matched.
| remoteId required | string ID of the waiver on the remote system |
| remoteSystem required | string ID of the remote system (waiver plugin user ID) |
| customerEmail required | string <email> Email address of the person who signed the waiver |
| url required | string <uri> URL to view the signed waiver |
| waiverTypeId | string or null ID of the waiver form template (not the filled waiver, but the blank template) |
| signedAt required | string <date-time> Date when the waiver was signed on the remote system |
| tags | Array of strings String array of tags associated with the waiver |
Array of objects (WaiverParticipant) Information on waiver participants | |
| itemId | string or null Purchase Item ID if sent in waiver payload |
required | object (ObjectReference) Seller account tied to this waiver |
{- "remoteId": "123e4567-e89b-12d3-a456-426614174000",
- "remoteSystem": "507f1f77bcf86cd799439011",
- "customerEmail": "customer@example.com",
- "waiverTypeId": "waiver-template-123",
- "signedAt": "2024-03-15T14:30:00Z",
- "tags": [
- "high-risk",
- "adult"
], - "participants": [
- {
- "id": "507f1f77bcf86cd799439019",
- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "dateOfBirth": "1990-05-15",
- "phone": "+1-555-123-4567",
- "traveler": {
- "id": "507f1f77bcf86cd799439011"
}, - "answers": [
- {
- "label": "Emergency Contact",
- "type": "text",
- "value": "Emergency contact name"
}
]
}
], - "itemId": "507f1f77bcf86cd799439012",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}
}{- "id": "507f1f77bcf86cd799439013",
- "remoteId": "123e4567-e89b-12d3-a456-426614174000",
- "remoteSystem": "507f1f77bcf86cd799439011",
- "customerEmail": "customer@example.com",
- "waiverTypeId": "waiver-template-123",
- "signedAt": "2024-03-15T14:30:00Z",
- "tags": [
- "high-risk",
- "adult"
], - "participants": [
- {
- "id": "507f1f77bcf86cd799439019",
- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "dateOfBirth": "1990-05-15",
- "phone": "+1-555-123-4567",
- "traveler": {
- "id": "507f1f77bcf86cd799439011"
}, - "answers": [
- {
- "label": "Emergency Contact",
- "type": "text",
- "value": "Emergency contact name"
}
]
}
], - "itemId": "507f1f77bcf86cd799439012",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "experiences": [
- {
- "id": "507f1f77bcf86cd799439011"
}
], - "purchases": [
- {
- "id": "507f1f77bcf86cd799439011"
}
], - "createdAt": "2024-03-15T14:35:00Z",
- "updatedAt": "2024-03-15T16:20:00Z"
}Fetch details for an individual waiver
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "id": "507f1f77bcf86cd799439013",
- "remoteId": "123e4567-e89b-12d3-a456-426614174000",
- "remoteSystem": "507f1f77bcf86cd799439011",
- "customerEmail": "customer@example.com",
- "waiverTypeId": "waiver-template-123",
- "signedAt": "2024-03-15T14:30:00Z",
- "tags": [
- "high-risk",
- "adult"
], - "participants": [
- {
- "id": "507f1f77bcf86cd799439019",
- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "dateOfBirth": "1990-05-15",
- "phone": "+1-555-123-4567",
- "traveler": {
- "id": "507f1f77bcf86cd799439011"
}, - "answers": [
- {
- "label": "Emergency Contact",
- "type": "text",
- "value": "Emergency contact name"
}
]
}
], - "itemId": "507f1f77bcf86cd799439012",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "experiences": [
- {
- "id": "507f1f77bcf86cd799439011"
}
], - "purchases": [
- {
- "id": "507f1f77bcf86cd799439011"
}
], - "createdAt": "2024-03-15T14:35:00Z",
- "updatedAt": "2024-03-15T16:20:00Z"
}This endpoint supports linking waivers to purchases. You can link to specific items within a purchase, or link to all items if no specific item is provided.
Use the force query parameter to override existing links when multi-link is not configured.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| force | boolean Default: false Force the update even if waiver is already linked (when multi-link is not configured) |
| purchase | string or null Purchase ID to link/unlink. Set to null to unlink from all purchases. |
| item | string or null Specific item ID within the purchase to link/unlink |
object Guest to link | |
object Participant information for linking | |
| remove | boolean Default: false Set to true to unlink the waiver |
{- "purchase": "507f1f77bcf86cd799439015",
- "item": "507f1f77bcf86cd799439016",
- "guest": {
- "id": "507f1f77bcf86cd799439017"
}, - "participant": {
- "id": "507f1f77bcf86cd799439018"
}, - "remove": false
}{- "id": "507f1f77bcf86cd799439013",
- "remoteId": "123e4567-e89b-12d3-a456-426614174000",
- "remoteSystem": "507f1f77bcf86cd799439011",
- "customerEmail": "customer@example.com",
- "waiverTypeId": "waiver-template-123",
- "signedAt": "2024-03-15T14:30:00Z",
- "tags": [
- "high-risk",
- "adult"
], - "participants": [
- {
- "id": "507f1f77bcf86cd799439019",
- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "dateOfBirth": "1990-05-15",
- "phone": "+1-555-123-4567",
- "traveler": {
- "id": "507f1f77bcf86cd799439011"
}, - "answers": [
- {
- "label": "Emergency Contact",
- "type": "text",
- "value": "Emergency contact name"
}
]
}
], - "itemId": "507f1f77bcf86cd799439012",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "experiences": [
- {
- "id": "507f1f77bcf86cd799439011"
}
], - "purchases": [
- {
- "id": "507f1f77bcf86cd799439011"
}
], - "createdAt": "2024-03-15T14:35:00Z",
- "updatedAt": "2024-03-15T16:20:00Z"
}Update only the participant information for a waiver. This endpoint allows updating participant details like name, email, date of birth, and form responses without affecting the waiver's link status.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
required | Array of objects (WaiverParticipantUpdate) Array of participant updates |
{- "participants": [
- {
- "id": "507f1f77bcf86cd799439019",
- "customerName": "John Updated Doe",
- "customerEmail": "john.updated@example.com",
- "dateOfBirth": "1990-05-16",
- "phone": "+1-555-123-4568",
- "answers": [
- {
- "label": "Emergency Contact",
- "type": "text",
- "value": "Emergency contact name"
}
]
}
]
}{- "id": "507f1f77bcf86cd799439013",
- "remoteId": "123e4567-e89b-12d3-a456-426614174000",
- "remoteSystem": "507f1f77bcf86cd799439011",
- "customerEmail": "customer@example.com",
- "waiverTypeId": "waiver-template-123",
- "signedAt": "2024-03-15T14:30:00Z",
- "tags": [
- "high-risk",
- "adult"
], - "participants": [
- {
- "id": "507f1f77bcf86cd799439019",
- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "dateOfBirth": "1990-05-15",
- "phone": "+1-555-123-4567",
- "traveler": {
- "id": "507f1f77bcf86cd799439011"
}, - "answers": [
- {
- "label": "Emergency Contact",
- "type": "text",
- "value": "Emergency contact name"
}
]
}
], - "itemId": "507f1f77bcf86cd799439012",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "experiences": [
- {
- "id": "507f1f77bcf86cd799439011"
}
], - "purchases": [
- {
- "id": "507f1f77bcf86cd799439011"
}
], - "createdAt": "2024-03-15T14:35:00Z",
- "updatedAt": "2024-03-15T16:20:00Z"
}Returns the signed PDF document of the waiver by proxying the request to the external waiver system.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Returns available waiver templates from configured waiver plugins.
Templates represent the blank waiver forms that can be used to create new waivers. This endpoint is used to discover available waiver types for a seller.
| seller required | string Example: seller=507f1f77bcf86cd799439011 Seller ID to fetch templates for |
[- {
- "id": "template-123",
- "name": "Standard Liability Waiver",
- "description": "Standard waiver template for high-risk activities",
- "fields": [
- { }
]
}
]Retrieve a paginated list of merchandise items (wares) for a seller.
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
| seller required | string Example: seller=507f1f77bcf86cd799439020 Filter by seller ID |
{- "data": [
- {
- "id": "507f1f77bcf86cd799439011",
- "object": "ware",
- "name": "Adventure T-Shirt",
- "desc": "High-quality cotton t-shirt featuring our adventure logo",
- "type": "physical",
- "seller": {
- "id": "507f1f77bcf86cd799439020"
}, - "warePreference": {
- "fulfillmentType": "shipping",
- "refundPolicy": "refund_allowed",
- "revenueRecognitionPolicy": "creation",
- "fulfillmentPolicy": "manual"
}, - "createdAt": "2023-08-15T10:30:00Z",
- "updatedAt": "2023-08-16T14:20:00Z"
}
], - "paging": {
- "next": null
}
}Create a new merchandise item (ware) for the authenticated seller account.
| name required | string [ 1 .. 255 ] characters Name of the merchandise item |
| desc | string Full description of the merchandise item |
| excerpt | string <= 500 characters Short description or summary |
| type | string Enum: "physical" "digital" Type of merchandise |
object Terms and conditions for this ware | |
| allowedSources | Array of strings List of allowed sources for purchasing this ware |
required | object (ObjectReference) Reference to the seller |
object (WarePreference) Ware-specific preferences and policies | |
object Down deposit configuration | |
object (ObjectReference) Reference to the photo media object |
{- "name": "Adventure T-Shirt",
- "seller": {
- "id": "507f1f77bcf86cd799439020"
}, - "desc": "High-quality cotton t-shirt featuring our adventure logo",
- "excerpt": "Adventure-themed cotton t-shirt",
- "type": "physical",
- "allowedSources": [
- "checkout",
- "api"
], - "warePreference": {
- "fulfillmentType": "shipping",
- "refundPolicy": "refund_allowed",
- "revenueRecognitionPolicy": "creation",
- "fulfillmentPolicy": "manual"
}
}{- "id": "507f1f77bcf86cd799439011",
- "object": "ware",
- "name": "Adventure T-Shirt",
- "desc": "High-quality cotton t-shirt featuring our adventure logo",
- "type": "physical",
- "seller": {
- "id": "507f1f77bcf86cd799439020"
}, - "warePreference": {
- "fulfillmentType": "shipping",
- "refundPolicy": "refund_allowed",
- "revenueRecognitionPolicy": "creation",
- "fulfillmentPolicy": "manual"
}, - "createdAt": "2023-08-15T10:30:00Z",
- "updatedAt": "2023-08-15T10:30:00Z"
}Retrieve detailed information about a specific merchandise item (ware).
Some fields are only returned when the caller has seller/edit permissions (EDIT_WARE):
attachments: Documents and other attachments. Omitted from public responses.When accessed without authentication or without EDIT_WARE permission, the response uses the public context and these fields are stripped.
Use the expand parameter to include related data in a single request.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| expand | string Comma-separated list of fields to expand |
{- "id": "507f1f77bcf86cd799439011",
- "object": "ware",
- "name": "Adventure T-Shirt",
- "desc": "High-quality cotton t-shirt featuring our adventure logo",
- "excerpt": "Adventure-themed cotton t-shirt",
- "type": "physical",
- "allowedSources": [
- "checkout",
- "api"
], - "seller": {
- "id": "507f1f77bcf86cd799439020"
}, - "photo": null,
- "medias": [ ],
- "attachments": [ ],
- "warePreference": {
- "fulfillmentType": "shipping",
- "refundPolicy": "refund_allowed",
- "revenueRecognitionPolicy": "creation",
- "fulfillmentPolicy": "manual"
}, - "downDeposit": null,
- "catalog": [ ],
- "createdAt": "2023-08-15T10:30:00Z",
- "updatedAt": "2023-08-16T14:20:00Z",
- "deletedAt": null
}Update an existing merchandise item (ware). Only the provided fields will be updated; other fields remain unchanged.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| name required | string [ 1 .. 255 ] characters Name of the merchandise item |
| desc | string Full description of the merchandise item |
| excerpt | string <= 500 characters Short description or summary |
| type | string Enum: "physical" "digital" Type of merchandise |
object Terms and conditions for this ware | |
| allowedSources | Array of strings List of allowed sources for purchasing this ware |
required | object (ObjectReference) Reference to the seller |
object (WarePreference) Ware-specific preferences and policies | |
object Down deposit configuration | |
object (ObjectReference) Reference to the photo media object |
{- "name": "Adventure T-Shirt v2",
- "seller": {
- "id": "507f1f77bcf86cd799439020"
}, - "desc": "Updated high-quality cotton t-shirt with new adventure logo",
- "warePreference": {
- "fulfillmentType": "in_store",
- "refundPolicy": "refund_allowed",
- "revenueRecognitionPolicy": "fulfillment",
- "fulfillmentPolicy": "manual"
}
}{- "id": "507f1f77bcf86cd799439011",
- "object": "ware",
- "name": "Adventure T-Shirt",
- "desc": "High-quality cotton t-shirt featuring our adventure logo",
- "excerpt": "Adventure-themed cotton t-shirt",
- "type": "physical",
- "terms": {
- "id": "507f1f77bcf86cd799439100",
- "termsLegal": "string",
- "termsCustomer": "string"
}, - "allowedSources": [
- "checkout",
- "api"
], - "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "photo": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "medias": [
- {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "attachments": [
- {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "warePreference": {
- "fulfillmentType": "shipping",
- "refundPolicy": "refund_allowed",
- "revenueRecognitionPolicy": "creation",
- "fulfillmentPolicy": "immediate",
- "inventoryPolicy": "tracked"
}, - "downDeposit": {
- "enabled": true,
- "amountType": "percentage",
- "amount": 0.1
}, - "status": "draft",
- "catalog": [
- {
- "object": "ware_catalog_item",
- "id": "string",
- "name": "string",
- "type": "quantity",
- "caption": "string",
- "unitType": "demographic",
- "visibility": "public",
- "sku": "string",
- "required": false,
- "photo": {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}, - "defaultChoice": "string",
- "sequence": 0,
- "template": {
- "id": "string",
- "code": "adult",
- "type": "demographic"
}, - "unit": {
- "id": "string"
}, - "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "items": [
- {
- "object": "global_catalog_item"
}
], - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "status": "draft",
- "variantGroupOptions": [
- "string"
], - "barcode": "string",
- "pricePerUnit": {
- "price": 0.1,
- "priceType": "absolute"
}, - "strikeThroughPrice": 0.1,
- "available": 0,
- "oversellPolicy": "require_availability",
- "lowInventoryThreshold": 0,
- "inventory": {
- "id": "string"
}, - "prices": {
- "perUnit": {
- "price": 0.1,
- "priceType": "absolute"
}
}, - "medias": [
- {
- "id": "string",
- "url": "string",
- "caption": "string",
- "type": "image",
- "size": 0,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "product": {
- "id": "string"
}
}
], - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "deletedAt": "2019-08-24T14:15:22Z"
}Delete a merchandise item (ware). This is a soft delete operation.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Upload a photo/media for a merchandise item. The image file should be sent as the raw request body with appropriate Content-Type header.
Authorization: Requires EDIT_WARE permission.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Retrieve a ware photo. Returns a redirect to the CDN URL. Pass 'default' as media to get the primary photo.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| media required | string Media ID or 'default' for primary photo |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Update the caption for a ware media item.
Authorization: Requires EDIT_WARE permission.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| media required | string Media ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Delete a media item (photo) from a ware.
Authorization: Requires EDIT_WARE permission.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| media required | string Media ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Upload a PDF attachment for a merchandise item.
Authorization: Requires EDIT_WARE permission.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Update attachment metadata (title, caption).
Authorization: Requires EDIT_WARE permission.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| attachmentId required | string Attachment ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Delete an attachment from a ware.
Authorization: Requires EDIT_WARE permission.
| id required | string Example: 507f1f77bcf86cd799439011 Resource ID |
| attachmentId required | string Attachment ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Perform bulk operations on one or more inventory lots. Each operation carries a
client-supplied id (echoed back in the matching result), an op type, and a data object.
Supported operations:
increment: Adjust count or unavailable by a signed, non-zero delta valuepermanent_removal: Permanently remove physically destroyed units (value must be positive)Use the top-level errorStrategy to control behavior when an operation fails:
stop_on_failure (remaining operations are skipped) or continue_on_failure (default).
Authorization: Requires seller-level access to the inventory lot's seller.
required | Array of objects (WareInventoryLotOperation) non-empty List of inventory lot operations to perform |
| errorStrategy | string Default: "continue_on_failure" Enum: "stop_on_failure" "continue_on_failure" How to handle a failed operation:
|
{- "ops": [
- {
- "id": "op-1",
- "op": "increment",
- "data": {
- "id": "507f1f77bcf86cd799439030",
- "field": "count",
- "value": 50,
- "reason": "Restocked from supplier"
}
}
]
}{- "results": [
- {
- "id": "op-1",
- "status": "success"
}
]
}Retrieve a specific WareInventoryLot by its ID.
A WareInventoryLot represents a batch (lot) of stock within a WareInventory.
It tracks all quantity counters for that batch including available stock, reserved
units, fulfilled units, and audit counters for returns and cancellations.
Counter relationships:
available = count - unavailable - reservedreserved = purchased - returned - canceledonHand = count - unavailable| id required | string^[0-9a-fA-F]{24}$ Example: 507f1f77bcf86cd799439030 Inventory lot ID |
{- "id": "507f1f77bcf86cd799439030",
- "count": 100,
- "available": 42,
- "onHand": 95,
- "reserved": 53,
- "pendingFulfillment": 53,
- "fulfilled": 0,
- "returned": 0,
- "canceled": 0,
- "unavailable": 5,
- "purchased": 53,
- "inventory": {
- "id": "507f1f77bcf86cd799439020"
}, - "seller": {
- "id": "507f1f77bcf86cd799439010"
}, - "unit": {
- "id": "507f1f77bcf86cd799439040"
}, - "createdAt": "2026-01-15T10:30:00Z"
}A waitlist captures a customer's request for a slot on an experience that is currently unavailable — full, blacked out, or limited by a per-slot cap. A waitlist holds a single experience item together with the customer's requested arrival date and time (or time range).
Waitlists contain the full purchase payload and have the waitlist status. When a slot opens and the request is fulfilled, the waitlist is converted into a regular purchase, at which point its purchase reference and convertedAt timestamp are populated.
The waitlist feature is enabled or disabled per experience through its waitlist preference see POST/PUT /experiences/{id}/waitlist. The preference controls where the waitlist is offered — including whether it applies to max-capacity (capped) events via the enabledForCappedEvents flag — so a seller can turn waitlisting on or off for capped events independently of the other checkout surfaces.
Retrieve a paginated list of waitlists. The seller query parameter is
required.
When a search term is provided together with seller, results are served
from Elasticsearch; otherwise they are read directly from the database.
| seller required | string Example: seller=507f1f77bcf86cd799439011 Seller ID to list waitlists for. Required. |
| type | string Enum: "waitlist_purchase" "waitlist" Waitlist type to filter by. Defaults to |
| search | string Example: search=john@example.com Search term matched against customer name, email, phone, and other
waitlist fields. Triggers Elasticsearch-backed search when combined with
|
| arrivalTimeRange.startTime | string Filter waitlists by arrival time range start (time-based filter). |
| arrivalTimeRange.endTime | string Filter waitlists by arrival time range end (time-based filter). |
| limit | integer [ 1 .. 100 ] Default: 20 Number of items to return (max 100) |
| skip | integer >= 0 Default: 0 Number of items to skip |
{- "data": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "object": "waitlist_purchase",
- "status": "waitlist",
- "internalStatus": "committed",
- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "customerLocale": "en-US",
- "customerTimezoneName": "America/New_York",
- "phone": "+1234567890",
- "phoneCanonical": "1234567890",
- "currency": "USD",
- "amount": 150,
- "amounts": {
- "property1": 0.1,
- "property2": 0.1
}, - "balances": {
- "property1": 0.1,
- "property2": 0.1
}, - "balance": 0,
- "payNow": 50,
- "dueNow": 50,
- "minimumDue": 25,
- "affiliatePayment": 15,
- "referenceId": "EXT-BOOKING-123",
- "source": "website",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "organizer": {
- "id": "507f1f77bcf86cd799439011"
}, - "partnerSeller": {
- "id": "507f1f77bcf86cd799439011"
}, - "partner": {
- "id": "string",
- "object": "string"
}, - "affiliate": {
- "id": "507f1f77bcf86cd799439011"
}, - "conversation": {
- "id": "507f1f77bcf86cd799439011"
}, - "waitlist": {
- "id": "507f1f77bcf86cd799439011"
}, - "travelers": [
- {
- "id": "507f1f77bcf86cd799439011"
}
], - "items": [
- {
- "id": "60f7b3c4e4b0a1234567890b",
- "object": "experience_purchase_item",
- "status": "confirmed",
- "amount": 75,
- "currency": "USD",
- "quantity": 2,
- "product": {
- "id": "507f1f77bcf86cd799439011"
}, - "productName": "City Walking Tour",
- "purchase": {
- "id": "507f1f77bcf86cd799439011"
}, - "source": "website",
- "lineItems": [
- {
- "id": "60f7b3c4e4b0a1234567890c",
- "object": "line_item",
- "type": "fee",
- "name": "Service Fee",
- "code": "SERVICE_FEE_001",
- "price": 25,
- "amount": 50,
- "quantity": 2,
- "destination": "seller",
- "visibility": "all",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "unit": {
- "id": "507f1f77bcf86cd799439011"
}, - "template": {
- "id": "507f1f77bcf86cd799439011"
}, - "meta": { }
}
], - "parentProduct": {
- "id": "string",
- "object": "string"
}, - "clientId": "client-item-abc123",
- "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T11:45:00Z",
- "pickupLocation": "Grand Canyon Visitor Center, S Entrance Rd, Grand Canyon Village, AZ 86023",
- "ticket": [
- {
- "code": "XOLA-ABC123",
- "provider": "xola",
- "createdAt": "2024-01-15T10:30:00+00:00",
- "meta": { }
}
], - "referenceId": "RESALE-REF-001",
- "deposit": {
- "enabled": true,
- "amount": 50
}
}
], - "lineItems": [
- {
- "id": "60f7b3c4e4b0a1234567890c",
- "object": "line_item",
- "type": "fee",
- "name": "Service Fee",
- "code": "SERVICE_FEE_001",
- "price": 25,
- "amount": 50,
- "quantity": 2,
- "destination": "seller",
- "visibility": "all",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "unit": {
- "id": "507f1f77bcf86cd799439011"
}, - "template": {
- "id": "507f1f77bcf86cd799439011"
}, - "meta": { }
}
], - "tags": [
- {
- "id": "string",
- "system": false,
- "type": "string"
}
], - "notes": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "text": "Customer requested window seat",
- "type": "general",
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "reminders": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "type": "follow_up",
- "title": "Follow up with customer",
- "description": "Customer asked about group discounts",
- "status": "active",
- "remindAt": "2023-12-08T10:00:00Z",
- "completed": false,
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "paymentReminders": [
- {
- "id": "60f7b3c4e4b0a1234567890d",
- "type": "invoice_traveler",
- "amount": 100,
- "dueAt": "2023-12-08T10:00:00Z",
- "sentAt": "2019-08-24T14:15:22Z",
- "status": "pending"
}
], - "splitPayment": {
- "enabled": false
}, - "trackingData": {
- "source": "string",
- "medium": "string",
- "campaign": "string",
- "referrer": "string",
- "ip": "string",
- "fbp": "string",
- "fbc": "string",
- "userAgent": "string",
- "gaClientId": "string",
- "clientIpAddress": "string"
}, - "telemetry": {
- "sessionId": "string",
- "userAgent": "string",
- "screenResolution": "string",
- "timezone": "string"
}, - "meta": { },
- "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T11:45:00Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "requiresCaptcha": false,
- "termsAgreedAt": "2023-12-07T10:25:00Z",
- "releaseHoldAt": "2023-12-07T12:00:00Z",
- "notifyAt": "2023-12-07T09:00:00Z",
- "migratedAt": "2023-12-07T08:00:00Z",
- "commissionRefundProcessedAt": "2023-12-07T16:00:00Z",
- "purchase": {
- "id": "507f1f77bcf86cd799439011"
}, - "convertedAt": "2024-12-15T10:00:00Z",
- "deletedAt": "2024-12-16T10:00:00Z"
}
], - "paging": {
- "next": "string",
- "_es": true
}
}Create a waitlist for an experience. A waitlist accepts exactly one item referencing an experience and the requested arrival date/time.
The following rules are enforced:
multi_item_waitlists_not_supported).experience or product
(product_required); the experience must exist (invalid_experience).arrivalTimeRange cannot be supplied (waitlist_limit_enabled) and the
request is rejected if the limit for the requested slot has been reached
(waitlist_limit_reached).source is checkout, the requested slot is validated against the
experience's maximum capacity and blackout schedules.| dryRun | boolean Default: false When |
| customerName | string Name of the customer joining the waitlist |
| customerEmail | string <email> Email address of the customer. If omitted, the top-level |
string <email> Fallback customer email, used when | |
| phone | string or null Customer's phone number |
object (ObjectReference) Seller the waitlist belongs to | |
| source | string Source where the waitlist originated. When set to |
required | Array of objects (WaitlistItemRequest) = 1 items The single item being waitlisted. Must reference an experience (through
|
object Additional metadata |
{- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "items": [
- {
- "experience": {
- "id": "507f1f77bcf86cd799439012"
}, - "arrivalDate": "2024-12-20",
- "arrivalTime": "10:00",
- "quantity": 2
}
]
}{- "id": "60f7b3c4e4b0a1234567890a",
- "object": "waitlist_purchase",
- "status": "waitlist",
- "internalStatus": "committed",
- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "customerLocale": "en-US",
- "customerTimezoneName": "America/New_York",
- "phone": "+1234567890",
- "phoneCanonical": "1234567890",
- "currency": "USD",
- "amount": 150,
- "amounts": {
- "property1": 0.1,
- "property2": 0.1
}, - "balances": {
- "property1": 0.1,
- "property2": 0.1
}, - "balance": 0,
- "payNow": 50,
- "dueNow": 50,
- "minimumDue": 25,
- "affiliatePayment": 15,
- "referenceId": "EXT-BOOKING-123",
- "source": "website",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "organizer": {
- "id": "507f1f77bcf86cd799439011"
}, - "partnerSeller": {
- "id": "507f1f77bcf86cd799439011"
}, - "partner": {
- "id": "string",
- "object": "string"
}, - "affiliate": {
- "id": "507f1f77bcf86cd799439011"
}, - "conversation": {
- "id": "507f1f77bcf86cd799439011"
}, - "waitlist": {
- "id": "507f1f77bcf86cd799439011"
}, - "travelers": [
- {
- "id": "507f1f77bcf86cd799439011"
}
], - "items": [
- {
- "id": "60f7b3c4e4b0a1234567890b",
- "object": "experience_purchase_item",
- "status": "confirmed",
- "amount": 75,
- "currency": "USD",
- "quantity": 2,
- "product": {
- "id": "507f1f77bcf86cd799439011"
}, - "productName": "City Walking Tour",
- "purchase": {
- "id": "507f1f77bcf86cd799439011"
}, - "source": "website",
- "lineItems": [
- {
- "id": "60f7b3c4e4b0a1234567890c",
- "object": "line_item",
- "type": "fee",
- "name": "Service Fee",
- "code": "SERVICE_FEE_001",
- "price": 25,
- "amount": 50,
- "quantity": 2,
- "destination": "seller",
- "visibility": "all",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "unit": {
- "id": "507f1f77bcf86cd799439011"
}, - "template": {
- "id": "507f1f77bcf86cd799439011"
}, - "meta": { }
}
], - "parentProduct": {
- "id": "string",
- "object": "string"
}, - "clientId": "client-item-abc123",
- "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T11:45:00Z",
- "pickupLocation": "Grand Canyon Visitor Center, S Entrance Rd, Grand Canyon Village, AZ 86023",
- "ticket": [
- {
- "code": "XOLA-ABC123",
- "provider": "xola",
- "createdAt": "2024-01-15T10:30:00+00:00",
- "meta": { }
}
], - "referenceId": "RESALE-REF-001",
- "deposit": {
- "enabled": true,
- "amount": 50
}
}
], - "lineItems": [
- {
- "id": "60f7b3c4e4b0a1234567890c",
- "object": "line_item",
- "type": "fee",
- "name": "Service Fee",
- "code": "SERVICE_FEE_001",
- "price": 25,
- "amount": 50,
- "quantity": 2,
- "destination": "seller",
- "visibility": "all",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "unit": {
- "id": "507f1f77bcf86cd799439011"
}, - "template": {
- "id": "507f1f77bcf86cd799439011"
}, - "meta": { }
}
], - "tags": [
- {
- "id": "string",
- "system": false,
- "type": "string"
}
], - "notes": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "text": "Customer requested window seat",
- "type": "general",
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "reminders": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "type": "follow_up",
- "title": "Follow up with customer",
- "description": "Customer asked about group discounts",
- "status": "active",
- "remindAt": "2023-12-08T10:00:00Z",
- "completed": false,
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "paymentReminders": [
- {
- "id": "60f7b3c4e4b0a1234567890d",
- "type": "invoice_traveler",
- "amount": 100,
- "dueAt": "2023-12-08T10:00:00Z",
- "sentAt": "2019-08-24T14:15:22Z",
- "status": "pending"
}
], - "splitPayment": {
- "enabled": false
}, - "trackingData": {
- "source": "string",
- "medium": "string",
- "campaign": "string",
- "referrer": "string",
- "ip": "string",
- "fbp": "string",
- "fbc": "string",
- "userAgent": "string",
- "gaClientId": "string",
- "clientIpAddress": "string"
}, - "telemetry": {
- "sessionId": "string",
- "userAgent": "string",
- "screenResolution": "string",
- "timezone": "string"
}, - "meta": { },
- "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T11:45:00Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "requiresCaptcha": false,
- "termsAgreedAt": "2023-12-07T10:25:00Z",
- "releaseHoldAt": "2023-12-07T12:00:00Z",
- "notifyAt": "2023-12-07T09:00:00Z",
- "migratedAt": "2023-12-07T08:00:00Z",
- "commissionRefundProcessedAt": "2023-12-07T16:00:00Z",
- "purchase": {
- "id": "507f1f77bcf86cd799439011"
}, - "convertedAt": "2024-12-15T10:00:00Z",
- "deletedAt": "2024-12-16T10:00:00Z"
}Retrieve a single waitlist by its ID.
Requires the VIEW_PURCHASE permission on the waitlist.
| id required | string Example: 507f1f77bcf86cd799439011 Waitlist ID |
{- "id": "60f7b3c4e4b0a1234567890a",
- "object": "waitlist_purchase",
- "status": "waitlist",
- "internalStatus": "committed",
- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "customerLocale": "en-US",
- "customerTimezoneName": "America/New_York",
- "phone": "+1234567890",
- "phoneCanonical": "1234567890",
- "currency": "USD",
- "amount": 150,
- "amounts": {
- "property1": 0.1,
- "property2": 0.1
}, - "balances": {
- "property1": 0.1,
- "property2": 0.1
}, - "balance": 0,
- "payNow": 50,
- "dueNow": 50,
- "minimumDue": 25,
- "affiliatePayment": 15,
- "referenceId": "EXT-BOOKING-123",
- "source": "website",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "organizer": {
- "id": "507f1f77bcf86cd799439011"
}, - "partnerSeller": {
- "id": "507f1f77bcf86cd799439011"
}, - "partner": {
- "id": "string",
- "object": "string"
}, - "affiliate": {
- "id": "507f1f77bcf86cd799439011"
}, - "conversation": {
- "id": "507f1f77bcf86cd799439011"
}, - "waitlist": {
- "id": "507f1f77bcf86cd799439011"
}, - "travelers": [
- {
- "id": "507f1f77bcf86cd799439011"
}
], - "items": [
- {
- "id": "60f7b3c4e4b0a1234567890b",
- "object": "experience_purchase_item",
- "status": "confirmed",
- "amount": 75,
- "currency": "USD",
- "quantity": 2,
- "product": {
- "id": "507f1f77bcf86cd799439011"
}, - "productName": "City Walking Tour",
- "purchase": {
- "id": "507f1f77bcf86cd799439011"
}, - "source": "website",
- "lineItems": [
- {
- "id": "60f7b3c4e4b0a1234567890c",
- "object": "line_item",
- "type": "fee",
- "name": "Service Fee",
- "code": "SERVICE_FEE_001",
- "price": 25,
- "amount": 50,
- "quantity": 2,
- "destination": "seller",
- "visibility": "all",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "unit": {
- "id": "507f1f77bcf86cd799439011"
}, - "template": {
- "id": "507f1f77bcf86cd799439011"
}, - "meta": { }
}
], - "parentProduct": {
- "id": "string",
- "object": "string"
}, - "clientId": "client-item-abc123",
- "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T11:45:00Z",
- "pickupLocation": "Grand Canyon Visitor Center, S Entrance Rd, Grand Canyon Village, AZ 86023",
- "ticket": [
- {
- "code": "XOLA-ABC123",
- "provider": "xola",
- "createdAt": "2024-01-15T10:30:00+00:00",
- "meta": { }
}
], - "referenceId": "RESALE-REF-001",
- "deposit": {
- "enabled": true,
- "amount": 50
}
}
], - "lineItems": [
- {
- "id": "60f7b3c4e4b0a1234567890c",
- "object": "line_item",
- "type": "fee",
- "name": "Service Fee",
- "code": "SERVICE_FEE_001",
- "price": 25,
- "amount": 50,
- "quantity": 2,
- "destination": "seller",
- "visibility": "all",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "unit": {
- "id": "507f1f77bcf86cd799439011"
}, - "template": {
- "id": "507f1f77bcf86cd799439011"
}, - "meta": { }
}
], - "tags": [
- {
- "id": "string",
- "system": false,
- "type": "string"
}
], - "notes": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "text": "Customer requested window seat",
- "type": "general",
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "reminders": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "type": "follow_up",
- "title": "Follow up with customer",
- "description": "Customer asked about group discounts",
- "status": "active",
- "remindAt": "2023-12-08T10:00:00Z",
- "completed": false,
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "paymentReminders": [
- {
- "id": "60f7b3c4e4b0a1234567890d",
- "type": "invoice_traveler",
- "amount": 100,
- "dueAt": "2023-12-08T10:00:00Z",
- "sentAt": "2019-08-24T14:15:22Z",
- "status": "pending"
}
], - "splitPayment": {
- "enabled": false
}, - "trackingData": {
- "source": "string",
- "medium": "string",
- "campaign": "string",
- "referrer": "string",
- "ip": "string",
- "fbp": "string",
- "fbc": "string",
- "userAgent": "string",
- "gaClientId": "string",
- "clientIpAddress": "string"
}, - "telemetry": {
- "sessionId": "string",
- "userAgent": "string",
- "screenResolution": "string",
- "timezone": "string"
}, - "meta": { },
- "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T11:45:00Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "requiresCaptcha": false,
- "termsAgreedAt": "2023-12-07T10:25:00Z",
- "releaseHoldAt": "2023-12-07T12:00:00Z",
- "notifyAt": "2023-12-07T09:00:00Z",
- "migratedAt": "2023-12-07T08:00:00Z",
- "commissionRefundProcessedAt": "2023-12-07T16:00:00Z",
- "purchase": {
- "id": "507f1f77bcf86cd799439011"
}, - "convertedAt": "2024-12-15T10:00:00Z",
- "deletedAt": "2024-12-16T10:00:00Z"
}Partially update a waitlist. The waitlist status is always retained as
waitlist.
Requires the EDIT_PURCHASE permission on the waitlist.
| id required | string Example: 507f1f77bcf86cd799439011 Waitlist ID |
| dryRun | boolean Default: false When |
| customerName | string Updated customer name |
| customerEmail | string <email> Updated customer email |
| phone | string or null Updated customer phone number |
Array of objects (WaitlistItemRequest) Updated waitlist items | |
object Additional metadata |
{- "customerName": "Jane Doe",
- "phone": "+1987654321"
}{- "id": "60f7b3c4e4b0a1234567890a",
- "object": "waitlist_purchase",
- "status": "waitlist",
- "internalStatus": "committed",
- "customerName": "John Doe",
- "customerEmail": "john.doe@example.com",
- "customerLocale": "en-US",
- "customerTimezoneName": "America/New_York",
- "phone": "+1234567890",
- "phoneCanonical": "1234567890",
- "currency": "USD",
- "amount": 150,
- "amounts": {
- "property1": 0.1,
- "property2": 0.1
}, - "balances": {
- "property1": 0.1,
- "property2": 0.1
}, - "balance": 0,
- "payNow": 50,
- "dueNow": 50,
- "minimumDue": 25,
- "affiliatePayment": 15,
- "referenceId": "EXT-BOOKING-123",
- "source": "website",
- "seller": {
- "id": "507f1f77bcf86cd799439011"
}, - "organizer": {
- "id": "507f1f77bcf86cd799439011"
}, - "partnerSeller": {
- "id": "507f1f77bcf86cd799439011"
}, - "partner": {
- "id": "string",
- "object": "string"
}, - "affiliate": {
- "id": "507f1f77bcf86cd799439011"
}, - "conversation": {
- "id": "507f1f77bcf86cd799439011"
}, - "waitlist": {
- "id": "507f1f77bcf86cd799439011"
}, - "travelers": [
- {
- "id": "507f1f77bcf86cd799439011"
}
], - "items": [
- {
- "id": "60f7b3c4e4b0a1234567890b",
- "object": "experience_purchase_item",
- "status": "confirmed",
- "amount": 75,
- "currency": "USD",
- "quantity": 2,
- "product": {
- "id": "507f1f77bcf86cd799439011"
}, - "productName": "City Walking Tour",
- "purchase": {
- "id": "507f1f77bcf86cd799439011"
}, - "source": "website",
- "lineItems": [
- {
- "id": "60f7b3c4e4b0a1234567890c",
- "object": "line_item",
- "type": "fee",
- "name": "Service Fee",
- "code": "SERVICE_FEE_001",
- "price": 25,
- "amount": 50,
- "quantity": 2,
- "destination": "seller",
- "visibility": "all",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "unit": {
- "id": "507f1f77bcf86cd799439011"
}, - "template": {
- "id": "507f1f77bcf86cd799439011"
}, - "meta": { }
}
], - "parentProduct": {
- "id": "string",
- "object": "string"
}, - "clientId": "client-item-abc123",
- "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T11:45:00Z",
- "pickupLocation": "Grand Canyon Visitor Center, S Entrance Rd, Grand Canyon Village, AZ 86023",
- "ticket": [
- {
- "code": "XOLA-ABC123",
- "provider": "xola",
- "createdAt": "2024-01-15T10:30:00+00:00",
- "meta": { }
}
], - "referenceId": "RESALE-REF-001",
- "deposit": {
- "enabled": true,
- "amount": 50
}
}
], - "lineItems": [
- {
- "id": "60f7b3c4e4b0a1234567890c",
- "object": "line_item",
- "type": "fee",
- "name": "Service Fee",
- "code": "SERVICE_FEE_001",
- "price": 25,
- "amount": 50,
- "quantity": 2,
- "destination": "seller",
- "visibility": "all",
- "visible": true,
- "system": false,
- "includeInAmount": true,
- "unit": {
- "id": "507f1f77bcf86cd799439011"
}, - "template": {
- "id": "507f1f77bcf86cd799439011"
}, - "meta": { }
}
], - "tags": [
- {
- "id": "string",
- "system": false,
- "type": "string"
}
], - "notes": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "text": "Customer requested window seat",
- "type": "general",
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "reminders": [
- {
- "id": "60f7b3c4e4b0a1234567890a",
- "type": "follow_up",
- "title": "Follow up with customer",
- "description": "Customer asked about group discounts",
- "status": "active",
- "remindAt": "2023-12-08T10:00:00Z",
- "completed": false,
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}
}
], - "paymentReminders": [
- {
- "id": "60f7b3c4e4b0a1234567890d",
- "type": "invoice_traveler",
- "amount": 100,
- "dueAt": "2023-12-08T10:00:00Z",
- "sentAt": "2019-08-24T14:15:22Z",
- "status": "pending"
}
], - "splitPayment": {
- "enabled": false
}, - "trackingData": {
- "source": "string",
- "medium": "string",
- "campaign": "string",
- "referrer": "string",
- "ip": "string",
- "fbp": "string",
- "fbc": "string",
- "userAgent": "string",
- "gaClientId": "string",
- "clientIpAddress": "string"
}, - "telemetry": {
- "sessionId": "string",
- "userAgent": "string",
- "screenResolution": "string",
- "timezone": "string"
}, - "meta": { },
- "createdAt": "2023-12-07T10:30:00Z",
- "updatedAt": "2023-12-07T11:45:00Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "requiresCaptcha": false,
- "termsAgreedAt": "2023-12-07T10:25:00Z",
- "releaseHoldAt": "2023-12-07T12:00:00Z",
- "notifyAt": "2023-12-07T09:00:00Z",
- "migratedAt": "2023-12-07T08:00:00Z",
- "commissionRefundProcessedAt": "2023-12-07T16:00:00Z",
- "purchase": {
- "id": "507f1f77bcf86cd799439011"
}, - "convertedAt": "2024-12-15T10:00:00Z",
- "deletedAt": "2024-12-16T10:00:00Z"
}Add a tag to a waitlist. The waitlist entry may be a waitlist purchase or a waitlist order, and the required permission differs accordingly.
Requires the CREATE_WAITLIST_PURCHASE_TAGS permission for waitlist
purchases, or the CREATE_ORDER_TAGS permission for waitlist orders.
| id required | string Example: 507f1f77bcf86cd799439011 Waitlist ID |
| id required | string Tag identifier/label |
| system | boolean Default: false Whether to create the tag as a system tag. Only applied for callers with
the |
{- "id": "Priority"
}{- "id": "Priority"
}Remove a tag from a waitlist. System-generated tags cannot be removed and
return a 403 response.
Requires the DELETE_WAITLIST_PURCHASE_TAGS permission for waitlist
purchases, or the EDIT_ORDER_TAGS permission for waitlist orders.
| id required | string Example: 507f1f77bcf86cd799439011 Waitlist ID |
| tagId required | string Example: Priority Tag identifier to remove. |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}Add a note to a waitlist entry. The waitlist entry may be a waitlist purchase or a waitlist order.
Requires the CREATE_WAITLIST_PURCHASE_NOTES permission for waitlist
purchases, or the CREATE_ORDER_NOTES permission for waitlist orders.
| id required | string Example: 507f1f77bcf86cd799439011 Waitlist ID |
| text required | string Note content |
{- "text": "Customer flexible on date - contact when a slot opens"
}{- "id": "507f1f77bcf86cd799439011",
- "text": "Customer requested a window seat",
- "created": "2019-08-24T14:15:22Z",
- "updated": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": false
}Update the text of an existing waitlist note.
Requires the EDIT_WAITLIST_PURCHASE_NOTES permission for waitlist
purchases, or the EDIT_ORDER_NOTES permission for waitlist orders.
| id required | string Example: 507f1f77bcf86cd799439011 Waitlist ID |
| noteId required | string Example: 507f1f77bcf86cd799439013 Note ID |
| text required | string Updated note content |
| system | boolean Whether the note is a system-generated note. |
{- "text": "Customer confirmed - moved to a booking"
}{- "id": "507f1f77bcf86cd799439011",
- "text": "Customer requested a window seat",
- "created": "2019-08-24T14:15:22Z",
- "updated": "2019-08-24T14:15:22Z",
- "createdBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "updatedBy": {
- "id": "507f1f77bcf86cd799439011"
}, - "system": false
}Delete a waitlist note.
Requires the DELETE_WAITLIST_PURCHASE_NOTES permission for waitlist
purchases, or the DELETE_ORDER_NOTES permission for waitlist orders.
| id required | string Example: 507f1f77bcf86cd799439011 Waitlist ID |
| noteId required | string Example: 507f1f77bcf86cd799439013 Note ID |
{- "error": {
- "reason": "string",
- "message": "string",
- "details": { }
}, - "message": "string",
- "code": 0
}