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.0auto.book_ev_charger_install

Intent Spec — auto.book_ev_charger_install

FULL ID:       auto.book_ev_charger_install
VERSION:       v1.0.0
STATUS:        draft
LAST UPDATED:  2026-05-12
DOMAIN:        auto
PRIMARY AGENT: AutoServicesAgent
TTBS WEIGHTS:  time=0.20 taste=0.15 budget=0.25 safety=0.40

User books home / office EV charger fitment. Covers site assessment, electrical work (wiring, breaker, RCBO), charger mounting, OEM commissioning, certificate of installation. Highest safety weight in the auto domain after breakdown_assist because mis-installation causes electrical fires and voids the EV warranty.

Partner exemplars: Tata Power EZ Charge, Statiq, Charge+Zone, ChargeGrid, OEM-authorised installers (Tata.ev, Mahindra Electric, MG, BYD), licensed electricians under EV brand contract.


SECTION 1 — INTENT IDENTITY

User wants a permanent EV charger fitted at a fixed location. Distinct from:

  • auto.book_ev_with_charge_planning — rental / ride intent with EV awareness (mobility domain)
  • auto.book_general_service — periodic vehicle service
  • auto.book_breakdown_assist — emergency
  • Home wiring overhaul that doesn't include a charger → not in TOMO scope

Single intent per booking. AC home chargers (3.3kW / 7.4kW) and DC fast chargers (≥15kW) are both in scope.


SECTION 2 — NATURAL LANGUAGE COVERAGE

CLASSIFIES IN

  • "Install home charger for my Tata Nexon EV"
  • "EV charger fitment at apartment parking"
  • "DC fast charger setup at my office"
  • "Wall-mount charger for Mahindra XUV400"
  • "Need someone to do the electrical work + install charger"
  • "OEM-authorised charger installation"
  • "Site survey for EV charger"
  • "Type-2 charger for MG ZS EV"
  • "Set up charging at home for my new EV"
  • "Apartment society needs shared charger"

CLASSIFIES OUT — BORDERLINE NO

  • "Where's the nearest public charger?" → not a booking intent
  • "Charge my car please" → not in scope
  • "Buy an EV" → not in scope (v2)
  • "Fix my car's onboard charger" → auto.book_major_service

MULTI-INTENT TRIGGERS

  • "Install charger + rewire my parking" → auto.book_ev_charger_install + (future) home electrical intent

SECTION 3 — INPUT (TOMO → PROVIDER)

{
  "intent": "auto.book_ev_charger_install",
  "request_id": "req_01J9Z...",
  "user_location": { "lat": 17.4475, "lng": 78.3563, "max_radius_km": 30, "city": "Hyderabad" },
  "premises": {
    "type": "apartment",                     // STRICT ENUM §6
    "ownership": "owner",                    // STRICT ENUM §6
    "society_noc_obtained": false,
    "parking_type": "covered_personal",      // STRICT ENUM §6
    "electrical_phase": "single_phase",      // STRICT ENUM §6
    "distance_to_meter_meters": 12
  },
  "vehicle": {
    "type": "car",
    "make": "Tata Motors",
    "model": "Nexon EV",
    "variant": "Max XZ+",
    "ev_battery_kwh": 40.5,
    "connector_type": "type_2",              // STRICT ENUM §6
    "year_of_manufacture": 2024
  },
  "charger_preferences": {
    "charger_class": "ac_7_4_kw",            // STRICT ENUM §6
    "brand_preference": "oem_authorised",    // STRICT ENUM §6
    "smart_features_required": true,
    "ocpp_compliance_required": true,
    "outdoor_rated": false
  },
  "service_preferences": {
    "preferred_window": {
      "earliest_site_survey": "2026-05-15T10:00:00+05:30",
      "latest_completion":    "2026-05-30T18:00:00+05:30"
    },
    "max_acceptable_cost_inr": 60000,
    "subsidy_assistance_required": true
  },
  "ttbs_user_band": {
    "time":   "flexible",
    "taste":  "balanced",
    "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 auto.book_ev_charger_install
premises.type enum REQUIRED, STRICT ENUM §6 Apartment / villa / commercial
premises.ownership enum REQUIRED, STRICT ENUM §6 Owner consent or society NOC needed
premises.electrical_phase enum REQUIRED, STRICT ENUM §6 Single / three phase
premises.distance_to_meter_meters int REQUIRED, 0-100 Drives cable run cost
vehicle.ev_battery_kwh float REQUIRED, 5-200 Drives charger sizing
vehicle.connector_type enum REQUIRED, STRICT ENUM §6 Type-2 most common in India
charger_preferences.charger_class enum REQUIRED, STRICT ENUM §6
charger_preferences.ocpp_compliance_required bool REQUIRED OCPP 1.6J / 2.0.1 for shared chargers
service_preferences.subsidy_assistance_required bool REQUIRED Partner helps with state EV subsidy filing

Anti-fabrication preamble: Provider may not claim OEM authorisation without uploaded current-year certification. Smart-feature claims must match product spec sheet exactly.


SECTION 4 — PROVIDER TOOLS

Tool 1: search_charger_installers

PURPOSE:      Up to 12 installers matching electrical phase + charger class + premises
SLA:          p50 ≤ 800ms, p95 ≤ 2000ms, p99 ≤ 4000ms
RATE LIMIT:   60 req/min
IDEMPOTENCY:  request_id; 120s cache
RETRY:        1 on 429, 2 on 5xx

Tool 2: book_site_survey

PURPOSE:      Schedule mandatory site survey before any quote
SLA:          p50 ≤ 1000ms, p95 ≤ 3000ms
RATE LIMIT:   30 req/min
IDEMPOTENCY:  request_id
RETRY:        No retry

Tool 3: get_install_quote

PURPOSE:      Post-survey quote with site-specific cost (cable run, breaker, RCBO)
SLA:          p50 ≤ 600ms, p95 ≤ 1800ms
RATE LIMIT:   60 req/min
RETRY:        1 on 5xx

Tool 4: confirm_install_booking

PURPOSE:      User approved quote → book installation slot
SLA:          p50 ≤ 1500ms, p95 ≤ 4000ms
RATE LIMIT:   30 req/min
IDEMPOTENCY:  request_id
RETRY:        No retry

Tool 5: cancel_install_booking

SLA:          p50 ≤ 700ms, p95 ≤ 2000ms
RATE LIMIT:   30 req/min
RETRY:        1 on 5xx

SECTION 5 — RESPONSE SHAPE

ChargerInstaller

ChargerInstaller:
  installer_id: { type: string, constraint: REQUIRED }
  name: { type: string, constraint: REQUIRED }
  installer_type:
    type: enum
    constraint: REQUIRED, STRICT ENUM §6
    values: [oem_authorised, charger_brand_authorised, multi_brand_certified, independent_licensed]
  authorised_charger_brands:
    type: array<enum>
    constraint: REQUIRED, may be empty
    values: [tata_power_ez, statiq, charge_zone, exicom, delta, abb, schneider, oem_native]
  authorised_vehicle_oems:
    type: array<enum>
    constraint: REQUIRED, may be empty
    values: [tata_ev, mahindra_electric, mg, byd, hyundai_ev, kia_ev, bmw_i]

  electrician_license_number: { type: string, constraint: REQUIRED, semantics: "state-issued electrician license # for liability" }
  refrigerant_handling_certified: { type: boolean, constraint: NOT APPLICABLE_OMITTED }  # placeholder — none for EV install

  service_areas:
    type: array<string>
    constraint: REQUIRED, ≥1
    semantics: pincodes installer covers

  charger_catalog:
    type: array<Charger>
    constraint: REQUIRED, ≥1
    shape:
      sku: { type: string, constraint: REQUIRED }
      brand: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
      model: { type: string, constraint: REQUIRED }
      charger_class: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
      kw_rating: { type: float, constraint: REQUIRED, 3-180 }
      connector_type: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
      smart_app_supported: { type: boolean, constraint: REQUIRED }
      ocpp_version: { type: string, constraint: REQUIRED nullable, semantics: "e.g. '1.6J' or '2.0.1'; null for non-OCPP" }
      ip_rating: { type: string, constraint: REQUIRED, semantics: "IP55 / IP65 for outdoor" }
      warranty_months: { type: int, constraint: REQUIRED, 12-60 }
      price_inr: { type: int, constraint: REQUIRED, INR_INTEGER }

  installation_capabilities:
    handles_single_phase: { type: boolean, constraint: REQUIRED }
    handles_three_phase: { type: boolean, constraint: REQUIRED }
    handles_apartment_complexes: { type: boolean, constraint: REQUIRED }
    society_noc_assistance: { type: boolean, constraint: REQUIRED }
    subsidy_filing_assistance: { type: boolean, constraint: REQUIRED }

  earliest_site_survey_slot: { type: string, constraint: REQUIRED, ISO_DATETIME }
  typical_survey_to_install_days: { type: int, constraint: REQUIRED, 1-21 }

  warranty:
    charger_warranty_months: { type: int, constraint: REQUIRED, 12-60 }
    installation_warranty_months: { type: int, constraint: REQUIRED, 6-24 }
    cabling_warranty_months: { type: int, constraint: REQUIRED, 12-36 }
    warranty_terms_url: { type: string, constraint: REQUIRED, HTTPS URL }

  estimated_cost_range_inr:
    low: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
    high: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
    semantics: { type: string, constraint: REQUIRED, semantics: "site-dependent; finalised post-survey" }

  ratings:
    avg_rating: { type: float, constraint: REQUIRED, 0-5 }
    review_count: { type: int, constraint: REQUIRED, ≥0 }
    post_install_fault_rate_pct_last_90d: { type: int, constraint: REQUIRED, 0-100, semantics: "% installs that needed call-back" }

  partner_reference:
    source: { type: string, constraint: REQUIRED }
    deeplink: { type: string, constraint: REQUIRED, HTTPS URL }

SiteSurveyBooking

SiteSurveyBooking:
  survey_id: { type: string, constraint: REQUIRED, immutable }
  installer_id: { type: string, constraint: REQUIRED }
  scheduled_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
  survey_fee_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
  fee_waived_if_install_proceeds: { type: boolean, constraint: REQUIRED }
  surveyor_name: { type: string, constraint: REQUIRED }
  surveyor_phone: { type: string, constraint: REQUIRED, E.164 }
  estimated_survey_duration_minutes: { type: int, constraint: REQUIRED, 30-180 }

InstallQuote

InstallQuote:
  quote_id: { type: string, constraint: REQUIRED }
  survey_id: { type: string, constraint: REQUIRED }
  validity_until: { type: string, constraint: REQUIRED, ISO_DATETIME, ≥7d }
  site_findings:
    type: array<Finding>
    constraint: REQUIRED, ≥1
    shape:
      component: { type: string, constraint: REQUIRED }
      condition: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [ok, upgrade_needed, replacement_needed] }
      photo_url: { type: string, constraint: REQUIRED, HTTPS URL }
      note: { type: string, constraint: REQUIRED, ≤300 chars }
  charger_recommended_sku: { type: string, constraint: REQUIRED }
  line_items:
    type: array<LineItem>
    constraint: REQUIRED, ≥3
    shape:
      sku: { type: string, constraint: REQUIRED }
      description: { type: string, constraint: REQUIRED }
      category: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
      total_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
      necessity: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [mandatory_for_safety, mandatory_for_warranty, recommended, optional] }
  subsidy_applicable:
    eligible: { type: boolean, constraint: REQUIRED }
    estimated_subsidy_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
    scheme_name: { type: string, constraint: REQUIRED nullable }
  totals:
    pre_subsidy_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
    estimated_subsidy_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
    net_payable_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
    gst_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
    total_inr: { type: int, constraint: REQUIRED, INR_INTEGER }

InstallBooking

InstallBooking:
  install_id: { type: string, constraint: REQUIRED, immutable }
  quote_id: { type: string, constraint: REQUIRED }
  scheduled_install_date: { type: string, constraint: REQUIRED, ISO_DATETIME }
  estimated_completion: { type: string, constraint: REQUIRED, ISO_DATETIME }
  install_team_lead_name: { type: string, constraint: REQUIRED }
  install_team_lead_phone: { type: string, constraint: REQUIRED, E.164 }
  install_team_license_numbers: { type: array<string>, constraint: REQUIRED, ≥1 }
  payment_due_at: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [30_percent_advance_balance_on_completion, on_completion, invoice_30_days] }

CancellationResult

CancellationResult:
  cancelled_id: { type: string, constraint: REQUIRED }
  cancelled_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
  cancellation_fee_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
  refund_amount_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
  refund_eta_days: { type: int, constraint: REQUIRED, 0-21 }

FORBIDDEN FIELDS

  • paid_placement_score, ad_bid, sponsored_rank, promotion_priority, kickback_amount
  • artificial_urgency_text
  • ai_generated_photo for surveyor / install / charger imagery
  • commission_padded_price
  • unlicensed_electrician_acceptable — partners MUST use state-licensed electricians

SECTION 6 — CONTROLLED VOCABULARIES

premises.type:
  values:
    apartment:        "Apartment in society"
    independent_villa: "Standalone villa / bungalow"
    commercial:       "Office / commercial premises"
    society_common:   "Shared society parking"

premises.ownership: { values: { owner, tenant_with_consent, society_committee } }

premises.parking_type:
  values:
    covered_personal:  "Covered, dedicated to user"
    open_personal:     "Open-air, dedicated"
    covered_shared:    "Covered, society shared"
    open_shared:       "Open, society shared"
    outdoor_exposed:   "Fully exposed (driveway, kerbside)"

premises.electrical_phase: { values: { single_phase, three_phase } }

vehicle.connector_type:
  values:
    type_2:    "Type-2 (Mennekes; AC India standard)"
    ccs2:      "CCS2 (DC fast)"
    chademo:   "CHAdeMO (DC fast, legacy)"
    bharat_ac: "Bharat AC-001 (Indian standard, older)"

charger_class:
  values:
    ac_3_3_kw:  "AC 3.3 kW (slow home)"
    ac_7_4_kw:  "AC 7.4 kW (standard home)"
    ac_11_kw:  "AC 11 kW (three-phase home)"
    ac_22_kw:  "AC 22 kW (three-phase commercial)"
    dc_15_kw:  "DC 15 kW (community fast)"
    dc_30_kw:  "DC 30 kW (fast)"
    dc_60_kw_plus: "DC 60+ kW (rapid)"

charger_brand_preference:
  values:
    oem_authorised:    "Vehicle OEM's recommended charger"
    charger_brand:     "Standalone charger brand"
    multi_brand:       "Any certified brand"

installer_type:
  values:
    oem_authorised:        "Vehicle OEM's installer network"
    charger_brand_authorised: "Charger brand's installer"
    multi_brand_certified: "Certified by multiple OEMs"
    independent_licensed:  "Independent state-licensed electrician trained for EV"

line_item.category:
  values: { charger_unit, cable_run, breaker_rcbo, civil_work, mounting_bracket, commissioning, labour, certificate_fee }

line_item.necessity:
  values: { mandatory_for_safety, mandatory_for_warranty, recommended, optional }

site_findings.condition: { values: { ok, upgrade_needed, replacement_needed } }

payment_due_at:
  values: { 30_percent_advance_balance_on_completion, on_completion, invoice_30_days }

SECTION 7 — TTBS DIMENSIONS

TIME (weight = 0.20):
  signals_used: [earliest_site_survey_slot, typical_survey_to_install_days]
  weighting: { survey_speed: 0.5, install_speed: 0.5 }

TASTE (weight = 0.15):
  signals_used:
    - installer_type matching brand_preference
    - authorised_vehicle_oems contains user's vehicle.make
  weighting: { type: 0.45, oem_match: 0.55 }

BUDGET (weight = 0.25):
  signals_used:
    - estimated_cost_range_inr
    - installation_capabilities.subsidy_filing_assistance (bonus)
  weighting: { cost: 0.75, subsidy_bonus: 0.25 }

SAFETY (weight = 0.40):
  signals_used:
    - electrician_license_number (mandatory floor; null = filtered out)
    - warranty.installation_warranty_months
    - warranty.cabling_warranty_months
    - ratings.post_install_fault_rate_pct_last_90d (LOWER = better)
    - installer_type=oem_authorised or charger_brand_authorised (bonus)
  weighting:
    license: 0.20    # binary floor
    install_warranty: 0.25
    cabling_warranty: 0.20
    fault_rate: 0.25
    auth_bonus: 0.10
  user_band_handling:
    fast: relax fault_rate threshold
    balanced: standard
    flexible: prefer 0% fault_rate installers + 24m install warranty

SECTION 8 — COMPLETION CONTRACT

POST /api/v1/cpc/mcp_provider/<your_partner_id>
Body:
{
  "intent":           "auto.book_ev_charger_install",
  "external_id":      "<install_id>",
  "request_id":       "<request_id>",
  "amount_inr":       28000,    // NET (charger margin + labour + cabling supplier-kept)
  "gst_inr":          5040,
  "tips_inr":         0,
  "pass_through_inr": 4000,     // subsidy advance / govt fees partner doesn't keep
  "closed_at":        "2026-05-28T17:00:00+05:30",
  "status":           "completed",
  "charger_brand": "tata_power_ez",
  "charger_class": "ac_7_4_kw",
  "subsidy_applied_inr": 4000,
  "installation_certificate_url": "https://partner.example.com/certs/abc123.pdf",
  "warranty_card_issued": true
}

HMAC, 5-min replay, NET-only commission.


SECTION 9 — WIDGET

EvChargerWidget (planned). Interim: enhanced ListingsWidget.

Field mapping:
  - ChargerInstaller.name → header
  - installer_type + authorised brands → cert badges row
  - charger_catalog ranked by user preference → expandable picker
  - estimated_cost_range_inr → range pill
  - warranty.installation_warranty_months → "Install warranty Xm" pill
  - subsidy_filing_assistance=true → green subsidy badge
  - ratings.post_install_fault_rate_pct_last_90d → "X% callback rate" pill (color-coded green/red)

SECTION 10 — CACHING POLICY

Call TTL
search_charger_installers 120s
book_site_survey NO CACHE
get_install_quote 5min
confirm_install_booking NO CACHE
cancel_install_booking NO CACHE
Charger catalog metadata 24h
Installer static (license, warranties) 6h

SECTION 11 — ERROR CODES

Code HTTP Meaning Retry
INVALID_REQUEST 400 Malformed No
RATE_LIMITED 429 Throttle 1, 2s
INTERNAL_ERROR 500 Partner failure 2, exp
SIGNATURE_INVALID 401 (webhook) HMAC fail No
NO_INSTALLERS_IN_AREA 200 (empty) Valid, no service in pincode n/a
VEHICLE_NOT_SUPPORTED 422 EV not in installer catalog No
PHASE_MISMATCH 422 premises phase incompatible with requested charger_class No
SOCIETY_NOC_REQUIRED 422 Apartment install needs NOC; survey blocked until obtained No
SUBSIDY_NOT_APPLICABLE 422 (advisory) Subsidy scheme doesn't apply to this premises/charger combo n/a (informational)
SURVEY_SLOT_GONE 409 (book_survey) Slot taken No
QUOTE_EXPIRED 410 (confirm) quote.validity_until passed No
INSTALL_SLOT_GONE 409 (confirm) Install slot taken No
LICENSE_VERIFICATION_FAILED 422 electrician_license_number couldn't be verified No
CANCELLATION_FEE_DUE 200 (cancel) Non-zero fee n/a

SECTION 12 — SANDBOX → PRODUCTION CHECKLIST

[ ] All five tools implemented
[ ] At least 2 installers covering common pincodes
[ ] electrician_license_number verifiable via state electrician registry
[ ] At least 3 chargers in catalog (different classes: ac_3_3 / ac_7_4 / ac_22)
[ ] All controlled vocabularies respected
[ ] HMAC signing verified
[ ] amount_inr is NET; pass_through_inr correctly captures subsidies + govt fees
[ ] subsidy_applied_inr in CPC reflects actual subsidy claimed
[ ] installation_certificate_url returns valid certificate
[ ] No forbidden fields
[ ] SLA p95 met
[ ] Site survey workflow tested: survey → quote → confirm cycle
[ ] OCPP compliance verifiable for chargers claiming it
[ ] Compliance docs: GSTIN, shop license, electrician license, EV-OEM authorisations if claimed, privacy policy URL

SECTION 13 — ANTI-FABRICATION RULES

RULE 1: No paid_placement / ad / kickback. Rejects response.

RULE 2: electrician_license_number MUST be real, current, and verifiable
        through the issuing state electricity board. Mock / expired / borrowed
        licenses = immediate suspension. Customer safety / fire liability.

RULE 3: authorised_charger_brands and authorised_vehicle_oems require uploaded
        current-year authorisation letters. False claims = suspension + brand
        relationship review.

RULE 4: OCPP compliance version (1.6J / 2.0.1) must match charger firmware.
        TOMO field-tests via OCPP probe on commissioning. Mismatch = warranty
        risk + suspension trigger.

RULE 5: warranty.installation_warranty_months must be honoured. Declining a
        warranty callback within window = suspension after 2 incidents.

RULE 6: ratings.post_install_fault_rate_pct_last_90d computed from real
        callback events. TOMO maintains its own callback ledger from CPC
        re-booking events flagged as warranty.

RULE 7: site_findings.condition and line_item.necessity must be honest.
        Marking optional upgrades as mandatory_for_safety = suspension.
        TOMO samples user-uploaded site photos vs partner's findings.

RULE 8: subsidy_applicable.eligible claims must match actual state scheme.
        Promising subsidy that user can't claim = customer harm = suspension.

RULE 9: AI-generated install / survey photos forbidden. Real on-site
        photography only. TOMO reverse-image-search-audits.

RULE 10: charger_catalog.kw_rating, warranty_months, ip_rating must MATCH
         manufacturer spec sheets. Inflated specs = brand relationship breach
         + suspension.

RULE 11: No "Top Pick" / "TOMO Recommended" badges. Source-blind TTBS only.

RULE 12: Partners using unlicensed labour for the install (even if the
         contracted lead is licensed) = immediate suspension. License number
         in CPC payload (`install_team_license_numbers`) is required.

VERSION HISTORY

v1.0.0 — 2026-05-12 — Initial spec. NET commission base. Safety-dominant
                       (0.40) — mis-install causes electrical fires + voids
                       EV warranty. Subsidy + license verification first-class.