Intent Spec — entertainment.subscribe_streaming
FULL ID: entertainment.subscribe_streaming
VERSION: v1.0.0
STATUS: draft
LAST UPDATED: 2026-05-12
DOMAIN: entertainment
PRIMARY AGENT: EntertainmentAgent
TTBS WEIGHTS: time=0.10 taste=0.50 budget=0.30 safety=0.10
User subscribes to a streaming platform (or bundles thereof) — Netflix, Prime Video, Hotstar, JioCinema, SonyLIV, ZEE5, Apple TV+, regional OTTs (Aha, Sun NXT). Includes new subscriptions, upgrades/downgrades, and bundle deals (Jio Bundle, VI Movies & TV, Airtel Xstream). Distinct from live-event ticketing intents — this is recurring-access subscription.
Partner exemplars: OTT platforms directly (Netflix India billing, Hotstar) + telco bundle providers (Jio Saavn Pro, VI Movies & TV, Airtel Xstream Premium) + aggregators (OTTplay).
SECTION 1 — INTENT IDENTITY
User wants to subscribe to, upgrade, or change a streaming service. Distinct from:
- Watching a specific ticketed event (concert / sport) → respective intents
- Buying a TV / set-top box → out of scope v1
- Cable/DTH subscription → out of scope v1 (potential v1.1+
pay.dth_recharge)
Single intent per subscription action. Bundle deals (multiple OTTs in one subscription) classify as one intent — partner reflects bundle in the payload.
SECTION 2 — NATURAL LANGUAGE COVERAGE
CLASSIFIES IN
- "Subscribe to Netflix premium"
- "Get Hotstar for IPL"
- "Upgrade Prime Video to top tier"
- "Cheapest streaming bundle for cricket"
- "Jio Bundle with Netflix and Prime"
- "Cancel my Netflix"
- "Aha Telugu subscription"
- "Apple TV+ for one year"
- "What's the OTT plan that has Game of Thrones"
- "Renew my SonyLIV"
CLASSIFIES OUT — BORDERLINE NO
- "Watch a specific movie / show tonight" → research intent, not subscription
- "Mobile data recharge" →
pay.utility_bill_pay(or v1.1+pay.mobile_recharge) - "Buy a Smart TV" → out of scope
MULTI-INTENT TRIGGERS
- "Subscribe to Hotstar + mobile recharge" →
entertainment.subscribe_streaming+pay.utility_bill_pay - "Jio Bundle (telco + streaming)" → bundle handled in this intent; telco recharge implied
SECTION 3 — INPUT (TOMO → PROVIDER)
{
"intent": "entertainment.subscribe_streaming",
"request_id": "req_01J9Z...",
"user_locale": "en-IN",
"user_currency": "INR",
"user_location": { "city": "Hyderabad" },
"action": {
"action_type": "new_subscription", // STRICT ENUM §6
"platforms_preferred": ["netflix", "hotstar", "prime_video"], // STRICT ENUM §6 ordered
"bundles_open_to": true,
"billing_cycle_preferred": "annual", // STRICT ENUM §6
"tier_preference": "premium", // STRICT ENUM §6
"device_support_required": ["mobile", "tv", "laptop"], // STRICT ENUM §6
"simultaneous_streams_min": 2,
"content_focus": ["sports_live", "movies", "regional_telugu"] // STRICT ENUM §6
},
"ttbs_user_band": { "time": "balanced", "taste": "great", "budget": "good", "safety": "balanced" },
"session_context": { "tomo_session_id": "ses_01J9Z...", "user_dna_hash": "dna_v3_a7c9..." }
}
| Field | Type | Constraint | Notes |
|---|---|---|---|
intent |
string | REQUIRED, STRICT ENUM | Always entertainment.subscribe_streaming |
action.action_type |
enum | REQUIRED, STRICT ENUM §6 | new / upgrade / downgrade / renew / cancel |
action.platforms_preferred |
array |
REQUIRED, ≥1 when action_type=new/upgrade | |
action.bundles_open_to |
bool | REQUIRED | TRUE allows bundle plans |
action.billing_cycle_preferred |
enum | REQUIRED, STRICT ENUM §6 | |
action.tier_preference |
enum | REQUIRED, STRICT ENUM §6 | |
action.device_support_required |
array |
REQUIRED, ≥1, STRICT ENUM §6 | |
action.simultaneous_streams_min |
int | REQUIRED, 1-10 | Drives tier filter |
action.content_focus |
array |
REQUIRED, may be empty, STRICT ENUM §6 | Steers taste-fit |
Anti-fabrication preamble: Platform claims must match the platform's published catalogue. Bundle pricing must reflect partner's actual telco/aggregator deal, not aspirational rates.
SECTION 4 — PROVIDER TOOLS
Tool 1: search_subscription_plans
PURPOSE: Up to 12 plans (single platform + bundle) matching content_focus + tier + device + cycle
SLA: p50 ≤ 500ms, p95 ≤ 1500ms, p99 ≤ 3000ms
RATE LIMIT: 60 req/min
IDEMPOTENCY: request_id; 60s cache
RETRY: 1 on 429, 2 on 5xx
Tool 2: confirm_subscription
PURPOSE: Activate plan after payment
SLA: p50 ≤ 1500ms, p95 ≤ 4000ms
RATE LIMIT: 30 req/min
IDEMPOTENCY: request_id
RETRY: No retry on activation
Tool 3: manage_existing_subscription
PURPOSE: Upgrade / downgrade / cancel an existing user subscription
SLA: p50 ≤ 1200ms, p95 ≤ 3500ms
RATE LIMIT: 30 req/min
IDEMPOTENCY: request_id
RETRY: No retry
SECTION 5 — RESPONSE SHAPE
SubscriptionPlan
SubscriptionPlan:
plan_id: { type: string, constraint: REQUIRED }
plan_name: { type: string, constraint: REQUIRED, semantics: "platform's official plan name (e.g. 'Netflix Premium')" }
type:
type: enum
constraint: REQUIRED, STRICT ENUM §6
values: [single_platform, bundle_multi_ott, telco_bundle, aggregator_bundle]
platforms_included:
type: array<Platform>
constraint: REQUIRED, ≥1
shape:
platform: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
tier_within_platform: { type: string, constraint: REQUIRED, semantics: "e.g. 'Premium', 'Mobile-only', 'VIP'" }
ad_supported: { type: boolean, constraint: REQUIRED }
max_simultaneous_streams: { type: int, constraint: REQUIRED, 1-10 }
max_video_quality: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [480p, 720p, 1080p, 4k_uhd, 8k] }
hdr_supported: { type: boolean, constraint: REQUIRED }
dolby_atmos: { type: boolean, constraint: REQUIRED }
download_allowed: { type: boolean, constraint: REQUIRED }
content_languages: { type: array<string>, constraint: REQUIRED, BCP-47, ≥1 }
pricing:
billing_cycle: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
base_price_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
discount_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
gst_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
total_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
cost_per_month_equivalent_inr: { type: int, constraint: REQUIRED, INR_INTEGER, semantics: "annual ÷ 12, monthly = total_inr" }
auto_renewal: { type: boolean, constraint: REQUIRED }
cancellable_anytime: { type: boolean, constraint: REQUIRED }
device_support:
type: array<enum>
constraint: REQUIRED, ≥1
values: [mobile, tablet, laptop, tv_smart, tv_streaming_stick, gaming_console, web_browser]
content_highlights:
sports_live_included: { type: array<string>, constraint: REQUIRED, may be empty, semantics: "e.g. ['ipl', 'epl']" }
exclusive_titles_count: { type: int, constraint: REQUIRED, ≥0 }
regional_languages_supported: { type: array<string>, constraint: REQUIRED, BCP-47 }
newly_released_pct: { type: int, constraint: REQUIRED, 0-100, semantics: "% catalogue released in last 12 months" }
policies:
refund_policy_url: { type: string, constraint: REQUIRED, HTTPS URL }
cancellation_terms: { type: string, constraint: REQUIRED, ≤300 chars }
geo_restriction: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [india_only, india_plus_neighbouring, worldwide] }
family_pin_supported: { type: boolean, constraint: REQUIRED }
parental_control_supported: { type: boolean, constraint: REQUIRED }
promotion:
is_promotional: { type: boolean, constraint: REQUIRED }
promo_validity_until: { type: string, constraint: REQUIRED nullable, ISO_DATE }
post_promo_price_inr: { type: int, constraint: REQUIRED nullable, INR_INTEGER }
partner_reference:
source: { type: string, constraint: REQUIRED }
deeplink: { type: string, constraint: REQUIRED, HTTPS URL }
SubscriptionConfirmation
SubscriptionConfirmation:
subscription_id: { type: string, constraint: REQUIRED, immutable }
plan_id: { type: string, constraint: REQUIRED }
activation_status: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [active, pending_activation, failed] }
next_billing_date: { type: string, constraint: REQUIRED, ISO_DATE }
amount_charged_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
receipt_url: { type: string, constraint: REQUIRED, HTTPS URL }
manage_subscription_url: { type: string, constraint: REQUIRED, HTTPS URL, semantics: "deeplink to upgrade/cancel" }
ManagementResult
ManagementResult:
subscription_id: { type: string, constraint: REQUIRED }
action_performed: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [upgraded, downgraded, cancelled, paused, renewed] }
effective_date: { type: string, constraint: REQUIRED, ISO_DATE }
refund_amount_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
refund_eta_days: { type: int, constraint: REQUIRED, 0-14 }
FORBIDDEN FIELDS
- Standard set (paid_placement / ad / urgency / AI photos / kickback / commission_padded)
fake_content_listing— claiming a title is on the platform when it isn'thidden_auto_renewal— auto_renewal=true must be prominently disclosedpromo_only_quote— post-promo price MUST be displayed alongside promo pricefalse_simultaneous_streams_claim
SECTION 6 — CONTROLLED VOCABULARIES
action.action_type:
values: { new_subscription, upgrade, downgrade, renew, cancel, pause, resume }
action.platforms_preferred / platforms_included.platform:
values:
netflix, prime_video, hotstar, jiocinema, sonyliv, zee5, voot, apple_tv,
discovery_plus, alt_balaji, aha, sun_nxt, hoichoi, mubi, lions_gate_play,
eros_now, chaupal_tv, manorama_max, dangal_play
action.billing_cycle_preferred / pricing.billing_cycle:
values: { weekly, monthly, quarterly, semi_annual, annual, biennial }
action.tier_preference / tier_within_platform:
values: { mobile_only, basic, standard, premium, ad_supported }
action.device_support_required / device_support:
values: { mobile, tablet, laptop, tv_smart, tv_streaming_stick, gaming_console, web_browser }
action.content_focus:
values: { sports_live, movies, tv_shows, regional_telugu, regional_tamil, regional_marathi, regional_bengali, regional_malayalam, regional_kannada, regional_punjabi, kids, anime, originals_only, live_news }
type:
values: { single_platform, bundle_multi_ott, telco_bundle, aggregator_bundle }
max_video_quality:
values: { 480p, 720p, 1080p, 4k_uhd, 8k }
geo_restriction:
values: { india_only, india_plus_neighbouring, worldwide }
activation_status: { values: { active, pending_activation, failed } }
action_performed: { values: { upgraded, downgraded, cancelled, paused, renewed } }
SECTION 7 — TTBS DIMENSIONS
TIME (weight = 0.10):
signals_used: [activation immediacy]
TASTE (weight = 0.50):
signals_used:
- platforms_included intersect platforms_preferred (exact match weighted highest)
- content_focus matched against content_highlights (sports_live coverage, regional language match, newly_released_pct)
- tier_within_platform ≥ user tier_preference
- device_support ⊇ user device_support_required
weighting:
platform_match: 0.40
content_match: 0.30
tier_match: 0.20
device_match: 0.10
BUDGET (weight = 0.30):
signals_used:
- pricing.cost_per_month_equivalent_inr
- promotion validity vs post_promo_price
- cancellable_anytime (TRUE = lower lock-in risk)
weighting:
price: 0.65
promo_honest: 0.20
flexibility: 0.15
SAFETY (weight = 0.10):
signals_used:
- policies.parental_control_supported (when user_dna indicates minors)
- policies.family_pin_supported
- policies.refund_policy_url present
- hidden_auto_renewal absent (mandatory floor)
weighting:
parental: 0.35
family_pin: 0.25
refund_url: 0.20
auto_renewal_disclosed: 0.20
SECTION 8 — COMPLETION CONTRACT
POST /api/v1/cpc/mcp_provider/<your_partner_id>
Body:
{
"intent": "entertainment.subscribe_streaming",
"external_id": "<subscription_id>",
"request_id": "<request_id>",
"amount_inr": 240, // NET — partner's affiliate commission, NOT total subscription
"gst_inr": 43,
"tips_inr": 0,
"pass_through_inr": 1499, // amount remitted to streaming platform / telco
"closed_at": "2026-05-12T20:00:00+05:30",
"status": "completed",
"action_type": "new_subscription",
"plan_name": "Netflix Premium Annual",
"billing_cycle": "annual",
"platforms_count": 1
}
Important: subscription_amount goes to platform; amount_inr is ONLY the partner's affiliate / aggregator margin. TOMO charges 10% × amount_inr only.
HMAC, 5-min replay, NET-only commission.
SECTION 9 — WIDGET
StreamingPlanWidget (planned). Field mapping: plan_name → header; platforms_included logos row → subline 1; cost_per_month_equivalent_inr (with billing_cycle visible) → big price; content_highlights chips (sports / regional / 4K); auto_renewal=true → orange recurring-billing pill (transparency); promo_validity_until + post_promo_price → "after promo" disclosure when promotional.
SECTION 10 — CACHING POLICY
| Call | TTL |
|---|---|
| search_subscription_plans | 5min |
| confirm_subscription | NO CACHE |
| manage_existing_subscription | NO CACHE |
| Platform metadata (logos, plan list) | 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 |
PLATFORM_API_DOWN |
503 | Streaming platform downstream unavailable | 1 retry, 5s |
PAYMENT_FAILED |
402 | Gateway declined | No |
EXISTING_SUBSCRIPTION_ACTIVE |
409 | User already has active sub on platform | No (UI suggests upgrade path) |
GEO_RESTRICTED |
422 | Plan not available in user's geo | No |
PROMO_EXPIRED |
410 | Promotional plan no longer available | No |
CANCELLATION_PRE_BILLED |
200 (advisory) | Cancellation effective at end of cycle | n/a |
SECTION 12 — SANDBOX → PRODUCTION CHECKLIST
[ ] All three tools implemented
[ ] At least 5 platforms in catalogue covering Netflix / Prime / Hotstar + 2 regional
[ ] platforms_included logos under valid licensing
[ ] HMAC + amount_inr=NET (affiliate margin only); pass_through_inr = subscription amount remitted
[ ] auto_renewal flag prominently disclosed in widget
[ ] post_promo_price always shown alongside promo price
[ ] No forbidden fields
[ ] Compliance: GSTIN, affiliate / aggregator agreements with platforms, IT Act consent for managing user's existing subs (when applicable), privacy policy
SECTION 13 — ANTI-FABRICATION RULES
RULE 1: No paid_placement / ad / kickback. Partners may not surface higher-
commission platforms above true TTBS match.
RULE 2: platforms_included claims must reflect partner's actual subscription
offer for that plan. Misrepresenting platform inclusion = customer
harm + suspension.
RULE 3: content_highlights (sports_live, exclusive_titles_count, etc.) must
match each platform's published current catalogue. Stale or aspirational
claims = suspension.
RULE 4: max_video_quality, max_simultaneous_streams, hdr_supported must match
platform's documented plan spec. Inflating tier specs to win rank =
customer harm + platform-relationship breach + suspension.
RULE 5: hidden_auto_renewal forbidden. auto_renewal=true MUST be displayed
prominently before checkout AND in the confirmation widget. RBI Auto-
debit norms apply for cards / UPI mandates.
RULE 6: promo_only_quote forbidden. Post-promo price must be displayed
alongside promo price + the validity_until date.
RULE 7: For action_type=cancel / pause: partner MUST process the request
through the platform's official API. Refusing or delaying cancellation
= customer harm + RBI Auto-debit / Consumer Protection violation.
RULE 8: AI-generated platform/content imagery forbidden. Licensed brand
assets only.
RULE 9: No "Top Pick" / "TOMO Recommended" badges. TTBS source-blind.
RULE 10: amount_inr in CPC is ONLY the partner's affiliate / aggregator margin.
Reporting the full subscription amount as partner revenue =
suspension. TOMO audits via partner's accounting.
RULE 11: For minors (DNA-flagged), parental_control_supported=true plans
should rank higher. Hiding parental control plans for higher-revenue
alternatives = customer harm.
RULE 12: geo_restriction must be honest. Selling a plan that doesn't work in
user's country = scam + suspension.
VERSION HISTORY
v1.0.0 — 2026-05-12 — Initial spec. NET commission (affiliate margin only).
Auto-renewal transparency + post-promo price disclosure
are floor anti-fab rules.