T
TOMO
Developer Docs
BETA These docs are under partner review. Some features described are roadmap items, not yet shipped. Verify against your sandbox before relying on any contract.
● DRAFTv1.0.0entertainment.book_concert_ticket

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 — comedy
  • entertainment.book_theatre_play — theatre
  • entertainment.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_amount
  • artificial_urgency_text
  • ai_generated_photo for artist / venue imagery
  • commission_padded_price
  • cancelled_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.