Leave paid directory brokers behind. 0Trust is an open control plane with bidirectional SCIM 2.0 for Users and Groups, plus a built-in application gallery comparable to Entra and Okta.
Commercial IdPs sell you the same RFC 7643/7644 protocol wrapped in seat licenses, app catalog surcharges, and outbound connectors you cannot audit. 0Trust implements SCIM as open infrastructure on your plane:
Inbound /scim/v2 for Users and Groups (Bearer) plus outbound push to each gallery/catalog app when access is assigned.
Bind any SCIM 2.0 endpoint and token on a catalog app. Provisioning is part of the control plane, not a SKU.
Passkeys, OIDC clients, ZTNA, and directory live together — one operator surface at 0trust.cloud.
Hosted issuer for most teams; container self-host via tunneltug.com/hub when you need the stack on your metal.
Upstream systems — Okta, Entra ID, Google, Auth0, Ping, OneLogin, JumpCloud, Workday connectors, or a temporary dual-run from another IdP — push Users and Groups to:
https://0trust.cloud/scim/v2 Content-Type: application/scim+json Authorization: Bearer
Supported resources: User and Group (create, read, replace, patch, delete, filtered list, member ops). Auth scheme: OAuth Bearer token generated and rotated in the SCIM console.
When an operator assigns a user to a catalog app (or queues a manual provision), 0Trust POSTs a SCIM User to that app's endpoint:
POST {scim_endpoint}/Users
Authorization: Bearer {app scim_token}
Content-Type: application/scim+json
{
\"schemas\": [\"urn:ietf:params:scim:schemas:core:2.0:User\"],
\"userName\": \"\",
\"active\": true,
\"name\": { \"givenName\": \"...\", \"familyName\": \"...\" }
} Configure per app in SCIM Console → Outbound Integration (scim_endpoint + scim_token).
| Role | Paid provider today | After 0Trust |
|---|---|---|
| SSO / OIDC issuer | Okta / Entra / Auth0 | 0trust.cloud |
| Inbound directory | HR → paid IdP | HR or paid IdP → 0Trust /scim/v2 |
| Outbound app SCIM | Paid IdP connectors | 0Trust catalog apps |
| Access policy | IdP groups / rules | IAM assignments + RBAC/ABAC |
Keep mappings simple so dual-run stays deterministic. Required outbound identity attribute: email (maps to userName).
| SCIM (RFC) | 0Trust identity | Notes |
|---|---|---|
userName | Username / email | Required; uniqueness enforced inbound |
emails[primary].value | Primary email preferred | |
name.givenName | given_name | Outbound optional |
name.familyName | family_name | Outbound optional |
displayName | Display name | Inbound; falls back to given+family |
active | Enabled / status | false deprovisions access path |
externalId | SCIM external link | Preserve during import for idempotent re-sync |
Patterns below assume you want 0Trust as the long-term IdP. Adjust if you only need 0Trust as a SCIM spoke.
https://0trust.cloud/scim/v2 with the Bearer token./scim/v2 (tenant URL + secret token).userPrincipalName or mail → userName; map given/surname; set active from accountEnabled.externalId if the source can send a stable employee id.Comparable to the Microsoft Entra gallery and Okta Integration Network: prebuilt SCIM tiles with setup steps, attribute maps, and Users/Groups flags.
Browse and install from the operator console at /scim or via GET /api/v1/scim/catalog.
| Category | Examples |
|---|---|
| Identity sources | Entra ID, Okta, Google Workspace, Auth0, Ping, OneLogin, JumpCloud |
| HR / IGA | SailPoint, Workday (via bridge) |
| Target apps | Slack, GitHub, Salesforce, Atlassian, Zoom, Box, Dropbox, ServiceNow, AWS IAM Identity Center, Datadog |
| Generic | Custom SCIM 2.0 app tile |
Install creates/updates an IAM catalog app with catalog_id, scim_supports_groups, and endpoint template — then set a concrete Bearer token for outbound targets.
Submit a company registration at /start. After approval, complete passkey enrollment and sign in to the operator plane.
Open /scim → Inbound Server. Enable inbound, generate a Bearer token (shown once), and store it in your secret manager. Base path: /scim/v2.
curl -sS -H \"Authorization: Bearer $TOKEN\" -H \"Content-Type: application/scim+json\" \\
https://0trust.cloud/scim/v2/ServiceProviderConfig
curl -sS -X POST -H \"Authorization: Bearer $TOKEN\" -H \"Content-Type: application/scim+json\" \\
https://0trust.cloud/scim/v2/Users \\
-d '{\"schemas\":[\"urn:ietf:params:scim:schemas:core:2.0:User\"],\"userName\":\"pilot@example.com\",\"name\":{\"givenName\":\"Pilot\",\"familyName\":\"User\"},\"emails\":[{\"value\":\"pilot@example.com\",\"primary\":true}],\"active\":true}'In IAM, ensure each SaaS app exists in the catalog. In SCIM Console → Outbound Integration, set scim_endpoint (vendor SCIM base, no trailing /Users) and scim_token. Assign a pilot user and confirm the vendor received the User.
Create OIDC clients (or use existing app faces) with issuer https://0trust.cloud. Update redirect URIs on the SaaS side. Prefer passkeys for operators; keep enrollment invites for end users.
Do not flip every app on day one. Run paid provider and 0Trust in parallel until reconciliation is boring.
userName/externalId sets against the paid provider export. Prefer soft-deactivate (active: false) before hard DELETE until you trust reverse sync.| Done | Item |
|---|---|
| ☐ | Company approved; admin passkey enrolled |
| ☐ | Inbound SCIM enabled; token stored offline; rotate plan documented |
| ☐ | ServiceProviderConfig / Users smoke tests green |
| ☐ | Attribute map reviewed with HR/IT (email uniqueness) |
| ☐ | Pilot cohort synced inbound; no unexpected duplicates |
| ☐ | Each critical SaaS app has catalog entry + outbound SCIM |
| ☐ | Pilot assign → vendor user created; deprovision path tested |
| ☐ | OIDC issuer switched for pilot apps; JWKS validated |
| ☐ | Group/role → policy grants mapped (manual or workflow) |
| ☐ | Break-glass admin path independent of paid IdP |
| ☐ | Paid provider provisioning jobs disabled |
| ☐ | Tokens revoked; licenses cancelled; runbook updated |
https://0trust.cloud.GET /scim/v2/ServiceProviderConfig
GET /scim/v2/ResourceTypes
GET /scim/v2/Schemas
GET /scim/v2/Users
POST /scim/v2/Users
GET /scim/v2/Users/{id}
PUT /scim/v2/Users/{id}
PATCH /scim/v2/Users/{id}
DELETE /scim/v2/Users/{id}
GET/POST /scim/v2/Groups
GET/PUT/PATCH/DELETE /scim/v2/Groups/{id}
GET /api/v1/scim/catalog
POST /api/v1/scim/catalog/{id}/installGET /api/v1/scim/status
GET /api/v1/scim/config
GET /api/v1/scim/inbound
PUT /api/v1/scim/inbound
GET /api/v1/scim/integrations
PUT /api/v1/scim/integrations/{app_id}
POST /api/v1/scim/provision
GET /api/v1/scim/auditOperators manage tokens and integrations in the SCIM Console. Developers integrating OIDC stay on 0trust.codes docs.