Before you start
A few things are not changing:- The
Headout-Authheader. - Sandbox and production hosts.
- Sandbox / production key prefixes (
tk_/pk_). - The booking status enum (
UNCAPTURED,PENDING,COMPLETED,CANCELLED,FAILED,CAPTURE_TIMEDOUT). - The two-step capture flow (Create → Update with
status: "PENDING").
Step 1 — Catalog discovery
What changed
V1 paths were verb-style and shallow:GET /api/public/v1/cityGET /api/public/v1/category/list-by/city
GET /api/public/v2/cities/GET /api/public/v2/categoriesGET /api/public/v2/collections— new in V2. Themed groupings like “Broadway Shows” or “Statue of Liberty.”GET /api/public/v2/subcategories— new in V2. Finer cuts under a category, like “Museums” or “Landmarks.”
What to do
- Swap the V1 city and category endpoints for their V2 equivalents.
cityCodeis now a query parameter. - Collections and subcategories are optional. You can ignore them and keep your existing city → category → product UI. Adopt them later if you want richer browsing.
Step 2 — Listing and fetching products
What changed
V1 had two product listing endpoints:GET /api/public/v1/product/listing/list-by/cityGET /api/public/v1/product/listing/list-by/category
| What you were reading in V1 | What to read in V2 |
|---|---|
id (integer) | id (string) |
images[] | media[] |
ratingCumulative | reviewsSummary |
ratingCumulative.avg | reviewsSummary.averageRating |
ratingCumulative.count | reviewsSummary.ratingsCount |
pricing (listing/“from” shape) | pricing (canonical — see Pricing) |
Nested startLocation object | Flat LocationDetails on the product |
What to do
- Treat product IDs as opaque strings in V2. If you cast them to integers anywhere in your code, remove that cast.
- Rename your reads:
images→media,ratingCumulative→reviewsSummary, and adjust the sub-field names. - If you used
startLocation.geolocation.latitudeetc. in V1, the same data is now at the top level of the product.
Step 3 — Inventory
What changed
The endpoint moved and one parameter was renamed:- V1:
GET /api/public/v1/inventory/list-by/variant?variantId=... - V2:
GET /api/public/v2/inventory/list-by/tour?tourId=...
paxRange, richer pricing).
What to do
- Swap the path and rename the parameter from
variantIdtotourId. - Continue fetching inventory in real time before booking — that hasn’t changed.
Step 4 — Bookings
What changed
The path is now plural with a trailing slash:- V1:
POST /api/public/v1/booking,PUT /api/public/v1/booking/{id},GET /api/public/v1/booking[/...] - V2:
POST /api/public/v2/bookings/,PUT /api/public/v2/bookings/{bookingId}/,GET /api/public/v2/bookings/,GET /api/public/v2/bookings/{bookingId}/
status: "PENDING".
What to do
- Update the path. Nothing else in the booking creation flow needs to change.
- The status enum is identical, so any status-handling logic carries over.
Step 5 — Pricing
What changed
In V1, thepricing field on a product was a “from” listing price (minimum across variants).
V2 redesigned this so there is a single, canonical pricing object:
pricing(V2) — the object to read. Returnscurrency,profileType(PER_PERSON/PER_GROUP),headoutSellingPrice(MSP), andnetPrice(the partner net price for API Partners).listingPrice(V2) — exists on the response for backward compatibility but is deprecated. Don’t use it in new code.
What to do
- Move pricing reads to V2
pricing. For variant-level pricing, useGet Product— V2 returnspricinginside each variant too. - If you used
pricing.minimumPricein V1 to render a “from” price, the equivalent in V2 is the product-levelpricingobject.
Step 6 — Adopt what’s new in V2
These don’t exist in V1 at all. You can adopt each independently after the basics are migrated.- Webhooks (Create webhook). Replace polling
Get Bookingwith push-based status updates. See Verifying webhook authenticity for the IP-whitelisting workaround. - Cancel (Cancel booking). First-class endpoint. Refund handling is separate from cancellation eligibility — see Cancellation & reschedule policies.
- Reschedule (Reschedule booking). Synchronous acknowledgement plus asynchronous fulfilment.
- Seatmap (Seatmap availabilities, Inventory, Validate, SVG, Iframe). Seat-level theatre and live-entertainment products.