SCIM provisioning reference
The protocol surface RoundUp exposes to an identity provider — for the person configuring a connector, or reviewing one.
At a glance
| Protocol | SCIM 2.0 — RFC 7643 (schema), RFC 7644 (protocol) |
| Role | Service provider (server). RoundUp never acts as a SCIM client. |
| Resources | User only. No Group resource. |
| Authentication | HTTP Bearer token, issued per center |
| Tenancy | One center per token. The token names the center it provisions. |
| Content type | application/scim+json |
Endpoints
Each identity provider has its own base path. A center's token is only valid on the base path of the provider that issued it.
| Provider | SCIM base URL |
|---|---|
| JumpCloud | https://ihzk9riq55.execute-api.us-west-2.amazonaws.com/integrations/jumpcloud/scim/v2 |
| Okta | https://ihzk9riq55.execute-api.us-west-2.amazonaws.com/integrations/okta/scim/v2 |
Discovery endpoints are served on each base path and require the same credential as any other call: /ServiceProviderConfig, /ResourceTypes, /Schemas.
Authentication
Every request carries Authorization: Bearer <token>. The token is an HMAC-signed assertion of a single center's identifier, so each request resolves its own tenant with no shared credential store to look anything up in.
Tokens are minted fresh each time a director opens the provisioning screen rather than stored, so re-reading that screen is how a token pasted somewhere wrong gets rotated. A token is scoped to one center and one provider; it cannot reach another center's records.
There is no OAuth flow on the JumpCloud path — no authorization endpoint, no token endpoint, no client credentials. ServiceProviderConfig reports the scheme as oauthbearertoken, which is SCIM's name for bearer-token authentication, not an indication that OAuth is in use.
Supported operations
| Method | Path | Behaviour |
|---|---|---|
GET | /Users | List. Supports filter, startIndex, count. |
POST | /Users | Create. 409 uniqueness if the userName already exists for this provider at this center. |
GET | /Users/{id} | Read. |
PUT | /Users/{id} | Replace. |
PATCH | /Users/{id} | Modify. This is how active is usually toggled. |
DELETE | /Users/{id} | Remove, with the same effect as active: false. |
ServiceProviderConfig
| Capability | Supported |
|---|---|
| patch | Yes |
| filter | Yes — maxResults 200 |
| bulk | No |
| sort | No |
| etag | No |
| changePassword | No |
User attributes
Required. userName — the only hard requirement. A create without it, and without a primary entry in emails, returns 400 invalidValue.
Whatever occupies userName must be an email address, because that is how a provisioned user is matched to a RoundUp staff account. A non-email userName with no emails array creates a SCIM record that never becomes a staff account — a silent half-success worth avoiding.
| Attribute | Handling |
|---|---|
userName | Stored. The identifier; falls back to the primary email. |
emails | Stored. Synthesized from userName when that is an address. |
name | Stored. givenName and familyName populate the staff record. |
displayName | Stored and returned; not mapped into RoundUp. |
active | Stored, defaults true. Drives deactivation. |
externalId | Stored when sent. |
Everything else is discarded — not stored, and absent from the read-back. That includes phoneNumbers, addresses, title, userType, locale, timezone, photos, ims, nickName, profileUrl and preferredLanguage. A connector that writes one of these and reads it back will not find it.
No attribute sets a RoundUp access level. Provisioned staff arrive at the lowest level and are promoted inside the app by someone who already holds that access. title and userType are deliberately ignored so that editing a title field in a directory cannot grant access to children's records. See Roles and permissions.
Deactivation
Setting active to false — or issuing a DELETE — disassociates the person from that center:
- their membership of the center is removed, ending access to rosters, family contacts, photos, messages and billing;
- live sessions are revoked, including on a shared classroom tablet;
- their identity record and any memberships at other centers are left intact;
- their history stays and stays attributed — incident reports, check-ins and medication logs are licensing records the center must keep.
It is not a delete, a soft delete, a suspension or a lock. Nothing is retained in a blocked state, and there is no unlock path — re-provisioning creates the membership again.
The center owner cannot be deprovisioned over SCIM; that request is refused with 400, so removing the wrong person in a directory cannot lock a center out of its own account.
Errors
| Status | scimType | Meaning |
|---|---|---|
400 | invalidValue | Missing userName and no usable email. |
401 | — | Missing, malformed or unverifiable bearer token. |
403 | — | Provisioning is not available for this center (brand restriction). |
404 | — | No such user. |
405 | — | Method not allowed on that resource. |
409 | uniqueness | That userName already exists for this provider at this center. |
500 | — | Provisioning is not configured on our side. |
Uniqueness is scoped per provider, not per center: a staff member already provisioned by a different directory does not make this one's create fail. A connector reads a 409 as "provisioning is broken" and stops, so the scope matters.
Limits and omissions
- No Group resource. Assigning a directory group to the application still scopes who is provisioned — the group itself is simply not created as a resource here.
- No password syncing. A
passwordattribute is discarded. RoundUp passwords are set by the staff member through their own invitation and cannot be read or set by anyone else. - No bulk, sort or ETag support.
- Filtering returns at most 200 results per page.
This page is the protocol reference. For step-by-step configuration see Connect JumpCloud or Connect Okta.
More: All director guides