Live API docs (Scalar)
Open
/api/v1/docs on your PymtHouse deployment to browse and try every endpoint interactively. The Scalar UI accepts HTTP Basic auth directly in the browser.
Internal routes (
/api/v1/internal/…) are for the PymtHouse dashboard’s own session and are not linked from the public Scalar UI. Use Builder routes for all integrator access.Base URL
All API endpoints share one base URL:/api/v1/oidc/…. Builder API endpoints live under /api/v1/apps/{clientId}/…. Usage API canonical paths live under /api/v1/builder/apps/{clientId}/….
Always resolve OIDC endpoint URLs from the discovery document at runtime:
Authentication
PymtHouse uses three auth modes depending on the operation:HTTP Basic (M2M — most Builder/Usage routes)
Bearer token (machine or user JWT)
Obtain a machine token via client credentials, then use it for multiple calls:Provider session (dashboard-only routes)
Plans, Stripe Connect, and billing mutation routes require a logged-in dashboard session. These are not callable from a backend service — use the PymtHouse dashboard UI or pass thenext-auth.session-token cookie from a browser session in scripts.
Endpoint inventory
OIDC / Auth
User management
Usage API
Billing
Plans
App config
Common response patterns
Tenant boundary
M2M requests to app-scoped endpoints enforce that the authenticated M2M client belongs to the same app as the{clientId} in the URL path. Mismatches return 404 Not Found — not 401 or 403 — to prevent app id enumeration. Session and user-JWT endpoints use different tenant controls.
Wei values
All*Wei fields are decimal strings, not numbers. They may exceed Number.MAX_SAFE_INTEGER. Parse them with BigInt():
USD micros
*UsdMicros fields are integer strings where 1000000 = $1.00. These are computed once at signing time and never recomputed from the current ETH/USD rate.
Error format
Denial responses from the activation gate use RFC 9457 problem details:code values: owner_payment_method_required, end_user_cap_reached, stripe_connect_required, stripe_connect_pending.