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:
- Standalone — full card with verification kind, expected duration, partner trust badges.
- 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)