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.0entertainment.subscribe_streaming

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't
  • hidden_auto_renewal — auto_renewal=true must be prominently disclosed
  • promo_only_quote — post-promo price MUST be displayed alongside promo price
  • false_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.