Intent Spec — finance.book_financial_advisor_session
FULL ID: finance.book_financial_advisor_session
VERSION: v1.0.0
STATUS: draft
LAST UPDATED: 2026-05-14
DOMAIN: finance
PRIMARY AGENT: FinanceAgent
TTBS WEIGHTS: time=0.15 taste=0.20 budget=0.20 safety=0.45
User books a paid one-on-one session with a SEBI-registered Investment Adviser (RIA) or a SEBI-registered Research Analyst (RA) for comprehensive financial planning: goal setting, asset allocation, portfolio review, retirement planning, child-education planning, debt-payoff strategy, NRI repatriation, family-office introductions, and second-opinion reviews. Pure advisory only — no product-distribution overlap. Distinct from tax-only consultations (CA), insurance-only consultations (POSP), and from will / estate planning. Partner exemplars: ScripBox Advisory, INDmoney Wealth, Kuvera Premium, FundsIndia Advisory, independent SEBI RIAs aggregated through marketplaces.
SECTION 1 — INTENT IDENTITY
User wants paid wealth-advisory time with a SEBI-licensed adviser. Distinct from:
finance.book_tax_consultation— narrow tax-only (CA / CMA / advocate)finance.invest_in_mutual_fund— transactional, not advisoryfinance.create_will_or_estate_plan— succession & estatefinance.apply_personal_loan/apply_home_loan— transactional credit- Tied-agent / distributor "free advice" — explicitly out of scope; ingest rejects RIAs that are also AMFI distributors for the same client (regulatory conflict)
The professional MUST hold a valid, current SEBI Investment Adviser (IA) registration (Individual or NR-IA) OR be an authorised employee of a SEBI-registered RIA entity. Research Analysts (RAs) may be listed for security-specific second opinions but not for fund-allocation advice. Mutual-fund distributors (ARN holders) are NOT acceptable under this intent — they're commission-conflicted by structure.
Single intent per session. Subscription-style ongoing advisory (quarterly plan) routes to v1.1+ finance.subscribe_advisory_retainer.
SECTION 2 — NATURAL LANGUAGE COVERAGE
CLASSIFIES IN
- "Book a financial advisor"
- "I need a SEBI RIA, fee-only please"
- "Retirement planning session"
- "Portfolio review by a real advisor"
- "Goal-based planning for kids' education"
- "Second opinion on my mutual fund portfolio"
- "Financial planner near Hyderabad"
- "Independent financial advisor, not a sales person"
- "NRI repatriation advice consultation"
- "Help me plan a ₹5 cr corpus by 50"
CLASSIFIES OUT — BORDERLINE NO
- "Tax consultation" →
finance.book_tax_consultation - "Buy SIP" →
finance.invest_in_mutual_fund - "Make a will" →
finance.create_will_or_estate_plan - "Apply for home loan" →
finance.apply_home_loan - "Free advisor at my bank" — bank advisors are tied; route to
finance.book_financial_advisor_sessionAFTER warning of conflict - "Stock tip Telegram channel" — out of scope; routes to safety warning
MULTI-INTENT TRIGGERS
- "Financial advisor + term insurance review" →
finance.book_financial_advisor_session+finance.buy_term_insurance - "RIA session + tax filing" →
finance.book_financial_advisor_session+finance.book_tax_consultation - "Comprehensive plan + will" →
finance.book_financial_advisor_session+finance.create_will_or_estate_plan
SECTION 3 — INPUT (TOMO → PROVIDER)
{
"intent": "finance.book_financial_advisor_session",
"request_id": "req_01J9Z...",
"user_locale": "en-IN",
"user_currency": "INR",
"user_location": { "lat": 17.4475, "lng": 78.3563, "city": "Hyderabad", "pincode": "500032" },
"session_request": {
"topic": "retirement_planning", // STRICT ENUM §6
"additional_topics": ["asset_allocation"], // STRICT ENUM array §6
"user_age_band": "30_to_40", // STRICT ENUM §6
"user_persona": "salaried_individual", // STRICT ENUM §6
"estimated_net_worth_band_inr": "50L_to_1cr", // STRICT ENUM §6
"dependent_count": 2,
"risk_tolerance_self_rated": "moderate", // STRICT ENUM §6
"existing_investments_summary": [ // STRICT ENUM array §6 (asset class buckets)
"equity_mutual_fund", "ppf", "epf", "real_estate_self_use"
],
"advisor_kind_required": "RIA_only", // STRICT ENUM §6
"preferred_mode": "video", // STRICT ENUM §6
"preferred_language": "en", // STRICT ENUM §6
"preferred_slot_window": {
"start": "2026-06-03T09:00:00+05:30",
"end": "2026-06-08T20:00:00+05:30"
},
"preferred_duration_minutes": 60,
"no_conflict_disclosure_required": true
},
"ttbs_user_band": {
"time": "balanced",
"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 finance.book_financial_advisor_session |
session_request.topic |
enum | REQUIRED, STRICT ENUM §6 | Drives advisor specialty match |
session_request.user_age_band |
enum | REQUIRED, STRICT ENUM §6 | Coarse age (life-stage planning) |
session_request.user_persona |
enum | REQUIRED, STRICT ENUM §6 | |
session_request.estimated_net_worth_band_inr |
enum | REQUIRED, STRICT ENUM §6 | Anonymised; raw never shared until booking |
session_request.risk_tolerance_self_rated |
enum | REQUIRED, STRICT ENUM §6 | conservative / moderate / aggressive |
session_request.existing_investments_summary |
array |
REQUIRED, STRICT ENUM §6 | May NOT be empty (use [none_yet] if so) |
session_request.advisor_kind_required |
enum | REQUIRED, STRICT ENUM §6 | RIA_only / RA_only / either |
session_request.preferred_mode |
enum | REQUIRED, STRICT ENUM §6 | |
session_request.preferred_language |
enum | REQUIRED, STRICT ENUM §6 | |
session_request.no_conflict_disclosure_required |
bool | REQUIRED | When TRUE, only fee-only advisers (no distribution income) returned |
Anti-fabrication preamble: Provider may not list ARN-only distributors as advisers. SEBI IA registration must be live as of request time. TOMO does not surface raw net-worth — only band. Partner cannot quote higher fee in response to a higher net-worth band. No-conflict mode (no_conflict_disclosure_required=true) forces fee-only filter; any adviser earning trail commission on the recommended product is rejected.
SECTION 4 — PROVIDER TOOLS
Tool 1: search_advisors
PURPOSE: Up to 20 SEBI-registered advisers matching topic + persona + slot window + language + no-conflict rule
SLA: p50 ≤ 700ms, p95 ≤ 2000ms, p99 ≤ 4500ms
RATE LIMIT: 60 req/min
IDEMPOTENCY: request_id; 120s cache
RETRY: 1 on 429, 2 on 5xx
Tool 2: get_advisor_detail
PURPOSE: Full SEBI registration + practice profile + AUM advised + sample plan
SLA: p50 ≤ 500ms, p95 ≤ 1500ms
RATE LIMIT: 120 req/min
IDEMPOTENCY: advisor_id; 24h cache
RETRY: 1 on 5xx
Tool 3: hold_slot
PURPOSE: Lock a session slot for 15 minutes
SLA: p50 ≤ 700ms, p95 ≤ 2000ms
RATE LIMIT: 30 req/min
IDEMPOTENCY: request_id
RETRY: No retry
Tool 4: confirm_booking
PURPOSE: Convert hold → confirmed booking + generate meeting link + payment lock
SLA: p50 ≤ 1500ms, p95 ≤ 4000ms
RATE LIMIT: 30 req/min
IDEMPOTENCY: request_id
RETRY: No retry
Tool 5: submit_pre_session_questionnaire
PURPOSE: User completes risk profile + goal forms required by SEBI's IA Regulations
SLA: p50 ≤ 1500ms, p95 ≤ 5000ms
RATE LIMIT: 10 attempts / booking
IDEMPOTENCY: booking_id
RETRY: No retry on submit
Tool 6: cancel_booking
PURPOSE: Cancel + pro-rated refund
SLA: p50 ≤ 900ms, p95 ≤ 2500ms
RATE LIMIT: 30 req/min
IDEMPOTENCY: booking_id
RETRY: 1 on 5xx
SECTION 5 — RESPONSE SHAPE
Advisor
Advisor:
advisor_id: { type: string, constraint: REQUIRED, opaque }
full_name: { type: string, constraint: REQUIRED }
registration:
sebi_ia_registration_number: { type: string, constraint: REQUIRED, semantics: "Verifiable on sebi.gov.in IA list; empty allowed only when kind=RA_only" }
sebi_ra_registration_number: { type: string, constraint: REQUIRED, semantics: "Empty allowed when kind=RIA_only" }
registration_kind: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [RIA_individual, RIA_corporate_employee, RA_individual, RA_corporate_employee] }
registration_valid_until: { type: string, constraint: REQUIRED, ISO_DATE }
is_fee_only: { type: boolean, constraint: REQUIRED, semantics: "TRUE = adviser earns NO commission from any product distributor; required when no_conflict_disclosure_required=true" }
distribution_arn: { type: string, constraint: REQUIRED, semantics: "AMFI ARN; empty when is_fee_only=true" }
conflict_disclosures: { type: array<string>, constraint: REQUIRED, may be empty, semantics: "Plain-language disclosures per SEBI's IA Regulations Chapter III" }
practice_profile:
years_of_practice: { type: int, constraint: REQUIRED, ≥0 }
aum_advised_inr_crore: { type: int, constraint: REQUIRED, ≥0, semantics: "Total assets under advisory; not under management — distinction matters" }
client_count_active: { type: int, constraint: REQUIRED, ≥0 }
specialties: { type: array<enum>, constraint: REQUIRED, STRICT ENUM §6, may NOT be empty }
additional_certifications: { type: array<enum>, constraint: REQUIRED, STRICT ENUM §6, may be empty }
languages_spoken: { type: array<enum>, constraint: REQUIRED, STRICT ENUM §6, may NOT be empty }
modes_supported: { type: array<enum>, constraint: REQUIRED, STRICT ENUM §6 }
fee_inr:
base_session_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
per_extension_30min_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
gst_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
total_first_session_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
follow_up_session_inr: { type: int, constraint: REQUIRED, INR_INTEGER, semantics: "Discounted follow-up rate, may equal base_session_inr" }
rating:
average_score: { type: float, constraint: REQUIRED, 0.0-5.0 }
review_count: { type: int, constraint: REQUIRED, ≥0 }
completion_rate_pct: { type: float, constraint: REQUIRED, 0-100 }
city: { type: string, constraint: REQUIRED }
state: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
in_person_available: { type: boolean, constraint: REQUIRED }
in_person_address: { type: string, constraint: REQUIRED, semantics: "Empty when not available" }
available_slots:
type: array<object>
constraint: REQUIRED, may NOT be empty
shape:
slot_id: { type: string, constraint: REQUIRED }
starts_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
ends_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
mode: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
sample_plan_url: { type: string, constraint: REQUIRED, HTTPS URL, semantics: "Redacted sample financial plan PDF, illustrating depth" }
partner_reference:
source: { type: string, constraint: REQUIRED }
deeplink: { type: string, constraint: REQUIRED, HTTPS URL }
SlotHold
SlotHold:
hold_id: { type: string, constraint: REQUIRED }
advisor_id: { type: string, constraint: REQUIRED }
slot_id: { type: string, constraint: REQUIRED }
hold_expires_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
fee_locked_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
questionnaire_required: { type: boolean, constraint: REQUIRED, semantics: "TRUE per SEBI IA Regulations" }
questionnaire_url: { type: string, constraint: REQUIRED, HTTPS URL }
ConfirmedBooking
ConfirmedBooking:
booking_id: { type: string, constraint: REQUIRED }
advisor_id: { type: string, constraint: REQUIRED }
advisor_name: { type: string, constraint: REQUIRED }
starts_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
ends_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
mode: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
meeting_url: { type: string, constraint: REQUIRED, HTTPS URL, semantics: "Empty when in_person" }
in_person_address: { type: string, constraint: REQUIRED, semantics: "Empty when not in_person" }
fee_paid_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
invoice_url: { type: string, constraint: REQUIRED, HTTPS URL }
agreement_url: { type: string, constraint: REQUIRED, HTTPS URL, semantics: "SEBI-prescribed IA-client agreement, e-signed pre-session" }
rescheduling_policy:
free_reschedules_remaining: { type: int, constraint: REQUIRED, ≥0 }
cutoff_hours_before_session: { type: int, constraint: REQUIRED, ≥0 }
cancellation_policy:
full_refund_until: { type: string, constraint: REQUIRED, ISO_DATETIME }
partial_refund_until: { type: string, constraint: REQUIRED, ISO_DATETIME }
partial_refund_pct: { type: int, constraint: REQUIRED, 0-100 }
CancellationResult
CancellationResult:
booking_id: { type: string, constraint: REQUIRED }
cancelled_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
refund_amount_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
refund_method: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [original_payment, bank_transfer] }
refund_eta_days: { type: int, constraint: REQUIRED, 0-15 }
FORBIDDEN FIELDS
paid_placement_score,ad_bid,sponsored_rank,featured_advisor,commission_uplifteditor_pick,tomo_recommended,top_choicereferral_kickback,partner_revenue_sharesuccess_story_textwith named clients (initials only)guaranteed_returns_text(SEBI prohibits)fund_recommendation_in_listing— fund picks are an in-session deliverable, never in the listing cardai_generated_advisor_photo,fabricated_aum_inr,inflated_client_countcommission_padded_fee(fee must be true session fee, not gross of any kickback)
SECTION 6 — CONTROLLED VOCABULARIES
session_request.topic / specialties:
values:
retirement_planning: "Goal corpus + drawdown plan"
asset_allocation: "Equity / debt / gold / alts mix"
portfolio_review: "Second-opinion review of existing portfolio"
goal_based_planning: "Child education / home / vacation goals"
debt_payoff_strategy: "Loan-prepayment optimisation"
nri_planning: "NRI accounts, repatriation, DTAA"
risk_protection_review: "Insurance / cover adequacy"
estate_intro: "Intro to estate-planning needs (handoff to will spec)"
second_opinion_security: "Single-stock second opinion (RA only)"
family_office_intro: "Intro to family-office structures (HNI)"
session_request.user_age_band:
values: [under_25, 25_to_30, 30_to_40, 40_to_50, 50_to_60, 60_plus]
session_request.user_persona:
values: [salaried_individual, freelancer, business_owner, doctor_lawyer_professional, nri, senior_citizen, hni, first_time_investor]
session_request.estimated_net_worth_band_inr:
values:
under_10L, 10L_to_25L, 25L_to_50L, 50L_to_1cr, 1cr_to_2cr,
2cr_to_5cr, 5cr_to_25cr, above_25cr
resolution_order: "Partner sees ONLY band; raw never transmitted pre-booking."
session_request.risk_tolerance_self_rated:
values: [conservative, moderate, aggressive]
session_request.existing_investments_summary:
values:
none_yet, equity_direct, equity_mutual_fund, debt_mutual_fund,
hybrid_mutual_fund, ppf, epf, nps, sukanya, ssy, fixed_deposit,
recurring_deposit, gold_physical, sgb, gold_etf, real_estate_self_use,
real_estate_investment, reit, invit, foreign_equity, crypto, art_alt,
private_equity, structured_product
session_request.advisor_kind_required:
values:
RIA_only: "Investment Adviser only"
RA_only: "Research Analyst (security-specific) only"
either: "Either acceptable"
session_request.preferred_mode / modes_supported / ConfirmedBooking.mode:
values: [video, audio, in_person]
session_request.preferred_language / languages_spoken:
values: [en, hi, te, ta, kn, ml, mr, bn, gu, pa, or, as, ur]
Advisor.registration.registration_kind:
values:
RIA_individual: "Individual SEBI IA"
RIA_corporate_employee: "Employee of SEBI-registered IA entity"
RA_individual: "Individual SEBI RA"
RA_corporate_employee: "Employee of SEBI-registered RA entity"
Advisor.practice_profile.additional_certifications:
values: [CFP, CFA_charterholder, CWM, CIMA, FRM, none]
state:
values:
AP, AR, AS, BR, CG, GA, GJ, HR, HP, JH, KA, KL, MP, MH, MN, ML, MZ, NL, OD,
PB, RJ, SK, TN, TS, TR, UP, UK, WB,
AN, CH, DN, DD, DL, JK, LA, LD, PY
CancellationResult.refund_method:
values: [original_payment, bank_transfer]
SECTION 7 — TTBS DIMENSIONS
TIME (weight = 0.15):
signals_used:
- earliest available_slot vs preferred_slot_window.start
- modes_supported includes preferred_mode
weighting:
earliest_slot_fit: 0.70
mode_match: 0.30
user_band_handling:
fast: prefer next-48h
balanced: standard
flexible: 7-day window OK
TASTE (weight = 0.20):
signals_used:
- languages_spoken intersection with preferred_language
- specialties match with topic + additional_topics
- DNA repeat advisor
- additional_certifications (CFP / CFA signal expertise prestige)
weighting:
language: 0.25
specialty: 0.30
dna: 0.30
certs: 0.15
BUDGET (weight = 0.20):
signals_used:
- fee_inr.total_first_session_inr
- follow_up_session_inr (signals long-term economic viability)
weighting:
first_session: 0.70
follow_up: 0.30
user_band_handling:
ok: cheapest passing safety floor
good: balanced
great: senior CFP / CFA regardless of fee
SAFETY (weight = 0.45):
signals_used:
- registration.sebi_ia_registration_number verified live
- registration.registration_valid_until ≥ session date
- registration.is_fee_only (TRUE when no_conflict_disclosure_required=true is HARD filter)
- registration.conflict_disclosures completeness
- practice_profile.years_of_practice ≥3 floor
- rating.completion_rate_pct ≥95
- aum_advised_inr_crore ≥1 floor (signals real practice)
weighting:
registration_live: 0.35
fee_only_compliance: 0.20
years_practice: 0.15
completion_rate: 0.15
aum_floor: 0.15
user_band_handling:
fast: relax years floor to 1
balanced: floor 3
great: floor 8 + CFP or CFA mandatory
Locked weights: time 0.15 / taste 0.20 / budget 0.20 / safety 0.45. Advisory is information that compounds — bad advice over 30 years is uncapped harm. SEBI registration is non-negotiable; safety dominates.
SECTION 8 — COMPLETION CONTRACT
POST /api/v1/cpc/mcp_provider/<your_partner_id>
Body:
{
"intent": "finance.book_financial_advisor_session",
"external_id": "<booking_id>",
"request_id": "<request_id>",
"amount_inr": 600, // NET partner commission only (15-30% of advisor fee)
"gst_inr": 108,
"tips_inr": 0,
"pass_through_inr": 3000, // session fee remitted to advisor
"closed_at": "2026-06-05T18:30:00+05:30",
"status": "completed",
"topic": "retirement_planning",
"advisor_kind": "RIA_individual",
"is_fee_only": true,
"mode": "video",
"duration_minutes": 60
}
User pays full fee (e.g. ₹3,000); partner's NET commission (~₹600) is amount_inr. Advisor's earning is pass_through_inr. TOMO charges 10% × ₹600 = ₹60. HMAC-SHA256, 5-min replay window.
Follow-up sessions file separate completions with the same matter_id. No silent retainer auto-billing.
SECTION 9 — WIDGET
AdvisorListingWidget.
Field mapping:
- full_name + registration_kind pill (e.g. "SEBI RIA")
- is_fee_only → green "Fee-only" badge when TRUE
- years_of_practice + aum_advised_inr_crore → "12 yrs · ₹85 cr advised"
- specialties → chip row
- rating.average_score + review_count → star pill
- fee_inr.total_first_session_inr → big price
- earliest available_slot → "Next: Wed 4 PM"
- languages_spoken intersection → language chip
- additional_certifications (CFP / CFA) → cert pill
SECTION 10 — CACHING POLICY
| Call | TTL | Rationale |
|---|---|---|
| search_advisors | 120s | Calendar volatile |
| get_advisor_detail | 24h | Stable |
| hold_slot | NO CACHE | Idempotent |
| confirm_booking | NO CACHE | Idempotent |
| submit_pre_session_questionnaire | NO CACHE | — |
| cancel_booking | NO CACHE | — |
| SEBI registration verification | 7d | SEBI updates weekly |
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 | HMAC fail | No |
NO_ADVISOR_MATCH |
200 (empty) | No advisor fits filters | n/a |
SLOT_TAKEN |
409 | Hold race-lost | UI re-queries |
HOLD_EXPIRED |
410 | Hold elapsed | UI re-holds |
SEBI_REG_EXPIRED |
422 | Adviser registration lapsed | No (advisor suspended) |
CONFLICT_FLAGGED |
422 | Adviser has distribution income for recommended products + no_conflict required | No |
PAYMENT_FAILED |
402 | Gateway declined | No |
QUESTIONNAIRE_INCOMPLETE |
422 | SEBI risk-profile incomplete | No (UI completes) |
AGREEMENT_NOT_ESIGNED |
422 | IA-client agreement not signed | No |
CANCELLED_TOO_LATE |
410 | Past partial_refund cutoff | No |
MODE_UNSUPPORTED |
422 | Mode not supported | No |
LANGUAGE_MISMATCH |
422 | No language overlap | No |
SECTION 12 — SANDBOX → PRODUCTION CHECKLIST
[ ] All six tools implemented
[ ] At least 30 advisers in catalog
[ ] Every sebi_ia_registration_number verifiable on sebi.gov.in IA list (live)
[ ] Every sebi_ra_registration_number verifiable on sebi.gov.in RA list (live)
[ ] is_fee_only flag tested against partner records (sample audit)
[ ] No AMFI ARN holder marketed as RIA without explicit conflict disclosure
[ ] conflict_disclosures match SEBI's Chapter III IA Regulations format
[ ] SEBI-prescribed IA-client agreement available as agreement_url and tested e-signed flow
[ ] SEBI-prescribed risk profile questionnaire available and completion gated pre-session
[ ] Net-worth band only exposed pre-booking; raw never transmitted before confirmation
[ ] AUM advised verifiable (partner's SEBI compliance officer attests)
[ ] Cancellation refund tested end-to-end
[ ] HMAC signing verified on test CPC webhook
[ ] amount_inr in CPC is COMMISSION (NET), pass_through_inr is advisor fee
[ ] All controlled vocabularies respected
[ ] No forbidden fields anywhere
[ ] SLA p95 met (100-call sandbox run)
[ ] Privacy policy + grievance officer contact uploaded
[ ] Customer support: dedicated advisory helpline + email
[ ] Adviser onboarding pipeline reviewed (TOMO admin spot-checks 5 random profiles)
[ ] Session-recording consent flow tested; recordings encrypted at rest, deleted on user request
SECTION 13 — ANTI-FABRICATION RULES
RULE 1: SEBI IA / RA registration must be live and verifiable on SEBI's
public register at the time of session start, not at signup.
Expired or suspended registrations = ingest rejection + partner suspension.
RULE 2: When user requests no_conflict_disclosure_required=true, ONLY
adviser records with is_fee_only=true and no AMFI ARN at all are
returned. Partial fee-only ("we charge advisory + trail of mutual
funds") is NOT fee-only and must be filtered out.
RULE 3: aum_advised_inr_crore must be assets under advisory (advised but
executed by client at distribution platform of their choice), NOT
assets under management. Distinction is critical — RIA cannot have
AUM in same regulated relationship. Partner inflating with AUM =
suspension.
RULE 4: years_of_practice = years since SEBI IA registration granted, NOT
years of "experience in finance" pre-registration. Pre-registration
years can be in additional_certifications descriptive only.
RULE 5: No paid_placement, ad_bid, sponsored_rank, featured_advisor.
RULE 6: rating.average_score must be unrounded over past 12 months of
completed paid sessions; shadow score from CPC ledger audited.
RULE 7: review_count from completed paid sessions only.
RULE 8: No success-story testimonials with named clients. Initials only.
Specific return claims ("my advisor got me 18% CAGR") forbidden —
SEBI prohibits regulated advice from being marketed via past returns.
RULE 9: No guaranteed_returns_text anywhere in profile, sample plan, or
listing card. SEBI prohibits. TOMO ingest scans for the words
"guaranteed return / assured return / definite return" + variants.
RULE 10: AI-generated advisor headshots forbidden. Government-ID verified
real photo only.
RULE 11: Fund / stock / specific-product names cannot appear in listing
cards. Recommendations are in-session deliverables, never in the
marketing surface. TOMO ingest scans for known ISIN-pattern,
ticker-pattern, AMC-pattern text in card fields.
RULE 12: amount_inr in CPC webhook is partner COMMISSION only.
pass_through_inr is advisor's fee. Partner inflating commission
base = suspension + RBI / SEBI auditable accounting review.
RULE 13: SEBI-prescribed IA-client agreement MUST be e-signed before session
starts. No "click-wrap acceptance"; SEBI requires actual e-sign
with audit trail. Partner skipping this = regulatory breach and
partner suspension.
RULE 14: Risk-profile questionnaire mandated by SEBI IA Regulations MUST be
completed before any recommendation in-session. Partners enabling
skip = regulatory breach + suspension.
RULE 15: Session recordings, transcripts, and plan documents belong to the
user. Partner may not use for training models, marketing, or
resale without per-session opt-in consent (not signup click-wrap).
RULE 16: Information-completeness score (hidden rank factor weight 0.10)
rewards full §5 shape. Partial responses rank lower.
RULE 17: Adviser cannot be a "free advisor" listing that funnels users into
distribution at the partner-side. Listing here = paid advisory
only. Free-consultation funnel listings = ingest rejection.
VERSION HISTORY
v1.0.0 — 2026-05-14 — Initial spec. SEBI RIA / RA only; AMFI distributors
rejected. No-conflict mode forces fee-only filter.
SEBI-prescribed IA-client agreement + risk-profile
questionnaire mandatory pre-session. Safety-dominant
TTBS (0.45). Net-commission base in §8.
Net-worth bands only pre-booking; raw gated.