Skip to main content

Eventim API Workflow - TickAndLive.Connect.TempsReel

Overview

This document presents the complete workflow for using the Eventim API for event catalog management and shopping cart creation.

API Base Path: /api/v1/eventim/


1. General Architecture

Description

The Aparté ticketing solution has one database per site. Each site is autonomous, you will have one entry point (credentials) per site. Data will therefore be partitioned and specific. No object should be managed in a common way between 2 sites.

Multi-database and Multi-connector Architecture Schema

%%{init: {'theme':'base', 'themeVariables': {'primaryColor':'#fff','primaryTextColor':'#000','primaryBorderColor':'#000','lineColor':'#000','secondaryColor':'#fff','tertiaryColor':'#fff','background':'#ffffff','mainBkg':'#ffffff','secondBkg':'#ffffff','clusterBkg':'#ffffff','edgeLabelBackground':'#ffffff'}}}%%
flowchart TB
subgraph CLIENT["👤 EXTERNAL SELLER"]
APP[Client Application]
end

subgraph API["🔌 CONNECT TEMPS RÉEL API"]
CTR[TickAndLive.Connect.TempsReel<br/><i>/api/v1/eventim/</i>]
end

subgraph SITES["🏛️ AUTONOMOUS SITES"]
subgraph SITE1["📍 SITE 1"]
AUTH1[🔑 Site 1 Credentials]
DB1[(🗄️ Site 1<br/>Database)]
EVENTIM1[Eventim API<br/>Connector 1]
end

subgraph SITE2["📍 SITE 2"]
AUTH2[🔑 Site 2 Credentials]
DB2[(🗄️ Site 2<br/>Database)]
EVENTIM2[Eventim API<br/>Connector 2]
end

subgraph SITE3["📍 SITE N"]
AUTH3[🔑 Site N Credentials]
DB3[(🗄️ Site N<br/>Database)]
EVENTIM3[Eventim API<br/>Connector N]
end
end

APP -->|"Request with<br/>Site 1 credentials"| CTR
APP -->|"Request with<br/>Site 2 credentials"| CTR
APP -->|"Request with<br/>Site N credentials"| CTR

CTR -->|Auth + Route| AUTH1
CTR -->|Auth + Route| AUTH2
CTR -->|Auth + Route| AUTH3

AUTH1 --> EVENTIM1
AUTH2 --> EVENTIM2
AUTH3 --> EVENTIM3

EVENTIM1 --> DB1
EVENTIM2 --> DB2
EVENTIM3 --> DB3

DB1 -.->|"❌ NO data<br/>sharing"| DB2
DB2 -.->|"❌ NO data<br/>sharing"| DB3
DB1 -.->|"❌ NO data<br/>sharing"| DB3

style CLIENT fill:#e3f2fd,stroke:#1565c0
style API fill:#fff3e0,stroke:#ef6c00
style SITES fill:#f3e5f5,stroke:#7b1fa2
style SITE1 fill:#e8f5e9,stroke:#2e7d32
style SITE2 fill:#fff8e1,stroke:#f9a825
style SITE3 fill:#ffebee,stroke:#c62828

Key Principles

PrincipleDescription
Complete IsolationEach site has its own independent database
Dedicated AuthenticationUnique credentials per site (distinct credentials)
Routing by CredentialsThe Connect Temps Réel API routes requests to the appropriate site based on provided credentials
No Data SharingObjects (events, rates, stocks, etc.) are never shared between sites
Horizontal ScalabilityAdding new sites without impact on existing sites

2. Catalog Management - Initialization

Cache Strategy Overview

EndpointCache DurationWhen to Invalidate
/schedule/propertiesLong-termOnly when unknown ID detected
/schedule1 hourAutomatic hourly refresh
/venues/{id}/propertiesLong-termOnly when unknown venue ID detected
/events/poster/{id}Long-termOn demand or when unknown ID detected
/eventSessions/pricesAndStocks15 minutesPrice/stock error, night refresh
/products/pricesAndStocks15 minutesPrice/stock error, night refresh
/eventSessions/pricesAndStocks/products15 minutesPrice/stock error, night refresh
%%{init: {'theme':'base', 'themeVariables': {'primaryColor':'#fff','primaryTextColor':'#000','primaryBorderColor':'#000','lineColor':'#000','secondaryColor':'#fff','tertiaryColor':'#fff','background':'#ffffff','mainBkg':'#ffffff','secondBkg':'#ffffff','clusterBkg':'#ffffff','edgeLabelBackground':'#ffffff'}}}%%
flowchart TB
subgraph INIT["🚀 INITIALIZATION PHASE"]
START([Application Startup]) --> PROPS
PROPS["<b>GET /eventim/catalog/schedule/properties</b><br/>📋 Retrieve reference properties<br/><i>rates, ratesRules, taxes, contingents,<br/>categories, amountColumns</i>"]
PROPS --> SCHEDULE
SCHEDULE["<b>POST /eventim/catalog/schedule</b><br/>📅 Retrieve complete catalog<br/><i>eventGroups, events, sessions, products</i>"]
end

subgraph VENUES["🏛️ VENUE ENRICHMENT"]
SCHEDULE --> LOOP_VENUES{{"∀ venueId<br/>from schedule"}}
LOOP_VENUES --> VENUE_PROPS["<b>GET /eventim/catalog/venues/{venueId}/properties</b><br/>🏟️ Venue properties<br/><i>blocks, floors, categories,<br/>doors, tribunes, accesses</i>"]
VENUE_PROPS --> LOOP_VENUES
LOOP_VENUES --> CHECK_POSTER
end

subgraph POSTERS["🖼️ POSTER ENRICHMENT"]
CHECK_POSTER{{"∀ event<br/>with hasPoster=true"}}
CHECK_POSTER --> GET_POSTER["<b>GET /eventim/catalog/events/poster/{eventId}</b><br/>🎨 Download poster<br/><i>base64 encoded image</i>"]
GET_POSTER --> CHECK_POSTER
CHECK_POSTER --> PRICES_SECTION
end

subgraph PRICES["💰 PRICES & STOCKS"]
PRICES_SECTION[Start Prices Loading] --> PRICES_STOCKS
PRICES_STOCKS["<b>POST /eventim/catalog/eventSessions/pricesAndStocks</b><br/>💵 Session prices & stocks<br/><i>prices by rate/category, stocks by block/floor</i>"]

PRICES_STOCKS --> CHECK_PRODUCTS{{"Global products<br/>in schedule?"}}
CHECK_PRODUCTS -->|Yes| GLOBAL_PRODUCTS["<b>POST /eventim/catalog/products/pricesAndStocks</b><br/>📦 Global product prices & stocks<br/><i>Products NOT linked to sessions</i>"]
CHECK_PRODUCTS -->|No| CHECK_SESSION_PRODUCTS
GLOBAL_PRODUCTS --> CHECK_SESSION_PRODUCTS

CHECK_SESSION_PRODUCTS{{"Sessions with<br/>hasProducts=true?"}}
CHECK_SESSION_PRODUCTS -->|Yes| SESSION_PRODUCTS["<b>POST /eventim/catalog/eventSessions/pricesAndStocks/products</b><br/>🎫 Session-linked product prices & stocks<br/><i>Products linked to specific sessions</i>"]
CHECK_SESSION_PRODUCTS -->|No| READY
SESSION_PRODUCTS --> READY
end

READY([✅ Catalog Ready])

style INIT fill:#e8f5e9,stroke:#2e7d32
style VENUES fill:#e3f2fd,stroke:#1565c0
style POSTERS fill:#fff3e0,stroke:#ef6c00
style PRICES fill:#f3e5f5,stroke:#7b1fa2

3. Catalog Management - Periodic Refresh & Unknown ID Handling

Automatic Refresh Cycle

The catalog must be refreshed every hour to ensure data consistency. This periodic refresh:

  • Updates the complete schedule via POST /eventim/catalog/schedule
  • Detects and fetches new venues and posters
  • Maintains the 1-hour cache validity for catalog data

Unknown ID Resolution

When an API response contains an unknown ID (missing label), immediately refresh the corresponding properties endpoint to retrieve the associated label.

%%{init: {'theme':'base', 'themeVariables': {'primaryColor':'#fff','primaryTextColor':'#000','primaryBorderColor':'#000','lineColor':'#000','secondaryColor':'#fff','tertiaryColor':'#fff','background':'#ffffff','mainBkg':'#ffffff','secondBkg':'#ffffff','clusterBkg':'#ffffff','edgeLabelBackground':'#ffffff'}}}%%
flowchart TB
subgraph REFRESH["🔄 PERIODIC REFRESH (Every Hour)"]
TIMER([⏰ Hourly Timer]) --> REFRESH_SCHEDULE
REFRESH_SCHEDULE["<b>POST /eventim/catalog/schedule</b><br/>🔃 Refresh full catalog"]

REFRESH_SCHEDULE --> NEW_VENUES{{"New venueIds<br/>detected?"}}
NEW_VENUES -->|Yes| FETCH_NEW_VENUES["<b>GET /eventim/catalog/venues/{venueId}/properties</b><br/>📥 Fetch new venue properties"]
NEW_VENUES -->|No| NEW_POSTERS
FETCH_NEW_VENUES --> NEW_POSTERS

NEW_POSTERS{{"New events<br/>with hasPoster?"}}
NEW_POSTERS -->|Yes| FETCH_NEW_POSTERS["<b>GET /eventim/catalog/events/poster/{eventId}</b><br/>🖼️ Fetch new posters"]
NEW_POSTERS -->|No| END_REFRESH
FETCH_NEW_POSTERS --> END_REFRESH

END_REFRESH([🔄 Refresh cycle complete])
end

subgraph UNKNOWN["❓ UNKNOWN ID HANDLING"]
API_RESPONSE([API Response with<br/>unknown ID]) --> CHECK_ID_TYPE

CHECK_ID_TYPE{{"ID type?"}}

CHECK_ID_TYPE -->|"rateId, taxId,<br/>categoryId, contingentId,<br/>amountColumnId, ruleId"| REFRESH_PROPS
CHECK_ID_TYPE -->|"blockId, floorId,<br/>doorId, tribuneId,<br/>accessId, designationId"| REFRESH_VENUE

REFRESH_PROPS["<b>GET /eventim/catalog/schedule/properties</b><br/>🔃 Refresh reference properties"]
REFRESH_VENUE["<b>GET /eventim/catalog/venues/{venueId}/properties</b><br/>🔃 Refresh venue properties"]

REFRESH_PROPS --> RETRY([🔁 Retry processing with updated labels])
REFRESH_VENUE --> RETRY
end

style REFRESH fill:#fff8e1,stroke:#f9a825
style UNKNOWN fill:#ffebee,stroke:#c62828

4. Cart Creation - Reserved Seating with Manual Selection

%%{init: {'theme':'base', 'themeVariables': {'primaryColor':'#fff','primaryTextColor':'#000','primaryBorderColor':'#000','lineColor':'#000','secondaryColor':'#fff','tertiaryColor':'#fff','background':'#ffffff','mainBkg':'#ffffff','secondBkg':'#ffffff','clusterBkg':'#ffffff','edgeLabelBackground':'#ffffff'}}}%%
flowchart TB
subgraph MANUAL["🎯 RESERVED SEATING - MANUAL SEAT SELECTION"]
START_MANUAL([👤 User wants to<br/>choose specific seats]) --> CHECK_CACHE

CHECK_CACHE{{"First call for<br/>this session?"}}

CHECK_CACHE -->|Yes - No cache| SEATMAP_FULL["<b>POST /eventim/catalog/eventSessions/seatMap</b><br/>🗺️ Full seat map download<br/><i>onlyAvailableSeats: false</i><br/><i>includeDecorations: true</i><br/>📥 Cache map + decorations locally"]

CHECK_CACHE -->|No - Cache exists| SEATMAP_AVAIL["<b>POST /eventim/catalog/eventSessions/seatMap</b><br/>🗺️ Available seats only<br/><i>onlyAvailableSeats: true</i><br/><i>includeDecorations: false</i><br/>🔄 Merge with cached decorations"]

SEATMAP_FULL --> DISPLAY_MAP[🖥️ Display interactive seat map<br/><i>Show all seats with decorations</i>]
SEATMAP_AVAIL --> DISPLAY_MAP

DISPLAY_MAP --> USER_CLICK{{"👆 User clicks<br/>on a seat"}}

USER_CLICK -->|Select seat| ALLOCATE_SELECT["<b>POST /eventim/cart/allocateManualSeats</b><br/>✅ actionSelect: true<br/><i>Add seat to cart</i>"]
USER_CLICK -->|Deselect seat| ALLOCATE_DESELECT["<b>POST /eventim/cart/allocateManualSeats</b><br/>❌ actionSelect: false<br/><i>Remove seat from cart</i>"]

ALLOCATE_SELECT --> CHECK_ERROR{{"Price/Stock<br/>error?"}}
ALLOCATE_DESELECT --> UPDATE_UI

CHECK_ERROR -->|Yes| REFRESH_PRICES["🔃 Invalidate 15min cache<br/><b>POST /eventim/catalog/eventSessions/pricesAndStocks</b><br/>+ conditionally:<br/><b>POST /eventim/catalog/products/pricesAndStocks</b><br/><b>POST /eventim/catalog/eventSessions/pricesAndStocks/products</b>"]
CHECK_ERROR -->|No| UPDATE_UI

REFRESH_PRICES --> DISPLAY_MAP

UPDATE_UI[🔄 Update UI with cart state<br/><i>cartId, cartItemId, allocated seats</i>]

UPDATE_UI --> CONTINUE{{"Continue<br/>selection?"}}
CONTINUE -->|Yes| USER_CLICK
CONTINUE -->|No| CART_READY

CART_READY([🛒 Cart ready for checkout])
end

style MANUAL fill:#e0f2f1,stroke:#00897b

5. Cart Creation - Automatic Placement (Best Seats)

%%{init: {'theme':'base', 'themeVariables': {'primaryColor':'#fff','primaryTextColor':'#000','primaryBorderColor':'#000','lineColor':'#000','secondaryColor':'#fff','tertiaryColor':'#fff','background':'#ffffff','mainBkg':'#ffffff','secondBkg':'#ffffff','clusterBkg':'#ffffff','edgeLabelBackground':'#ffffff'}}}%%
flowchart TB
subgraph AUTO["⚡ AUTOMATIC PLACEMENT"]
START_AUTO([👤 User chooses<br/>automatic placement<br/><i>OR General Admission session</i>]) --> SELECT_CRITERIA

SELECT_CRITERIA[📝 Selection criteria<br/><i>• categoryId</i><br/><i>• quantities per rateId</i><br/><i>• Optional: blockId, floorId, contingentId</i>]

SELECT_CRITERIA --> ALLOCATE_BEST

ALLOCATE_BEST["<b>POST /eventim/cart/allocateBestSeats</b><br/>🎲 System allocates best available seats<br/><i>Returns seats grouped by contiguity</i><br/><i>isContiguous flag indicates adjacent seats</i>"]

ALLOCATE_BEST --> CHECK_ERROR{{"Price/Stock<br/>error?"}}

CHECK_ERROR -->|Yes| REFRESH_DATA
CHECK_ERROR -->|No| SHOW_RESULT

REFRESH_DATA["🔃 Invalidate 15min cache"]
REFRESH_DATA --> REFRESH_SESSION["<b>POST /eventim/catalog/eventSessions/pricesAndStocks</b><br/>💵 Refresh session prices"]
REFRESH_SESSION --> CHECK_GLOBAL_PROD{{"Global products?"}}
CHECK_GLOBAL_PROD -->|Yes| REFRESH_GLOBAL_PROD["<b>POST /eventim/catalog/products/pricesAndStocks</b>"]
CHECK_GLOBAL_PROD -->|No| CHECK_SESSION_PROD
REFRESH_GLOBAL_PROD --> CHECK_SESSION_PROD
CHECK_SESSION_PROD{{"Session products<br/>(hasProducts)?"}}
CHECK_SESSION_PROD -->|Yes| REFRESH_SESSION_PROD["<b>POST /eventim/catalog/eventSessions/pricesAndStocks/products</b>"]
CHECK_SESSION_PROD -->|No| SELECT_CRITERIA
REFRESH_SESSION_PROD --> SELECT_CRITERIA

SHOW_RESULT[🖥️ Display allocated seats<br/><i>• isContiguous status</i><br/><i>• seatProperties </i><br/><i>• finalAmount, amountDetails</i>]

SHOW_RESULT --> ACCEPT{{"Accept<br/>proposal?"}}

ACCEPT -->|Yes| CART_READY([🛒 Cart ready for checkout])
ACCEPT -->|No| REMOVE_SEATS["<b>POST /eventim/cart/removeSeats</b><br/>🗑️ Release allocated seats"]

REMOVE_SEATS --> SELECT_CRITERIA
end

style AUTO fill:#fce4ec,stroke:#c2185b

6. Cart Consultation (Optional)

%%{init: {'theme':'base', 'themeVariables': {'primaryColor':'#fff','primaryTextColor':'#000','primaryBorderColor':'#000','lineColor':'#000','secondaryColor':'#fff','tertiaryColor':'#fff','background':'#ffffff','mainBkg':'#ffffff','secondBkg':'#ffffff','clusterBkg':'#ffffff','edgeLabelBackground':'#ffffff'}}}%%
flowchart TB
subgraph CART_MGMT["🛒 CART CONSULTATION (Optional)"]
CART_EXISTS([Cart in progress<br/><i>cartId + cartItemId available</i>]) --> GET_DETAIL

GET_DETAIL["<b>GET /eventim/cart/{cartId}/{cartItemId}</b><br/>📋 Retrieve cart details<br/><i>Optional verification step</i>"]

GET_DETAIL --> DISPLAY_CART[🖥️ Display cart summary<br/><i>• Event & session info</i><br/><i>• Allocated seats with prices</i><br/><i>• Total amounts</i><br/><i>• Contiguity status</i>]

DISPLAY_CART --> ACTIONS{{"User action?"}}

ACTIONS -->|Remove specific seats| REMOVE["<b>POST /eventim/cart/removeSeats</b><br/>🗑️ Release selected seats"]
ACTIONS -->|Add more seats| ADD_MORE([↩️ Return to seat selection flow])
ACTIONS -->|Confirm purchase| CONFIRM["<b>POST /eventim/order/confirm</b><br/>✅ Finalize order"]

REMOVE --> GET_DETAIL
CONFIRM --> ORDER_CONFIRMED([📝 Order confirmed<br/><i>orderId returned</i>])
end

style CART_MGMT fill:#e1f5fe,stroke:#0288d1

7. Complete Workflow - Decision Tree

%%{init: {'theme':'base', 'themeVariables': {'primaryColor':'#fff','primaryTextColor':'#000','primaryBorderColor':'#000','lineColor':'#000','secondaryColor':'#fff','tertiaryColor':'#fff','background':'#ffffff','mainBkg':'#ffffff','secondBkg':'#ffffff','clusterBkg':'#ffffff','edgeLabelBackground':'#ffffff'}}}%%
flowchart TB
subgraph PHASE1["📚 PHASE 1: INITIALIZATION"]
direction TB
A1["<b>GET</b> /schedule/properties"] --> A2["<b>POST</b> /schedule"]
A2 --> A3["∀ venue: <b>GET</b> /venues/{id}/properties"]
A3 --> A4["∀ hasPoster: <b>GET</b> /events/poster/{id}"]
A4 --> A5["<b>POST</b> /eventSessions/pricesAndStocks"]
A5 --> A6{{"Global products<br/>in schedule?"}}
A6 -->|Yes| A7["<b>POST</b> /products/pricesAndStocks"]
A6 -->|No| A8
A7 --> A8{{"Sessions with<br/>hasProducts?"}}
A8 -->|Yes| A9["<b>POST</b> /eventSessions/pricesAndStocks/products"]
A8 -->|No| A10([Init Complete])
A9 --> A10
end

subgraph PHASE2["🔄 PHASE 2: HOURLY REFRESH"]
direction TB
B1["⏰ Every hour"] --> B2["<b>POST</b> /schedule"]
B2 --> B3["Fetch new venues/posters if detected"]
end

subgraph PHASE3["❓ PHASE 3: UNKNOWN ID"]
direction TB
C1["Unknown ID detected"] --> C2{{"ID type?"}}
C2 -->|Reference ID| C3["<b>GET</b> /schedule/properties"]
C2 -->|Venue ID| C4["<b>GET</b> /venues/{id}/properties"]
end

subgraph PHASE4["🛒 PHASE 4: CART CREATION"]
direction TB
D0{{"Session type?"}}

D0 -->|"Reserved Seating"| D1{{"Selection mode?"}}
D0 -->|"General Admission"| D5

D1 -->|Manual| D2{{"First call?"}}
D1 -->|Auto| D5

D2 -->|Yes| D3["<b>POST</b> /seatMap<br/><i>full + decorations</i>"]
D2 -->|No| D4["<b>POST</b> /seatMap<br/><i>available only</i>"]

D3 --> D6["<b>POST</b> /allocateManualSeats"]
D4 --> D6

D5["<b>POST</b> /allocateBestSeats"]

D6 --> D7{{"Price/Stock<br/>error?"}}
D5 --> D7

D7 -->|Yes| D8["Invalidate 15min cache<br/><b>POST</b> /eventSessions/pricesAndStocks<br/>+ conditional:<br/><b>POST</b> /products/pricesAndStocks<br/><b>POST</b> /eventSessions/pricesAndStocks/products"]
D7 -->|No| D9([Cart ready])
D8 --> D0
end

subgraph PHASE5["📋 PHASE 5: CART INFO (Optional)"]
direction TB
E1["<b>GET</b> /cart/{cartId}/{cartItemId}"]
end

subgraph PHASE6["✅ PHASE 6: ORDER CONFIRMATION"]
direction TB
F1["<b>POST</b> /order/confirm"] --> F2([Order confirmed])
end

PHASE1 --> PHASE2
PHASE2 --> PHASE4
PHASE3 -.-> PHASE4
PHASE4 --> PHASE5
PHASE5 --> PHASE6

style PHASE1 fill:#c8e6c9,stroke:#388e3c
style PHASE2 fill:#fff9c4,stroke:#f9a825
style PHASE3 fill:#ffcdd2,stroke:#c62828
style PHASE4 fill:#f8bbd0,stroke:#c2185b
style PHASE5 fill:#e1f5fe,stroke:#0288d1
style PHASE6 fill:#d1c4e9,stroke:#7b1fa2

8. Endpoint Summary Table

PhaseEndpointMethodTriggerCache Strategy
Catalog Init/eventim/catalog/schedule/propertiesGET1. Initialization
2. Unknown reference ID
Long-term
Catalog Init/eventim/catalog/schedulePOST1. Initialization
2. Every hour
1 hour
Catalog Init/eventim/catalog/venues/{venueId}/propertiesGET1. Per venueId from schedule
2. Unknown venue-related ID
Long-term
Catalog Init/eventim/catalog/events/poster/{eventId}GETOnly if event.hasPoster=trueLong-term
Pricing/eventim/catalog/eventSessions/pricesAndStocksPOST1. Initialization
2. Cart creation phase (if 15min cache expired or price/stock error)
3. Night refresh
15 min
Pricing/eventim/catalog/products/pricesAndStocksPOST1. Init if global products exist in schedule
2. Cart creation phase (if 15min cache expired or price/stock error)
3. Night refresh
15 min
Pricing/eventim/catalog/eventSessions/pricesAndStocks/productsPOST1. Init if sessions have hasProducts=true
2. Cart creation phase (if 15min cache expired or price/stock error)
3. Night refresh
15 min
Cart/eventim/catalog/eventSessions/seatMapPOSTReserved seating - Manual selectionSee SeatMap Strategy
Cart/eventim/cart/allocateBestSeatsPOSTAuto placement / General admissionReal-time
Cart/eventim/cart/allocateManualSeatsPOSTManual seat selection/deselectionReal-time
Cart/eventim/cart/removeSeatsPOSTSeat removal from cartReal-time
Cart/eventim/cart/{cartId}/{cartItemId}GETOptional - Cart verificationReal-time
Order/eventim/order/confirmPOSTOrder finalizationN/A

9. SeatMap Caching Strategy

Optimization Strategy for Seat Maps

To minimize API calls and bandwidth, seat maps use a two-stage caching approach:

Call TypeonlyAvailableSeatsincludeDecorationsActionPurpose
First call for event sessionfalsetrueDownload full map + decorations → Store in local cacheComplete venue layout with static elements
Subsequent callstruefalseGet available seats only → Merge with cached decorationsReal-time availability with cached layout

10. Error Handling - Price/Stock Changes

15-Minute Cache Management

Price and stock data endpoints use a 15-minute cache to balance performance and data freshness:

  • /eventim/catalog/eventSessions/pricesAndStocks
  • /eventim/catalog/products/pricesAndStocks
  • /eventim/catalog/eventSessions/pricesAndStocks/products

Cache Invalidation Triggers

The 15-minute cache must be immediately invalidated when:

  1. ⚠️ Price/Stock Error: Cart API returns an error indicating price or stock has changed
  2. 🕐 Cache Expiration: 15 minutes have elapsed since last refresh

Error Recovery Flow

When a price/stock error occurs during cart creation:

%%{init: {'theme':'base', 'themeVariables': {'primaryColor':'#fff','primaryTextColor':'#000','primaryBorderColor':'#000','lineColor':'#000','secondaryColor':'#fff','tertiaryColor':'#fff','background':'#ffffff','mainBkg':'#ffffff','secondBkg':'#ffffff','clusterBkg':'#ffffff','edgeLabelBackground':'#ffffff'}}}%%
flowchart TB
subgraph ERROR["⚠️ PRICE/STOCK ERROR HANDLING - GRANULAR REFRESH"]
ERR([Cart API returns<br/>price/stock error]) --> IDENTIFY

IDENTIFY{{"Identify<br/>error source<br/>endpoint"}}

IDENTIFY -->|eventSessions<br/>price/stock error| INVALIDATE_SESSION
IDENTIFY -->|products<br/>price/stock error| INVALIDATE_PRODUCTS
IDENTIFY -->|session products<br/>price/stock error| INVALIDATE_SESSION_PROD

INVALIDATE_SESSION[🗑️ Invalidate cache:<br/>eventSessions/pricesAndStocks]
INVALIDATE_PRODUCTS[🗑️ Invalidate cache:<br/>products/pricesAndStocks]
INVALIDATE_SESSION_PROD[🗑️ Invalidate cache:<br/>eventSessions/pricesAndStocks/products]

INVALIDATE_SESSION --> REFRESH_SESSION["<b>POST</b> /eventSessions/pricesAndStocks<br/>🔄 Refresh ONLY this endpoint"]
INVALIDATE_PRODUCTS --> REFRESH_PRODUCTS["<b>POST</b> /products/pricesAndStocks<br/>🔄 Refresh ONLY this endpoint"]
INVALIDATE_SESSION_PROD --> REFRESH_SESSION_PRODUCTS["<b>POST</b> /eventSessions/pricesAndStocks/products<br/>🔄 Refresh ONLY this endpoint"]

REFRESH_SESSION --> RETRY_SESSION([🔁 Retry cart operation<br/>with updated session prices])
REFRESH_PRODUCTS --> RETRY_PRODUCTS([🔁 Retry cart operation<br/>with updated product prices])
REFRESH_SESSION_PRODUCTS --> RETRY_SESSION_PRODUCTS([🔁 Retry cart operation<br/>with updated session product prices])
end

style ERROR fill:#fff3e0,stroke:#e65100
style INVALIDATE_SESSION fill:#ffebee,stroke:#c62828
style INVALIDATE_PRODUCTS fill:#e8f5e9,stroke:#2e7d32
style INVALIDATE_SESSION_PROD fill:#e3f2fd,stroke:#1565c0

11. Key Business Rules

Session Types & Cart Creation Methods

Session TypeSeatingCart Creation Method
Reserved SeatingManual selectionseatMapallocateManualSeats
Reserved SeatingAuto placementallocateBestSeats
General AdmissionN/AallocateBestSeats

Product Types

Product TypeEndpointTrigger
Global products (not session-linked)/products/pricesAndStocksIf present in schedule
Session-linked products/eventSessions/pricesAndStocks/productsIf session.hasProducts=true

Seat Contiguity

The isContiguous flag in allocateBestSeats response indicates whether allocated seats are physically adjacent - important for group bookings and customer experience.


12. Data Flow Summary

%%{init: {'theme':'base', 'themeVariables': {'primaryColor':'#fff','primaryTextColor':'#000','primaryBorderColor':'#000','lineColor':'#000','secondaryColor':'#fff','tertiaryColor':'#fff','background':'#ffffff','mainBkg':'#ffffff','secondBkg':'#ffffff','clusterBkg':'#ffffff','edgeLabelBackground':'#ffffff'}}}%%
flowchart LR
subgraph CATALOG["📚 CATALOG DATA"]
SP[schedule/properties]
SC[schedule]
VP[venues/properties]
PS[poster]
end

subgraph PRICING["💰 PRICING DATA"]
ESP[eventSessions/<br/>pricesAndStocks]
PP[products/<br/>pricesAndStocks]
ESPP[eventSessions/<br/>pricesAndStocks/products]
end

subgraph CART["🛒 CART OPERATIONS"]
SM[seatMap]
ABS[allocateBestSeats]
AMS[allocateManualSeats]
RS[removeSeats]
CD[cart detail]
end

subgraph ORDER["📝 ORDER"]
OC[order/confirm]
end

SP --> SC
SC --> VP
SC --> PS
SC --> ESP
SC --> PP
SC --> ESPP

ESP --> SM
ESP --> ABS
PP --> ABS
ESPP --> ABS

SM --> AMS
ABS --> CD
AMS --> CD
RS --> CD

CD --> OC

style CATALOG fill:#c8e6c9,stroke:#388e3c
style PRICING fill:#fff9c4,stroke:#f9a825
style CART fill:#f8bbd0,stroke:#c2185b
style ORDER fill:#d1c4e9,stroke:#7b1fa2

TODO : Complete cart/order endpoints