### 13.1 Get Public Pricing Plans (No Auth Required)

**Endpoint:** `GET /subscription/plans`
**Auth:** None (PUBLIC endpoint)
**Use Cases:** Marketing website, signup flow, mobile app pricing display

```typescript
// Fetch pricing plans
const response = await fetch('http://localhost:8000/api/v1/subscription/plans');
const plans = await response.json();

// Response
[
  {
    "tier": "trial",
    "display_name": "Trial",
    "description": "Try Luran with core AI support and starter limits.",
    "monthly_price_kobo": 0,
    "annual_price_kobo": 0,
    "monthly_price_naira": 0.0,
    "annual_price_naira": 0.0,
    "annual_savings_naira": 0.0,
    "annual_discount_percentage": 0.0,
    "capabilities": {
      "can_access_analytics": false,
      "max_knowledge_sources": 2,
      "can_use_url_sources": false,
      "max_knowledge_mb": 10,
      "max_conversations_per_month": 200,
      "max_team_members": 1,
      "max_response_tokens": 800,
      "max_audits_per_month": 2,
      "max_audit_pages_per_crawl": 20
    },
    "features": [
      "2 knowledge sources",
      "10MB storage",
      "200 conversations/month",
      "1 team member",
      "Website audit: 2/month, up to 20 pages",
      "Email support"
    ],
    "is_popular": false
  },
  {
    "tier": "lite",
    "display_name": "Lite",
    "description": "For small teams getting started.",
    "monthly_price_kobo": 900000,  // ₦9,000
    "annual_price_kobo": 9000000,  // ₦90,000
    "monthly_price_naira": 9000.0,
    "annual_price_naira": 90000.0,
    "annual_savings_naira": 18000.0,
    "annual_discount_percentage": 16.7,
    "capabilities": { /* ... */ },
    "features": [ /* ... */ ],
    "is_popular": false
  },
  {
    "tier": "professional",
    "display_name": "Professional",
    "description": "Advanced features for growing teams",
    "monthly_price_kobo": 4000000,  // ₦40,000
    "annual_price_kobo": 40000000,  // ₦400,000
    "monthly_price_naira": 40000.0,
    "annual_price_naira": 400000.0,
    "annual_savings_naira": 80000.0,
    "annual_discount_percentage": 16.7,
    "capabilities": { /* ... */ },
    "features": [ /* ... */ ],
    "is_popular": true  // Marked as recommended
  },
  {
    "tier": "growth",
    "display_name": "Growth",
    "description": "Perfect for scaling businesses with growing customer support needs",
    "monthly_price_kobo": 8000000,  // ₦80,000
    "annual_price_kobo": 80000000,  // ₦800,000
    "monthly_price_naira": 80000.0,
    "annual_price_naira": 800000.0,
    "annual_savings_naira": 160000.0,
    "annual_discount_percentage": 16.7,
    "capabilities": { /* ... */ },
    "features": [ /* ... */ ],
    "is_popular": false
  }
]
```

**Note:** Enterprise tier is excluded from public pricing plans. It requires custom pricing and should be handled via "Contact Sales" flow.

**Frontend Example - Pricing Page:**

```typescript
async function displayPricingPlans() {
  try {
    const response = await fetch('http://localhost:8000/api/v1/subscription/plans');
    const plans = await response.json();

    const pricingContainer = document.getElementById('pricing-plans');

    plans.forEach(plan => {
      const card = `
        <div class="pricing-card ${plan.is_popular ? 'popular' : ''}">
          <h3>${plan.display_name}</h3>
          <p class="description">${plan.description}</p>

          <div class="pricing">
            <div class="monthly">
              <span class="amount">₦${plan.monthly_price_naira.toLocaleString()}</span>
              <span class="period">/month</span>
            </div>
            <div class="annual">
              <span class="amount">₦${plan.annual_price_naira.toLocaleString()}</span>
              <span class="period">/year</span>
              ${plan.annual_discount_percentage > 0 ?
                `<span class="savings">Save ${plan.annual_discount_percentage}%</span>` : ''}
            </div>
          </div>

          <ul class="features">
            ${plan.features.map(f => `<li>${f}</li>`).join('')}
          </ul>

          <button class="select-plan" data-tier="${plan.tier}">
            ${plan.tier === 'trial' ? 'Start Free Trial' : 'Select Plan'}
          </button>
        </div>
      `;
      pricingContainer.innerHTML += card;
    });
  } catch (error) {
    console.error('Failed to load pricing:', error);
  }
}
```

**Note on `null` capability values.** A `null` limit means *no limit on that
plan* — it is not "unknown" and not zero. Render it as "Unlimited"; do not fall
back to a default, and do not treat it as falsy. Enterprise (served via Contact
Sales rather than this endpoint) carries `null` for `max_knowledge_sources`,
`max_audits_per_month` and `max_audit_pages_per_crawl`.
