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.0compliance.verify_rc_dl

compliance.verify_rc_dl — Full Intent Specification

INTENT NAMESPACE: compliance
INTENT NAME:      verify_rc_dl
FULL ID:          compliance.verify_rc_dl
VERSION:          v1.0.0
STATUS:           live
TTBS WEIGHTS:     time 0.30 · taste 0.05 · budget 0.20 · safety 0.45
LAST UPDATED:     2026-05-10

Cross-cutting utility intent. Verifies Vehicle Registration Certificate (RC) + Driving License (DL) against authoritative RTO + Sarathi databases. Used inside mobility intents (driver onboarding, self-drive rental), marketplace intents (used vehicle sale), and finance (motor insurance underwriting). Covers ALL motor vehicle classes — 2W, 4W, commercial, heavy.


1. NATURAL LANGUAGE COVERAGE

Classifies IN

  • "verify RC for this car"
  • "check DL validity"
  • "RC verification for buying used Thar"
  • "is this driving license valid"
  • "VAHAN check for vehicle"
  • "RC + DL verification for fleet onboarding"

Classifies OUT

  • "verify Aadhaar / PAN" → compliance.verify_kyc
  • "what's my RC due renewal" → utility lookup
  • "buy car insurance" → finance.buy_motor_insurance

MULTI-INTENT TRIGGERS

  • marketplace.buy_used_car → injected at handshake step (verify seller's RC matches advertised vehicle)
  • mobility.book_self_drive → injected at first-time renter (verify renter's DL)
  • driver onboarding (Tier 2 supplier) → injected at signup
  • fleet onboarding → injected per-vehicle for entire fleet

2. INPUT — TOMO → PROVIDER

{
  "intent":          "compliance.verify_rc_dl",
  "intent_version":  "v1.0.0",
  "request_id":      "req_rcdl_8f4k_2026-05-10T08:14:00Z",
  "user_session_id": "anon_user_token_or_uid",

  "verification_kind":   "rc_and_dl",
  "verification_purpose": "self_drive_rental_first_time",

  "rc": {
    "vehicle_number_masked": "TS•• 1234",
    "expected_chassis_last_5": "X1234",
    "expected_engine_last_5":  "Y5678",
    "verification_method":     "vahan_api",
    "include_owner_history":   true,
    "include_loan_status":     true,
    "include_blacklist_check": true
  },

  "dl": {
    "dl_number_masked":      "TS•• 1234",
    "dl_holder_name_redacted": "REDACTED",
    "verification_method":    "sarathi_api",
    "include_endorsement_check": true,
    "include_violations_history": true
  },

  "is_runtime_injected":   true,
  "injected_from_intent":  "mobility.book_self_drive",
  "injected_request_id":   "req_sd_8f4k_...",

  "context": {
    "user_locale":          "en-IN",
    "user_currency_pref":   "INR",
    "trust_signals": {
      "is_repeat_verification":    false,
      "prior_with_partner":        0,
      "user_account_age_days":     312
    }
  }
}
Field Type Constraint Notes
verification_kind enum REQUIRED, STRICT rc_only | dl_only | rc_and_dl
verification_purpose enum REQUIRED, see §6
rc.vehicle_number_masked string REQUIRED last-4 only
rc.expected_chassis_last_5 string REQUIRED last-5 of chassis number for cross-check
rc.expected_engine_last_5 string REQUIRED last-5 of engine number
rc.verification_method enum REQUIRED, see §6
rc.include_owner_history bool REQUIRED drives ownership-trail check
rc.include_loan_status bool REQUIRED drives hypothecation check
rc.include_blacklist_check bool REQUIRED drives stolen / FIR check
dl.dl_number_masked string REQUIRED last-4 only
dl.dl_holder_name_redacted string REQUIRED always REDACTED
dl.verification_method enum REQUIRED, see §6
dl.include_endorsement_check bool REQUIRED check vehicle classes endorsed
dl.include_violations_history bool REQUIRED challan history

Anti-fabrication preamble: no paid placement, no commission-based partner ordering, TOMO never holds raw RC/DL data.


3. PROVIDER TOOLS

Tool 1: verify_rc

PURPOSE:        verify Vehicle Registration Certificate against VAHAN
INPUT:          { vehicle_number, chassis_last_5, engine_last_5, include_owner_history, include_loan_status, include_blacklist_check, request_id, user_session_id }
OUTPUT:         RcVerificationResult (§5)
SLA:            p95 < 2000ms (VAHAN can be slow)
RATE LIMIT:     ≤ 1/sec per (user, partner)
IDEMPOTENCY:    not required (read-only)

Tool 2: verify_dl

PURPOSE:        verify Driving License against Sarathi
INPUT:          { dl_number, holder_name, dob, include_endorsement_check, include_violations_history, request_id }
OUTPUT:         DlVerificationResult (§5)
SLA:            p95 < 2000ms
RATE LIMIT:     ≤ 1/sec per (user, partner)

Tool 3: verify_rc_dl_combined

PURPOSE:        single call for both RC + DL when both required
INPUT:          { rc, dl, ... }
OUTPUT:         { rc_result, dl_result, combined_status, eligibility_flags }
SLA:            p95 < 3500ms
USE:            mobility intents call this for efficiency

Tool 4: get_verification_history

PURPOSE:        return prior verification results for same RC/DL within retention window
INPUT:          { rc_or_dl_number, request_id }
OUTPUT:         array<HistoricalResult>
SLA:            p95 < 800ms
USE:            avoid redundant calls within partner's retention period

All four REQUIRED.


4. RESPONSE SHAPE

RcVerificationResult (returned by verify_rc)

verification_id:                  string, REQUIRED
verified_at_iso:                  ISO_DATETIME, REQUIRED
verification_validity_until_iso:  ISO_DATE, REQUIRED              # how long this verification is valid

vehicle_basics:
  vehicle_number_masked:          string, REQUIRED                # last-4
  vehicle_class:                  STRICT ENUM, REQUIRED           # see §6
  vehicle_kind:                   STRICT ENUM, REQUIRED           # 2_wheeler | 4_wheeler | etc.
  fuel_kind:                      STRICT ENUM, REQUIRED           # see §6
  emission_norm:                  STRICT ENUM, REQUIRED           # see §6
  registration_state:             string, REQUIRED                # state code
  registration_authority:         string, REQUIRED                # RTO office name
  registration_iso:               ISO_DATE, REQUIRED
  vehicle_color:                  string, REQUIRED
  seating_capacity:               int, REQUIRED
  unladen_weight_kg:              int, REQUIRED
  manufacturer:                   string, REQUIRED
  model:                          string, REQUIRED
  manufacturing_year:             int, REQUIRED

verification_status:
  rc_valid:                       boolean, REQUIRED
  rc_valid_until_iso:             ISO_DATE, REQUIRED              # registration validity
  fitness_certificate_valid:      boolean, REQUIRED
  fitness_valid_until_iso:        ISO_DATE, REQUIRED
  insurance_valid:                boolean, REQUIRED
  insurance_valid_until_iso:      ISO_DATE, REQUIRED
  insurance_provider:             string, REQUIRED                # "" if absent
  insurance_kind:                 STRICT ENUM, REQUIRED           # see §6
  puc_valid:                      boolean, REQUIRED
  puc_valid_until_iso:            ISO_DATE, REQUIRED
  permit_valid:                   boolean, REQUIRED
  permit_kind:                    STRICT ENUM, REQUIRED           # see §6
  road_tax_paid:                  boolean, REQUIRED
  road_tax_valid_until_iso:       ISO_DATE, REQUIRED

cross_check:
  chassis_match:                  STRICT ENUM, REQUIRED           # match | partial | mismatch | not_checked
  engine_match:                   STRICT ENUM, REQUIRED           # match | partial | mismatch | not_checked

owner:
  current_owner_name_redacted:    string, REQUIRED                # always REDACTED
  total_owner_count:              int, REQUIRED                   # 1, 2, 3+
  ownership_age_years:            int, REQUIRED
  is_individual_owner:            boolean, REQUIRED
  is_company_owner:               boolean, REQUIRED
  owner_history_available:        boolean, REQUIRED
  owner_history:                  array, REQUIRED, may be empty
    - owner_index:                int, REQUIRED                    # 1=first, 2=second, etc.
      transfer_iso:               ISO_DATE, REQUIRED
      ownership_duration_years:   int, REQUIRED

loan_status:
  hypothecated:                   boolean, REQUIRED
  hypothecation_to_bank:          string, REQUIRED                # "" if not hypothecated
  hypothecation_iso:              ISO_DATE, REQUIRED              # epoch sentinel if not
  loan_clearable:                 boolean, REQUIRED               # can be cleared with NOC

blacklist_check:
  is_stolen:                      boolean, REQUIRED
  is_blacklisted:                 boolean, REQUIRED
  fir_history:                    array, REQUIRED, may be empty
    - fir_number:                 string, REQUIRED
      fir_state:                  string, REQUIRED
      fir_kind:                   STRICT ENUM, REQUIRED            # accident | theft | violation | other
      fir_iso:                    ISO_DATE, REQUIRED
      fir_status:                 STRICT ENUM, REQUIRED            # open | resolved | dismissed

risk_flags:
  total_challans_pending:         int, REQUIRED, ≥0
  total_challans_pending_inr:     INR_INTEGER, REQUIRED            # outstanding fines
  recent_accident_history:        boolean, REQUIRED                # within 12 months
  recent_accident_count:          int, REQUIRED, ≥0
  vehicle_age_concern:            boolean, REQUIRED                # >15 years for 2W or >20 for 4W
  flagged_by_partner:             boolean, REQUIRED                # partner-side risk model
  flagged_reason:                 STRICT ENUM, REQUIRED            # see §6 ("none" if not flagged)

trust:
  partner_authorized_by_rto:      boolean, REQUIRED                # RTO partnership status
  partner_vahan_api_authorized:   boolean, REQUIRED
  partner_iso_27001_certified:    boolean, REQUIRED

audit_trail:
  data_minimized:                 boolean, REQUIRED                # MUST be true
  data_collected:                 array<STRICT ENUM>, REQUIRED
  retention_days:                 int, REQUIRED
  retention_purpose:              string, REQUIRED

DlVerificationResult (returned by verify_dl)

verification_id:                  string, REQUIRED
verified_at_iso:                  ISO_DATETIME, REQUIRED
verification_validity_until_iso:  ISO_DATE, REQUIRED

dl_basics:
  dl_number_masked:               string, REQUIRED                # last-4
  issuing_authority:              string, REQUIRED                # RTO office
  issuing_state:                  string, REQUIRED
  date_of_issue:                  ISO_DATE, REQUIRED
  date_of_expiry:                 ISO_DATE, REQUIRED
  is_currently_valid:             boolean, REQUIRED
  holder_age:                     int, REQUIRED                   # current age
  holder_dob_match:               STRICT ENUM, REQUIRED           # match | mismatch | pending

endorsements:
  vehicle_classes_endorsed:       array<enum>, REQUIRED, ≥1       # see §6
  commercial_endorsement:         boolean, REQUIRED
  commercial_endorsement_iso:     ISO_DATE, REQUIRED              # epoch sentinel if not endorsed
  inter_state_endorsement:        boolean, REQUIRED               # crucial for intercity rides
  hazmat_endorsement:             boolean, REQUIRED               # for goods carriers
  passenger_carrier_endorsement:  boolean, REQUIRED

violations_history:
  total_challans_lifetime:        int, REQUIRED, ≥0
  total_challans_pending:         int, REQUIRED, ≥0
  total_challans_pending_inr:     INR_INTEGER, REQUIRED
  recent_violations_30day:        int, REQUIRED, ≥0
  recent_violations_kinds:        array<enum>, REQUIRED, may be empty   # see §6
  license_suspended_history:      boolean, REQUIRED
  current_suspension:             boolean, REQUIRED
  suspension_until_iso:           ISO_DATE, REQUIRED              # epoch sentinel if not suspended
  drug_alcohol_violations:        int, REQUIRED, ≥0

risk_flags:
  flagged_by_partner:             boolean, REQUIRED
  flagged_reason:                 STRICT ENUM, REQUIRED           # see §6
  unusual_endorsement_pattern:    boolean, REQUIRED
  multiple_recent_renewals:       boolean, REQUIRED               # may indicate fraud

trust:
  partner_authorized_by_rto:      boolean, REQUIRED
  partner_sarathi_api_authorized: boolean, REQUIRED
  partner_iso_27001_certified:    boolean, REQUIRED

audit_trail:
  data_minimized:                 boolean, REQUIRED                # MUST be true
  data_collected:                 array<STRICT ENUM>, REQUIRED
  retention_days:                 int, REQUIRED
  retention_purpose:              string, REQUIRED

verify_rc_dl_combined output

rc_result:                        RcVerificationResult, REQUIRED
dl_result:                        DlVerificationResult, REQUIRED

combined_eligibility:
  eligible_for_self_drive:        boolean, REQUIRED               # RC valid + DL endorsed for that class
  eligible_for_commercial_use:    boolean, REQUIRED               # commercial endorsement + permit
  eligible_for_intercity:         boolean, REQUIRED               # inter-state endorsement
  eligible_for_passenger_carry:   boolean, REQUIRED               # passenger endorsement
  eligibility_concerns:           array<STRICT ENUM>, REQUIRED, may be empty   # see §6

combined_risk_score:              int, REQUIRED, 0-100             # higher = more risky

_provider:
  name:                           string, REQUIRED
  tomo_partner_id:                string, REQUIRED
  partner_tier:                   STRICT ENUM, REQUIRED
  customer_support_phone:         string, REQUIRED
  customer_support_24x7:          boolean, REQUIRED

Forbidden fields

paid_placement_score | sponsored_rank | promotion_priority |
ad_bid | hidden_verification_fee |
raw_owner_full_name | raw_dl_holder_full_name |
scanned_rc_url | scanned_dl_url |
unmasked_chassis_number | unmasked_engine_number

5. CONTROLLED VOCABULARIES

verification_kind

rc_only | dl_only | rc_and_dl

verification_purpose

self_drive_rental_first_time | driver_onboarding | fleet_onboarding |
used_vehicle_purchase | used_vehicle_sale | motor_insurance_underwriting |
freight_carrier_onboarding | tenant_vehicle_check | employment_verification |
generic_verification

rc.verification_method / dl.verification_method

vahan_api | sarathi_api | partner_authorized_aggregator |
manual_field_visit | hybrid_api_plus_manual_review

vehicle_basics.vehicle_class

LMV | MCWG | MC | TR | LMV-TR | HGV | HPV | RMV | TR_HZP | RMV_3W

vehicle_basics.vehicle_kind

2_wheeler | 3_wheeler | 4_wheeler | commercial_passenger | commercial_goods | heavy

vehicle_basics.fuel_kind

petrol | diesel | cng | lpg | ev_full | hybrid | bs6_petrol | bs6_diesel

vehicle_basics.emission_norm

bs3 | bs4 | bs6 | ev | unknown_legacy

verification_status.insurance_kind

none | third_party | comprehensive | zero_dep_comprehensive

verification_status.permit_kind

none | private | contract_carriage | tourist | aggregator_permit | stage_carriage |
goods_carriage | passenger_carriage

cross_check.chassis_match / cross_check.engine_match

match | partial | mismatch | not_checked

blacklist_check.fir_history[].fir_kind

accident | theft | violation | other

blacklist_check.fir_history[].fir_status

open | resolved | dismissed

risk_flags.flagged_reason (RC)

none | recent_accident_cluster | high_challan_count | hypothecation_unusual |
multiple_owner_changes_recent | recent_blacklisting | flagged_in_partner_db

risk_flags.flagged_reason (DL)

none | suspension_history | recent_violations_cluster | drug_alcohol_violation |
unusual_endorsement_pattern | multiple_recent_renewals | flagged_in_partner_db

endorsements.vehicle_classes_endorsed[]

Same as vehicle_basics.vehicle_class enum.

violations_history.recent_violations_kinds[]

overspeeding | signal_jump | wrong_side | drunk_driving |
no_helmet | no_seatbelt | mobile_use | dangerous_driving |
parking_violation | document_violation | overloading

combined_eligibility.eligibility_concerns[]

none | rc_expired | dl_expired | dl_class_mismatch_for_rc |
no_commercial_endorsement | no_inter_state_endorsement |
hypothecation_active | recent_accident | recent_suspension |
drug_alcohol_history | high_pending_challans |
fir_open | vehicle_blacklisted | vehicle_too_old

audit_trail.data_collected[] (RC)

vehicle_number | chassis | engine | owner_history | loan_status |
blacklist_status | fir_history | challan_history | insurance_status |
permit_status | fitness_status | puc_status

audit_trail.data_collected[] (DL)

dl_number | holder_name | dob | issuing_authority | endorsements |
violations_history | suspension_history | photo

6. TTBS DIMENSIONS

Per-domain weights (locked)

compliance: { time: 0.30, taste: 0.05, budget: 0.20, safety: 0.45 }

TIME

SIGNALS USED:
  - SLA p95 latency (lower = better)                    weight 0.40
  - VAHAN API uptime (partner historical)               weight 0.20
  - Sarathi API uptime (partner historical)             weight 0.20
  - combined call vs separate calls (combined preferred) weight 0.20

TASTE

SIGNALS USED:
  - in_app_chat_supported                               weight 0.50
  - vernacular language support                         weight 0.50

BUDGET

SIGNALS USED:
  - fees.fee_inr (lower = better)                       weight 0.60
  - fees.fee_charged_to == user (penalty)               weight 0.40

HARD FILTERS:
  - fees.fee_charged_to == tomo → drop

SAFETY (dominant)

SIGNALS USED:
  - trust.partner_vahan_api_authorized=true             HARD FILTER (RC)
  - trust.partner_sarathi_api_authorized=true           HARD FILTER (DL)
  - trust.partner_iso_27001_certified                   HARD FILTER
  - audit_trail.data_minimized=true                     HARD FILTER
  - data_sharing_with_third_parties=false               HARD FILTER
  - partner historical data accuracy (1% audit)          weight 0.40
  - retention_days reasonable (per regulator)            weight 0.30
  - failure recovery flow well-defined                   weight 0.30

Hidden ranking factor

information_completeness_score weight 0.10. historical_verification_accuracy weight 0.20 — partners flagged for false-positive verifications get penalized.


7. COMPLETION CONTRACT

POST /api/v1/cpc/mcp_provider/{tomo_partner_id}
X-TOMO-Timestamp: <ms>
X-TOMO-Signature: sha256=<hex>

{
  "intent":            "compliance.verify_rc_dl",
  "intent_version":    "v1.0.0",
  "external_id":       "SUREPASS-VR-XYZ",
  "amount_inr":         15,
  "closed_at":         "2026-05-10T08:21:00+05:30",
  "request_id":        "req_rcdl_8f4k_...",
  "status":            "verified_eligible",
  "currency":          "INR",
  "verification_id":   "SUREPASS-VR-XYZ",
  "verification_kind": "rc_and_dl",
  "verification_purpose": "self_drive_rental_first_time",
  "rc_valid":           true,
  "dl_valid":           true,
  "eligible_for_self_drive": true,
  "combined_risk_score":  18,
  "fees_charged_inr":   15,
  "validity_until_iso": "2026-08-10",
  "injected_from_intent": "mobility.book_self_drive",
  "injected_request_id":  "req_sd_8f4k_...",
  "notes":             ""
}

Status enum: verified_eligible | verified_ineligible | rc_failed | dl_failed | both_failed | api_unavailable | cancelled_by_user

amount_inr is typically the verification fee (₹5-50 typical). Most often charged to the parent intent's partner (rental operator pays for renter verification), occasionally to user (proactive standalone verification).


8. WIDGET

WIDGET TYPE:        rc_dl_verification_card
SOURCE:             src/widgets/types.ts
TYPE NAME:          RcDlVerificationPayload
RENDERED IN:        components/widgets/RcDlVerificationWidget.tsx

Two render contexts:

  1. Standalone — full card with verification kind, expected duration, partner trust badges.
  2. Runtime-injected — slim banner inside parent intent's confirmation widget. "Verify your driving license + RC to proceed (estimated 1 min)" with inline CTA. Completion returns user to parent flow.

9. CACHING POLICY

Call TTL Rationale
verify_rc 0s Always fresh — but partners can return cached result via get_verification_history if within retention window
verify_dl 0s same
verify_rc_dl_combined 0s
get_verification_history 60s metadata about prior results

Per regulator: verification result is valid for 90 days (RC) / 365 days (DL) typically. Inside that window, get_verification_history can return the prior result without re-hitting VAHAN/Sarathi. Partners must NOT charge for this re-use within retention window.


10. ERROR CODES

Code HTTP Meaning TOMO behavior
INVALID_REQUEST 400 Malformed surface
RC_NOT_FOUND 404 vehicle_number not in VAHAN surface
DL_NOT_FOUND 404 dl_number not in Sarathi surface
CHASSIS_MISMATCH 422 provided chassis_last_5 doesn't match VAHAN surface, no eligibility
ENGINE_MISMATCH 422 provided engine_last_5 doesn't match surface
VAHAN_DOWNTIME 503 VAHAN API down back off, retry
SARATHI_DOWNTIME 503 Sarathi down back off, retry
STATE_API_UNAVAILABLE 503 particular state RTO API down suggest manual fallback
INVALID_AUTH 401 partner credentials partner re-auth
RATE_LIMITED 429 partner-side throttle back off
INTERNAL_ERROR 500 partner-side failure drop partner

11. SANDBOX → PRODUCTION CHECKLIST

[ ] All §2 inputs validated, request_id echoed
[ ] verify_rc returns valid result for known sandbox vehicle numbers
[ ] verify_dl returns valid result for known sandbox DL numbers
[ ] verify_rc_dl_combined returns combined eligibility correctly
[ ] get_verification_history returns prior results within retention
[ ] All §4 required fields populated with REAL data
[ ] No forbidden fields anywhere
[ ] CPC webhook arrives within 60s of verification
[ ] HMAC verification passes
[ ] VAHAN API authorization certificate uploaded (RTO partnership)
[ ] Sarathi API authorization certificate uploaded
[ ] ISO 27001 certificate
[ ] DPDP 2023 compliance attestation
[ ] Privacy policy URL live + DPDP compliant
[ ] Data retention period documented (90 day typical for RC, 365 day for DL)
[ ] User consent flow tested (DPDP requirement)
[ ] Failure recovery flow tested (VAHAN downtime simulation)
[ ] customer_support 24x7 reachable
[ ] No commission-based partner ordering (1% audit cross-check)

12. ANTI-FABRICATION RULES

RULE 1 — No paid placement signals
RULE 2 — No raw RC/DL data in any TOMO-bound response
  No unmasked chassis/engine numbers, no scanned RC/DL image URLs,
  no full owner names. Detection = response rejected + DPDP violation flag.
RULE 3 — VAHAN/Sarathi authorization mandatory
  trust.partner_vahan_api_authorized=true requires RTO partnership document
  on demand within 24h. False claims = listing rejection.
RULE 4 — Verification result must be authoritative
  Partner must derive results from VAHAN/Sarathi authoritative sources.
  Cached results > retention window = breach.
RULE 5 — No re-charging within retention window
  If user already verified within 90 days (RC) / 365 days (DL), partner
  must return prior result via get_verification_history without charging
  again. Re-charging = breach.
RULE 6 — Eligibility flags must be deterministic
  combined_eligibility booleans must be deterministically derivable from
  underlying data. Inflating eligibility to drive parent-intent conversion
  = breach.
RULE 7 — User consent auditable
  audit_trail.consent_iso must be honest. No retro-grant.
RULE 8 — Right-to-erasure
  User can request deletion of verification result. Partner must comply
  per DPDP within stated retention SLA. Failure = breach.
RULE 9 — Customer support honest
  customer_support_24x7=true means human within 5 min. Field-tested.
RULE 10 — TOMO never holds raw RC/DL data
  All raw data flows user → partner directly. TOMO orchestrates only.

VERSION HISTORY

v1.0.0 — 2026-05-10 — Initial spec (Block F.3)