{
  "_comment": "Canonical subscription tier limits — the single source of truth, cross-stack-owned. The BACKEND reads this at startup to build enforcement limits (backend/src/core/tier_limits.py) and the FRONTEND imports it to render the Pricing page; it is also served publicly at /data/tiers.json. It lives under frontend/ only because the frontend build context requires it there; do NOT move or delete it without updating the backend loader (which fails fast if it's missing) and Dockerfile.api (which COPYs it). Product tiers only — the runtime-only DEV tier stays in code. `unlimited_items` is DISPLAY-ONLY: when true, the pricing page shows 'Unlimited' for bookmark/note/prompt counts; the backend ignores it and still enforces the max_bookmarks/max_notes/max_prompts values as an anti-abuse ceiling. `price` is likewise DISPLAY-ONLY (monthly_usd = month-to-month price; annual_monthly_usd = per-month price when billed annually): the pricing page renders it and agents read it from the served file; the backend ignores it. Update prices here, not in Pricing.tsx.",
  "free": {
    "unlimited_items": false,
    "price": { "monthly_usd": 0, "annual_monthly_usd": 0 },
    "max_bookmarks": 10,
    "max_notes": 10,
    "max_prompts": 5,
    "max_pats": 3,
    "max_title_length": 200,
    "max_description_length": 1000,
    "max_tag_name_length": 50,
    "max_bookmark_content_length": 25000,
    "max_note_content_length": 25000,
    "max_prompt_content_length": 25000,
    "max_url_length": 2048,
    "max_prompt_name_length": 100,
    "max_argument_name_length": 100,
    "max_argument_description_length": 1000,
    "rate_read_per_minute": 60,
    "rate_read_per_day": 500,
    "rate_write_per_minute": 20,
    "rate_write_per_day": 200,
    "rate_sensitive_per_minute": 5,
    "rate_sensitive_per_day": 25,
    "rate_ai_per_minute": 0,
    "rate_ai_per_day": 0,
    "rate_ai_byok_per_minute": 0,
    "rate_ai_byok_per_day": 0,
    "max_relationships_per_entity": 50,
    "history_retention_days": 1,
    "max_history_per_entity": 100
  },
  "standard": {
    "unlimited_items": false,
    "price": { "monthly_usd": 2, "annual_monthly_usd": 1 },
    "max_bookmarks": 250,
    "max_notes": 100,
    "max_prompts": 50,
    "max_pats": 10,
    "max_title_length": 200,
    "max_description_length": 1000,
    "max_tag_name_length": 50,
    "max_bookmark_content_length": 50000,
    "max_note_content_length": 50000,
    "max_prompt_content_length": 50000,
    "max_url_length": 2048,
    "max_prompt_name_length": 100,
    "max_argument_name_length": 100,
    "max_argument_description_length": 1000,
    "rate_read_per_minute": 120,
    "rate_read_per_day": 2000,
    "rate_write_per_minute": 60,
    "rate_write_per_day": 1000,
    "rate_sensitive_per_minute": 15,
    "rate_sensitive_per_day": 100,
    "rate_ai_per_minute": 0,
    "rate_ai_per_day": 0,
    "rate_ai_byok_per_minute": 0,
    "rate_ai_byok_per_day": 0,
    "max_relationships_per_entity": 50,
    "history_retention_days": 5,
    "max_history_per_entity": 100
  },
  "pro": {
    "unlimited_items": true,
    "price": { "monthly_usd": 5, "annual_monthly_usd": 4 },
    "max_bookmarks": 10000,
    "max_notes": 10000,
    "max_prompts": 10000,
    "max_pats": 50,
    "max_title_length": 200,
    "max_description_length": 1000,
    "max_tag_name_length": 50,
    "max_bookmark_content_length": 100000,
    "max_note_content_length": 100000,
    "max_prompt_content_length": 100000,
    "max_url_length": 2048,
    "max_prompt_name_length": 100,
    "max_argument_name_length": 100,
    "max_argument_description_length": 1000,
    "rate_read_per_minute": 300,
    "rate_read_per_day": 10000,
    "rate_write_per_minute": 200,
    "rate_write_per_day": 5000,
    "rate_sensitive_per_minute": 30,
    "rate_sensitive_per_day": 250,
    "rate_ai_per_minute": 30,
    "rate_ai_per_day": 500,
    "rate_ai_byok_per_minute": 120,
    "rate_ai_byok_per_day": 2000,
    "max_relationships_per_entity": 50,
    "history_retention_days": 15,
    "max_history_per_entity": 100
  }
}
