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_event_venue

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_coworking v1.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 document
  • inflated_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.