Skip to main content

Platform API

The Platform API handles cross-product concerns including billing, user identity, organization management, SSO/SCIM provisioning, and platform administration.

Overview

The Platform API (apps/platform/) runs on port 3004 and is available at platform-api.statux.io.

Module Structure

apps/platform/src/
├── modules/
│ ├── billing/ # Stripe checkout, portal, webhooks
│ ├── users/ # User profile and subscription
│ ├── organizations/ # Org CRUD, members, product roles
│ ├── identity/ # SSO/SAML and SCIM token management
│ ├── scim/ # SCIM 2.0 user/group provisioning
│ ├── org-audit/ # Cross-product audit logs
│ ├── org-reports/ # Organization reporting
│ └── platform-admin/ # Internal admin tools
├── health/ # Health check endpoints
├── entities/ # TypeORM entities
├── migrations/ # Database migrations
└── main.ts # Application bootstrap

Endpoints

Auth Cookies

These endpoints are registered on all APIs (including Platform) via AuthCookieController from @app/auth:

MethodEndpointAuthDescription
POST/auth/set-cookieJWTStore tokens in httpOnly cookies
GET/auth/meCookie/JWTGet current user from session
POST/auth/refreshCookieRefresh tokens using refresh cookie
POST/auth/logoutPublicClear httpOnly auth cookies

Health

MethodEndpointAuthDescription
GET/api/v1/healthPublicHealth check for ALB
GET/api/v1/health/livePublicLiveness probe
GET/api/v1/health/readyPublicReadiness probe (checks DB)

Users

MethodEndpointAuthDescription
GET/api/v1/users/meJWTGet current user profile (includes isEmployee flag)
PATCH/api/v1/users/meJWTUpdate user profile
GET/api/v1/users/me/subscriptionJWTGet user subscription status

GET /users/me returns the user's Cognito profile plus isEmployee from the database. The isEmployee field is used by the internal docs site to gate access.

Billing

MethodEndpointAuthDescription
POST/api/v1/billing/checkoutJWTCreate Stripe checkout session
GET/api/v1/billing/portalJWTGet Stripe billing portal URL
GET/api/v1/billing/statusJWTCheck if billing is enabled
POST/api/v1/billing/webhookPublicStripe webhook receiver
POST/api/v1/billing/setupPlatform AdminCreate Stripe products/prices
GET/api/v1/billing/productsPlatform AdminList Stripe products

Org-scoped Billing

MethodEndpointAuthDescription
POST/api/v1/billing/organizations/:orgId/billing/checkoutOrg OwnerCreate checkout for org
GET/api/v1/billing/organizations/:orgId/billing/portalOrg OwnerGet billing portal for org

Organizations

MethodEndpointAuthDescription
GET/api/v1/organizationsJWTList user's organizations
POST/api/v1/organizationsJWTCreate organization
GET/api/v1/organizations/:orgIdOrg MemberGet organization details
PATCH/api/v1/organizations/:orgIdOrg Admin/OwnerUpdate organization
DELETE/api/v1/organizations/:orgIdOrg OwnerDelete organization

Members

MethodEndpointAuthDescription
GET/api/v1/organizations/:orgId/membersOrg MemberList members
POST/api/v1/organizations/:orgId/membersOrg Admin/OwnerAdd member
PATCH/api/v1/organizations/:orgId/members/:memberIdOrg OwnerUpdate member role
PUT/api/v1/organizations/:orgId/members/:memberIdOrg Admin/OwnerUpdate member (role + product roles)
DELETE/api/v1/organizations/:orgId/members/:memberIdOrg Admin/OwnerRemove member
POST/api/v1/organizations/:orgId/transfer-ownershipOrg OwnerTransfer ownership

Product Roles

MethodEndpointAuthDescription
GET/api/v1/organizations/:orgId/product-role-optionsOrg MemberGet valid product role options
GET/api/v1/organizations/:orgId/members/:memberId/product-rolesOrg MemberGet member's product roles
PUT/api/v1/organizations/:orgId/members/:memberId/product-rolesOrg Admin/OwnerSet member's product roles

Subscription

MethodEndpointAuthDescription
GET/api/v1/organizations/:orgId/subscriptionOrg MemberGet org subscription

SSO / SAML

MethodEndpointAuthDescription
GET/api/v1/organizations/:orgId/ssoOrg Admin/OwnerGet SSO config status
POST/api/v1/organizations/:orgId/ssoOrg Admin/OwnerConfigure SSO/SAML
DELETE/api/v1/organizations/:orgId/ssoOrg Admin/OwnerRemove SSO config
GET/api/v1/organizations/:orgId/sso/metadataPublicGet SAML SP metadata

SCIM Tokens

MethodEndpointAuthDescription
GET/api/v1/organizations/:orgId/scim-tokensOrg Admin/OwnerList SCIM tokens
POST/api/v1/organizations/:orgId/scim-tokensOrg Admin/OwnerCreate SCIM token
DELETE/api/v1/organizations/:orgId/scim-tokens/:idOrg Admin/OwnerRevoke SCIM token

SCIM 2.0 Provisioning

These endpoints follow the SCIM 2.0 specification and are authenticated via SCIM bearer tokens (not JWT).

MethodEndpointAuthDescription
GET/api/v1/scim/v2/ServiceProviderConfigSCIM TokenService provider config
GET/api/v1/scim/v2/SchemasSCIM TokenSupported schemas
GET/api/v1/scim/v2/ResourceTypesSCIM TokenSupported resource types
GET/api/v1/scim/v2/UsersSCIM TokenList users
GET/api/v1/scim/v2/Users/:idSCIM TokenGet user
POST/api/v1/scim/v2/UsersSCIM TokenCreate user
PUT/api/v1/scim/v2/Users/:idSCIM TokenReplace user
PATCH/api/v1/scim/v2/Users/:idSCIM TokenUpdate user
DELETE/api/v1/scim/v2/Users/:idSCIM TokenDeactivate user
GET/api/v1/scim/v2/GroupsSCIM TokenList groups
GET/api/v1/scim/v2/Groups/:idSCIM TokenGet group
POST/api/v1/scim/v2/GroupsSCIM TokenCreate group
PUT/api/v1/scim/v2/Groups/:idSCIM TokenReplace group
PATCH/api/v1/scim/v2/Groups/:idSCIM TokenUpdate group
DELETE/api/v1/scim/v2/Groups/:idSCIM TokenDelete group

Org Audit Logs

MethodEndpointAuthDescription
GET/api/v1/organizations/:orgId/audit-logsOrg MemberList audit logs (filterable by product, entity type, action, date range)

Org Reports

MethodEndpointAuthDescription
GET/api/v1/organizations/:orgId/reportsOrg MemberList reports
GET/api/v1/organizations/:orgId/reports/:reportId/downloadOrg MemberGet signed download URL
POST/api/v1/organizations/:orgId/reports/generateOrg MemberGenerate a new report
GET/api/v1/organizations/:orgId/status-pagesOrg MemberList org status pages
GET/api/v1/organizations/:orgId/checksOrg MemberList org synthetics checks

Billing Integration

Pricing Model

  • Per-product: Pages, Alerts, Synthetics ($65 Team / $150 Business per month)
  • Bundle: All products ($150 Team / $400 Business per month)
  • Enterprise: Custom pricing

Checkout Flow

POST /api/v1/billing/checkout
{ "product": "bundle", "plan": "team" }
// Returns { url: "https://checkout.stripe.com/..." }

Webhook Events Handled

The Stripe webhook endpoint processes the following events:

  • checkout.session.completed - Subscription created
  • customer.subscription.updated - Plan changes
  • customer.subscription.deleted - Cancellation
  • invoice.payment_failed - Payment failures

Database

The Platform API uses the core schema for its own entities and shares it with the cross-product shared entities.

Key Tables

TablePurpose
core.usersUser profiles
core.organizationsOrganization records
core.organization_membersOrg membership
core.org_product_rolesPer-product role assignments
core.subscriptionsLegacy billing subscriptions
core.org_product_subscriptionsPer-product subscription per org
core.scim_tokensSCIM provisioning tokens
core.analytics_eventsProduct usage telemetry
core.user_activitiesUser activity tracking

Testing

Run tests with:

npm run test:platform