Intent Spec — entertainment.book_concert_ticket
FULL ID: entertainment.book_concert_ticket
VERSION: v1.0.0
STATUS: draft
LAST UPDATED: 2026-05-12
DOMAIN: entertainment
PRIMARY AGENT: EntertainmentAgent
TTBS WEIGHTS: time=0.15 taste=0.50 budget=0.20 safety=0.15
User books a ticket to a live music concert, festival, or DJ event. Highest TASTE weight in the entertainment domain — the user is choosing an artist, a moment, an experience, often months in advance. Tickets can range from ₹500 (small gig) to ₹2,00,000+ (festival platinum). Distinct from entertainment.book_comedy_show and entertainment.book_movie_ticket.
Partner exemplars: BookMyShow, Paytm Insider, District by Zomato, Sunburn / Lollapalooza / NH7 Weekender official portals, Live Nation India.
SECTION 1 — INTENT IDENTITY
User wants to attend a live music event. Distinct from:
entertainment.book_comedy_show— comedyentertainment.book_theatre_play— theatreentertainment.book_event_venue— book the venue itself (private use)- Music streaming →
entertainment.subscribe_streaming
Single intent per booking. Multi-day festival passes are single intent (single ticket purchase).
SECTION 2 — NATURAL LANGUAGE COVERAGE
CLASSIFIES IN
- "Book Arijit Singh concert tickets"
- "Coldplay Mumbai tickets"
- "Sunburn Goa weekend pass"
- "Diljit Dosanjh Bengaluru ticket"
- "Hyderabad EDM night this weekend"
- "Two tickets for Anuv Jain"
- "VIP tickets for Lollapalooza"
- "Cheapest concert in town tonight"
- "Standing tickets for The Local Train"
- "AR Rahman live in concert"
CLASSIFIES OUT — BORDERLINE NO
- "Watch a movie" →
entertainment.book_movie_ticket - "Stand-up show" →
entertainment.book_comedy_show - "Music on Spotify" →
entertainment.subscribe_streaming - "Book a venue for a private concert" →
entertainment.book_event_venue - "Concert in my garden" → out of scope (private event)
MULTI-INTENT TRIGGERS
- "Concert + flight + hotel" →
entertainment.book_concert_ticket+travel.book_flight+travel.book_hotel - "Concert + ride after" →
entertainment.book_concert_ticket+mobility.book_intracity_ride
SECTION 3 — INPUT (TOMO → PROVIDER)
{
"intent": "entertainment.book_concert_ticket",
"request_id": "req_01J9Z...",
"user_locale": "en-IN",
"user_location": { "lat": 17.4475, "lng": 78.3563, "max_radius_km": 30, "city": "Hyderabad" },
"preferences": {
"artist_name": "Arijit Singh", // OR null
"genre": ["bollywood", "indie"], // STRICT ENUM §6 multi-select
"language": ["hi"], // BCP-47
"event_format": ["concert"], // STRICT ENUM §6
"show_date_window": {
"start": "2026-06-01T00:00:00+05:30",
"end": "2026-06-30T23:59:59+05:30"
},
"seat_count": 2,
"section_preference": ["fan_pit", "general"], // STRICT ENUM §6 ordered
"tour_only": false // TRUE filters out one-off / club shows
},
"ttbs_user_band": { "time": "flexible", "taste": "great", "budget": "good", "safety": "balanced" },
"session_context": { "tomo_session_id": "ses_01J9Z...", "user_dna_hash": "dna_v3_a7c9..." }
}
| Field | Type | Constraint | Notes |
|---|---|---|---|
intent |
string | REQUIRED, STRICT ENUM | Always entertainment.book_concert_ticket |
preferences.artist_name |
string | null | REQUIRED nullable | Null = open |
preferences.genre |
array |
REQUIRED, ≥1, STRICT ENUM §6 | |
preferences.event_format |
array |
REQUIRED, ≥1, STRICT ENUM §6 | |
preferences.seat_count |
int | REQUIRED, 1-20 | >20 → escalate to event_venue |
preferences.tour_only |
bool | REQUIRED |
Anti-fabrication preamble: Listings of cancelled / rescheduled / unverified events are explicitly forbidden. Surge multipliers must be disclosed.
SECTION 4 — PROVIDER TOOLS
(Same 4-tool pattern as comedy_show: search_concerts / get_seat_map / create_booking / cancel_booking. SLAs identical to comedy.)
SECTION 5 — RESPONSE SHAPE
ConcertListing
ConcertListing:
show_id: { type: string, constraint: REQUIRED }
show:
title: { type: string, constraint: REQUIRED }
tour_name: { type: string, constraint: REQUIRED nullable }
artists:
type: array<Artist>
constraint: REQUIRED, ≥1
shape:
name: { type: string, constraint: REQUIRED }
is_headliner: { type: boolean, constraint: REQUIRED }
verified: { type: boolean, constraint: REQUIRED, semantics: "official artist confirmation on file" }
spotify_id: { type: string, constraint: REQUIRED nullable }
genre: { type: array<enum>, constraint: REQUIRED, ≥1, STRICT ENUM §6 }
language: { type: enum, constraint: REQUIRED, BCP-47 }
event_format: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
duration_minutes: { type: int, constraint: REQUIRED, 60-1440 }
content_rating: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
age_restriction_min: { type: int, constraint: REQUIRED, 0-21 }
venue:
venue_id: { type: string, constraint: REQUIRED }
name: { type: string, constraint: REQUIRED }
venue_type:
type: enum
constraint: REQUIRED, STRICT ENUM §6
values: [stadium, arena, amphitheatre, concert_hall, festival_grounds, club, hotel_ballroom, outdoor_venue]
address: { type: string, constraint: REQUIRED }
location: { type: object, shape: { lat, lng }, constraint: REQUIRED }
distance_from_user_km: { type: float, constraint: REQUIRED, 0-200 }
capacity_total: { type: int, constraint: REQUIRED, 50-150000 }
accessibility:
wheelchair_accessible: { type: boolean, constraint: REQUIRED }
accessible_section_id: { type: string, constraint: REQUIRED nullable }
showtime:
start: { type: string, constraint: REQUIRED, ISO_DATETIME }
end: { type: string, constraint: REQUIRED, ISO_DATETIME }
doors_open_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
advance_booking_cutoff: { type: string, constraint: REQUIRED, ISO_DATETIME }
multi_day: { type: boolean, constraint: REQUIRED, semantics: "festival pass spanning multiple days" }
multi_day_dates: { type: array<string>, constraint: REQUIRED when multi_day=true, ISO_DATE }
pricing:
sections:
type: array<SectionPrice>
constraint: REQUIRED, ≥1
shape:
section_id: { type: string, constraint: REQUIRED }
section_label: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [general, fan_pit, golden_circle, premium, vip, platinum, suite] }
base_price_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
convenience_fee_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
booking_fee_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
gst_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
total_per_ticket_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
addon_perks:
type: array<enum>
constraint: REQUIRED, may be empty
values: [meet_and_greet, soundcheck_access, free_drinks, food_voucher, merch_voucher, valet_parking, lounge_access]
surge_active: { type: boolean, constraint: REQUIRED }
surge_multiplier: { type: float, constraint: REQUIRED when surge_active=true, 1.0-3.0 }
availability:
seats_available_total: { type: int, constraint: REQUIRED, ≥0 }
seats_available_by_section: { type: object<section_id,int>, constraint: REQUIRED }
fast_selling: { type: boolean, constraint: REQUIRED, semantics: "TRUE only when ratio < 20%" }
waitlist_supported: { type: boolean, constraint: REQUIRED }
policies:
cancellation:
cutoff_minutes_before_start: { type: int, constraint: REQUIRED, ≥0 }
refund_percent: { type: int, constraint: REQUIRED, 0-100 }
age_restriction_enforced: { type: boolean, constraint: REQUIRED }
photography_allowed: { type: boolean, constraint: REQUIRED }
re_entry_allowed: { type: boolean, constraint: REQUIRED }
outside_food_allowed: { type: boolean, constraint: REQUIRED }
ticket_transferable: { type: boolean, constraint: REQUIRED, semantics: "can user resell or transfer to friend" }
partner_reference:
source: { type: string, constraint: REQUIRED }
deeplink: { type: string, constraint: REQUIRED, HTTPS URL }
SeatMap, Booking, CancellationResult — same shapes as movie_ticket spec §5.
FORBIDDEN FIELDS
paid_placement_score,ad_bid,sponsored_rank,promotion_priority,kickback_amountartificial_urgency_textai_generated_photofor artist / venue imagerycommission_padded_pricecancelled_event_listing(must remove cancelled events within 4h)unverified_artist_listing
SECTION 6 — CONTROLLED VOCABULARIES
preferences.genre:
values: { bollywood, indie, classical, rock, metal, pop, rnb, hip_hop, edm, jazz, folk, devotional, regional_telugu, regional_tamil, regional_punjabi, regional_marathi, regional_bengali }
preferences.event_format / event_format:
values:
concert: "Standard ticketed concert"
festival: "Multi-act festival"
dj_set: "DJ performance"
acoustic: "Acoustic / unplugged"
tribute: "Tribute / cover band"
classical_recital: "Classical recital"
live_album_recording: "Live recording session"
venue.venue_type:
values: { stadium, arena, amphitheatre, concert_hall, festival_grounds, club, hotel_ballroom, outdoor_venue }
pricing.sections.section_label:
values:
general: "General / lawn"
fan_pit: "Standing fan-pit nearest stage"
golden_circle: "Reserved closest to stage"
premium: "Premium reserved"
vip: "VIP lounge / elevated seats"
platinum: "Platinum (top tier, full perks)"
suite: "Private suite (corporate boxes)"
addon_perks:
values: { meet_and_greet, soundcheck_access, free_drinks, food_voucher, merch_voucher, valet_parking, lounge_access }
content_rating:
values: { U, UA, adult_16, adult_18 }
SECTION 7 — TTBS DIMENSIONS
TIME (weight = 0.15):
signals_used: [distance, showtime fit, doors_open offset]
weighting: { distance: 0.30, fit: 0.55, doors: 0.15 }
TASTE (weight = 0.50):
signals_used:
- artist exact match
- genre intersect
- language match
- event_format match
- DNA artist history
weighting:
artist: 0.45
genre: 0.25
format: 0.15
language: 0.10
dna: 0.05
BUDGET (weight = 0.20):
signals_used: [pricing min, surge_active]
weighting: { base: 0.65, surge_penalty: 0.35 }
user_band_handling:
ok: cheapest general/fan_pit
good: balance
great: prefer platinum / vip with perks even at 5x base
SAFETY (weight = 0.15):
signals_used:
- venue.accessibility
- policies.age_restriction_enforced
- artists[].verified (FALSE = filter out)
weighting:
accessibility: 0.40
age: 0.30
verified: 0.30
SECTION 8 — COMPLETION CONTRACT
POST /api/v1/cpc/mcp_provider/<your_partner_id>
Body:
{
"intent": "entertainment.book_concert_ticket",
"external_id": "<booking_id>",
"request_id": "<request_id>",
"amount_inr": 4800, // NET (base × seat_count + supplier-kept booking/convenience)
"gst_inr": 864,
"tips_inr": 0,
"pass_through_inr": 0,
"closed_at": "2026-06-15T22:30:00+05:30",
"status": "completed",
"seat_count": 2,
"section_label": "premium",
"headliner_name": "Arijit Singh"
}
HMAC, 5-min replay, NET-only commission.
SECTION 9 — WIDGET
ConcertWidget (planned). Falls back to generic ListingsWidget. Field mapping: tour_name + headliner → header; venue + distance → subline 1; showtime + duration → subline 2; pricing min → "From ₹X"; surge_active → orange surge pill; addon_perks → perks chips.
SECTION 10 — CACHING POLICY
| Call | TTL |
|---|---|
| search_concerts | 60s |
| get_seat_map | NO CACHE |
| create_booking | NO CACHE |
| cancel_booking | NO CACHE |
| Artist / venue metadata | 6h |
SECTION 11 — ERROR CODES
(Same set as comedy_show + ARTIST_NOT_TOURING for empty results.)
SECTION 12 — SANDBOX → PRODUCTION CHECKLIST
[ ] All four tools implemented
[ ] artists[].verified=true backed by talent/agent confirmation on file
[ ] At least 5 real events spanning genre/event_format mix
[ ] Cancelled-event removal SLA ≤4h verified
[ ] HMAC signing verified
[ ] amount_inr is NET in CPC
[ ] surge_multiplier disclosed correctly when active
[ ] Compliance docs: GSTIN, entertainment license, venue licenses, privacy policy URL
SECTION 13 — ANTI-FABRICATION RULES
RULE 1: No paid_placement / ad / kickback. Rejects response.
RULE 2: artists[].verified=true requires confirmation evidence on file.
RULE 3: Cancelled / rescheduled events MUST be removed or flagged in
search_concerts within 4h of partner becoming aware. Stale listings
= customer harm + suspension.
RULE 4: fast_selling=true only when ratio < 20%.
RULE 5: surge_multiplier must be disclosed; hidden surge = suspension.
RULE 6: AI-generated artist / venue / poster art forbidden. Official assets only.
RULE 7: content_rating + age_restriction_min must be honest.
RULE 8: addon_perks (meet_and_greet etc.) MUST be honoured. Selling a perk
and not delivering it = suspension.
RULE 9: No "Top Pick" / "TOMO Recommended". TTBS source-blind.
RULE 10: ticket_transferable must reflect partner's actual policy. Misrepresenting
transfer rights is a consumer-protection issue.
RULE 11: Festival multi_day_dates must reflect the actual schedule.
RULE 12: Tour pricing should be consistent with the artist/tour's published
range across cities (TOMO cross-checks across partners).
VERSION HISTORY
v1.0.0 — 2026-05-12 — Initial spec. NET commission base. TASTE-dominant (0.50) —
highest in entertainment domain. Surge transparency +
cancelled-event removal SLA.