---
title: "Api Practicum Review"
method: POST
path: "/api/learning/practicum-review"
tags: ["Education"]
---

# Api Practicum Review

`POST /api/learning/practicum-review`

## Request

- Base URL: `https://www.oxfordledge.com` (the document declares no server; this is the origin it was published from)
- URL: `https://www.oxfordledge.com/api/learning/practicum-review`
- Auth: none declared

AI portfolio practicum review. Power User tier only.

Tier gate: require_min_tier("professional"). Was previously an
inline `tier not in ("professional",)` check returning 403 with a
plain {"error": "..."} envelope. Now routed through the standard
TierGateException path which (a) returns 402 (the CLAUDE.md-
mandated status for tier gates; 403 is reserved for CSRF + admin),
(b) returns the structured {requiredTier, currentTier, upgrade_url,
...} envelope the frontend handleFeatureGate() already expects,
and (c) is visible to /api/billing/tier-endpoints introspection +
tests/test_tier_endpoint_registry.py.

Accepts {goal, tickers, portfolio_summary} and returns a streamed AI analysis
covering sector concentration, valuation spread, risk, and 3 specific suggestions.
Deducts 3 AI credits per review.

## Response `200`

Successful Response

- unknown

---

[API](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api.md) · [All operations](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/llms.txt) · [OpenAPI document](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/revisions/e832a1260f0b?raw)
