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.0lifestyle.book_spa_treatment

lifestyle.book_spa_treatment — Full Intent Specification

INTENT NAMESPACE: lifestyle
INTENT NAME:      book_spa_treatment
FULL ID:          lifestyle.book_spa_treatment
VERSION:          v1.0.0
STATUS:           draft
LAST UPDATED:     2026-05-10
TTBS WEIGHTS:     time 0.20 · taste 0.40 · budget 0.30 · safety 0.10

Spa treatment is a wellness/relaxation service at a spa: massage, body treatments, hydrotherapy, ayurveda, aromatherapy. Inherits from lifestyle.book_salon: every salon-shape field is REQUIRED with spa-domain adaptations. Distinct: (a) spa_kind enum (day_spa, hotel_spa, ayurveda_specialty, aromatherapy_specialty, hydrotherapy); (b) treatment_catalog replaces salon services (massages, body wraps, scrubs, abhyanga, shirodhara); (c) therapist replaces stylist (with massage-specific cert); (d) couples_treatment_supported flag; (e) hygiene + sterilization stricter than salon (oil reuse, linen change, single-use disposables).

Inheritance contract: every field in lifestyle.book_salon §2/§4/§5 is REQUIRED here, adapted to the spa domain.


1. NATURAL LANGUAGE COVERAGE

Classifies IN

  • "spa for stress relief"
  • "couples massage tomorrow"
  • "Ayurveda Abhyanga treatment"
  • "Thai massage near me"
  • "deep tissue massage"
  • "aromatherapy spa session"
  • "hot stone massage"
  • "Shirodhara head therapy"
  • "spa for back pain"

Classifies OUT — borderline NO

  • "salon for haircut" → lifestyle.book_salon
  • "yoga + meditation" → lifestyle.book_yoga_class
  • "massage at home" → lifestyle.book_at_home_service (massage variant)
  • "wellness retreat 3-day" → lifestyle.book_wellness_retreat
  • "physiotherapy" → typically lifestyle.book_at_home_service

MULTI-INTENT TRIGGERS

  • "spa and dinner reservation" → lifestyle.book_spa_treatment + food.book_dine_in
  • "spa and a cab home" → lifestyle.book_spa_treatment + mobility.book_intracity_ride
  • "Ayurveda spa and ayurveda meal plan" → lifestyle.book_spa_treatment + food.subscribe_tiffin

2. INPUT — TOMO → PROVIDER (DELTA)

All fields from lifestyle.book_salon §2 are REQUIRED, adapted:

  • REPLACE services_wanted[].service_kind with treatments_wanted[].treatment_kind
  • ADD spa_intent block
{
  "intent":          "lifestyle.book_spa_treatment",
  "intent_version":  "v1.0.0",
  "request_id":      "req_spa_8h2k_2026-05-10T08:00:00Z",

  "search_area": { ... },
  "scheduled_for_iso":   "2026-05-12T17:00:00+05:30",
  "duration_minutes_estimated": 90,

  "user_profile": {
    "gender":              "female",
    "age_band":            "26-35",
    "skin_kind":           "combination",
    "body_kind":           "average",
    "stress_level":        "high",
    "medical_conditions":  ["mild_back_pain"],
    "pregnant_or_postpartum": "none",
    "preferred_pressure":  "medium"
  },

  "treatments_wanted": [
    {
      "treatment_kind":           "deep_tissue_massage",
      "duration_minutes":         60,
      "preferred_therapist_skill_min": 4,
      "specific_focus_area":       "back_and_shoulders"
    },
    {
      "treatment_kind":           "facial_premium",
      "duration_minutes":         30,
      "preferred_therapist_skill_min": 3,
      "specific_focus_area":       "face"
    }
  ],

  "spa_intent": {
    "couples_treatment":         false,
    "private_room_required":     true,
    "music_kind_acceptable":     ["soft_instrumental", "nature_sounds", "silence"],
    "lighting_kind_acceptable":  ["dim", "candle"],
    "aromatherapy_oils_required": ["lavender", "eucalyptus"],
    "hot_towel_application_required": true
  },

  "preferences": {
    "spa_kind_acceptable":      ["day_spa", "hotel_spa", "ayurveda_specialty"],
    "spa_kind_preferred":       "day_spa",
    "therapist_gender_preference": "female",
    "therapist_min_experience_years": 3,
    "therapist_certifications_required": true,
    "therapist_kyc_required":   true,
    "products_kind_preferred":  ["forest_essentials", "kama_ayurveda", "tomo_partner_brand"],
    "ayurveda_authentic_required": false,
    "vegan_products_only":      false,
    "halal_products_required":  false,
    "budget_band":              "great",
    "budget_max_inr_total":      8500,
    "lounge_amenity_required":  ["air_conditioning", "refreshments_complimentary"],
    "atmosphere_kind":           "luxe_calm",
    "max_wait_minutes_at_spa":   10,
    "online_payment_required":   true
  },

  "context": { ... }
}
Field Type Constraint Notes
intent string REQUIRED, equals "lifestyle.book_spa_treatment"
user_profile.body_kind enum REQUIRED, see §5
user_profile.stress_level enum REQUIRED, see §5
user_profile.medical_conditions array REQUIRED, may be empty see §5
user_profile.pregnant_or_postpartum enum REQUIRED same as yoga §5
user_profile.preferred_pressure enum REQUIRED, STRICT light | medium | firm | deep
treatments_wanted[].treatment_kind enum REQUIRED, see §5
treatments_wanted[].specific_focus_area enum REQUIRED, see §5
spa_intent.couples_treatment bool REQUIRED
spa_intent.private_room_required bool REQUIRED
spa_intent.music_kind_acceptable array REQUIRED, ≥1 see §5
spa_intent.lighting_kind_acceptable array REQUIRED, ≥1 see §5
spa_intent.aromatherapy_oils_required array REQUIRED, may be empty see §5
spa_intent.hot_towel_application_required bool REQUIRED
preferences.spa_kind_acceptable array REQUIRED, ≥1 see §5
preferences.ayurveda_authentic_required bool REQUIRED drives certification HARD FILTER

REMOVED from salon:

  • user_profile.hair_kind, hair_length, current_color (cosmetic salon-specific)

Anti-fabrication preamble (universal): no paid placement, no urgency text, no commission-influenced fields.


3. PROVIDER TOOLS

8 tools from lifestyle.book_salon REQUIRED with SalonOption replaced by SpaTreatmentOption. Adapted: stylist→therapist, services→treatments.

ADD:

Tool 9: validate_treatment_compatibility

PURPOSE:        partner confirms treatment is safe given user's medical_conditions/pregnancy
INPUT:          { spa_id, therapist_id, treatments_wanted, user_profile, request_id }
OUTPUT:         { compatibility_status, contra_indications[], modifications_suggested }
SLA:            p95 < 800ms

All 9 REQUIRED.


4. RESPONSE SHAPE (DELTA)

SpaTreatmentOption

All from SalonOption REQUIRED, REPLACE salon with spa, services_offered with treatment_catalog, stylists with therapists. ADD spa-specific blocks.

spa:
  id:                             string, REQUIRED
  merchant_id:                    string, REQUIRED
  name:                           string, REQUIRED
  brand:                          string, REQUIRED
  spa_kind:                       STRICT ENUM, REQUIRED          # see §5
  partner_account_age_days:       int, REQUIRED, ≥0
  total_treatments_30day:         int, REQUIRED, ≥0
  founded_year:                   int, REQUIRED
  address: { ... }                                                # same shape
  distance_from_user_km:          float, REQUIRED
  ratings:                                                        # same shape, includes:
    overall_score:                float, REQUIRED, 0-5
    overall_count:                int, REQUIRED, ≥0
    recent_30day_score:           float, REQUIRED, 0-5
    cleanliness_score:            float, REQUIRED, 0-5
    therapist_skill_score:        float, REQUIRED, 0-5
    ambience_score:               float, REQUIRED, 0-5
    private_room_quality_score:   float, REQUIRED, 0-5
    on_time_30day_pct:            float, REQUIRED, 0-1
  operating_hours: { ... }
  amenities:                                                      # spa-specific
    air_conditioning:             boolean, REQUIRED
    private_treatment_rooms:      int, REQUIRED, ≥0
    couples_treatment_room:       boolean, REQUIRED
    showers_count:                int, REQUIRED, ≥0
    showers_with_hot_water:       boolean, REQUIRED
    lockers_count:                int, REQUIRED, ≥0
    locker_secure_lock:           boolean, REQUIRED
    changing_rooms_count:         int, REQUIRED, ≥0
    parking_available:            boolean, REQUIRED
    parking_kind:                 STRICT ENUM, REQUIRED
    refreshments_complimentary:   boolean, REQUIRED
    herbal_tea_available:         boolean, REQUIRED
    quiet_zone_strict:            boolean, REQUIRED
    sauna_available:              boolean, REQUIRED
    steam_room_available:         boolean, REQUIRED
    plunge_pool_available:        boolean, REQUIRED
    relaxation_lounge:            boolean, REQUIRED
    aromatherapy_diffusion:       boolean, REQUIRED
    music_zone_isolation:         boolean, REQUIRED              # rooms acoustically separated
    cctv_in_premises:             boolean, REQUIRED                # public areas only
    panic_button_in_treatment_room: boolean, REQUIRED
    wheelchair_accessible:        boolean, REQUIRED
    female_only_floor_available:  boolean, REQUIRED
  trust:
    municipal_license_number:     string, REQUIRED
    municipal_license_valid_until: ISO_DATE, REQUIRED
    hygiene_audit_iso:            ISO_DATETIME, REQUIRED
    hygiene_audit_score:          int, REQUIRED, 0-100
    sterilization_certified:      boolean, REQUIRED
    single_use_disposables:       boolean, REQUIRED
    linen_change_per_customer:    boolean, REQUIRED
    oil_reuse_protocol:           STRICT ENUM, REQUIRED          # see §5
    employee_kyc_pct:             int, REQUIRED, 0-100
    insurance_coverage_inr:       INR_INTEGER, REQUIRED
    public_liability_coverage:    boolean, REQUIRED
    aed_defibrillator_present:    boolean, REQUIRED
    first_aid_kit_present:        boolean, REQUIRED
    fire_safety_compliant:        boolean, REQUIRED
    ayurveda_authentic_certified: boolean, REQUIRED
    ayurveda_certification_authority: STRICT ENUM, REQUIRED
    tomo_field_team_audited:      boolean, REQUIRED
  photos: { ... }                                                 # standard

treatment_catalog:                array<TreatmentItem>, REQUIRED, ≥3

available_slots:                  array<SpaSlotOption>, REQUIRED, ≥1

therapists:                       array<TherapistProfile>, REQUIRED, ≥1

products_used:
  preferred_brands:               array<STRICT ENUM>, REQUIRED, ≥1
  ayurveda_authentic:             boolean, REQUIRED
  organic_products_only:          boolean, REQUIRED
  vegan_products:                 boolean, REQUIRED
  halal_certified_products:       boolean, REQUIRED
  cruelty_free:                   boolean, REQUIRED

# (all other standard fields - fare, cancellation, freshness, _provider - REQUIRED)

TreatmentItem

treatment_id:                     string, REQUIRED
treatment_kind:                   STRICT ENUM, REQUIRED          # see §5
treatment_name:                   string, REQUIRED
description:                      string, REQUIRED               # ≥80 chars
duration_minutes:                 int, REQUIRED, ≥30
price_inr:                        INR_INTEGER, REQUIRED
mrp_inr:                          INR_INTEGER, REQUIRED
discount_pct:                     float, REQUIRED, 0-1
gender_for:                       STRICT ENUM, REQUIRED
includes:                         array<string>, REQUIRED, may be empty
products_used:                    array<string>, REQUIRED, ≥1
photo_url:                        URL, REQUIRED
photo_ai_generated:               boolean, REQUIRED              # MUST be false
skill_level_min:                  int, REQUIRED, 1-5
contra_indications:               array<STRICT ENUM>, REQUIRED, may be empty   # see §5
pregnancy_safe:                   STRICT ENUM, REQUIRED          # see §5
recovery_minutes:                 int, REQUIRED, ≥0
allergen_disclosure:              array<STRICT ENUM>, REQUIRED, may be empty
ayurveda_classification:          STRICT ENUM, REQUIRED          # see §5; "not_ayurveda" if not

TherapistProfile

(Subset of StylistProfile + spa-specific. All fields REQUIRED.)

therapist_id:                     string, REQUIRED
display_name:                     string, REQUIRED
photo_url:                        URL, REQUIRED
photo_ai_generated:               boolean, REQUIRED              # MUST be false
gender:                           STRICT ENUM, REQUIRED
age_band:                         STRICT ENUM, REQUIRED
experience_years:                 int, REQUIRED, ≥0
specializations:                  array<STRICT ENUM>, REQUIRED, ≥1   # see §5
certifications:                   array<STRICT ENUM>, REQUIRED, may be empty
certifying_authorities:           array<STRICT ENUM>, REQUIRED, may be empty
ayurveda_certified:               boolean, REQUIRED
trained_in_lineage:               STRICT ENUM, REQUIRED          # see §5; "modern_western" if not ayurveda
languages_spoken:                 array<RFC_3066_LOCALE>, REQUIRED, ≥1
ratings:
  rating_avg:                     float, REQUIRED, 0-5
  rating_count:                   int, REQUIRED, ≥0
  treatments_completed_total:     int, REQUIRED, ≥0
  treatments_completed_30day:     int, REQUIRED, ≥0
kyc:
  aadhaar_verified:               boolean, REQUIRED
  pan_verified:                   boolean, REQUIRED
  background_check_passed:        boolean, REQUIRED
  background_check_iso:           ISO_DATETIME, REQUIRED
employed_kind:                    STRICT ENUM, REQUIRED

SpaSlotOption

(Same shape as SalonSlotOption. Treatment-room assigned. All fields REQUIRED.)

Forbidden fields

paid_placement_score | sponsored_rank | promotion_priority |
fake_recent_treatment_text | auto_inflate_treatments_completed |
ai_generated_photos (must equal false) | hidden_treatment_fee |
fake_certifications | undisclosed_oil_reuse | fake_ayurveda_authentic |
fake_partner_completion_rate_30d

5. CONTROLLED VOCABULARIES

spa_kind

day_spa | hotel_spa | resort_spa | ayurveda_specialty |
aromatherapy_specialty | hydrotherapy | thai_specialty |
budget_chain | premium_independent | celebrity_brand |
medical_spa | dermatology_spa

user_profile.body_kind

slim | average | athletic | curvy | plus_size

user_profile.stress_level

low | medium | high | extreme

user_profile.medical_conditions[]

hypertension | diabetes | heart_condition | back_pain | mild_back_pain |
neck_pain | shoulder_problem | knee_problem | hernia | varicose_veins |
recent_surgery | recent_injury | skin_condition | allergies |
medication_dependent | other | none

user_profile.preferred_pressure

light | medium | firm | deep

treatments_wanted[].treatment_kind and TreatmentItem.treatment_kind

swedish_massage | deep_tissue_massage | thai_massage | hot_stone_massage |
aromatherapy_massage | sports_massage | reflexology | shiatsu |
lymphatic_drainage | trigger_point_therapy |
abhyanga | shirodhara | udvartana | choornaswedan | nasya |
kati_basti | greeva_basti | janu_basti |
body_scrub | body_polish | body_wrap | body_mask | mud_therapy |
hydrotherapy | turkish_bath | onsen_soak | float_tank |
facial_basic | facial_premium | facial_hydra | facial_oxygen |
facial_anti_aging | facial_brightening |
manicure_basic | manicure_french | manicure_gel |
pedicure_basic | pedicure_premium | pedicure_paraffin |
eyebrow_threading | facial_threading | waxing_full_arms |
prenatal_massage | postnatal_massage | senior_massage |
couples_package | bridal_package | groom_package

treatments_wanted[].specific_focus_area

full_body | back_and_shoulders | neck_and_shoulders | feet | scalp |
face | hands | abdomen | legs | head | full_back | upper_back | lower_back

TreatmentItem.gender_for

female | male | unisex | couples

TreatmentItem.contra_indications[]

hypertension | pregnancy | recent_surgery | open_wounds |
deep_vein_thrombosis | severe_varicose_veins | acute_inflammation |
cancer_active_treatment | severe_skin_condition | none

TreatmentItem.pregnancy_safe

not_safe | safe_t1 | safe_t2 | safe_t3 | safe_all_trimesters |
postpartum_safe | not_applicable

TreatmentItem.allergen_disclosure[]

nut_oils | dairy_extracts | egg_extracts | sulphates | parabens |
synthetic_fragrance | latex | beeswax | seaweed | none

TreatmentItem.ayurveda_classification

not_ayurveda | classical_ayurveda_panchakarma | classical_ayurveda_external |
modern_ayurveda_inspired | herbal_treatment | tribal_traditional

spa.trust.oil_reuse_protocol

single_use_only | hot_recycle_filtered | no_oil_treatment | pour_to_disposable

spa.trust.ayurveda_certification_authority

none | traditional_ayurveda_council | rashtriya_ayurveda_vidyapeeth |
nimsme | partner_internal | family_lineage_certificate

spa_intent.music_kind_acceptable[]

silence | soft_instrumental | nature_sounds | tibetan_bowls |
classical | bowls_and_chimes | mantra | partner_curated

spa_intent.lighting_kind_acceptable[]

candle | dim | warm | natural_with_curtains | mood_lighting

spa_intent.aromatherapy_oils_required[]

lavender | eucalyptus | tea_tree | peppermint | rosemary |
chamomile | sandalwood | jasmine | rose | bergamot | lemon |
ylang_ylang | frankincense | none

TherapistProfile.specializations[]

swedish_massage | deep_tissue | thai_massage | hot_stone |
aromatherapy | reflexology | shiatsu | lymphatic_drainage |
ayurveda_panchakarma | abhyanga_specialist | shirodhara_specialist |
prenatal_massage | postnatal_massage | sports_therapy |
facial_specialist | body_treatments | manicure_pedicure |
hydrotherapy

TherapistProfile.certifications[]

imt_certified | itec_certified | cidesco_certified |
ayurveda_panchakarma_diploma | ayurveda_diploma_traditional |
swedish_massage_certified | thai_massage_certified |
shiatsu_certified | reflexology_certified |
state_council_certified | partner_internal_cert

TherapistProfile.certifying_authorities[]

imt | itec | cidesco | iyengar_authority | yoga_alliance |
indian_state_council | ayurveda_council | foreign_school |
partner_internal

TherapistProfile.trained_in_lineage

modern_western | swedish_lineage | thai_lineage | chinese_tcm |
ayurveda_traditional | ayurveda_modern | family_lineage_indian | mixed

TherapistProfile.gender, age_band, employed_kind

Same as lifestyle.book_salon §5.

cancel_appointment.reason

Same as base + medical_contraindication_arose.

merchant_id resolution order

1. Google Place ID
2. Municipal license number
3. partner_id + ":" + spa_id

6. TTBS DIMENSIONS (DELTA)

Per-domain weights

lifestyle (book_spa_treatment): { time: 0.20, taste: 0.40, budget: 0.30, safety: 0.10 }

TASTE (override)

SIGNALS USED:
  - spa.ratings.therapist_skill_score                weight 0.25
  - spa.ratings.recent_30day_score                   weight 0.15
  - spa.ratings.private_room_quality_score (if private requested) weight 0.15
  - therapist specializations match treatment_kind   weight 0.20
  - amenities match preferences                      weight 0.15
  - spa.products_used.preferred_brands overlap user  weight 0.10

HARD FILTERS:
  - couples_treatment AND couples_treatment_room=false → drop
  - private_room_required AND private_treatment_rooms=0 → drop
  - ayurveda_authentic_required AND ayurveda_authentic_certified=false → drop
  - therapist_certifications_required AND certifications=empty → drop

SAFETY

SIGNALS USED:
  - spa.trust.sterilization_certified              HARD FILTER
  - spa.trust.single_use_disposables               HARD FILTER
  - spa.trust.linen_change_per_customer            HARD FILTER
  - spa.trust.fire_safety_compliant                HARD FILTER
  - spa.trust.aed_defibrillator_present            weight 0.20
  - spa.trust.first_aid_kit_present                HARD FILTER
  - spa.trust.public_liability_coverage            weight 0.15
  - therapist.kyc.background_check_passed          HARD FILTER
  - spa.amenities.panic_button_in_treatment_room   HARD FILTER (when alone in room)
  - validate_treatment_compatibility for medical conditions HARD FILTER
  - pregnancy_safe matches user.pregnant_or_postpartum HARD FILTER
  - spa.trust.oil_reuse_protocol=single_use_only OR hot_recycle_filtered HARD FILTER

HARD FILTERS:
  - therapist_kyc_required AND any KYC=false → drop
  - female user requesting female therapist → drop male
  - user has contra_indication for treatment → drop
  - pregnant AND treatment not pregnancy_safe → drop

TIME, BUDGET, Hidden ranking factor

Same as lifestyle.book_salon §6.


7. COMPLETION CONTRACT

POST /api/v1/cpc/mcp_provider/{tomo_partner_id}
{
  "intent":            "lifestyle.book_spa_treatment",
  "intent_version":    "v1.0.0",
  "external_id":       "SPA-XYZ",
  "amount_inr":         7500,
  "closed_at":         "2026-05-12T18:30:00+05:30",
  "request_id":        "req_spa_8h2k_...",
  "status":            "completed",
  "appointment_ref":   "SPA-XYZ",
  "spa_id":            "spa_8423",
  "therapist_id":      "therapist_xyz",
  "checked_in_at":     "2026-05-12T16:55:00+05:30",
  "treatment_started_at": "2026-05-12T17:08:00+05:30",
  "treatment_completed_at": "2026-05-12T18:25:00+05:30",
  "duration_actual_minutes": 77,
  "treatments_performed": ["deep_tissue_massage", "facial_premium"],
  "any_safety_incident": false,
  "products_used_inr":   850,
  "currency":          "INR",
  "fare_breakdown_total_inr": 7500,
  "rider_tip_inr":       800,
  "ratings_pending":     true,
  "notes":              ""
}

Status enum: completed | cancelled_by_user | cancelled_by_spa | no_show | failed | partial_completion_user_left_early | medical_event_treatment_halted


8. WIDGET / 9. CACHING / 10. ERROR CODES / 11. CHECKLIST

(Inherit from lifestyle.book_salon §8-11 with spa-specific adaptations. Widget type: spa_treatment_options.)


12. ANTI-FABRICATION RULES

All from lifestyle.book_salon §12 REQUIRED. ADD:

RULE 17 — Oil reuse protocol honest.
  oil_reuse_protocol claim must reflect actual practice. Reusing oil across
  customers when single_use claimed = severe hygiene + cross-infection breach.

RULE 18 — Single-use disposables real.
  Single-use claim verifiable. Reusing towels/brushes = breach.

RULE 19 — Linen change per customer enforced.
  Stained or reused linen = breach.

RULE 20 — Ayurveda authentic claim verifiable.
  ayurveda_authentic_certified=true requires authority cert. Marketing-as-
  ayurveda without lineage = breach + cultural misrepresentation.

RULE 21 — Pregnancy-safe enforced.
  Treatments with contra-indications for pregnancy must HARD FILTER.
  Performing prohibited treatment on pregnant user = severe breach + safety
  hazard + criminal exposure.

RULE 22 — Contra-indication validation real.
  validate_treatment_compatibility must check the user's disclosed conditions.
  Approving treatment that's contraindicated = breach + medical safety hazard.

RULE 23 — Panic button in treatment room functional.
  When user is alone with therapist, panic button must reach partner ground
  team within 60s. Decorative button = severe safety breach.

RULE 24 — No silent therapist swap.
  Booked therapist = arriving therapist. If unavailable, replacement requires
  user accept.

RULE 25 — Female therapist for female user honored.
  If user requested female + alone + private room, partner cannot send male
  therapist. Severe safety breach.

VERSION HISTORY

v1.0.0 — 2026-05-10 — Initial spec (delta over lifestyle.book_salon, spa adaptation)