Migration: Areas to Inventory Items
Guide for moving from the Encore API’s GET /api/v4/products/{productId}/areas and detailed availability endpoints to GET /api/v3/events/{eventId}/occurrences/{occurrenceId}/inventory-items in the TTG Storefront API v3, the newer API. The two APIs number their versions separately.
For the full v4 inventory reference, see Product Areas on the legacy portal.
Endpoint Comparison
What Changed
One call, not two
The legacy flow used /detailed availability to size up a date and time, then /areas to pull seats and price bands. v3 replaces both with a single call per occurrence (one date and time of an event) that returns every purchasable item — seats and general admission alike.
Legacy needed no key. v3 needs the three headers in Authentication & Headers on every call.
You need the occurrence id first — get it from GET /api/v3/events/{eventId}/occurrences (see Availability → Occurrences).
The legacy quantity carries over as the optional ?quantity= query parameter. Seats a party of that size can’t pick can still be listed: they carry selectionBlocked, or no selectionGroup, so show them as unavailable. See Seats for a party. Call again when the customer changes the ticket count.
From areas and price bands to typed items
Legacy nested seats inside areas, and areas inside price bands, controlled by groupBy (lump, priceBand). v3 returns a flat list. Each item carries an inventoryVariant with a _type that tells you what it is:
Switch on _type for rendering and quantity logic. A gift-card event’s items are GiftCard, and new types may be added. For the full type reference, see Inventory Types; skip any _type you don’t recognize.
Pricing: all-in sellPrice, not face value plus fees
Legacy split price into faceValue, orderFee, and an includesBookingFee flag, with a percentageDiscount on the side. You had to add them up. v3 gives you sellPrice — the all-in price the customer pays, fees and tax included. When there’s a discount, listPrice carries the original for a strikethrough.
Price bands become price options
Legacy price bands were a property of the area. v3 attaches priceOptions[] to each item — one entry per category (Adult, Child, Senior). Each has its own id, which you pass when you add the item to a cart.
Money format
Both are minor units, but v3 drops decimalPlaces — derive the scale from the currency code with your i18n library. See Money Format.
Seat attributes are always on
Legacy hid seat attributes behind includeSeatsAttributes=true. v3 always returns attributes[], each tagged with a category (POSITIVE, NEGATIVE, ACCESSIBILITY, NEUTRAL, FEATURED) so you can badge them consistently. See Inventory Types.
Response Shape
New (v3)
Key differences:
- The response is paginated — items are in
data[], with apaginationblock. See Pagination. - The item
idis a versioned, opaque token (v1_…) — pass it whole, with apriceOptionId, toPOST /api/v3/carts.priceOptionIdhas no prefix. Never build either by hand. - Inventory item and price option IDs are tokens — the same seat, price and rate code give the same token. Still re-fetch inventory before you build a cart: prices and price options can change.
inventoryVariant.idis stable across occurrences — the same seat returns the same variant ID on every date, safe to cache for seating charts
Migration Checklist
- Send
X-TT-API-Key,X-TT-RetailerandX-TT-Platformon every call - Replace the two-call area/detailed flow with one
inventory-itemscall per occurrence - Get the occurrence
idfirst fromGET /api/v3/events/{eventId}/occurrences - Switch on
inventoryVariant._typeinstead of walking areas and price bands - Read
sellPriceas the all-in price — stop summingfaceValueandorderFee - Show
listPricestruck through when it’s present; there’s nopercentageDiscountto apply - Read each item’s
priceOptions[]for its prices; keep thepriceOptionIdfor the cart step - Drop
decimalPlaces— derive the scale from the currency code - Treat the item
id(the wholev1_…token) andpriceOptionIdas opaque; re-fetch inventory before each cart, because prices can change - Page with
limit/offsetuntiloffset >= pagination.total
Next Steps
With inventory in hand, continue the Purchase Flow:
- Create Cart —
POST /api/v3/carts(see Baskets → Carts) - Checkout —
POST /api/v3/orders(see Checkout → Orders)