Auth
Multi-tenant auth without the sprint.
Auth is the auth layer for products that need tenancy on day one. Users, organizations, roles, MFA, machine-to-machine tokens, and audit logs, all behind one REST API. Tokens are scoped and signed per app, so the isolation between tenants is a property of the token, not a policy check.
Most auth stacks split in half: consumer widgets that crack once you need tenancy, or enterprise IdPs that take a quarter to wire up. Auth sits in the middle. Opinionated enough to ship in an afternoon. Flexible enough to run thousands of tenants without a rewrite.
No dashboard-driven config. Every operation is an HTTP call with a JSON body, so if your stack can POST, it can use Auth. A typed Node client sits on the same OpenAPI spec if you want one; the flat HTTP surface is still the product. And every ProductCraft product runs on Auth — we eat our own tenancy model.
Capabilities
Core features
Everything you need to add production-grade auth to a multi-tenant application. Nothing you don’t.
Two levels of tenancy
Role-based access control
User management
Multi-factor authentication
Sign-in you don’t have to build
Machine-to-machine tokens
App invites
Webhooks on identity events
Audit logging
Integration
How it works
A typical integration takes three steps: create an App for your product, issue tokens for your users or services, and check permissions on each request.
Create an App
An App is your product, or one environment of it. Creating one mints its own signing keypair and provisions system roles and permissions. Your customers are organizations inside it, not Apps of their own.
{
"slug": "acme-corp",
"display_name": "Acme Corporation",
"workspace_id": "835015dc-7bde-4a8a-b306-c066d4733b90"
}Issue a token
Authenticate a user or a service and receive a signed JWT. Users sign in with email and password, or with Apple, Google, or GitHub. Services use the OAuth 2.0 client-credentials grant.
{
"grant_type": "client_credentials",
"client_id": "m2m_a1b2c3d4...",
"client_secret": "base64url-secret"
}Check permissions
Verify the token and check whether the caller holds the permission you require. Pass permission for a single check, or permissions for a set that must all be held. When you only need the claims, verifying offline against the app’s JWKS endpoint is the fast path.
{
"token": "eyJhbGciOiJSUzI1NiIs...",
"permission": "user.read"
}
→ { "authorized": true }Under the hood
Technical details
Here is what matters for your integration.
REST-first, SDK-optional
JWT-based authentication
Tenant-scoped data isolation
LLM-friendly surface
Horizontal scaling
Use cases
Built for these workloads
SaaS with team workspaces
Internal tools with service accounts
Marketplaces and platforms
AI agent backends
Skip the auth sprint
The quickstart goes from zero to a signed token in under ten minutes. Create an App, issue a token, verify it against the JWKS endpoint — all with copy-paste curl.