Skip to main content
Versine is an OpenID Connect (OIDC) provider. Connect it to the auth you already have, like any other sign-in option. Agents sign in through it like any other user, and your app keeps control of accounts, sessions and permissions. The agent’s assistant vouches for who its user is. Versine verifies the assistant and sends your auth provider a standard ID token. See How Versine works.

1. Register the project

Sign in to Console and choose Create project. Have these ready:
  • Auth0 domain: your tenant or custom domain, such as https://example.us.auth0.com.
  • Connection name: such as versine. You’ll use the same name in Auth0.
  • Callback URL: that domain followed by /login/callback, exactly.
Continuing past Integration saves a draft and creates your credentials. Drafts can’t sign anyone in; choose Finish setup after steps 2–5.
Choose Use my AI assistant when creating the project. Console copies a prompt with the full integration guide and your project’s non-secret settings. Paste it into your coding agent with your repository open. Enter secrets into your auth provider and secret manager yourself.
Under Advanced, optionally add your Terms of Service and Privacy Policy URLs. Versine gives them to assistants, which decide how to show them to their users. Versine doesn’t record acceptance: if you need a record, ask for it in your product after sign-in. Leave both empty to skip this.

2. Connect your auth provider

In Auth0, open Authentication → Enterprise → OpenID Connect and create a connection:
  • Name: the connection name from step 1.
  • Discovery URL: https://auth.versine.com/.well-known/openid-configuration.
  • Client ID and secret: from your Versine project, not your Auth0 application.
  • Type: Back Channel, with client_secret_basic authentication.
  • Scopes: openid profile email phone.
  • PKCE: S256.
Confirm the callback Auth0 shows matches the one in your project. Then enable the connection for your application on the Applications tab.
Keep S256 PKCE, the default, unless Auth0 can’t use it on this connection. Choose Nonce only if Auth0 sends and validates a fresh nonce and state to Versine instead. PKCE between your app and Auth0 does not protect the separate connection from Auth0 to Versine.

3. Add the sign-in button

Add Are you an agent? to both your login and sign-up pages. Keep your existing sign-in options.
Point the button at Auth0’s login with your Versine connection:
If you use one of Auth0’s server-side SDKs instead, such as @auth0/nextjs-auth0, pass connection=versine as an authorization parameter to its login route. Let Auth0’s SDK handle state, nonce and PKCE.

4. Connect user accounts

Versine sends:
  • sub is stable for one person, through one assistant, on your platform. The same person signing in through a different assistant has a different sub.
  • email_verified is true only if the assistant proved the person controls the mailbox in the last year. email_verification says how and when: provider_sso (signed in through Google, Apple or Microsoft) or otp (a one-time code or link).
  • phone_number_verified is true only if the assistant proved the person has the number in the last 30 days. phone_verification says how and when: messaging (the person messages the assistant from that number) or otp.
  • A sign-in can have an email, a phone number or both. People who use an assistant only by text message may have no email.
Match each sign-in to an account like this:
Never link on an unverified email or number. Both can change hands: a former employee’s work email, a domain that expired and was bought, or a phone number the carrier gave to someone new. Work addresses can change hands within the year, so you may want a stricter rule for them. Phone numbers can also be taken over by SIM swapping: if you already treat SMS as a weak factor, require a second check before a phone-only match reaches payment or admin rights.
Auth0 creates a separate user for each connection, with an ID such as oidc|versine|<sub>. Identify users by that ID. To reach an existing account, link the users in a post-login Action keyed to the Versine connection, following the table above. For an unverified email, redirect to a step where the person verifies it first. See Auth0 account linking.Auth0 doesn’t store the phone number by default. In the connection’s attribute mapping, map phone_number and phone_number_verified from the ID token. Add them to your app’s tokens in the post-login Action if your app needs them there.
Versine adds https://versine.com/claims/provider: "versine" and the assistant’s ID to its ID token and userinfo. Many auth providers, including Auth0 and Supabase, don’t forward these claims into your app’s tokens.
Set the source in a post-login Action keyed to the Versine connection:
To use the assistant ID in your app, map the upstream claim through the connection’s attribute mapping and a reviewed Action.
Treat this as where the sign-in came from, not as a role or permission.
Agree which reads, writes and resources agents may use, and which actions need a person, such as billing, admin and deletion. Enforce it on your backend:
  • Allow the user’s own rights, limited to your agent allowlist.
  • Keep the sign-in source in your server session, not in client parameters.
  • Treat a missing source as an agent, not a person.
  • Keep restrictions through refresh, silent sign-in and account linking.

5. Choose assistants

In Console, open Configuration → Assistants. By default your project accepts every assistant Versine has reviewed, including ones added later. Choose Only selected assistants to accept a fixed list instead. An agent from an assistant you don’t accept, or one that doesn’t work with Versine, sees a page saying agent sign-in isn’t available. It can’t sign in through Versine.
Some agents drive a browser that can’t add the sign-in header, such as an agent controlling a person’s desktop. With Advanced → Allow code sign-in on, Versine’s page asks these agents for a code from their assistant, which they type in. Each code works once, on one sign-in page, for two minutes.It’s off by default because the code passes through the agent itself. An agent tricked into revealing its code could let someone else sign in as its user. Turn it on only if you need these agents, and keep agent permissions tight.

6. Test sign-in

In Console, open Test sign-in and enter your app’s login page. Versine opens it in a browser that acts as a test assistant, clicks Are you an agent? and signs in as the test person you choose:
  • New person: confirm an account is created. Test again and confirm the same account is used.
  • Existing email, verified: confirm the sign-in reaches that account.
  • Existing email, not verified: confirm your app asks for proof before linking, and creates no duplicate.
  • Phone number only: confirm your app creates or finds an account with no email.
Then:
  • Ask an agent from a supported assistant to sign in, and confirm it reaches a protected page.
  • Sign out and confirm access is denied.
Check these first:
  • invalid_redirect_uri: match the project’s callback to your provider’s exactly, with no query.
  • invalid_client: use your Versine project’s client ID and secret in your provider, with client_secret_basic.
  • invalid_request: check S256 PKCE, or state and nonce for the nonce profile.
  • The agent sees Agent sign-in isn’t available: its assistant isn’t in your accepted list or doesn’t work with Versine.
  • The agent is asked for a sign-in code you didn’t expect: its browser didn’t send a sign-in token and code sign-in is on. Turn it off if you don’t need it.
  • Supabase returns provider_email_needs_verification: the email isn’t verified. The person confirms it from Supabase’s email, then the agent signs in again.