{"openapi": "3.0.3", "info": {"title": "Assured Platforms API", "version": "0.1.0-dev-portal", "description": "Developer Portal generated API metadata for current platform endpoints."}, "servers": [{"url": "https://hub.assured-platforms.local"}], "paths": {"/accounts/login/": {"get": {"summary": "Interactive sign-in for portal, hub, and staff users.", "description": "Domain: Authentication | Permissions: Anonymous", "responses": {"200": {"description": "200 HTML login form"}, "4XX": {"description": "302 redirect, 400 validation errors"}}}}, "/launch/<organisation_id>/<product_slug>/": {"get": {"summary": "Hub launch handoff with signed launch token.", "description": "Domain: Launch | Permissions: Authenticated + entitlement decision", "responses": {"200": {"description": "302 redirect to downstream app with launch_token"}, "4XX": {"description": "403 launch_denied, 503 system_error"}}}}, "/api/access/check/": {"post": {"summary": "Server-to-server entitlement decision API.", "description": "Domain: Entitlements | Permissions: X-API-KEY required", "responses": {"200": {"description": "{\"allowed\":true,\"decision_code\":\"allowed\",\"trace_id\":\"...\"}"}, "4XX": {"description": "400 malformed_request, 401 invalid_api_key, 429 rate_limited, 500 system_error"}}}}, "/billing/webhooks/stripe/": {"post": {"summary": "Stripe webhook ingestion and reconciliation.", "description": "Domain: Billing | Permissions: Stripe signature header", "responses": {"200": {"description": "200 webhook accepted"}, "4XX": {"description": "400 bad_payload, 401 bad_signature, 500 processing_error"}}}}, "/staff/platform/notifications/": {"get": {"summary": "Staff notification event and delivery console.", "description": "Domain: Notifications | Permissions: Staff", "responses": {"200": {"description": "200 HTML table"}, "4XX": {"description": "403 forbidden"}}}}, "/files/download/<file_asset_id>/": {"get": {"summary": "Secure file delivery.", "description": "Domain: Files | Permissions: Authenticated + file visibility rules", "responses": {"200": {"description": "200 file stream"}, "4XX": {"description": "403 forbidden, 404 not_found"}}}}, "/forms/<organisation_id>/<slug>/": {"get": {"summary": "Public form rendering and submission capture.", "description": "Domain: Forms | Permissions: Public by form policy", "responses": {"200": {"description": "200 confirmation/validation output"}, "4XX": {"description": "404 not_found, 400 validation_error"}}}}, "/learning/<collection_slug>/<guide_slug>/": {"get": {"summary": "Public learning guide access.", "description": "Domain: Learning | Permissions: Public or policy-gated", "responses": {"200": {"description": "200 guide page"}, "4XX": {"description": "404 not_found"}}}}, "/portal/bookings/<booking_id>/cancel/": {"post": {"summary": "Portal-side booking cancellation action.", "description": "Domain: Bookings | Permissions: Membership + booking policy", "responses": {"200": {"description": "302 redirect after cancel"}, "4XX": {"description": "403 forbidden, 404 not_found"}}}}, "/portal/relationships/": {"get": {"summary": "Relationship management workspace (portal).", "description": "Domain: Relationships | Permissions: Authenticated membership", "responses": {"200": {"description": "302 redirect with status message"}, "4XX": {"description": "400 validation_error, 403 forbidden"}}}}, "/portal/sales/": {"get": {"summary": "Sales CRM portal workspace for opportunities and quotes.", "description": "Domain: Sales | Permissions: Authenticated membership", "responses": {"200": {"description": "302 redirect with success message"}, "4XX": {"description": "400 validation_error, 403 forbidden"}}}}, "/portal/ai/": {"get": {"summary": "Portal AI framework placeholder and entitlement surface.", "description": "Domain: AI | Permissions: Authenticated membership", "responses": {"200": {"description": "200 placeholder page"}, "4XX": {"description": "403 forbidden"}}}}, "/portal/switch-organisation/": {"post": {"summary": "Switch active portal organisation context.", "description": "Domain: Organisation | Permissions: Authenticated membership", "responses": {"200": {"description": "302 redirect"}, "4XX": {"description": "403 forbidden, 400 invalid_org"}}}}, "/portal/team/<membership_id>/role/": {"post": {"summary": "Update team member role.", "description": "Domain: Users | Permissions: Organisation owner/admin", "responses": {"200": {"description": "302 redirect"}, "4XX": {"description": "403 forbidden, 404 not_found"}}}}, "/staff/platform/system-health/": {"get": {"summary": "Operational health checks dashboard.", "description": "Domain: Platform Admin | Permissions: Staff", "responses": {"200": {"description": "200 HTML"}, "4XX": {"description": "403 forbidden"}}}}}}