{"openapi":"3.1.0","info":{"title":"TripWorks REST API","version":"1.1.6","description":"## Getting Started\n\nBuild integrations and automate work on your TripWorks account \u2014 sync bookings, manage gift cards and locations, or connect your own tools, all through simple, authenticated REST endpoints.\n\nEvery request is scoped to your account with a REST API key, created under **Setup \u2192 REST API \u2192 Keys**.\n\nEvery account has its own subdomain \u2014 requests go to `https:\/\/your-account.tripworks.com`, the same server shown above.\n\nVerify a key and list a resource:\n\n```\ncurl https:\/\/your-account.tripworks.com\/rest\/gift-cards \\\n  -H \u0022Authorization: Bearer tw_xxxxxxxxxxxxxxxxxxxx\u0022\n```\n\nEvery response includes a `success` boolean. A list response nests its rows under the resource\u0027s own key (`gift_cards`, `locations`, and so on) alongside a `meta` object (`per_page`, `has_more`, `next_cursor`) \u2014 see **Requests** below for what drives those. A failed request includes a human-readable `message` plus a structured `error` object with a stable `code` your code can branch on, rather than parsing the message text.\n\nBrowse a resource under **Resources** in the sidebar for its actions, fields, and a live example you can run against real data.\n\n## Authentication\n\nEvery request needs a REST API key, created under **Setup \u2192 REST API \u2192 Keys** \u2014 each key belongs to exactly one account, so the key itself is what determines whose data a request can see or change.\n\nSend the key as a bearer token:\n\n```\nAuthorization: Bearer tw_xxxxxxxxxxxxxxxxxxxx\n```\n\nA missing or malformed header gets a `401`. A key that\u0027s valid but lacks the right scope for the request gets a `403` instead \u2014 scopes are granted per resource and per direction (`gift-cards.read`, `gift-cards.write`, and so on) when the key is created, and can be narrowed to exactly what an integration needs rather than granting access to everything.\n\n## Requests\n\n**Filtering**\n\nA bare `?field=value` always means equality; every other comparison uses Stripe\u0027s bracket convention, `?field[op]=value` (`contains`, `begins_with`, `gte`, `lte`). Only the operators a field actually declares are accepted \u2014 an undeclared one is rejected with a `422`.\n\n**Sorting**\n\n`?sort=field` (ascending) or `?sort=-field` (descending). An undeclared sort field gets a `422`.\n\n**Pagination**\n\nCursor-based, not page\/offset: `?per_page=N` (capped per resource) and `?cursor=` an opaque token copied from the previous response\u0027s `meta.next_cursor`. Keep paging while `meta.has_more` is `true`; a cursor reused against a different `?sort=` gets a `422` rather than silently returning the wrong page.\n\n[Download the OpenAPI document](\/api\/docs\/openapi.json)","termsOfService":"https:\/\/www.tripworks.com\/terms-and-conditions","contact":{"name":"TripWorks Support","url":"https:\/\/help.tripworks.com","email":"support@tripworks.com"},"x-logo":{"url":"https:\/\/cdn-images.tripworks.com\/images\/logos\/tripworks-logo-square.svg","altText":"TripWorks"}},"servers":[{"url":"https:\/\/{account}.tripworks.com","variables":{"account":{"default":"your-account"}}}],"tags":[{"name":"analytics","description":"Read-only counts, sums, averages, minimums and maximums over your data, with an automatic comparison against the preceding period of equal length, plus the headline business metrics shown on the BI dashboard.","x-displayName":"Analytics"},{"name":"audit-logs","description":"Read-only access to this account\u0027s audit trail \u2014 who changed what, when, including before\/after field diffs.","x-displayName":"Audit Log"},{"name":"bookings","description":"Read bookings and act on them: set a booking\u0027s status (check a guest in, mark a no-show, and so on), mark a booking\u0027s waivers signed, and add or remove a booking on an existing trip order.\n\nEvery change goes through the same rules the back office applies, so a booking can never be changed here in a way the app itself would refuse. Changing a booking\u0027s customer is not offered; edit guest details with `PATCH \/rest\/customers\/{id}` using the booking\u0027s `customer_id`.\n\n**Custom fields**\n\nEvery booking carries `custom_fields`, a list of `{id, slug, name, type, value, required}` for each booking-level custom field that applies to its experience, in back-office order, answered or not (`value` is null when unanswered; a `required` field with a null value means the booking is incomplete, for example because the field was made required later). They are read-only: values cannot be written through the API yet, and there is no separate endpoint for field definitions. Identify a field by `id`, not `slug`, which is not unique.\n\n**Money**\n\nEvery amount is an integer in the account\u0027s minor currency unit (cents for USD), in the account\u0027s currency (`AccountProps.currency`, an ISO code such as `USD`). Amounts are never decimals and no currency is repeated on each booking. The only non-integer number is `promo_code_percent`, a percent from 0 to 100. A null amount means it does not apply, and 0 or null both mean nothing is charged. As everywhere in this API, a field whose value is null is left out of the JSON, so treat an absent field as null.\n\nThe booking\u0027s price is exactly `total = experience_total + products_total + addons_total + the account\u0027s taxes, fees and surcharges on the booking`. It excludes guest fees, tips and payments, so `total` is what the booking costs, not what is still owed.\n\n- `customer_type_amount` is the price-list price of the ticket type (for a group ticket, the full group price). `customer_type_amount_override` is a manual per-booking price that replaces it everywhere when set, even 0. `experience_total` is what the guest pays for the ticket: that price after the override, promo code and voucher, before tax (for a group ticket, this booking\u0027s share; the last booking absorbs rounding).\n- Gross and net pairs: `products_total_gross` and `addons_total_gross` are before discounts, `products_total` and `addons_total` after. Discounts are `promo_code_amount` (ticket), `promo_code_total` (ticket, add-ons and products) and `voucher_code_discount`. They are already subtracted; never subtract them again.\n- Taxes, fees and surcharges are not itemised: they are the part of `total` left after `experience_total`, `products_total` and `addons_total`. Rates are snapshots from when the trip order was created, so later rate changes do not alter existing bookings.\n- A complimentary booking is 0 with no tax.\n- `deposit_amount` is only set for experiences that take deposits per ticket type. `total_sales` is a reporting figure (ticket, products, add-ons and revenue taxes, less reseller commission), not what the guest pays.\n- Reseller commission fields (`reseller_commission_*`, `commissionable_*`, `non_commissionable_*`) are commercially sensitive and are returned to every caller with `bookings.read`.\n\nWorked example: an Adult ticket lists at 10000 (`customer_type_amount`). A 10% promo code takes off 1000 (`promo_code_amount`), so `experience_total` is 9000. A 1500 product and a 500 add-on bring the pre-tax subtotal to 11000. An 8% tax charges 720 on the ticket, 120 on the product and 40 on the add-on, 880 in all. Then `total` is 9000 + 1500 + 500 + 880 = 11880, meaning $118.80.\n\n**Dates and times**\n\nEvery datetime is an RFC 3339 instant. Resource assignment times (`resources[].start_time` and `end_time`) carry the venue\u0027s UTC offset, which changes with daylight saving, so parse them as timestamps and do not strip the offset.\n\n**Cancelled trip orders**\n\nRemoving the last booking on a trip order cancels the order but keeps the booking row, so bookings on a cancelled trip order are still returned by the read endpoints. Every write on such a booking (add a booking to the order, set status, mark waivers signed, remove) is refused with 409 `trip_order_cancelled`.\n\n**Waivers**\n\nEvery booking carries `waivers`, a list of `{waiver_type_id, name, status, has_signed_waiver}` with one entry per waiver requirement of its experience, signed or not. `status` is `signed` or `unsigned`; a requirement with no signing record is `unsigned`. `has_signed_waiver` is true only when a signed document is on file, so a requirement staff marked signed has `status` `signed` and `has_signed_waiver` false. The booking\u0027s own `booking_waiver_status` is a stored summary that is set to `signed` only when every requirement is signed, and it can drift from the per-waiver entries; use `waivers` for the truth per requirement. Additional signers beyond the ticket count are not part of these entries, and signer details and document links are never returned. A single requirement can be marked signed by staff (no document) with `POST \/rest\/bookings\/{id}\/waivers\/{waiver_type_id}\/mark-signed`; nothing can be marked unsigned.\n\n**Getting the IDs you need**\n\n- `experience_customer_type_id` (which ticket type to add): `GET \/rest\/experiences` or `GET \/rest\/experiences\/{id}`, then `customer_types[].id`. It must belong to the trip order\u0027s experience.\n- `trip_order_id`: the `trip_order_id` on any existing booking (`GET \/rest\/bookings`, filter with `?trip_order_id=`).\n- Products and add-ons on a booking (line by line): `GET \/rest\/bookings\/{id}\/products` and `GET \/rest\/bookings\/{id}\/add-ons`; their totals add up to the booking\u0027s `products_total` and `addons_total`. The booking\u0027s custom fields are also available on their own at `GET \/rest\/bookings\/{id}\/custom-fields`, and its waiver requirements at `GET \/rest\/bookings\/{id}\/waivers`.\n- Resource assignments (times, names, duration): the `resources` list on each booking: each entry\u0027s `id` is the public id of that assignment and its `resource_id` is the resource\u0027s id.\n- `booking_status_id`: `GET \/rest\/bookings\/statuses` (identify a status by `id`; custom statuses all share the slug `user`).\n- `customer_id`: search first with `GET \/rest\/customers?email=` or `?phone_format_164=` (E.164, `+` encoded as `%2B`). Creating a customer does not deduplicate, so a search-then-reuse avoids duplicates.\n\n**Choosing a customer when adding a booking**\n\n- Reuse an existing guest: pass `customer_id`.\n- A new guest you only need for this booking: pass an inline `customer` object.\n- A guest you will reuse later or edit separately: `POST \/rest\/customers` first, then pass the returned `id` as `customer_id`.\n- Omit both and each new booking gets its own blank customer, as in the back office.\n\nA customer can only be attached when the request adds exactly one booking.","x-displayName":"Bookings"},{"name":"countrys","description":"Read-only list of the countries TripWorks supports, identified by their two-letter ISO 3166-1 alpha-2 code and by the public `id` that other resources return as `country_id`. Use it to confirm exactly which country codes are accepted wherever an address or country is given, and to resolve a `country_id` (for example from a grouped or filtered result) back to a country.","x-displayName":"Countries"},{"name":"customers","description":"Manage the people who book, sign waivers for, or receive communications about your experiences.","x-displayName":"Customers"},{"name":"experiences","description":"Manage the experiences you sell \u2014 name, headline, description, duration, departure point, starting price, and the location, capacity type, and restriction policy each one belongs to.\n\nAn experience\u0027s `status` is read-only here: a new experience is created as a draft and is published from the back office, so a REST caller can never put an unfinished listing live.","x-displayName":"Experiences"},{"name":"experience-waiver-configs","description":"Manage the waiver requirements attached to an experience \u2014 up to 3 per experience, each pointing at a waiver type, with optional per-ticket-type Adult\/Minor\/Choose overrides.","x-displayName":"Experience Waiver Configs"},{"name":"gift-cards","description":"Sell, activate, and reload stored-value gift cards.\n\nA gift card starts inactive until you call **Activate**, and its balance only ever changes through **Activate**\/**Reload** \u2014 never a direct balance edit \u2014 so every dollar added is tied to a real transaction.","x-displayName":"Gift Cards"},{"name":"locations","description":"Manage the physical or virtual locations your experiences depart from or take place at \u2014 name, address, coordinates, directions, timezone, and the country they belong to.","x-displayName":"Locations"},{"name":"manifests","description":"The day-of guest roster operators run each departure from. A read-only report rather than a stored record: each entry is a trip order \u2014 one experience on one timeslot within a reservation \u2014 carrying the lead booker, a payment summary, waiver progress and one booking per guest seat, with check-in time, waiver status and custom field answers. Ask for one day or a range of up to 31 days, narrow by experience or departure, and page through large days with the cursor. Because every entry contains guest personal data, a key needs both the manifest.read and bookings.read scopes. Cancelled trip orders are hidden unless you ask for them (include_cancelled or status=cancelled), and each trip order carries its notes. The manifest only reads. To check a guest in, take the booking id from an entry\u0027s bookings list and send them to POST \/rest\/bookings\/set-status with status checked-in, which checks in a whole party in one call and returns warnings for balances owed, unsigned waivers and guests booked for another day (add dry_run to preview). POST \/rest\/bookings\/{id}\/status does one guest with a booking_status_id from booking_statuses; the same endpoints mark a no-show or undo a check-in.","x-displayName":"Manifest"},{"name":"phone-calls","description":"Read-only access to inbound\/outbound call records \u2014 provider metadata, summary, callbot outcome, transcript, and the AI-extracted insights in `phone_call_tags` (the questions the caller asked, coaching tips for the agent, tips for the business, places, people, amounts and dates mentioned). Use `\/rest\/phone-calls\/tags` to filter across tags.","x-displayName":"Phone Calls"},{"name":"phone-call-tags","description":"Read-only access to the AI-extracted tags on phone calls \u2014 one row per tag, filterable by call, type, value and sentiment. Tag types: `question` = a question the caller asked; `agent-tip` = an AI coaching tip for the call agent; `operator-tip` = an AI tip for the business operator; `location` = a place mentioned on the call; `person` = a person mentioned on the call; `money` = an amount of money mentioned, as written; `cs-phrase` = a customer-service moment such as feedback, an issue or a service request; `date-time` = a date or time mentioned; `other` = any other classified moment. A call\u0027s own tags are also returned inline on `\/rest\/phone-calls`.","x-displayName":"Phone Call Tags"},{"name":"promo-codes","description":"Manage discount codes customers redeem at checkout \u2014 amount\/percent\/set-price, redemption limits, and the experiences or ticket types they apply to.","x-displayName":"Promo Codes"},{"name":"report-runs","description":"A run of a report. Create a run, poll it until it succeeds, then download the finished file. See the Report types section for how runs work, the limits, the file formats and the columns.","x-displayName":"Report Runs"},{"name":"report-types","description":"Reports run in the background. You start a run, wait for it to finish, then download the file.\n\n**Running a report**\n\n1. Create a run with `POST \/rest\/report-runs`, naming the report in `report_type`. The response is `202` with the run, whose `report_run_status` is `pending`.\n2. Poll `GET \/rest\/report-runs\/{id}` until `report_run_status` is `succeeded` or `failed`. Every few seconds is plenty.\n3. A succeeded run has `row_count`, `completed_at` and a `download_url`. Download the file from that URL.\n\nA failed run has an `error` with a `code` and a `message`:\n\n| Code | Meaning |\n| --- | --- |\n| `generation_failed` | The report could not be generated. |\n| `row_limit_exceeded` | The report has too many rows. Narrow the date range or add filters. |\n| `dispatch_failed` | The report could not be queued. |\n| `worker_terminated` | The report was interrupted before it finished. |\n| `timed_out` | The report did not finish in time. |\n\n**Limits**\n\n- **Rows.** A run that would return more than 1,000,000 rows fails with `row_limit_exceeded`. Narrow the date range or add filters.\n- **Date range.** Each report limits how many days one run can cover. The limit is listed under that report.\n- **Concurrent runs.** At most 3 runs of a report may be pending at once. Another returns `429`.\n- **Stuck runs.** A run still pending after 35 minutes is marked failed.\n- **Download links.** A `download_url` expires after 15 minutes. Request the run again to get a fresh one.\n- **Retention.** Runs and their files are deleted after 30 days.\n\n**File formats**\n\nSet `format` when you create a run. Every report supports both.\n\n- `jsonl` (the default): JSON Lines, one JSON object per line. A dotted column such as `customer.email` appears nested, as `{\u0022customer\u0022: {\u0022email\u0022: ...}}`, and a list column such as `payments` is an array.\n- `csv`: one row per record, one column per field. Nested records appear as JSON text in a single cell.\n\nA `jsonl` line:\n\n```json\n{\u0022id\u0022: 1234, \u0022uuid\u0022: \u00223f2c0a52-9b1e-4f6d-8a47-5d2e1c7b9a10\u0022, \u0022confirmation_code\u0022: \u0022ABC123\u0022, \u0022customer\u0022: {\u0022email\u0022: \u0022ada@example.com\u0022}, \u0022total\u0022: 14650}\n```\n\n**Columns**\n\nWhere a report supports `columns`, it lists every column it can return. Pass `columns` when you create a run to choose which ones and in what order. Leave it out to get the report\u0027s default columns, which are marked in its list.\n\nA dotted name such as `customer.email` reaches into a single related record. A name such as `payments` returns the whole list of related records.","x-displayName":"Report Types"},{"name":"resellers","description":"Manage the resellers and OTA partners that book and sell your experiences \u2014 their commission terms, payment terms, credit limits, contact details, and status.","x-displayName":"Resellers"},{"name":"restrictions","description":"Manage the booking rules attached to your experiences \u2014 minimum\/maximum party size, automatic booking cutoffs, call-to-book behavior, and advance-booking windows. Restriction fields come in pairs: `empty_*` applies while a departure has zero guests booked so far, and `not_empty_*` applies once it has at least one. Every experience references exactly one Restriction.","x-displayName":"Restrictions"},{"name":"reviews","description":"Guest reviews of your experiences \u2014 left through TripWorks\u0027 own guest review form or imported from third-party sites such as TripAdvisor, Yelp and Google. Each review carries a 1-5 star `rating`, two free-text comments (`overall_comment` and a private `improve_comment`), the source (`review_type`), an optional link to an `experience`, and an approval flag. The `sentiment` fields are read-only: they are derived from the two comments by sentiment analysis when a review is created and again whenever either comment changes. Reviews left through the guest form are linked to their booking (`trip_id`); reviews created through this API are not. Reads need the `reviews.read` scope; creating, updating and deleting need `reviews.write`.","x-displayName":"Reviews"},{"name":"trip-notes","description":"Read and write the notes your team leaves on a trip.\n\nA trip note is a plain-text comment on a trip, shown on the trip\u0027s Notes tab. Creating a note mirrors it onto the trip\u0027s lead, if it has one, and notifies the team members who commented on that trip before. A note created without `user_avatar_id` is attributed to the TripWorks system user, never left without an author.\n\nOnly the note\u0027s text can be changed after it is created; editing it marks the note as edited. A key with write access can edit and delete any note, whoever wrote it.","x-displayName":"Trip Notes"},{"name":"trips","description":"Read-only access to trips. A trip is one reservation: a customer, the activities booked on it (its trip orders), the guests on each activity (its bookings), and the money for the whole thing.\n\nListing returns a flat row per trip. Reading one trip returns the whole tree: `trip_orders`, each with its `bookings`. Every nested booking is the same object `GET \/rest\/bookings\/{id}` returns, with the same `id`, so ids carry over to the bookings endpoints. A key with the `trips.read` scope can read all of that, including each booking\u0027s fields, without also holding `bookings.read`. Trips cannot be created, changed or deleted through this API. Field names on Trip are early access and may change.\n\n**Money**\n\nEvery amount is an integer in the account\u0027s minor currency unit (cents for USD) and in the trip\u0027s `currency`. `total` is what the customer pays before guest fees, not the operator\u0027s revenue. `total_with_fees` adds the guest processing fees. A null amount means it does not apply. As everywhere in this API, a field whose value is null is left out of the JSON, so treat an absent field as null.\n\n**Taxes**\n\nThe account\u0027s taxes, fees and surcharges are numbered slots 1 to 20. A trip carries `tax_N_total` for each slot, and a trip order carries `tax_N_total`, `tax_N_percent` and `tax_N_fixed_amount`. The slot names are set per account.\n\n**Dates**\n\n`sale_date` is the activity date; `created_at` is when the trip was booked. Use `created_at` for sales made in a period and `sale_date` for what happens in a period.\n\n**Deleted trips**\n\nA trip with `trip_status` `deleted` was removed by staff; that is not a cancellation. Lists leave deleted trips out unless you filter `?trip_status=deleted`. Reading a trip by its id always returns it, whatever its status. To find cancellations, read `trip_orders[].status` (`cancelled`) and `cancelled_at` on the trip orders.\n\n**Getting the IDs you need**\n\n- Look a trip up by its confirmation code with `?confirmation_code=`.\n- `customer_id`, `trip_source_id`, `reseller_id`, `location_id`: read the matching resource (`\/rest\/customers`, `\/rest\/trip-sources`, `\/rest\/resellers`, `\/rest\/locations`).\n- A trip\u0027s notes and payments are not part of this resource.","x-displayName":"Trips"},{"name":"trip-sources","description":"Manage the marketing sources (e.g. \u0022Website\u0022, \u0022Referral\u0022, \u0022Walk-in\u0022) a trip can be attributed to.","x-displayName":"Trip Sources"},{"name":"user-avatars","description":"View and update your team members (staff\/guide accounts) \u2014 profile fields only. Login password and permission-group assignment are not exposed over REST in v1.","x-displayName":"Team Members"},{"name":"waiver-types","description":"Manage your waiver templates: the waiver text guests sign, the details each signer must give, and whether the template is in use.\n\nA waiver type is the template. Each signed copy is a separate record and is not part of this resource. `body` and `body_minor` are HTML exactly as the waiver editor stores them, so treat them as untrusted markup when you render them. `waiver_type_status` is `draft`, `active` or `archived` and is written and filtered by slug; it defaults to `active` on create.\n\nWrites follow the same rules as the back office. A waiver type that has been signed, is used by an activity or is required on a booking cannot be deleted (409 `in_use_delete`); the error\u0027s `dependencies` give the signed, activity and booking counts. Archive a waiver type instead of deleting it once it has been used. Archiving is refused (409 `in_use_archive`) only while an activity uses the waiver type.","x-displayName":"Waiver types"},{"name":"webhooks","x-displayName":"Event Types"}],"x-tagGroups":[{"name":"Resources","tags":["analytics","audit-logs","bookings","countrys","customers","experiences","experience-waiver-configs","gift-cards","locations","manifests","phone-calls","phone-call-tags","promo-codes","resellers","restrictions","reviews","trip-notes","trips","trip-sources","user-avatars","waiver-types"]},{"name":"Reports","tags":["report-types","report-runs"]},{"name":"Webhooks","tags":["webhooks"]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"A REST API key issued under Setup \u2192 REST API \u2192 Keys, sent as \u0022Authorization: Bearer tw_...\u0022."}},"schemas":{"AuditLog":{"title":"Audit Log","type":"object","properties":{"object_class":{"type":"string","maxLength":255,"description":"Fully-qualified PHP class name of the entity this entry describes (e.g. `App\\Entity\\Trip`) \u2014 an internal implementation detail, not a public resource name."},"created_at":{"type":"string","format":"date-time"},"audit_log_details":{"type":"array","items":{"$ref":"#\/components\/schemas\/AuditLogDetail"},"description":"Field-by-field before\/after changes captured for this entry. Empty for a narrative\/event-type entry (`audit_log_entry_type` = `event`) that has no individual field diffs."},"description":{"type":["string","null"],"maxLength":255,"description":"Human-readable summary of the change, generated by whatever code recorded it. Can be blank on a field-change entry whose story is fully captured by its `audit_log_details` rows instead."},"trip_confirmation_code":{"type":"string","description":"Confirmation code of the trip this entry relates to, if any. `null` when this entry has no associated trip."},"trip_id":{"type":["string","null"],"description":"Public UUID companion of `trip_confirmation_code`."},"reseller_code":{"type":"string","description":"Code of the reseller this entry relates to, if any. `null` when this entry has no associated reseller."},"reseller_id":{"type":["string","null"],"description":"Public UUID companion of `reseller_code`."},"customer_code":{"type":"string","description":"Code of the customer this entry relates to, if any. `null` when this entry has no associated customer."},"customer_id":{"type":["string","null"],"description":"Public UUID companion of `customer_code`."},"experience_name":{"type":["string","null"],"description":"Name of the experience this entry relates to, if any. Falls back to the experience\u0027s internal (staff-facing) name when set, otherwise its public name. `null` when this entry has no associated experience."},"experience_id":{"type":["string","null"],"description":"Public UUID companion of `experience_name`."},"affected_user_name":{"type":["string","null"],"description":"Full name of the staff user this entry is ABOUT (e.g. whose account\/permissions were changed) \u2014 not who made the change. See `created_by_user_avatar_id`\/`created_by_rest_credential_id` for the actor."},"user_avatar_id":{"type":["string","null"],"description":"Id companion of `affected_user_name`."},"waiver_type_name":{"type":["string","null"],"description":"Name of the waiver type this entry relates to, if any. `null` when this entry has no associated waiver type."},"waiver_type_id":{"type":["string","null"],"description":"Public UUID companion of `waiver_type_name`."},"crm_template_name":{"type":["string","null"],"description":"Name of the CRM message template this entry relates to, if any. `null` when this entry has no associated template."},"crm_template_id":{"type":["integer","null"],"description":"Id companion of `crm_template_name`."},"timeslot_label":{"type":["string","null"],"description":"Formatted start date\/time (e.g. \u0022Sep 18, 2026 2:00 PM\u0022) of the experience timeslot this entry relates to, if any \u2014 a display label, not a machine-parseable timestamp. `null` when this entry has no associated timeslot."},"experience_timeslot_id":{"type":["integer","null"],"description":"Id companion of `timeslot_label`."},"ip_address":{"type":["string","null"],"description":"IP address the request that produced this entry came from, if captured. `null` when no request IP was recorded (e.g. a system-initiated or scheduled-job entry)."},"created_by_user_avatar_id":{"type":["string","null"],"description":"Id of the staff user (`UserAvatar`) who made this change via a logged-in session \u2014 `null` when the change was made by a REST API credential instead (see `created_by_rest_credential_id`)."},"created_by_rest_credential_id":{"type":["string","null"],"description":"Id of the REST API credential that made this change \u2014 `null` when the change was made by a staff session instead (see `created_by_user_avatar_id`)."},"audit_log_entry_type":{"type":["string","null"],"description":"One of `field_change` (this entry records one or more individual field diffs in `audit_log_details`) or `event` (a narrative entry \u2014 a webhook delivery, an external notification \u2014 with no field diffs, just `description` and\/or `audit_log_details[].event_summary`\/`event_info`)."},"resource_id":{"type":["string","null"],"description":"Public UUID of the bookable `Resource` (vehicle, guide, equipment \u2014 not to be confused with \u0022REST resource\u0022) this entry relates to, if any. `null` when this entry has no associated resource."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"object_class":"string","created_at":"2026-01-15T09:30:00+00:00","audit_log_details":["string"],"description":"string","trip_confirmation_code":"string","trip_id":"string","reseller_code":"string","reseller_id":"string","customer_code":"string","customer_id":"string","experience_name":"string","experience_id":"string","affected_user_name":"string","user_avatar_id":"string","waiver_type_name":"string","waiver_type_id":"string","crm_template_name":"string","crm_template_id":1,"timeslot_label":"string","experience_timeslot_id":1,"ip_address":"string","created_by_user_avatar_id":"string","created_by_rest_credential_id":"string","audit_log_entry_type":"string","resource_id":"string","id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"Booking":{"title":"Booking","type":"object","properties":{"created_at":{"type":"string","format":"date-time"},"total":{"type":"integer","description":"What this booking costs the guest, in integer cents in the account\u0027s currency: `experience_total + products_total + addons_total` plus any taxes, fees and surcharges, which are not itemised. It includes tax, products and add-ons. It excludes guest fees, tips and payments, so it is the booking\u0027s price, not a balance due. 0 for a complimentary booking. Recalculated whenever the booking, its products or add-ons, or its trip order change."},"experience_total":{"type":"integer","description":"The price of the ticket itself, before tax, in integer cents: `customer_type_amount` or its override, less any promo code and voucher discount. This is what the guest pays for the ticket. For a group ticket it is this booking\u0027s share of the group price, and the last booking on the order absorbs the rounding pennies. 0 for a complimentary booking, or when a voucher covers the whole ticket. Products and add-ons are not included; see `products_total` and `addons_total`."},"products_total":{"type":"integer","description":"Sum of this booking\u0027s products after each product\u0027s manual discount and promo code, before tax, in integer cents. 0 when the booking has no products or is complimentary. Tax on products is not in this figure. Compare `products_total_gross`."},"addons_total":{"type":["integer","null"],"description":"Sum of the add-on charges that change the price, after any promo code and before tax, in integer cents. Add-ons that replace the ticket price (a set-price add-on) are excluded because `experience_total` already reflects them, and add-ons that change nothing count 0. Tax on add-ons is not in this figure. Compare `addons_total_gross`."},"is_complimentary":{"type":"boolean","description":"True when the booking is complimentary (free). A complimentary booking is priced at 0 and charges no tax, whatever the price list says, so `total`, `experience_total`, `products_total`, `addons_total` and every tax are 0 or null. The same applies when the whole trip order is complimentary."},"customer_type_amount":{"type":"integer","description":"The price-list price of this booking\u0027s ticket type as set by the pricing rule, in integer cents, before any promo code or voucher. For a group ticket it is the full group price, not divided among the group\u0027s bookings (`experience_total` holds this booking\u0027s share). When a manual price override applies (`customer_type_amount_override` or a per-ticket price override on the trip order) it holds that price instead. Repriced when the booking\u0027s ticket type or pricing changes. 0 for a complimentary booking."},"deposit_amount":{"type":["integer","null"],"description":"The deposit due on this booking, in integer cents, or null. It is only set when the experience takes deposits per ticket type (a percentage of `experience_total`, with the last booking absorbing rounding, or a fixed amount per ticket type). Null for trip-level deposit settings and when no deposit applies. It is what is due, not what has been paid."},"checkedin_at":{"type":["string","null"],"format":"date-time"},"promo_code_total":{"type":["integer","null"],"description":"All promo code discount on this booking, in integer cents: the ticket (`promo_code_amount`) plus add-ons and products. Already subtracted in the net totals; it is informational, not to be subtracted again. 0 or null when no promo code applies."},"voucher_code_discount":{"type":["integer","null"],"description":"Discount from a voucher code taken off the ticket before tax, in integer cents, or null when no voucher applies. It is capped at the ticket price (the guest then pays 0 for the ticket and the excess is lost) and, when it reduces the ticket to 0, the booking\u0027s taxes are cleared. Already subtracted in `experience_total`."},"customer_type_amount_override":{"type":["integer","null"],"description":"A manual per-booking price, in integer cents, or null when none is set. When set, even to 0, it replaces the price-list price everywhere: it becomes the ticket price that the promo code and voucher are then applied to. Null means the price-list price (`customer_type_amount`) is used."},"products_total_gross":{"type":["integer","null"],"description":"Sum of this booking\u0027s products before any manual discount or promo code (quantity times unit price for each), in integer cents. `products_total_gross - products_total` is the discount taken on products. 0 or null when there are no products."},"promo_code_fixed_amount":{"type":["integer","null"],"description":"The fixed-amount promo code value applied to the ticket, in integer cents, or null when none. The discount actually taken is `promo_code_amount`, which never exceeds the ticket price."},"promo_code_percent":{"type":["number","null"],"description":"The percentage promo code applied to the ticket, as a decimal number from 0 to 100 (for example 12.5 means 12.5%), or null when none. This is a percent, not cents. The discount actually taken is `promo_code_amount`."},"promo_code_amount":{"type":["integer","null"],"description":"The promo code discount taken off the ticket itself, in integer cents. A percent and a fixed amount can stack, a fixed amount cannot exceed the ticket price, and on an order the last booking absorbs rounding. Already subtracted in `experience_total`. See `promo_code_total` for the discount including add-ons and products. 0 or null when no promo code applies."},"promo_code_set_price":{"type":["integer","null"],"description":"For a set-price promo code, the price this booking pays for the ticket, in integer cents, or null when no set-price code applies. 0 means the ticket is free. The discount is the ticket price minus this value, and a set price never raises the price."},"addons_total_gross":{"type":["integer","null"],"description":"Sum of the price-changing add-on charges before any promo code, in integer cents, on the same basis as `addons_total`. `addons_total_gross - addons_total` is the promo discount on add-ons. 0 or null when there are none."},"reseller_commission_amount":{"type":["integer","null"],"description":"Commission owed to the reseller (agent or OTA) on the ticket, in integer cents. 0 or null on direct bookings and non-commissionable reseller trips. Commercially sensitive: visible to every caller with `bookings.read`."},"reseller_commission_total":{"type":["integer","null"],"description":"Reseller commission across the ticket, add-ons and products, in integer cents. 0 or null on direct bookings. Commercially sensitive: visible to every caller with `bookings.read`."},"commissionable_amount":{"type":["integer","null"],"description":"The part of the ticket price, plus any commissionable revenue taxes, that reseller commission is calculated on, in integer cents. 0 or null when the booking earns no commission."},"non_commissionable_amount":{"type":["integer","null"],"description":"The part of the ticket price that earns no reseller commission, in integer cents, including taxes that are not counted as revenue. Together with `commissionable_amount` it covers the ticket side of the booking."},"commissionable_total":{"type":["integer","null"],"description":"`commissionable_amount` plus the commissionable part of add-ons and products, in integer cents."},"non_commissionable_total":{"type":["integer","null"],"description":"`non_commissionable_amount` plus the non-commissionable part of add-ons and products, in integer cents."},"total_sales":{"type":["integer","null"],"description":"The revenue figure used in reports, in integer cents: `experience_total + products_total + addons_total` plus taxes flagged as revenue, minus the reseller commission. It is not what the guest pays (see `total`). 0 for a complimentary booking."},"booking_status_id":{"type":["string","null"]},"waivers":{"type":"array","items":{"$ref":"#\/components\/schemas\/BookingWaiverEntry"},"description":"Every waiver requirement that applies to this booking\u0027s experience, in the experience\u0027s waiver order, signed or not: `{waiver_type_id, name, status, has_signed_waiver}`. A requirement with no signing record shows as `unsigned`. These are the per-waiver statuses behind the booking\u0027s overall `booking_waiver_status`, which can drift from them because it is a stored summary (it is recomputed to `signed` only when every requirement has a signed record). Staff mark-signed sets a requirement `signed` without a document (`has_signed_waiver` stays false). Additional signers who sign beyond the ticket count are not part of these entries. Empty when the experience needs no waiver. Signer details and document links are never exposed."},"custom_fields":{"type":"array","items":{"$ref":"#\/components\/schemas\/BookingCustomFieldEntry"},"description":"Every booking-level custom field that applies to this booking\u0027s experience, in back-office order, answered or not: `{id, slug, name, type, value, required}`. Unanswered fields have `value` null. Read-only: custom field values cannot be written through the API yet, and there is no separate endpoint for field definitions."},"resources":{"type":"array","items":{"$ref":"#\/components\/schemas\/BookingResource"},"description":"The resources (boats, vehicles, guides and so on) assigned to this booking, earliest start first: `{id, resource_id, resource_name, resource_type_name, start_time, end_time, duration, internal_note}`. Read-only. Same entries as the booking\u0027s resources endpoint. `start_time` and `end_time` are RFC 3339 instants with the venue offset (for example `2026-10-02T13:00:00-04:00`); the end is inclusive. `id` is the public id (a uuid) of the assignment itself, to be used when referring to that assignment; `resource_id` is the id of the resource."},"booking_waiver_status":{"type":["string","null"],"description":"Waiver state slug, or null when the experience needs no waiver. Read-only; use the mark-waivers-signed action to mark it signed."},"trip_order_id":{"type":["string","null"]},"customer_id":{"type":["string","null"]},"experience_customer_type":{"type":["string","null"]},"experience_customer_type_id":{"type":["string","null"]},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"created_at":"2026-01-15T09:30:00+00:00","total":1,"experience_total":1,"products_total":1,"addons_total":1,"is_complimentary":true,"customer_type_amount":1,"deposit_amount":1,"checkedin_at":"2026-01-15T09:30:00+00:00","promo_code_total":1,"voucher_code_discount":1,"customer_type_amount_override":1,"products_total_gross":1,"promo_code_fixed_amount":1,"promo_code_percent":1,"promo_code_amount":1,"promo_code_set_price":1,"addons_total_gross":1,"reseller_commission_amount":1,"reseller_commission_total":1,"commissionable_amount":1,"non_commissionable_amount":1,"commissionable_total":1,"non_commissionable_total":1,"total_sales":1,"booking_status_id":"string","waivers":["string"],"custom_fields":["string"],"resources":["string"],"booking_waiver_status":"string","trip_order_id":"string","customer_id":"string","experience_customer_type":"string","experience_customer_type_id":"string","id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"Country":{"title":"Country","type":"object","properties":{"code":{"type":"string","description":"Two-letter ISO 3166-1 alpha-2 country code (e.g. `US`, `CA`); the same on every account. Use `id` wherever a `country_id` is accepted."},"name":{"type":"string","description":"English display name of the country."},"code_char3":{"type":["string","null"],"description":"Three-letter ISO 3166-1 alpha-3 country code (e.g. `USA`, `CAN`), when known; otherwise null."},"phone_code":{"type":["integer","null"],"description":"International dialing code for the country without the leading `+` (e.g. `1` for the US and Canada), when known; otherwise null."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"code":"string","name":"string","code_char3":"string","phone_code":1,"id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"Customer":{"title":"Customer","type":"object","properties":{"created_at":{"type":["string","null"],"format":"date-time","description":"Set automatically when the customer is first created. Read-only."},"code":{"type":"string","maxLength":10,"description":"System-generated on first save if not supplied \u2014 not a value the API caller chooses."},"first_name":{"type":"string","maxLength":255,"description":"Given name \u2014 combined with `last_name` to build `full_name`."},"middle_name":{"type":["string","null"],"maxLength":45,"description":"Optional \u2014 not included in `full_name`."},"last_name":{"type":"string","maxLength":255,"description":"Family name \u2014 combined with `first_name` to build `full_name`."},"email":{"type":"string","maxLength":255,"format":"email","description":"Primary contact address \u2014 also what the merge endpoint compares to decide whether a duplicate customer can be safely merged in."},"address1":{"type":["string","null"],"maxLength":255,"description":"Street address, line 1. There is no `address2`."},"city":{"type":"string","maxLength":255,"description":"Customer\u0027s city of residence."},"state_code":{"type":["string","null"],"maxLength":255,"description":"Writable but not filterable."},"postal_code":{"type":["string","null"],"maxLength":45,"description":"Writable but not filterable."},"phone":{"type":"string","maxLength":35,"description":"Stored as sent; also normalized internally to E.164 for matching, but that normalized form is not what you write here or what filtering compares against."},"locale":{"type":"string","description":"Locale used for formatting (e.g. `en`, `en_US`) \u2014 distinct from `language`, which is the customer\u0027s preferred correspondence language."},"language":{"type":["string","null"],"maxLength":25,"description":"The customer\u0027s preferred language for communications \u2014 distinct from `locale`, which drives formatting."},"avatar_url":{"type":["string","null"],"maxLength":255,"description":"URL of the customer\u0027s profile photo, if any."},"dob":{"type":["string","null"],"format":"date","description":"Date of birth, `Y-m-d`."},"is_lead":{"type":"boolean","description":"True when this customer was the lead (primary) traveler on a booking party \u2014 unrelated to a sales\/marketing lead."},"is_vip":{"type":"boolean","description":"Manually flagged VIP status. Read-only via this API \u2014 not settable through `update_customer`\/PATCH."},"is_opt_in":{"type":"boolean","description":"Whether the customer has opted in to marketing communications."},"is_opt_in_at":{"type":["string","null"],"format":"date-time","description":"When `is_opt_in` was last set to true. Null if never opted in."},"timezone":{"type":["string","null"],"maxLength":45,"description":"IANA timezone identifier (e.g. `America\/New_York`), not a UTC offset."},"phone_format_164":{"type":["string","null"],"maxLength":45,"description":"`phone` normalized to E.164 (e.g. `+14155551234`). Read-only, derived from `phone`. Filter on it with an exact E.164 number (URL-encode the leading `+` as `%2B`) to find a customer by phone."},"full_name":{"type":["string","null"],"description":"`first_name` and `last_name` joined with a space; null if both are blank."},"country":{"type":["string","null"],"description":"The country\u0027s display name. Read-only \u2014 set\/filter via `country_id` instead."},"country_id":{"type":["string","null"],"description":"The country\u0027s public id \u2014 the same value you set\/filter by."},"gender":{"type":["string","null"],"description":"Set\/filtered by slug (e.g. `male`, `female`, `other`), not by id."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"created_at":"2026-01-15T09:30:00+00:00","code":"string","first_name":"string","middle_name":"string","last_name":"string","email":"string","address1":"string","city":"string","state_code":"string","postal_code":"string","phone":"string","locale":"string","language":"string","avatar_url":"string","dob":"2026-01-15","is_lead":true,"is_vip":true,"is_opt_in":true,"is_opt_in_at":"2026-01-15T09:30:00+00:00","timezone":"string","phone_format_164":"string","full_name":"string","country":"string","country_id":"string","gender":"string","id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"CustomerWrite":{"title":"Customer Write","type":"object","properties":{"first_name":{"type":["string","null"],"maxLength":255,"description":"Given name \u2014 combined with `last_name` to build `full_name`."},"middle_name":{"type":["string","null"],"maxLength":45,"description":"Optional \u2014 not included in `full_name`."},"last_name":{"type":["string","null"],"maxLength":255,"description":"Family name \u2014 combined with `first_name` to build `full_name`."},"email":{"type":["string","null"],"maxLength":255,"format":"email","description":"Primary contact address \u2014 also what the merge endpoint compares to decide whether a duplicate customer can be safely merged in."},"address1":{"type":["string","null"],"maxLength":255,"description":"Street address, line 1. There is no `address2`."},"city":{"type":["string","null"],"maxLength":255,"description":"Customer\u0027s city of residence."},"state_code":{"type":["string","null"],"maxLength":255,"description":"Writable but not filterable."},"postal_code":{"type":["string","null"],"maxLength":45,"description":"Writable but not filterable."},"phone":{"type":["string","null"],"maxLength":35,"description":"Stored as sent; also normalized internally to E.164 for matching, but that normalized form is not what you write here or what filtering compares against."},"country_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Set\/filter by `country_id`, the same public id `country_id` shown in the response \u2014 not a raw numeric id or an ISO code."},"locale":{"type":"string","description":"Locale used for formatting (e.g. `en`, `en_US`) \u2014 distinct from `language`, which is the customer\u0027s preferred correspondence language."},"language":{"type":["string","null"],"maxLength":25,"description":"The customer\u0027s preferred language for communications \u2014 distinct from `locale`, which drives formatting."},"dob":{"type":["string","null"],"format":"date","description":"Date of birth, `Y-m-d`."},"is_lead":{"type":"boolean","description":"True when this customer was the lead (primary) traveler on a booking party \u2014 unrelated to a sales\/marketing lead."},"gender":{"type":["string","null"]},"is_opt_in":{"type":"boolean","description":"Whether the customer has opted in to marketing communications."},"timezone":{"type":["string","null"],"maxLength":45,"description":"IANA timezone identifier (e.g. `America\/New_York`), not a UTC offset."}},"example":{"first_name":"string","middle_name":"string","last_name":"string","email":"string","address1":"string","city":"string","state_code":"string","postal_code":"string","phone":"string","country_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","locale":"string","language":"string","dob":"2026-01-15","is_lead":true,"gender":"string","is_opt_in":true,"timezone":"string"},"x-internal":true},"Experience":{"title":"Experience","type":"object","properties":{"name":{"type":"string","maxLength":45},"duration":{"type":"integer"},"images":{"type":"array","items":{"$ref":"#\/components\/schemas\/ExperienceImage"},"description":"The experience\u0027s gallery images, in display order. The hero image is separate (`hero_url`)."},"overview":{"type":["string","null"],"maxLength":65535},"customer_types":{"type":"array","items":{"$ref":"#\/components\/schemas\/ExperienceCustomerType"},"description":"The experience\u0027s ticket types, in display order. Each `id` is the value to pass as `experience_customer_type_id` when adding a booking. Prices are not included because they vary by date and timeslot."},"resource_assign_priority_id":{"type":["integer","null"],"description":"How a multi-guest booking is assigned to resources: `1` spreads the group across separate resources, `2` packs the whole group onto the same resource where possible."},"starting_price":{"type":["integer","null"]},"confirmation_notes":{"type":["string","null"],"maxLength":65535,"description":"Guest-facing confirmation notes for this experience. Empty inherits the account-level default (Setup \u003E General Settings)."},"cancellation_notes":{"type":["string","null"],"maxLength":65535,"description":"Guest-facing cancellation notes for this experience. Empty inherits the account-level default (Setup \u003E General Settings)."},"transportation_notes":{"type":["string","null"],"maxLength":65535,"description":"Guest-facing transportation notes for this experience. Empty inherits the account-level default (Setup \u003E General Settings)."},"receipt_footer_text":{"type":["string","null"],"maxLength":65535,"description":"Text appended to the footer of the printed\/emailed booking receipt for this experience. Distinct from `receipt_notes`, which shows on the checkout confirmation and customer portal pages."},"is_customer_portal_auto_refund_enabled":{"type":["boolean","null"],"description":"When true, a guest-initiated cancellation through the customer portal is refunded automatically, without staff review, as long as it falls inside `customer_portal_cancel_window`."},"is_customer_portal_auto_refund_on_reschedules_enabled":{"type":["boolean","null"],"description":"Same as `is_customer_portal_auto_refund_enabled`, but for the refund issued when a guest reschedules through the customer portal inside `customer_portal_reschedule_window`."},"customer_portal_cancel_window":{"type":["integer","null"],"description":"Hours before the trip start that a guest can still self-cancel through the customer portal. `null` falls back to the account-level default (`AccountProps::customer_portal_cancel_window`)."},"customer_portal_reschedule_window":{"type":["integer","null"],"description":"Hours before the trip start that a guest can still self-reschedule through the customer portal. `null` falls back to the account-level default (`AccountProps::customer_portal_reschedule_window`)."},"departure_point_name":{"type":"string","maxLength":45},"headline":{"type":"string","maxLength":70},"advertised_duration":{"type":["string","null"],"maxLength":45,"description":"Free-text duration shown to guests (e.g. \u00222-3 hours\u0022), independent of `duration` \u2014 the actual minutes used for scheduling\/availability math."},"description":{"type":["string","null"],"maxLength":65535},"button_anytime_label":{"type":["string","null"],"maxLength":45,"description":"Booking-button title shown for a \u0022Flex-Time\u0022\/anytime timeslot \u2014 one not tied to a fixed start time. Falls back to \u0022Flex-Time\u0022 in the booking widget when blank."},"button_anytime_subtitle":{"type":["string","null"],"maxLength":45,"description":"Subtitle shown under `button_anytime_label` on the same anytime\/\u0022Flex-Time\u0022 booking button."},"color":{"type":"string"},"capacity":{"type":["integer","null"],"description":"Only meaningful when `capacity_type` is \u0022capped per timeslot\u0022: the default capacity a new timeslot for this experience is created with (a timeslot can still override it)."},"channel_limits_enabled":{"type":"boolean","description":"Turns on per-channel ticket caps (`default_ecom_cap`\/`default_reseller_cap`) for every timeslot of this experience, unless a timeslot overrides them."},"default_ecom_cap":{"type":["integer","null"],"description":"Default cap on tickets sold through direct online (e-commerce) checkout per timeslot, applied only when `channel_limits_enabled` is true. `null` means no cap."},"default_reseller_cap":{"type":["integer","null"],"description":"Default combined cap on tickets sold through resellers (OTAs and private partners) per timeslot, applied only when `channel_limits_enabled` is true. `null` means no cap."},"voucher_codes_enabled":{"type":"boolean","description":"Whether a gift-card\/voucher code can be redeemed as payment for this experience at all."},"block_online_voucher_payments":{"type":"boolean","description":"When `voucher_codes_enabled` is true, restricts voucher redemption to staff-entered (offline) bookings \u2014 blocks a guest from applying one during direct online checkout."},"is_limit_single_customer_type":{"type":"boolean","description":"When true, a guest may book only one customer\/ticket type per order \u2014 the types are mutually-exclusive alternatives (e.g. Shared vs. Private) rather than combinable line items."},"is_customer_type_qty_editable":{"type":"boolean","description":"Whether a guest can change the quantity for each customer\/ticket type at checkout, versus each type being fixed at one per selection."},"is_default_quantity_set_to_0":{"type":"boolean","description":"When true, each customer\/ticket type starts at a quantity of 0 in checkout instead of 1, requiring the guest to explicitly opt in to each type."},"is_auto_fill_buyer_as_first_guest":{"type":"boolean","description":"Whether the buyer\u0027s own name\/contact info is pre-filled as the first guest on the booking, instead of leaving all guest slots blank for the buyer to fill in."},"voucher_payment_type":{"type":"string","description":"Whether ecommerce (online) checkout accepts a voucher payment type as full payment: `none` disallows it, `no-verify` allows it without validating the voucher first."},"receipt_notes":{"type":["string","null"],"maxLength":65535,"description":"Notes shown to the guest on the post-checkout confirmation page and the customer portal for this experience. Falls back to the account-level `AccountProps::receipt_notes` when blank."},"is_allow_manual_overbooking":{"type":"boolean","description":"Lets an authenticated staff user knowingly book past a timeslot\u0027s capacity for this experience. Never offered to an unauthenticated\/reseller-agent booking flow."},"internal_name":{"type":["string","null"],"maxLength":45},"experience_deposit_type":{"type":"string","description":"How a deposit is collected at booking: `none` (pay in full), `per-customer-type` (each customer\/ticket type\u0027s own amount-or-percent), or `per-trip-order` (a fixed amount per order, see `trip_order_deposit_amount`)."},"kiosk_description":{"type":["string","null"],"maxLength":280,"description":"Short alternate description shown on a self-service kiosk in place of `description`, for a touchscreen where the full description would be too long or too web-formatted. Falls back to `description` when blank."},"deposit_allow_pay_in_full":{"type":"boolean","description":"When `experience_deposit_type` requires a deposit, lets the guest choose to pay the full amount at checkout instead. Always false when `experience_deposit_type` is `none`; setting it true then is ignored."},"tax_1_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 1 slot (see AccountProps::tax_1_label\/tax_1_percent) applies to bookings of this experience."},"tax_2_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 2 slot (see AccountProps::tax_2_label\/tax_2_percent) applies to bookings of this experience."},"tax_3_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 3 slot (see AccountProps::tax_3_label\/tax_3_percent) applies to bookings of this experience."},"tax_4_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 4 slot (see AccountProps::tax_4_label\/tax_4_percent) applies to bookings of this experience."},"tax_5_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 5 slot (see AccountProps::tax_5_label\/tax_5_percent) applies to bookings of this experience."},"tax_6_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 6 slot (see AccountProps::tax_6_label\/tax_6_percent) applies to bookings of this experience."},"tax_7_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 7 slot (see AccountProps::tax_7_label\/tax_7_percent) applies to bookings of this experience."},"tax_8_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 8 slot (see AccountProps::tax_8_label\/tax_8_percent) applies to bookings of this experience."},"tax_9_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 9 slot (see AccountProps::tax_9_label\/tax_9_percent) applies to bookings of this experience."},"tax_10_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 10 slot (see AccountProps::tax_10_label\/tax_10_percent) applies to bookings of this experience."},"tax_11_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 11 slot (see AccountProps::tax_11_label\/tax_11_percent) applies to bookings of this experience."},"tax_12_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 12 slot (see AccountProps::tax_12_label\/tax_12_percent) applies to bookings of this experience."},"tax_13_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 13 slot (see AccountProps::tax_13_label\/tax_13_percent) applies to bookings of this experience."},"tax_14_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 14 slot (see AccountProps::tax_14_label\/tax_14_percent) applies to bookings of this experience."},"tax_15_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 15 slot (see AccountProps::tax_15_label\/tax_15_percent) applies to bookings of this experience."},"tax_16_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 16 slot (see AccountProps::tax_16_label\/tax_16_percent) applies to bookings of this experience."},"tax_17_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 17 slot (see AccountProps::tax_17_label\/tax_17_percent) applies to bookings of this experience."},"tax_18_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 18 slot (see AccountProps::tax_18_label\/tax_18_percent) applies to bookings of this experience."},"tax_19_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 19 slot (see AccountProps::tax_19_label\/tax_19_percent) applies to bookings of this experience."},"tax_20_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 20 slot (see AccountProps::tax_20_label\/tax_20_percent) applies to bookings of this experience."},"is_products_suggested_lead_only":{"type":"boolean","description":"Whether an add-on suggested from `suggested_products` can only be added once per order (for the lead guest), rather than once per guest on the booking."},"is_show_create_new_avails":{"type":["boolean","null"],"description":"Whether staff can add a one-off availability\/timeslot for this experience directly, in addition to ones generated from its recurring schedule."},"location_id":{"type":["string","null"],"description":"The location\u0027s public id, not its internal integer id \u2014 see `capacity_type_id` below for a field on this entity that exposes an internal id instead."},"capacity_type_id":{"type":["integer","null"],"description":"Internal id of a shared, non-tenant-owned catalog row (`CapacityType`), not a public id. Determines how capacity is tracked: unlimited, capped per customer-type\/timeslot, or resource-based."},"hero_url":{"type":["string","null"],"description":"Absolute URL of the experience\u0027s hero image. Usually on the TripWorks image CDN; older images can point at another host. Omitted when no hero image is set."},"status":{"type":["string","null"],"description":"One of `draft`, `unlisted`, `live`, or `archived` \u2014 controls whether the experience is bookable and where it surfaces (a `live` status is required for it to show up in ecommerce and OTA feeds; `unlisted` stays directly bookable by link but out of listings)."},"restriction_id":{"type":["string","null"],"description":"The account-defined cancellation\/refund `Restriction` policy applied to bookings of this experience \u2014 exposed as `Restriction`\u0027s public id, like `location_id` above."},"booking_field_name_online_require_type_id":{"type":["integer","null"],"description":"Whether the guest\u0027s name is collected during online (ecommerce) checkout: 1 = Hidden, 2 = Optional, 3 = Required (`BookingFieldRequireType`)."},"booking_field_group_name_online_require_type_id":{"type":["integer","null"],"description":"Whether a group\/party name is collected during online (ecommerce) checkout: 1 = Hidden, 2 = Optional, 3 = Required (`BookingFieldRequireType`)."},"booking_field_email_online_require_type_id":{"type":["integer","null"],"description":"Whether an email address is collected during online (ecommerce) checkout: 1 = Hidden, 2 = Optional, 3 = Required (`BookingFieldRequireType`)."},"booking_field_phone_online_require_type_id":{"type":["integer","null"],"description":"Whether a phone number is collected during online (ecommerce) checkout: 1 = Hidden, 2 = Optional, 3 = Required (`BookingFieldRequireType`)."},"booking_field_name_offline_require_type_id":{"type":["integer","null"],"description":"Whether the guest\u0027s name is collected when a booking is entered by staff (offline): 1 = Hidden, 2 = Optional, 3 = Required (`BookingFieldRequireType`)."},"booking_field_group_name_offline_require_type_id":{"type":["integer","null"],"description":"Whether a group\/party name is collected when a booking is entered by staff (offline): 1 = Hidden, 2 = Optional, 3 = Required (`BookingFieldRequireType`)."},"booking_field_email_offline_require_type_id":{"type":["integer","null"],"description":"Whether an email address is collected when a booking is entered by staff (offline): 1 = Hidden, 2 = Optional, 3 = Required (`BookingFieldRequireType`)."},"booking_field_phone_offline_require_type_id":{"type":["integer","null"],"description":"Whether a phone number is collected when a booking is entered by staff (offline): 1 = Hidden, 2 = Optional, 3 = Required (`BookingFieldRequireType`)."},"experience_deposit_type_id":{"type":["integer","null"],"description":"Internal id of `ExperienceDepositType` \u2014 see `experience_deposit_type`\u0027s own #[RestWritable] property docs above for the write-side shape\/meaning."},"voucher_payment_type_id":{"type":["integer","null"],"description":"Internal id of `VoucherPaymentType` \u2014 see `voucher_payment_type`\u0027s own #[RestWritable] property docs above for the write-side shape\/meaning."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"name":"string","duration":1,"images":["string"],"overview":"string","customer_types":["string"],"resource_assign_priority_id":1,"starting_price":1,"confirmation_notes":"string","cancellation_notes":"string","transportation_notes":"string","receipt_footer_text":"string","is_customer_portal_auto_refund_enabled":true,"is_customer_portal_auto_refund_on_reschedules_enabled":true,"customer_portal_cancel_window":1,"customer_portal_reschedule_window":1,"departure_point_name":"string","headline":"string","advertised_duration":"string","description":"string","button_anytime_label":"string","button_anytime_subtitle":"string","color":"string","capacity":1,"channel_limits_enabled":true,"default_ecom_cap":1,"default_reseller_cap":1,"voucher_codes_enabled":true,"block_online_voucher_payments":true,"is_limit_single_customer_type":true,"is_customer_type_qty_editable":true,"is_default_quantity_set_to_0":true,"is_auto_fill_buyer_as_first_guest":true,"voucher_payment_type":"string","receipt_notes":"string","is_allow_manual_overbooking":true,"internal_name":"string","experience_deposit_type":"string","kiosk_description":"string","deposit_allow_pay_in_full":true,"tax_1_is_enabled":true,"tax_2_is_enabled":true,"tax_3_is_enabled":true,"tax_4_is_enabled":true,"tax_5_is_enabled":true,"tax_6_is_enabled":true,"tax_7_is_enabled":true,"tax_8_is_enabled":true,"tax_9_is_enabled":true,"tax_10_is_enabled":true,"tax_11_is_enabled":true,"tax_12_is_enabled":true,"tax_13_is_enabled":true,"tax_14_is_enabled":true,"tax_15_is_enabled":true,"tax_16_is_enabled":true,"tax_17_is_enabled":true,"tax_18_is_enabled":true,"tax_19_is_enabled":true,"tax_20_is_enabled":true,"is_products_suggested_lead_only":true,"is_show_create_new_avails":true,"location_id":"string","capacity_type_id":1,"hero_url":"string","status":"string","restriction_id":"string","booking_field_name_online_require_type_id":1,"booking_field_group_name_online_require_type_id":1,"booking_field_email_online_require_type_id":1,"booking_field_phone_online_require_type_id":1,"booking_field_name_offline_require_type_id":1,"booking_field_group_name_offline_require_type_id":1,"booking_field_email_offline_require_type_id":1,"booking_field_phone_offline_require_type_id":1,"experience_deposit_type_id":1,"voucher_payment_type_id":1,"id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"ExperienceWrite":{"title":"Experience Write","type":"object","properties":{"name":{"type":"string","maxLength":45},"duration":{"type":"integer"},"location_id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"capacity_type_id":{"type":["integer","null"]},"overview":{"type":["string","null"],"maxLength":65535},"resource_assign_priority_id":{"type":"integer","description":"How a multi-guest booking is assigned to resources: `1` spreads the group across separate resources, `2` packs the whole group onto the same resource where possible."},"starting_price":{"type":["integer","null"]},"confirmation_notes":{"type":["string","null"],"maxLength":65535,"description":"Guest-facing confirmation notes for this experience. Empty inherits the account-level default (Setup \u003E General Settings)."},"cancellation_notes":{"type":["string","null"],"maxLength":65535,"description":"Guest-facing cancellation notes for this experience. Empty inherits the account-level default (Setup \u003E General Settings)."},"transportation_notes":{"type":["string","null"],"maxLength":65535,"description":"Guest-facing transportation notes for this experience. Empty inherits the account-level default (Setup \u003E General Settings)."},"receipt_footer_text":{"type":["string","null"],"maxLength":65535,"description":"Text appended to the footer of the printed\/emailed booking receipt for this experience. Distinct from `receipt_notes`, which shows on the checkout confirmation and customer portal pages."},"is_customer_portal_auto_refund_enabled":{"type":["boolean","null"],"description":"When true, a guest-initiated cancellation through the customer portal is refunded automatically, without staff review, as long as it falls inside `customer_portal_cancel_window`."},"is_customer_portal_auto_refund_on_reschedules_enabled":{"type":["boolean","null"],"description":"Same as `is_customer_portal_auto_refund_enabled`, but for the refund issued when a guest reschedules through the customer portal inside `customer_portal_reschedule_window`."},"customer_portal_cancel_window":{"type":["integer","null"],"description":"Hours before the trip start that a guest can still self-cancel through the customer portal. `null` falls back to the account-level default (`AccountProps::customer_portal_cancel_window`)."},"customer_portal_reschedule_window":{"type":["integer","null"],"description":"Hours before the trip start that a guest can still self-reschedule through the customer portal. `null` falls back to the account-level default (`AccountProps::customer_portal_reschedule_window`)."},"departure_point_name":{"type":"string","maxLength":45},"headline":{"type":"string","maxLength":70},"advertised_duration":{"type":["string","null"],"maxLength":45,"description":"Free-text duration shown to guests (e.g. \u00222-3 hours\u0022), independent of `duration` \u2014 the actual minutes used for scheduling\/availability math."},"description":{"type":["string","null"],"maxLength":65535},"restriction_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"booking_field_name_online_require_type_id":{"type":["integer","null"]},"booking_field_group_name_online_require_type_id":{"type":["integer","null"]},"booking_field_email_online_require_type_id":{"type":["integer","null"]},"booking_field_phone_online_require_type_id":{"type":["integer","null"]},"booking_field_name_offline_require_type_id":{"type":["integer","null"]},"booking_field_group_name_offline_require_type_id":{"type":["integer","null"]},"booking_field_email_offline_require_type_id":{"type":["integer","null"]},"booking_field_phone_offline_require_type_id":{"type":["integer","null"]},"button_anytime_label":{"type":["string","null"],"maxLength":45,"description":"Booking-button title shown for a \u0022Flex-Time\u0022\/anytime timeslot \u2014 one not tied to a fixed start time. Falls back to \u0022Flex-Time\u0022 in the booking widget when blank."},"button_anytime_subtitle":{"type":["string","null"],"maxLength":45,"description":"Subtitle shown under `button_anytime_label` on the same anytime\/\u0022Flex-Time\u0022 booking button."},"color":{"type":["string","null"]},"capacity":{"type":["integer","null"],"description":"Only meaningful when `capacity_type` is \u0022capped per timeslot\u0022: the default capacity a new timeslot for this experience is created with (a timeslot can still override it)."},"channel_limits_enabled":{"type":"boolean","description":"Turns on per-channel ticket caps (`default_ecom_cap`\/`default_reseller_cap`) for every timeslot of this experience, unless a timeslot overrides them."},"default_ecom_cap":{"type":["integer","null"],"description":"Default cap on tickets sold through direct online (e-commerce) checkout per timeslot, applied only when `channel_limits_enabled` is true. `null` means no cap."},"default_reseller_cap":{"type":["integer","null"],"description":"Default combined cap on tickets sold through resellers (OTAs and private partners) per timeslot, applied only when `channel_limits_enabled` is true. `null` means no cap."},"voucher_codes_enabled":{"type":"boolean","description":"Whether a gift-card\/voucher code can be redeemed as payment for this experience at all."},"block_online_voucher_payments":{"type":"boolean","description":"When `voucher_codes_enabled` is true, restricts voucher redemption to staff-entered (offline) bookings \u2014 blocks a guest from applying one during direct online checkout."},"is_limit_single_customer_type":{"type":"boolean","description":"When true, a guest may book only one customer\/ticket type per order \u2014 the types are mutually-exclusive alternatives (e.g. Shared vs. Private) rather than combinable line items."},"is_customer_type_qty_editable":{"type":"boolean","description":"Whether a guest can change the quantity for each customer\/ticket type at checkout, versus each type being fixed at one per selection."},"is_default_quantity_set_to_0":{"type":"boolean","description":"When true, each customer\/ticket type starts at a quantity of 0 in checkout instead of 1, requiring the guest to explicitly opt in to each type."},"is_auto_fill_buyer_as_first_guest":{"type":"boolean","description":"Whether the buyer\u0027s own name\/contact info is pre-filled as the first guest on the booking, instead of leaving all guest slots blank for the buyer to fill in."},"voucher_payment_type_id":{"type":["integer","null"],"description":"Whether ecommerce (online) checkout accepts a voucher payment type as full payment: `none` disallows it, `no-verify` allows it without validating the voucher first."},"receipt_notes":{"type":["string","null"],"maxLength":65535,"description":"Notes shown to the guest on the post-checkout confirmation page and the customer portal for this experience. Falls back to the account-level `AccountProps::receipt_notes` when blank."},"is_allow_manual_overbooking":{"type":"boolean","description":"Lets an authenticated staff user knowingly book past a timeslot\u0027s capacity for this experience. Never offered to an unauthenticated\/reseller-agent booking flow."},"internal_name":{"type":["string","null"],"maxLength":45},"experience_deposit_type_id":{"type":["integer","null"],"description":"How a deposit is collected at booking: `none` (pay in full), `per-customer-type` (each customer\/ticket type\u0027s own amount-or-percent), or `per-trip-order` (a fixed amount per order, see `trip_order_deposit_amount`)."},"kiosk_description":{"type":["string","null"],"maxLength":280,"description":"Short alternate description shown on a self-service kiosk in place of `description`, for a touchscreen where the full description would be too long or too web-formatted. Falls back to `description` when blank."},"deposit_allow_pay_in_full":{"type":"boolean","description":"When `experience_deposit_type` requires a deposit, lets the guest choose to pay the full amount at checkout instead. Always false when `experience_deposit_type` is `none`; setting it true then is ignored."},"tax_1_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 1 slot (see AccountProps::tax_1_label\/tax_1_percent) applies to bookings of this experience."},"tax_2_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 2 slot (see AccountProps::tax_2_label\/tax_2_percent) applies to bookings of this experience."},"tax_3_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 3 slot (see AccountProps::tax_3_label\/tax_3_percent) applies to bookings of this experience."},"tax_4_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 4 slot (see AccountProps::tax_4_label\/tax_4_percent) applies to bookings of this experience."},"tax_5_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 5 slot (see AccountProps::tax_5_label\/tax_5_percent) applies to bookings of this experience."},"tax_6_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 6 slot (see AccountProps::tax_6_label\/tax_6_percent) applies to bookings of this experience."},"tax_7_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 7 slot (see AccountProps::tax_7_label\/tax_7_percent) applies to bookings of this experience."},"tax_8_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 8 slot (see AccountProps::tax_8_label\/tax_8_percent) applies to bookings of this experience."},"tax_9_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 9 slot (see AccountProps::tax_9_label\/tax_9_percent) applies to bookings of this experience."},"tax_10_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 10 slot (see AccountProps::tax_10_label\/tax_10_percent) applies to bookings of this experience."},"tax_11_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 11 slot (see AccountProps::tax_11_label\/tax_11_percent) applies to bookings of this experience."},"tax_12_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 12 slot (see AccountProps::tax_12_label\/tax_12_percent) applies to bookings of this experience."},"tax_13_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 13 slot (see AccountProps::tax_13_label\/tax_13_percent) applies to bookings of this experience."},"tax_14_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 14 slot (see AccountProps::tax_14_label\/tax_14_percent) applies to bookings of this experience."},"tax_15_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 15 slot (see AccountProps::tax_15_label\/tax_15_percent) applies to bookings of this experience."},"tax_16_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 16 slot (see AccountProps::tax_16_label\/tax_16_percent) applies to bookings of this experience."},"tax_17_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 17 slot (see AccountProps::tax_17_label\/tax_17_percent) applies to bookings of this experience."},"tax_18_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 18 slot (see AccountProps::tax_18_label\/tax_18_percent) applies to bookings of this experience."},"tax_19_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 19 slot (see AccountProps::tax_19_label\/tax_19_percent) applies to bookings of this experience."},"tax_20_is_enabled":{"type":["boolean","null"],"description":"Whether the account\u0027s Tax 20 slot (see AccountProps::tax_20_label\/tax_20_percent) applies to bookings of this experience."},"is_products_suggested_lead_only":{"type":"boolean","description":"Whether an add-on suggested from `suggested_products` can only be added once per order (for the lead guest), rather than once per guest on the booking."},"is_show_create_new_avails":{"type":"boolean","description":"Whether staff can add a one-off availability\/timeslot for this experience directly, in addition to ones generated from its recurring schedule."}},"example":{"name":"string","duration":1,"location_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","capacity_type_id":1,"overview":"string","resource_assign_priority_id":1,"starting_price":1,"confirmation_notes":"string","cancellation_notes":"string","transportation_notes":"string","receipt_footer_text":"string","is_customer_portal_auto_refund_enabled":true,"is_customer_portal_auto_refund_on_reschedules_enabled":true,"customer_portal_cancel_window":1,"customer_portal_reschedule_window":1,"departure_point_name":"string","headline":"string","advertised_duration":"string","description":"string","restriction_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","booking_field_name_online_require_type_id":1,"booking_field_group_name_online_require_type_id":1,"booking_field_email_online_require_type_id":1,"booking_field_phone_online_require_type_id":1,"booking_field_name_offline_require_type_id":1,"booking_field_group_name_offline_require_type_id":1,"booking_field_email_offline_require_type_id":1,"booking_field_phone_offline_require_type_id":1,"button_anytime_label":"string","button_anytime_subtitle":"string","color":"string","capacity":1,"channel_limits_enabled":true,"default_ecom_cap":1,"default_reseller_cap":1,"voucher_codes_enabled":true,"block_online_voucher_payments":true,"is_limit_single_customer_type":true,"is_customer_type_qty_editable":true,"is_default_quantity_set_to_0":true,"is_auto_fill_buyer_as_first_guest":true,"voucher_payment_type_id":1,"receipt_notes":"string","is_allow_manual_overbooking":true,"internal_name":"string","experience_deposit_type_id":1,"kiosk_description":"string","deposit_allow_pay_in_full":true,"tax_1_is_enabled":true,"tax_2_is_enabled":true,"tax_3_is_enabled":true,"tax_4_is_enabled":true,"tax_5_is_enabled":true,"tax_6_is_enabled":true,"tax_7_is_enabled":true,"tax_8_is_enabled":true,"tax_9_is_enabled":true,"tax_10_is_enabled":true,"tax_11_is_enabled":true,"tax_12_is_enabled":true,"tax_13_is_enabled":true,"tax_14_is_enabled":true,"tax_15_is_enabled":true,"tax_16_is_enabled":true,"tax_17_is_enabled":true,"tax_18_is_enabled":true,"tax_19_is_enabled":true,"tax_20_is_enabled":true,"is_products_suggested_lead_only":true,"is_show_create_new_avails":true},"x-internal":true},"ExperienceWaiverConfig":{"title":"Experience Waiver Config","type":"object","properties":{"sort_order":{"type":"integer"},"waiver_option_overrides":{"type":["array","null"],"items":{"type":"string"}},"waiver_type_id":{"type":["integer","null"]},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"sort_order":1,"waiver_option_overrides":["string"],"waiver_type_id":1,"id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"GiftCard":{"title":"Gift Card","type":"object","properties":{"code":{"type":"string","maxLength":45},"created_at":{"type":"string","format":"date-time"},"original_balance":{"type":"integer","description":"The value the gift card was issued or last reloaded with. In the account\u0027s minor currency unit (cents for USD)."},"current_balance":{"type":"integer","description":"What is left on the gift card to spend: the outstanding liability. In the account\u0027s minor currency unit (cents for USD)."},"to_full_name":{"type":["string","null"],"maxLength":255},"personalized_note":{"type":["string","null"]},"is_price_hidden":{"type":"boolean","description":"When true, the card\u0027s dollar value isn\u0027t shown to the recipient \u2014 useful for a gift where the amount is meant to stay private."},"is_complimentary":{"type":"boolean"},"to_email":{"type":["string","null"],"maxLength":255,"format":"email"},"expiration_date":{"type":["string","null"],"format":"date"},"trip_id":{"type":["string","null"]},"gift_card_status":{"type":["string","null"],"description":"One of `pending`, `active`, `used`, `expired`, `refunded`, or `deleted`. Read-only \u2014 the status only changes through **Activate**\/**Reload**\/other lifecycle actions, never a direct write."},"gift_card_style":{"type":["string","null"]},"gift_card_style_id":{"type":["string","null"]},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"code":"string","created_at":"2026-01-15T09:30:00+00:00","original_balance":1,"current_balance":1,"to_full_name":"string","personalized_note":"string","is_price_hidden":true,"is_complimentary":true,"to_email":"string","expiration_date":"2026-01-15","trip_id":"string","gift_card_status":"string","gift_card_style":"string","gift_card_style_id":"string","id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"GiftCardWrite":{"title":"Gift Card Write","type":"object","properties":{"trip_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"to_full_name":{"type":["string","null"],"maxLength":255},"personalized_note":{"type":["string","null"]},"is_price_hidden":{"type":"boolean","description":"When true, the card\u0027s dollar value isn\u0027t shown to the recipient \u2014 useful for a gift where the amount is meant to stay private."},"is_complimentary":{"type":"boolean"},"to_email":{"type":["string","null"],"maxLength":255,"format":"email"},"gift_card_style_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"expiration_date":{"type":["string","null"],"format":"date","description":"Y-m-d"}},"example":{"trip_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","to_full_name":"string","personalized_note":"string","is_price_hidden":true,"is_complimentary":true,"to_email":"string","gift_card_style_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","expiration_date":"2026-01-15"},"x-internal":true},"Location":{"title":"Location","type":"object","properties":{"name":{"type":"string","maxLength":255,"description":"Operator-facing name of this location."},"is_live":{"type":"boolean","description":"When true the location is Active and available to assign to activities; when false it is Archived and hidden when assigning a location."},"directions":{"type":["string","null"],"description":"Optional notes shown to staff and guests about getting to this location."},"address":{"type":["string","null"],"maxLength":100,"description":"Street address line."},"city":{"type":["string","null"],"maxLength":65,"description":"City name."},"state":{"type":["string","null"],"maxLength":20,"description":"State, province, or region."},"postal_code":{"type":["string","null"],"maxLength":15,"description":"Postal or ZIP code."},"latitude":{"type":["number","null"],"description":"Optional. Decimal degrees from -90 to 90, passed to OTA listings along with longitude."},"longitude":{"type":["number","null"],"description":"Optional. Decimal degrees from -180 to 180, passed to OTA listings along with latitude."},"timezone":{"type":"string","maxLength":45,"description":"IANA timezone name, e.g. `America\/New_York`. Required."},"country":{"type":["string","null"],"description":"Two-letter ISO country code. Read-only; write the country with `country_id`."},"country_id":{"type":["string","null"],"description":"Id of the country, written as `country_id`. It cannot be changed once the location exists (409)."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"name":"string","is_live":true,"directions":"string","address":"string","city":"string","state":"string","postal_code":"string","latitude":1,"longitude":1,"timezone":"string","country":"string","country_id":"string","id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"LocationWrite":{"title":"Location Write","type":"object","properties":{"name":{"type":"string","maxLength":255,"description":"Operator-facing name of this location."},"is_live":{"type":"boolean","description":"When true the location is Active and available to assign to activities; when false it is Archived and hidden when assigning a location."},"directions":{"type":["string","null"],"description":"Optional notes shown to staff and guests about getting to this location."},"address":{"type":["string","null"],"maxLength":100,"description":"Street address line."},"city":{"type":["string","null"],"maxLength":65,"description":"City name."},"state":{"type":["string","null"],"maxLength":20,"description":"State, province, or region."},"postal_code":{"type":["string","null"],"maxLength":15,"description":"Postal or ZIP code."},"latitude":{"type":["string","null"],"description":"Optional. Decimal degrees from -90 to 90, passed to OTA listings along with longitude."},"longitude":{"type":["string","null"],"description":"Optional. Decimal degrees from -180 to 180, passed to OTA listings along with latitude."},"timezone":{"type":"string","maxLength":45,"description":"IANA timezone name, e.g. `America\/New_York`. Required."},"country_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"The country this location is in, written as `country_id` with the id returned in a read. Required; fixed once the location exists (changing it returns 409)."}},"example":{"name":"string","is_live":true,"directions":"string","address":"string","city":"string","state":"string","postal_code":"string","latitude":"string","longitude":"string","timezone":"string","country_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"x-internal":true},"PhoneCall":{"title":"Phone Call","type":"object","properties":{"created_at":{"type":"string","format":"date-time","description":"When this record was created \u2014 for a webhook-received call this is receipt time, not necessarily the moment the call began. See `started_at`\/`ended_at` for the actual call window."},"caller_number":{"type":["string","null"],"description":"The caller\u0027s phone number, as reported by the provider. Format varies by provider \u2014 not guaranteed to be E.164."},"duration":{"type":["integer","null"],"description":"Call duration in seconds."},"caller_state":{"type":["string","null"],"description":"Caller\u0027s US state abbreviation (e.g. `HI`), when the provider or geocoding could determine one. Null for non-US callers or when it couldn\u0027t be determined."},"caller_city":{"type":["string","null"],"description":"Caller\u0027s city, when the provider or geocoding could determine one."},"recording_media_filename":{"type":["string","null"],"description":"The raw S3 object key for the call recording, when one exists \u2014 not a playable URL. Internal UIs turn this into a temporary signed URL via `CallRecordingStorage`; this API does not currently expose that presign step, so this value alone cannot be used to fetch the audio."},"transcript":{"type":["array","null"],"items":{"type":"string"},"description":"The full call transcript as an array of turns. Provider calls use `{text, start, speaker}`, where `speaker` is a raw diarization label (`A`, `B`, ...) mapped to agent\/caller by `speaker_a`\/`speaker_b`. Callbot calls use `{role, text, time_offset_ms}` with `role` already resolved."},"caller_name":{"type":["string","null"],"description":"Caller\u0027s name, when the provider or an AI enrichment step could determine one. Distinct from `caller_ai_name`\/`agent_ai_name`, which are the AI persona names used on a callbot call."},"summary":{"type":["string","null"],"description":"AI-generated summary of the call. See `abstract` for a shorter, one-line version."},"call_disposition":{"type":["string","null"],"description":"AI-classified call disposition (e.g. how the call was resolved). Free text, not a fixed enum \u2014 do not treat this as a closed set of values. See `outcome` for the fixed-enum callbot-only classification."},"caller_ai_name":{"type":["string","null"],"description":"Caller\u0027s name as extracted from the transcript by AI, used as a fallback when matching this call to a `Trip`\/`Customer` if `caller_name` is blank. Distinct from `caller_name`, which is the provider-reported\/authoritative name."},"agent_ai_name":{"type":["string","null"],"description":"The agent\/callbot\u0027s name as extracted from the transcript by AI."},"topics":{"type":["array","null"],"items":{"type":"string"},"description":"AI-extracted list of topic names discussed on the call. This is an unstructured JSON array with no filter support \u2014 see the separate Phone Call Tags resource (`\/rest\/phone-calls\/tags`) for structured, filterable\/queryable per-call tags (type, value, sentiment) instead."},"speaker_a":{"type":["string","null"],"description":"Which role (`agent` or `caller`) the diarization label \u0022A\u0022 in `transcript[].speaker` belongs to. Null for callbot calls, whose turns carry `role` directly."},"speaker_b":{"type":["string","null"],"description":"Which role (`agent` or `caller`) the diarization label \u0022B\u0022 in `transcript[].speaker` belongs to. Null for callbot calls, whose turns carry `role` directly."},"abstract":{"type":["string","null"],"description":"Short, one-line AI-generated summary of the call. See `summary` for the longer version."},"event_type":{"type":["string","null"],"description":"One of `post` (a completed call, the common case), `pre` (a pre-call event), or `voicemail` (the caller left a voicemail rather than connecting)."},"phone_call_tags":{"type":"array","items":{"$ref":"#\/components\/schemas\/PhoneCallTag"},"description":"The AI-extracted insights for this call, in the order they were created: the questions the caller asked, coaching tips for the agent, tips for the business, and places, people, amounts and dates mentioned. Each has a `phone_call_tag_type`. Tag types: `question` = a question the caller asked; `agent-tip` = an AI coaching tip for the call agent; `operator-tip` = an AI tip for the business operator; `location` = a place mentioned on the call; `person` = a person mentioned on the call; `money` = an amount of money mentioned, as written; `cs-phrase` = a customer-service moment such as feedback, an issue or a service request; `date-time` = a date or time mentioned; `other` = any other classified moment. Calls that were not analyzed have none."},"csat":{"type":["integer","null"],"description":"AI-estimated customer satisfaction score, 0-100."},"started_at":{"type":["string","null"],"format":"date-time","description":"When the actual call began, as reported by the provider \u2014 distinct from `created_at`, which is when this record was written."},"ended_at":{"type":["string","null"],"format":"date-time","description":"When the actual call ended, as reported by the provider. `ended_at` minus `started_at` will not always exactly equal `duration` \u2014 they can come from different provider fields."},"outcome":{"type":["string","null"],"description":"The fixed-enum outcome of a callbot call \u2014 one of `booking`, `lead_created`, `message_taken`, `lookup`, `inquiry`, `no_action`, `transferred`. Only ever set on callbot rows (`integration_type` is Callbot); null for every other provider. See `outcome_label` for the human-readable label."},"flagged_at":{"type":["string","null"],"format":"date-time","description":"When a staff user manually flagged this call for review, if ever. Null means never flagged."},"locationDescription":{"type":"string","description":"Best-effort human-readable caller location from `caller_city`\/`caller_state`\/`caller_country`. When only the country is known, the city\/region is guessed from `caller_number`. Null when none of those fields are set. Computed on read, not a stored field."},"outcomeLabel":{"type":["string","null"],"description":"Human-readable label for `outcome` (e.g. `booking` -\u003E `Booking`). Null whenever `outcome` is null."},"caller_country":{"type":["string","null"],"description":"Caller\u0027s country code (e.g. `US`), when known. Read-only on this API \u2014 there is no `caller_country_id` to set\/filter by."},"integration_type":{"type":["string","null"],"description":"The provider this call came through (e.g. `Dialpad`, `RingCentral`, `Callbot` for callbot calls). Read-only on this API."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"created_at":"2026-01-15T09:30:00+00:00","caller_number":"string","duration":1,"caller_state":"string","caller_city":"string","recording_media_filename":"string","transcript":["string"],"caller_name":"string","summary":"string","call_disposition":"string","caller_ai_name":"string","agent_ai_name":"string","topics":["string"],"speaker_a":"string","speaker_b":"string","abstract":"string","event_type":"string","phone_call_tags":["string"],"csat":1,"started_at":"2026-01-15T09:30:00+00:00","ended_at":"2026-01-15T09:30:00+00:00","outcome":"string","flagged_at":"2026-01-15T09:30:00+00:00","locationDescription":"string","outcomeLabel":"string","caller_country":"string","integration_type":"string","id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"PhoneCallTag":{"title":"Phone Call Tag","type":"object","properties":{"value":{"type":["string","null"],"description":"The tagged text itself \u2014 its meaning depends on `phone_call_tag_type` (a question the caller asked, a tip, a place, a person, an amount of money as written)."},"additional_detail":{"type":["string","null"],"description":"Extra AI-generated context\/quote supporting this tag, when available."},"sentiment":{"type":["integer","null"],"description":"Tag sentiment code: `1` = positive, `2` = negative, null = neutral or unclassified."},"phone_call_id":{"type":["string","null"],"description":"The phone call this tag belongs to, by its public id."},"phone_call_tag_type":{"type":["string","null"],"description":"The tag\u0027s type slug \u2014 the same value `phone_call_tag_type` is set\/filtered by."},"phone_call_tag_type_name":{"type":["string","null"],"description":"Human-readable label for `phone_call_tag_type` (e.g. `agent-tip` -\u003E \u0022Agent Tip\u0022). Read-only \u2014 set\/filter via `phone_call_tag_type` instead."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"value":"string","additional_detail":"string","sentiment":1,"phone_call_id":"string","phone_call_tag_type":"string","phone_call_tag_type_name":"string","id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"PromoCode":{"title":"Promo Code","type":"object","properties":{"code":{"type":"string","maxLength":25,"description":"The code a customer types at checkout to redeem this promotion \u2014 unique per account, case-sensitive."},"internal_name":{"type":"string","maxLength":255,"description":"The staff-only label shown in Setup \u003E Promo Codes \u2014 never shown to the customer (see public_name for that)."},"public_name":{"type":"string","maxLength":45,"description":"The customer-facing description of the discount (e.g. \u002210% off your booking\u0022), shown wherever the applied code is displayed at checkout. Optional \u2014 many existing codes leave this blank."},"amount":{"type":["integer","null"],"description":"A flat-dollar discount, in the smallest currency unit (cents for USD). Mutually exclusive with percent and set_price \u2014 exactly one of the three must be set; leave the other two null\/omitted."},"percent":{"type":["number","null"],"description":"A percentage discount, 1-100. Mutually exclusive with amount and set_price \u2014 exactly one of the three must be set; leave the other two null\/omitted. E-commerce codes are capped at 75% off unless limit_use_on_ecommerce is true."},"limit_advance_x_days":{"type":["integer","null"],"description":"Requires the trip to be booked at least this many days in advance of the sale\/departure date. Leave null for no advance-booking restriction."},"limit_min_bookings":{"type":["integer","null"],"description":"Minimum number of bookings\/guests the trip must have for this code to apply. Leave null for no minimum."},"limit_max_bookings":{"type":["integer","null"],"description":"Maximum number of bookings\/guests the trip may have for this code to still apply. Must be \u003E= limit_min_bookings when both are set. Leave null for no maximum."},"limit_total_uses":{"type":["integer","null"],"description":"Caps the total number of times this code can ever be redeemed across all customers, counted against reserved trips. Leave null for unlimited uses."},"limit_max_applications":{"type":["integer","null"],"description":"Maximum number of times this code can be applied within a single trip\/order (e.g. once per booking vs. stacked across every booking on the order)."},"limit_use_on_mon":{"type":"boolean","description":"A blackout flag, despite the name \u2014 when true, this code is BLOCKED (not allowed) on experiences scheduled for a Monday, not restricted to only that day."},"limit_use_on_tue":{"type":"boolean","description":"A blackout flag, despite the name \u2014 when true, this code is BLOCKED (not allowed) on experiences scheduled for a Tuesday, not restricted to only that day."},"limit_use_on_wed":{"type":"boolean","description":"A blackout flag, despite the name \u2014 when true, this code is BLOCKED (not allowed) on experiences scheduled for a Wednesday, not restricted to only that day."},"limit_use_on_thu":{"type":"boolean","description":"A blackout flag, despite the name \u2014 when true, this code is BLOCKED (not allowed) on experiences scheduled for a Thursday, not restricted to only that day."},"limit_use_on_fri":{"type":"boolean","description":"A blackout flag, despite the name \u2014 when true, this code is BLOCKED (not allowed) on experiences scheduled for a Friday, not restricted to only that day."},"limit_use_on_sat":{"type":"boolean","description":"A blackout flag, despite the name \u2014 when true, this code is BLOCKED (not allowed) on experiences scheduled for a Saturday, not restricted to only that day."},"limit_use_on_sun":{"type":"boolean","description":"A blackout flag, despite the name \u2014 when true, this code is BLOCKED (not allowed) on experiences scheduled for a Sunday, not restricted to only that day."},"allow_gc_use":{"type":"boolean","description":"When true, this code can be applied to a purchase that includes a gift card. Most discount codes are excluded from gift-card purchases by default (false)."},"limit_use_on_ecommerce":{"type":"boolean","description":"Despite the name, this is an agent-only restriction, not an ecommerce-only one: when true, the code can only be applied by a logged-in staff member\/agent and is rejected for an anonymous online checkout. When false (default), the code is also usable in self-service online checkout, which is why it\u0027s then subject to the 75%-off online cap (see percent)."},"is_apply_to_products":{"type":"boolean","description":"Whether this code can be applied to product (retail\/merchandise) sales, as opposed to only experience bookings."},"is_apply_to_addons":{"type":"boolean","description":"Whether this code\u0027s discount extends to add-ons attached to the booking, not just the base experience price."},"set_price":{"type":["integer","null"],"description":"Overrides the booking price to this flat amount (smallest currency unit, cents for USD) rather than discounting off the existing price. Mutually exclusive with amount and percent \u2014 exactly one of the three must be set. Exempt from the 75%-off online cap that applies to percent, since operators use this for deliberate flat-rate self-service promotions."},"experiences":{"type":"array","items":{"type":"string"},"description":"The experience ids this code applies to. A code must apply to at least one experience to be created. Read-only over REST\/MCP today \u2014 write via the create-time experience_ids array (see PromoCodeRESTController)."},"customerTypes":{"type":"array","items":{"type":"string"},"description":"The specific ticket\/customer types this code is restricted to (e.g. Adult, Child). Empty means unrestricted \u2014 the code applies to every ticket type on an eligible booking. Read-only over REST\/MCP today."},"promo_code_redeem_type":{"type":["string","null"],"description":"once-per-booking (applies to each booking on the trip individually) or once-per-trip (applies once to the whole order). Writable via promo_code_redeem_type_id."},"promo_code_status":{"type":["string","null"],"description":"available (redeemable), inactive (temporarily disabled by an operator), or used (its single use has been consumed, for a one-time code). Writable via promo_code_status_id."},"promo_code_dates":{"type":"array","items":{"type":"string"},"description":"Date\/time-window rules restricting when this code is valid. Each row is either an availability window (is_avail_range=1 \u2014 the code is ONLY valid inside this window) or a blackout window (is_avail_range=0 \u2014 the code is BLOCKED inside this window), and applies either to the experience date (is_exp_date_range=1) or the trip creation date (is_exp_date_range=0). Read-only over REST\/MCP today."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"code":"string","internal_name":"string","public_name":"string","amount":1,"percent":1,"limit_advance_x_days":1,"limit_min_bookings":1,"limit_max_bookings":1,"limit_total_uses":1,"limit_max_applications":1,"limit_use_on_mon":true,"limit_use_on_tue":true,"limit_use_on_wed":true,"limit_use_on_thu":true,"limit_use_on_fri":true,"limit_use_on_sat":true,"limit_use_on_sun":true,"allow_gc_use":true,"limit_use_on_ecommerce":true,"is_apply_to_products":true,"is_apply_to_addons":true,"set_price":1,"experiences":["string"],"customerTypes":["string"],"promo_code_redeem_type":"string","promo_code_status":"string","promo_code_dates":["string"],"id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"PromoCodeWrite":{"title":"Promo Code Write","type":"object","properties":{"code":{"type":"string","maxLength":25,"description":"The code a customer types at checkout to redeem this promotion \u2014 unique per account, case-sensitive."},"internal_name":{"type":"string","maxLength":255,"description":"The staff-only label shown in Setup \u003E Promo Codes \u2014 never shown to the customer (see public_name for that)."},"public_name":{"type":"string","maxLength":45,"description":"The customer-facing description of the discount (e.g. \u002210% off your booking\u0022), shown wherever the applied code is displayed at checkout. Optional \u2014 many existing codes leave this blank."},"amount":{"type":["integer","null"],"description":"A flat-dollar discount, in the smallest currency unit (cents for USD). Mutually exclusive with percent and set_price \u2014 exactly one of the three must be set; leave the other two null\/omitted."},"percent":{"type":["number","null"],"description":"A percentage discount, 1-100. Mutually exclusive with amount and set_price \u2014 exactly one of the three must be set; leave the other two null\/omitted. E-commerce codes are capped at 75% off unless limit_use_on_ecommerce is true."},"promo_code_redeem_type_id":{"type":["integer","null"],"description":"Whether the discount applies once per booking on the trip (once-per-booking) or once for the whole trip\/order (once-per-trip). Write via promo_code_redeem_type_id; read the human-readable slug via promo_code_redeem_type on the response."},"limit_advance_x_days":{"type":["integer","null"],"description":"Requires the trip to be booked at least this many days in advance of the sale\/departure date. Leave null for no advance-booking restriction."},"limit_min_bookings":{"type":["integer","null"],"description":"Minimum number of bookings\/guests the trip must have for this code to apply. Leave null for no minimum."},"limit_max_bookings":{"type":["integer","null"],"description":"Maximum number of bookings\/guests the trip may have for this code to still apply. Must be \u003E= limit_min_bookings when both are set. Leave null for no maximum."},"limit_total_uses":{"type":["integer","null"],"description":"Caps the total number of times this code can ever be redeemed across all customers, counted against reserved trips. Leave null for unlimited uses."},"limit_max_applications":{"type":["integer","null"],"description":"Maximum number of times this code can be applied within a single trip\/order (e.g. once per booking vs. stacked across every booking on the order)."},"limit_use_on_mon":{"type":"boolean","description":"A blackout flag, despite the name \u2014 when true, this code is BLOCKED (not allowed) on experiences scheduled for a Monday, not restricted to only that day."},"limit_use_on_tue":{"type":"boolean","description":"A blackout flag, despite the name \u2014 when true, this code is BLOCKED (not allowed) on experiences scheduled for a Tuesday, not restricted to only that day."},"limit_use_on_wed":{"type":"boolean","description":"A blackout flag, despite the name \u2014 when true, this code is BLOCKED (not allowed) on experiences scheduled for a Wednesday, not restricted to only that day."},"limit_use_on_thu":{"type":"boolean","description":"A blackout flag, despite the name \u2014 when true, this code is BLOCKED (not allowed) on experiences scheduled for a Thursday, not restricted to only that day."},"limit_use_on_fri":{"type":"boolean","description":"A blackout flag, despite the name \u2014 when true, this code is BLOCKED (not allowed) on experiences scheduled for a Friday, not restricted to only that day."},"limit_use_on_sat":{"type":"boolean","description":"A blackout flag, despite the name \u2014 when true, this code is BLOCKED (not allowed) on experiences scheduled for a Saturday, not restricted to only that day."},"limit_use_on_sun":{"type":"boolean","description":"A blackout flag, despite the name \u2014 when true, this code is BLOCKED (not allowed) on experiences scheduled for a Sunday, not restricted to only that day."},"promo_code_status_id":{"type":["integer","null"],"description":"Whether the code can currently be redeemed: available, inactive (temporarily disabled \u2014 still exists, still shows in reports), or used. Write via promo_code_status_id; read the slug via promo_code_status on the response."},"allow_gc_use":{"type":"boolean","description":"When true, this code can be applied to a purchase that includes a gift card. Most discount codes are excluded from gift-card purchases by default (false)."},"limit_use_on_ecommerce":{"type":"boolean","description":"Despite the name, this is an agent-only restriction, not an ecommerce-only one: when true, the code can only be applied by a logged-in staff member\/agent and is rejected for an anonymous online checkout. When false (default), the code is also usable in self-service online checkout, which is why it\u0027s then subject to the 75%-off online cap (see percent)."},"is_apply_to_products":{"type":"boolean","description":"Whether this code can be applied to product (retail\/merchandise) sales, as opposed to only experience bookings."},"is_apply_to_addons":{"type":"boolean","description":"Whether this code\u0027s discount extends to add-ons attached to the booking, not just the base experience price."},"set_price":{"type":["integer","null"],"description":"Overrides the booking price to this flat amount (smallest currency unit, cents for USD) rather than discounting off the existing price. Mutually exclusive with amount and percent \u2014 exactly one of the three must be set. Exempt from the 75%-off online cap that applies to percent, since operators use this for deliberate flat-rate self-service promotions."}},"example":{"code":"string","internal_name":"string","public_name":"string","amount":1,"percent":1,"promo_code_redeem_type_id":1,"limit_advance_x_days":1,"limit_min_bookings":1,"limit_max_bookings":1,"limit_total_uses":1,"limit_max_applications":1,"limit_use_on_mon":true,"limit_use_on_tue":true,"limit_use_on_wed":true,"limit_use_on_thu":true,"limit_use_on_fri":true,"limit_use_on_sat":true,"limit_use_on_sun":true,"promo_code_status_id":1,"allow_gc_use":true,"limit_use_on_ecommerce":true,"is_apply_to_products":true,"is_apply_to_addons":true,"set_price":1},"x-internal":true},"ReportRun":{"title":"Report Run","type":"object","properties":{"report_type":{"type":["string","null"]},"parameters":{"type":"array","items":{"type":"string"}},"row_count":{"type":["integer","null"]},"created_at":{"type":["string","null"],"format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"},"report_run_status":{"type":["string","null"]},"error":{"type":["array","null"],"items":{"type":"string"}},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"report_type":"string","parameters":["string"],"row_count":1,"created_at":"2026-01-15T09:30:00+00:00","completed_at":"2026-01-15T09:30:00+00:00","report_run_status":"string","error":["string"],"id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"Reseller":{"title":"Reseller","type":"object","properties":{"created_at":{"type":"string","format":"date-time","description":"When the reseller was created (ISO 8601 datetime). Set automatically; read-only."},"name":{"type":["string","null"],"maxLength":255,"description":"Display name of the reseller. Required, up to 255 characters, and unique among the account\u0027s resellers (a duplicate name is rejected on save)."},"code":{"type":"string","description":"System-generated 12-character locator code that identifies the reseller (assigned when the reseller is created). Read-only."},"address1":{"type":["string","null"],"maxLength":255,"description":"Street address line of the reseller. Optional, up to 255 characters."},"postal_code":{"type":["string","null"],"maxLength":45,"description":"ZIP or postal code of the reseller. Optional, up to 45 characters."},"city":{"type":["string","null"],"maxLength":45,"description":"City of the reseller. Optional, up to 45 characters."},"state":{"type":["string","null"],"maxLength":45,"description":"State, province, or region of the reseller. Optional, up to 45 characters."},"phone_number":{"type":["string","null"],"maxLength":25,"description":"Main phone number of the reseller. Optional, up to 25 characters."},"is_voucher_required":{"type":"boolean","description":"When true, a booking under this reseller cannot be moved to checked-in unless the trip has a voucher number."},"commission_rate":{"type":"integer","description":"Commission percentage for this reseller, stored as a whole number (15 means 15%). Not nullable; defaults to 0. Must be 60 or less when commission_rate_mode is 1 (global) and commission_rate_type is 1 (percentage). Cannot be set together with commission_fixed (only one of the two may be greater than 0), and must be 0 when commission_rate_mode is 2 (per activity)."},"credit_limit":{"type":"integer","description":"Maximum credit for this reseller, in the smallest currency unit of the account (cents; whole units for zero-decimal currencies). Not nullable; defaults to 0 and cannot be negative. When is_credit_limit_enabled is true it must be at least 10000."},"is_credit_limit_enabled":{"type":"boolean","description":"When true, credit_limit applies to this reseller and must be at least 10000 (smallest currency unit). When false, credit_limit is not applied."},"is_hide_rates_from_customer":{"type":"boolean","description":"When true, ticket prices are hidden from the customer in the order detail block of booking emails. Order detail blocks also hide prices for resellers whose collect_type is wholesale, regardless of this flag."},"is_crm_trip_receipt_disabled":{"type":"boolean","description":"When true, automatic booking confirmations and follow-ups to the customer are suppressed for trips booked through this reseller. If is_crm_send_reseller_receipt is also true, the confirmation is sent to the reseller (crm_email) instead of the customer."},"is_commissionable_on_product":{"type":"boolean","description":"When true, product sales on bookings under this reseller count toward the commissionable amount."},"is_commissionable_on_addon":{"type":"boolean","description":"When true, add-on sales on bookings under this reseller count toward the commissionable amount."},"is_commissionable_on_tax1":{"type":"boolean","description":"When true, the amount of tax 1 (the account\u0027s tax slot 1) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax2":{"type":"boolean","description":"When true, the amount of tax 2 (the account\u0027s tax slot 2) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax3":{"type":"boolean","description":"When true, the amount of tax 3 (the account\u0027s tax slot 3) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax4":{"type":"boolean","description":"When true, the amount of tax 4 (the account\u0027s tax slot 4) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax5":{"type":"boolean","description":"When true, the amount of tax 5 (the account\u0027s tax slot 5) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax6":{"type":"boolean","description":"When true, the amount of tax 6 (the account\u0027s tax slot 6) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax7":{"type":"boolean","description":"When true, the amount of tax 7 (the account\u0027s tax slot 7) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax8":{"type":"boolean","description":"When true, the amount of tax 8 (the account\u0027s tax slot 8) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax9":{"type":"boolean","description":"When true, the amount of tax 9 (the account\u0027s tax slot 9) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax10":{"type":"boolean","description":"When true, the amount of tax 10 (the account\u0027s tax slot 10) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax11":{"type":"boolean","description":"When true, the amount of tax 11 (the account\u0027s tax slot 11) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax12":{"type":"boolean","description":"When true, the amount of tax 12 (the account\u0027s tax slot 12) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax13":{"type":"boolean","description":"When true, the amount of tax 13 (the account\u0027s tax slot 13) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax14":{"type":"boolean","description":"When true, the amount of tax 14 (the account\u0027s tax slot 14) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax15":{"type":"boolean","description":"When true, the amount of tax 15 (the account\u0027s tax slot 15) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax16":{"type":"boolean","description":"When true, the amount of tax 16 (the account\u0027s tax slot 16) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax17":{"type":"boolean","description":"When true, the amount of tax 17 (the account\u0027s tax slot 17) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax18":{"type":"boolean","description":"When true, the amount of tax 18 (the account\u0027s tax slot 18) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax19":{"type":"boolean","description":"When true, the amount of tax 19 (the account\u0027s tax slot 19) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax20":{"type":"boolean","description":"When true, the amount of tax 20 (the account\u0027s tax slot 20) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"accounting_contact_name":{"type":["string","null"],"maxLength":255,"description":"Name of the person at the reseller responsible for billing, payments, and commissions. Optional, up to 255 characters."},"accounting_email":{"type":["string","null"],"maxLength":255,"format":"email","description":"Email address of the person at the reseller responsible for billing, payments, and commissions. Optional, up to 255 characters, must be a valid email address."},"accounting_phone_number":{"type":["string","null"],"maxLength":255,"description":"Phone number of the person at the reseller responsible for billing, payments, and commissions. Optional, up to 255 characters."},"tax_id":{"type":["string","null"],"maxLength":45,"description":"Tax identification number of the reseller. Optional, up to 45 characters."},"is_crm_send_reseller_receipt":{"type":"boolean","description":"When true, booking confirmations, reminders, and follow-ups are also sent to the reseller at crm_email. If is_crm_trip_receipt_disabled is true they go to the reseller instead of the customer; otherwise the customer receives them and the reseller is copied."},"crm_email":{"type":["string","null"],"maxLength":100,"description":"Email address or addresses of the reseller that receive booking emails when is_crm_send_reseller_receipt is true. Separate multiple addresses with a comma or semicolon; every entry must be a valid email address and the whole value may not exceed 100 characters. Optional."},"is_dynamic_commission_rate":{"type":["boolean","null"],"description":"When true, commission on orders where the OTA reports the net amount it will pay is derived from that net amount rather than only from the configured rate (for example the Viator Accelerator Program). Not nullable."},"commission_rate_type":{"type":["integer","null"],"description":"How commission is expressed. 1 = percentage (uses commission_rate), 2 = fixed amount (uses commission_fixed). Only the listed values are allowed."},"commission_rate_mode":{"type":["integer","null"],"description":"Whether one commission applies to every activity or each activity has its own. 1 = global (one commission set by commission_rate_type and commission_rate or commission_fixed), 2 = per activity (commission is set per activity; commission_rate and commission_fixed must both be 0). Read-only over the API: per-activity commissions are not available through the API yet, so this is changed in the Setup screens."},"commission_calculation_mode":{"type":["integer","null"],"description":"How commission is calculated. 1 = per activity (applied once per activity), 2 = per person\/ticket (scales with the number of tickets sold). Only the listed values are allowed."},"commission_fixed":{"type":["integer","null"],"description":"Fixed commission amount, in the smallest currency unit of the account (cents; whole units for zero-decimal currencies). Not nullable; defaults to 0 and cannot be negative. Cannot be set together with commission_rate (only one of the two may be greater than 0), and must be 0 when commission_rate_mode is 2 (per activity). Required when commission_rate_mode is 1 and commission_rate_type is 2."},"tax_1_is_enabled":{"type":["boolean","null"],"description":"Whether tax 1 (the account\u0027s tax slot 1) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_2_is_enabled":{"type":["boolean","null"],"description":"Whether tax 2 (the account\u0027s tax slot 2) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_3_is_enabled":{"type":["boolean","null"],"description":"Whether tax 3 (the account\u0027s tax slot 3) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_4_is_enabled":{"type":["boolean","null"],"description":"Whether tax 4 (the account\u0027s tax slot 4) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_5_is_enabled":{"type":["boolean","null"],"description":"Whether tax 5 (the account\u0027s tax slot 5) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_6_is_enabled":{"type":["boolean","null"],"description":"Whether tax 6 (the account\u0027s tax slot 6) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_7_is_enabled":{"type":["boolean","null"],"description":"Whether tax 7 (the account\u0027s tax slot 7) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_8_is_enabled":{"type":["boolean","null"],"description":"Whether tax 8 (the account\u0027s tax slot 8) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_9_is_enabled":{"type":["boolean","null"],"description":"Whether tax 9 (the account\u0027s tax slot 9) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_10_is_enabled":{"type":["boolean","null"],"description":"Whether tax 10 (the account\u0027s tax slot 10) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_11_is_enabled":{"type":["boolean","null"],"description":"Whether tax 11 (the account\u0027s tax slot 11) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_12_is_enabled":{"type":["boolean","null"],"description":"Whether tax 12 (the account\u0027s tax slot 12) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_13_is_enabled":{"type":["boolean","null"],"description":"Whether tax 13 (the account\u0027s tax slot 13) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_14_is_enabled":{"type":["boolean","null"],"description":"Whether tax 14 (the account\u0027s tax slot 14) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_15_is_enabled":{"type":["boolean","null"],"description":"Whether tax 15 (the account\u0027s tax slot 15) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_16_is_enabled":{"type":["boolean","null"],"description":"Whether tax 16 (the account\u0027s tax slot 16) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_17_is_enabled":{"type":["boolean","null"],"description":"Whether tax 17 (the account\u0027s tax slot 17) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_18_is_enabled":{"type":["boolean","null"],"description":"Whether tax 18 (the account\u0027s tax slot 18) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_19_is_enabled":{"type":["boolean","null"],"description":"Whether tax 19 (the account\u0027s tax slot 19) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"tax_20_is_enabled":{"type":["boolean","null"],"description":"Whether tax 20 (the account\u0027s tax slot 20) is set to apply to this reseller. Read-only: managed from the account\u0027s tax settings, shown as a disabled checkbox on the reseller form. Nullable."},"reseller_type_id":{"type":["integer","null"],"description":"Id of the reseller type; set once at creation and immutable afterwards. The type name is returned in reseller_type."},"reseller_type":{"type":["string","null"],"description":"Name of the reseller type (for example User Defined or Viator). Read-only; the type is set once at creation with reseller_type_id."},"country":{"type":["string","null"],"description":"Two-letter ISO country code of the reseller (for example US or CA), or null when none is set. Write it with the same country key."},"reseller_status":{"type":["string","null"],"description":"Slug of the reseller status: active, hold, or archived. active allows new bookings; hold and archived block new bookings. Writable via reseller_status."},"payment_method":{"type":["string","null"],"description":"Slug of when payment is collected for bookings under this reseller: auto-pay, invoice-manual-apply, at-booking, or none. Writable via payment_method."},"collect_type":{"type":["string","null"],"description":"Slug of the amount the payee remits when payment is required at booking: retail (including commission) or wholesale (without commission). Read-only; derived from the reseller type."},"is_api_connected_ota":{"type":"boolean","description":"True when the reseller is not a User Defined type and is linked to an API integration provider (an OTA connected directly to the account). Read-only: derived from the reseller type and its provider link."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"created_at":"2026-01-15T09:30:00+00:00","name":"string","code":"string","address1":"string","postal_code":"string","city":"string","state":"string","phone_number":"string","is_voucher_required":true,"commission_rate":1,"credit_limit":1,"is_credit_limit_enabled":true,"is_hide_rates_from_customer":true,"is_crm_trip_receipt_disabled":true,"is_commissionable_on_product":true,"is_commissionable_on_addon":true,"is_commissionable_on_tax1":true,"is_commissionable_on_tax2":true,"is_commissionable_on_tax3":true,"is_commissionable_on_tax4":true,"is_commissionable_on_tax5":true,"is_commissionable_on_tax6":true,"is_commissionable_on_tax7":true,"is_commissionable_on_tax8":true,"is_commissionable_on_tax9":true,"is_commissionable_on_tax10":true,"is_commissionable_on_tax11":true,"is_commissionable_on_tax12":true,"is_commissionable_on_tax13":true,"is_commissionable_on_tax14":true,"is_commissionable_on_tax15":true,"is_commissionable_on_tax16":true,"is_commissionable_on_tax17":true,"is_commissionable_on_tax18":true,"is_commissionable_on_tax19":true,"is_commissionable_on_tax20":true,"accounting_contact_name":"string","accounting_email":"string","accounting_phone_number":"string","tax_id":"string","is_crm_send_reseller_receipt":true,"crm_email":"string","is_dynamic_commission_rate":true,"commission_rate_type":1,"commission_rate_mode":1,"commission_calculation_mode":1,"commission_fixed":1,"tax_1_is_enabled":true,"tax_2_is_enabled":true,"tax_3_is_enabled":true,"tax_4_is_enabled":true,"tax_5_is_enabled":true,"tax_6_is_enabled":true,"tax_7_is_enabled":true,"tax_8_is_enabled":true,"tax_9_is_enabled":true,"tax_10_is_enabled":true,"tax_11_is_enabled":true,"tax_12_is_enabled":true,"tax_13_is_enabled":true,"tax_14_is_enabled":true,"tax_15_is_enabled":true,"tax_16_is_enabled":true,"tax_17_is_enabled":true,"tax_18_is_enabled":true,"tax_19_is_enabled":true,"tax_20_is_enabled":true,"reseller_type_id":1,"reseller_type":"string","country":"string","reseller_status":"string","payment_method":"string","collect_type":"string","is_api_connected_ota":true,"id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"ResellerWrite":{"title":"Reseller Write","type":"object","properties":{"name":{"type":["string","null"],"maxLength":255,"description":"Display name of the reseller. Required, up to 255 characters, and unique among the account\u0027s resellers (a duplicate name is rejected on save)."},"address1":{"type":["string","null"],"maxLength":255,"description":"Street address line of the reseller. Optional, up to 255 characters."},"postal_code":{"type":["string","null"],"maxLength":45,"description":"ZIP or postal code of the reseller. Optional, up to 45 characters."},"city":{"type":["string","null"],"maxLength":45,"description":"City of the reseller. Optional, up to 45 characters."},"state":{"type":["string","null"],"maxLength":45,"description":"State, province, or region of the reseller. Optional, up to 45 characters."},"country":{"type":["string","null"],"description":"Country of the reseller, as its two-letter ISO country code (for example US or CA); used both to write and to filter. Nullable on the record, although the Setup reseller form requires one."},"phone_number":{"type":["string","null"],"maxLength":25,"description":"Main phone number of the reseller. Optional, up to 25 characters."},"is_voucher_required":{"type":"boolean","description":"When true, a booking under this reseller cannot be moved to checked-in unless the trip has a voucher number."},"payment_method":{"type":["string","null"],"description":"Slug of when payment is collected for bookings under this reseller: auto-pay (a payment is applied automatically at booking), invoice-manual-apply (invoice the reseller and apply payments manually), at-booking (payment required at booking), or none (no payment required). Required. auto-pay is rejected for User Defined (type 1) resellers."},"commission_rate":{"type":["integer","null"],"description":"Commission percentage for this reseller, stored as a whole number (15 means 15%). Not nullable; defaults to 0. Must be 60 or less when commission_rate_mode is 1 (global) and commission_rate_type is 1 (percentage). Cannot be set together with commission_fixed (only one of the two may be greater than 0), and must be 0 when commission_rate_mode is 2 (per activity)."},"credit_limit":{"type":"integer","description":"Maximum credit for this reseller, in the smallest currency unit of the account (cents; whole units for zero-decimal currencies). Not nullable; defaults to 0 and cannot be negative. When is_credit_limit_enabled is true it must be at least 10000."},"is_credit_limit_enabled":{"type":"boolean","description":"When true, credit_limit applies to this reseller and must be at least 10000 (smallest currency unit). When false, credit_limit is not applied."},"reseller_type_id":{"type":["integer","null"],"description":"Type of reseller, set once at creation as reseller_type_id (the id also returned by a read; the type name is returned in reseller_type) and immutable afterwards. Required. Resellers of a user-defined type cannot use the auto-pay payment method."},"reseller_status":{"type":["string","null"],"description":"Slug of the reseller status: active, hold, or archived. active allows new bookings; hold and archived block new bookings. Required."},"is_hide_rates_from_customer":{"type":"boolean","description":"When true, ticket prices are hidden from the customer in the order detail block of booking emails. Order detail blocks also hide prices for resellers whose collect_type is wholesale, regardless of this flag."},"is_crm_trip_receipt_disabled":{"type":"boolean","description":"When true, automatic booking confirmations and follow-ups to the customer are suppressed for trips booked through this reseller. If is_crm_send_reseller_receipt is also true, the confirmation is sent to the reseller (crm_email) instead of the customer."},"is_commissionable_on_product":{"type":"boolean","description":"When true, product sales on bookings under this reseller count toward the commissionable amount."},"is_commissionable_on_addon":{"type":"boolean","description":"When true, add-on sales on bookings under this reseller count toward the commissionable amount."},"is_commissionable_on_tax1":{"type":"boolean","description":"When true, the amount of tax 1 (the account\u0027s tax slot 1) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax2":{"type":"boolean","description":"When true, the amount of tax 2 (the account\u0027s tax slot 2) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax3":{"type":"boolean","description":"When true, the amount of tax 3 (the account\u0027s tax slot 3) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax4":{"type":"boolean","description":"When true, the amount of tax 4 (the account\u0027s tax slot 4) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax5":{"type":"boolean","description":"When true, the amount of tax 5 (the account\u0027s tax slot 5) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax6":{"type":"boolean","description":"When true, the amount of tax 6 (the account\u0027s tax slot 6) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax7":{"type":"boolean","description":"When true, the amount of tax 7 (the account\u0027s tax slot 7) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax8":{"type":"boolean","description":"When true, the amount of tax 8 (the account\u0027s tax slot 8) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax9":{"type":"boolean","description":"When true, the amount of tax 9 (the account\u0027s tax slot 9) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax10":{"type":"boolean","description":"When true, the amount of tax 10 (the account\u0027s tax slot 10) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax11":{"type":"boolean","description":"When true, the amount of tax 11 (the account\u0027s tax slot 11) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax12":{"type":"boolean","description":"When true, the amount of tax 12 (the account\u0027s tax slot 12) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax13":{"type":"boolean","description":"When true, the amount of tax 13 (the account\u0027s tax slot 13) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax14":{"type":"boolean","description":"When true, the amount of tax 14 (the account\u0027s tax slot 14) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax15":{"type":"boolean","description":"When true, the amount of tax 15 (the account\u0027s tax slot 15) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax16":{"type":"boolean","description":"When true, the amount of tax 16 (the account\u0027s tax slot 16) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax17":{"type":"boolean","description":"When true, the amount of tax 17 (the account\u0027s tax slot 17) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax18":{"type":"boolean","description":"When true, the amount of tax 18 (the account\u0027s tax slot 18) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax19":{"type":"boolean","description":"When true, the amount of tax 19 (the account\u0027s tax slot 19) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"is_commissionable_on_tax20":{"type":"boolean","description":"When true, the amount of tax 20 (the account\u0027s tax slot 20) is included in the commissionable amount for bookings under this reseller. Only meaningful when that tax is enabled on the account."},"accounting_contact_name":{"type":["string","null"],"maxLength":255,"description":"Name of the person at the reseller responsible for billing, payments, and commissions. Optional, up to 255 characters."},"accounting_email":{"type":["string","null"],"maxLength":255,"format":"email","description":"Email address of the person at the reseller responsible for billing, payments, and commissions. Optional, up to 255 characters, must be a valid email address."},"accounting_phone_number":{"type":["string","null"],"maxLength":255,"description":"Phone number of the person at the reseller responsible for billing, payments, and commissions. Optional, up to 255 characters."},"tax_id":{"type":["string","null"],"maxLength":45,"description":"Tax identification number of the reseller. Optional, up to 45 characters."},"is_crm_send_reseller_receipt":{"type":"boolean","description":"When true, booking confirmations, reminders, and follow-ups are also sent to the reseller at crm_email. If is_crm_trip_receipt_disabled is true they go to the reseller instead of the customer; otherwise the customer receives them and the reseller is copied."},"crm_email":{"type":["string","null"],"maxLength":100,"description":"Email address or addresses of the reseller that receive booking emails when is_crm_send_reseller_receipt is true. Separate multiple addresses with a comma or semicolon; every entry must be a valid email address and the whole value may not exceed 100 characters. Optional."},"is_dynamic_commission_rate":{"type":"boolean","description":"When true, commission on orders where the OTA reports the net amount it will pay is derived from that net amount rather than only from the configured rate (for example the Viator Accelerator Program). Not nullable."},"commission_rate_type":{"type":"integer","description":"How commission is expressed. 1 = percentage (uses commission_rate), 2 = fixed amount (uses commission_fixed). Only the listed values are allowed."},"commission_calculation_mode":{"type":"integer","description":"How commission is calculated. 1 = per activity (applied once per activity), 2 = per person\/ticket (scales with the number of tickets sold). Only the listed values are allowed."},"commission_fixed":{"type":["integer","null"],"description":"Fixed commission amount, in the smallest currency unit of the account (cents; whole units for zero-decimal currencies). Not nullable; defaults to 0 and cannot be negative. Cannot be set together with commission_rate (only one of the two may be greater than 0), and must be 0 when commission_rate_mode is 2 (per activity). Required when commission_rate_mode is 1 and commission_rate_type is 2."}},"example":{"name":"string","address1":"string","postal_code":"string","city":"string","state":"string","country":"string","phone_number":"string","is_voucher_required":true,"payment_method":"string","commission_rate":1,"credit_limit":1,"is_credit_limit_enabled":true,"reseller_type_id":1,"reseller_status":"string","is_hide_rates_from_customer":true,"is_crm_trip_receipt_disabled":true,"is_commissionable_on_product":true,"is_commissionable_on_addon":true,"is_commissionable_on_tax1":true,"is_commissionable_on_tax2":true,"is_commissionable_on_tax3":true,"is_commissionable_on_tax4":true,"is_commissionable_on_tax5":true,"is_commissionable_on_tax6":true,"is_commissionable_on_tax7":true,"is_commissionable_on_tax8":true,"is_commissionable_on_tax9":true,"is_commissionable_on_tax10":true,"is_commissionable_on_tax11":true,"is_commissionable_on_tax12":true,"is_commissionable_on_tax13":true,"is_commissionable_on_tax14":true,"is_commissionable_on_tax15":true,"is_commissionable_on_tax16":true,"is_commissionable_on_tax17":true,"is_commissionable_on_tax18":true,"is_commissionable_on_tax19":true,"is_commissionable_on_tax20":true,"accounting_contact_name":"string","accounting_email":"string","accounting_phone_number":"string","tax_id":"string","is_crm_send_reseller_receipt":true,"crm_email":"string","is_dynamic_commission_rate":true,"commission_rate_type":1,"commission_calculation_mode":1,"commission_fixed":1},"x-internal":true},"Restriction":{"title":"Restriction","type":"object","properties":{"empty_min":{"type":"integer","description":"Minimum party size for a single booking while this departure currently has zero guests booked. Must not exceed `empty_max`."},"empty_max":{"type":"integer","description":"Maximum party size for a single booking while this departure currently has zero guests booked. Must be greater than or equal to `empty_min`."},"empty_auto_close_hours_before":{"type":"integer","description":"Hours before the reference point named by `empty_restriction_close_type` that booking closes automatically, while this departure has zero guests booked."},"empty_call_to_book":{"type":"boolean","description":"Reserved for a currently-undecided empty-state call-to-book toggle (TRIP-4799 AC4, still open) \u2014 round-trips through Setup and this API today but drives no runtime decision."},"not_empty_min":{"type":"integer","description":"Minimum party size for a single booking once this departure already has at least one guest booked. Must not exceed `not_empty_max`."},"not_empty_max":{"type":"integer","description":"Maximum party size for a single booking once this departure already has at least one guest booked. Must be greater than or equal to `not_empty_min`."},"not_empty_auto_close_hours_before":{"type":"integer","description":"Hours before the reference point named by `not_empty_restriction_close_type` that booking closes automatically, once this departure has at least one guest booked."},"not_empty_call_to_book":{"type":"boolean","description":"Reserved for a currently-undecided not-empty-state call-to-book toggle (TRIP-4799 AC4, still open) \u2014 round-trips through Setup and this API today but drives no runtime decision."},"full_call_to_book":{"type":"boolean","description":"The only one of the three `*_call_to_book` flags currently wired to a decision: when true, a full\/closed shopper-facing slot shows `call_to_book_phrase` instead of a neutral Sold-Out\/Unavailable label."},"hide_unavailable_timeslots":{"type":"boolean","description":"When true, a timeslot blocked by this Restriction is omitted from the shopper-facing widget entirely rather than shown disabled."},"call_to_book_phrase":{"type":"string","maxLength":45,"description":"Shopper-facing text shown in place of a bookable price\/button whenever a `*_call_to_book` toggle is active for the current seat state."},"show_seats_left":{"type":"boolean","description":"Whether to surface remaining-seat counts on the shopper-facing widget at all."},"show_seats_left_min":{"type":"integer","description":"The seats-remaining threshold at or below which the remaining-seat count actually appears \u2014 not shown above this threshold even when `show_seats_left` is true."},"name":{"type":"string","maxLength":255,"description":"The operator-facing label for this Restriction in Setup \u2014 not shown to shoppers."},"booking_advance_window_limit":{"type":"boolean","description":"Whether an advance-booking visibility window is enforced for an unauthenticated\/ecommerce or reseller caller. Staff and non-reseller authenticated callers always bypass this window."},"booking_advance_window_days":{"type":"integer","description":"How many days before departure a date becomes bookable, when `booking_advance_window_limit` is enabled."},"booking_advance_window_hours":{"type":"integer","description":"How many additional hours before departure a date becomes bookable, when `booking_advance_window_limit` is enabled."},"empty_restriction_close_type":{"type":["string","null"],"description":"Which instant `empty_auto_close_hours_before` counts back from: `midnight` (the midnight that ends the departure\u0027s calendar day, in the location\u0027s timezone) or `event_start` (the departure\u0027s actual start time)."},"not_empty_restriction_close_type":{"type":["string","null"],"description":"Which instant `not_empty_auto_close_hours_before` counts back from: `midnight` (the midnight that ends the departure\u0027s calendar day, in the location\u0027s timezone) or `event_start` (the departure\u0027s actual start time)."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"empty_min":1,"empty_max":1,"empty_auto_close_hours_before":1,"empty_call_to_book":true,"not_empty_min":1,"not_empty_max":1,"not_empty_auto_close_hours_before":1,"not_empty_call_to_book":true,"full_call_to_book":true,"hide_unavailable_timeslots":true,"call_to_book_phrase":"string","show_seats_left":true,"show_seats_left_min":1,"name":"string","booking_advance_window_limit":true,"booking_advance_window_days":1,"booking_advance_window_hours":1,"empty_restriction_close_type":"string","not_empty_restriction_close_type":"string","id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"RestrictionWrite":{"title":"Restriction Write","type":"object","properties":{"empty_min":{"type":"integer","description":"Minimum party size for a single booking while this departure currently has zero guests booked. Must not exceed `empty_max`."},"empty_max":{"type":"integer","description":"Maximum party size for a single booking while this departure currently has zero guests booked. Must be greater than or equal to `empty_min`."},"empty_auto_close_hours_before":{"type":"integer","description":"Hours before the reference point named by `empty_restriction_close_type` that booking closes automatically, while this departure has zero guests booked."},"empty_call_to_book":{"type":"boolean","description":"Reserved for a currently-undecided empty-state call-to-book toggle (TRIP-4799 AC4, still open) \u2014 round-trips through Setup and this API today but drives no runtime decision."},"not_empty_min":{"type":"integer","description":"Minimum party size for a single booking once this departure already has at least one guest booked. Must not exceed `not_empty_max`."},"not_empty_max":{"type":"integer","description":"Maximum party size for a single booking once this departure already has at least one guest booked. Must be greater than or equal to `not_empty_min`."},"not_empty_auto_close_hours_before":{"type":"integer","description":"Hours before the reference point named by `not_empty_restriction_close_type` that booking closes automatically, once this departure has at least one guest booked."},"not_empty_call_to_book":{"type":"boolean","description":"Reserved for a currently-undecided not-empty-state call-to-book toggle (TRIP-4799 AC4, still open) \u2014 round-trips through Setup and this API today but drives no runtime decision."},"full_call_to_book":{"type":"boolean","description":"The only one of the three `*_call_to_book` flags currently wired to a decision: when true, a full\/closed shopper-facing slot shows `call_to_book_phrase` instead of a neutral Sold-Out\/Unavailable label."},"hide_unavailable_timeslots":{"type":"boolean","description":"When true, a timeslot blocked by this Restriction is omitted from the shopper-facing widget entirely rather than shown disabled."},"call_to_book_phrase":{"type":"string","maxLength":45,"description":"Shopper-facing text shown in place of a bookable price\/button whenever a `*_call_to_book` toggle is active for the current seat state."},"show_seats_left":{"type":"boolean","description":"Whether to surface remaining-seat counts on the shopper-facing widget at all."},"show_seats_left_min":{"type":"integer","description":"The seats-remaining threshold at or below which the remaining-seat count actually appears \u2014 not shown above this threshold even when `show_seats_left` is true."},"name":{"type":["string","null"],"maxLength":255,"description":"The operator-facing label for this Restriction in Setup \u2014 not shown to shoppers."},"empty_restriction_close_type":{"type":["string","null"],"description":"Which instant `empty_auto_close_hours_before` counts back from: `midnight` (the midnight that ends the departure\u0027s calendar day, in the location\u0027s timezone) or `event_start` (the departure\u0027s actual start time)."},"not_empty_restriction_close_type":{"type":["string","null"],"description":"Which instant `not_empty_auto_close_hours_before` counts back from: `midnight` (the midnight that ends the departure\u0027s calendar day, in the location\u0027s timezone) or `event_start` (the departure\u0027s actual start time)."},"booking_advance_window_limit":{"type":"boolean","description":"Whether an advance-booking visibility window is enforced for an unauthenticated\/ecommerce or reseller caller. Staff and non-reseller authenticated callers always bypass this window."},"booking_advance_window_days":{"type":"integer","description":"How many days before departure a date becomes bookable, when `booking_advance_window_limit` is enabled."},"booking_advance_window_hours":{"type":"integer","description":"How many additional hours before departure a date becomes bookable, when `booking_advance_window_limit` is enabled."}},"example":{"empty_min":1,"empty_max":1,"empty_auto_close_hours_before":1,"empty_call_to_book":true,"not_empty_min":1,"not_empty_max":1,"not_empty_auto_close_hours_before":1,"not_empty_call_to_book":true,"full_call_to_book":true,"hide_unavailable_timeslots":true,"call_to_book_phrase":"string","show_seats_left":true,"show_seats_left_min":1,"name":"string","empty_restriction_close_type":"string","not_empty_restriction_close_type":"string","booking_advance_window_limit":true,"booking_advance_window_days":1,"booking_advance_window_hours":1},"x-internal":true},"Review":{"title":"Review","type":"object","properties":{"created_at":{"type":"string","format":"date-time","description":"When the review was created, as an ISO 8601 date-time. Read-only and cannot be written: it is set automatically when the review is created, and for reviews imported from TripAdvisor it is the date the review was originally published there. Filterable with `created_at[gte]` and `created_at[lte]` and sortable with `?sort=created_at`; the default list order is newest first."},"name":{"type":"string","maxLength":255,"description":"Display name of the reviewer, up to 255 characters. Required and must not be blank on create; optional on update. Reviews left through the guest review form default to the booking customer\u0027s full name, and TripAdvisor imports use the reviewer\u0027s TripAdvisor username. Filterable by exact match, `name[contains]` or `name[begins_with]`."},"location":{"type":["string","null"],"maxLength":255,"description":"Where the reviewer says they are from (for example a city or country), as free text up to 255 characters. Optional: omit it on create to leave it empty, or send an explicit `null` on update to clear it. Guest-form reviews default to the booking customer\u0027s country and TripAdvisor imports use the reviewer\u0027s listed location when TripAdvisor provides one. Filterable by exact match, `location[contains]` or `location[begins_with]`."},"overall_comment":{"type":["string","null"],"maxLength":16383,"description":"The reviewer\u0027s main written feedback, up to 16383 characters. Optional: omitted from responses when empty. An explicit `null` or empty string is stored as null, never as an empty string. Filterable with `overall_comment[contains]` (a substring match on the text). Together with `improve_comment` this text is what sentiment analysis scores, so creating a review with text, or changing this field on update, re-runs sentiment analysis and recomputes the read-only `sentiment` fields. Plain text as submitted; no HTML is added or interpreted by the API."},"is_approved":{"type":"boolean","description":"Whether the review has been approved for display, shown as the Approved column in the staff Reviews table. A boolean that defaults to `false` on create; an explicit `null` is treated as `false`. Changing it does not trigger sentiment analysis. Filter with `?is_approved=true` or `?is_approved=false`."},"rating":{"type":"integer","description":"Star rating given by the reviewer, a whole number from 1 (worst) to 5 (best). Optional on create and defaults to 5 when omitted; an explicit `null` and values outside 1-5 are rejected with a validation error. Filterable by exact value or with `rating[gte]` and `rating[lte]`. Changing the rating does not re-run sentiment analysis."},"improve_comment":{"type":["string","null"],"maxLength":16383,"description":"The reviewer\u0027s answer to what could be improved, up to 16383 characters. In the guest review form this feedback is private and sent to the company managers. Optional: omitted from responses when empty. An explicit `null` or empty string is stored as null, never as an empty string. Filterable with `improve_comment[contains]`. It is scored together with `overall_comment` for sentiment, except that an answer that is exactly `nothing`, `nonya` or `n\/a` (any capitalization), or that starts with `nothing` or `not a thing`, is left out so it is not mistaken for negative feedback; changing it on update re-runs sentiment analysis."},"sentiment_neutral":{"type":["integer","null"],"description":"Neutral share of the review\u0027s sentiment, a whole number from 0 to 100 (the sentiment analysis score multiplied by 100 and rounded to the nearest integer). Read-only and cannot be set directly. Derived from `overall_comment` and `improve_comment` when a review is created and again whenever either text changes; reviews with no text score 0. Filterable by exact value or with the `gte` and `lte` operators. The three positive\/negative\/neutral shares are rounded independently, so they may not sum to exactly 100."},"sentiment_positive":{"type":["integer","null"],"description":"Positive share of the review\u0027s sentiment, a whole number from 0 to 100 (the sentiment analysis score multiplied by 100 and rounded to the nearest integer). Read-only and cannot be set directly. Derived from `overall_comment` and `improve_comment` when a review is created and again whenever either text changes; reviews with no text score 0. Filterable by exact value or with the `gte` and `lte` operators. Because each share is rounded independently, the three shares may not sum to exactly 100."},"sentiment_negative":{"type":["integer","null"],"description":"Negative share of the review\u0027s sentiment, a whole number from 0 to 100 (the sentiment analysis score multiplied by 100 and rounded to the nearest integer). Read-only and cannot be set directly. Derived from `overall_comment` and `improve_comment` when a review is created and again whenever either text changes; reviews with no text score 0. Filterable by exact value or with the `gte` and `lte` operators. Because each share is rounded independently, the three shares may not sum to exactly 100."},"sentiment":{"type":["string","null"],"description":"Overall sentiment label from sentiment analysis: `POSITIVE`, `NEGATIVE`, `NEUTRAL` or `MIXED`, or null (omitted from the response) when the review has no text to analyze, in which case the three scores are 0. Reviews analyzed before this behavior may still carry an empty string instead of null. Read-only and cannot be set directly. It is computed when a review is created and recomputed whenever `overall_comment` or `improve_comment` changes; if the analysis service is unavailable at that moment the create or update fails with 503 and nothing is saved. Filter with `?sentiment=POSITIVE`; there is no filter for reviews whose sentiment is null."},"external_id":{"type":["string","null"],"maxLength":255,"description":"Identifier of this review on the site it came from, up to 255 characters; TripAdvisor imports store the TripAdvisor review id here and use it to avoid importing the same review twice. Optional and `null` for reviews left through the guest form. Set it when posting reviews you import yourself so they can be matched later. Filterable by exact match with `?external_id=` or by prefix with `external_id[begins_with]`."},"review_type":{"type":["string","null"],"description":"Where the review came from, by slug: `tripworks` (left through TripWorks\u0027 own guest review form), `tripadvisor`, `yelp` or `google`. Required on create; an unknown slug or an explicit `null` is rejected with 422. Written and filtered by slug (`?review_type=google`), never by numeric id."},"experience":{"type":["string","null"],"description":"Name of the experience the review is about, or absent when the review is not linked to an experience. Read-only display value; to link or change the experience write `experience_id`."},"experience_id":{"type":["string","null"],"description":"Id of the experience the review is about, or absent when the review is not linked to one. This is the field to write: send the experience\u0027s id from `\/rest\/experiences` on create or update, or an explicit `null` to unlink it. Filterable with `?experience_id=`."},"trip_id":{"type":["string","null"],"description":"Id of the booking (trip) this review was left for, or absent when the review is not linked to a booking, as for imported reviews and reviews created through the API. Read-only: reviews cannot be linked to or moved between bookings through the API."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"created_at":"2026-01-15T09:30:00+00:00","name":"string","location":"string","overall_comment":"string","is_approved":true,"rating":1,"improve_comment":"string","sentiment_neutral":1,"sentiment_positive":1,"sentiment_negative":1,"sentiment":"string","external_id":"string","review_type":"string","experience":"string","experience_id":"string","trip_id":"string","id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"ReviewWrite":{"title":"Review Write","type":"object","properties":{"name":{"type":["string","null"],"maxLength":255,"description":"Display name of the reviewer, up to 255 characters. Required and must not be blank on create; optional on update. Reviews left through the guest review form default to the booking customer\u0027s full name, and TripAdvisor imports use the reviewer\u0027s TripAdvisor username. Filterable by exact match, `name[contains]` or `name[begins_with]`."},"location":{"type":["string","null"],"maxLength":255,"description":"Where the reviewer says they are from (for example a city or country), as free text up to 255 characters. Optional: omit it on create to leave it empty, or send an explicit `null` on update to clear it. Guest-form reviews default to the booking customer\u0027s country and TripAdvisor imports use the reviewer\u0027s listed location when TripAdvisor provides one. Filterable by exact match, `location[contains]` or `location[begins_with]`."},"overall_comment":{"type":["string","null"],"maxLength":16383,"description":"The reviewer\u0027s main written feedback, up to 16383 characters. Optional: omitted from responses when empty. An explicit `null` or empty string is stored as null, never as an empty string. Filterable with `overall_comment[contains]` (a substring match on the text). Together with `improve_comment` this text is what sentiment analysis scores, so creating a review with text, or changing this field on update, re-runs sentiment analysis and recomputes the read-only `sentiment` fields. Plain text as submitted; no HTML is added or interpreted by the API."},"is_approved":{"type":["boolean","null"],"description":"Whether the review has been approved for display, shown as the Approved column in the staff Reviews table. A boolean that defaults to `false` on create; an explicit `null` is treated as `false`. Changing it does not trigger sentiment analysis. Filter with `?is_approved=true` or `?is_approved=false`."},"rating":{"type":["integer","null"],"description":"Star rating given by the reviewer, a whole number from 1 (worst) to 5 (best). Optional on create and defaults to 5 when omitted; an explicit `null` and values outside 1-5 are rejected with a validation error. Filterable by exact value or with `rating[gte]` and `rating[lte]`. Changing the rating does not re-run sentiment analysis."},"improve_comment":{"type":["string","null"],"maxLength":16383,"description":"The reviewer\u0027s answer to what could be improved, up to 16383 characters. In the guest review form this feedback is private and sent to the company managers. Optional: omitted from responses when empty. An explicit `null` or empty string is stored as null, never as an empty string. Filterable with `improve_comment[contains]`. It is scored together with `overall_comment` for sentiment, except that an answer that is exactly `nothing`, `nonya` or `n\/a` (any capitalization), or that starts with `nothing` or `not a thing`, is left out so it is not mistaken for negative feedback; changing it on update re-runs sentiment analysis."},"experience_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Id of the experience the review is about, or absent when the review is not linked to one. This is the field to write: send the experience\u0027s id from `\/rest\/experiences` on create or update, or an explicit `null` to unlink it. Filterable with `?experience_id=`."},"review_type":{"type":["string","null"],"description":"Where the review came from, by slug: `tripworks` (left through TripWorks\u0027 own guest review form), `tripadvisor`, `yelp` or `google`. Required on create; an unknown slug or an explicit `null` is rejected with 422. Written and filtered by slug (`?review_type=google`), never by numeric id."},"external_id":{"type":["string","null"],"maxLength":255,"description":"Identifier of this review on the site it came from, up to 255 characters; TripAdvisor imports store the TripAdvisor review id here and use it to avoid importing the same review twice. Optional and `null` for reviews left through the guest form. Set it when posting reviews you import yourself so they can be matched later. Filterable by exact match with `?external_id=` or by prefix with `external_id[begins_with]`."}},"example":{"name":"string","location":"string","overall_comment":"string","is_approved":true,"rating":1,"improve_comment":"string","experience_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","review_type":"string","external_id":"string"},"x-internal":true},"TripNote":{"title":"Trip Note","type":"object","properties":{"created_at":{"type":"string","format":"date-time","description":"When the note was created, in UTC. Set by the server and not writable. Filter a range with `created_at[gte]` and `created_at[lte]`; sort with `sort=created_at` or `sort=-created_at`."},"text":{"type":["string","null"],"description":"The note itself, as plain text. Required and cannot be blank. Updating the text through PATCH marks the note as edited (`is_edited`). Filter with `text[contains]` or `text[begins_with]`."},"is_edited":{"type":"boolean","description":"True once the text has been changed after the note was created. Set by the server when a note is edited and not writable."},"trip_id":{"type":["string","null"],"description":"Id of the trip this note belongs to; send it back as `trip_id` when creating a note."},"user_avatar_id":{"type":["string","null"],"description":"Id of the team member who wrote the note (see \/rest\/user-avatars). Notes created through the API without an author show the TripWorks system user. Null on some older notes that have no recorded author."},"author_name":{"type":["string","null"],"description":"Full name of the team member who wrote the note. Read-only; change the author at creation with `user_avatar_id`."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"created_at":"2026-01-15T09:30:00+00:00","text":"string","is_edited":true,"trip_id":"string","user_avatar_id":"string","author_name":"string","id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"TripNoteWrite":{"title":"Trip Note Write","type":"object","properties":{"text":{"type":["string","null"],"description":"The note itself, as plain text. Required and cannot be blank. Updating the text through PATCH marks the note as edited (`is_edited`). Filter with `text[contains]` or `text[begins_with]`."},"trip_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"The trip this note belongs to, written as `trip_id` with the public id of the trip. The manifest returns it as `trip_id` on each trip order. Required when creating a note and cannot be changed afterwards. Filter with `trip_id=\u003Cid\u003E` to list every note on a trip."},"user_avatar_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"The team member who wrote the note, written as `user_avatar_id` with a team member id (see \/rest\/user-avatars). Optional when creating: left out, the note is attributed to the TripWorks system user; sending null is rejected. Cannot be changed afterwards. Filter with `user_avatar_id=\u003Cid\u003E`."}},"example":{"text":"string","trip_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","user_avatar_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"x-internal":true},"Trip":{"title":"Trip","type":"object","properties":{"confirmation_code":{"type":"string","description":"The trip\u0027s confirmation code: 9 characters, unique within the account. It is the code guests see on their confirmation, and the usual way to look one trip up."},"created_at":{"type":"string","format":"date-time","description":"When the trip was created (booked). Use this date field for sales made in a period, as opposed to the default sale_date."},"reserved_at":{"type":["string","null"],"format":"date-time","description":"When the trip was reserved, meaning converted from a draft or under-review request into a confirmed booking. Null when no confirmation time was recorded, which is common for reseller and imported trips that arrive already confirmed."},"sale_date":{"type":"string","format":"date","description":"The trip\u0027s activity date: the latest departure date among its booked activities (for gift and product trips, the day it was created). It is not the day the trip was booked; see created_at for that."},"flagged_at":{"type":["string","null"],"format":"date-time","description":"When a team member flagged the trip for follow-up. Null if the trip is not flagged. Who flagged it and who it is assigned to are `flagged_by_user_avatar_id` and `flagged_to_user_avatar_id`."},"subtotal_nontaxable":{"type":"integer","description":"Legacy column that the platform no longer writes; always 0. In the account\u0027s minor currency unit (cents for USD)."},"subtotal":{"type":"integer","description":"The ticket, product and add-on charges on the trip after discounts and promo codes, before taxes and fees. In the account\u0027s minor currency unit (cents for USD)."},"total":{"type":"integer","description":"Customer total, before guest fees (subtotal - promo code - reseller commission + all taxes). The customer-facing amount, not revenue. In the account\u0027s minor currency unit (cents for USD)."},"paid":{"type":"integer","description":"Amount paid toward the trip so far from successful payments, before guest fees. `due` is `total` less `paid`. In the account\u0027s minor currency unit (cents for USD). Early access: this field will be renamed to `payments_total`."},"due":{"type":"integer","description":"What is still owed on the trip before guest fees: `total` less `paid`. Negative when the customer has overpaid. In the account\u0027s minor currency unit (cents for USD). Early access: this field will be renamed to `balance_due_total`."},"pax_count":{"type":"integer","description":"Number of guests on the trip. Counted for activity trips only; product-only trips have 0. Early access: this field will be renamed to `pax_cnt`."},"fixed_transaction_fee_guest":{"type":"integer","description":"Fixed per-payment processing fee rate charged to the guest, stamped when the trip was created. In the account\u0027s minor currency unit (cents for USD)."},"fixed_transaction_fee_account":{"type":"integer","description":"Fixed per-payment processing fee rate charged to the account, stamped when the trip was created. In the account\u0027s minor currency unit (cents for USD)."},"variable_transaction_fee_guest":{"type":"number","description":"Percentage processing fee rate charged to the guest, stamped when the trip was created (for example 2.9 means 2.9%)."},"variable_transaction_fee_account":{"type":"number","description":"Percentage processing fee rate charged to the account, stamped when the trip was created (for example 2.9 means 2.9%)."},"variable_transaction_fee_guest_offline":{"type":"number","description":"Percentage guest processing fee rate for offline-rate payments, stamped when the trip was created."},"fixed_transaction_fee_guest_offline":{"type":"integer","description":"Fixed guest processing fee for offline-rate payments, stamped when the trip was created. In the account\u0027s minor currency unit (cents for USD)."},"fixed_transaction_fee_guest_amount":{"type":"integer","description":"Fixed-fee part of the guest processing fees on the trip. In the account\u0027s minor currency unit (cents for USD)."},"fixed_transaction_fee_account_amount":{"type":"integer","description":"Fixed-fee part of the account\u0027s processing fees on the trip. In the account\u0027s minor currency unit (cents for USD)."},"variable_transaction_fee_guest_amount":{"type":"integer","description":"Percentage part of the guest processing fees on the trip. In the account\u0027s minor currency unit (cents for USD)."},"variable_transaction_fee_account_amount":{"type":"integer","description":"Percentage part of the account\u0027s processing fees on the trip. In the account\u0027s minor currency unit (cents for USD)."},"fee_guest_total":{"type":"integer","description":"Total processing fees charged to the guest: the fixed and percentage guest amounts added together. Added on top of `total` to give `total_with_fees`. In the account\u0027s minor currency unit (cents for USD)."},"fee_account_total":{"type":"integer","description":"Total processing fees borne by the account: the fixed and percentage account amounts added together, after any fee cap. In the account\u0027s minor currency unit (cents for USD)."},"fee_total":{"type":"integer","description":"Guest and account processing fees together (`fee_guest_total` + `fee_account_total`). In the account\u0027s minor currency unit (cents for USD)."},"total_with_fees":{"type":"integer","description":"What the customer pays in all, including guest fees: `total` + `fee_guest_total`. In the account\u0027s minor currency unit (cents for USD)."},"mkt_landing_url":{"type":"string","description":"The first page of the website the guest landed on when their session began."},"mkt_referrer_url":{"type":["string","null"],"description":"The referring page or site that sent the guest to the website. Null when the guest arrived directly."},"mkt_cmp":{"type":["string","null"],"description":"Marketing campaign captured from the landing URL: the `utm_campaign` value, or an ad platform campaign id."},"mkt_adg":{"type":["string","null"],"description":"Marketing ad group captured from the landing URL, usually an ad platform ad group id."},"mkt_keyword":{"type":["string","null"],"description":"Marketing keyword captured from the landing URL (the `utm_term` value)."},"mkt_ad_position":{"type":["string","null"],"description":"Ad position captured from the landing URL."},"mkt_first_view":{"type":["string","null"],"format":"date-time","description":"When the guest first viewed the website in the session that led to this trip."},"commissionable_total":{"type":["integer","null"],"description":"Part of the trip\u0027s amount that reseller commission is calculated on. In the account\u0027s minor currency unit (cents for USD)."},"non_commissionable_total":{"type":["integer","null"],"description":"Part of the trip\u0027s amount that reseller commission is not calculated on. In the account\u0027s minor currency unit (cents for USD)."},"currency":{"type":["string","null"],"description":"ISO 4217 currency code the trip was priced in. Every amount on the trip is in this currency\u0027s minor unit."},"exchange_rate_usd":{"type":"number","description":"Exchange rate from the trip\u0027s currency to USD at the time of the booking; 1 for USD trips."},"reseller_commission_rate":{"type":["integer","null"],"description":"Reseller commission percentage stamped on the trip when commission is a percentage of the commissionable amount. Null or 0 when it does not apply."},"reseller_commission_type":{"type":["integer","null"],"description":"How the reseller\u0027s commission is worked out, stamped from the reseller when the trip was priced: 1 is a percentage, 2 is a fixed amount."},"trip_gift_card_total":{"type":["integer","null"],"description":"Total of gift card redemptions applied to the trip. In the account\u0027s minor currency unit (cents for USD)."},"tip":{"type":"integer","description":"Tips collected on the trip, summed over its successful payments. In the account\u0027s minor currency unit (cents for USD). Early access: this field will be renamed to `tip_total`."},"session_page_views":{"type":["integer","null"],"description":"Number of pages the guest viewed in the website session that led to the trip."},"session_browser_size":{"type":["string","null"],"description":"Browser window size of the guest\u0027s session, as width x height in pixels."},"session_browser_version":{"type":["string","null"],"description":"Version of the guest\u0027s browser."},"session_browser_name":{"type":["string","null"],"description":"Name of the guest\u0027s browser."},"session_browser_user_agent":{"type":["string","null"],"description":"The raw user agent string of the guest\u0027s browser."},"session_browser_device_type":{"type":["string","null"],"description":"Device type of the guest\u0027s session, for example desktop, mobile or tablet."},"session_browser_os":{"type":["string","null"],"description":"Operating system of the guest\u0027s device."},"session_language":{"type":["string","null"],"description":"Language the guest\u0027s browser asked for (the Accept-Language preference)."},"session_locale":{"type":"string","description":"Locale the guest booked in, for example `en`."},"mkt_gclid":{"type":["string","null"],"description":"Google Ads click id captured from the landing URL."},"mkt_msclid":{"type":["string","null"],"description":"Microsoft Ads click id captured from the landing URL."},"mkt_fbclid":{"type":["string","null"],"description":"Facebook click id captured from the landing URL."},"session_latitude":{"type":["number","null"],"description":"Approximate latitude of the guest in decimal degrees, sent as a decimal string, geolocated from their IP address when the trip was created."},"session_longitude":{"type":["number","null"],"description":"Approximate longitude of the guest in decimal degrees, sent as a decimal string, geolocated from their IP address when the trip was created."},"session_location_label":{"type":["string","null"],"description":"Approximate place name of the guest, geolocated from their IP address when the trip was created, for example `Olathe, Kansas US`."},"cart_abandons_sent_at_conversion":{"type":["integer","null"],"description":"Number of abandoned-cart messages TripWorks sent about the trip before it converted, recorded when the trip converts. 0 or null when none were sent. Early access: this field will be renamed to `cart_abandons_sent_at_conversion_cnt`."},"is_automated_conversion":{"type":"boolean","description":"Whether the guest completed the booking themselves, paying by card, after TripWorks had sent at least one abandoned-cart message about it. Recorded when the trip converts; counts as a recovery credited to TripWorks."},"is_assisted_conversion":{"type":"boolean","description":"Whether staff followed up and took the payment on a cart that TripWorks had already sent an abandoned-cart message about. Recorded when the trip converts."},"trip_unlocked_override":{"type":"boolean","description":"Whether staff manually unlocked the trip so it can be edited after the usual lock date."},"tax_1_total":{"type":["integer","null"],"description":"Total of tax slot 1 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_2_total":{"type":["integer","null"],"description":"Total of tax slot 2 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_3_total":{"type":["integer","null"],"description":"Total of tax slot 3 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_4_total":{"type":["integer","null"],"description":"Total of tax slot 4 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_5_total":{"type":["integer","null"],"description":"Total of tax slot 5 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_6_total":{"type":["integer","null"],"description":"Total of tax slot 6 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_7_total":{"type":["integer","null"],"description":"Total of tax slot 7 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_8_total":{"type":["integer","null"],"description":"Total of tax slot 8 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_9_total":{"type":["integer","null"],"description":"Total of tax slot 9 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_10_total":{"type":["integer","null"],"description":"Total of tax slot 10 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_11_total":{"type":["integer","null"],"description":"Total of tax slot 11 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_12_total":{"type":["integer","null"],"description":"Total of tax slot 12 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_13_total":{"type":["integer","null"],"description":"Total of tax slot 13 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_14_total":{"type":["integer","null"],"description":"Total of tax slot 14 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_15_total":{"type":["integer","null"],"description":"Total of tax slot 15 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_16_total":{"type":["integer","null"],"description":"Total of tax slot 16 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_17_total":{"type":["integer","null"],"description":"Total of tax slot 17 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_18_total":{"type":["integer","null"],"description":"Total of tax slot 18 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_19_total":{"type":["integer","null"],"description":"Total of tax slot 19 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_20_total":{"type":["integer","null"],"description":"Total of tax slot 20 charged across the trip. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"total_sales":{"type":["integer","null"],"description":"Net revenue: the net amount earned by the operator after discounts, promo codes, tips, guest fees, reseller commissions and government taxes. This is the revenue figure on the operator\u0027s P\u0026L; use it, not total, for revenue and sales. In the account\\\u0027s minor currency unit (cents for USD). Early access: this field will be renamed to `earned_revenue_total`."},"products_cnt":{"type":["integer","null"],"description":"Number of products sold on the trip."},"addons_cnt":{"type":["integer","null"],"description":"Number of add-ons sold on the trip."},"comped_pax_cnt":{"type":["integer","null"],"description":"Number of complimentary guests on the trip. Null when there are none."},"voucher_number":{"type":["string","null"],"description":"The reseller voucher number on the trip, when one was recorded."},"group_name":{"type":["string","null"],"description":"A group name staff gave the trip, shown in place of the customer\u0027s name. Null when none was set."},"deposit_total_with_fees":{"type":["integer","null"],"description":"The deposit due now on the trip including the guest fees collected with it. In the account\u0027s minor currency unit (cents for USD)."},"deposit_total":{"type":["integer","null"],"description":"The deposit due now on the trip, net of gift cards applied, before guest fees. In the account\u0027s minor currency unit (cents for USD)."},"sessionIpAddress":{"type":["string","null"],"description":"The guest\u0027s IP address (IPv4) when the trip was created. Null when it was not recorded."},"trip_status":{"type":["string","null"],"description":"Where the trip is in its lifecycle: `draft` (a cart or request not yet submitted), `review` (submitted, waiting for staff confirmation), `reserved` (a confirmed booking) or `deleted` (removed by staff; not a cancellation, which is `trip_orders[].status` `cancelled` with `cancelled_at`). Read-only here; the lists leave `deleted` trips out unless asked for with `?trip_status=deleted`."},"trip_method":{"type":["string","null"],"description":"How the trip was created: `phone_inbound`, `phone_outbound`, `walkup`, `chat`, `ecommerce`, `email`, `reseller`, `ai_phone_agent`, `AI_CHAT_BOT` or `ai_call_bot`. Not the marketing source and not which reseller."},"trip_type":{"type":["string","null"],"description":"What was sold: `experience` (activity booking), `gift` (gift card purchase) or `product` (product-only sale)."},"reseller_collect_type":{"type":["string","null"],"description":"Who collects payment on a reseller trip: `retail` (the guest pays the retail amount) or `wholesale` (the reseller pays the wholesale amount). Null when the trip has no reseller."},"customer_id":{"type":["string","null"],"description":"Id of the trip\u0027s customer (the lead guest). Read the customer with `GET \/rest\/customers\/{id}`."},"trip_source":{"type":["string","null"],"description":"Name of the marketing source the trip is attributed to, for example Google or ChatGPT. Defined per account. Display only; use `trip_source_id`."},"trip_source_id":{"type":["string","null"],"description":"Id of the marketing source the trip is attributed to. Filter trips by it with `?trip_source_id=`; sources are listed at `GET \/rest\/trip-sources`."},"reseller":{"type":["string","null"],"description":"Name of the third-party reseller or affiliate (an OTA such as Viator or Expedia) the trip was sold through. Null when it was sold directly. Display only; use `reseller_id`."},"reseller_id":{"type":["string","null"],"description":"Id of the reseller the trip was sold through, or null. Filter trips by it with `?reseller_id=`; resellers are listed at `GET \/rest\/resellers`."},"location":{"type":["string","null"],"description":"Name of the location (the venue or business site) the trip is for. Display only; use `location_id`."},"location_id":{"type":["string","null"],"description":"Id of the trip\u0027s location. Filter trips by it with `?location_id=`; locations are listed at `GET \/rest\/locations`."},"created_by_user_avatar_id":{"type":["string","null"],"description":"Id of the team member who created the trip, or null when a guest booked it online."},"flagged_by_user_avatar_id":{"type":["string","null"],"description":"Id of the team member who flagged the trip for follow-up, or null when it is not flagged."},"flagged_to_user_avatar_id":{"type":["string","null"],"description":"Id of the team member a flagged trip is assigned to, or null when it is not flagged."},"trip_orders":{"type":"array","items":{"$ref":"#\/components\/schemas\/TripOrder"},"description":"The trip\u0027s orders (one per activity booked, including cancelled ones), ordered by timeslot start time, each with its `bookings`. Returned only when reading a single trip, never in the list; to read the bookings of a listed trip, fetch the trip or filter `GET \/rest\/bookings` by `trip_order_id`."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"confirmation_code":"string","created_at":"2026-01-15T09:30:00+00:00","reserved_at":"2026-01-15T09:30:00+00:00","sale_date":"2026-01-15","flagged_at":"2026-01-15T09:30:00+00:00","subtotal_nontaxable":1,"subtotal":1,"total":1,"paid":1,"due":1,"pax_count":1,"fixed_transaction_fee_guest":1,"fixed_transaction_fee_account":1,"variable_transaction_fee_guest":1,"variable_transaction_fee_account":1,"variable_transaction_fee_guest_offline":1,"fixed_transaction_fee_guest_offline":1,"fixed_transaction_fee_guest_amount":1,"fixed_transaction_fee_account_amount":1,"variable_transaction_fee_guest_amount":1,"variable_transaction_fee_account_amount":1,"fee_guest_total":1,"fee_account_total":1,"fee_total":1,"total_with_fees":1,"mkt_landing_url":"string","mkt_referrer_url":"string","mkt_cmp":"string","mkt_adg":"string","mkt_keyword":"string","mkt_ad_position":"string","mkt_first_view":"2026-01-15T09:30:00+00:00","commissionable_total":1,"non_commissionable_total":1,"currency":"string","exchange_rate_usd":1,"reseller_commission_rate":1,"reseller_commission_type":1,"trip_gift_card_total":1,"tip":1,"session_page_views":1,"session_browser_size":"string","session_browser_version":"string","session_browser_name":"string","session_browser_user_agent":"string","session_browser_device_type":"string","session_browser_os":"string","session_language":"string","session_locale":"string","mkt_gclid":"string","mkt_msclid":"string","mkt_fbclid":"string","session_latitude":1,"session_longitude":1,"session_location_label":"string","cart_abandons_sent_at_conversion":1,"is_automated_conversion":true,"is_assisted_conversion":true,"trip_unlocked_override":true,"tax_1_total":1,"tax_2_total":1,"tax_3_total":1,"tax_4_total":1,"tax_5_total":1,"tax_6_total":1,"tax_7_total":1,"tax_8_total":1,"tax_9_total":1,"tax_10_total":1,"tax_11_total":1,"tax_12_total":1,"tax_13_total":1,"tax_14_total":1,"tax_15_total":1,"tax_16_total":1,"tax_17_total":1,"tax_18_total":1,"tax_19_total":1,"tax_20_total":1,"total_sales":1,"products_cnt":1,"addons_cnt":1,"comped_pax_cnt":1,"voucher_number":"string","group_name":"string","deposit_total_with_fees":1,"deposit_total":1,"sessionIpAddress":"string","trip_status":"string","trip_method":"string","trip_type":"string","reseller_collect_type":"string","customer_id":"string","trip_source":"string","trip_source_id":"string","reseller":"string","reseller_id":"string","location":"string","location_id":"string","created_by_user_avatar_id":"string","flagged_by_user_avatar_id":"string","flagged_to_user_avatar_id":"string","trip_orders":["string"],"id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"TripSource":{"title":"Trip Source","type":"object","properties":{"name":{"type":"string","maxLength":255},"label":{"type":"string","maxLength":255},"is_enabled":{"type":"boolean"},"is_ecom_visible":{"type":"boolean"},"color":{"type":"string"},"is_read_only":{"type":"boolean"},"category_slug":{"type":"string"},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"name":"string","label":"string","is_enabled":true,"is_ecom_visible":true,"color":"string","is_read_only":true,"category_slug":"string","id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"TripSourceWrite":{"title":"Trip Source Write","type":"object","properties":{"name":{"type":"string","maxLength":255},"label":{"type":"string","maxLength":255},"is_enabled":{"type":"boolean"},"is_ecom_visible":{"type":"boolean"},"color":{"type":"string"}},"example":{"name":"string","label":"string","is_enabled":true,"is_ecom_visible":true,"color":"string"},"x-internal":true},"UserAvatar":{"title":"Team Member","type":"object","properties":{"created_at":{"type":"string","format":"date-time","description":"When this team member record was created (invited or added), UTC. Immutable \u2014 not writable over REST\/MCP."},"invited_at":{"type":["string","null"],"format":"date-time","description":"When this team member was last (re-)invited, UTC \u2014 null once they\u0027ve signed in and set a password, or if they were never invited (e.g. created directly). Read-only: managed by the invite\/resend-invite flow, not settable over REST\/MCP."},"first_name":{"type":["string","null"],"maxLength":45,"description":"The team member\u0027s first name. Kept in sync with their login identity (the linked Landlord User) \u2014 writing this field also updates their sign-in name. Cannot be blanked: an update that sends an empty string is rejected."},"last_name":{"type":["string","null"],"maxLength":45,"description":"The team member\u0027s last name. Optional \u2014 many existing records leave it blank. Kept in sync with their login identity the same way first_name is."},"email":{"type":["string","null"],"maxLength":45,"description":"The team member\u0027s login email address on the shared TripWorks identity system. Read-only over REST\/MCP: it\u0027s the password-reset lookup key for their login, so a REST-writable email would let any write-scoped key take over that login\u0027s password reset regardless of the caller\u0027s own role."},"cell_phone":{"type":["string","null"],"maxLength":45,"description":"The team member\u0027s cell phone number. Free text \u2014 no format\/country validation beyond a 45-character length cap. Optional. Read-only over REST\/MCP: it\u0027s owned by their linked login identity (Landlord User) and fanned out to every account that shares that person, so a REST write here would silently apply to other accounts\u0027 records of the same person."},"is_disabled":{"type":"boolean","description":"Whether this team member\u0027s login is disabled. Set to true to revoke sign-in access without deleting the record \u2014 this resource has no delete endpoint over REST\/MCP in v1, so disabling is the way to offboard a team member via the API. Reversible: set back to false to restore access."},"is_tripworks_managed":{"type":"boolean","description":"Whether this is a TripWorks-internal staff account rather than a real team member of your account. Always false for every record reachable over REST\/MCP \u2014 TripWorks-managed accounts are excluded from list(), and a direct get\/update by id 404s the same as a nonexistent id. Read-only; not settable over this API."},"last_timezone":{"type":["string","null"],"description":"The IANA timezone (e.g. \u0022America\/New_York\u0022) this team member last used. Read-only over REST\/MCP: it\u0027s derived from their real login activity and owned by their linked login identity (Landlord User) \u2014 UserAvatarService::syncUserToAvatars() overwrites any independently-set avatar value from that master record on every profile save, so a direct REST write here would silently revert on the very next update."},"title":{"type":["string","null"],"maxLength":255,"description":"Free-text job title or role shown in the team roster (e.g. \u0022Ops Lead\u0022, \u0022Guide\u0022, \u0022Front Desk\u0022). Purely descriptive \u2014 has no effect on permissions or capabilities. Optional."},"color":{"type":["string","null"],"description":"This team member\u0027s manifest\/calendar color, a hex code (e.g. \u0022#0098ff\u0022). Defaults to \u0022#0098ff\u0022. Purely cosmetic."},"is_tip_eligible":{"type":"boolean","description":"Whether this team member can be assigned tips at checkout or on a trip. Independent of is_guide \u2014 a non-guide staff member (e.g. front desk) can still be tip-eligible, and a guide isn\u0027t automatically tip-eligible."},"last_activity":{"type":["string","null"],"format":"date-time","description":"When this team member was last seen active in the app, UTC \u2014 null if they\u0027ve never signed in. Read-only: derived from real session activity, not settable over REST\/MCP."},"is_setup_tasks_shown":{"type":"boolean","description":"Whether the setup-tasks onboarding checklist is still shown to this team member in the app. A UI-preference flag, not a business rule."},"is_opt_out":{"type":"boolean","description":"Whether this team member has opted out of system email notifications entirely. The reason for an opt-out (opt_out_reason) is tracked internally but not exposed over REST\/MCP."},"is_guide":{"type":"boolean","description":"Whether this team member is available as a bookable guide\/resource \u2014 TripWorks calls this role \u0022Guide\u0022 by default, but an account can white-label the term (e.g. \u0022Pilot\u0022, \u0022Crew\u0022, \u0022Captain\u0022); this field name and its value are unaffected by that label."},"groups":{"type":"array","items":{"type":"string"},"description":"The permission groups currently assigned to this team member, as {id, name} pairs \u2014 the id matches the account\u0027s Setup \u003E Permission Groups screen (not exposed as its own REST resource, so the name is included here rather than forcing a second lookup). Read-only: assigning or changing group membership isn\u0027t available over REST\/MCP in v1 (see UserAvatarRESTController\u0027s own docblock for why). Only present on the single-record get response, not on list rows."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"created_at":"2026-01-15T09:30:00+00:00","invited_at":"2026-01-15T09:30:00+00:00","first_name":"string","last_name":"string","email":"string","cell_phone":"string","is_disabled":true,"is_tripworks_managed":true,"last_timezone":"string","title":"string","color":"string","is_tip_eligible":true,"last_activity":"2026-01-15T09:30:00+00:00","is_setup_tasks_shown":true,"is_opt_out":true,"is_guide":true,"groups":["string"],"id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"UserAvatarWrite":{"title":"Team Member Write","type":"object","properties":{"first_name":{"type":["string","null"],"maxLength":45,"description":"The team member\u0027s first name. Kept in sync with their login identity (the linked Landlord User) \u2014 writing this field also updates their sign-in name. Cannot be blanked: an update that sends an empty string is rejected."},"last_name":{"type":["string","null"],"maxLength":45,"description":"The team member\u0027s last name. Optional \u2014 many existing records leave it blank. Kept in sync with their login identity the same way first_name is."},"is_disabled":{"type":"boolean","description":"Whether this team member\u0027s login is disabled. Set to true to revoke sign-in access without deleting the record \u2014 this resource has no delete endpoint over REST\/MCP in v1, so disabling is the way to offboard a team member via the API. Reversible: set back to false to restore access."},"title":{"type":["string","null"],"maxLength":255,"description":"Free-text job title or role shown in the team roster (e.g. \u0022Ops Lead\u0022, \u0022Guide\u0022, \u0022Front Desk\u0022). Purely descriptive \u2014 has no effect on permissions or capabilities. Optional."},"color":{"type":["string","null"],"description":"This team member\u0027s manifest\/calendar color, a hex code (e.g. \u0022#0098ff\u0022). Defaults to \u0022#0098ff\u0022. Purely cosmetic."},"is_tip_eligible":{"type":"boolean","description":"Whether this team member can be assigned tips at checkout or on a trip. Independent of is_guide \u2014 a non-guide staff member (e.g. front desk) can still be tip-eligible, and a guide isn\u0027t automatically tip-eligible."},"is_setup_tasks_shown":{"type":"boolean","description":"Whether the setup-tasks onboarding checklist is still shown to this team member in the app. A UI-preference flag, not a business rule."},"is_opt_out":{"type":"boolean","description":"Whether this team member has opted out of system email notifications entirely. The reason for an opt-out (opt_out_reason) is tracked internally but not exposed over REST\/MCP."},"is_guide":{"type":"boolean","description":"Whether this team member is available as a bookable guide\/resource \u2014 TripWorks calls this role \u0022Guide\u0022 by default, but an account can white-label the term (e.g. \u0022Pilot\u0022, \u0022Crew\u0022, \u0022Captain\u0022); this field name and its value are unaffected by that label."}},"example":{"first_name":"string","last_name":"string","is_disabled":true,"title":"string","color":"string","is_tip_eligible":true,"is_setup_tasks_shown":true,"is_opt_out":true,"is_guide":true},"x-internal":true},"WaiverType":{"title":"Waiver Type","type":"object","properties":{"name":{"type":"string","maxLength":45,"description":"Internal name of the waiver template, shown to staff when assigning it to an activity. Unique within the account, up to 45 characters. Defaults to `Waiver` on create, so send your own to avoid a name collision."},"is_require_middle_name":{"type":"boolean","description":"When true, signers must give their middle name. Last name is always required."},"is_require_dob_adult":{"type":"boolean","description":"When true, adult signers must give their date of birth."},"is_require_dob_minor":{"type":"boolean","description":"When true, minor signers must give their date of birth."},"is_require_phone":{"type":"boolean","description":"When true, adult signers must give a phone number."},"is_require_email":{"type":"boolean","description":"When true, adult signers must give an email address."},"is_ask_minor_relationship":{"type":"boolean","description":"When true, a minor\u0027s waiver asks for the signer\u0027s relationship to the minor, such as parent or guardian."},"is_minor_required_to_sign":{"type":"boolean","description":"A stored setting shown in the back office: whether a minor is meant to sign in addition to the adult or guardian. Signing does not currently enforce it."},"is_notify_customer_complete":{"type":"boolean","description":"A stored setting shown in the back office: whether the signer should be emailed a copy once they sign. Signed-waiver emails are currently sent from the account\u0027s CRM templates and do not read this flag."},"is_require_insurance_info":{"type":"boolean","description":"When true, adult signers must enter their insurance carrier and policy number."},"is_require_driver_license_text_adult":{"type":"boolean","description":"When true, adult signers must enter their driver license number."},"is_require_id_text_minor":{"type":"boolean","description":"A stored setting shown in the back office: whether minor signers should give a student or passport ID number. The signing form does not currently enforce it."},"title":{"type":["string","null"],"maxLength":255,"description":"Heading guests see at the top of the waiver they sign, up to 255 characters. Defaults to `Waiver \u0026 Release of Liability Form` on create."},"body":{"type":["string","null"],"maxLength":65535,"description":"The waiver text guests read and sign, as HTML from the waiver editor, up to 65,535 bytes. Required. Served as stored, so treat it as untrusted markup when rendering."},"body_minor":{"type":["string","null"],"maxLength":65535,"description":"The waiver text shown to minors, same format and size limit as `body`. Required unless `is_minor_body_same_as_adult` is true, in which case minors sign the adult `body` and this is ignored."},"is_require_emergency_contact":{"type":"boolean","description":"When true, signers must give an emergency contact name and phone number."},"is_minor_body_same_as_adult":{"type":"boolean","description":"When true, minors sign the adult `body` and `body_minor` is ignored. When false, `body_minor` is required."},"is_require_address":{"type":"boolean","description":"When true, adult signers must give a street address."},"is_require_city":{"type":"boolean","description":"When true, adult signers must give a city."},"is_require_state":{"type":"boolean","description":"When true, adult signers must give a state or region."},"is_require_zip":{"type":"boolean","description":"When true, adult signers must give a postal code."},"adult_age_years_min":{"type":["integer","null"],"description":"Minimum age in years, 0 to 120, a signer must have reached to sign as an adult. Defaults to 18."},"minor_age_years_min":{"type":["integer","null"],"description":"Youngest age in years, 0 to 120, a minor signer can be. Must not exceed `minor_age_years_max`. Defaults to 0."},"minor_age_years_max":{"type":["integer","null"],"description":"Oldest age in years, 0 to 120, a minor signer can be. Defaults to 19."},"waiver_type_status":{"type":["string","null"],"description":"One of `draft`, `active` or `archived`, written and filtered by slug. Omitted or null on create means `active`; null on update is rejected with 422. Cannot be archived while an activity uses the waiver type: the update is refused with 409 `in_use_archive`."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"name":"string","is_require_middle_name":true,"is_require_dob_adult":true,"is_require_dob_minor":true,"is_require_phone":true,"is_require_email":true,"is_ask_minor_relationship":true,"is_minor_required_to_sign":true,"is_notify_customer_complete":true,"is_require_insurance_info":true,"is_require_driver_license_text_adult":true,"is_require_id_text_minor":true,"title":"string","body":"string","body_minor":"string","is_require_emergency_contact":true,"is_minor_body_same_as_adult":true,"is_require_address":true,"is_require_city":true,"is_require_state":true,"is_require_zip":true,"adult_age_years_min":1,"minor_age_years_min":1,"minor_age_years_max":1,"waiver_type_status":"string","id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"WaiverTypeWrite":{"title":"Waiver Type Write","type":"object","properties":{"name":{"type":"string","maxLength":45,"description":"Internal name of the waiver template, shown to staff when assigning it to an activity. Unique within the account, up to 45 characters. Defaults to `Waiver` on create, so send your own to avoid a name collision."},"is_require_middle_name":{"type":"boolean","description":"When true, signers must give their middle name. Last name is always required."},"is_require_dob_adult":{"type":"boolean","description":"When true, adult signers must give their date of birth."},"is_require_dob_minor":{"type":"boolean","description":"When true, minor signers must give their date of birth."},"is_require_phone":{"type":"boolean","description":"When true, adult signers must give a phone number."},"is_require_email":{"type":"boolean","description":"When true, adult signers must give an email address."},"is_ask_minor_relationship":{"type":"boolean","description":"When true, a minor\u0027s waiver asks for the signer\u0027s relationship to the minor, such as parent or guardian."},"is_minor_required_to_sign":{"type":"boolean","description":"A stored setting shown in the back office: whether a minor is meant to sign in addition to the adult or guardian. Signing does not currently enforce it."},"is_notify_customer_complete":{"type":"boolean","description":"A stored setting shown in the back office: whether the signer should be emailed a copy once they sign. Signed-waiver emails are currently sent from the account\u0027s CRM templates and do not read this flag."},"is_require_insurance_info":{"type":"boolean","description":"When true, adult signers must enter their insurance carrier and policy number."},"is_require_driver_license_text_adult":{"type":"boolean","description":"When true, adult signers must enter their driver license number."},"is_require_id_text_minor":{"type":"boolean","description":"A stored setting shown in the back office: whether minor signers should give a student or passport ID number. The signing form does not currently enforce it."},"title":{"type":["string","null"],"maxLength":255,"description":"Heading guests see at the top of the waiver they sign, up to 255 characters. Defaults to `Waiver \u0026 Release of Liability Form` on create."},"body":{"type":["string","null"],"maxLength":65535,"description":"The waiver text guests read and sign, as HTML from the waiver editor, up to 65,535 bytes. Required. Served as stored, so treat it as untrusted markup when rendering."},"body_minor":{"type":["string","null"],"maxLength":65535,"description":"The waiver text shown to minors, same format and size limit as `body`. Required unless `is_minor_body_same_as_adult` is true, in which case minors sign the adult `body` and this is ignored."},"is_require_emergency_contact":{"type":"boolean","description":"When true, signers must give an emergency contact name and phone number."},"waiver_type_status":{"type":["string","null"],"description":"One of `draft`, `active` or `archived`, sent and filtered by slug. Omitted or null on create means `active`; null on update is rejected with 422. Cannot be archived while an activity uses the waiver type (409 `in_use_archive`)."},"is_minor_body_same_as_adult":{"type":"boolean","description":"When true, minors sign the adult `body` and `body_minor` is ignored. When false, `body_minor` is required."},"is_require_address":{"type":"boolean","description":"When true, adult signers must give a street address."},"is_require_city":{"type":"boolean","description":"When true, adult signers must give a city."},"is_require_state":{"type":"boolean","description":"When true, adult signers must give a state or region."},"is_require_zip":{"type":"boolean","description":"When true, adult signers must give a postal code."},"adult_age_years_min":{"type":["integer","null"],"description":"Minimum age in years, 0 to 120, a signer must have reached to sign as an adult. Defaults to 18."},"minor_age_years_min":{"type":["integer","null"],"description":"Youngest age in years, 0 to 120, a minor signer can be. Must not exceed `minor_age_years_max`. Defaults to 0."},"minor_age_years_max":{"type":["integer","null"],"description":"Oldest age in years, 0 to 120, a minor signer can be. Defaults to 19."}},"example":{"name":"string","is_require_middle_name":true,"is_require_dob_adult":true,"is_require_dob_minor":true,"is_require_phone":true,"is_require_email":true,"is_ask_minor_relationship":true,"is_minor_required_to_sign":true,"is_notify_customer_complete":true,"is_require_insurance_info":true,"is_require_driver_license_text_adult":true,"is_require_id_text_minor":true,"title":"string","body":"string","body_minor":"string","is_require_emergency_contact":true,"waiver_type_status":"string","is_minor_body_same_as_adult":true,"is_require_address":true,"is_require_city":true,"is_require_state":true,"is_require_zip":true,"adult_age_years_min":1,"minor_age_years_min":1,"minor_age_years_max":1},"x-internal":true},"AuditLogDetail":{"title":"Audit Log Detail","type":"object","properties":{"field":{"type":"string","maxLength":45,"description":"Internal column\/property name that changed (e.g. `is_active`). See `name` for the human-readable label shown in the UI for the same change."},"name":{"type":"string","maxLength":45,"description":"Human-readable label for the field that changed (e.g. \u0022Active\u0022), as shown to staff in the UI. See `field` for the underlying internal column\/property name."},"type":{"type":"integer","description":"How to interpret the `before_*`\/`after_*` values on this row: `1` string, `2` integer, `3` datetime, `4` boolean (only `after_boolean` is populated \u2014 see its own description), `5` currency (integer cents on `before_integer`\/`after_integer`, or a decimal on `before_float`\/`after_float`, depending on the changed column\u0027s own storage type), `6` relation (the related object\u0027s display text, on `before_string`\/`after_string`), `7` date and `8` time (both on `before_datetime`\/`after_datetime`), `9` percent (`before_float`\/`after_float` or the integer pair, same rule as currency), `10` datetime recorded without timezone conversion (also `before_datetime`\/`after_datetime`)."},"before_string":{"type":["string","null"],"maxLength":255,"description":"Value of `field` before the change, when `type` is `1` (string) or `6` (relation). See `type`\u0027s own description for which `before_*` field is populated for each type."},"after_string":{"type":["string","null"],"maxLength":255,"description":"Value of `field` after the change \u2014 the `after_*` counterpart to `before_string`."},"before_integer":{"type":["integer","null"],"description":"Value of `field` before the change, when `type` is `2` (integer) or, for an integer-backed column, `5` (currency, in cents)."},"after_integer":{"type":["integer","null"],"description":"Value of `field` after the change \u2014 the `after_*` counterpart to `before_integer`."},"after_boolean":{"type":["boolean","null"],"description":"Value of `field` after the change, when `type` is `4` (boolean). There is no `before_boolean` \u2014 a boolean field\u0027s prior value is not recorded, only that it changed and what it became."},"before_datetime":{"type":["string","null"],"format":"date-time","description":"Value of `field` before the change, when `type` is `3` (datetime), `7` (date), `8` (time), or `10` (datetime, no timezone conversion)."},"after_datetime":{"type":["string","null"],"format":"date-time","description":"Value of `field` after the change \u2014 the `after_*` counterpart to `before_datetime`."},"before_float":{"type":["number","null"],"description":"Value of `field` before the change, when `type` is `9` (percent) or, for a decimal-backed column, `5` (currency)."},"after_float":{"type":["number","null"],"description":"Value of `field` after the change \u2014 the `after_*` counterpart to `before_float`."},"event_summary":{"type":["string","null"],"maxLength":255,"description":"Human-readable narrative for a non-field-change entry (parent `AuditLog`\u0027s `audit_log_entry_type` is `event`) \u2014 e.g. a webhook delivery summary. Not populated for a field-change row, which uses `field`\/`name`\/`before_*`\/`after_*` instead."},"event_info":{"type":["array","null"],"items":{"type":"string"},"description":"Free-form structured payload for an `event`-type entry (see `event_summary`) \u2014 e.g. a webhook\u0027s delivery status\/response. Shape varies by the specific event; there is no fixed schema across entries. `null` for a field-change row."}},"example":{"field":"string","name":"string","type":1,"before_string":"string","after_string":"string","before_integer":1,"after_integer":1,"after_boolean":true,"before_datetime":"2026-01-15T09:30:00+00:00","after_datetime":"2026-01-15T09:30:00+00:00","before_float":1,"after_float":1,"event_summary":"string","event_info":["string"]}},"BookingCustomFieldEntry":{"title":"Booking Custom Field Entry","type":"object","properties":{"id":{"type":"string","description":"Public id of the custom field definition (a uuid)."},"slug":{"type":"string","description":"Key built from the field name. Not guaranteed unique across fields, and it changes if the field is renamed, so identify a field by `id`."},"name":{"type":["string","null"],"description":"The field title shown in the back office."},"type":{"type":["string","null"],"description":"The kind of field, for example `Text (Single Line)`, `Checkbox`, `Number`, `Dropdown`, `Date`, `Email`."},"value":{"description":"The booking\u0027s answer as displayed in the back office: a string (dropdown option name, text, date, formatted address or weight, number as text), a boolean for a checkbox, or null when unanswered."},"required":{"type":"boolean","description":"True when the field is marked required for staff. A required field with no answer means the booking is incomplete, for example because the field was made required after the booking was created."}},"example":{"id":"string","slug":"string","name":"string","type":"string","value":"string","required":true}},"BookingProduct":{"title":"Booking Product","type":"object","properties":{"quantity":{"type":"integer","description":"How many units of the product this line sold. A whole number."},"total":{"type":"integer","description":"What the guest pays for this line before tax, in integer cents: `total_gross` less the manual discount and promo code discount. On a wholesale reseller trip that commissions products it is also reduced by the reseller commission. Summed over all of a booking\u0027s product lines it equals the booking\u0027s `products_total`. 0 for a complimentary booking. Tax on the line is not in this figure."},"unit_price":{"type":"integer","description":"The price of one unit, in integer cents in the account\u0027s currency, before any discount and before tax. `total_gross` is `quantity` times this."},"name":{"type":["string","null"],"description":"The product\u0027s name as sold on this booking, copied when the line was added, so it does not change if the product is renamed later. Can be null on very old lines."},"manual_discount_total":{"type":["integer","null"],"description":"The manual discount staff took off this line, in integer cents, already subtracted in `total`. Null when no manual discount was given. Staff enter it as a percentage of `total_gross`; only the resulting amount is exposed."},"promo_code_amount":{"type":["integer","null"],"description":"The promo code discount on this line, in integer cents: `promo_code_fixed_amount` plus `promo_code_percent` of the line after any manual discount. Already subtracted in `total`. Null when no promo code applies."},"promo_code_percent":{"type":["number","null"],"description":"The percentage promo code applied to this line, as a decimal number from 0 to 100 (12.5 means 12.5%), or null when none. This is a percent, not cents."},"promo_code_fixed_amount":{"type":["integer","null"],"description":"The fixed-amount promo code value applied to this line, in integer cents, or null when none. The discount actually taken is `promo_code_amount`."},"total_gross":{"type":["integer","null"],"description":"`quantity` times `unit_price`, in integer cents, before any manual discount or promo code and before tax. Summed over the booking\u0027s lines it equals the booking\u0027s `products_total_gross`. 0 for a complimentary booking."},"reseller_commission_amount":{"type":["integer","null"],"description":"Commission owed to the reseller on this line, in integer cents. 0 or null on direct bookings and when the trip does not commission products. Commercially sensitive: visible to every caller with `bookings.read`."},"commissionable_amount":{"type":["integer","null"],"description":"The part of this line that reseller commission is calculated on, in integer cents. 0 or null when the line earns no commission."},"non_commissionable_amount":{"type":["integer","null"],"description":"The part of this line that earns no reseller commission, in integer cents, including any taxes not counted as revenue. Every line on a direct booking is fully non-commissionable."},"total_sales":{"type":["integer","null"],"description":"The revenue figure used in reports for this line, in integer cents: `total` plus taxes flagged as revenue. Not what the guest pays; see `total`. 0 for a complimentary booking."},"product_id":{"type":["string","null"],"description":"Public id of the product this line sold. There is no products endpoint yet, so use it to group lines by product."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"quantity":1,"total":1,"unit_price":1,"name":"string","manual_discount_total":1,"promo_code_amount":1,"promo_code_percent":1,"promo_code_fixed_amount":1,"total_gross":1,"reseller_commission_amount":1,"commissionable_amount":1,"non_commissionable_amount":1,"total_sales":1,"product_id":"string","id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"BookingResource":{"title":"Booking Resource","type":"object","properties":{"internal_note":{"type":["string","null"],"maxLength":255,"description":"Staff-only note on this assignment, up to 255 characters."},"duration":{"type":["integer","null"],"description":"Length of the assignment in minutes."},"resource_type_name":{"type":["string","null"],"description":"The kind of resource, for example Boat, Vehicle or Guide."},"resource_id":{"type":["string","null"],"description":"Public id of the assigned resource."},"resource_name":{"type":["string","null"],"description":"Name of the assigned resource."},"start_time":{"type":["string","null"],"format":"date-time","description":"When the assignment starts, as an RFC 3339 instant that carries the venue\u0027s UTC offset (for example `2026-10-02T13:00:00-04:00`). The offset is the venue\u0027s and can change with daylight saving, so parse the value as a timestamp and never strip or replace the offset. The venue is the location of the booking\u0027s experience; when it cannot be determined the time is given in UTC."},"end_time":{"type":["string","null"],"format":"date-time","description":"When the assignment ends, as an RFC 3339 instant that carries the venue\u0027s UTC offset. The end is inclusive: a one-hour assignment from 13:00 ends at 13:59:59. The offset is the venue\u0027s and can change with daylight saving, so parse the value as a timestamp and never strip or replace the offset."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"internal_note":"string","duration":1,"resource_type_name":"string","resource_id":"string","resource_name":"string","start_time":"2026-01-15T09:30:00+00:00","end_time":"2026-01-15T09:30:00+00:00","id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"BookingWaiverEntry":{"title":"Booking Waiver Entry","type":"object","properties":{"waiver_type_id":{"type":"string","description":"Public id of the waiver type this requirement is for (a uuid). It identifies the requirement on this booking, and is the id the mark-signed action takes."},"name":{"type":["string","null"],"description":"The waiver type\u0027s name as shown in the back office."},"status":{"type":"string","description":"Whether this requirement is signed for this booking, as a slug: `signed` or `unsigned`. These are the only two values. A requirement with no record for the booking is `unsigned`, unless the booking has no per-waiver records at all, in which case it takes the booking\u0027s overall `booking_waiver_status` (how bookings that were marked signed before per-waiver records existed are treated). A staff mark-signed sets `signed` without a signed document; see `has_signed_waiver`."},"has_signed_waiver":{"type":"boolean","description":"True when an actual signed waiver document is on file for this requirement. False when it is unsigned, and also false when staff marked it signed without a document, so `status` `signed` with `has_signed_waiver` false means a staff override. The document itself, its link and the signer are never exposed."}},"example":{"waiver_type_id":"string","name":"string","status":"string","has_signed_waiver":true}},"Error":{"title":"Error","type":"object","properties":{"success":{"type":"boolean","enum":[false]},"message":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"}},"additionalProperties":true},"errors":{"type":"object","additionalProperties":{"type":"string"},"description":"Present on a 422 field-validation failure: {field: message}."}}},"ExperienceAddonValue":{"title":"Experience Addon Value","type":"object","properties":{"name":{"type":["string","null"],"description":"The add-on option the guest chose, as it was named when the add-on was added to the booking. A copy, so it does not change if the option is renamed later."},"price":{"type":["integer","null"],"description":"The fixed amount for this add-on, in integer cents in the account\u0027s currency, used when `price_adjust_type_id` is 1 or 2. Type 1 adds this amount to what the guest pays (a negative value is a discount). Type 2 sets the ticket price to this amount instead of adding a charge. Null or unused for types 3 and 4."},"percent":{"type":["number","null"],"description":"The percentage of the ticket price charged for this add-on, as a decimal number from 0 to 100 (12.5 means 12.5%), used when `price_adjust_type_id` is 4. It is a percent, not cents. Null for the other types."},"total":{"type":["integer","null"],"description":"What the guest pays for this add-on before tax, in integer cents: `total_gross` less the promo code discount. Summed over a booking\u0027s lines whose `price_adjust_type_id` is not 2 it equals the booking\u0027s `addons_total`; a type 2 line sets the ticket price rather than adding a charge, so it is left out of that sum. 0 for type 3 and null for a complimentary booking. Tax on the add-on is not in this figure."},"total_gross":{"type":["integer","null"],"description":"The add-on charge before any promo code discount and before tax, in integer cents: `price` for types 1 and 2, the percentage of the ticket for type 4, 0 for type 3. Null for a complimentary booking. Summed over a booking\u0027s lines that are not type 2, it equals the booking\u0027s `addons_total_gross`."},"promo_code_percent":{"type":["number","null"],"description":"The percentage promo code applied to this add-on, as a decimal number from 0 to 100, or null when none or when the code excludes add-ons. This is a percent, not cents."},"promo_code_amount":{"type":["integer","null"],"description":"The promo code discount on this add-on, in integer cents (`promo_code_percent` of `total_gross`). Already subtracted in `total`. Null when no promo code applies."},"reseller_commission_amount":{"type":["integer","null"],"description":"Commission owed to the reseller on this add-on, in integer cents. Null or 0 on direct bookings and when the trip does not commission add-ons. Commercially sensitive: visible to every caller with `bookings.read`."},"commissionable_amount":{"type":["integer","null"],"description":"The part of this add-on that reseller commission is calculated on, in integer cents. 0 when the add-on earns no commission."},"non_commissionable_amount":{"type":["integer","null"],"description":"The part of this add-on that earns no reseller commission, in integer cents. Every add-on on a direct booking is fully non-commissionable."},"total_sales":{"type":["integer","null"],"description":"The revenue figure used in reports for this add-on, in integer cents: `total` plus taxes flagged as revenue. Not what the guest pays; see `total`."},"experience_addon_id":{"type":["string","null"],"description":"Public id of the add-on this line belongs to (the experience\u0027s add-on definition). There is no add-ons endpoint yet, so use it to group lines by add-on."},"experience_addon_value_type_id":{"type":["string","null"],"description":"Public id of the option the guest chose within the add-on (for example one size or meal choice), or null when the add-on has no options. `name` holds that option\u0027s name."},"price_adjust_type_id":{"type":["integer","null"],"description":"How this add-on changes the price, one of four fixed values: 1 = increase or decrease the price by `price` (added to `addons_total`); 2 = set the ticket price to `price` (the ticket price absorbs it, so the line is not part of `addons_total`); 3 = do not change the price (`total` is 0); 4 = increase or decrease by `percent` of the ticket price."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"name":"string","price":1,"percent":1,"total":1,"total_gross":1,"promo_code_percent":1,"promo_code_amount":1,"reseller_commission_amount":1,"commissionable_amount":1,"non_commissionable_amount":1,"total_sales":1,"experience_addon_id":"string","experience_addon_value_type_id":"string","price_adjust_type_id":1,"id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"ExperienceCustomerType":{"title":"Experience Customer Type","type":"object","properties":{"is_visible":{"type":"boolean","description":"False for ticket types hidden from online guests."},"name":{"type":["string","null"],"description":"Ticket type name shown to guests, e.g. `Adult`."},"description":{"type":["string","null"],"description":"Optional longer text shown with the ticket type."},"is_group":{"type":"boolean","description":"True for a ticket that covers a whole group rather than one guest."},"is_pax_fixed":{"type":"boolean","description":"For a group ticket, true when every group is exactly `pax_fixed` guests."},"pax_fixed":{"type":["integer","null"],"description":"Guests covered by one group ticket when `is_pax_fixed` is true; adding one such ticket creates this many bookings."},"pax_min":{"type":["integer","null"],"description":"Smallest group size when `is_pax_fixed` is false."},"pax_max":{"type":["integer","null"],"description":"Largest group size when `is_pax_fixed` is false."},"sort_order":{"type":["integer","null"],"description":"Display order within the experience, lowest first."},"reduces_availability":{"type":"boolean","description":"False when this ticket type does not use up capacity."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"is_visible":true,"name":"string","description":"string","is_group":true,"is_pax_fixed":true,"pax_fixed":1,"pax_min":1,"pax_max":1,"sort_order":1,"reduces_availability":true,"id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"ExperienceImage":{"title":"Experience Image","type":"object","properties":{"size":{"type":"integer","description":"Size of the image file in bytes, when known."},"sort_order":{"type":"integer","description":"Display order within the experience gallery, lowest first."},"url":{"type":["string","null"],"description":"Absolute URL of the image file. Usually on the TripWorks image CDN; older images can point at another host."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"size":1,"sort_order":1,"url":"string","id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"ManifestBooking":{"title":"Manifest Booking","type":"object","properties":{"id":{"type":"string","description":"Public id of the booking \u2014 one booking is one guest seat (one ticket) on the trip order. This is the id the Bookings resource takes, e.g. to check the guest in, undo a check-in, mark a no-show or update their waiver status.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"customer_type":{"type":["string","null"],"description":"Name of the ticket type the guest holds, as configured on the experience.","example":"Adult"},"booking_status_id":{"type":["string","null"],"description":"Public id of this guest\u0027s current booking status \u2014 an id from booking_statuses in the report. To change it (check the guest in, mark a no-show, undo a check-in), send the id of the target status from booking_statuses to the booking status endpoint.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"status":{"type":["string","null"],"description":"Check-in state of this guest: not-checked-in, checked-in or no-show. Accounts that define their own booking statuses get that status\u0027s name here instead (for example the name an operator gave a custom status).","example":"checked-in"},"checked_in_at":{"type":["string","null"],"description":"When the guest was checked in, ISO 8601 with timezone offset. Null if they have not been checked in (or the check-in was undone).","example":"2026-10-02T08:41:00-04:00"},"waiver_status":{"type":["string","null"],"description":"Slug of this guest\u0027s waiver status, e.g. signed or unsigned. Null when the experience requires no waiver.","example":"signed","enum":["signed","unsigned"]},"guest_name":{"type":["string","null"],"description":"Full name of the guest assigned to this seat, when guest names are collected per seat. Null when only the lead booker is known \u2014 use the trip order customer in that case.","example":"Luis Gonzalez"},"booking_resources":{"type":"array","items":{"$ref":"#\/components\/schemas\/ManifestBookingResource"},"description":"Resources assigned to this guest \u2014 the boat, aircraft, vehicle or guide they are on. Usually the same for every guest in a party, but guests can be split across resources. Empty when nothing is assigned."},"custom_field_values":{"type":"array","items":{"$ref":"#\/components\/schemas\/ManifestCustomFieldValue"},"description":"Answers to booking-level custom fields \u2014 questions asked once per guest (for example shirt size or age)."}},"required":["id","customer_type","booking_status_id","status","checked_in_at","waiver_status","guest_name","booking_resources","custom_field_values"]},"ManifestBookingResource":{"title":"Manifest Booking Resource","type":"object","properties":{"resource_name":{"type":["string","null"],"description":"Name of the specific resource assigned to this guest \u2014 the piece of equipment, vehicle, vessel, aircraft or staff member they are riding with, exactly as named in Setup (for example a boat name or an aircraft tail number such as N403TD). Null when the booking requires this kind of resource but none has been assigned yet.","example":"N403TD"},"resource_type":{"type":["string","null"],"description":"Kind of resource, as named in Setup \u2014 for example Boat, Guide or a per-aircraft type. Accounts that track individual assets may name the type after the asset itself, in which case it matches resource_name.","example":"Helicopter"},"start_time":{"type":["string","null"],"description":"When this guest\u0027s use of the resource starts, ISO 8601 with the offset of the experience location\u0027s timezone. Null when the resource is held for the whole departure.","example":"2026-10-02T09:00:00-04:00"},"end_time":{"type":["string","null"],"description":"When this guest\u0027s use of the resource ends, ISO 8601 with the offset of the experience location\u0027s timezone. Null when the resource is held for the whole departure.","example":"2026-10-02T11:00:00-04:00"}},"required":["resource_name","resource_type","start_time","end_time"]},"ManifestBookingStatus":{"title":"Manifest Booking Status","type":"object","properties":{"id":{"type":"string","description":"Public id of the booking status. This is the booking_status_id that the booking status endpoint takes, for example to check a guest in: use the id of the entry whose slug is checked-in.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"name":{"type":["string","null"],"description":"Display name of the status as set up for this account.","example":"Checked In"},"slug":{"type":["string","null"],"description":"Stable identifier of the status. The built-in statuses are not-checked-in, checked-in and no-show; an account\u0027s own custom statuses all carry the slug user and are told apart by name.","example":"checked-in"},"sort_order":{"type":["integer","null"],"description":"Position of the status in the account\u0027s display order, lowest first.","example":1}},"required":["id","name","slug","sort_order"]},"ManifestCustomFieldValue":{"title":"Manifest Custom Field Value","type":"object","properties":{"field_title":{"type":["string","null"],"description":"Title of the custom field, exactly as the operator named it in Setup.","example":"Dietary restrictions"},"field_slug":{"type":["string","null"],"description":"Stable machine-readable slug of the custom field. Use this, not the title, to match a field across accounts or after a rename.","example":"dietary-restrictions"},"value":{"type":["string","null"],"description":"The answer as staff see it on the manifest, rendered as text regardless of the field type (text, number, yes\/no, unit, list). Null when the guest left it blank.","example":"Vegetarian"}},"required":["field_title","field_slug","value"]},"ManifestCustomer":{"title":"Manifest Customer","type":"object","properties":{"id":{"type":"string","description":"Public id of the customer record. Matches the id returned by the Customers resource.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"first_name":{"type":["string","null"],"description":"Customer first name.","example":"Maria"},"last_name":{"type":["string","null"],"description":"Customer last name.","example":"Gonzalez"},"email":{"type":["string","null"],"description":"Customer email address. Personal data \u2014 treat accordingly. For bookings made through an OTA this may be a relay address that forwards to the guest rather than the guest\u0027s own mailbox.","example":"maria@example.com"},"phone":{"type":["string","null"],"description":"Customer phone number as entered, not normalized. Personal data.","example":"+1 305 555 0142"}},"required":["id","first_name","last_name","email","phone"]},"ManifestNote":{"title":"Manifest Note","type":"object","properties":{"text":{"type":["string","null"],"description":"The note text as staff wrote it. Free text and may contain personal data or operational instructions (special requests, access needs, reminders for the crew).","example":"Guest arriving late from the airport, hold the departure for 10 minutes"},"author_name":{"type":["string","null"],"description":"Name of the staff member who wrote the note. Null for notes created by the system or an integration.","example":"Dana Whitfield"},"created_at":{"type":["string","null"],"description":"When the note was written, ISO 8601 in UTC.","example":"2026-10-01T14:05:00+00:00"}},"required":["text","author_name","created_at"]},"ManifestPayment":{"title":"Manifest Payment","type":"object","properties":{"total":{"type":["integer","null"],"description":"Total price of the whole trip (every trip order in the booking, plus fees), in the smallest unit of the account currency \u2014 e.g. cents. Trip-level: if one trip holds several trip orders, each of their rows repeats the same figure, so never sum this across rows without de-duplicating by trip_id.","example":24500},"paid":{"type":["integer","null"],"description":"Amount already paid against the trip, in the smallest currency unit. Trip-level, same de-duplication caveat as total.","example":10000},"tip":{"type":["integer","null"],"description":"Gratuity recorded against the trip, in the smallest currency unit. Trip-level, same de-duplication caveat as total.","example":2000},"due":{"type":["integer","null"],"description":"Balance still owed on the trip including fees, in the smallest currency unit. Zero or negative means fully paid. Trip-level, same de-duplication caveat as total.","example":14500}},"required":["total","paid","tip","due"]},"ManifestReport":{"title":"Manifest Report","type":"object","properties":{"date_from":{"type":"string","description":"First date covered by this report, YYYY-MM-DD, echoing the request.","example":"2026-10-02"},"date_to":{"type":"string","description":"Last date covered by this report, YYYY-MM-DD, echoing the request. Equal to date_from for a single day.","example":"2026-10-02"},"currency":{"type":"string","description":"ISO 4217 currency code of the account. Every amount in this report (payment.total, paid, tip and due) is in this currency\u0027s smallest unit \u2014 for USD, cents \u2014 so 609763 means 6,097.63.","example":"USD"},"booking_statuses":{"type":"array","items":{"$ref":"#\/components\/schemas\/ManifestBookingStatus"},"description":"Every booking status this account uses, in display order. The manifest shows each guest\u0027s status by name; use this list to find the id of the status to change a guest to, for example the entry with slug checked-in to check a guest in."},"trip_orders":{"type":"array","items":{"$ref":"#\/components\/schemas\/ManifestTripOrder"},"description":"This page of the roster: one entry per trip order, ordered by departure start time, then status, then lead booker name."}},"required":["date_from","date_to","currency","booking_statuses","trip_orders"]},"ManifestResponse":{"title":"Manifest Response","type":"object","properties":{"manifest":{"$ref":"#\/components\/schemas\/ManifestReport","description":"The roster for the requested dates."},"per_page":{"type":"integer","description":"Maximum number of trip orders in this page. Always at most 25.","example":25},"has_more":{"type":"boolean","description":"True when more trip orders remain after this page. Request the next page by passing next_cursor as the cursor parameter.","example":true},"next_cursor":{"type":["string","null"],"description":"Public id of the last trip order on this page; opaque to callers; null on the last page. Pass it back unchanged, together with the same filters, as cursor.","example":"3f2b8c1e-5a47-8d90-b6e2-9c41d7a05e13"}},"required":["manifest","per_page","has_more","next_cursor"]},"ManifestTripOrder":{"title":"Manifest Trip Order","type":"object","properties":{"id":{"type":"string","description":"Public id of the trip order \u2014 one experience, on one timeslot, within a trip. A trip made of several experiences has one trip order per experience, each on its own manifest row.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"trip_id":{"type":"string","description":"Public id of the parent trip (the whole reservation). Rows that share a trip_id belong to the same reservation and the same payment.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"confirmation_code":{"type":["string","null"],"description":"Confirmation code the guest received for the reservation.","example":"TW-48213"},"experience_id":{"type":["string","null"],"description":"Public id of the experience (tour or activity) this trip order is for. Matches the Experiences resource and the experience_id filter.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"experience_name":{"type":["string","null"],"description":"Name of the experience.","example":"Sunset Kayak Tour"},"timeslot_id":{"type":["integer","null"],"description":"Numeric id of the timeslot (one departure) \u2014 the value the timeslot_id filter takes. Trip orders on the same departure share it. Timeslots do not have a public id yet.","example":18342},"date":{"type":["string","null"],"description":"Calendar date of the departure, YYYY-MM-DD, local to the experience location.","example":"2026-10-02"},"start_time":{"type":["string","null"],"description":"Departure start time, ISO 8601 with the offset of the experience location\u0027s timezone. Rows are ordered by this value.","example":"2026-10-02T09:00:00-04:00"},"status":{"type":["string","null"],"description":"Slug of the trip order status, e.g. booked or cancelled. Cancelled trip orders are omitted from the manifest unless the request passes include_cancelled=true or status=cancelled.","example":"booked","enum":["booked","cancelled"]},"customer":{"oneOf":[{"$ref":"#\/components\/schemas\/ManifestCustomer"},{"type":"null"}],"description":"The lead booker \u2014 the person who made the reservation and who staff contact. Individual guests are under bookings."},"reseller_name":{"type":["string","null"],"description":"Name of the reseller or partner that sold this trip, when it came through one. Null for direct bookings.","example":"Harbor Hotel Concierge"},"pickup_location":{"type":["string","null"],"description":"Where this party is picked up: the pickup location title if one was chosen, otherwise the pickup choice name. Null when the guests make their own way to the departure (self-transport).","example":"Marriott Bayside Lobby"},"note":{"type":["string","null"],"description":"The single free-text note on this trip order, entered by staff or by the guest when booking (for example a special request or passenger details). Reservation-wide staff notes are in notes.","example":"Celebrating an anniversary"},"guest_count":{"type":"integer","description":"Number of guest seats (bookings) on this trip order.","example":4},"payment":{"$ref":"#\/components\/schemas\/ManifestPayment","description":"What has been paid and what is still owed. Trip-level, not trip-order-level \u2014 see the note on each field."},"waivers":{"$ref":"#\/components\/schemas\/ManifestWaivers","description":"Waiver progress for this trip order."},"bookings":{"type":"array","items":{"$ref":"#\/components\/schemas\/ManifestBooking"},"description":"One entry per guest seat, including its check-in time, waiver status and booking-level custom field answers."},"notes":{"type":"array","items":{"$ref":"#\/components\/schemas\/ManifestNote"},"description":"Internal staff notes on the whole reservation, oldest first. Separate from note, which is the single note on this trip order. Shared by every trip order in the same trip."},"custom_field_values":{"type":"array","items":{"$ref":"#\/components\/schemas\/ManifestCustomFieldValue"},"description":"Answers to trip-level custom fields \u2014 questions asked once per reservation rather than per guest."}},"required":["id","trip_id","confirmation_code","experience_id","experience_name","timeslot_id","date","start_time","status","customer","reseller_name","pickup_location","note","guest_count","payment","waivers","bookings","notes","custom_field_values"]},"ManifestWaivers":{"title":"Manifest Waivers","type":"object","properties":{"signed":{"type":"integer","description":"Number of guests on this trip order whose waiver is complete. Where the account collects waivers per signer, additional signers who signed through the customer portal are counted once.","example":3},"total":{"type":"integer","description":"Number of waivers expected: one per active (non-cancelled) guest on the trip order. Compare with signed to see who is still outstanding.","example":4}},"required":["signed","total"]},"TripOrder":{"title":"Trip Order","type":"object","properties":{"created_at":{"type":"string","format":"date-time","description":"When the order was added to the trip."},"subtotal":{"type":"integer","description":"The order\u0027s ticket, product and add-on charges after discounts and promo codes, before taxes. In the account\u0027s minor currency unit (cents for USD)."},"addons_total":{"type":"integer","description":"Total of the order\u0027s add-ons, after discounts, before taxes. In the account\u0027s minor currency unit (cents for USD)."},"cancellation_experience_total":{"type":"integer","description":"What the order\u0027s tickets were worth when the order was cancelled; 0 while it is booked. In the account\u0027s minor currency unit (cents for USD)."},"cancellation_addons_total":{"type":"integer","description":"What the order\u0027s add-ons were worth when the order was cancelled; 0 while it is booked. In the account\u0027s minor currency unit (cents for USD)."},"cancellation_products_total":{"type":"integer","description":"What the order\u0027s products were worth when the order was cancelled; 0 while it is booked. In the account\u0027s minor currency unit (cents for USD)."},"cancellation_total_sales":{"type":"integer","description":"The order\u0027s `total_sales` at the moment it was cancelled; 0 while it is booked. In the account\u0027s minor currency unit (cents for USD)."},"products_total":{"type":"integer","description":"Total of the products sold on the order, after discounts, before taxes. In the account\u0027s minor currency unit (cents for USD)."},"experience_total":{"type":"integer","description":"Total of the order\u0027s tickets after promo codes and vouchers, before taxes. The sum of its bookings\u0027 `experience_total`. In the account\u0027s minor currency unit (cents for USD)."},"note":{"type":["string","null"],"description":"Free-text note staff keep on the order. Null when there is none."},"is_complimentary":{"type":"boolean","description":"Whether the order is complimentary, so its bookings are free and carry no tax."},"deposit_total":{"type":"integer","description":"The deposit due now on the order. In the account\u0027s minor currency unit (cents for USD)."},"cancelled_at":{"type":["string","null"],"format":"date-time","description":"When the order was cancelled. Null while it is booked."},"portal_auto_refund_outcome":{"type":["string","null"],"description":"What happened to the refund when the guest cancelled this order themselves in the customer portal, for example `eligible_full`, `eligible_partial`, `gift_card`, `mixed_non_card` or `not_completed`. Null for an order that was never cancelled through the portal."},"portal_rebook_payment_due_at":{"type":["string","null"],"format":"date-time","description":"Set when a guest rebooked a refunded order in the customer portal and still has to pay to keep it: the deadline for that payment. While set, the rebooked order is not secured and goes back to cancelled if the guest has not paid by then. Null once paid, or when no such hold exists."},"is_group":{"type":"boolean","description":"Whether the order is for a fixed-size group ticket, which adds one booking per person."},"tax_1_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 1 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_2_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 2 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_3_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 3 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_4_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 4 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_5_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 5 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_6_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 6 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_7_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 7 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_8_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 8 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_9_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 9 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_10_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 10 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_11_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 11 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_12_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 12 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_13_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 13 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_14_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 14 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_15_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 15 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_16_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 16 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_17_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 17 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_18_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 18 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_19_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 19 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_20_fixed_amount":{"type":["integer","null"],"description":"Fixed amount of tax slot 20 snapshotted on the order when it was created. Null when the slot is not a fixed amount. In the account\u0027s minor currency unit (cents for USD)."},"tax_1_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 1 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_2_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 2 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_3_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 3 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_4_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 4 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_5_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 5 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_6_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 6 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_7_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 7 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_8_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 8 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_9_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 9 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_10_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 10 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_11_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 11 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_12_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 12 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_13_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 13 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_14_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 14 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_15_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 15 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_16_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 16 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_17_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 17 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_18_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 18 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_19_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 19 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_20_percent":{"type":["number","null"],"description":"Percentage rate of tax slot 20 snapshotted on the order when it was created, so later rate changes do not alter it. Null when the slot is not a percentage."},"tax_1_total":{"type":["integer","null"],"description":"Total of tax slot 1 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_2_total":{"type":["integer","null"],"description":"Total of tax slot 2 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_3_total":{"type":["integer","null"],"description":"Total of tax slot 3 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_4_total":{"type":["integer","null"],"description":"Total of tax slot 4 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_5_total":{"type":["integer","null"],"description":"Total of tax slot 5 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_6_total":{"type":["integer","null"],"description":"Total of tax slot 6 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_7_total":{"type":["integer","null"],"description":"Total of tax slot 7 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_8_total":{"type":["integer","null"],"description":"Total of tax slot 8 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_9_total":{"type":["integer","null"],"description":"Total of tax slot 9 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_10_total":{"type":["integer","null"],"description":"Total of tax slot 10 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_11_total":{"type":["integer","null"],"description":"Total of tax slot 11 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_12_total":{"type":["integer","null"],"description":"Total of tax slot 12 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_13_total":{"type":["integer","null"],"description":"Total of tax slot 13 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_14_total":{"type":["integer","null"],"description":"Total of tax slot 14 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_15_total":{"type":["integer","null"],"description":"Total of tax slot 15 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_16_total":{"type":["integer","null"],"description":"Total of tax slot 16 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_17_total":{"type":["integer","null"],"description":"Total of tax slot 17 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_18_total":{"type":["integer","null"],"description":"Total of tax slot 18 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_19_total":{"type":["integer","null"],"description":"Total of tax slot 19 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"tax_20_total":{"type":["integer","null"],"description":"Total of tax slot 20 charged on the order. Tax slots 1 to 20 are the account\u0027s configured taxes, fees and surcharges; null when the slot does not apply. In the account\u0027s minor currency unit (cents for USD)."},"reseller_commission_total":{"type":["integer","null"],"description":"Reseller commission earned on the order. In the account\u0027s minor currency unit (cents for USD)."},"commissionable_total":{"type":["integer","null"],"description":"Part of the order\u0027s amount that reseller commission is calculated on. In the account\u0027s minor currency unit (cents for USD)."},"non_commissionable_total":{"type":["integer","null"],"description":"Part of the order\u0027s amount that reseller commission is not calculated on. In the account\u0027s minor currency unit (cents for USD)."},"total_sales":{"type":["integer","null"],"description":"Net revenue the order earns the operator after discounts, promo codes, guest fees, reseller commissions and government taxes. The order\u0027s share of the trip\u0027s total sales. In the account\u0027s minor currency unit (cents for USD)."},"is_manually_overbooked":{"type":["boolean","null"],"description":"Whether staff booked the order past the timeslot\u0027s capacity."},"is_rebook_choose_experience":{"type":"boolean","description":"Whether a cancelled order was cancelled so the guest can pick a different experience; the customer portal then asks them to choose one when rebooking."},"products_cnt":{"type":["integer","null"],"description":"Number of products sold on the order."},"addons_cnt":{"type":["integer","null"],"description":"Number of add-ons sold on the order."},"trip_id":{"type":["string","null"],"description":"Id of the trip this order belongs to."},"status":{"type":["string","null"],"description":"`booked` while the order is active, `cancelled` once it has been cancelled. A cancelled order and its bookings are still returned."},"experience_id":{"type":["string","null"],"description":"Id of the experience (activity) the order is for. Read it with `GET \/rest\/experiences\/{id}`."},"experience":{"type":["string","null"],"description":"Name of the experience (activity) the order is for. Display only; use `experience_id`."},"location_id":{"type":["string","null"],"description":"Id of the location the order is for."},"experience_timeslot_start_time":{"type":["string","null"],"format":"date-time","description":"When the order\u0027s timeslot starts, an RFC 3339 instant carrying the venue\u0027s UTC offset. Null for an unscheduled order."},"experience_timeslot_end_time":{"type":["string","null"],"format":"date-time","description":"When the order\u0027s timeslot ends, an RFC 3339 instant carrying the venue\u0027s UTC offset. Null for an unscheduled order."},"bookings":{"type":"array","items":{"$ref":"#\/components\/schemas\/Booking"},"description":"The bookings (one per guest) on the order, each identical to `GET \/rest\/bookings\/{id}`, so a booking id here can be used on the bookings endpoints. Returned only when reading a single trip."},"rebooked_to_trip_order_id":{"type":["string","null"],"description":"Id of the order that replaced this one when it was rebooked, or null. A cancelled order that was rebooked points at its replacement here; the replacement is among the same trip\u0027s `trip_orders`."},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"example":{"created_at":"2026-01-15T09:30:00+00:00","subtotal":1,"addons_total":1,"cancellation_experience_total":1,"cancellation_addons_total":1,"cancellation_products_total":1,"cancellation_total_sales":1,"products_total":1,"experience_total":1,"note":"string","is_complimentary":true,"deposit_total":1,"cancelled_at":"2026-01-15T09:30:00+00:00","portal_auto_refund_outcome":"string","portal_rebook_payment_due_at":"2026-01-15T09:30:00+00:00","is_group":true,"tax_1_fixed_amount":1,"tax_2_fixed_amount":1,"tax_3_fixed_amount":1,"tax_4_fixed_amount":1,"tax_5_fixed_amount":1,"tax_6_fixed_amount":1,"tax_7_fixed_amount":1,"tax_8_fixed_amount":1,"tax_9_fixed_amount":1,"tax_10_fixed_amount":1,"tax_11_fixed_amount":1,"tax_12_fixed_amount":1,"tax_13_fixed_amount":1,"tax_14_fixed_amount":1,"tax_15_fixed_amount":1,"tax_16_fixed_amount":1,"tax_17_fixed_amount":1,"tax_18_fixed_amount":1,"tax_19_fixed_amount":1,"tax_20_fixed_amount":1,"tax_1_percent":1,"tax_2_percent":1,"tax_3_percent":1,"tax_4_percent":1,"tax_5_percent":1,"tax_6_percent":1,"tax_7_percent":1,"tax_8_percent":1,"tax_9_percent":1,"tax_10_percent":1,"tax_11_percent":1,"tax_12_percent":1,"tax_13_percent":1,"tax_14_percent":1,"tax_15_percent":1,"tax_16_percent":1,"tax_17_percent":1,"tax_18_percent":1,"tax_19_percent":1,"tax_20_percent":1,"tax_1_total":1,"tax_2_total":1,"tax_3_total":1,"tax_4_total":1,"tax_5_total":1,"tax_6_total":1,"tax_7_total":1,"tax_8_total":1,"tax_9_total":1,"tax_10_total":1,"tax_11_total":1,"tax_12_total":1,"tax_13_total":1,"tax_14_total":1,"tax_15_total":1,"tax_16_total":1,"tax_17_total":1,"tax_18_total":1,"tax_19_total":1,"tax_20_total":1,"reseller_commission_total":1,"commissionable_total":1,"non_commissionable_total":1,"total_sales":1,"is_manually_overbooked":true,"is_rebook_choose_experience":true,"products_cnt":1,"addons_cnt":1,"trip_id":"string","status":"string","experience_id":"string","experience":"string","location_id":"string","experience_timeslot_start_time":"2026-01-15T09:30:00+00:00","experience_timeslot_end_time":"2026-01-15T09:30:00+00:00","bookings":["string"],"rebooked_to_trip_order_id":"string","id":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}}}},"security":[{"bearerAuth":[]}],"paths":{"\/rest\/audit-log":{"get":{"operationId":"audit_logs_list","summary":"List","description":"Returns a paginated list of audit log entries, optionally filtered and sorted.\n\n### Required scope\n\n`audit-log.read`","x-required-scope":"audit-log.read","x-required-scopes":["audit-log.read"],"tags":["audit-logs"],"security":[{"bearerAuth":["audit-log.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: id, created_at."},{"name":"object_class","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Object class \u2014 bare value for equality, or {eq|contains} as \u0022?object_class[op]=value\u0022."},{"name":"created_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Created at \u2014 bare value for equality, or {eq|gte|lte} as \u0022?created_at[op]=value\u0022."},{"name":"description","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Description \u2014 bare value for equality, or {eq|contains} as \u0022?description[op]=value\u0022."},{"name":"trip_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Trip ID (equality)."},{"name":"experience_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Experience ID (equality)."},{"name":"user_avatar_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by User avatar ID (equality)."},{"name":"reseller_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Reseller ID (equality)."},{"name":"customer_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Customer ID (equality)."},{"name":"waiver_type_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Waiver type ID (equality)."},{"name":"experience_timeslot_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Experience timeslot ID (equality)."},{"name":"created_by_user_avatar_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Created by user avatar ID (equality)."},{"name":"created_by_rest_credential_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Created by rest credential ID (equality)."},{"name":"audit_log_entry_type","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Audit log entry type (equality)."},{"name":"crm_template_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Crm template ID (equality)."},{"name":"resource_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Resource ID (equality)."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"success":{"type":"boolean"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/audit-log\/{id}":{"get":{"operationId":"audit_logs_get","summary":"Get one","description":"Returns a single audit log entry by id, including its nested field-change details.\n\n### Required scope\n\n`audit-log.read`","x-required-scope":"audit-log.read","x-required-scopes":["audit-log.read"],"tags":["audit-logs"],"security":[{"bearerAuth":["audit-log.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"audit_log":{"$ref":"#\/components\/schemas\/AuditLog"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/bookings":{"get":{"operationId":"bookings_list","summary":"List","description":"Returns a paginated list of bookings, newest first (highest `id` first; ids only ever increase, so this is creation order). Filter by `trip_order_id`, `customer_id`, `booking_status_id`, `experience_customer_type_id` and `booking_waiver_status` (a slug). Only these indexed fields can be filtered, and the only sort is `?sort=id` or `?sort=-id`; filtering or sorting by dates or amounts is not offered because it cannot be done efficiently on large accounts. Each booking carries its price breakdown (see Money), `resources` (the assignments with times, names, duration and note) and `custom_fields`.\n\n### Required scope\n\n`bookings.read`","x-required-scope":"bookings.read","x-required-scopes":["bookings.read"],"tags":["bookings"],"security":[{"bearerAuth":["bookings.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: id."},{"name":"id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of a booking (a uuid)."},{"name":"trip_order_id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of a trip order, the `trip_order_id` on any booking. Returns the bookings (guests) on that trip order."},{"name":"booking_status_id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of a booking status. List the account\u0027s statuses with `GET \/rest\/bookings\/statuses`; a booking\u0027s current one is its `booking_status_id`."},{"name":"customer_id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of a customer, a booking\u0027s `customer_id`. Find a customer by email or `phone_format_164` with `GET \/rest\/customers`."},{"name":"experience_customer_type_id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of a ticket type, as listed in an experience\u0027s `customer_types[].id`. Returns the bookings of that ticket type."},{"name":"booking_waiver_status","in":"query","required":false,"schema":{"type":"string"},"description":"The waiver status slug, `unsigned` or `signed` (an exact match on the status slug). This is the booking\u0027s stored summary, which can drift from the per-waiver entries in `waivers`. A booking whose experience needs no waiver has no status, so it matches neither value."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"bookings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"created_at":{"type":"string"},"total":{"type":"integer"},"experience_total":{"type":"integer"},"products_total":{"type":"integer"},"addons_total":{"type":"integer"},"is_complimentary":{"type":"boolean"},"customer_type_amount":{"type":"integer"},"deposit_amount":{"type":"string"},"checkedin_at":{"type":"string"},"promo_code_total":{"type":"integer"},"voucher_code_discount":{"type":"string"},"customer_type_amount_override":{"type":"string"},"products_total_gross":{"type":"integer"},"promo_code_fixed_amount":{"type":"string"},"promo_code_percent":{"type":"integer"},"promo_code_amount":{"type":"integer"},"promo_code_set_price":{"type":"string"},"addons_total_gross":{"type":"integer"},"reseller_commission_amount":{"type":"integer"},"reseller_commission_total":{"type":"integer"},"commissionable_amount":{"type":"integer"},"non_commissionable_amount":{"type":"integer"},"commissionable_total":{"type":"integer"},"non_commissionable_total":{"type":"integer"},"total_sales":{"type":"integer"},"booking_status_id":{"type":"string"},"custom_fields":{"type":"array","items":{"type":"string"}},"resources":{"type":"array","items":{"type":"string"}},"booking_waiver_status":{"type":"string"},"trip_order_id":{"type":"string"},"customer_id":{"type":"string"},"experience_customer_type":{"type":"string"},"experience_customer_type_id":{"type":"string"}}}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":"string"}}}},"example":{"success":true,"bookings":[{"id":"6f1c2d3e-4a5b-8c7d-9e0f-1a2b3c4d5e6f","created_at":"2026-09-01T15:04:05+00:00","total":11880,"experience_total":9000,"products_total":1500,"addons_total":500,"is_complimentary":false,"customer_type_amount":10000,"deposit_amount":null,"checkedin_at":null,"promo_code_total":1000,"voucher_code_discount":null,"customer_type_amount_override":null,"products_total_gross":1500,"promo_code_fixed_amount":null,"promo_code_percent":10,"promo_code_amount":1000,"promo_code_set_price":null,"addons_total_gross":500,"reseller_commission_amount":0,"reseller_commission_total":0,"commissionable_amount":0,"non_commissionable_amount":9720,"commissionable_total":0,"non_commissionable_total":11840,"total_sales":11000,"booking_status_id":"5e6f7a8b-9c0d-8e1f-9a2b-3c4d5e6f7a8b","custom_fields":[],"resources":[],"booking_waiver_status":null,"trip_order_id":"0a1b2c3d-4e5f-8a7b-9c0d-1e2f3a4b5c6d","customer_id":"7a8b9c0d-1e2f-8a3b-9c4d-5e6f7a8b9c0d","experience_customer_type":"Adult","experience_customer_type_id":"3c4d5e6f-7a8b-8c9d-9e0f-1a2b3c4d5e6f"}],"meta":{"per_page":25,"has_more":false,"next_cursor":null}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"post":{"operationId":"bookings_create","summary":"Add a booking","description":"Adds one or more bookings (guests) to an existing trip order, exactly as adding a guest in the back office does. The ticket type must belong to the trip order\u0027s experience (`customer_types[].id` on `GET \/rest\/experiences\/{id}`). `qty` defaults to 1 (maximum 100); a fixed-size group ticket adds one booking per person in the group.\n\nCustomer: with neither field, each new booking gets its own new blank customer. Send either `customer_id` (an existing customer; needs the `customers.read` scope) or `customer` (an object of customer fields, the same as `POST \/rest\/customers`; creates a new customer and needs the `customers.write` scope), never both. Either is only allowed when the request adds exactly one booking. Search customers first (`GET \/rest\/customers?email=` or `?phone_format_164=`): creating does not deduplicate, and retrying a request whose reply you missed can create a second customer and booking.\n\n`booking_status_id` optionally sets the starting status (default: the account\u0027s default status). Send `dry_run: true` to run every check and save nothing: the reply is 200 `{success, dry_run: true, message, bookings_to_add, customer_id, creates_new_customer}`, where `bookings_to_add` is how many bookings a real request would create (`qty`, or `qty` times the people in a fixed-size group ticket) where `customer_id` is the existing customer that would be used, or null, and `creates_new_customer` says whether a customer would be created.\n\n**Capacity**\n\nThe capacity rule is applied on every surface that adds a booking (this API, MCP, the back office and the e-commerce cart) and cannot be skipped. It applies only while the trip is reserved; a draft trip holds no capacity. Every new booking (a fixed-size group ticket adds one booking per person) takes one place: with unlimited capacity anything fits; with a per-timeslot cap the new bookings must fit what is left on the timeslot; with a per-ticket-type cap or resource-based capacity they must fit what is left for that ticket type, which for resources also counts the resources already held and may spill onto an empty resource. If the experience allows manual overbooking the cap can be exceeded only by a signed-in team member who is not a reseller agent. A REST credential can never overbook, so over capacity is always a 409 for it, whatever the experience setting. The group-size maximum configured on an experience\u0027s restrictions is not checked here, and the price is not checked either.\n\nSuccess: 201 with `message`, `bookings` (the new bookings) and `trip_order` (`total`, `paid`, `due` in cents; adding can leave the order underpaid).\n\nErrors: 409 `decision_required` when a choice is needed first, with `error.decisions` a list of `{kind, context}`; resend the request with `decisions` keyed by `kind` (for example a voucher: `{\u0022voucher_reapply\u0022: {\u0022strategy\u0022: \u0022REAPPLY\u0022, \u0022tripVoucherCodeId\u0022: 42}}`). 409 `trip_locked` when the trip can no longer be changed. 409 `trip_order_cancelled` when the trip order is cancelled. 409 `capacity_shortfall` when the new bookings do not fit the timeslot\u0027s capacity. 404 `customer_not_found` when `customer_id` is unknown or belongs to another account. 422 `validation_failed` with `error.fields` keyed `decisions.voucher_reapply.strategy` or `decisions.voucher_reapply.tripVoucherCodeId` when a voucher answer is not recognised. 422 `validation_failed` with `errors` keyed by field (`customer.email` for a bad customer field) and `error.fields`.\n\n### Required scope\n\n`bookings.write`","x-required-scope":"bookings.write","x-required-scopes":["bookings.write"],"tags":["bookings"],"security":[{"bearerAuth":["bookings.write"]}],"responses":{"201":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"bookings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"booking_status_id":{"type":"string"},"trip_order_id":{"type":"string"},"customer_id":{"type":"string"},"experience_customer_type_id":{"type":"string"},"total":{"type":"integer"},"resources":{"type":"array","items":{"type":"string"}}}}},"trip_order":{"type":"object","properties":{"total":{"type":"integer"},"paid":{"type":"integer"},"due":{"type":"integer"}}}},"example":{"success":true,"message":"Booking Added.","bookings":[{"id":"6f1c2d3e-4a5b-8c7d-9e0f-1a2b3c4d5e6f","booking_status_id":"5e6f7a8b-9c0d-8e1f-9a2b-3c4d5e6f7a8b","trip_order_id":"0a1b2c3d-4e5f-8a7b-9c0d-1e2f3a4b5c6d","customer_id":"3c4d5e6f-7a8b-8c9d-8e0f-2a3b4c5d6e7f","experience_customer_type_id":"9d8c7b6a-5e4f-8d3c-9b2a-1f0e9d8c7b6a","total":5000,"resources":[]}],"trip_order":{"total":10000,"paid":5000,"due":5000}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"A customer can only be set when this adds exactly one booking. Add guests one at a time, or leave the customer out. This ticket type does not belong to the trip order\u0027s experience.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"This booking belongs to a cancelled trip order, so it can no longer be changed.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"trip_order_id":{"type":"string","format":"uuid","description":"The trip order to add the booking to: the `trip_order_id` on any existing booking."},"experience_customer_type_id":{"type":"string","format":"uuid","description":"The ticket type to add: a `customer_types[].id` from `GET \/rest\/experiences\/{id}`. It must belong to the trip order\u0027s experience."},"qty":{"type":"integer","minimum":1,"maximum":100,"description":"How many tickets to add (default 1). A fixed-size group ticket adds one booking per person in the group."},"customer":{"type":"object","description":"A new customer to create and attach: the same fields as `POST \/rest\/customers` (needs the `customers.write` scope). Only when the request adds exactly one booking. Send this or `customer_id`, not both. Errors are reported as `customer.\u003Cfield\u003E`."},"booking_status_id":{"type":"string","format":"uuid","description":"Starting status for the new bookings, from `GET \/rest\/bookings\/statuses`. Default: the account\u0027s default status."},"customer_id":{"type":"string","format":"uuid","description":"An existing customer to attach (needs the `customers.read` scope). Only when the request adds exactly one booking. Send this or `customer`, not both."},"decisions":{"type":"object","description":"Answers to a 409 `decision_required` reply, keyed by the decision `kind`, for example `{\u0022voucher_reapply\u0022: {\u0022strategy\u0022: \u0022REAPPLY\u0022, \u0022tripVoucherCodeId\u0022: 42}}`. A `voucher_reapply` answer must have `strategy` exactly `REAPPLY` or `KEEP_AS_IS` (uppercase) and `tripVoucherCodeId` a whole number that is a per-trip voucher code on this trip; anything else is refused with 422 before anything is created."},"dry_run":{"type":"boolean","description":"When true, runs every check (locked trip, capacity, ticket type, customer, decisions) and saves nothing. The reply is 200 `{success, dry_run: true, message, bookings_to_add, customer_id, creates_new_customer}`."}},"required":["trip_order_id","experience_customer_type_id"]},"examples":{"Minimal":{"value":{"trip_order_id":"0a1b2c3d-4e5f-8a7b-9c0d-1e2f3a4b5c6d","experience_customer_type_id":"9d8c7b6a-5e4f-8d3c-9b2a-1f0e9d8c7b6a"}},"Two guests, default customers":{"value":{"trip_order_id":"0a1b2c3d-4e5f-8a7b-9c0d-1e2f3a4b5c6d","experience_customer_type_id":"9d8c7b6a-5e4f-8d3c-9b2a-1f0e9d8c7b6a","qty":2}},"With an existing customer":{"value":{"trip_order_id":"0a1b2c3d-4e5f-8a7b-9c0d-1e2f3a4b5c6d","experience_customer_type_id":"9d8c7b6a-5e4f-8d3c-9b2a-1f0e9d8c7b6a","customer_id":"3c4d5e6f-7a8b-8c9d-8e0f-2a3b4c5d6e7f"}},"With a new customer":{"value":{"trip_order_id":"0a1b2c3d-4e5f-8a7b-9c0d-1e2f3a4b5c6d","experience_customer_type_id":"9d8c7b6a-5e4f-8d3c-9b2a-1f0e9d8c7b6a","customer":{"first_name":"Jane","last_name":"Doe","email":"jane@example.com","phone":"+14155550123"}}},"Dry run (checks everything, saves nothing)":{"value":{"trip_order_id":"0a1b2c3d-4e5f-8a7b-9c0d-1e2f3a4b5c6d","experience_customer_type_id":"9d8c7b6a-5e4f-8d3c-9b2a-1f0e9d8c7b6a","dry_run":true}},"Answering a voucher decision":{"value":{"trip_order_id":"0a1b2c3d-4e5f-8a7b-9c0d-1e2f3a4b5c6d","experience_customer_type_id":"9d8c7b6a-5e4f-8d3c-9b2a-1f0e9d8c7b6a","decisions":{"voucher_reapply":{"strategy":"REAPPLY","tripVoucherCodeId":42}}}}}}}}}},"\/rest\/bookings\/set-status":{"post":{"operationId":"bookings_set_status_many","summary":"Set status for several bookings","description":"Sets the status of up to 50 bookings in one call, for example to check in a whole party. Identify the target status by `booking_status_id` (an id from `GET \/rest\/bookings\/statuses`, required for a custom status) or by `status`, the shorthand for a built-in status. Pass `dry_run: true` to see what would happen without changing anything.\n\nEach booking gets its own outcome: `changed` (or `would_change` on a dry run), `unchanged` when it already has that status, `blocked` when it cannot change (its trip order is cancelled, or a voucher is required for a check-in), or `failed`. A booking that cannot change does not stop the others. For a check-in, `warnings` lists anything worth a second look: balances still owed (once per reservation), guests whose waiver is unsigned, and guests booked for a day other than today. Warnings never block the change.\n\nErrors: 403 if the key may not edit one of the bookings (nothing is changed); 422 `validation_failed` when `booking_ids` is empty or longer than 50, or when a booking or the status is unknown; 422 `invalid_field_type` when `dry_run` is not a boolean or `status` or `booking_status_id` is not a string.\n\n### Required scope\n\n`bookings.write`","x-required-scope":"bookings.write","x-required-scopes":["bookings.write"],"tags":["bookings"],"security":[{"bearerAuth":["bookings.write"]}],"responses":{"201":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"dry_run":{"type":"boolean"},"status":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}}},"bookings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"outcome":{"type":"string"},"reason":{"type":"string"}}}},"warnings":{"type":"array","items":{"type":"string"}}},"example":{"success":true,"dry_run":false,"status":{"id":"bdbd1b14-ed72-8e63-9a63-1c3954a4fb75","name":"Checked In","slug":"checked-in"},"bookings":[{"id":"6f1c2d3e-4a5b-8c7d-9e0f-1a2b3c4d5e6f","outcome":"changed","reason":null},{"id":"0a1b2c3d-4e5f-8a7b-9c0d-1e2f3a4b5c6d","outcome":"unchanged","reason":"Booking is already in the status Checked In"}],"warnings":["1 guest(s) have not signed their waiver: Maria Gonzalez."]}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"booking_ids":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Ids of the bookings to change, 1 to 50, for example the ids of the bookings on one manifest trip order. They may belong to different reservations."},"status":{"type":"string","enum":["not-checked-in","checked-in","no-show"],"description":"Shorthand for a built-in status. A custom status has no shorthand: use `booking_status_id`."},"booking_status_id":{"type":"string","format":"uuid","description":"The status to set, from `GET \/rest\/bookings\/statuses` or the manifest\u0027s `booking_statuses`. Send this or `status`, not both."},"dry_run":{"type":"boolean","description":"When true, nothing is changed and the response shows what would happen, including the warnings. Defaults to false."}},"required":["booking_ids"]},"example":{"booking_ids":["6f1c2d3e-4a5b-8c7d-9e0f-1a2b3c4d5e6f","0a1b2c3d-4e5f-8a7b-9c0d-1e2f3a4b5c6d"],"status":"checked-in"}}}}}},"\/rest\/bookings\/statuses":{"get":{"operationId":"bookings_list_statuses","summary":"List statuses","description":"Returns the account\u0027s booking statuses in display order. Use an `id` from this list as `booking_status_id` when setting a booking\u0027s status or adding a booking. Custom statuses share the slug `user`, so always identify a status by `id`, never by `slug` or `name`.\n\n### Required scope\n\n`bookings.read`","x-required-scope":"bookings.read","x-required-scopes":["bookings.read"],"tags":["bookings"],"security":[{"bearerAuth":["bookings.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: id."},{"name":"id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of a booking (a uuid)."},{"name":"trip_order_id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of a trip order, the `trip_order_id` on any booking. Returns the bookings (guests) on that trip order."},{"name":"booking_status_id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of a booking status. List the account\u0027s statuses with `GET \/rest\/bookings\/statuses`; a booking\u0027s current one is its `booking_status_id`."},{"name":"customer_id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of a customer, a booking\u0027s `customer_id`. Find a customer by email or `phone_format_164` with `GET \/rest\/customers`."},{"name":"experience_customer_type_id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of a ticket type, as listed in an experience\u0027s `customer_types[].id`. Returns the bookings of that ticket type."},{"name":"booking_waiver_status","in":"query","required":false,"schema":{"type":"string"},"description":"The waiver status slug, `unsigned` or `signed` (an exact match on the status slug). This is the booking\u0027s stored summary, which can drift from the per-waiver entries in `waivers`. A booking whose experience needs no waiver has no status, so it matches neither value."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"booking_statuses":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"sort_order":{"type":"integer"},"is_read_only":{"type":"boolean"},"color":{"type":"string"}}}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":"string"}}}},"example":{"success":true,"booking_statuses":[{"id":"5e6f7a8b-9c0d-8e1f-9a2b-3c4d5e6f7a8b","name":"Not Checked In","slug":"not-checked-in","sort_order":0,"is_read_only":true,"color":"#efefef"}],"meta":{"per_page":25,"has_more":false,"next_cursor":null}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/bookings\/{id}":{"get":{"operationId":"bookings_get","summary":"Get one","description":"Returns a single booking by id, including `booking_status_id` (look the name up in `GET \/rest\/bookings\/statuses`), the price breakdown (see Money), `customer_id`, `trip_order_id`, `resources` (each assignment with resource name and type, start and end time, duration and note) and `custom_fields`.\n\n### Required scope\n\n`bookings.read`","x-required-scope":"bookings.read","x-required-scopes":["bookings.read"],"tags":["bookings"],"security":[{"bearerAuth":["bookings.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"booking":{"type":"object","properties":{"id":{"type":"string"},"created_at":{"type":"string"},"total":{"type":"integer"},"experience_total":{"type":"integer"},"products_total":{"type":"integer"},"addons_total":{"type":"integer"},"is_complimentary":{"type":"boolean"},"customer_type_amount":{"type":"integer"},"deposit_amount":{"type":"string"},"checkedin_at":{"type":"string"},"promo_code_total":{"type":"integer"},"voucher_code_discount":{"type":"string"},"customer_type_amount_override":{"type":"string"},"products_total_gross":{"type":"integer"},"promo_code_fixed_amount":{"type":"string"},"promo_code_percent":{"type":"integer"},"promo_code_amount":{"type":"integer"},"promo_code_set_price":{"type":"string"},"addons_total_gross":{"type":"integer"},"reseller_commission_amount":{"type":"integer"},"reseller_commission_total":{"type":"integer"},"commissionable_amount":{"type":"integer"},"non_commissionable_amount":{"type":"integer"},"commissionable_total":{"type":"integer"},"non_commissionable_total":{"type":"integer"},"total_sales":{"type":"integer"},"booking_status_id":{"type":"string"},"custom_fields":{"type":"array","items":{"type":"string"}},"resources":{"type":"array","items":{"type":"string"}},"booking_waiver_status":{"type":"string"},"trip_order_id":{"type":"string"},"customer_id":{"type":"string"},"experience_customer_type":{"type":"string"},"experience_customer_type_id":{"type":"string"}}}},"example":{"success":true,"booking":{"id":"6f1c2d3e-4a5b-8c7d-9e0f-1a2b3c4d5e6f","created_at":"2026-09-01T15:04:05+00:00","total":11880,"experience_total":9000,"products_total":1500,"addons_total":500,"is_complimentary":false,"customer_type_amount":10000,"deposit_amount":null,"checkedin_at":null,"promo_code_total":1000,"voucher_code_discount":null,"customer_type_amount_override":null,"products_total_gross":1500,"promo_code_fixed_amount":null,"promo_code_percent":10,"promo_code_amount":1000,"promo_code_set_price":null,"addons_total_gross":500,"reseller_commission_amount":0,"reseller_commission_total":0,"commissionable_amount":0,"non_commissionable_amount":9720,"commissionable_total":0,"non_commissionable_total":11840,"total_sales":11000,"booking_status_id":"5e6f7a8b-9c0d-8e1f-9a2b-3c4d5e6f7a8b","custom_fields":[],"resources":[],"booking_waiver_status":null,"trip_order_id":"0a1b2c3d-4e5f-8a7b-9c0d-1e2f3a4b5c6d","customer_id":"7a8b9c0d-1e2f-8a3b-9c4d-5e6f7a8b9c0d","experience_customer_type":"Adult","experience_customer_type_id":"3c4d5e6f-7a8b-8c9d-9e0f-1a2b3c4d5e6f"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"delete":{"operationId":"bookings_delete","summary":"Remove a booking","description":"Removes the booking from its trip order, exactly as removing a guest in the back office does. Send no body. Removing the last booking on a trip order cancels the trip order (`trip_order_cancelled` true), except on an e-commerce cart that is still a draft, where the whole trip order is deleted instead (`trip_order_removed` true, `trip_order_cancelled` false). No refund is issued: check `trip_order.paid` and `trip_order.due` (cents) in the reply, a negative `due` means the customer is overpaid and needs a refund through the payments flow.\n\nErrors: 409 `trip_locked` when the trip can no longer be changed; 409 `trip_order_cancelled` when the booking\u0027s trip order is cancelled, because a cancelled order\u0027s bookings can no longer be changed. 409 `trip_reserved` for a caller that may not change a reserved trip.\n\n### Required scope\n\n`bookings.write`","x-required-scope":"bookings.write","x-required-scopes":["bookings.write"],"tags":["bookings"],"security":[{"bearerAuth":["bookings.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"trip_order_cancelled":{"type":"boolean"},"trip_order_removed":{"type":"boolean"},"trip_order":{"type":"object","properties":{"total":{"type":"integer"},"paid":{"type":"integer"},"due":{"type":"integer"}}}},"example":{"success":true,"message":"Booking deleted.","trip_order_cancelled":false,"trip_order_removed":false,"trip_order":{"total":5000,"paid":5000,"due":0}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/bookings\/{id}\/add-ons":{"get":{"operationId":"bookings_list_add_ons","summary":"List add-ons","description":"Returns the add-ons on this booking (options the guest picked, such as an extra hour or a meal choice; not the trip order\u0027s own add-ons), oldest first. The `total` of every line whose `price_adjust_type_id` is not 2 adds up to the booking\u0027s `addons_total`, and `total_gross` to `addons_total_gross`; a type 2 line (set the ticket price) is left out of those sums because the ticket price already absorbs it. `price_adjust_type_id` is one of 1 (increase or decrease the price by `price`), 2 (set the ticket price to `price`), 3 (no price change) or 4 (increase or decrease by `percent` of the ticket price). Amounts are integer cents in the account\u0027s currency (see Money in the Bookings description); `percent` and `promo_code_percent` are percents from 0 to 100.Reseller commission fields are commercially sensitive and visible to every caller with `bookings.read`. Read-only.\n\n### Required scope\n\n`bookings.read`","x-required-scope":"bookings.read","x-required-scopes":["bookings.read"],"tags":["bookings"],"security":[{"bearerAuth":["bookings.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"booking_add_ons":{"type":"array","items":{"$ref":"#\/components\/schemas\/ExperienceAddonValue"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}},"example":{"success":true,"booking_add_ons":[{"id":"3c4d5e6f-7a8b-8c9d-9e0f-2a3b4c5d6e7f","name":"Extra hour","experience_addon_id":"5e6f7a8b-9c0d-8e1f-9a2b-3c4d5e6f7a80","experience_addon_value_type_id":"6f7a8b9c-0d1e-8f2a-9b3c-4d5e6f7a8b91","price_adjust_type_id":1,"price":500,"percent":null,"total_gross":500,"promo_code_percent":null,"promo_code_amount":null,"total":500,"total_sales":500,"reseller_commission_amount":null,"commissionable_amount":0,"non_commissionable_amount":500}],"meta":{"per_page":25,"has_more":false,"next_cursor":null}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/bookings\/{id}\/custom-fields":{"get":{"operationId":"bookings_list_custom_fields","summary":"List custom fields","description":"Returns the booking\u0027s custom fields: exactly the entries of the booking\u0027s `custom_fields`, `{id, slug, name, type, value, required}`, for every booking-level custom field that applies to its experience, in back-office order, answered or not (`value` is null when unanswered). This is not a table of rows: the list is built from the experience\u0027s field definitions and the booking\u0027s answers, so it is returned whole, without pagination or a `meta` block. Read-only.\n\n### Required scope\n\n`bookings.read`","x-required-scope":"bookings.read","x-required-scopes":["bookings.read"],"tags":["bookings"],"security":[{"bearerAuth":["bookings.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"custom_fields":{"type":"array","items":{"$ref":"#\/components\/schemas\/BookingCustomFieldEntry"}}},"example":{"success":true,"custom_fields":[{"id":"7a8b9c0d-1e2f-8a3b-9c4d-5e6f7a8b9c02","slug":"dietary_needs","name":"Dietary needs","type":"Text (Single Line)","value":"Vegetarian","required":true}]}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/bookings\/{id}\/mark-waivers-signed":{"post":{"operationId":"bookings_mark_waivers_signed","summary":"Mark waivers signed","description":"Marks every waiver the booking\u0027s experience requires as signed, using the same per-requirement step as `POST \/rest\/bookings\/{id}\/waivers\/{waiver_type_id}\/mark-signed`. Send no body. This is a staff override \u2014 it records the waivers as signed without a signed waiver document, and it cannot be undone through the API. Returns the booking with its updated `booking_waiver_status`. Errors: 409 `trip_order_cancelled` when the trip order is cancelled.\n\n### Required scope\n\n`bookings.write`","x-required-scope":"bookings.write","x-required-scopes":["bookings.write"],"tags":["bookings"],"security":[{"bearerAuth":["bookings.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"booking":{"$ref":"#\/components\/schemas\/Booking"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/bookings\/{id}\/products":{"get":{"operationId":"bookings_list_products","summary":"List products","description":"Returns the products (extras sold with the ticket, such as a photo package or a rental) on this booking, oldest first. It is a full breakdown of the booking\u0027s `products_total`: the `total` of every line adds up to `products_total`, and `total_gross` adds up to `products_total_gross`. Amounts are integer cents in the account\u0027s currency (see Money in the Bookings description); `promo_code_percent` is a percent from 0 to 100.Reseller commission fields are commercially sensitive and visible to every caller with `bookings.read`. Read-only.\n\n### Required scope\n\n`bookings.read`","x-required-scope":"bookings.read","x-required-scopes":["bookings.read"],"tags":["bookings"],"security":[{"bearerAuth":["bookings.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"booking_products":{"type":"array","items":{"$ref":"#\/components\/schemas\/BookingProduct"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}},"example":{"success":true,"booking_products":[{"id":"2b3c4d5e-6f7a-8b9c-9d0e-1f2a3b4c5d6e","name":"Photo package","product_id":"4d5e6f7a-8b9c-8d0e-9f1a-2b3c4d5e6f7a","quantity":1,"unit_price":1500,"total_gross":1500,"manual_discount_total":null,"promo_code_amount":null,"promo_code_percent":null,"promo_code_fixed_amount":null,"total":1500,"total_sales":1500,"reseller_commission_amount":0,"commissionable_amount":0,"non_commissionable_amount":1620}],"meta":{"per_page":25,"has_more":false,"next_cursor":null}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/bookings\/{id}\/resources":{"get":{"operationId":"bookings_list_resources","summary":"List resources","description":"Returns the resources (boats, vehicles, guides and so on) assigned to a booking, earliest first.\n\n### Required scope\n\n`bookings.read`","x-required-scope":"bookings.read","x-required-scopes":["bookings.read"],"tags":["bookings"],"security":[{"bearerAuth":["bookings.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"booking_resources":{"type":"array","items":{"$ref":"#\/components\/schemas\/BookingResource"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}},"example":{"success":true,"booking_resources":[{"id":"4e5f6a7b-8c9d-8e0f-9a1b-2c3d4e5f6a7b","resource_id":"6f1c2d3e-4a5b-8c7d-9e0f-1a2b3c4d5e6f","resource_name":"Boat One","resource_type_name":"Boat","start_time":"2026-10-01T09:00:00-04:00","end_time":"2026-10-01T10:59:59-04:00","duration":119,"internal_note":null}],"meta":{"per_page":25,"has_more":false,"next_cursor":null}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/bookings\/{id}\/status":{"post":{"operationId":"bookings_set_status","summary":"Set status","description":"Sets the booking\u0027s status to any of the account\u0027s booking statuses, the same choice the back office offers (for example checked in, no-show, or back to not checked in). Get the ids from `GET \/rest\/bookings\/statuses`. Checking a guest in records the check-in time; moving off checked in clears it.\n\nErrors: 409 `trip_order_cancelled` when the booking\u0027s trip order is cancelled, because a cancelled order\u0027s bookings can no longer be changed. 409 `booking_status_unchanged` when the booking already has that status; 409 `voucher_required` for a check-in when the trip\u0027s reseller requires a voucher and none is on file; 422 `validation_failed` when `booking_status_id` is missing or does not match one of the account\u0027s statuses.\n\n### Required scope\n\n`bookings.write`","x-required-scope":"bookings.write","x-required-scopes":["bookings.write"],"tags":["bookings"],"security":[{"bearerAuth":["bookings.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"booking":{"$ref":"#\/components\/schemas\/Booking"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"booking_status_id":{"type":"string","format":"uuid","description":"The status to set, from `GET \/rest\/bookings\/statuses`. Identify a status by this id, never by name or slug (custom statuses all share the slug `user`)."}},"required":["booking_status_id"]},"example":{"booking_status_id":"5e6f7a8b-9c0d-8e1f-9a2b-3c4d5e6f7a8b"}}}}}},"\/rest\/bookings\/{id}\/waivers":{"get":{"operationId":"bookings_list_waivers","summary":"List waivers","description":"Returns the booking\u0027s waiver requirements: exactly the entries of the booking\u0027s `waivers`, `{waiver_type_id, name, status, has_signed_waiver}`, one for every waiver requirement of its experience, signed or not. `status` is `signed` or `unsigned` (a requirement with no record is `unsigned`). `has_signed_waiver` is true only when a signed document is on file, so `signed` with `has_signed_waiver` false means staff marked it signed without a document. The booking\u0027s `booking_waiver_status` is a stored summary of these and can drift from them. Additional signers beyond the ticket count are not included, and no signer details or document links are ever returned. This is not a table of rows: the list is built from the experience\u0027s waiver requirements and the booking\u0027s records, so it is returned whole, without pagination or a `meta` block. Read-only.\n\n### Required scope\n\n`bookings.read`","x-required-scope":"bookings.read","x-required-scopes":["bookings.read"],"tags":["bookings"],"security":[{"bearerAuth":["bookings.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"waivers":{"type":"array","items":{"$ref":"#\/components\/schemas\/BookingWaiverEntry"}}},"example":{"success":true,"waivers":[{"waiver_type_id":"8c9d0e1f-2a3b-8c4d-9e5f-6a7b8c9d0e1f","name":"Liability waiver","status":"signed","has_signed_waiver":false},{"waiver_type_id":"9d0e1f2a-3b4c-8d5e-9f6a-7b8c9d0e1f2a","name":"Photo release","status":"unsigned","has_signed_waiver":false}]}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/bookings\/{id}\/waivers\/{waiverType}\/mark-signed":{"post":{"operationId":"bookings_mark_waiver_signed","summary":"Mark one waiver signed","description":"Marks a single one of the booking\u0027s waiver requirements as signed. The requirement is identified by its `waiver_type_id` from the booking\u0027s `waivers` (or `GET \/rest\/bookings\/{id}\/waivers`). Send no body. This is a staff override: it records that requirement as signed without a signed waiver document, so `has_signed_waiver` stays false, and it cannot be undone through the API. There is no way to mark a waiver unsigned. It creates the requirement\u0027s signing record if it has none, or flips an unsigned one to signed. The booking\u0027s overall `booking_waiver_status` is then recomputed from the per-waiver records: it becomes `signed` only when every requirement of the experience is signed, so marking one of two waivers leaves it `unsigned`. Additional signers beyond the ticket count and a legacy single waiver link are not affected. Marking every requirement at once is `POST \/rest\/bookings\/{id}\/mark-waivers-signed`, which uses the same per-requirement step. Returns the booking with its updated `waivers` and `booking_waiver_status`.\n\nErrors: 409 `trip_order_cancelled` when the booking\u0027s trip order is cancelled, because a cancelled order\u0027s bookings can no longer be changed. 404 `not_found` when the waiver type does not exist; 404 `waiver_not_applicable` when it is not a requirement of this booking\u0027s experience; 409 `waiver_already_signed` when that requirement is already signed on this booking.\n\n### Required scope\n\n`bookings.write`","x-required-scope":"bookings.write","x-required-scopes":["bookings.write"],"tags":["bookings"],"security":[{"bearerAuth":["bookings.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},{"name":"waiverType","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"booking":{"type":"object","properties":{"id":{"type":"string"},"booking_waiver_status":{"type":"string"},"waivers":{"type":"array","items":{"type":"object","properties":{"waiver_type_id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"has_signed_waiver":{"type":"boolean"}}}}}}},"example":{"success":true,"booking":{"id":"6f1c2d3e-4a5b-8c7d-9e0f-1a2b3c4d5e6f","booking_waiver_status":"unsigned","waivers":[{"waiver_type_id":"8c9d0e1f-2a3b-8c4d-9e5f-6a7b8c9d0e1f","name":"Liability waiver","status":"signed","has_signed_waiver":false},{"waiver_type_id":"9d0e1f2a-3b4c-8d5e-9f6a-7b8c9d0e1f2a","name":"Photo release","status":"unsigned","has_signed_waiver":false}]}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/countries":{"get":{"operationId":"countrys_list","summary":"List","description":"Returns a paginated list of supported countries, optionally filtered and sorted. Ordered by name unless `sort` is given.\n\n### Required scope\n\nNone. Any valid API key can read this.","x-required-scope":null,"x-required-scopes":[],"tags":["countrys"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: code, name."},{"name":"code","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Code (equality)."},{"name":"name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Name \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?name[op]=value\u0022."},{"name":"code_char3","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Code char3 (equality)."},{"name":"phone_code","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Phone code (equality)."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"success":{"type":"boolean"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/countries\/{code}":{"get":{"operationId":"countrys_get_by_code","summary":"Get by code","description":"Returns a single country by its two-letter ISO 3166-1 alpha-2 code (case-insensitive). Responds 404 when the code is not supported.\n\n### Required scope\n\nNone. Any valid API key can read this.","x-required-scope":null,"x-required-scopes":[],"tags":["countrys"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: code, name."},{"name":"code","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Code (equality)."},{"name":"name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Name \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?name[op]=value\u0022."},{"name":"code_char3","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Code char3 (equality)."},{"name":"phone_code","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Phone code (equality)."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"success":{"type":"boolean"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/countries\/{id}":{"get":{"operationId":"countrys_get","summary":"Get one","description":"Returns a single country by its `id` \u2014 the same public id other resources return as `country_id`.\n\n### Required scope\n\nNone. Any valid API key can read this.","x-required-scope":null,"x-required-scopes":[],"tags":["countrys"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"country":{"$ref":"#\/components\/schemas\/Country"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/customers":{"get":{"operationId":"customers_list","summary":"List","description":"Returns a paginated list of customers.\n\n### Required scope\n\n`customers.read`","x-required-scope":"customers.read","x-required-scopes":["customers.read"],"tags":["customers"],"security":[{"bearerAuth":["customers.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: id, created_at, last_name."},{"name":"created_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Created at \u2014 bare value for equality, or {gte|lte} as \u0022?created_at[op]=value\u0022."},{"name":"code","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Code \u2014 bare value for equality, or {eq|begins_with} as \u0022?code[op]=value\u0022."},{"name":"first_name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by First name \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?first_name[op]=value\u0022."},{"name":"last_name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Last name \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?last_name[op]=value\u0022."},{"name":"email","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Email \u2014 bare value for equality, or {eq|contains} as \u0022?email[op]=value\u0022."},{"name":"city","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by City \u2014 bare value for equality, or {eq|contains} as \u0022?city[op]=value\u0022."},{"name":"phone","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Phone (equality)."},{"name":"country_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Country ID (equality)."},{"name":"locale","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Locale (equality)."},{"name":"language","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Language (equality)."},{"name":"dob","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Dob \u2014 bare value for equality, or {eq|gte|lte} as \u0022?dob[op]=value\u0022."},{"name":"dob_month","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Dob month (equality)."},{"name":"dob_year","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Dob year \u2014 bare value for equality, or {eq|gte|lte} as \u0022?dob_year[op]=value\u0022."},{"name":"is_lead","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is lead (equality)."},{"name":"is_vip","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is vip (equality)."},{"name":"gender","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Gender (equality)."},{"name":"is_opt_in","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is opt in (equality)."},{"name":"is_opt_in_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Is opt in at \u2014 bare value for equality, or {gte|lte} as \u0022?is_opt_in_at[op]=value\u0022."},{"name":"timezone","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Timezone (equality)."},{"name":"phone_format_164","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Phone format 164 (equality)."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"customers":{"type":"array","items":{"$ref":"#\/components\/schemas\/Customer"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"post":{"operationId":"customers_create","summary":"Create","description":"Creates a customer from the same fields Update accepts. Every field is optional. Search by `email` or `phone_format_164` first: create does not deduplicate, so an existing customer with the same email or phone is not reused.\n\n### Required scope\n\n`customers.write`","x-required-scope":"customers.write","x-required-scopes":["customers.write"],"tags":["customers"],"security":[{"bearerAuth":["customers.write"]}],"responses":{"201":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"customer":{"$ref":"#\/components\/schemas\/Customer"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CustomerWrite"},"example":{"first_name":"Jane","last_name":"Doe","email":"jane@example.com"}}}}}},"\/rest\/customers\/merge":{"post":{"operationId":"customers_merge","summary":"Merge","description":"Merges two or more customers into one, picking the best-matching destination automatically. Duplicates have their blank fields filled in from the destination, their bookings\/trips\/waivers\/credit cards\/audit logs reparented onto the destination, and are then permanently deleted. A duplicate whose email does not match the destination (and is not blank or an OTA-generated address) is skipped rather than merged.\n\n### Required scope\n\n`customers.write`","x-required-scope":"customers.write","x-required-scopes":["customers.write"],"tags":["customers"],"security":[{"bearerAuth":["customers.write"]}],"responses":{"201":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"success":{"type":"boolean"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"}}}},"example":{"ids":["\u003Cpublic id 1\u003E","\u003Cpublic id 2\u003E"]}}}}}},"\/rest\/customers\/{id}":{"get":{"operationId":"customers_get","summary":"Get one","description":"Returns a single customer by id.\n\n### Required scope\n\n`customers.read`","x-required-scope":"customers.read","x-required-scopes":["customers.read"],"tags":["customers"],"security":[{"bearerAuth":["customers.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"customer":{"$ref":"#\/components\/schemas\/Customer"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"patch":{"operationId":"customers_update","summary":"Update","description":"Updates a customer. Only the fields you include are changed \u2014 omitted fields are left as-is.\n\n### Required scope\n\n`customers.write`","x-required-scope":"customers.write","x-required-scopes":["customers.write"],"tags":["customers"],"security":[{"bearerAuth":["customers.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"customer":{"$ref":"#\/components\/schemas\/Customer"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CustomerWrite"},"example":{"first_name":"Jane"}}}}},"delete":{"operationId":"customers_delete","summary":"Delete","description":"Permanently deletes a customer. Blocked (409) if the customer still has bookings, trips, waivers, credit cards, or CRM messages attached.\n\n### Required scope\n\n`customers.write`","x-required-scope":"customers.write","x-required-scopes":["customers.write"],"tags":["customers"],"security":[{"bearerAuth":["customers.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/experiences":{"get":{"operationId":"experiences_list","summary":"List","description":"Returns a paginated list of experiences, optionally filtered and sorted.\n\n### Required scope\n\n`experiences.read`","x-required-scope":"experiences.read","x-required-scopes":["experiences.read"],"tags":["experiences"],"security":[{"bearerAuth":["experiences.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: name."},{"name":"name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Name \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?name[op]=value\u0022."},{"name":"location_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Location ID (equality)."},{"name":"capacity_type_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Capacity type ID (equality)."},{"name":"experience_status","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Experience status (equality)."},{"name":"resource_assign_priority_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Resource assign priority id (equality)."},{"name":"is_customer_portal_auto_refund_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is customer portal auto refund enabled (equality)."},{"name":"is_customer_portal_auto_refund_on_reschedules_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is customer portal auto refund on reschedules enabled (equality)."},{"name":"customer_portal_cancel_window","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Customer portal cancel window \u2014 bare value for equality, or {eq|gte|lte} as \u0022?customer_portal_cancel_window[op]=value\u0022."},{"name":"customer_portal_reschedule_window","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Customer portal reschedule window \u2014 bare value for equality, or {eq|gte|lte} as \u0022?customer_portal_reschedule_window[op]=value\u0022."},{"name":"advertised_duration","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Advertised duration (equality)."},{"name":"booking_field_name_online_require_type_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Booking field name online require type ID (equality)."},{"name":"booking_field_group_name_online_require_type_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Booking field group name online require type ID (equality)."},{"name":"booking_field_email_online_require_type_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Booking field email online require type ID (equality)."},{"name":"booking_field_phone_online_require_type_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Booking field phone online require type ID (equality)."},{"name":"booking_field_name_offline_require_type_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Booking field name offline require type ID (equality)."},{"name":"booking_field_group_name_offline_require_type_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Booking field group name offline require type ID (equality)."},{"name":"booking_field_email_offline_require_type_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Booking field email offline require type ID (equality)."},{"name":"booking_field_phone_offline_require_type_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Booking field phone offline require type ID (equality)."},{"name":"color","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Color (equality)."},{"name":"capacity","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Capacity \u2014 bare value for equality, or {eq|gte|lte} as \u0022?capacity[op]=value\u0022."},{"name":"channel_limits_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Channel limits enabled (equality)."},{"name":"default_ecom_cap","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Default ecom cap \u2014 bare value for equality, or {eq|gte|lte} as \u0022?default_ecom_cap[op]=value\u0022."},{"name":"default_reseller_cap","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Default reseller cap \u2014 bare value for equality, or {eq|gte|lte} as \u0022?default_reseller_cap[op]=value\u0022."},{"name":"voucher_codes_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Voucher codes enabled (equality)."},{"name":"block_online_voucher_payments","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Block online voucher payments (equality)."},{"name":"is_limit_single_customer_type","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is limit single customer type (equality)."},{"name":"is_customer_type_qty_editable","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is customer type qty editable (equality)."},{"name":"is_default_quantity_set_to_0","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is default quantity set to 0 (equality)."},{"name":"is_auto_fill_buyer_as_first_guest","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is auto fill buyer as first guest (equality)."},{"name":"voucher_payment_type_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Voucher payment type ID (equality)."},{"name":"is_allow_manual_overbooking","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is allow manual overbooking (equality)."},{"name":"internal_name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Internal name \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?internal_name[op]=value\u0022."},{"name":"experience_deposit_type_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Experience deposit type ID (equality)."},{"name":"deposit_allow_pay_in_full","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Deposit allow pay in full (equality)."},{"name":"tax_1_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 1 is enabled (equality)."},{"name":"tax_2_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 2 is enabled (equality)."},{"name":"tax_3_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 3 is enabled (equality)."},{"name":"tax_4_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 4 is enabled (equality)."},{"name":"tax_5_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 5 is enabled (equality)."},{"name":"tax_6_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 6 is enabled (equality)."},{"name":"tax_7_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 7 is enabled (equality)."},{"name":"tax_8_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 8 is enabled (equality)."},{"name":"tax_9_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 9 is enabled (equality)."},{"name":"tax_10_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 10 is enabled (equality)."},{"name":"tax_11_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 11 is enabled (equality)."},{"name":"tax_12_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 12 is enabled (equality)."},{"name":"tax_13_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 13 is enabled (equality)."},{"name":"tax_14_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 14 is enabled (equality)."},{"name":"tax_15_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 15 is enabled (equality)."},{"name":"tax_16_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 16 is enabled (equality)."},{"name":"tax_17_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 17 is enabled (equality)."},{"name":"tax_18_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 18 is enabled (equality)."},{"name":"tax_19_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 19 is enabled (equality)."},{"name":"tax_20_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 20 is enabled (equality)."},{"name":"is_products_suggested_lead_only","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is products suggested lead only (equality)."},{"name":"is_show_create_new_avails","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is show create new avails (equality)."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"experiences":{"type":"array","items":{"$ref":"#\/components\/schemas\/Experience"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"post":{"operationId":"experiences_create","summary":"Create","description":"Creates a new experience. It is created as a draft \u2014 `location_id`, `capacity_type_id`, and `restriction_id` fall back to the account\u0027s defaults when omitted.\n\n### Required scope\n\n`experiences.write`","x-required-scope":"experiences.write","x-required-scopes":["experiences.write"],"tags":["experiences"],"security":[{"bearerAuth":["experiences.write"]}],"responses":{"201":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"experience":{"$ref":"#\/components\/schemas\/Experience"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ExperienceWrite"},"example":{"name":"Sunset Harbor Cruise","headline":"Two hours on the water at golden hour","description":"A guided sunset cruise around the harbor.","departure_point_name":"Pier 4","duration":120,"location_id":"\u003Clocation public id from a GET\u003E"}}}}}},"\/rest\/experiences\/{id}":{"get":{"operationId":"experiences_get","summary":"Get one","description":"Returns a single experience by id.\n\n### Required scope\n\n`experiences.read`","x-required-scope":"experiences.read","x-required-scopes":["experiences.read"],"tags":["experiences"],"security":[{"bearerAuth":["experiences.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"experience":{"$ref":"#\/components\/schemas\/Experience"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"patch":{"operationId":"experiences_update","summary":"Update","description":"Updates an experience. Only the fields you include are changed \u2014 omitted fields are left as-is.\n\n### Required scope\n\n`experiences.write`","x-required-scope":"experiences.write","x-required-scopes":["experiences.write"],"tags":["experiences"],"security":[{"bearerAuth":["experiences.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"experience":{"$ref":"#\/components\/schemas\/Experience"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ExperienceWrite"},"example":{"headline":"Two hours on the water at golden hour"}}}}},"delete":{"operationId":"experiences_delete","summary":"Delete","description":"Permanently deletes an experience. Blocked (409) if it still has bookings \u2014 cancel or move those bookings first.\n\n### Required scope\n\n`experiences.write`","x-required-scope":"experiences.write","x-required-scopes":["experiences.write"],"tags":["experiences"],"security":[{"bearerAuth":["experiences.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/experiences\/{id}\/waiver-configs":{"get":{"operationId":"experience_waiver_configs_list","summary":"List","description":"Returns the waiver configs attached to this experience, in display order.\n\n### Required scope\n\n`experiences.read`","x-required-scope":"experiences.read","x-required-scopes":["experiences.read"],"tags":["experience-waiver-configs"],"security":[{"bearerAuth":["experiences.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"experience_waiver_config":{"$ref":"#\/components\/schemas\/ExperienceWaiverConfig"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"post":{"operationId":"experience_waiver_configs_add","summary":"Add","description":"Attaches a waiver type to this experience. Max 3 configs per experience; one config per waiver type.\n\n### Required scope\n\n`experiences.write`","x-required-scope":"experiences.write","x-required-scopes":["experiences.write"],"tags":["experience-waiver-configs"],"security":[{"bearerAuth":["experiences.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"experience_waiver_config":{"$ref":"#\/components\/schemas\/ExperienceWaiverConfig"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"waiver_type_id":{"type":"integer"}}},"example":{"waiver_type_id":12}}}}}},"\/rest\/experiences\/{id}\/waiver-configs\/reorder":{"put":{"operationId":"experience_waiver_configs_reorder","summary":"Reorder","description":"Reorders this experience\u0027s waiver configs. `order` is a list of waiver config ids in the desired display order.\n\n### Required scope\n\n`experiences.write`","x-required-scope":"experiences.write","x-required-scopes":["experiences.write"],"tags":["experience-waiver-configs"],"security":[{"bearerAuth":["experiences.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"experience_waiver_config":{"$ref":"#\/components\/schemas\/ExperienceWaiverConfig"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/experiences\/{id}\/waiver-configs\/{config}":{"patch":{"operationId":"experience_waiver_configs_update","summary":"Update","description":"Updates a waiver config. Only the fields you include are changed.\n\n### Required scope\n\n`experiences.write`","x-required-scope":"experiences.write","x-required-scopes":["experiences.write"],"tags":["experience-waiver-configs"],"security":[{"bearerAuth":["experiences.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},{"name":"config","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"experience_waiver_config":{"$ref":"#\/components\/schemas\/ExperienceWaiverConfig"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"waiver_option_overrides":{"type":"object","properties":{"4":{"type":"integer"}}}}},"example":{"waiver_option_overrides":{"4":1}}}}}},"delete":{"operationId":"experience_waiver_configs_delete","summary":"Delete","description":"Removes a waiver config from this experience.\n\n### Required scope\n\n`experiences.write`","x-required-scope":"experiences.write","x-required-scopes":["experiences.write"],"tags":["experience-waiver-configs"],"security":[{"bearerAuth":["experiences.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},{"name":"config","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/gift-cards":{"get":{"operationId":"gift_cards_list","summary":"List","description":"Returns a paginated list of gift cards, optionally filtered and sorted.\n\n### Required scope\n\n`gift-cards.read`","x-required-scope":"gift-cards.read","x-required-scopes":["gift-cards.read"],"tags":["gift-cards"],"security":[{"bearerAuth":["gift-cards.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: created_at, current_balance."},{"name":"id","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Id \u2014 bare value for equality, or {eq|gte|lte} as \u0022?id[op]=value\u0022."},{"name":"trip_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Trip ID (equality)."},{"name":"code","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Code (equality)."},{"name":"created_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Created at \u2014 bare value for equality, or {eq|gte|lte} as \u0022?created_at[op]=value\u0022."},{"name":"current_balance","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Current balance \u2014 bare value for equality, or {eq|gte|lte} as \u0022?current_balance[op]=value\u0022."},{"name":"is_price_hidden","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is price hidden (equality)."},{"name":"is_complimentary","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is complimentary (equality)."},{"name":"gift_card_status","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Gift card status (equality)."},{"name":"gift_card_style_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Gift card style ID (equality)."},{"name":"expiration_date","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Expiration date \u2014 bare value for equality, or {eq|gte|lte} as \u0022?expiration_date[op]=value\u0022."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"gift_cards":{"type":"array","items":{"$ref":"#\/components\/schemas\/GiftCard"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"post":{"operationId":"gift_cards_create","summary":"Create","description":"Creates a gift card and attaches it to an existing trip \u2014 `trip_id` is required.\n\n### Required scope\n\n`gift-cards.write`","x-required-scope":"gift-cards.write","x-required-scopes":["gift-cards.write"],"tags":["gift-cards"],"security":[{"bearerAuth":["gift-cards.write"]}],"responses":{"201":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"gift_card":{"$ref":"#\/components\/schemas\/GiftCard"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"A gift card cannot be added because its trip is locked.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GiftCardWrite"},"example":{"trip_id":"\u003Ctrip public id from a GET\u003E","to_full_name":"Alex Rivera","to_email":"alex@example.com"}}}}}},"\/rest\/gift-cards\/styles":{"get":{"operationId":"gift_cards_list_styles","summary":"List styles","description":"Returns the gift card styles available to choose from \u2014 the value to use for `gift_card_style_id` when creating or updating a gift card.\n\n### Required scope\n\n`gift-cards.read`","x-required-scope":"gift-cards.read","x-required-scopes":["gift-cards.read"],"tags":["gift-cards"],"security":[{"bearerAuth":["gift-cards.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: created_at, current_balance."},{"name":"id","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Id \u2014 bare value for equality, or {eq|gte|lte} as \u0022?id[op]=value\u0022."},{"name":"trip_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Trip ID (equality)."},{"name":"code","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Code (equality)."},{"name":"created_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Created at \u2014 bare value for equality, or {eq|gte|lte} as \u0022?created_at[op]=value\u0022."},{"name":"current_balance","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Current balance \u2014 bare value for equality, or {eq|gte|lte} as \u0022?current_balance[op]=value\u0022."},{"name":"is_price_hidden","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is price hidden (equality)."},{"name":"is_complimentary","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is complimentary (equality)."},{"name":"gift_card_status","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Gift card status (equality)."},{"name":"gift_card_style_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Gift card style ID (equality)."},{"name":"expiration_date","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Expiration date \u2014 bare value for equality, or {eq|gte|lte} as \u0022?expiration_date[op]=value\u0022."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"success":{"type":"boolean"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/gift-cards\/{id}":{"get":{"operationId":"gift_cards_get","summary":"Get one","description":"Returns a single gift card by id.\n\n### Required scope\n\n`gift-cards.read`","x-required-scope":"gift-cards.read","x-required-scopes":["gift-cards.read"],"tags":["gift-cards"],"security":[{"bearerAuth":["gift-cards.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"gift_card":{"$ref":"#\/components\/schemas\/GiftCard"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"patch":{"operationId":"gift_cards_update","summary":"Update","description":"Updates a gift card. Only the fields you include are changed \u2014 omitted fields are left as-is.\n\n### Required scope\n\n`gift-cards.write`","x-required-scope":"gift-cards.write","x-required-scopes":["gift-cards.write"],"tags":["gift-cards"],"security":[{"bearerAuth":["gift-cards.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"gift_card":{"$ref":"#\/components\/schemas\/GiftCard"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GiftCardWrite"},"example":{"to_full_name":"Alex Rivera"}}}}},"delete":{"operationId":"gift_cards_delete","summary":"Delete","description":"Permanently deletes a gift card.\n\n### Required scope\n\n`gift-cards.write`","x-required-scope":"gift-cards.write","x-required-scopes":["gift-cards.write"],"tags":["gift-cards"],"security":[{"bearerAuth":["gift-cards.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"This gift card cannot be removed because its trip is locked.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/gift-cards\/{id}\/activate":{"post":{"operationId":"gift_cards_activate","summary":"Activate","description":"Activates a gift card, making its balance usable. A gift card can\u0027t be reloaded or redeemed until it has been activated.\n\n### Required scope\n\n`gift-cards.write`","x-required-scope":"gift-cards.write","x-required-scopes":["gift-cards.write"],"tags":["gift-cards"],"security":[{"bearerAuth":["gift-cards.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"gift_card":{"$ref":"#\/components\/schemas\/GiftCard"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/gift-cards\/{id}\/reload":{"post":{"operationId":"gift_cards_reload","summary":"Reload","description":"Adds funds to an already-activated gift card. Requires a positive `amount`, in cents. Reloading sets the card to pending until the paying trip settles.\n\n### Required scope\n\n`gift-cards.write`","x-required-scope":"gift-cards.write","x-required-scopes":["gift-cards.write"],"tags":["gift-cards"],"security":[{"bearerAuth":["gift-cards.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"gift_card":{"$ref":"#\/components\/schemas\/GiftCard"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"This gift card cannot be reloaded because it is deleted or expired.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"amount":{"type":"integer"}}},"example":{"amount":2500}}}}}},"\/rest\/locations":{"get":{"operationId":"locations_list","summary":"List","description":"Returns a paginated list of locations, optionally filtered and sorted.\n\n### Required scope\n\n`locations.read`","x-required-scope":"locations.read","x-required-scopes":["locations.read"],"tags":["locations"],"security":[{"bearerAuth":["locations.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: name."},{"name":"id","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Id \u2014 bare value for equality, or {eq|gte|lte} as \u0022?id[op]=value\u0022."},{"name":"name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Name \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?name[op]=value\u0022."},{"name":"is_live","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is live (equality)."},{"name":"country_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Country ID (equality)."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"locations":{"type":"array","items":{"$ref":"#\/components\/schemas\/Location"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"post":{"operationId":"locations_create","summary":"Create","description":"Creates a new location.\n\n### Required scope\n\n`locations.write`","x-required-scope":"locations.write","x-required-scopes":["locations.write"],"tags":["locations"],"security":[{"bearerAuth":["locations.write"]}],"responses":{"201":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"location":{"$ref":"#\/components\/schemas\/Location"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/LocationWrite"},"example":{"name":"Main Location","timezone":"America\/New_York","country_id":"\u003Ccountry public id from a GET\u003E"}}}}}},"\/rest\/locations\/{id}":{"get":{"operationId":"locations_get","summary":"Get one","description":"Returns a single location by id.\n\n### Required scope\n\n`locations.read`","x-required-scope":"locations.read","x-required-scopes":["locations.read"],"tags":["locations"],"security":[{"bearerAuth":["locations.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"location":{"$ref":"#\/components\/schemas\/Location"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"patch":{"operationId":"locations_update","summary":"Update","description":"Updates a location. Only the fields you include are changed \u2014 omitted fields are left as-is.\n\n### Required scope\n\n`locations.write`","x-required-scope":"locations.write","x-required-scopes":["locations.write"],"tags":["locations"],"security":[{"bearerAuth":["locations.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"location":{"$ref":"#\/components\/schemas\/Location"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"A location\u0027s country can\u0027t be changed after it is created.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/LocationWrite"},"example":{"name":"Downtown"}}}}},"delete":{"operationId":"locations_delete","summary":"Delete","description":"Permanently deletes a location. Blocked (409) if this is the account\u0027s only location, or if it\u0027s still referenced by an experience, trip, trip order, card reader, or shipment \u2014 archive it instead.\n\n### Required scope\n\n`locations.write`","x-required-scope":"locations.write","x-required-scopes":["locations.write"],"tags":["locations"],"security":[{"bearerAuth":["locations.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/manifest":{"get":{"operationId":"manifests_get","summary":"Get manifest","description":"Returns the day-of guest roster \u2014 who is booked on which departure, with each guest\u0027s check-in time, waiver status, custom field answers, pickup point and what is still owed. Pass date for a single day, or date_from and date_to for a range of up to 31 days. Results are a flat list of trip orders ordered by departure time and paged with a cursor; each trip order nests its lead booker, payment summary, waiver counts and per-guest bookings. Requires both the manifest.read and bookings.read scopes, because every row carries guest personal data. Cancelled trip orders are left out by default, as on the manifest screen: pass include_cancelled=true to list them alongside the rest, or status=cancelled to list only the cancellations. Notes come in two forms on every trip order \u2014 note, the single note on that order (often entered by the guest at booking), and notes, the staff notes on the whole reservation \u2014 and both are returned without any parameter. To check guests in, send the booking ids from an entry\u0027s bookings list to POST \/rest\/bookings\/set-status with status checked-in (add dry_run to preview the warnings first).\n\n### Required scopes\n\n`manifest.read`, `bookings.read`","x-required-scope":"manifest.read","x-required-scopes":["manifest.read","bookings.read"],"tags":["manifests"],"security":[{"bearerAuth":["manifest.read","bookings.read"]}],"parameters":[{"name":"date","in":"query","required":false,"description":"A single day, YYYY-MM-DD. Shorthand for date_from and date_to being the same day. Required unless date_from is given; takes precedence over date_from and date_to if both are sent.","schema":{"type":"string","format":"date"},"example":"2026-10-02"},{"name":"date_from","in":"query","required":false,"description":"First day of a range, YYYY-MM-DD. Required unless date is given.","schema":{"type":"string","format":"date"},"example":"2026-10-02"},{"name":"date_to","in":"query","required":false,"description":"Last day of a range, YYYY-MM-DD, inclusive. Defaults to date_from. Must not be before date_from, and the range may span at most 31 days.","schema":{"type":"string","format":"date"},"example":"2026-10-08"},{"name":"experience_id","in":"query","required":false,"description":"Only trip orders for this experience, by its public id (the id the Experiences resource returns).","schema":{"type":"string","format":"uuid"}},{"name":"timeslot_id","in":"query","required":false,"description":"Only trip orders on this one departure. Use the timeslot_id value from a previous manifest row.","schema":{"type":"integer"},"example":18342},{"name":"status","in":"query","required":false,"description":"Only trip orders with this status slug, booked or cancelled. Pass cancelled to see only cancellations.","schema":{"type":"string","enum":["booked","cancelled"]},"example":"booked"},{"name":"booking_status","in":"query","required":false,"description":"Only trip orders with at least one guest in this check-in state. An account\u0027s own custom booking statuses are matched by their name instead. The whole trip order is returned, including its other guests, so not-checked-in finds parties that still have someone to check in.","schema":{"type":"string","enum":["not-checked-in","checked-in","no-show"]},"example":"not-checked-in"},{"name":"customer_type","in":"query","required":false,"description":"Only trip orders with at least one guest holding this ticket type, matched by its exact name.","schema":{"type":"string"},"example":"Adult"},{"name":"waiver_status","in":"query","required":false,"description":"Only trip orders with at least one guest whose waiver status has this slug. Use it to find parties with outstanding waivers.","schema":{"type":"string"},"example":"signed"},{"name":"resource","in":"query","required":false,"description":"Only trip orders with at least one guest assigned to a resource whose name contains this text \u2014 a boat name, an aircraft tail number or a guide. Use it to see everyone on one vessel or aircraft.","schema":{"type":"string"},"example":"N403TD"},{"name":"has_reseller","in":"query","required":false,"description":"true for trips sold through a reseller or partner, false for direct bookings.","schema":{"type":"boolean"}},{"name":"pickup","in":"query","required":false,"description":"Only trip orders whose pickup location title or pickup choice name contains this text.","schema":{"type":"string"},"example":"Marriott"},{"name":"has_pickup","in":"query","required":false,"description":"true for parties that have a pickup, false for self-transport.","schema":{"type":"boolean"}},{"name":"balance_due","in":"query","required":false,"description":"true for trips that still owe money (balance due including fees above zero), false for fully paid trips.","schema":{"type":"boolean"}},{"name":"include_cancelled","in":"query","required":false,"description":"Cancelled trip orders are hidden by default, as on the manifest screen. Pass true to list them as well.","schema":{"type":"boolean","default":false}},{"name":"location_id","in":"query","required":false,"description":"Only trip orders for experiences at this location, by public id (the id the Locations resource returns).","schema":{"type":"string","format":"uuid"}},{"name":"experience","in":"query","required":false,"description":"Only trip orders whose experience name contains this text. Use experience_id for an exact experience.","schema":{"type":"string"},"example":"sunset"},{"name":"reseller","in":"query","required":false,"description":"Only trip orders sold through a reseller or partner whose name contains this text.","schema":{"type":"string"},"example":"Harbor Hotel"},{"name":"per_page","in":"query","required":false,"description":"Trip orders per page.","schema":{"type":"integer","default":25,"minimum":1,"maximum":25}},{"name":"cursor","in":"query","required":false,"description":"The next_cursor from the previous page. Send the same date and filter parameters with it.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"allOf":[{"type":"object","properties":{"success":{"type":"boolean"}}},{"$ref":"#\/components\/schemas\/ManifestResponse"}]}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/phone-calls":{"get":{"operationId":"phone_calls_list","summary":"List","description":"Returns a paginated list of phone calls, optionally filtered and sorted.\n\n### Required scope\n\n`phone-calls.read`","x-required-scope":"phone-calls.read","x-required-scopes":["phone-calls.read"],"tags":["phone-calls"],"security":[{"bearerAuth":["phone-calls.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: created_at."},{"name":"id","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Id \u2014 bare value for equality, or {eq|gte|lte} as \u0022?id[op]=value\u0022."},{"name":"created_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Created at \u2014 bare value for equality, or {eq|gte|lte} as \u0022?created_at[op]=value\u0022."},{"name":"caller_number","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Caller number \u2014 bare value for equality, or {eq|contains} as \u0022?caller_number[op]=value\u0022."},{"name":"duration","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Duration \u2014 bare value for equality, or {eq|gte|lte} as \u0022?duration[op]=value\u0022."},{"name":"caller_state","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Caller state (equality)."},{"name":"caller_city","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Caller city \u2014 bare value for equality, or {eq|contains} as \u0022?caller_city[op]=value\u0022."},{"name":"recording_media_filename","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Recording media filename (equality)."},{"name":"caller_name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Caller name \u2014 bare value for equality, or {eq|contains} as \u0022?caller_name[op]=value\u0022."},{"name":"summary","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Summary \u2014 bare value for equality, or {eq|contains} as \u0022?summary[op]=value\u0022."},{"name":"call_disposition","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Call disposition \u2014 bare value for equality, or {eq|contains} as \u0022?call_disposition[op]=value\u0022."},{"name":"caller_ai_name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Caller ai name \u2014 bare value for equality, or {eq|contains} as \u0022?caller_ai_name[op]=value\u0022."},{"name":"agent_ai_name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Agent ai name \u2014 bare value for equality, or {eq|contains} as \u0022?agent_ai_name[op]=value\u0022."},{"name":"speaker_a","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Speaker a (equality)."},{"name":"speaker_b","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Speaker b (equality)."},{"name":"abstract","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Abstract \u2014 bare value for equality, or {eq|contains} as \u0022?abstract[op]=value\u0022."},{"name":"event_type","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Event type (equality)."},{"name":"integration_type","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Integration type (equality)."},{"name":"csat","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Csat \u2014 bare value for equality, or {eq|gte|lte} as \u0022?csat[op]=value\u0022."},{"name":"started_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Started at \u2014 bare value for equality, or {eq|gte|lte} as \u0022?started_at[op]=value\u0022."},{"name":"ended_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Ended at \u2014 bare value for equality, or {eq|gte|lte} as \u0022?ended_at[op]=value\u0022."},{"name":"outcome","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Outcome (equality)."},{"name":"flagged_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Flagged at \u2014 bare value for equality, or {eq|gte|lte} as \u0022?flagged_at[op]=value\u0022."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"phone_calls":{"type":"array","items":{"$ref":"#\/components\/schemas\/PhoneCall"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/phone-calls\/tags":{"get":{"operationId":"phone_call_tags_list","summary":"List","description":"Returns a paginated list of phone call tags, optionally filtered and sorted.\n\n### Required scope\n\n`phone-calls.read`","x-required-scope":"phone-calls.read","x-required-scopes":["phone-calls.read"],"tags":["phone-call-tags"],"security":[{"bearerAuth":["phone-calls.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"phone_call_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Phone call ID (equality)."},{"name":"phone_call_tag_type","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Phone call tag type (equality)."},{"name":"value","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Value \u2014 bare value for equality, or {eq|contains} as \u0022?value[op]=value\u0022."},{"name":"additional_detail","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Additional detail \u2014 bare value for equality, or {eq|contains} as \u0022?additional_detail[op]=value\u0022."},{"name":"sentiment","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Sentiment (equality)."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"success":{"type":"boolean"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/phone-calls\/tags\/{id}":{"get":{"operationId":"phone_call_tags_get","summary":"Get one","description":"Returns a single phone call tag by id.\n\n### Required scope\n\n`phone-calls.read`","x-required-scope":"phone-calls.read","x-required-scopes":["phone-calls.read"],"tags":["phone-call-tags"],"security":[{"bearerAuth":["phone-calls.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"phone_call_tag":{"$ref":"#\/components\/schemas\/PhoneCallTag"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/phone-calls\/{id}":{"get":{"operationId":"phone_calls_get","summary":"Get one","description":"Returns a single phone call by id.\n\n### Required scope\n\n`phone-calls.read`","x-required-scope":"phone-calls.read","x-required-scopes":["phone-calls.read"],"tags":["phone-calls"],"security":[{"bearerAuth":["phone-calls.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"phone_call":{"$ref":"#\/components\/schemas\/PhoneCall"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/promo-codes":{"get":{"operationId":"promo_codes_list","summary":"List","description":"Returns a paginated list of promo codes, optionally filtered and sorted.\n\n### Required scope\n\n`promo-codes.read`","x-required-scope":"promo-codes.read","x-required-scopes":["promo-codes.read"],"tags":["promo-codes"],"security":[{"bearerAuth":["promo-codes.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: code, internal_name."},{"name":"id","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Id \u2014 bare value for equality, or {eq|gte|lte} as \u0022?id[op]=value\u0022."},{"name":"code","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Code \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?code[op]=value\u0022."},{"name":"internal_name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Internal name \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?internal_name[op]=value\u0022."},{"name":"public_name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Public name \u2014 bare value for equality, or {eq|contains} as \u0022?public_name[op]=value\u0022."},{"name":"amount","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Amount \u2014 bare value for equality, or {eq|gte|lte} as \u0022?amount[op]=value\u0022."},{"name":"percent","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Percent \u2014 bare value for equality, or {eq|gte|lte} as \u0022?percent[op]=value\u0022."},{"name":"promo_code_redeem_type_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Promo code redeem type ID (equality)."},{"name":"promo_code_status_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Promo code status ID (equality)."},{"name":"limit_use_on_ecommerce","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Limit use on ecommerce (equality)."},{"name":"set_price","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Set price \u2014 bare value for equality, or {eq|gte|lte} as \u0022?set_price[op]=value\u0022."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"promo_codes":{"type":"array","items":{"$ref":"#\/components\/schemas\/PromoCode"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"post":{"operationId":"promo_codes_create","summary":"Create","description":"Creates a new promo code. At least one experience id is required.\n\n### Required scope\n\n`promo-codes.write`","x-required-scope":"promo-codes.write","x-required-scopes":["promo-codes.write"],"tags":["promo-codes"],"security":[{"bearerAuth":["promo-codes.write"]}],"responses":{"201":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"promo_code":{"$ref":"#\/components\/schemas\/PromoCode"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/PromoCodeWrite"},"example":{"code":"SUMMER10","internal_name":"Summer promo","percent":10,"promo_code_redeem_type_id":2,"experience_ids":["\u003Cexperience public id\u003E"]}}}}}},"\/rest\/promo-codes\/{id}":{"get":{"operationId":"promo_codes_get","summary":"Get one","description":"Returns a single promo code by id.\n\n### Required scope\n\n`promo-codes.read`","x-required-scope":"promo-codes.read","x-required-scopes":["promo-codes.read"],"tags":["promo-codes"],"security":[{"bearerAuth":["promo-codes.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"promo_code":{"$ref":"#\/components\/schemas\/PromoCode"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"patch":{"operationId":"promo_codes_update","summary":"Update","description":"Updates a promo code. Only the fields you include are changed \u2014 omitted fields are left as-is. experiences\/customerTypes are not writable via this endpoint in v1.\n\n### Required scope\n\n`promo-codes.write`","x-required-scope":"promo-codes.write","x-required-scopes":["promo-codes.write"],"tags":["promo-codes"],"security":[{"bearerAuth":["promo-codes.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"promo_code":{"$ref":"#\/components\/schemas\/PromoCode"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/PromoCodeWrite"},"example":{"percent":15}}}}},"delete":{"operationId":"promo_codes_delete","summary":"Delete","description":"Permanently deletes a promo code. Blocked (409) if the code has already been redeemed on an order.\n\n### Required scope\n\n`promo-codes.write`","x-required-scope":"promo-codes.write","x-required-scopes":["promo-codes.write"],"tags":["promo-codes"],"security":[{"bearerAuth":["promo-codes.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/report-runs":{"get":{"operationId":"report_runs_list","summary":"List runs","description":"Returns a paginated list of report runs across all reports, newest first. Filter with `?report_type=sales_detail.1`, `?report_run_status=succeeded|pending|failed` or `?created_at[gte]=`. Sort with `?sort=created_at`.\n\n### Required scope\n\n`reports.read`","x-required-scope":"reports.read","x-required-scopes":["reports.read"],"tags":["report-runs"],"security":[{"bearerAuth":["reports.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: created_at."},{"name":"report_type","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Report type (equality)."},{"name":"report_run_status","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Report run status (equality)."},{"name":"created_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Created at \u2014 bare value for equality, or {eq|gte|lte} as \u0022?created_at[op]=value\u0022."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"report_runs":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"report_type":{"type":"string"},"report_run_status":{"type":"string"},"parameters":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"date_field":{"type":"string"},"format":{"type":"string"}}},"row_count":{"type":"integer"},"created_at":{"type":"string"},"completed_at":{"type":"string"},"error":{"type":"string"},"download_url":{"type":"string"},"download_url_expires_at":{"type":"string"}}}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":"string"}}}},"example":{"success":true,"report_runs":[{"id":"3f2c0a52-9b1e-4f6d-8a47-5d2e1c7b9a10","report_type":"sales_detail.1","report_run_status":"succeeded","parameters":{"date_from":"2026-09-01","date_to":"2026-09-30","date_field":"created","format":"jsonl"},"row_count":1423,"created_at":"2026-10-06T14:02:11+00:00","completed_at":"2026-10-06T14:02:19+00:00","error":null,"download_url":"https:\/\/files.example.com\/sales_detail_3f2c0a52.jsonl?signature=...","download_url_expires_at":"2026-10-06T14:17:19+00:00"}],"meta":{"per_page":25,"has_more":false,"next_cursor":null}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"post":{"operationId":"report_runs_create","summary":"Create run","description":"Queues a run of the report named by `report_type` and returns `202` with the pending run.\n\nPoll the run until `report_run_status` is `succeeded`, then download the file from `download_url`.\n\nAt most 3 runs of a report may be pending at once. A fourth returns `429`.\n\n### Required scope\n\n`reports.read`","x-required-scope":"reports.read","x-required-scopes":["reports.read"],"tags":["report-runs"],"security":[{"bearerAuth":["reports.read"]}],"responses":{"202":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"report_run":{"type":"object","properties":{"id":{"type":"string"},"report_type":{"type":"string"},"report_run_status":{"type":"string"},"parameters":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"date_field":{"type":"string"},"format":{"type":"string"}}},"row_count":{"type":"string"},"created_at":{"type":"string"},"completed_at":{"type":"string"},"error":{"type":"string"},"download_url":{"type":"string"},"download_url_expires_at":{"type":"string"}}},"message":{"type":"string"}},"example":{"success":true,"report_run":{"id":"3f2c0a52-9b1e-4f6d-8a47-5d2e1c7b9a10","report_type":"sales_detail.1","report_run_status":"pending","parameters":{"date_from":"2026-09-01","date_to":"2026-09-30","date_field":"created","format":"jsonl"},"row_count":null,"created_at":"2026-10-06T14:02:11+00:00","completed_at":null,"error":null,"download_url":null,"download_url_expires_at":null},"message":"Report run queued."}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"oneOf":[{"type":"object","properties":{"report_type":{"type":"string","enum":["payment_detail.1"],"description":"The report to run."},"date_from":{"type":"string","description":"Required. First day to include, as Y-m-d."},"date_to":{"type":"string","description":"Required. Last day to include, as Y-m-d. The range may span at most 366 days."},"date_field":{"type":"string","description":"Which date the range applies to: `created` is when the payment was taken (the default) and `activity` is the trip\u0027s activity date."},"columns":{"type":"array","items":{"type":"string","enum":["id","created_at","amount","tip","fee_total","net_amount","currency","status.name","type.name","direction.name","card_type.name","ending_with","trip.uuid","trip.confirmation_code","fee_guest_total","fee_account_total","notes","is_card_present","tender_amount","change_given","voucher_number","status","status.id","type","type.id","direction","direction.id","card_type","card_type.id","payment_wallet_type","payment_wallet_type.id","payment_network","payment_network.id","payment_network.name","payment_network.slug","trip","trip.id","trip.created_at","trip.sale_date","trip.subtotal_nontaxable","trip.subtotal","trip.promo_code_discount","trip.voucher_code_discount","trip.pickup_total","trip.fees","trip.total","trip.paid","trip.due","trip.pax_count","trip.due_with_fees","trip.paid_with_fees","trip.total_with_fees","trip.reseller_commission","trip.commissionable_total","trip.non_commissionable_total","trip.reseller_commission_rate","trip.reseller_commission_fixed","trip.tip","trip.session_location_label","trip.tax_1_total","trip.tax_2_total","trip.tax_3_total","trip.tax_4_total","trip.tax_5_total","trip.tax_6_total","trip.tax_7_total","trip.tax_8_total","trip.tax_9_total","trip.tax_10_total","trip.tax_11_total","trip.tax_12_total","trip.tax_13_total","trip.tax_14_total","trip.tax_15_total","trip.tax_16_total","trip.tax_17_total","trip.tax_18_total","trip.tax_19_total","trip.tax_20_total","trip.total_sales","trip.products_cnt","trip.addons_cnt","trip.comped_pax_cnt","trip.voucher_number","payout_transaction","payout_transaction.id","payout_transaction.transaction_id","payout_transaction.created_at","payout_transaction.available_on","payout_transaction.amount","payout_transaction.fee","payout_transaction.net","payout_transaction.status","payout_transaction.description","payout_transaction.type","cash_drawer","cash_drawer.id","cash_drawer.name","card_reader","card_reader.id","card_reader.name"]},"description":"An array of column names to include, in order. Omit it for the default set, which is marked in Columns. A dotted name such as `trip.confirmation_code` reaches into a single related record.","default":["id","created_at","amount","tip","fee_total","net_amount","currency","status.name","type.name","direction.name","card_type.name","ending_with","trip.uuid","trip.confirmation_code"]},"format":{"type":"string","description":"The file format: `jsonl` (the default) or `csv`. See File formats in the Report types section.","enum":["jsonl","csv"],"default":"jsonl"}},"required":["report_type","date_from","date_to"],"title":"Payment Detail"},{"type":"object","properties":{"report_type":{"type":"string","enum":["sales_detail.1"],"description":"The report to run."},"date_from":{"type":"string","description":"Required. First day to include, as Y-m-d."},"date_to":{"type":"string","description":"Required. Last day to include, as Y-m-d. The range may span at most 366 days."},"date_field":{"type":"string","description":"Which date the range applies to: `created` (the default) or `activity`."},"filters":{"type":"object","properties":{"total":{"type":"object","properties":{"gte":{"type":"string"}}},"due":{"type":"object","properties":{"gt":{"type":"string"}}}},"description":"An object of trip field to value, or to `{operator: value}`. For example, `{\u0022due\u0022: {\u0022gt\u0022: \u00220\u0022}}` returns unpaid trips. Filterable fields: `confirmation_code` (eq), `created_at` (gte, lte), `reserved_at` (gte, lte), `sale_date` (eq, gte, lte), `trip_status` (eq), `trip_source_id` (eq), `customer_id` (eq), `flagged_at` (gte, lte), `subtotal` (eq, gt, gte, lt, lte), `total` (eq, gt, gte, lt, lte), `paid` (eq, gt, gte, lt, lte), `due` (eq, gt, gte, lt, lte), `created_by_user_avatar_id` (eq), `flagged_by_user_avatar_id` (eq), `flagged_to_user_avatar_id` (eq), `trip_method` (eq), `pax_count` (eq, gte, lte), `fixed_transaction_fee_guest` (eq, gt, gte, lt, lte), `fixed_transaction_fee_account` (eq, gt, gte, lt, lte), `fixed_transaction_fee_guest_offline` (eq, gt, gte, lt, lte), `fixed_transaction_fee_guest_amount` (eq, gt, gte, lt, lte), `fixed_transaction_fee_account_amount` (eq, gt, gte, lt, lte), `variable_transaction_fee_guest_amount` (eq, gt, gte, lt, lte), `variable_transaction_fee_account_amount` (eq, gt, gte, lt, lte), `fee_guest_total` (eq, gt, gte, lt, lte), `fee_account_total` (eq, gt, gte, lt, lte), `fee_total` (eq, gt, gte, lt, lte), `total_with_fees` (eq, gt, gte, lt, lte), `mkt_landing_url` (eq, begins_with), `mkt_referrer_url` (eq, begins_with), `mkt_cmp` (eq, begins_with), `mkt_adg` (eq), `mkt_keyword` (eq, begins_with), `mkt_ad_position` (eq), `location_id` (eq), `mkt_first_view` (gte, lte), `reseller_id` (eq), `reseller_commission` (eq, gt, gte, lt, lte), `commissionable_total` (eq, gt, gte, lt, lte), `non_commissionable_total` (eq, gt, gte, lt, lte), `currency` (eq), `reseller_collect_type` (eq), `reseller_commission_rate` (eq, gt, gte, lt, lte), `reseller_commission_type` (eq), `trip_gift_card_total` (eq, gt, gte, lt, lte), `tip` (eq, gt, gte, lt, lte), `session_page_views` (eq, gt, gte, lt, lte), `session_browser_size` (eq), `session_browser_version` (eq), `session_browser_name` (eq), `session_browser_user_agent` (eq, begins_with), `session_browser_device_type` (eq), `session_browser_os` (eq), `session_language` (eq), `session_locale` (eq), `mkt_gclid` (eq), `mkt_msclid` (eq), `mkt_fbclid` (eq), `session_location_label` (eq, begins_with), `trip_type` (eq), `cart_abandons_sent_at_conversion` (eq, gt, gte, lt, lte), `is_automated_conversion` (eq), `is_assisted_conversion` (eq), `trip_unlocked_override` (eq), `tax_1_total` (eq, gt, gte, lt, lte), `tax_2_total` (eq, gt, gte, lt, lte), `tax_3_total` (eq, gt, gte, lt, lte), `tax_4_total` (eq, gt, gte, lt, lte), `tax_5_total` (eq, gt, gte, lt, lte), `tax_6_total` (eq, gt, gte, lt, lte), `tax_7_total` (eq, gt, gte, lt, lte), `tax_8_total` (eq, gt, gte, lt, lte), `tax_9_total` (eq, gt, gte, lt, lte), `tax_10_total` (eq, gt, gte, lt, lte), `tax_11_total` (eq, gt, gte, lt, lte), `tax_12_total` (eq, gt, gte, lt, lte), `tax_13_total` (eq, gt, gte, lt, lte), `tax_14_total` (eq, gt, gte, lt, lte), `tax_15_total` (eq, gt, gte, lt, lte), `tax_16_total` (eq, gt, gte, lt, lte), `tax_17_total` (eq, gt, gte, lt, lte), `tax_18_total` (eq, gt, gte, lt, lte), `tax_19_total` (eq, gt, gte, lt, lte), `tax_20_total` (eq, gt, gte, lt, lte), `total_sales` (eq, gt, gte, lt, lte), `products_cnt` (eq, gt, gte, lt, lte), `addons_cnt` (eq, gt, gte, lt, lte), `comped_pax_cnt` (eq, gt, gte, lt, lte), `voucher_number` (eq), `group_name` (eq, begins_with)."},"columns":{"type":"array","items":{"type":"string","enum":["id","uuid","confirmation_code","created_at","sale_date","trip_status.name","trip_method.name","source.name","location.name","customer.first_name","customer.last_name","customer.email","pax_count","subtotal","promo_code_discount","voucher_code_discount","pickup_total","fees","total","tip","total_with_fees","paid","due","total_sales","reseller.name","reseller_commission","reserved_at","subtotal_nontaxable","fixed_transaction_fee_guest","fixed_transaction_fee_account","variable_transaction_fee_guest","variable_transaction_fee_account","variable_transaction_fee_guest_offline","fixed_transaction_fee_guest_offline","fixed_transaction_fee_guest_amount","fixed_transaction_fee_account_amount","variable_transaction_fee_guest_amount","variable_transaction_fee_account_amount","fee_guest_total","fee_account_total","fee_total","due_with_fees","paid_with_fees","fees_earned","mkt_landing_url","mkt_referrer_url","mkt_cmp","mkt_adg","mkt_keyword","mkt_ad_position","last_funnel_step_name","mkt_first_view","commissionable_total","non_commissionable_total","reseller_commission_rate","reseller_commission_fixed","session_browser_device_type","session_location_label","sales_revenue_total_at_conversion","cart_abandons_sent_at_conversion","is_automated_conversion","is_assisted_conversion","tax_1_total","tax_2_total","tax_3_total","tax_4_total","tax_5_total","tax_6_total","tax_7_total","tax_8_total","tax_9_total","tax_10_total","tax_11_total","tax_12_total","tax_13_total","tax_14_total","tax_15_total","tax_16_total","tax_17_total","tax_18_total","tax_19_total","tax_20_total","products_cnt","addons_cnt","comped_pax_cnt","voucher_number","group_name","trip_status","trip_status.id","trip_status.color","trip_status.slug","trip_method","trip_method.id","trip_method.color","trip_method.slug","reseller_collect_type","reseller_collect_type.id","reseller_collect_type.name","reseller_collect_type.slug","trip_type","trip_type.id","trip_type.slug","trip_type.name","source","source.id","source.uuid","source.color","customer","customer.id","customer.uuid","customer.created_at","customer.code","customer.address1","customer.city","customer.state_code","customer.postal_code","customer.phone","customer.locale","customer.language","customer.avatar_url","customer.dob","customer.is_opt_in","customer.phone_format_164","created_by_user_avatar","created_by_user_avatar.id","created_by_user_avatar.uuid","created_by_user_avatar.first_name","created_by_user_avatar.last_name","created_by_user_avatar.email","created_by_user_avatar.is_tripworks_managed","location","location.id","location.uuid","reseller","reseller.id","reseller.uuid","reseller.code","reseller.commission_rate","reseller.credit_limit","reseller.accounting_contact_name","reseller.accounting_email","reseller.accounting_phone_number","reseller.tax_id","reseller.invoices_total","reseller.invoices_due","reseller.invoices_paid","reseller.trips_total","reseller.trips_pax_count","reseller.commission_total","reseller.is_dynamic_commission_rate","tripOrders","custom_field_values","notes","payments","voucher_codes"]},"description":"An array of column names to include, in order. Omit it for the default set, which is marked in Columns. A dotted name such as `customer.email` reaches into a single related record.","default":["id","uuid","confirmation_code","created_at","sale_date","trip_status.name","trip_method.name","source.name","location.name","customer.first_name","customer.last_name","customer.email","pax_count","subtotal","promo_code_discount","voucher_code_discount","pickup_total","fees","total","tip","total_with_fees","paid","due","total_sales","reseller.name","reseller_commission"]},"format":{"type":"string","description":"The file format: `jsonl` (the default) or `csv`. See File formats in the Report types section.","enum":["jsonl","csv"],"default":"jsonl"}},"required":["report_type","date_from","date_to"],"title":"Sales Detail"}]},"examples":{"payment_detail.1":{"value":{"report_type":"payment_detail.1","date_from":"2026-09-01","date_to":"2026-09-30","date_field":"created","columns":["id","created_at","amount","net_amount","status.name","trip.confirmation_code"]}},"sales_detail.1":{"value":{"report_type":"sales_detail.1","date_from":"2026-09-01","date_to":"2026-09-30","date_field":"created","filters":{"total":{"gte":"10000"},"due":{"gt":"0"}},"columns":["confirmation_code","created_at","customer.email","total","paid","due"]}}}}}}}},"\/rest\/report-runs\/{id}":{"get":{"operationId":"report_runs_get","summary":"Get run","description":"Returns one report run.\n\nA succeeded run includes `row_count`, `completed_at` and a `download_url` for the file in the format you chose. The link is signed and expires in 15 minutes. Each request returns a fresh one.\n\n### Required scope\n\n`reports.read`","x-required-scope":"reports.read","x-required-scopes":["reports.read"],"tags":["report-runs"],"security":[{"bearerAuth":["reports.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"report_run":{"type":"object","properties":{"id":{"type":"string"},"report_type":{"type":"string"},"report_run_status":{"type":"string"},"parameters":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"date_field":{"type":"string"},"format":{"type":"string"}}},"row_count":{"type":"integer"},"created_at":{"type":"string"},"completed_at":{"type":"string"},"error":{"type":"string"},"download_url":{"type":"string"},"download_url_expires_at":{"type":"string"}}}},"example":{"success":true,"report_run":{"id":"3f2c0a52-9b1e-4f6d-8a47-5d2e1c7b9a10","report_type":"sales_detail.1","report_run_status":"succeeded","parameters":{"date_from":"2026-09-01","date_to":"2026-09-30","date_field":"created","format":"jsonl"},"row_count":1423,"created_at":"2026-10-06T14:02:11+00:00","completed_at":"2026-10-06T14:02:19+00:00","error":null,"download_url":"https:\/\/files.example.com\/sales_detail_3f2c0a52.jsonl?signature=...","download_url_expires_at":"2026-10-06T14:17:19+00:00"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/reports":{"get":{"operationId":"report_types_list","summary":"List report types","description":"Returns every report you can run, with the parameters each one takes and every column it can return.\n\n### Required scope\n\n`reports.read`","x-required-scope":"reports.read","x-required-scopes":["reports.read"],"tags":["report-types"],"security":[{"bearerAuth":["reports.read"]}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"reports":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"version":{"type":"integer"},"name":{"type":"string"},"description":{"type":"string"},"parameters":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"}}},"columns":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"default":{"type":"boolean"}}}},"example":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"}}}}}}},"example":{"success":true,"reports":[{"id":"sales_detail.1","version":1,"name":"Sales Detail","description":"One row per trip in the date range.","parameters":{"date_from":"Required. First day to include, as Y-m-d.","date_to":"Required. Last day to include, as Y-m-d."},"columns":[{"name":"id","type":"integer","default":true},{"name":"confirmation_code","type":"string","default":true}],"example":{"date_from":"2026-09-01","date_to":"2026-09-30"}}]}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/reports\/payment_detail.1":{"get":{"operationId":"report_types_get_payment_detail_1","summary":"Payment Detail","description":"One row per successful payment in the date range, with the trip it was taken against. Amounts are integers in cents.\n\nA run that would return more than 1,000,000 rows fails. Narrow the date range.\n\n**Parameters**\n\n| Parameter | Description |\n| --- | --- |\n| `date_from` *required* | First day to include, as Y-m-d. |\n| `date_to` *required* | Last day to include, as Y-m-d. The range may span at most 366 days. |\n| `date_field` | Which date the range applies to: `created` is when the payment was taken (the default) and `activity` is the trip\u0027s activity date. |\n| `format` | The file format: `jsonl` (the default) or `csv`. See File formats in the Report types section. |\n| `columns` | An array of column names to include, in order. Omit it for the default set, which is marked in Columns. A dotted name such as `trip.confirmation_code` reaches into a single related record. |\n\n**Columns**\n\nEvery column this report can return. Columns marked default are returned when `columns` is omitted. A dotted name such as `customer.email` reaches into a single related record.\n\n| Column | Type | Default |\n| --- | --- | --- |\n| `id` | integer | \u2713 |\n| `created_at` | datetime | \u2713 |\n| `amount` | integer | \u2713 |\n| `tip` | integer | \u2713 |\n| `fee_total` | integer | \u2713 |\n| `net_amount` | integer | \u2713 |\n| `currency` | string | \u2713 |\n| `status.name` | string | \u2713 |\n| `type.name` | string | \u2713 |\n| `direction.name` | string | \u2713 |\n| `card_type.name` | string | \u2713 |\n| `ending_with` | string | \u2713 |\n| `trip.uuid` | uuid | \u2713 |\n| `trip.confirmation_code` | string | \u2713 |\n| `fee_guest_total` | integer |  |\n| `fee_account_total` | integer |  |\n| `notes` | text |  |\n| `is_card_present` | boolean |  |\n| `tender_amount` | integer |  |\n| `change_given` | integer |  |\n| `voucher_number` | string |  |\n| `status` | object |  |\n| `status.id` | integer |  |\n| `type` | object |  |\n| `type.id` | integer |  |\n| `direction` | object |  |\n| `direction.id` | integer |  |\n| `card_type` | object |  |\n| `card_type.id` | integer |  |\n| `payment_wallet_type` | object |  |\n| `payment_wallet_type.id` | integer |  |\n| `payment_network` | object |  |\n| `payment_network.id` | integer |  |\n| `payment_network.name` | string |  |\n| `payment_network.slug` | string |  |\n| `trip` | object |  |\n| `trip.id` | integer |  |\n| `trip.created_at` | datetime |  |\n| `trip.sale_date` | date |  |\n| `trip.subtotal_nontaxable` | integer |  |\n| `trip.subtotal` | integer |  |\n| `trip.promo_code_discount` | integer |  |\n| `trip.voucher_code_discount` | integer |  |\n| `trip.pickup_total` | integer |  |\n| `trip.fees` | integer |  |\n| `trip.total` | integer |  |\n| `trip.paid` | integer |  |\n| `trip.due` | integer |  |\n| `trip.pax_count` | integer |  |\n| `trip.due_with_fees` | integer |  |\n| `trip.paid_with_fees` | integer |  |\n| `trip.total_with_fees` | integer |  |\n| `trip.reseller_commission` | integer |  |\n| `trip.commissionable_total` | integer |  |\n| `trip.non_commissionable_total` | integer |  |\n| `trip.reseller_commission_rate` | integer |  |\n| `trip.reseller_commission_fixed` | integer |  |\n| `trip.tip` | integer |  |\n| `trip.session_location_label` | string |  |\n| `trip.tax_1_total` | integer |  |\n| `trip.tax_2_total` | integer |  |\n| `trip.tax_3_total` | integer |  |\n| `trip.tax_4_total` | integer |  |\n| `trip.tax_5_total` | integer |  |\n| `trip.tax_6_total` | integer |  |\n| `trip.tax_7_total` | integer |  |\n| `trip.tax_8_total` | integer |  |\n| `trip.tax_9_total` | integer |  |\n| `trip.tax_10_total` | integer |  |\n| `trip.tax_11_total` | integer |  |\n| `trip.tax_12_total` | integer |  |\n| `trip.tax_13_total` | integer |  |\n| `trip.tax_14_total` | integer |  |\n| `trip.tax_15_total` | integer |  |\n| `trip.tax_16_total` | integer |  |\n| `trip.tax_17_total` | integer |  |\n| `trip.tax_18_total` | integer |  |\n| `trip.tax_19_total` | integer |  |\n| `trip.tax_20_total` | integer |  |\n| `trip.total_sales` | integer |  |\n| `trip.products_cnt` | integer |  |\n| `trip.addons_cnt` | integer |  |\n| `trip.comped_pax_cnt` | integer |  |\n| `trip.voucher_number` | string |  |\n| `payout_transaction` | object |  |\n| `payout_transaction.id` | integer |  |\n| `payout_transaction.transaction_id` | string |  |\n| `payout_transaction.created_at` | datetime |  |\n| `payout_transaction.available_on` | datetime |  |\n| `payout_transaction.amount` | integer |  |\n| `payout_transaction.fee` | integer |  |\n| `payout_transaction.net` | integer |  |\n| `payout_transaction.status` | string |  |\n| `payout_transaction.description` | string |  |\n| `payout_transaction.type` | string |  |\n| `cash_drawer` | object |  |\n| `cash_drawer.id` | integer |  |\n| `cash_drawer.name` | string |  |\n| `card_reader` | object |  |\n| `card_reader.id` | integer |  |\n| `card_reader.name` | string |  |\n\n### Required scope\n\n`reports.read`","x-required-scope":"reports.read","x-required-scopes":["reports.read"],"tags":["report-types"],"security":[{"bearerAuth":["reports.read"]}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"report":{"type":"object","properties":{"id":{"type":"string"},"version":{"type":"integer"},"name":{"type":"string"},"description":{"type":"string"},"parameters":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"date_field":{"type":"string"},"format":{"type":"string"},"columns":{"type":"string"}}},"columns":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"default":{"type":"boolean"}}}},"example":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"date_field":{"type":"string"},"columns":{"type":"array","items":{"type":"string"}}}}}}},"example":{"success":true,"report":{"id":"payment_detail.1","version":1,"name":"Payment Detail","description":"One row per successful payment in the date range, with the trip it was taken against. Amounts are integers in cents.\n\nA run that would return more than 1,000,000 rows fails. Narrow the date range.","parameters":{"date_from":"Required. First day to include, as Y-m-d.","date_to":"Required. Last day to include, as Y-m-d. The range may span at most 366 days.","date_field":"Which date the range applies to: `created` is when the payment was taken (the default) and `activity` is the trip\u0027s activity date.","format":"The file format: `jsonl` (the default) or `csv`. See File formats in the Report types section.","columns":"An array of column names to include, in order. Omit it for the default set, which is marked in Columns. A dotted name such as `trip.confirmation_code` reaches into a single related record."},"columns":[{"name":"id","type":"integer","default":true},{"name":"created_at","type":"datetime","default":true},{"name":"amount","type":"integer","default":true}],"example":{"date_from":"2026-09-01","date_to":"2026-09-30","date_field":"created","columns":["id","created_at","amount","net_amount","status.name","trip.confirmation_code"]}}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/reports\/sales_detail.1":{"get":{"operationId":"report_types_get_sales_detail_1","summary":"Sales Detail","description":"One row per trip in the date range. Amounts are integers in cents.\n\nA run that would return more than 1,000,000 rows fails. Narrow the date range or add filters.\n\n**Parameters**\n\n| Parameter | Description |\n| --- | --- |\n| `date_from` *required* | First day to include, as Y-m-d. |\n| `date_to` *required* | Last day to include, as Y-m-d. The range may span at most 366 days. |\n| `date_field` | Which date the range applies to: `created` (the default) or `activity`. |\n| `filters` | An object of trip field to value, or to `{operator: value}`. For example, `{\u0022due\u0022: {\u0022gt\u0022: \u00220\u0022}}` returns unpaid trips. Filterable fields: `confirmation_code` (eq), `created_at` (gte, lte), `reserved_at` (gte, lte), `sale_date` (eq, gte, lte), `trip_status` (eq), `trip_source_id` (eq), `customer_id` (eq), `flagged_at` (gte, lte), `subtotal` (eq, gt, gte, lt, lte), `total` (eq, gt, gte, lt, lte), `paid` (eq, gt, gte, lt, lte), `due` (eq, gt, gte, lt, lte), `created_by_user_avatar_id` (eq), `flagged_by_user_avatar_id` (eq), `flagged_to_user_avatar_id` (eq), `trip_method` (eq), `pax_count` (eq, gte, lte), `fixed_transaction_fee_guest` (eq, gt, gte, lt, lte), `fixed_transaction_fee_account` (eq, gt, gte, lt, lte), `fixed_transaction_fee_guest_offline` (eq, gt, gte, lt, lte), `fixed_transaction_fee_guest_amount` (eq, gt, gte, lt, lte), `fixed_transaction_fee_account_amount` (eq, gt, gte, lt, lte), `variable_transaction_fee_guest_amount` (eq, gt, gte, lt, lte), `variable_transaction_fee_account_amount` (eq, gt, gte, lt, lte), `fee_guest_total` (eq, gt, gte, lt, lte), `fee_account_total` (eq, gt, gte, lt, lte), `fee_total` (eq, gt, gte, lt, lte), `total_with_fees` (eq, gt, gte, lt, lte), `mkt_landing_url` (eq, begins_with), `mkt_referrer_url` (eq, begins_with), `mkt_cmp` (eq, begins_with), `mkt_adg` (eq), `mkt_keyword` (eq, begins_with), `mkt_ad_position` (eq), `location_id` (eq), `mkt_first_view` (gte, lte), `reseller_id` (eq), `reseller_commission` (eq, gt, gte, lt, lte), `commissionable_total` (eq, gt, gte, lt, lte), `non_commissionable_total` (eq, gt, gte, lt, lte), `currency` (eq), `reseller_collect_type` (eq), `reseller_commission_rate` (eq, gt, gte, lt, lte), `reseller_commission_type` (eq), `trip_gift_card_total` (eq, gt, gte, lt, lte), `tip` (eq, gt, gte, lt, lte), `session_page_views` (eq, gt, gte, lt, lte), `session_browser_size` (eq), `session_browser_version` (eq), `session_browser_name` (eq), `session_browser_user_agent` (eq, begins_with), `session_browser_device_type` (eq), `session_browser_os` (eq), `session_language` (eq), `session_locale` (eq), `mkt_gclid` (eq), `mkt_msclid` (eq), `mkt_fbclid` (eq), `session_location_label` (eq, begins_with), `trip_type` (eq), `cart_abandons_sent_at_conversion` (eq, gt, gte, lt, lte), `is_automated_conversion` (eq), `is_assisted_conversion` (eq), `trip_unlocked_override` (eq), `tax_1_total` (eq, gt, gte, lt, lte), `tax_2_total` (eq, gt, gte, lt, lte), `tax_3_total` (eq, gt, gte, lt, lte), `tax_4_total` (eq, gt, gte, lt, lte), `tax_5_total` (eq, gt, gte, lt, lte), `tax_6_total` (eq, gt, gte, lt, lte), `tax_7_total` (eq, gt, gte, lt, lte), `tax_8_total` (eq, gt, gte, lt, lte), `tax_9_total` (eq, gt, gte, lt, lte), `tax_10_total` (eq, gt, gte, lt, lte), `tax_11_total` (eq, gt, gte, lt, lte), `tax_12_total` (eq, gt, gte, lt, lte), `tax_13_total` (eq, gt, gte, lt, lte), `tax_14_total` (eq, gt, gte, lt, lte), `tax_15_total` (eq, gt, gte, lt, lte), `tax_16_total` (eq, gt, gte, lt, lte), `tax_17_total` (eq, gt, gte, lt, lte), `tax_18_total` (eq, gt, gte, lt, lte), `tax_19_total` (eq, gt, gte, lt, lte), `tax_20_total` (eq, gt, gte, lt, lte), `total_sales` (eq, gt, gte, lt, lte), `products_cnt` (eq, gt, gte, lt, lte), `addons_cnt` (eq, gt, gte, lt, lte), `comped_pax_cnt` (eq, gt, gte, lt, lte), `voucher_number` (eq), `group_name` (eq, begins_with). |\n| `format` | The file format: `jsonl` (the default) or `csv`. See File formats in the Report types section. |\n| `columns` | An array of column names to include, in order. Omit it for the default set, which is marked in Columns. A dotted name such as `customer.email` reaches into a single related record. |\n\n**Columns**\n\nEvery column this report can return. Columns marked default are returned when `columns` is omitted. A dotted name such as `customer.email` reaches into a single related record, and a list column returns the whole list.\n\n| Column | Type | Default |\n| --- | --- | --- |\n| `id` | integer | \u2713 |\n| `uuid` | uuid | \u2713 |\n| `confirmation_code` | string | \u2713 |\n| `created_at` | datetime | \u2713 |\n| `sale_date` | date | \u2713 |\n| `trip_status.name` | string | \u2713 |\n| `trip_method.name` | string | \u2713 |\n| `source.name` | string | \u2713 |\n| `location.name` | string | \u2713 |\n| `customer.first_name` | string | \u2713 |\n| `customer.last_name` | string | \u2713 |\n| `customer.email` | string | \u2713 |\n| `pax_count` | integer | \u2713 |\n| `subtotal` | integer | \u2713 |\n| `promo_code_discount` | integer | \u2713 |\n| `voucher_code_discount` | integer | \u2713 |\n| `pickup_total` | integer | \u2713 |\n| `fees` | integer | \u2713 |\n| `total` | integer | \u2713 |\n| `tip` | integer | \u2713 |\n| `total_with_fees` | integer | \u2713 |\n| `paid` | integer | \u2713 |\n| `due` | integer | \u2713 |\n| `total_sales` | integer | \u2713 |\n| `reseller.name` | string | \u2713 |\n| `reseller_commission` | integer | \u2713 |\n| `reserved_at` | datetime |  |\n| `subtotal_nontaxable` | integer |  |\n| `fixed_transaction_fee_guest` | integer |  |\n| `fixed_transaction_fee_account` | integer |  |\n| `variable_transaction_fee_guest` | float |  |\n| `variable_transaction_fee_account` | float |  |\n| `variable_transaction_fee_guest_offline` | float |  |\n| `fixed_transaction_fee_guest_offline` | integer |  |\n| `fixed_transaction_fee_guest_amount` | integer |  |\n| `fixed_transaction_fee_account_amount` | integer |  |\n| `variable_transaction_fee_guest_amount` | integer |  |\n| `variable_transaction_fee_account_amount` | integer |  |\n| `fee_guest_total` | integer |  |\n| `fee_account_total` | integer |  |\n| `fee_total` | integer |  |\n| `due_with_fees` | integer |  |\n| `paid_with_fees` | integer |  |\n| `fees_earned` | integer |  |\n| `mkt_landing_url` | string |  |\n| `mkt_referrer_url` | string |  |\n| `mkt_cmp` | string |  |\n| `mkt_adg` | string |  |\n| `mkt_keyword` | string |  |\n| `mkt_ad_position` | string |  |\n| `last_funnel_step_name` | string |  |\n| `mkt_first_view` | datetime |  |\n| `commissionable_total` | integer |  |\n| `non_commissionable_total` | integer |  |\n| `reseller_commission_rate` | integer |  |\n| `reseller_commission_fixed` | integer |  |\n| `session_browser_device_type` | string |  |\n| `session_location_label` | string |  |\n| `sales_revenue_total_at_conversion` | integer |  |\n| `cart_abandons_sent_at_conversion` | integer |  |\n| `is_automated_conversion` | boolean |  |\n| `is_assisted_conversion` | boolean |  |\n| `tax_1_total` | integer |  |\n| `tax_2_total` | integer |  |\n| `tax_3_total` | integer |  |\n| `tax_4_total` | integer |  |\n| `tax_5_total` | integer |  |\n| `tax_6_total` | integer |  |\n| `tax_7_total` | integer |  |\n| `tax_8_total` | integer |  |\n| `tax_9_total` | integer |  |\n| `tax_10_total` | integer |  |\n| `tax_11_total` | integer |  |\n| `tax_12_total` | integer |  |\n| `tax_13_total` | integer |  |\n| `tax_14_total` | integer |  |\n| `tax_15_total` | integer |  |\n| `tax_16_total` | integer |  |\n| `tax_17_total` | integer |  |\n| `tax_18_total` | integer |  |\n| `tax_19_total` | integer |  |\n| `tax_20_total` | integer |  |\n| `products_cnt` | integer |  |\n| `addons_cnt` | integer |  |\n| `comped_pax_cnt` | integer |  |\n| `voucher_number` | string |  |\n| `group_name` | string |  |\n| `trip_status` | object |  |\n| `trip_status.id` | integer |  |\n| `trip_status.color` | string |  |\n| `trip_status.slug` | string |  |\n| `trip_method` | object |  |\n| `trip_method.id` | integer |  |\n| `trip_method.color` | string |  |\n| `trip_method.slug` | string |  |\n| `reseller_collect_type` | object |  |\n| `reseller_collect_type.id` | integer |  |\n| `reseller_collect_type.name` | string |  |\n| `reseller_collect_type.slug` | string |  |\n| `trip_type` | object |  |\n| `trip_type.id` | integer |  |\n| `trip_type.slug` | string |  |\n| `trip_type.name` | string |  |\n| `source` | object |  |\n| `source.id` | integer |  |\n| `source.uuid` | uuid |  |\n| `source.color` | string |  |\n| `customer` | object |  |\n| `customer.id` | integer |  |\n| `customer.uuid` | uuid |  |\n| `customer.created_at` | datetime |  |\n| `customer.code` | string |  |\n| `customer.address1` | string |  |\n| `customer.city` | string |  |\n| `customer.state_code` | string |  |\n| `customer.postal_code` | string |  |\n| `customer.phone` | string |  |\n| `customer.locale` | string |  |\n| `customer.language` | string |  |\n| `customer.avatar_url` | string |  |\n| `customer.dob` | date |  |\n| `customer.is_opt_in` | boolean |  |\n| `customer.phone_format_164` | string |  |\n| `created_by_user_avatar` | object |  |\n| `created_by_user_avatar.id` | integer |  |\n| `created_by_user_avatar.uuid` | uuid |  |\n| `created_by_user_avatar.first_name` | string |  |\n| `created_by_user_avatar.last_name` | string |  |\n| `created_by_user_avatar.email` | string |  |\n| `created_by_user_avatar.is_tripworks_managed` | boolean |  |\n| `location` | object |  |\n| `location.id` | integer |  |\n| `location.uuid` | uuid |  |\n| `reseller` | object |  |\n| `reseller.id` | integer |  |\n| `reseller.uuid` | uuid |  |\n| `reseller.code` | string |  |\n| `reseller.commission_rate` | integer |  |\n| `reseller.credit_limit` | integer |  |\n| `reseller.accounting_contact_name` | string |  |\n| `reseller.accounting_email` | string |  |\n| `reseller.accounting_phone_number` | string |  |\n| `reseller.tax_id` | string |  |\n| `reseller.invoices_total` | integer |  |\n| `reseller.invoices_due` | integer |  |\n| `reseller.invoices_paid` | integer |  |\n| `reseller.trips_total` | integer |  |\n| `reseller.trips_pax_count` | integer |  |\n| `reseller.commission_total` | integer |  |\n| `reseller.is_dynamic_commission_rate` | boolean |  |\n| `tripOrders` | array |  |\n| `custom_field_values` | array |  |\n| `notes` | array |  |\n| `payments` | array |  |\n| `voucher_codes` | array |  |\n\n### Required scope\n\n`reports.read`","x-required-scope":"reports.read","x-required-scopes":["reports.read"],"tags":["report-types"],"security":[{"bearerAuth":["reports.read"]}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"report":{"type":"object","properties":{"id":{"type":"string"},"version":{"type":"integer"},"name":{"type":"string"},"description":{"type":"string"},"parameters":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"date_field":{"type":"string"},"filters":{"type":"string"},"format":{"type":"string"},"columns":{"type":"string"}}},"columns":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"default":{"type":"boolean"}}}},"example":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"date_field":{"type":"string"},"filters":{"type":"object","properties":{"total":{"type":"object","properties":{"gte":{"type":"string"}}},"due":{"type":"object","properties":{"gt":{"type":"string"}}}}},"columns":{"type":"array","items":{"type":"string"}}}}}}},"example":{"success":true,"report":{"id":"sales_detail.1","version":1,"name":"Sales Detail","description":"One row per trip in the date range. Amounts are integers in cents.\n\nA run that would return more than 1,000,000 rows fails. Narrow the date range or add filters.","parameters":{"date_from":"Required. First day to include, as Y-m-d.","date_to":"Required. Last day to include, as Y-m-d. The range may span at most 366 days.","date_field":"Which date the range applies to: `created` (the default) or `activity`.","filters":"An object of trip field to value, or to `{operator: value}`. For example, `{\u0022due\u0022: {\u0022gt\u0022: \u00220\u0022}}` returns unpaid trips. Filterable fields: `confirmation_code` (eq), `created_at` (gte, lte), `reserved_at` (gte, lte), `sale_date` (eq, gte, lte), `trip_status` (eq), `trip_source_id` (eq), `customer_id` (eq), `flagged_at` (gte, lte), `subtotal` (eq, gt, gte, lt, lte), `total` (eq, gt, gte, lt, lte), `paid` (eq, gt, gte, lt, lte), `due` (eq, gt, gte, lt, lte), `created_by_user_avatar_id` (eq), `flagged_by_user_avatar_id` (eq), `flagged_to_user_avatar_id` (eq), `trip_method` (eq), `pax_count` (eq, gte, lte), `fixed_transaction_fee_guest` (eq, gt, gte, lt, lte), `fixed_transaction_fee_account` (eq, gt, gte, lt, lte), `fixed_transaction_fee_guest_offline` (eq, gt, gte, lt, lte), `fixed_transaction_fee_guest_amount` (eq, gt, gte, lt, lte), `fixed_transaction_fee_account_amount` (eq, gt, gte, lt, lte), `variable_transaction_fee_guest_amount` (eq, gt, gte, lt, lte), `variable_transaction_fee_account_amount` (eq, gt, gte, lt, lte), `fee_guest_total` (eq, gt, gte, lt, lte), `fee_account_total` (eq, gt, gte, lt, lte), `fee_total` (eq, gt, gte, lt, lte), `total_with_fees` (eq, gt, gte, lt, lte), `mkt_landing_url` (eq, begins_with), `mkt_referrer_url` (eq, begins_with), `mkt_cmp` (eq, begins_with), `mkt_adg` (eq), `mkt_keyword` (eq, begins_with), `mkt_ad_position` (eq), `location_id` (eq), `mkt_first_view` (gte, lte), `reseller_id` (eq), `reseller_commission` (eq, gt, gte, lt, lte), `commissionable_total` (eq, gt, gte, lt, lte), `non_commissionable_total` (eq, gt, gte, lt, lte), `currency` (eq), `reseller_collect_type` (eq), `reseller_commission_rate` (eq, gt, gte, lt, lte), `reseller_commission_type` (eq), `trip_gift_card_total` (eq, gt, gte, lt, lte), `tip` (eq, gt, gte, lt, lte), `session_page_views` (eq, gt, gte, lt, lte), `session_browser_size` (eq), `session_browser_version` (eq), `session_browser_name` (eq), `session_browser_user_agent` (eq, begins_with), `session_browser_device_type` (eq), `session_browser_os` (eq), `session_language` (eq), `session_locale` (eq), `mkt_gclid` (eq), `mkt_msclid` (eq), `mkt_fbclid` (eq), `session_location_label` (eq, begins_with), `trip_type` (eq), `cart_abandons_sent_at_conversion` (eq, gt, gte, lt, lte), `is_automated_conversion` (eq), `is_assisted_conversion` (eq), `trip_unlocked_override` (eq), `tax_1_total` (eq, gt, gte, lt, lte), `tax_2_total` (eq, gt, gte, lt, lte), `tax_3_total` (eq, gt, gte, lt, lte), `tax_4_total` (eq, gt, gte, lt, lte), `tax_5_total` (eq, gt, gte, lt, lte), `tax_6_total` (eq, gt, gte, lt, lte), `tax_7_total` (eq, gt, gte, lt, lte), `tax_8_total` (eq, gt, gte, lt, lte), `tax_9_total` (eq, gt, gte, lt, lte), `tax_10_total` (eq, gt, gte, lt, lte), `tax_11_total` (eq, gt, gte, lt, lte), `tax_12_total` (eq, gt, gte, lt, lte), `tax_13_total` (eq, gt, gte, lt, lte), `tax_14_total` (eq, gt, gte, lt, lte), `tax_15_total` (eq, gt, gte, lt, lte), `tax_16_total` (eq, gt, gte, lt, lte), `tax_17_total` (eq, gt, gte, lt, lte), `tax_18_total` (eq, gt, gte, lt, lte), `tax_19_total` (eq, gt, gte, lt, lte), `tax_20_total` (eq, gt, gte, lt, lte), `total_sales` (eq, gt, gte, lt, lte), `products_cnt` (eq, gt, gte, lt, lte), `addons_cnt` (eq, gt, gte, lt, lte), `comped_pax_cnt` (eq, gt, gte, lt, lte), `voucher_number` (eq), `group_name` (eq, begins_with).","format":"The file format: `jsonl` (the default) or `csv`. See File formats in the Report types section.","columns":"An array of column names to include, in order. Omit it for the default set, which is marked in Columns. A dotted name such as `customer.email` reaches into a single related record."},"columns":[{"name":"id","type":"integer","default":true},{"name":"uuid","type":"uuid","default":true},{"name":"confirmation_code","type":"string","default":true}],"example":{"date_from":"2026-09-01","date_to":"2026-09-30","date_field":"created","filters":{"total":{"gte":"10000"},"due":{"gt":"0"}},"columns":["confirmation_code","created_at","customer.email","total","paid","due"]}}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/resellers":{"get":{"operationId":"resellers_list","summary":"List","description":"Returns a paginated list of resellers, optionally filtered and sorted. Ordered by id unless a sort is given.\n\n### Required scope\n\n`resellers.read`","x-required-scope":"resellers.read","x-required-scopes":["resellers.read"],"tags":["resellers"],"security":[{"bearerAuth":["resellers.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: created_at, code, commission_rate, credit_limit, commission_fixed."},{"name":"id","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Id \u2014 bare value for equality, or {eq|gte|lte} as \u0022?id[op]=value\u0022."},{"name":"created_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Created at \u2014 bare value for equality, or {gte|lte} as \u0022?created_at[op]=value\u0022."},{"name":"name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Name \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?name[op]=value\u0022."},{"name":"code","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Code \u2014 bare value for equality, or {eq|begins_with} as \u0022?code[op]=value\u0022."},{"name":"address1","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Address1 \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?address1[op]=value\u0022."},{"name":"postal_code","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Postal code \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?postal_code[op]=value\u0022."},{"name":"city","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by City \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?city[op]=value\u0022."},{"name":"country","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Country (equality)."},{"name":"phone_number","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Phone number \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?phone_number[op]=value\u0022."},{"name":"is_voucher_required","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is voucher required (equality)."},{"name":"payment_method","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Payment method (equality)."},{"name":"collect_type","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Collect type (equality)."},{"name":"commission_rate","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Commission rate \u2014 bare value for equality, or {eq|gte|lte} as \u0022?commission_rate[op]=value\u0022."},{"name":"credit_limit","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Credit limit \u2014 bare value for equality, or {eq|gte|lte} as \u0022?credit_limit[op]=value\u0022."},{"name":"is_credit_limit_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is credit limit enabled (equality)."},{"name":"reseller_type_id","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Reseller type ID (equality)."},{"name":"reseller_status","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Reseller status (equality)."},{"name":"is_hide_rates_from_customer","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is hide rates from customer (equality)."},{"name":"is_crm_trip_receipt_disabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is crm trip receipt disabled (equality)."},{"name":"is_commissionable_on_product","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on product (equality)."},{"name":"is_commissionable_on_addon","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on addon (equality)."},{"name":"is_commissionable_on_tax1","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax1 (equality)."},{"name":"is_commissionable_on_tax2","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax2 (equality)."},{"name":"is_commissionable_on_tax3","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax3 (equality)."},{"name":"is_commissionable_on_tax4","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax4 (equality)."},{"name":"is_commissionable_on_tax5","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax5 (equality)."},{"name":"is_commissionable_on_tax6","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax6 (equality)."},{"name":"is_commissionable_on_tax7","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax7 (equality)."},{"name":"is_commissionable_on_tax8","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax8 (equality)."},{"name":"is_commissionable_on_tax9","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax9 (equality)."},{"name":"is_commissionable_on_tax10","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax10 (equality)."},{"name":"is_commissionable_on_tax11","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax11 (equality)."},{"name":"is_commissionable_on_tax12","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax12 (equality)."},{"name":"is_commissionable_on_tax13","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax13 (equality)."},{"name":"is_commissionable_on_tax14","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax14 (equality)."},{"name":"is_commissionable_on_tax15","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax15 (equality)."},{"name":"is_commissionable_on_tax16","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax16 (equality)."},{"name":"is_commissionable_on_tax17","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax17 (equality)."},{"name":"is_commissionable_on_tax18","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax18 (equality)."},{"name":"is_commissionable_on_tax19","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax19 (equality)."},{"name":"is_commissionable_on_tax20","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is commissionable on tax20 (equality)."},{"name":"accounting_contact_name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Accounting contact name \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?accounting_contact_name[op]=value\u0022."},{"name":"accounting_email","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Accounting email \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?accounting_email[op]=value\u0022."},{"name":"accounting_phone_number","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Accounting phone number \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?accounting_phone_number[op]=value\u0022."},{"name":"tax_id","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Tax id \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?tax_id[op]=value\u0022."},{"name":"is_crm_send_reseller_receipt","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is crm send reseller receipt (equality)."},{"name":"crm_email","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Crm email \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?crm_email[op]=value\u0022."},{"name":"is_dynamic_commission_rate","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is dynamic commission rate (equality)."},{"name":"commission_rate_type","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Commission rate type (equality)."},{"name":"commission_rate_mode","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Commission rate mode (equality)."},{"name":"commission_calculation_mode","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Commission calculation mode (equality)."},{"name":"commission_fixed","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Commission fixed \u2014 bare value for equality, or {eq|gte|lte} as \u0022?commission_fixed[op]=value\u0022."},{"name":"tax_1_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 1 is enabled (equality)."},{"name":"tax_2_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 2 is enabled (equality)."},{"name":"tax_3_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 3 is enabled (equality)."},{"name":"tax_4_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 4 is enabled (equality)."},{"name":"tax_5_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 5 is enabled (equality)."},{"name":"tax_6_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 6 is enabled (equality)."},{"name":"tax_7_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 7 is enabled (equality)."},{"name":"tax_8_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 8 is enabled (equality)."},{"name":"tax_9_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 9 is enabled (equality)."},{"name":"tax_10_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 10 is enabled (equality)."},{"name":"tax_11_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 11 is enabled (equality)."},{"name":"tax_12_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 12 is enabled (equality)."},{"name":"tax_13_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 13 is enabled (equality)."},{"name":"tax_14_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 14 is enabled (equality)."},{"name":"tax_15_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 15 is enabled (equality)."},{"name":"tax_16_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 16 is enabled (equality)."},{"name":"tax_17_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 17 is enabled (equality)."},{"name":"tax_18_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 18 is enabled (equality)."},{"name":"tax_19_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 19 is enabled (equality)."},{"name":"tax_20_is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Tax 20 is enabled (equality)."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"resellers":{"type":"array","items":{"$ref":"#\/components\/schemas\/Reseller"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"post":{"operationId":"resellers_create","summary":"Create","description":"Creates a new reseller. `name`, `reseller_type_id` and `payment_method` are required. `reseller_type_id` is the numeric id of the reseller type (returned on every read, alongside the type name in `reseller_type`) and cannot be changed afterwards. The status defaults to `active`. The collection type is derived from the reseller type (`retail` for User Defined, `wholesale` for every other type), and every live experience and every reseller-available rate sheet is attached to the new reseller. For a non-User-Defined type, `is_crm_trip_receipt_disabled` defaults to true unless you send it.\n\nErrors: 400 `invalid_json_body` when the body is not a JSON object; 422 `invalid_field_type` when `reseller_type_id` is not an integer or matches no reseller type; 422 `unknown_fields` for a field that is not writable (including `collect_type`, `commission_rate_mode` and the aggregate fields); 422 `validation_failed` with per-field `errors` when `reseller_type_id` is missing or the reseller fails validation (for example a duplicate name, a missing `payment_method`, or `auto-pay` on a User Defined reseller).\n\n### Required scope\n\n`resellers.write`","x-required-scope":"resellers.write","x-required-scopes":["resellers.write"],"tags":["resellers"],"security":[{"bearerAuth":["resellers.write"]}],"responses":{"201":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"reseller":{"$ref":"#\/components\/schemas\/Reseller"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ResellerWrite"},"example":{"name":"Harbor Tours Co.","reseller_type_id":1,"payment_method":"invoice-manual-apply","commission_rate":15,"country":"US","city":"Boston"}}}}}},"\/rest\/resellers\/{id}":{"get":{"operationId":"resellers_get","summary":"Get one","description":"Returns a single reseller by id.\n\n### Required scope\n\n`resellers.read`","x-required-scope":"resellers.read","x-required-scopes":["resellers.read"],"tags":["resellers"],"security":[{"bearerAuth":["resellers.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"reseller":{"$ref":"#\/components\/schemas\/Reseller"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"patch":{"operationId":"resellers_update","summary":"Update","description":"Updates a reseller. Only the fields you include are changed \u2014 omitted fields are left as-is. The reseller type is set at creation and cannot be changed: sending `reseller_type_id` is rejected with 422 `unknown_fields`, as is any other field that is not writable (including `collect_type` and `commission_rate_mode`). A reseller that fails validation is rejected with 422 `validation_failed` and per-field `errors`.\n\n### Required scope\n\n`resellers.write`","x-required-scope":"resellers.write","x-required-scopes":["resellers.write"],"tags":["resellers"],"security":[{"bearerAuth":["resellers.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"reseller":{"$ref":"#\/components\/schemas\/Reseller"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ResellerWrite"},"example":{"commission_rate":20}}}}},"delete":{"operationId":"resellers_delete","summary":"Delete","description":"Permanently deletes a reseller. Blocked (409 `in_use`, with the trip and invoice counts) while any trip or invoice still references the reseller; notes and cards on file are not counted.\n\n### Required scope\n\n`resellers.write`","x-required-scope":"resellers.write","x-required-scopes":["resellers.write"],"tags":["resellers"],"security":[{"bearerAuth":["resellers.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/restrictions":{"get":{"operationId":"restrictions_list","summary":"List","description":"Returns a paginated list of restrictions, optionally filtered and sorted.\n\n### Required scope\n\n`restrictions.read`","x-required-scope":"restrictions.read","x-required-scopes":["restrictions.read"],"tags":["restrictions"],"security":[{"bearerAuth":["restrictions.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: name."},{"name":"id","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Id \u2014 bare value for equality, or {eq|gte|lte} as \u0022?id[op]=value\u0022."},{"name":"empty_min","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Empty min \u2014 bare value for equality, or {eq|gte|lte} as \u0022?empty_min[op]=value\u0022."},{"name":"empty_max","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Empty max \u2014 bare value for equality, or {eq|gte|lte} as \u0022?empty_max[op]=value\u0022."},{"name":"empty_auto_close_hours_before","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Empty auto close hours before \u2014 bare value for equality, or {eq|gte|lte} as \u0022?empty_auto_close_hours_before[op]=value\u0022."},{"name":"empty_call_to_book","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Empty call to book (equality)."},{"name":"not_empty_min","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Not empty min \u2014 bare value for equality, or {eq|gte|lte} as \u0022?not_empty_min[op]=value\u0022."},{"name":"not_empty_max","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Not empty max \u2014 bare value for equality, or {eq|gte|lte} as \u0022?not_empty_max[op]=value\u0022."},{"name":"not_empty_auto_close_hours_before","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Not empty auto close hours before \u2014 bare value for equality, or {eq|gte|lte} as \u0022?not_empty_auto_close_hours_before[op]=value\u0022."},{"name":"not_empty_call_to_book","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Not empty call to book (equality)."},{"name":"full_call_to_book","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Full call to book (equality)."},{"name":"hide_unavailable_timeslots","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Hide unavailable timeslots (equality)."},{"name":"call_to_book_phrase","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Call to book phrase \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?call_to_book_phrase[op]=value\u0022."},{"name":"show_seats_left","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Show seats left (equality)."},{"name":"show_seats_left_min","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Show seats left min \u2014 bare value for equality, or {eq|gte|lte} as \u0022?show_seats_left_min[op]=value\u0022."},{"name":"name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Name \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?name[op]=value\u0022."},{"name":"empty_restriction_close_type","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Empty restriction close type (equality)."},{"name":"not_empty_restriction_close_type","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Not empty restriction close type (equality)."},{"name":"booking_advance_window_limit","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Booking advance window limit (equality)."},{"name":"booking_advance_window_days","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Booking advance window days \u2014 bare value for equality, or {eq|gte|lte} as \u0022?booking_advance_window_days[op]=value\u0022."},{"name":"booking_advance_window_hours","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Booking advance window hours \u2014 bare value for equality, or {eq|gte|lte} as \u0022?booking_advance_window_hours[op]=value\u0022."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"restrictions":{"type":"array","items":{"$ref":"#\/components\/schemas\/Restriction"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"post":{"operationId":"restrictions_create","summary":"Create","description":"Creates a new restriction. Requires name. empty_restriction_close_type\/not_empty_restriction_close_type default to \u0022event_start\u0022 when omitted.\n\n### Required scope\n\n`restrictions.write`","x-required-scope":"restrictions.write","x-required-scopes":["restrictions.write"],"tags":["restrictions"],"security":[{"bearerAuth":["restrictions.write"]}],"responses":{"201":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"restriction":{"$ref":"#\/components\/schemas\/Restriction"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RestrictionWrite"},"example":{"name":"Standard","empty_restriction_close_type":"event_start","not_empty_restriction_close_type":"midnight"}}}}}},"\/rest\/restrictions\/{id}":{"get":{"operationId":"restrictions_get","summary":"Get one","description":"Returns a single restriction by id.\n\n### Required scope\n\n`restrictions.read`","x-required-scope":"restrictions.read","x-required-scopes":["restrictions.read"],"tags":["restrictions"],"security":[{"bearerAuth":["restrictions.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"restriction":{"$ref":"#\/components\/schemas\/Restriction"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"patch":{"operationId":"restrictions_update","summary":"Update","description":"Updates a restriction. Only the fields you include are changed \u2014 omitted fields are left as-is.\n\n### Required scope\n\n`restrictions.write`","x-required-scope":"restrictions.write","x-required-scopes":["restrictions.write"],"tags":["restrictions"],"security":[{"bearerAuth":["restrictions.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"restriction":{"$ref":"#\/components\/schemas\/Restriction"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RestrictionWrite"},"example":{"empty_max":30}}}}},"delete":{"operationId":"restrictions_delete","summary":"Delete","description":"Permanently deletes a restriction. Every experience requires a restriction, so one still assigned to at least one experience can\u0027t simply be removed. Blocked (409) when the restriction is in use and no `merge_target_id` was given \u2014 the response reports how many experiences are affected so the caller can choose a target and retry \u2014 or when `merge_target_id` does not resolve to a different, existing restriction. Pass `merge_target_id` (another restriction\u0027s id) in the request body to reassign those experiences to it before deleting.\n\n### Required scope\n\n`restrictions.write`","x-required-scope":"restrictions.write","x-required-scopes":["restrictions.write"],"tags":["restrictions"],"security":[{"bearerAuth":["restrictions.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/reviews":{"get":{"operationId":"reviews_list","summary":"List","description":"Returns a paginated list of reviews, newest first by default. Filter by `id` (also `[gte]`\/`[lte]`), `rating`, `sentiment_positive`, `sentiment_negative` or `sentiment_neutral` (each also `[gte]`\/`[lte]`), `is_approved`, `name` or `location` (also `[contains]`\/`[begins_with]`), `overall_comment` or `improve_comment` (`[contains]`), `review_type` (slug), `experience_id`, `sentiment`, `external_id` (also `[begins_with]`) or `created_at[gte]`\/`created_at[lte]`; sort with `?sort=created_at` or `?sort=-created_at`; `created_at` is the only sortable field. Paging is cursor-based via `per_page` and `cursor`.\n\n### Required scope\n\n`reviews.read`","x-required-scope":"reviews.read","x-required-scopes":["reviews.read"],"tags":["reviews"],"security":[{"bearerAuth":["reviews.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: created_at."},{"name":"id","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Id \u2014 bare value for equality, or {eq|gte|lte} as \u0022?id[op]=value\u0022."},{"name":"created_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Created at \u2014 bare value for equality, or {gte|lte} as \u0022?created_at[op]=value\u0022."},{"name":"name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Name \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?name[op]=value\u0022."},{"name":"location","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Location \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?location[op]=value\u0022."},{"name":"overall_comment","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"contains":{"type":"string"}}},"description":"Filter by Overall comment \u2014 bare value for equality, or {contains} as \u0022?overall_comment[op]=value\u0022."},{"name":"is_approved","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is approved (equality)."},{"name":"rating","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Rating \u2014 bare value for equality, or {eq|gte|lte} as \u0022?rating[op]=value\u0022."},{"name":"improve_comment","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"contains":{"type":"string"}}},"description":"Filter by Improve comment \u2014 bare value for equality, or {contains} as \u0022?improve_comment[op]=value\u0022."},{"name":"experience_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Experience ID (equality)."},{"name":"sentiment_neutral","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Sentiment neutral \u2014 bare value for equality, or {eq|gte|lte} as \u0022?sentiment_neutral[op]=value\u0022."},{"name":"sentiment_positive","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Sentiment positive \u2014 bare value for equality, or {eq|gte|lte} as \u0022?sentiment_positive[op]=value\u0022."},{"name":"sentiment_negative","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Sentiment negative \u2014 bare value for equality, or {eq|gte|lte} as \u0022?sentiment_negative[op]=value\u0022."},{"name":"sentiment","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Sentiment (equality)."},{"name":"review_type","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Review type (equality)."},{"name":"external_id","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by External id \u2014 bare value for equality, or {eq|begins_with} as \u0022?external_id[op]=value\u0022."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"reviews":{"type":"array","items":{"$ref":"#\/components\/schemas\/Review"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"post":{"operationId":"reviews_create","summary":"Create","description":"Creates a review. Requires name and review_type (a slug such as `tripworks`, `tripadvisor`, `yelp`, or `google`). `rating` defaults to 5 and the comments are simply omitted from responses when not supplied. Sentiment is analyzed from the comments on create and cannot be set directly; `trip_id` and `created_at` (set to the moment of creation) are read-only. `experience_id` must be an existing experience in your account. Responds 201 with the created review, 422 for validation errors or unknown fields, and 503 (nothing saved) when sentiment analysis is temporarily unavailable.\n\n### Required scope\n\n`reviews.write`","x-required-scope":"reviews.write","x-required-scopes":["reviews.write"],"tags":["reviews"],"security":[{"bearerAuth":["reviews.write"]}],"responses":{"201":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"review":{"$ref":"#\/components\/schemas\/Review"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"503":{"description":"Sentiment analysis is temporarily unavailable; the review was not saved.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ReviewWrite"},"example":{"name":"Jane D.","review_type":"google","rating":5,"overall_comment":"Wonderful tour."}}}}}},"\/rest\/reviews\/{id}":{"get":{"operationId":"reviews_get","summary":"Get one","description":"Returns a single review by its id, including its derived sentiment fields. Responds 404 for an id that does not exist in your account.\n\n### Required scope\n\n`reviews.read`","x-required-scope":"reviews.read","x-required-scopes":["reviews.read"],"tags":["reviews"],"security":[{"bearerAuth":["reviews.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"review":{"$ref":"#\/components\/schemas\/Review"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"patch":{"operationId":"reviews_update","summary":"Update","description":"Partially updates a review. Only the fields you include are changed \u2014 omitted fields are left as-is, and an explicit `null` clears nullable fields such as `location` and `experience_id` (comments are cleared and then omitted from responses; `name`, `rating` and `review_type` cannot be cleared). Changing `overall_comment` or `improve_comment` re-runs sentiment analysis and recomputes the `sentiment` fields; other changes leave them untouched. Returns 503 (nothing saved) if re-analysis is unavailable.\n\n### Required scope\n\n`reviews.write`","x-required-scope":"reviews.write","x-required-scopes":["reviews.write"],"tags":["reviews"],"security":[{"bearerAuth":["reviews.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"review":{"$ref":"#\/components\/schemas\/Review"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"503":{"description":"Sentiment analysis is temporarily unavailable; the review was not saved.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ReviewWrite"},"example":{"is_approved":true}}}}},"delete":{"operationId":"reviews_delete","summary":"Delete","description":"Permanently deletes a review. This cannot be undone and the review is not archived; any booking it was linked to is left unchanged.\n\n### Required scope\n\n`reviews.write`","x-required-scope":"reviews.write","x-required-scopes":["reviews.write"],"tags":["reviews"],"security":[{"bearerAuth":["reviews.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/trip-notes":{"get":{"operationId":"trip_notes_list","summary":"List","description":"Returns a paginated list of trip notes, newest first by default. Filter by `trip_id` to get every note on one trip, by `user_avatar_id` for one author, or by `created_at[gte]`\/`created_at[lte]` for a time range.\n\n### Required scope\n\n`trip-notes.read`","x-required-scope":"trip-notes.read","x-required-scopes":["trip-notes.read"],"tags":["trip-notes"],"security":[{"bearerAuth":["trip-notes.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: created_at."},{"name":"id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Id (equality)."},{"name":"created_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Created at \u2014 bare value for equality, or {eq|gte|lte} as \u0022?created_at[op]=value\u0022."},{"name":"text","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Text \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?text[op]=value\u0022."},{"name":"trip_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Trip ID (equality)."},{"name":"user_avatar_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by User avatar ID (equality)."},{"name":"is_edited","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is edited (equality)."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"trip_notes":{"type":"array","items":{"$ref":"#\/components\/schemas\/TripNote"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"post":{"operationId":"trip_notes_create","summary":"Create","description":"Adds a note to a trip. `trip_id` and `text` are required. `user_avatar_id` is optional: send the id of a team member to attribute the note to them, or leave it out and the note is attributed to the TripWorks system user. Returns 409 if the account has no system user and no `user_avatar_id` was sent.\n\n### Required scope\n\n`trip-notes.write`","x-required-scope":"trip-notes.write","x-required-scopes":["trip-notes.write"],"tags":["trip-notes"],"security":[{"bearerAuth":["trip-notes.write"]}],"responses":{"201":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"trip_note":{"$ref":"#\/components\/schemas\/TripNote"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"This account has no TripWorks system user to author the note. Send user_avatar_id with the id of a team member.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/TripNoteWrite"},"example":{"trip_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","text":"Guest called to say the group is running 10 minutes late."}}}}}},"\/rest\/trip-notes\/{id}":{"get":{"operationId":"trip_notes_get","summary":"Get one","description":"Returns a single trip note by id.\n\n### Required scope\n\n`trip-notes.read`","x-required-scope":"trip-notes.read","x-required-scopes":["trip-notes.read"],"tags":["trip-notes"],"security":[{"bearerAuth":["trip-notes.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"trip_note":{"$ref":"#\/components\/schemas\/TripNote"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"patch":{"operationId":"trip_notes_update","summary":"Update","description":"Changes the text of a note and marks it as edited. `text` is the only field that can be changed after creation; the trip and author are fixed.\n\n### Required scope\n\n`trip-notes.write`","x-required-scope":"trip-notes.write","x-required-scopes":["trip-notes.write"],"tags":["trip-notes"],"security":[{"bearerAuth":["trip-notes.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"trip_note":{"$ref":"#\/components\/schemas\/TripNote"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/TripNoteWrite"},"example":{"text":"Guest called to say the group is running 20 minutes late."}}}}},"delete":{"operationId":"trip_notes_delete","summary":"Delete","description":"Permanently deletes a trip note.\n\n### Required scope\n\n`trip-notes.write`","x-required-scope":"trip-notes.write","x-required-scopes":["trip-notes.write"],"tags":["trip-notes"],"security":[{"bearerAuth":["trip-notes.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/trip-sources":{"get":{"operationId":"trip_sources_list","summary":"List","description":"Returns a paginated list of trip sources, optionally filtered and sorted.\n\n### Required scope\n\n`trip-sources.read`","x-required-scope":"trip-sources.read","x-required-scopes":["trip-sources.read"],"tags":["trip-sources"],"security":[{"bearerAuth":["trip-sources.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: name."},{"name":"id","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Id \u2014 bare value for equality, or {eq|gte|lte} as \u0022?id[op]=value\u0022."},{"name":"name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Name \u2014 bare value for equality, or {eq|contains} as \u0022?name[op]=value\u0022."},{"name":"label","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Label \u2014 bare value for equality, or {eq|contains} as \u0022?label[op]=value\u0022."},{"name":"is_enabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is enabled (equality)."},{"name":"is_ecom_visible","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is ecom visible (equality)."},{"name":"is_read_only","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is read only (equality)."},{"name":"category_slug","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Category slug (equality)."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"trip_sources":{"type":"array","items":{"$ref":"#\/components\/schemas\/TripSource"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"post":{"operationId":"trip_sources_create","summary":"Create","description":"Creates a new trip source.\n\n### Required scope\n\n`trip-sources.write`","x-required-scope":"trip-sources.write","x-required-scopes":["trip-sources.write"],"tags":["trip-sources"],"security":[{"bearerAuth":["trip-sources.write"]}],"responses":{"201":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"trip_source":{"$ref":"#\/components\/schemas\/TripSource"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/TripSourceWrite"},"example":{"name":"Referral","label":"How did you hear about us? - Referral"}}}}}},"\/rest\/trip-sources\/{id}":{"get":{"operationId":"trip_sources_get","summary":"Get one","description":"Returns a single trip source by id.\n\n### Required scope\n\n`trip-sources.read`","x-required-scope":"trip-sources.read","x-required-scopes":["trip-sources.read"],"tags":["trip-sources"],"security":[{"bearerAuth":["trip-sources.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"trip_source":{"$ref":"#\/components\/schemas\/TripSource"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"patch":{"operationId":"trip_sources_update","summary":"Update","description":"Updates a trip source. Only the fields you include are changed \u2014 omitted fields are left as-is.\n\n### Required scope\n\n`trip-sources.write`","x-required-scope":"trip-sources.write","x-required-scopes":["trip-sources.write"],"tags":["trip-sources"],"security":[{"bearerAuth":["trip-sources.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"trip_source":{"$ref":"#\/components\/schemas\/TripSource"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/TripSourceWrite"},"example":{"name":"Referral Program"}}}}},"delete":{"operationId":"trip_sources_delete","summary":"Delete","description":"Permanently deletes a trip source. Blocked (409) if it is a system source, or if it is still referenced by any trips \u2014 pass `merge_target_id` to reassign them to another trip source first.\n\n### Required scope\n\n`trip-sources.write`","x-required-scope":"trip-sources.write","x-required-scopes":["trip-sources.write"],"tags":["trip-sources"],"security":[{"bearerAuth":["trip-sources.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/trips":{"get":{"operationId":"trips_list","summary":"List","description":"Returns a paginated list of trips ordered by activity date with the latest first (upcoming trips before past ones), then newest created, one flat row per trip with no `trip_orders` or `bookings`. Filter by `confirmation_code`, `trip_status`, `trip_type`, `customer_id`, `trip_source_id`, `reseller_id`, `location_id`, date ranges on `sale_date`, `created_at` and `reserved_at`, and most of the other stored fields; `?sort=sale_date` or `?sort=-sale_date` changes the activity-date direction. Deleted trips are left out unless you pass `?trip_status=deleted`. Get one trip to read its orders and bookings.\n\n**Early access:** the `paid`, `due`, `total_sales`, `pax_count`, `tip` and `cart_abandons_sent_at_conversion` fields, and their filters and aggregates, will be renamed to `payments_total`, `balance_due_total`, `earned_revenue_total`, `pax_cnt`, `tip_total` and `cart_abandons_sent_at_conversion_cnt`. The old names will stop working when that happens.\n\n### Required scope\n\n`trips.read`","x-required-scope":"trips.read","x-required-scopes":["trips.read"],"tags":["trips"],"security":[{"bearerAuth":["trips.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: sale_date."},{"name":"confirmation_code","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Confirmation code (equality)."},{"name":"created_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Created at \u2014 bare value for equality, or {gte|lte} as \u0022?created_at[op]=value\u0022."},{"name":"reserved_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Reserved at \u2014 bare value for equality, or {gte|lte} as \u0022?reserved_at[op]=value\u0022."},{"name":"sale_date","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Sale date \u2014 bare value for equality, or {eq|gte|lte} as \u0022?sale_date[op]=value\u0022."},{"name":"trip_status","in":"query","required":false,"schema":{"type":"string"},"description":"Trip status slug: `draft`, `review`, `reserved` or `deleted`. Without this filter deleted trips are left out of the list; pass `deleted` to list them."},{"name":"trip_source_id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of a trip source, the same id a breakdown by source returns."},{"name":"customer_id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of a customer, a trip\u0027s `customer_id`. Find a customer with `GET \/rest\/customers`."},{"name":"flagged_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Flagged at \u2014 bare value for equality, or {gte|lte} as \u0022?flagged_at[op]=value\u0022."},{"name":"subtotal","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Subtotal \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?subtotal[op]=value\u0022."},{"name":"total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?total[op]=value\u0022."},{"name":"paid","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Early access: will be renamed to `payments_total`. Bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?paid[op]=value\u0022."},{"name":"due","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Early access: will be renamed to `balance_due_total`. Bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?due[op]=value\u0022."},{"name":"created_by_user_avatar_id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of the team member who created the trip. Find team members with `GET \/rest\/user-avatars`."},{"name":"flagged_by_user_avatar_id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of the team member who flagged the trip."},{"name":"flagged_to_user_avatar_id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of the team member a flagged trip is assigned to."},{"name":"trip_method","in":"query","required":false,"schema":{"type":"string"},"description":"Booking method slug, the `trip_method` value on a trip: `phone_inbound`, `phone_outbound`, `walkup`, `chat`, `ecommerce`, `email`, `reseller`, `ai_phone_agent`, `AI_CHAT_BOT` or `ai_call_bot`."},{"name":"pax_count","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Early access: will be renamed to `pax_cnt`. Bare value for equality, or {eq|gte|lte} as \u0022?pax_count[op]=value\u0022."},{"name":"fixed_transaction_fee_guest","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Fixed transaction fee guest \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?fixed_transaction_fee_guest[op]=value\u0022."},{"name":"fixed_transaction_fee_account","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Fixed transaction fee account \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?fixed_transaction_fee_account[op]=value\u0022."},{"name":"fixed_transaction_fee_guest_offline","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Fixed transaction fee guest offline \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?fixed_transaction_fee_guest_offline[op]=value\u0022."},{"name":"fixed_transaction_fee_guest_amount","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Fixed transaction fee guest amount \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?fixed_transaction_fee_guest_amount[op]=value\u0022."},{"name":"fixed_transaction_fee_account_amount","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Fixed transaction fee account amount \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?fixed_transaction_fee_account_amount[op]=value\u0022."},{"name":"variable_transaction_fee_guest_amount","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Variable transaction fee guest amount \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?variable_transaction_fee_guest_amount[op]=value\u0022."},{"name":"variable_transaction_fee_account_amount","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Variable transaction fee account amount \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?variable_transaction_fee_account_amount[op]=value\u0022."},{"name":"fee_guest_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Fee guest total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?fee_guest_total[op]=value\u0022."},{"name":"fee_account_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Fee account total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?fee_account_total[op]=value\u0022."},{"name":"fee_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Fee total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?fee_total[op]=value\u0022."},{"name":"total_with_fees","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Total with fees \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?total_with_fees[op]=value\u0022."},{"name":"mkt_landing_url","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Mkt landing url \u2014 bare value for equality, or {eq|begins_with} as \u0022?mkt_landing_url[op]=value\u0022."},{"name":"mkt_referrer_url","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Mkt referrer url \u2014 bare value for equality, or {eq|begins_with} as \u0022?mkt_referrer_url[op]=value\u0022."},{"name":"mkt_cmp","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Mkt cmp \u2014 bare value for equality, or {eq|begins_with} as \u0022?mkt_cmp[op]=value\u0022."},{"name":"mkt_adg","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Mkt adg (equality)."},{"name":"mkt_keyword","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Mkt keyword \u2014 bare value for equality, or {eq|begins_with} as \u0022?mkt_keyword[op]=value\u0022."},{"name":"mkt_ad_position","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Mkt ad position (equality)."},{"name":"location_id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of a location, a trip\u0027s `location_id`. Find one with `GET \/rest\/locations`."},{"name":"mkt_first_view","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Mkt first view \u2014 bare value for equality, or {gte|lte} as \u0022?mkt_first_view[op]=value\u0022."},{"name":"reseller_id","in":"query","required":false,"schema":{"type":"string"},"description":"Public id of a reseller, the same id a breakdown by reseller returns. An OTA such as Expedia is a reseller."},{"name":"reseller_commission","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Reseller commission \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?reseller_commission[op]=value\u0022."},{"name":"commissionable_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Commissionable total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?commissionable_total[op]=value\u0022."},{"name":"non_commissionable_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Non commissionable total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?non_commissionable_total[op]=value\u0022."},{"name":"currency","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Currency (equality)."},{"name":"reseller_collect_type","in":"query","required":false,"schema":{"type":"string"},"description":"Who collects payment on a reseller trip: `retail` or `wholesale`."},{"name":"reseller_commission_rate","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Reseller commission rate \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?reseller_commission_rate[op]=value\u0022."},{"name":"reseller_commission_type","in":"query","required":false,"schema":{"type":"number"},"description":"Filter by Reseller commission type (equality)."},{"name":"trip_gift_card_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Trip gift card total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?trip_gift_card_total[op]=value\u0022."},{"name":"tip","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Early access: will be renamed to `tip_total`. Bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tip[op]=value\u0022."},{"name":"session_page_views","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Session page views \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?session_page_views[op]=value\u0022."},{"name":"session_browser_size","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Session browser size (equality)."},{"name":"session_browser_version","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Session browser version (equality)."},{"name":"session_browser_name","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Session browser name (equality)."},{"name":"session_browser_user_agent","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Session browser user agent \u2014 bare value for equality, or {eq|begins_with} as \u0022?session_browser_user_agent[op]=value\u0022."},{"name":"session_browser_device_type","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Session browser device type (equality)."},{"name":"session_browser_os","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Session browser os (equality)."},{"name":"session_language","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Session language (equality)."},{"name":"session_locale","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Session locale (equality)."},{"name":"mkt_gclid","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Mkt gclid (equality)."},{"name":"mkt_msclid","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Mkt msclid (equality)."},{"name":"mkt_fbclid","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Mkt fbclid (equality)."},{"name":"session_location_label","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Session location label \u2014 bare value for equality, or {eq|begins_with} as \u0022?session_location_label[op]=value\u0022."},{"name":"trip_type","in":"query","required":false,"schema":{"type":"string"},"description":"Trip type slug: `experience`, `gift` or `product`."},{"name":"cart_abandons_sent_at_conversion","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Early access: will be renamed to `cart_abandons_sent_at_conversion_cnt`. Bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?cart_abandons_sent_at_conversion[op]=value\u0022."},{"name":"is_automated_conversion","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is automated conversion (equality)."},{"name":"is_assisted_conversion","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is assisted conversion (equality)."},{"name":"trip_unlocked_override","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Trip unlocked override (equality)."},{"name":"tax_1_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 1 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_1_total[op]=value\u0022."},{"name":"tax_2_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 2 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_2_total[op]=value\u0022."},{"name":"tax_3_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 3 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_3_total[op]=value\u0022."},{"name":"tax_4_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 4 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_4_total[op]=value\u0022."},{"name":"tax_5_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 5 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_5_total[op]=value\u0022."},{"name":"tax_6_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 6 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_6_total[op]=value\u0022."},{"name":"tax_7_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 7 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_7_total[op]=value\u0022."},{"name":"tax_8_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 8 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_8_total[op]=value\u0022."},{"name":"tax_9_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 9 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_9_total[op]=value\u0022."},{"name":"tax_10_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 10 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_10_total[op]=value\u0022."},{"name":"tax_11_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 11 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_11_total[op]=value\u0022."},{"name":"tax_12_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 12 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_12_total[op]=value\u0022."},{"name":"tax_13_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 13 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_13_total[op]=value\u0022."},{"name":"tax_14_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 14 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_14_total[op]=value\u0022."},{"name":"tax_15_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 15 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_15_total[op]=value\u0022."},{"name":"tax_16_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 16 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_16_total[op]=value\u0022."},{"name":"tax_17_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 17 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_17_total[op]=value\u0022."},{"name":"tax_18_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 18 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_18_total[op]=value\u0022."},{"name":"tax_19_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 19 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_19_total[op]=value\u0022."},{"name":"tax_20_total","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Tax 20 total \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?tax_20_total[op]=value\u0022."},{"name":"total_sales","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Early access: will be renamed to `earned_revenue_total`. Bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?total_sales[op]=value\u0022."},{"name":"products_cnt","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Products cnt \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?products_cnt[op]=value\u0022."},{"name":"addons_cnt","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Addons cnt \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?addons_cnt[op]=value\u0022."},{"name":"comped_pax_cnt","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Comped pax cnt \u2014 bare value for equality, or {eq|gt|gte|lt|lte} as \u0022?comped_pax_cnt[op]=value\u0022."},{"name":"voucher_number","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Voucher number (equality)."},{"name":"group_name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Group name \u2014 bare value for equality, or {eq|begins_with} as \u0022?group_name[op]=value\u0022."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"trips":{"type":"array","items":{"$ref":"#\/components\/schemas\/Trip"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/trips\/{id}":{"get":{"operationId":"trips_get","summary":"Get one","description":"Returns a single trip by id with its full tree: `trip_orders` (every activity on the trip, including cancelled ones) and each order\u0027s `bookings`, fully detailed. A deleted trip (removed by staff, not a cancellation) is still returned; its `trip_status` is `deleted`. Cancelled activities show as `trip_orders[].status` `cancelled` with `cancelled_at`.\n\n**Early access:** `paid`, `due`, `total_sales`, `pax_count`, `tip` and `cart_abandons_sent_at_conversion` will be renamed to `payments_total`, `balance_due_total`, `earned_revenue_total`, `pax_cnt`, `tip_total` and `cart_abandons_sent_at_conversion_cnt`.\n\n### Required scope\n\n`trips.read`","x-required-scope":"trips.read","x-required-scopes":["trips.read"],"tags":["trips"],"security":[{"bearerAuth":["trips.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"trip":{"$ref":"#\/components\/schemas\/Trip"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/user-avatars":{"get":{"operationId":"user_avatars_list","summary":"List","description":"Returns a paginated list of team members, optionally filtered and sorted. TripWorks-managed (internal) accounts are never included.\n\n### Required scope\n\n`user-avatars.read`","x-required-scope":"user-avatars.read","x-required-scopes":["user-avatars.read"],"tags":["user-avatars"],"security":[{"bearerAuth":["user-avatars.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: created_at."},{"name":"invited_at","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Invited at \u2014 bare value for equality, or {eq|gte|lte} as \u0022?invited_at[op]=value\u0022."},{"name":"first_name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by First name \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?first_name[op]=value\u0022."},{"name":"last_name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Last name \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?last_name[op]=value\u0022."},{"name":"email","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Email \u2014 bare value for equality, or {eq|contains} as \u0022?email[op]=value\u0022."},{"name":"is_disabled","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is disabled (equality)."},{"name":"is_tripworks_managed","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is tripworks managed (equality)."},{"name":"last_timezone","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Last timezone (equality)."},{"name":"title","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"}}},"description":"Filter by Title \u2014 bare value for equality, or {eq|contains} as \u0022?title[op]=value\u0022."},{"name":"color","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by Color (equality)."},{"name":"is_tip_eligible","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is tip eligible (equality)."},{"name":"last_activity","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"gte":{"type":"string"},"lte":{"type":"string"}}},"description":"Filter by Last activity \u2014 bare value for equality, or {eq|gte|lte} as \u0022?last_activity[op]=value\u0022."},{"name":"is_setup_tasks_shown","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is setup tasks shown (equality)."},{"name":"is_opt_out","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is opt out (equality)."},{"name":"is_guide","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is guide (equality)."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"user_avatars":{"type":"array","items":{"$ref":"#\/components\/schemas\/UserAvatar"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/rest\/user-avatars\/{id}":{"get":{"operationId":"user_avatars_get","summary":"Get one","description":"Returns a single team member by id.\n\n### Required scope\n\n`user-avatars.read`","x-required-scope":"user-avatars.read","x-required-scopes":["user-avatars.read"],"tags":["user-avatars"],"security":[{"bearerAuth":["user-avatars.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"user_avatar":{"$ref":"#\/components\/schemas\/UserAvatar"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"patch":{"operationId":"user_avatars_update","summary":"Update","description":"Updates a team member\u0027s profile fields and other writable columns. Only the fields you include are changed. Login password and permission-group assignment are not writable over REST in v1.\n\n### Required scope\n\n`user-avatars.write`","x-required-scope":"user-avatars.write","x-required-scopes":["user-avatars.write"],"tags":["user-avatars"],"security":[{"bearerAuth":["user-avatars.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"user_avatar":{"$ref":"#\/components\/schemas\/UserAvatar"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/UserAvatarWrite"},"example":{"title":"Ops Lead","is_tip_eligible":true}}}}}},"\/rest\/waiver-types":{"get":{"operationId":"waiver_types_list","summary":"List","description":"Returns a paginated list of waiver types, ordered by name, optionally filtered and sorted. Every field can be filtered: `name` and `title` with `eq`, `contains` or `begins_with`; `body` and `body_minor` with `contains`; the age limits with `eq`, `gte` or `lte`; the flags and `waiver_type_status` (a slug) with `eq`. Sort by `name`.\n\n### Required scope\n\n`waiver-types.read`","x-required-scope":"waiver-types.read","x-required-scopes":["waiver-types.read"],"tags":["waiver-types"],"security":[{"bearerAuth":["waiver-types.read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque value from a previous response\u0027s meta.next_cursor."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"maximum":25}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated sort keys; prefix with \u0022-\u0022 for descending. Valid keys: name."},{"name":"name","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Name \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?name[op]=value\u0022."},{"name":"is_require_middle_name","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is require middle name (equality)."},{"name":"is_require_dob_adult","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is require dob adult (equality)."},{"name":"is_require_dob_minor","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is require dob minor (equality)."},{"name":"is_require_phone","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is require phone (equality)."},{"name":"is_require_email","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is require email (equality)."},{"name":"is_ask_minor_relationship","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is ask minor relationship (equality)."},{"name":"is_minor_required_to_sign","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is minor required to sign (equality)."},{"name":"is_notify_customer_complete","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is notify customer complete (equality)."},{"name":"is_require_insurance_info","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is require insurance info (equality)."},{"name":"is_require_driver_license_text_adult","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is require driver license text adult (equality)."},{"name":"is_require_id_text_minor","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is require id text minor (equality)."},{"name":"title","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"string"},"contains":{"type":"string"},"begins_with":{"type":"string"}}},"description":"Filter by Title \u2014 bare value for equality, or {eq|contains|begins_with} as \u0022?title[op]=value\u0022."},{"name":"body","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"contains":{"type":"string"}}},"description":"Filter by Body \u2014 bare value for equality, or {contains} as \u0022?body[op]=value\u0022."},{"name":"body_minor","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"contains":{"type":"string"}}},"description":"Filter by Body minor \u2014 bare value for equality, or {contains} as \u0022?body_minor[op]=value\u0022."},{"name":"is_require_emergency_contact","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is require emergency contact (equality)."},{"name":"waiver_type_status","in":"query","required":false,"schema":{"type":"string"},"description":"The status slug: `draft`, `active` or `archived`."},{"name":"is_minor_body_same_as_adult","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is minor body same as adult (equality)."},{"name":"is_require_address","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is require address (equality)."},{"name":"is_require_city","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is require city (equality)."},{"name":"is_require_state","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is require state (equality)."},{"name":"is_require_zip","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by Is require zip (equality)."},{"name":"adult_age_years_min","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Adult age years min \u2014 bare value for equality, or {eq|gte|lte} as \u0022?adult_age_years_min[op]=value\u0022."},{"name":"minor_age_years_min","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Minor age years min \u2014 bare value for equality, or {eq|gte|lte} as \u0022?minor_age_years_min[op]=value\u0022."},{"name":"minor_age_years_max","in":"query","required":false,"style":"deepObject","explode":true,"schema":{"type":"object","properties":{"eq":{"type":"number"},"gte":{"type":"number"},"lte":{"type":"number"}}},"description":"Filter by Minor age years max \u2014 bare value for equality, or {eq|gte|lte} as \u0022?minor_age_years_max[op]=value\u0022."}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"waiver_types":{"type":"array","items":{"$ref":"#\/components\/schemas\/WaiverType"}},"meta":{"type":"object","properties":{"per_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"post":{"operationId":"waiver_types_create","summary":"Create","description":"`body` is required; every other field has a default. `name` defaults to `Waiver` and `title` to `Waiver \u0026 Release of Liability Form`, but names are unique within the account, so send your own `name`. `waiver_type_status` defaults to `active`. `body_minor` is required unless `is_minor_body_same_as_adult` is true (the default).\n\n### Required scope\n\n`waiver-types.write`","x-required-scope":"waiver-types.write","x-required-scopes":["waiver-types.write"],"tags":["waiver-types"],"security":[{"bearerAuth":["waiver-types.write"]}],"responses":{"201":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"waiver_type":{"$ref":"#\/components\/schemas\/WaiverType"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/WaiverTypeWrite"},"example":{"name":"Liability waiver","title":"Waiver \u0026 Release of Liability Form","body":"\u003Cp\u003EI understand the risks of this activity...\u003C\/p\u003E","is_require_phone":true}}}}}},"\/rest\/waiver-types\/{id}":{"get":{"operationId":"waiver_types_get","summary":"Get one","description":"Returns a single waiver type by id, including its waiver text and every signer requirement.\n\n### Required scope\n\n`waiver-types.read`","x-required-scope":"waiver-types.read","x-required-scopes":["waiver-types.read"],"tags":["waiver-types"],"security":[{"bearerAuth":["waiver-types.read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"waiver_type":{"$ref":"#\/components\/schemas\/WaiverType"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}},"patch":{"operationId":"waiver_types_update","summary":"Update","description":"Updates a waiver type. Only the fields you include are changed; omitted fields are left as-is. Setting `waiver_type_status` to `archived` is refused with 409 `in_use_archive` while an activity uses the waiver type. Sending `waiver_type_status: null` is rejected with 422; the status cannot be cleared.\n\n### Required scope\n\n`waiver-types.write`","x-required-scope":"waiver-types.write","x-required-scopes":["waiver-types.write"],"tags":["waiver-types"],"security":[{"bearerAuth":["waiver-types.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"waiver_type":{"$ref":"#\/components\/schemas\/WaiverType"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/WaiverTypeWrite"},"example":{"is_require_email":false}}}}},"delete":{"operationId":"waiver_types_delete","summary":"Delete","description":"Permanently deletes a waiver type. Blocked (409 `in_use_delete`) if it has been signed, is used by an activity or is required on a booking; archive it instead. The error includes `dependencies` with the signed, activity and booking counts.\n\n### Required scope\n\n`waiver-types.write`","x-required-scope":"waiver-types.write","x-required-scopes":["waiver-types.write"],"tags":["waiver-types"],"security":[{"bearerAuth":["waiver-types.write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"description":"Missing or malformed Authorization header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"The API key does not have the required scope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"No resource found for this id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Validation failed, or an unknown\/invalid field was supplied","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Blocked by a business rule \u2014 see the response body for the specific reason","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}}},"webhooks":{"trip_created":{"post":{"operationId":"webhook_trip_created","tags":["webhooks"],"summary":"Trip Created","description":"When a trip is created, TripWorks sends a POST request to your registered URL for this event. The exact fields vary by event \u2014 see Setup \u2192 Integrations \u2192 Webhooks in your account for a live example payload.","requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["event"],"properties":{"event":{"type":"string","enum":["trip_created"]}},"additionalProperties":true,"example":{"event":"trip_created","tripOrders":[{"created_at":"2026-02-26T00:05:34+00:00","experience_total":20000,"addons_total":3000,"products_total":0,"pickup_total":0,"note":"Guest called ahead about weather","promo_code_total":0,"voucher_code_discount":0,"total_sales":23000,"bookings":[{"booking_resources":[],"id":5201661,"created_at":"2026-02-26T00:05:34+00:00","status":{"id":15,"name":"Not Checked In"},"customer":{"full_name":"Jim Smith","phone_format_intl":"+1 201-555-1212","id":5567611,"code":"EQR-GCAN","first_name":"Jim","last_name":"Smith","email":"test-q46ye@gmail.com","phone":"+12015551212","phone_format_164":"+12015551212"},"experience_customer_type":{"id":195,"name":"Adult","description":"price per person"},"custom_field_values":[],"addons":[{"id":371942,"experience_addon":{"id":31,"title":"Ultimate Hike"},"name":"La caminata definitiva","price":25000},{"id":371943,"experience_addon":{"id":6515,"title":"Lunch"},"name":"Lunch","price":1000}],"is_complimentary":false}],"experience":{"internal_name":"Hiking","id":105,"name":"Hiking","duration":480,"color":"#4e5dc1"},"experience_timeslot":{"label":"11:00 AM","start_time":"2026-02-28T11:00:00+00:00","end_time":"2026-02-28T19:00:00+00:00"},"addons":[],"status":{"id":1,"slug":"booked","name":"Booked"},"pax_count":1,"addons_cnt":2}],"custom_field_values":[{"custom_field":{"internal_name":"Team Color"}},{"custom_field":{"internal_name":"Shirts Needed"}},{"custom_field":{"internal_name":"Club Kay"},"bit_value":false},{"custom_field":{"internal_name":"Club Kay"},"bit_value":false}],"display_name":"Jim Smith","session_ip_address":"74.115.209.58","id":2088161,"confirmation_code":"ZHXZ-MTQA","trip_status":{"slug":"draft","name":"Draft"},"created_at":"2026-02-26T00:05:34+00:00","reserved_at":null,"sale_date":"2026-02-28T00:00:00+00:00","customer":{"full_name":"Jim Smith","phone_format_intl":"+1 201-555-1212","id":5567611,"code":"EQR-GCAN","first_name":"Jim","last_name":"Smith","email":"test-q46ye@gmail.com","phone":"+12015551212","phone_format_164":"+12015551212"},"payments":[],"subtotal":23000,"total":24200,"paid":0,"due":24200,"created_by_user_avatar":{"full_name":"Jim Jones","abbrev_name":"Jim J.","photo_url_full_path":"https:\/\/cdn-images.tripworks.com\/tenants\/profiles\/3279dbe7be00f496044307.jpg","id":58,"first_name":"Jim","last_name":"Jones","is_tripworks_managed":true},"trip_method":{"name":"Walkup","color":"#3498eb","slug":"walkup"},"reseller_commission":0,"session_browser_version":"145.0.0.0","session_browser_name":"Chrome","session_browser_user_agent":"Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/145.0.0.0 Safari\/537.36","session_browser_os":"Apple","session_latitude":"32.79670000","session_longitude":"-117.13670000","session_location_label":"San Diego, California US","total_sales":24200,"products_cnt":0,"addons_cnt":2}}}}},"responses":{"200":{"description":"Return any 2xx status to acknowledge receipt."}}}},"trip_reserved":{"post":{"operationId":"webhook_trip_reserved","tags":["webhooks"],"summary":"Trip Reserved","description":"When a trip is reserved, TripWorks sends a POST request to your registered URL for this event. The exact fields vary by event \u2014 see Setup \u2192 Integrations \u2192 Webhooks in your account for a live example payload.","requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["event"],"properties":{"event":{"type":"string","enum":["trip_reserved"]}},"additionalProperties":true,"example":{"event":"trip_reserved","tripOrders":[{"created_at":"2026-02-26T00:05:34+00:00","experience_total":20000,"addons_total":3000,"products_total":0,"pickup_total":0,"note":"Guest called ahead about weather","promo_code_total":0,"voucher_code_discount":0,"total_sales":23000,"bookings":[{"booking_resources":[],"id":5201661,"created_at":"2026-02-26T00:05:34+00:00","status":{"id":15,"name":"Not Checked In"},"customer":{"full_name":"Jim Smith","phone_format_intl":"+1 201-555-1212","id":5567611,"code":"EQR-GCAN","first_name":"Jim","last_name":"Smith","email":"test-q46ye@gmail.com","phone":"+12015551212","phone_format_164":"+12015551212"},"experience_customer_type":{"id":195,"name":"Adult","description":"price per person"},"custom_field_values":[],"addons":[{"id":371942,"experience_addon":{"id":31,"title":"Ultimate Hike"},"name":"La caminata definitiva","price":25000},{"id":371943,"experience_addon":{"id":6515,"title":"Lunch"},"name":"Lunch","price":1000}],"is_complimentary":false}],"experience":{"internal_name":"Hiking","id":105,"name":"Hiking","duration":480,"color":"#4e5dc1"},"experience_timeslot":{"label":"11:00 AM","start_time":"2026-02-28T11:00:00+00:00","end_time":"2026-02-28T19:00:00+00:00"},"addons":[],"status":{"id":1,"slug":"booked","name":"Booked"},"pax_count":1,"addons_cnt":2}],"custom_field_values":[{"custom_field":{"internal_name":"Team Color"}},{"custom_field":{"internal_name":"Shirts Needed"}},{"custom_field":{"internal_name":"Club Kay"},"bit_value":false},{"custom_field":{"internal_name":"Club Kay"},"bit_value":false}],"display_name":"Jim Smith","session_ip_address":"74.115.209.58","id":2088161,"confirmation_code":"ZHXZ-MTQA","trip_status":{"slug":"reserved","name":"Reserved"},"created_at":"2026-02-26T00:05:34+00:00","reserved_at":"2026-02-26T00:05:57+00:00","sale_date":"2026-02-28T00:00:00+00:00","customer":{"full_name":"Jim Smith","phone_format_intl":"+1 201-555-1212","id":5567611,"code":"EQR-GCAN","first_name":"Jim","last_name":"Smith","email":"test-q46ye@gmail.com","phone":"+12015551212","phone_format_164":"+12015551212"},"payments":[],"subtotal":23000,"total":24200,"paid":0,"due":24200,"created_by_user_avatar":{"full_name":"Jim Jones","abbrev_name":"Jim J.","photo_url_full_path":"https:\/\/cdn-images.tripworks.com\/tenants\/profiles\/3279dbe7be00f496044307.jpg","id":58,"first_name":"Jim","last_name":"Jones","is_tripworks_managed":true},"trip_method":{"name":"Walkup","color":"#3498eb","slug":"walkup"},"reseller_commission":0,"session_browser_version":"145.0.0.0","session_browser_name":"Chrome","session_browser_user_agent":"Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/145.0.0.0 Safari\/537.36","session_browser_os":"Apple","session_latitude":"32.79670000","session_longitude":"-117.13670000","session_location_label":"San Diego, California US","total_sales":24200,"products_cnt":0,"addons_cnt":2}}}}},"responses":{"200":{"description":"Return any 2xx status to acknowledge receipt."}}}},"payment_created":{"post":{"operationId":"webhook_payment_created","tags":["webhooks"],"summary":"Payment Created","description":"Payment Created, TripWorks sends a POST request to your registered URL for this event. The exact fields vary by event \u2014 see Setup \u2192 Integrations \u2192 Webhooks in your account for a live example payload.","requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["event"],"properties":{"event":{"type":"string","enum":["payment_created"]}},"additionalProperties":true,"example":{"event":"payment_created","id":1277113,"created_at":"2026-02-26T00:20:05+00:00","amount":5000,"status":{"id":6,"name":"Successful"},"type":{"id":1,"name":"Cash"},"is_card_present":false,"direction":{"id":1,"name":"Payment"},"net_amount":5000,"trip":{"tripOrders":[{"created_at":"2026-02-11T19:10:21+00:00","bookings":[{"booking_resources":[],"id":5197287,"created_at":"2026-02-11T19:10:21+00:00","status":{"id":15,"name":"Not Checked In"},"customer":{"full_name":"James Smith","phone_format_intl":"+1 321-321-1231","id":5570203,"code":"WJTX-PLKM","first_name":"James","last_name":"Smith","email":"jamessmithy123@yahoo.com","phone_format_164":"+13213211231"},"experience_customer_type":{"id":194,"name":"Adult","description":"Ages 18-99"},"custom_field_values":[{"custom_field":{"internal_name":"Shirt Size"}},{"custom_field":{"internal_name":"Fishing License"}}],"addons":[{"id":371935,"experience_addon":{"id":1066,"title":"Charcuterie Board"},"name":"Charcuterie Board","price":60000}],"is_complimentary":false}],"experience":{"internal_name":"Swimming","id":104,"name":"Swimming","duration":240,"color":"#0081a8"},"experience_timeslot":{"label":"10:00 AM","start_time":"2026-02-20T10:00:00+00:00","end_time":"2026-02-20T14:00:00+00:00"},"addons":[],"status":{"id":1,"slug":"booked","name":"Booked"},"experience_total":35000,"addons_total":61000,"products_total":0,"pickup_total":0,"note":"Guest called ahead about weather","promo_code_total":0,"voucher_code_discount":0,"total_sales":96000,"pax_count":7,"addons_cnt":1}],"display_name":"James Smith","id":2086899,"confirmation_code":"WRYW-DHHJ","trip_status":{"slug":"reserved","name":"Reserved"},"created_at":"2026-02-11T19:10:21+00:00","reserved_at":"2026-02-26T00:20:05+00:00","sale_date":"2026-02-20T00:00:00+00:00","customer":{"full_name":"James Smith","id":5570203,"code":"WJTX-PLKM","first_name":"James","last_name":"Smith","email":"jamessmithy123@yahoo.com"},"subtotal":96000,"total":106377,"paid":5000,"due":101377,"trip_method":{"name":"Walkup","color":"#3498eb","slug":"walkup"}},"owner":{"full_name":"Aaron Fessler","first_name":"Aaron","last_name":"Fessler"},"currency":"USD","tip":0}}}}},"responses":{"200":{"description":"Return any 2xx status to acknowledge receipt."}}}},"waiver_signed":{"post":{"operationId":"webhook_waiver_signed","tags":["webhooks"],"summary":"Waiver Signed","description":"When a waiver is signed, TripWorks sends a POST request to your registered URL for this event. The exact fields vary by event \u2014 see Setup \u2192 Integrations \u2192 Webhooks in your account for a live example payload.","requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["event"],"properties":{"event":{"type":"string","enum":["waiver_signed"]}},"additionalProperties":true,"example":{"event":"waiver_signed","full_name":"Another One","experience_name":"Swimming","id":1081786,"bookings":[{"booking_resources":[],"id":5197289,"created_at":"2026-02-11T19:10:21+00:00","status":{"id":15,"name":"Not Checked In"},"customer":{"full_name":"Another One","id":5571894,"code":"ZQNR-FVDT","first_name":"Another","last_name":"One","email":"another@one.com","phone":"+12015551212","bookings":[],"phone_format_164":"+12015551212"},"experience_customer_type":{"id":194,"name":"Adult","description":"Ages 18-99"},"custom_field_values":[[],[]],"addons":[],"is_complimentary":false}],"created_at":"2026-02-26T00:27:50+00:00","waiver_url":"v7ucqz88rvgd","customer":{"full_name":"Another One","id":5571894,"code":"ZQNR-FVDT","first_name":"Another","last_name":"One","email":"another@one.com","phone":"+12015551212","bookings":[{"booking_resources":[],"id":5197289,"created_at":"2026-02-11T19:10:21+00:00","status":{"id":15,"name":"Not Checked In"},"experience_customer_type":{"id":194,"name":"Adult","description":"Ages 18-99"},"custom_field_values":[[],[]],"addons":[],"is_complimentary":false}],"phone_format_164":"+12015551212"},"waiver_type":{"id":2,"name":"Liability Waiver"},"first_name":"Another","last_name":"One","is_waiver_adult":true,"email":"another@one.com","dob":"2006-04-14","phone":"+12015551212","signed_pdf":"https:\/\/cdn-images.tripworks.com\/tenants\/demo\/waivers\/v7ucqz88rvgd.pdf"}}}}},"responses":{"200":{"description":"Return any 2xx status to acknowledge receipt."}}}},"payout":{"post":{"operationId":"webhook_payout","tags":["webhooks"],"summary":"Payout","description":"When a payout is received, TripWorks sends a POST request to your registered URL for this event. The exact fields vary by event \u2014 see Setup \u2192 Integrations \u2192 Webhooks in your account for a live example payload.","requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["event"],"properties":{"event":{"type":"string","enum":["payout"]}},"additionalProperties":true,"example":{"event":"payout","id":482910,"created_at":"2026-02-26T08:00:00+00:00","status":{"id":1,"name":"Paid"},"amount":184200,"fee":5200,"net":179000,"currency":"USD","arrival_date":"2026-02-28T00:00:00+00:00","stripe_payout_id":"po_3NxYz1234567890","bank_account":{"last4":"6789","bank_name":"Chase"}}}}}},"responses":{"200":{"description":"Return any 2xx status to acknowledge receipt."}}}},"customer_create":{"post":{"operationId":"webhook_customer_create","tags":["webhooks"],"summary":"Customer Create","description":"When a customer is created, TripWorks sends a POST request to your registered URL for this event. The exact fields vary by event \u2014 see Setup \u2192 Integrations \u2192 Webhooks in your account for a live example payload.","requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["event"],"properties":{"event":{"type":"string","enum":["customer_create"]}},"additionalProperties":true,"example":{"event":"customer_create","full_name":"Jim Smith","phone_format_intl":"+1 201-555-1212","phone_country_code":"US","mappable_position":"New Jersey United States","location_description":"New Jersey, USA","id":5567611,"created_at":"2026-02-26T00:20:59+00:00","code":"EQR-GCAN","first_name":"Jim","last_name":"Smith","email":"test-xaj1s@gmail.com","phone":"+12015551212","country":[],"is_vip":false,"is_opt_in":true,"timezone":"America\/New_York","phone_format_164":"+12015551212"}}}}},"responses":{"200":{"description":"Return any 2xx status to acknowledge receipt."}}}},"customer_update":{"post":{"operationId":"webhook_customer_update","tags":["webhooks"],"summary":"Customer Update","description":"When a customer is updated, TripWorks sends a POST request to your registered URL for this event. The exact fields vary by event \u2014 see Setup \u2192 Integrations \u2192 Webhooks in your account for a live example payload.","requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["event"],"properties":{"event":{"type":"string","enum":["customer_update"]}},"additionalProperties":true,"example":{"event":"customer_update","full_name":"Jim Smith","phone_format_intl":"+1 201-555-1212","phone_country_code":"US","mappable_position":"New Jersey United States","location_description":"New Jersey, USA","id":5567611,"created_at":"2026-02-26T00:20:59+00:00","code":"EQR-GCAN","first_name":"Jim","last_name":"Smith","email":"test-xaj1s@gmail.com","phone":"+12015551212","country":[],"is_vip":false,"is_opt_in":true,"timezone":"America\/New_York","phone_format_164":"+12015551212"}}}}},"responses":{"200":{"description":"Return any 2xx status to acknowledge receipt."}}}},"trip_updated":{"post":{"operationId":"webhook_trip_updated","tags":["webhooks"],"summary":"Trip Updated","description":"When a trip is updated, TripWorks sends a POST request to your registered URL for this event. The exact fields vary by event \u2014 see Setup \u2192 Integrations \u2192 Webhooks in your account for a live example payload.","requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["event"],"properties":{"event":{"type":"string","enum":["trip_updated"]}},"additionalProperties":true,"example":{"event":"trip_updated","tripOrders":[{"created_at":"2026-02-26T00:05:34+00:00","experience_total":20000,"addons_total":3000,"products_total":0,"pickup_total":0,"note":"Guest called ahead about weather","promo_code_total":0,"voucher_code_discount":0,"total_sales":23000,"bookings":[{"id":5201661,"status":{"id":15,"name":"Not Checked In"},"customer":{"full_name":"Jim Smith","id":5567611,"code":"EQR-GCAN","first_name":"Jim","last_name":"Smith","email":"test@gmail.com"}}],"experience":{"id":105,"name":"Hiking"},"experience_timeslot":{"start_time":"2026-02-28T11:00:00+00:00","end_time":"2026-02-28T19:00:00+00:00"},"status":{"id":1,"slug":"booked","name":"Booked"},"pax_count":1,"addons_cnt":2}],"id":2088161,"confirmation_code":"ZHXZ-MTQA","trip_status":{"slug":"reserved","name":"Reserved"},"created_at":"2026-02-26T00:05:34+00:00","reserved_at":"2026-02-26T00:05:57+00:00","sale_date":"2026-02-28T00:00:00+00:00","subtotal":23000,"total":24200,"paid":24200,"due":0}}}}},"responses":{"200":{"description":"Return any 2xx status to acknowledge receipt."}}}},"trip_cancelled":{"post":{"operationId":"webhook_trip_cancelled","tags":["webhooks"],"summary":"Trip Cancelled","description":"When a trip is cancelled, TripWorks sends a POST request to your registered URL for this event. The exact fields vary by event \u2014 see Setup \u2192 Integrations \u2192 Webhooks in your account for a live example payload.","requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["event"],"properties":{"event":{"type":"string","enum":["trip_cancelled"]}},"additionalProperties":true,"example":{"event":"trip_cancelled","tripOrders":[{"created_at":"2026-02-26T00:05:34+00:00","experience_total":0,"addons_total":0,"products_total":0,"pickup_total":0,"note":"Guest called ahead about weather","promo_code_total":0,"voucher_code_discount":0,"total_sales":0,"bookings":[],"experience":{"id":105,"name":"Hiking"},"status":{"id":2,"slug":"cancelled","name":"Cancelled"},"pax_count":0,"addons_cnt":0}],"id":2088161,"confirmation_code":"ZHXZ-MTQA","trip_status":{"slug":"cancelled","name":"Cancelled"},"created_at":"2026-02-26T00:05:34+00:00","reserved_at":"2026-02-26T00:05:57+00:00","sale_date":"2026-02-28T00:00:00+00:00","subtotal":0,"total":0,"paid":0,"due":0}}}}},"responses":{"200":{"description":"Return any 2xx status to acknowledge receipt."}}}},"booking_updated":{"post":{"operationId":"webhook_booking_updated","tags":["webhooks"],"summary":"Booking Updated","description":"When a booking is updated, TripWorks sends a POST request to your registered URL for this event. The exact fields vary by event \u2014 see Setup \u2192 Integrations \u2192 Webhooks in your account for a live example payload.","requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["event"],"properties":{"event":{"type":"string","enum":["booking_updated"]}},"additionalProperties":true,"example":{"event":"booking_updated","id":5201661,"confirmation_code":"ZHXZ-MTQA","customer_portal_url":"https:\/\/demo.tripworks.com\/customerPortal\/Wm5adGJIQmpjM1Uy\/index?b=5201661\u0026to=1043221","created_at":"2026-02-26T00:05:34+00:00","status":{"id":15,"name":"Checked In"},"customer":{"full_name":"Jim Smith","id":5567611,"code":"EQR-GCAN","first_name":"Jim","last_name":"Smith","email":"test@gmail.com"},"experience_customer_type":{"id":195,"name":"Adult"},"trip_order":{"experience":{"id":105,"name":"Hiking"},"experience_timeslot":{"start_time":"2026-02-28T11:00:00+00:00","end_time":"2026-02-28T19:00:00+00:00"}},"custom_field_values":[],"is_complimentary":false}}}}},"responses":{"200":{"description":"Return any 2xx status to acknowledge receipt."}}}},"addon_updated":{"post":{"operationId":"webhook_addon_updated","tags":["webhooks"],"summary":"Addon Updated","description":"When an addon is updated, TripWorks sends a POST request to your registered URL for this event. The exact fields vary by event \u2014 see Setup \u2192 Integrations \u2192 Webhooks in your account for a live example payload.","requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["event"],"properties":{"event":{"type":"string","enum":["addon_updated"]}},"additionalProperties":true,"example":{"event":"addon_updated","id":5201661,"confirmation_code":"ZHXZ-MTQA","customer_portal_url":"https:\/\/demo.tripworks.com\/customerPortal\/Wm5adGJIQmpjM1Uy\/index?b=5201661\u0026to=1043221","customer":{"full_name":"Jim Smith","id":5567611,"code":"EQR-GCAN","first_name":"Jim","last_name":"Smith","email":"test@gmail.com"},"trip_order":{"experience":{"id":105,"name":"Hiking"},"experience_timeslot":{"start_time":"2026-02-28T11:00:00+00:00"},"addons":[{"id":371942,"name":"Ultimate Hike","price":25000}]}}}}}},"responses":{"200":{"description":"Return any 2xx status to acknowledge receipt."}}}},"note_created":{"post":{"operationId":"webhook_note_created","tags":["webhooks"],"summary":"Note Created","description":"When a reservation note is added, TripWorks sends a POST request to your registered URL for this event. The exact fields vary by event \u2014 see Setup \u2192 Integrations \u2192 Webhooks in your account for a live example payload.","requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["event"],"properties":{"event":{"type":"string","enum":["note_created"]}},"additionalProperties":true}}}},"responses":{"200":{"description":"Return any 2xx status to acknowledge receipt."}}}},"note_updated":{"post":{"operationId":"webhook_note_updated","tags":["webhooks"],"summary":"Note Updated","description":"When a reservation note is edited, TripWorks sends a POST request to your registered URL for this event. The exact fields vary by event \u2014 see Setup \u2192 Integrations \u2192 Webhooks in your account for a live example payload.","requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["event"],"properties":{"event":{"type":"string","enum":["note_updated"]}},"additionalProperties":true}}}},"responses":{"200":{"description":"Return any 2xx status to acknowledge receipt."}}}}}}