Quickstart
This guide takes you from no account to a user signed into your app in five minutes. After that you fork into three paths: integrate it seriously into your SaaS, hand it to an agent, or keep admin-ing from the dashboard.
The walkthrough
Section titled “The walkthrough”-
Sign up at
app.prysmid.com.Head to app.prysmid.com and sign in with Google or GitHub. No card asked — the Free plan never expires and covers 10k MAU.
-
Create your first workspace.
After your first login we ask for a slug (e.g.
acme). That slug becomesauth.acme.prysmid.com— the domain where your users will sign in. Provisioning takes 60-90 seconds: we spin up a dedicated instance for your workspace, configure OIDC, default branding and SMTP. -
Register your first OAuth app.
In your workspace dashboard, go to Apps → New app. It asks for:
- Name:
My SaaS dev - Redirect URIs:
http://localhost:3000/auth/callback(for local dev) — you can add more later - Type: Web (server-side) or SPA (browser)
You get a
client_id(public) and aclient_secret(shown once — copy it). - Name:
-
Wire your local app.
Your app talks to Prysm:ID over standard OIDC. Endpoints:
Issuer: https://auth.acme.prysmid.comAuthorization: https://auth.acme.prysmid.com/oauth/v2/authorizeToken: https://auth.acme.prysmid.com/oauth/v2/tokenUserInfo: https://auth.acme.prysmid.com/oidc/v1/userinfoJWKS: https://auth.acme.prysmid.com/oauth/v2/keysAny decent OIDC library works. Examples:
import { Issuer } from 'openid-client';const issuer = await Issuer.discover('https://auth.acme.prysmid.com');const client = new issuer.Client({client_id: process.env.PRYSMID_CLIENT_ID,client_secret: process.env.PRYSMID_CLIENT_SECRET,redirect_uris: ['http://localhost:3000/auth/callback'],response_types: ['code'],});from authlib.integrations.starlette_client import OAuthoauth = OAuth()oauth.register(name='prysmid',server_metadata_url='https://auth.acme.prysmid.com/.well-known/openid-configuration',client_id=os.environ['PRYSMID_CLIENT_ID'],client_secret=os.environ['PRYSMID_CLIENT_SECRET'],client_kwargs={'scope': 'openid profile email'},)import "github.com/coreos/go-oidc/v3/oidc"import "golang.org/x/oauth2"provider, _ := oidc.NewProvider(ctx, "https://auth.acme.prysmid.com")conf := &oauth2.Config{ClientID: os.Getenv("PRYSMID_CLIENT_ID"),ClientSecret: os.Getenv("PRYSMID_CLIENT_SECRET"),RedirectURL: "http://localhost:3000/auth/callback",Endpoint: provider.Endpoint(),Scopes: []string{oidc.ScopeOpenID, "profile", "email"},}Ventana de terminal # 1. Redirect your user to:AUTH_URL="https://auth.acme.prysmid.com/oauth/v2/authorize"echo "$AUTH_URL?client_id=$PRYSMID_CLIENT_ID&redirect_uri=http://localhost:3000/auth/callback&response_type=code&scope=openid%20profile%20email"# 2. On callback, exchange `code` for tokens:curl -X POST https://auth.acme.prysmid.com/oauth/v2/token \-u "$PRYSMID_CLIENT_ID:$PRYSMID_CLIENT_SECRET" \-d "grant_type=authorization_code" \-d "code=$AUTH_CODE" \-d "redirect_uri=http://localhost:3000/auth/callback" -
Try the login.
Run your local app and hit your login flow. Your app redirects to
auth.acme.prysmid.com, the user enters email + password (or signs up), and comes back to your callback with anauthorization_code. Exchange it for a JWTid_tokencarryingsub,email,name.That
subis the stable user identifier in your workspace. Store it alongside your user record.
What’s next
Section titled “What’s next”Three directions depending on what you want to deepen:
Troubleshooting
Section titled “Troubleshooting”The workspace stays in provisioning for more than 5 minutes.
Something failed during provision. Go to Settings → Status on the workspace to see where it stalled. If you stay blocked, write us — the state is recoverable without losing the slug.
My app says redirect_uri_mismatch.
The exact URI you send in authorize must match one registered under Apps → your app → Redirect URIs. Trailing slashes count.
The id_token comes back without email.
Request the email scope on top of openid profile. Some libraries only request openid by default.
I need to self-host this. You can. The foundation is open source: export your instance in standard format and stand it up in your own infrastructure. See Security model & portability.