Skip to content

Registration control

Closing sign-up is not one switch. Rakomi exposes one switch per account-creation path, because the paths have different trust models — so “registration is closed” is a statement about a set of settings, not about a single field.

This page is the list of those paths, in the order to set them.

PathSwitchDefault
Registration mode (tenant-wide ceiling)signup_mode (open / closed / invite_only) — set from the dashboard Settings pageopen
Password / email self-registrationself_registration_enabledopen
Social sign-up — Google, GitHub, Microsoftgoogle_oauth_allow_signup, github_oauth_allow_signup, microsoft_oauth_allow_signupopen
Social sign-up — every other configurable providerthe provider’s own allow_signupclosed, and the provider must be enabled explicitly first
Anonymous sessions, and their upgrade to a permanent accountthe tenant’s anonymous sign-in settingoff
Enterprise SSO — just-in-time provisioningjit_provisioning_enabled on the connection (optionally narrowed by jit_require_group)provisions unless set to false
EUDI wallet sign-inthe EUDI setting for the tenantoff
SCIM 2.0 directory syncadministrator-initiated — not gated by any switch on this page; provisioned via the tenant’s own API token, never a stranger’s actionalways available when SCIM is configured

SCIM 2.0 (RFC 7643 Core Schema, RFC 7644 Protocol) directory sync is deliberately excluded from every switch above. Every other row in this table gates a path a stranger initiates — someone authenticating against your tenant for the first time. SCIM provisioning is administrator-initiated: your own API token acts, not a stranger, so none of the switches on this page — including a closed registration mode — affect it.

signup_mode is the tenant-wide registration-posture ceiling — open, closed, or invite_only. It is broader than self_registration_enabled, which gates the password/email endpoint alone. The ceiling caps password/email self-registration, both anonymous-session-claim variants, EUDI wallet sign-in, the enterprise-SSO just-in-time fallback — and social sign-up, for every provider, Google, GitHub, Microsoft and Apple as well as every other configurable one.

The per-provider allow_signup switches stay meaningful underneath it: they decide which providers admit new users while the mode is open. They cannot re-open a path the mode has closed. The refusal a stranger sees is not one uniform shape across the paths — treat “was the account created” as the contract, not the specific error envelope of any one flow.

Composing the settings: a per-provider override, if set, wins; otherwise the tenant-wide floor (signup_default) applies — and both are capped by the tenant-wide mode above. If the mode is closed, no per-provider override or floor value re-opens registration until the mode itself changes.

invite_only is a valid value in the API vocabulary, but it is not yet accepted — a write attempt is rejected with a 400. Use closed until then.

A tenant that existed before this feature shipped never explicitly set signup_mode: its value was derived once, at migration time, from its self_registration_enabled setting at that time (trueopen, falseclosed).

signup_closed_reason is a free-text field visible in the dashboard UI to every admin of the tenant. Do not put personal data about a named third party in it.

  1. Set self_registration_enabled to false.
  2. Set allow_signup to false for every social provider you have enabled. Each configurable provider carries the flag on its own settings.
  3. If you use anonymous sessions, turn them off for the tenant. Upgrading an anonymous session into a permanent account is a different flow from self-registration and is not covered by the switches above, and the tenant-level anonymous setting is the control for it. Removing the upgrade step from your own UI is not a substitute — the endpoint stays callable by anything holding an anonymous session token.
  4. If you have an enterprise SSO connection, set jit_provisioning_enabled to false on it explicitly. Leaving it unset provisions new users on first successful sign-in, which is usually what an SSO customer wants and is exactly what you do not want while sign-up is closed. jit_require_group narrows provisioning to one directory group if you want it open but bounded.
  5. If you have enabled EUDI wallet sign-in, it admits users on a successful presentation. Turn it off for that tenant if closed sign-up is a requirement.

Steps 3–5 cover features that are off unless you turned them on. If you have not enabled them, they are not open paths for you.

Read the effective state back from GET /v1/auth/config, which reports self_registration_enabled alongside the tenant’s enabled providers. The registration mode and floor (signup_mode, signup_default) are not part of that response — read and set them from the dashboard’s Settings page instead; the public API deliberately does not expose the mode.

Every switch on this page gates account creation. None of them gates login.

A user who already exists in the tenant signs in normally under a closed sign-up — including the first time they use a social provider, provided the email on the provider account matches theirs. Rakomi attaches the provider to the existing account instead of treating it as a new sign-up. A user who does not exist receives a signup_disabled error on the redirect instead of an account.

That is what makes the common invite-only shape work:

Provision your users up front (directory sync, CSV import, or the admin API), close every path above, and let people sign in with the identity provider your company already uses. Colleagues get in. Everyone else is refused.

Two details to get right before relying on it:

  • The match is on the email address. A staff member whose provider account uses a different address than the one you provisioned is a new user as far as Rakomi is concerned, and a closed sign-up refuses them. Provision the address they actually sign in with.
  • Provision users as email-verified. An account imported without a verified email is treated as unclaimed, so the first successful social sign-in on that address takes ownership of it. Importing as verified keeps you in control of who owns the account.

When to use an enterprise connection instead

Section titled “When to use an enterprise connection instead”

The recipe above is an allow-list by provisioning: access is bounded by the set of users you created. It is not an allow-list by domain — there is no setting that means “anyone with an @example.com address may sign up, nobody else.”

If that is what you want, use an enterprise connection (SAML or OIDC) rather than social sign-in:

  • you map your email domains to the connection, so users at those domains are routed to your identity provider;
  • new users are provisioned just-in-time on first successful sign-in, which you can further restrict to a group in your directory;
  • the boundary is enforced by your identity provider — someone outside your organisation has nothing to authenticate against at all.

It also revokes correctly: when your directory disables someone, they lose access. A rule that merely matches on the email domain does not, because the address outlives the employment.

See the SAML SSO guide to set one up.

  • They do not remove an existing user. Closing sign-up affects who can be created.
  • They do not disable a provider. A provider with allow_signup set to false stays available for login — that is the point. To take it off the sign-in screen entirely, disable the provider itself.
  • They do not apply retroactively. Accounts created before you closed sign-up remain.