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.
● LIVEv1.0.0safety.book_roadside_assistance

safety.book_roadside_assistance — Full Intent Specification

INTENT NAMESPACE: safety
INTENT NAME:      book_roadside_assistance
FULL ID:          safety.book_roadside_assistance
VERSION:          v1.0.0
STATUS:           live
TTBS WEIGHTS:     time 0.45 · taste 0.05 · budget 0.25 · safety 0.25
LAST UPDATED:     2026-05-14

On-demand vehicle breakdown response: flat tyre, jumpstart, lockout, fuel delivery, towing, minor repair on-spot. Distinct from auto.book_breakdown_assist (same domain but service-tier oriented) because: (a) this is the SAFETY-domain emergency framing — user is potentially stranded on a highway or in unsafe terrain at night; (b) ETA targets are tighter (≤ 45 min metro, ≤ 90 min outstation); (c) responder vetting + lone-traveller protocol (especially female / night) matters more than service quality; (d) escalation tree includes 112 emergency dispatch where injury or imminent threat is implied; (e) towing destination must be a verified network garage or user-chosen address. This intent lives in safety.* because the user said "I'm stranded" — not "I want to service my car".


1. NATURAL LANGUAGE COVERAGE

Classifies IN

  • "car broken down, need help"
  • "flat tyre, NH-44, near Kurnool"
  • "battery dead, need jumpstart"
  • "locked out of my car"
  • "ran out of fuel, send some"
  • "tow truck Hyderabad outer ring road"
  • "stranded with my kids, breakdown"
  • "engine overheating, can't move"
  • "lone driver, midnight breakdown"
  • "Allianz / Allstate RSA, claim"

Classifies OUT — borderline NO

  • "regular car service" → auto.book_general_service
  • "AC repair" → auto.book_ac_service
  • "insurance renewal" → finance.buy_motor_insurance
  • "bike transport" → logistics.book_bike_transport
  • "ambulance" → safety.book_private_ambulance (if injury / medical)

MULTI-INTENT TRIGGERS

  • "breakdown + tow to my preferred garage + service quote" → safety.book_roadside_assistance + auto.book_general_service
  • "breakdown + ambulance for injured passenger" → safety.book_roadside_assistance + safety.book_private_ambulance
  • "breakdown + cab to hotel for the night" → safety.book_roadside_assistance + mobility.book_intracity_ride

2. INPUT — TOMO → PROVIDER

{
  "intent":          "safety.book_roadside_assistance",
  "intent_version":  "v1.0.0",
  "request_id":      "req_rsa_8q3p_2026-05-14T22:45:00Z",
  "user_session_id": "anon_user_token_or_uid",

  "incident": {
    "type":             "flat_tyre",
    "types_allowed":    ["flat_tyre", "jumpstart_battery", "lockout", "fuel_delivery", "minor_repair_onspot", "tow_to_garage", "tow_to_address"],
    "severity":         "non_emergency",
    "severity_allowed": ["non_emergency", "stranded_in_unsafe_location", "imminent_threat"]
  },

  "location": {
    "lat":              16.5417,
    "lng":              78.3553,
    "geocoded_label":   "NH-44, ~5 km north of Kurnool",
    "is_highway":       true,
    "is_outstation":    true,
    "nearest_city":     "Kurnool",
    "nearest_city_distance_km": 5
  },

  "vehicle": {
    "make":          "Maruti Suzuki",
    "model":         "Swift",
    "rc_number":     "TS09EZXXXX",
    "fuel_type":     "petrol",
    "wheels":        4
  },

  "passenger_context": {
    "count":             3,
    "minors_present":    true,
    "lone_driver_female_flag": false,
    "is_night":           true
  },

  "destination_if_tow": {
    "preferred":      "network_garage",
    "preferred_allowed": ["network_garage", "user_chosen_address"],
    "user_chosen_address_id": null
  },

  "user_constants": {
    "preferred_providers": ["AllianzAssistance", "Europ Assistance", "Bajaj RSA", "Allstate RSA India"],
    "active_rsa_subscription_id_optional": "RSA-ALZ-77321"
  }
}

Field rules

  • severity: imminent_threat triggers ESCALATION to 112 alongside provider dispatch.
  • is_night: true + lone_driver_female_flag: true HARD requires female-friendly responder protocol (recorded ETA + check-in calls).
  • incident.type STRICT ENUM.
  • tow_to_address only if user_chosen_address_id non-null.

3. PROVIDER TOOLS

rsa.quote

Returns price (free if active subscription) + ETA + responder profile.

rsa.subscription_check

Returns whether the user's RSA subscription covers this incident, distance from base, and number of free events left in year.

rsa.dispatch

Dispatches nearest responder; returns responder_id, responder_phone, vehicle_plate, ETA.

rsa.escalate_112

For imminent_threat — co-dispatches 112 with metadata.

rsa.live_track

Live GPS of responder.

rsa.responder_arrival_capture

Photo of responder + arrival timestamp.

rsa.completion_capture

Photo post-service + signed acknowledgement.

rsa.tow_handoff

At destination garage — handover photos.

rsa.cancel

Allowed before responder dispatch only.


4. RESPONSE SHAPE

{
  "intent": "safety.book_roadside_assistance",
  "request_id": "req_rsa_8q3p_2026-05-14T22:45:00Z",
  "subscription_check": {
    "covered": true,
    "subscription_id": "RSA-ALZ-77321",
    "free_events_remaining_this_year": 3,
    "covered_incident_types": ["flat_tyre", "jumpstart_battery", "lockout", "fuel_delivery", "minor_repair_onspot", "tow_to_garage"]
  },
  "options": [
    {
      "tier": "OK",
      "provider": "Bajaj RSA",
      "responder_eta_min": 60,
      "price_inr_after_cover": 0,
      "price_inr_without_cover": 1500,
      "responder_bg_band": "verified",
      "responder_uniform_marked_vehicle": true,
      "night_protocol_active": true,
      "ttbs_score": 0.66,
      "tier_reason": "covered fully, 60-min ETA"
    },
    {
      "tier": "GOOD",
      "provider": "AllianzAssistance",
      "responder_eta_min": 35,
      "price_inr_after_cover": 0,
      "price_inr_without_cover": 1800,
      "responder_bg_band": "verified_plus_aadhaar",
      "responder_uniform_marked_vehicle": true,
      "night_protocol_active": true,
      "female_friendly_protocol": true,
      "check_in_call_at_arrival": true,
      "ttbs_score": 0.85,
      "tier_reason": "balanced — 35-min ETA + female-friendly protocol"
    },
    {
      "tier": "GREAT",
      "provider": "Europ Assistance",
      "responder_eta_min": 25,
      "price_inr_after_cover": 0,
      "price_inr_without_cover": 2400,
      "responder_bg_band": "verified_plus_aadhaar_plus_court",
      "responder_uniform_marked_vehicle": true,
      "night_protocol_active": true,
      "female_friendly_protocol": true,
      "check_in_call_at_arrival": true,
      "encrypted_voice_with_cms": true,
      "redundant_responder_dispatched": true,
      "ttbs_score": 0.93,
      "tier_reason": "fastest + court-cleared + redundant responder"
    }
  ],
  "escalation_state": {
    "112_called": false,
    "112_recommended": false,
    "user_safe_to_wait": true
  }
}

5. CONTROLLED VOCABULARIES

incident.type

flat_tyre · jumpstart_battery · lockout · fuel_delivery · minor_repair_onspot · tow_to_garage · tow_to_address

incident.severity

non_emergency · stranded_in_unsafe_location · imminent_threat

destination_if_tow.preferred

network_garage · user_chosen_address

responder_bg_band

unverified · verified · verified_plus_aadhaar · verified_plus_aadhaar_plus_court

All STRICT ENUM.


6. TTBS DIMENSIONS

TIME (weight 0.45 — dominant)

  • responder_eta_min — smaller = better
  • 45 min cap on metro, 90 min on highway
  • Same-tier ETA comparison weighted exponentially
  • TIME = max(0, 1 − eta_min / 90)

TASTE (weight 0.05)

  • Responder communication band
  • App tracking UX
  • TASTE = comms × ux

BUDGET (weight 0.25)

  • price_inr_after_cover (0 if subscription covers)
  • Without-cover fallback transparency
  • Tow distance overage band
  • BUDGET = 1 if covered, else 1 − (price − best) / best

SAFETY (weight 0.25)

  • Responder bg band
  • Marked vehicle + uniform
  • Night protocol active
  • Female-friendly protocol when flagged
  • Check-in call at arrival
  • Encrypted CMS voice
  • 112 escalation co-dispatch when severity = imminent_threat
  • SAFETY = bg × marked × night × female_fit × checkin × encrypted × escalation_fit

HARD FILTERS

  1. Responder bg band ≥ verified.
  2. Female-friendly protocol active if lone_driver_female_flag: true.
  3. Night protocol active if is_night: true.
  4. 112 escalation co-dispatched if severity: imminent_threat.
  5. ETA ≤ 90 min (highway) / 45 min (metro).

7. COMPLETION CONTRACT

Success criteria

  1. Quote returned; subscription cover applied if any.
  2. Responder dispatched with photo + phone + plate.
  3. Live track shared with user.
  4. Check-in call at responder arrival (if female-friendly flag).
  5. Incident resolved; service done or tow completed.
  6. Photo + signed acknowledgement.
  7. CPC webhook fires.

CPC webhook

{
  "event": "safety.book_roadside_assistance.completed",
  "intent_id": "safety.book_roadside_assistance",
  "request_id": "req_rsa_8q3p_2026-05-14T22:45:00Z",
  "order_id": "RSA9KP72",
  "provider": "AllianzAssistance",
  "incident_type": "flat_tyre",
  "responder_eta_actual_min": 32,
  "subscription_used": "RSA-ALZ-77321",
  "price_inr_after_cover": 0,
  "price_inr_without_cover": 1800,
  "tomo_commission_base_inr": 270,
  "tomo_commission_inr": 27,
  "pass_through_inr": 1530,
  "responder_id_anonymized": "RES-AZ-7321",
  "completed_at_iso": "2026-05-14T23:32:00+05:30",
  "signature_hmac_sha256": "…"
}

(tomo_commission_base_inr = partner's contracted referral on NET; price_inr_without_cover shown for honesty even when zero billed.)

Failure cases

  • responder_no_show → emergency replacement; partner SLA penalty.
  • incident_severity_upgraded_to_imminent → 112 dispatched.
  • tow_garage_unavailable → re-route to alt network garage.
  • subscription_invalid → user pays per without-cover price with explicit consent.

8. WIDGET

{
  "widget": "RoadsideAssistanceWidget",
  "header": {
    "incident_strip": "Flat tyre · NH-44 · Kurnool ~5 km",
    "context_strip": "Night · 3 passengers (1 minor)",
    "subscription_strip": "Allianz RSA covered · 3 events left this year"
  },
  "regions": {
    "region_1_intelligence": ["responder Aadhaar verified", "uniformed marked vehicle", "check-in call at arrival", "live GPS active"],
    "region_2_summary": "Dispatching responder, ETA ~35 min",
    "region_3_visual": "responder_photo_url (post-assignment, partner-supplied)",
    "region_4_now_pin": "Stay in your vehicle with doors locked · share location with kin",
    "region_5_tomo_choices": [
      {"tier": "OK", "label": "Bajaj RSA · ₹0 (covered) · 60 min", "reason": "covered, slower"},
      {"tier": "GOOD", "label": "AllianzAssistance · ₹0 (covered) · 35 min · female-friendly", "reason": "balanced"},
      {"tier": "GREAT", "label": "Europ Assistance · ₹0 (covered) · 25 min · redundant responder", "reason": "fastest + safest"}
    ]
  },
  "footer_disclosures": [
    "If you feel unsafe right now, tap the red SOS button to co-dispatch 112 alongside the responder.",
    "Stay inside the vehicle with hazard lights on; the responder will call you at arrival.",
    "If someone is injured, switch to the ambulance flow — it's faster for medical."
  ]
}

9. CACHING POLICY

  • Quote: 60s TTL.
  • Subscription cover status: cache 24h; refresh on first request of the day.
  • Responder GPS: live.
  • Incident records: 5 years at partner per insurance audit; 1 year on-device for user.
  • Photo: hash at TOMO; full at partner.

10. ERROR CODES

Code Meaning UI surface
ERR_NO_RESPONDER_IN_RANGE no responder in radius Try next provider
ERR_RESPONDER_NO_SHOW dispatched but no arrival Replacement + SLA penalty
ERR_TOW_GARAGE_UNAVAILABLE network garage down Alt garage or user-chosen address
ERR_SUBSCRIPTION_INVALID cover not applicable Without-cover quote with consent
ERR_BG_BAND_TOO_LOW bg below verified Drop option
ERR_NIGHT_PROTOCOL_OFF partner doesn't operate night protocol Drop option
ERR_FEMALE_FRIENDLY_PROTOCOL_OFF flag set, partner can't honor Drop option
ERR_ESCALATION_112_FAILED 112 dial failed Retry; partner-side fallback
ERR_VEHICLE_UNSUPPORTED wheels/fuel partner can't service Try alt provider
ERR_PARTNER_OFFLINE partner API down Try next

11. SANDBOX → PRODUCTION CHECKLIST

  • Sandbox 112 co-dispatch on imminent_threat.
  • Sandbox night + female-friendly protocol gating.
  • Sandbox responder no-show triggers replacement.
  • Sandbox subscription cover applied for valid subs; without-cover quote otherwise.
  • Sandbox tow handoff photo capture mandatory.
  • Production responder bg band sourced from partner.
  • Production responder rotation tested at peak hours and highway corridors.
  • Production rate limit: 30 incidents/user/year (anti-abuse).
  • Production CPC HMAC-SHA256 5-min replay verified.
  • Production 112 escalation tested with partner CMS.

12. ANTI-FABRICATION RULES

  • NO paid_placement on providers — TTBS only.
  • NO synthetic responder photos.
  • NO "fastest in city" claim without partner ETA SLA.
  • NO concealing without-cover price when subscription covers.
  • NO claim of police partnership — 112 is the escalation channel.
  • NO TOMO-issued responder badge.
  • NO holding incident video at TOMO.
  • NO synthetic female-friendly protocol claim.
  • NO bundling promo into RSA price.
  • NO marketing language ("smart roadside").

13. REGULATORY FRAMING

  • Motor Vehicles Act 1988 + Rules 1989 — towing, fitness, fuel delivery norms.
  • PSARA 2005 where partner deploys uniformed responders.
  • Insurance Act 1938 / IRDAI — RSA add-on or standalone insurance product.
  • CrPC + IPC — 112 is the legal emergency dispatch.
  • Petroleum Rules 2002 — fuel delivery on-spot must use approved jerry-cans (partner ensures).
  • DPDPA 2023 — location, RC, responder profile = personal data; partner is processor.
  • Consumer Protection Act 2019 — partner is service provider.
  • TOMO is router only — does NOT employ responders, does NOT operate tow trucks, does NOT carry medical/dispatch liability.