Intent Spec — entertainment.book_event_venue
FULL ID: entertainment.book_event_venue
VERSION: v1.0.0
STATUS: draft
LAST UPDATED: 2026-05-12
DOMAIN: entertainment
PRIMARY AGENT: EntertainmentAgent
TTBS WEIGHTS: time=0.15 taste=0.30 budget=0.25 safety=0.30
User reserves an entire venue for private use — corporate events, conferences, product launches, music nights, film screenings, theatre rentals, gallery openings. Distinct from entertainment.book_party_hall (which is celebrations / weddings / birthdays — separate intent for vendor-bundling reasons). Distinct from buying a ticket TO an event.
Partner exemplars: VenueLook, BookEventz, Eventify, hotel ballrooms direct, theatre direct rentals (Prithvi / Ranga Shankara), independent event spaces (Antisocial, Bonobo).
SECTION 1 — INTENT IDENTITY
User wants to rent a venue for a private gathering / event. Distinct from:
entertainment.book_party_hall— celebrations (weddings, birthdays, anniversaries — different vendor ecosystem)- Ticketed events → buy a ticket via
book_movie_ticket/book_concert_ticket/ etc. - Co-working day pass → out of scope v1 (potential
lifestyle.book_coworkingv1.1+)
Single intent per venue booking. Multi-day events bundled into single booking.
SECTION 2 — NATURAL LANGUAGE COVERAGE
CLASSIFIES IN
- "Need a venue for our product launch"
- "Book Prithvi Theatre for a private film screening"
- "Conference hall for 150 people"
- "Music night venue rental for our band"
- "Corporate offsite venue in Hyderabad"
- "Tech meetup venue in Bengaluru, 80 capacity"
- "Theatre rental for our college play"
- "Gallery space for a photo exhibition"
- "Rooftop venue with PA system for 200"
- "Hall rental with projector and mic setup"
CLASSIFIES OUT — BORDERLINE NO
- "Wedding venue" →
entertainment.book_party_hall - "Birthday party hall" →
entertainment.book_party_hall - "Co-working space" → out of scope v1
- "Buy a ticket to attend an event there" → respective intent
MULTI-INTENT TRIGGERS
- "Venue + catering" →
entertainment.book_event_venue+food.book_catering_event - "Venue + sound system rental" → covered IN this intent (venue may bundle AV)
SECTION 3 — INPUT (TOMO → PROVIDER)
{
"intent": "entertainment.book_event_venue",
"request_id": "req_01J9Z...",
"user_location": { "lat": 17.4475, "lng": 78.3563, "max_radius_km": 25, "city": "Hyderabad" },
"event": {
"event_type": "product_launch", // STRICT ENUM §6
"expected_headcount": 150,
"headcount_min": 120,
"headcount_max": 180,
"event_date": "2026-06-22", // ISO_DATE
"start_time": "18:00", // HH:MM 24h
"end_time": "22:00",
"setup_hours_required_before": 4,
"teardown_hours_required_after": 2
},
"venue_preferences": {
"venue_categories": ["hotel_ballroom", "event_space", "rooftop"], // STRICT ENUM §6
"indoor_outdoor": "either", // STRICT ENUM §6
"facilities_required": ["av_system", "projector", "stage", "valet_parking"], // STRICT ENUM §6
"alcohol_serving_required": true,
"catering_required": "external_allowed", // STRICT ENUM §6
"max_acceptable_cost_inr": 250000
},
"ttbs_user_band": { "time": "flexible", "taste": "great", "budget": "good", "safety": "great" },
"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_event_venue |
event.event_type |
enum | REQUIRED, STRICT ENUM §6 | |
event.expected_headcount |
int | REQUIRED, 10-5000 | |
event.event_date |
string | REQUIRED, ISO_DATE | |
venue_preferences.venue_categories |
array |
REQUIRED, ≥1, STRICT ENUM §6 | |
venue_preferences.indoor_outdoor |
enum | REQUIRED, STRICT ENUM §6 | |
venue_preferences.facilities_required |
array |
REQUIRED, may be empty, STRICT ENUM §6 | |
venue_preferences.catering_required |
enum | REQUIRED, STRICT ENUM §6 |
Anti-fabrication preamble: Capacity claims must reflect actual fire-safety-cleared capacity. AV/facility claims must reflect real equipment.
SECTION 4 — PROVIDER TOOLS
(4-tool pattern: search_event_venues / book_site_visit / confirm_venue_booking / cancel_venue_booking. SLAs match other entertainment intents but confirm_venue_booking allows up to p99 ≤8s — many partners do manual confirmation.)
SECTION 5 — RESPONSE SHAPE
EventVenue
EventVenue:
venue_id: { type: string, constraint: REQUIRED }
name: { type: string, constraint: REQUIRED }
category: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
address: { type: string, constraint: REQUIRED }
location: { type: object, shape: { lat, lng }, constraint: REQUIRED }
distance_from_user_km: { type: float, constraint: REQUIRED, 0-50 }
capacity:
seated: { type: int, constraint: REQUIRED, 10-5000 }
standing: { type: int, constraint: REQUIRED, 10-10000 }
fire_safety_cleared: { type: int, constraint: REQUIRED, 10-10000, semantics: "fire NOC-issued capacity; floor for ranking" }
pricing:
base_rental_inr_per_hour: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
base_rental_inr_per_day: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
minimum_billable_hours: { type: int, constraint: REQUIRED, 1-12 }
setup_teardown_chargeable: { type: boolean, constraint: REQUIRED }
setup_teardown_inr_per_hour: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
weekend_premium_pct: { type: int, constraint: REQUIRED, 0-100 }
alcohol_license_pass_through_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
estimated_total_inr: { type: int, constraint: REQUIRED, INR_INTEGER, semantics: "computed for declared event dates/hours/headcount" }
gst_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
facilities_available:
type: array<enum>
constraint: REQUIRED, ≥1
values: [av_system, projector, screen, stage, dance_floor, podium, mic_set, sound_system, dj_booth, led_wall, lights_truss, dressing_rooms, kitchen, valet_parking, self_parking, lift_access, ground_floor_access]
catering:
in_house_catering_available: { type: boolean, constraint: REQUIRED }
in_house_per_person_inr_range:
low: { type: int, constraint: REQUIRED nullable, INR_INTEGER }
high: { type: int, constraint: REQUIRED nullable, INR_INTEGER }
external_caterer_allowed: { type: boolean, constraint: REQUIRED }
external_caterer_fee_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0, semantics: "kitchen access / corkage fee for external" }
alcohol:
in_house_bar_available: { type: boolean, constraint: REQUIRED }
byob_allowed: { type: boolean, constraint: REQUIRED }
licensed_for_alcohol: { type: boolean, constraint: REQUIRED }
accessibility:
wheelchair_accessible: { type: boolean, constraint: REQUIRED }
accessible_restrooms: { type: boolean, constraint: REQUIRED }
lift_to_event_floor: { type: boolean, constraint: REQUIRED }
policies:
cancellation:
cutoff_days_before: { type: int, constraint: REQUIRED, ≥0 }
refund_percent: { type: int, constraint: REQUIRED, 0-100 }
advance_payment_pct: { type: int, constraint: REQUIRED, 0-100 }
decor_outside_allowed: { type: boolean, constraint: REQUIRED }
decor_restrictions_url: { type: string, constraint: REQUIRED, HTTPS URL }
fire_noc_url: { type: string, constraint: REQUIRED, HTTPS URL, semantics: "actual fire NOC document" }
availability:
available_on_event_date: { type: boolean, constraint: REQUIRED }
next_available_date: { type: string, constraint: REQUIRED nullable, ISO_DATE }
ratings:
avg_rating: { type: float, constraint: REQUIRED, 0-5 }
review_count: { type: int, constraint: REQUIRED, ≥0 }
repeat_corporate_pct: { type: int, constraint: REQUIRED, 0-100 }
gallery_url: { type: string, constraint: REQUIRED, HTTPS URL, semantics: "real photos, no AI" }
partner_reference:
source: { type: string, constraint: REQUIRED }
deeplink: { type: string, constraint: REQUIRED, HTTPS URL }
SiteVisitBooking, VenueBooking, CancellationResult — straightforward shapes (visit_id / booking_id / cancel_id with scheduled_at, contact_phone, total_inr, payment_due_at).
FORBIDDEN FIELDS
- Standard set (paid_placement / ad / urgency / AI photos / kickback / commission_padded)
fake_fire_noc— must have real NOC documentinflated_capacity— capacity claims above fire-NOC-cleared number
SECTION 6 — CONTROLLED VOCABULARIES
event.event_type:
values: { product_launch, conference, corporate_offsite, meetup, music_night, film_screening, theatre_rental, photo_exhibition, art_show, fashion_show, panel_discussion, hackathon, training_workshop, private_screening }
venue_preferences.venue_categories / venue.category:
values: { hotel_ballroom, event_space, theatre, rooftop, restaurant_buyout, club_buyout, gallery, auditorium, conference_centre, banquet_hall, outdoor_lawn, heritage_venue }
venue_preferences.indoor_outdoor: { values: { indoor, outdoor, either } }
facilities_required / facilities_available:
values: { av_system, projector, screen, stage, dance_floor, podium, mic_set, sound_system, dj_booth, led_wall, lights_truss, dressing_rooms, kitchen, valet_parking, self_parking, lift_access, ground_floor_access }
venue_preferences.catering_required:
values: { none, in_house_only, external_allowed, both_allowed }
SECTION 7 — TTBS DIMENSIONS
TIME (weight = 0.15):
signals_used: [distance, availability on event_date]
TASTE (weight = 0.30):
signals_used:
- category match
- facilities_available ⊇ facilities_required
- DNA venue history
weighting:
category: 0.40
facilities: 0.45
dna: 0.15
BUDGET (weight = 0.25):
signals_used: [pricing.estimated_total_inr, within max_acceptable_cost_inr]
SAFETY (weight = 0.30):
signals_used:
- capacity.fire_safety_cleared ≥ headcount (MANDATORY floor)
- policies.fire_noc_url present + valid
- accessibility.wheelchair_accessible
- alcohol.licensed_for_alcohol (when user requires)
- ratings.repeat_corporate_pct (higher = safer choice)
weighting:
fire_safety: 0.35
fire_noc: 0.25
accessibility: 0.15
alcohol_license: 0.15
repeat_corporate: 0.10
SECTION 8 — COMPLETION CONTRACT
POST /api/v1/cpc/mcp_provider/<your_partner_id>
Body:
{
"intent": "entertainment.book_event_venue",
"external_id": "<booking_id>",
"request_id": "<request_id>",
"amount_inr": 180000,
"gst_inr": 32400,
"tips_inr": 0,
"pass_through_inr": 8000, // alcohol_license_pass_through to govt
"closed_at": "2026-06-22T22:30:00+05:30",
"status": "completed",
"event_type": "product_launch",
"actual_headcount": 142,
"venue_category": "hotel_ballroom"
}
HMAC, 5-min replay, NET-only commission. Govt fees go in pass_through_inr.
SECTION 9 — WIDGET
EventVenueWidget (planned). Field mapping: name + category → header; capacity vs declared headcount → "fits X seated / Y standing" badge; pricing.estimated_total_inr → big price; facilities chips; gallery thumb; fire_safety_cleared visible as a green-shield pill.
SECTION 10 — CACHING POLICY
| Call | TTL |
|---|---|
| search_event_venues | 5min |
| book_site_visit | NO CACHE |
| confirm_venue_booking | NO CACHE |
| cancel_venue_booking | NO CACHE |
| Venue static | 6h |
SECTION 11 — ERROR CODES
(Standard set + CAPACITY_EXCEEDED (422 when declared headcount > fire_safety_cleared), DATE_UNAVAILABLE (200 with next_available_date).)
SECTION 12 — SANDBOX → PRODUCTION CHECKLIST
[ ] All four tools implemented
[ ] fire_noc_url returns valid NOC for every venue
[ ] capacity.fire_safety_cleared matches NOC document
[ ] gallery_url contains real customer-event photos
[ ] HMAC + amount_inr=NET; pass_through_inr captures govt fees
[ ] Compliance: GSTIN, venue trade license, fire NOC, alcohol license (when applicable), privacy policy
SECTION 13 — ANTI-FABRICATION RULES
RULE 1: No paid_placement / ad / kickback.
RULE 2: capacity.fire_safety_cleared MUST match the NOC document. Inflating
capacity beyond fire-cleared = customer SAFETY RISK + immediate
suspension. (One stampede is one too many.)
RULE 3: fire_noc_url must be the actual document, not a marketing PDF.
RULE 4: facilities_available claims must match physical inventory. Selling
"stage + projector + sound" and delivering "small mic + projector" =
suspension.
RULE 5: alcohol.licensed_for_alcohol=true requires valid liquor licence on file.
Hosting an alcohol event in an unlicensed venue = legal exposure +
suspension.
RULE 6: AI-generated venue photography forbidden.
RULE 7: external_caterer_fee_inr cannot exceed industry-standard kitchen
access fees. Predatory corkage to force in-house catering = suspension.
RULE 8: No "Top Pick" / "TOMO Recommended" badges.
RULE 9: estimated_total_inr must be reproducible from declared components.
Hidden surcharges revealed post-booking = suspension.
RULE 10: decor_restrictions_url and decor_outside_allowed must be honest.
Surprise restrictions on event day = customer harm.
RULE 11: amount_inr in CPC is NET — pass through alcohol licence fees + any
other govt charges via pass_through_inr.
VERSION HISTORY
v1.0.0 — 2026-05-12 — Initial spec. NET commission base. Safety-floor on
fire-NOC capacity is the hard constraint. Detection
of capacity-inflation is the top anti-fab rule.