Skip to content

Okta User Provisioning

The Firstup create user API allows you to integrate with SCIM-compliant providers. This SCIM-compliant data sync allows you to create one user record across multiple applications.

Overview

Create your single-user record in an external SCIM-compliant application, and sync with our API to create a Firstup user record with the same execution.

Firstup supports Just-in-Time (JIT). If your SCIM-compliant provider (e.g. an IDP like Okta) authenticates a user successfully, but they don't yet have a user account with us, Firstup automatically creates a registered user for the Employee Experience.

Review how our Create User API works before integrating.

Provision Firstup users from Okta

Use Okta lifecycle management to create, update, deactivate, and reactivate users in a Firstup program through the Firstup SCIM 2.0 User Management API.

In this configuration, Okta is the source and Firstup is the target. Assigning a person to the Okta app provisions that person in Firstup. This guide does not cover importing Firstup users into Okta or configuring SSO.

Review how the Create User API works before integrating.

There is a current known Okta provisioning error affecting groups. See Okta user group provisioning issue below.

Before you start

You need:

  • Administrator access to your Okta organization
  • A Firstup program
  • The region-specific Firstup SCIM base URL
  • A long-lived bearer token supplied by Firstup with users.read and users.write access
  • One or more users in Okta.

Region-specific SCIM base URLs

RegionSCIM base URL
US1https://partner.socialchorus.com/scim/v2
US2https://partner.us2.onfirstup.com/scim/v2
EUhttps://partner.onfirstup.eu/scim/v2

Use the Partner API URL for the program's region. Do not use an authentication host as the SCIM connector base URL. The authentication hosts (auth.socialchorus.com, auth.us2.onfirstup.com, auth.onfirstup.eu) issue tokens only and do not serve SCIM endpoints.

Add the SCIM application in Okta

Note

If you already have your Okta application, skip to configure SCIM connection.

Okta navigation varies by organization and interface version. Add or create a SCIM 2.0 app integration that supports HTTP Header authentication.

For an Okta catalog-based test integration:

  1. In the Admin Console, go to Applications and Resources > Applications.
  2. Select Browse App Catalog.
okta1.png
  1. Search for SCIM 2.0 Test App (OAuth Bearer Token).
okta2.png

Existing integrations that use SCIM 2.0 Test App (Header Auth) may also be compatible, but their token configuration differs: the API Token field must contain the complete value Bearer <access_token>. Use the OAuth Bearer Token template for new integrations unless Firstup Support advises otherwise.

  1. Select that catalog application and click Add Integration.
  2. Complete the app's general or sign-on options. These settings do not configure Firstup SSO.

Complete Sign-On Options page

If your organization uses Okta's App Integration Wizard instead, create a provisioning-capable integration and enable SCIM on its General tab before continuing.

  1. Under Sign-On Options, select Secure Web Authentication.
  2. Select User sets username and password.
okta3.png
  1. For Login URL, enter the organization’s Firstup Employee Experience URL.
  2. Set Application username format to Okta username.
  3. Set Update application username on to Create and update.
  4. Complete the application setup.

These Secure Web Authentication settings are not used to authenticate users to Firstup. They are required by the Okta catalog template only. To configure SSO, use the organization’s separate Firstup SAML or OIDC integration and follow the applicable Firstup SSO documentation.

Configure the SCIM connection

  1. Open the application's Provisioning tab.
  2. Under Integration, select Configure API Integration or Edit.
okta4.png
  1. Enable the API integration.
  2. Enter the Firstup SCIM base URL for the test program's region.
RegionSCIM base URL
US1https://partner.socialchorus.com/scim/v2
US2https://partner.us2.onfirstup.com/scim/v2
EUhttps://partner.onfirstup.eu/scim/v2
  1. Enter your access token.
  2. Disable Import Groups.
  3. Select Test the API credentials.
  4. Save the integration only after the credential test succeeds.
okta5.png

Do not paste a standard client-credentials access token into a long-lived Okta connection. Access tokens issued by the authentication server expire after two hours, which will break provisioning. When the Firstup bearer token is rotated or revoked, update the Okta integration and retest the credentials.

Enable user lifecycle actions

Onced saved, under Provisioning > To App, enable the actions required for the implementation:

  1. Select Edit and enable:
    • Create Users
    • Update User Attributes
    • Deactivate Users
  2. Select Save.
  3. Scroll down to map the user attributes.
okta6.png

Do not enable Group Push unless Firstup has confirmed that Groups SCIM is available for the program.

Okta deactivation does not permanently delete the Firstup user. Permanent deletion is a separate Firstup API operation (DELETE /scim/v2/Users/{user_id}, or POST /scim/v2/Users/{user_id}/forget for GDPR purposes) and is not part of the standard Okta deprovisioning flow.

Map the user attributes

Scroll down in Provisioning > To App, confirm these mappings before provisioning a user:

Firstup attributeRequirementFormatSCIM attributeDescription
universal_identifierRequiredStringuserNameThe user's community login. This is the same for web and mobile experience.
first_nameRecommendedStringname.givenNameThe user's name. This is recommended especially if you're bulk provisioning users.
last_nameRecommendedStringname.familyNameThe user's name. This is recommended especially if you're bulk provisioning users.
emailRecommendedStringemails.valueThe user's email address (external to Firstup). This is recommended so the user receives their community invitation.

SCIM attribute names are case-sensitive. Use the exact casing shown above.

userName collisions overwrite the existing Firstup user.

userName (universal_identifier) is the record key. If Okta provisions a user whose userName already exists in Firstup, the existing Firstup record is updated with the second person's data. No error is returned and no duplicate is created.

This happens even when the two records are entirely different people in separate Okta profiles. Two distinct Okta users sharing one userName value will collapse into a single Firstup user, and the first user's profile data is lost.

Before enabling Create Users, confirm that the Okta attribute mapped to userName is genuinely unique across every user in scope. Do not map a value that can repeat, be reused after an employee leaves, or be left blank and defaulted.

Email addresses are also enforced as unique, but they behave differently: a create request carrying an email that already belongs to a different Firstup user is rejected with 409. Okta prevents duplicate emails within Okta itself, so in practice this surfaces when Firstup holds a record that Okta does not know about — one created by CSV import, in Creator Studio, by JIT provisioning, or by a previous Okta app instance.

A user can have up to 80 attributes in total, across standard and custom attributes. Map any other supported standard attributes using the User SCIM Attributes reference.

Do not map displayName unless Firstup Support has confirmed the required use case and format. displayName is auto-generated by the application, serves a distinct purpose in the employee experience, and requires a specific format. A new user receives the member role by default when no role is supplied.

Map custom attributes / unmapped attributes (optional)

Firstup custom user attributes store additional organization-specific information that is not represented by the supported core or enterprise SCIM attributes. Firstup can use these values for audiences and other targeting features.

Use a standard Firstup SCIM attribute when one exists. Use customAttributes only for additional fields.

Custom attribute data rules

  • The Firstup extension URN is urn:SocialChorus:1.0:User. The 1.0 segment is required, and the urn: prefix is required.
  • customAttributes is an array of objects.
  • Every object requires a name and a value.
  • Attribute names and values are case-sensitive.
  • Values must be strings. Send numbers and Boolean-like values as strings, for example "25" or "false".
  • Do not send customAttributes as a Boolean, a plain object, or an array of bare strings.

Do not substitute a generic SCIM extension URN such as urn:ietf:params:scim:schemas:extension:SocialChorus:2.0:User. Firstup's user extension schema is registered as urn:SocialChorus:1.0:User, which you can confirm with GET /scim/v2/Schemas.

Payloads that send Firstup extension attributes under an unrecognized or unprefixed schema key are ignored as unknown attributes. The request can still return a success status while the custom attribute values are silently discarded.

Firstup's direct SCIM representation is:

{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:User",
    "urn:SocialChorus:1.0:User"
  ],
  "userName": "NHS10002",
  "urn:SocialChorus:1.0:User": {
    "customAttributes": [
      {
        "name": "facility",
        "value": "Northstar Health HQ"
      },
      {
        "name": "license_type",
        "value": "License B"
      }
    ]
  }
}

To inspect the schema definition directly, call:

GET /scim/v2/Schemas/urn:SocialChorus:1.0:User

Add a custom attribute to the Okta app profile

Repeat these steps for each custom attribute:

  1. In the Okta Admin Console, go to Directory > Profile Editor.
  2. Select the profile for the Firstup SCIM application, not the base Okta user profile.
  3. Select Add Attribute.
okta7.png
  1. Configure the attribute as follows:
Okta fieldValue
Data typestring
Display nameA readable label, for example Facility
Variable nameA stable Okta variable name, for example facility
External namecustomAttributes.^[name=='facility'].value
External namespaceurn:SocialChorus:1.0:User
Attribute typePersonal unless the value is intentionally group-sourced
MutabilityRead-Write

Replace facility in the External name with the exact Firstup custom-attribute name. For example:

customAttributes.^[name=='license_type'].value

The External name selects the matching item inside the customAttributes array, and the External namespace identifies the Firstup extension schema that the array belongs to.

Map the Okta source value

Once the custom attributes has been saved, select Mappings from the Profile Editor.

okta7.png
  1. Select Okta User to Firstup...
okta8.png
  1. Find your custom attribute, and select Apply mapping on user create and update.
okta9.png
  1. Enter a user in the Preview section to check the mapping.
  2. Select Save Mappings.

After making these changes, you may need to force a sync.

Custom attribute validation errors

Invalid inputExpected result
customAttributes is not an array422 Unprocessable Entity; the detail array indicates that customAttributes must be an array.
An array item is missing name422 Unprocessable Entity; the detail array indicates that name must be filled.
value is a Boolean, a number, or an object422 Unprocessable Entity. Convert supported values to strings before sending.
Attributes sent under an unrecognized schema keyThe attributes are ignored. The request may return a success status with the custom values discarded.

Firstup returns SCIM-compliant error bodies. A 422 response has this shape:

{
  "schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"],
  "status": 422,
  "detail": [
    {
      "instancePath": "/roles",
      "message": "Only one role may be provided"
    }
  ]
}

User provisioning errors and troubleshooting guide

SymptomCheck
Credential test failsConfirm the Partner API region, /scim/v2 base path, current long-lived token, and users.read/users.write access. Do not use an authentication host as the base URL.
Credentials worked, then stoppedConfirm the connection uses the long-lived token supplied by Firstup. Standard access tokens expire after two hours.
User creation returns 400Confirm that userName is present, the JSON is well formed, attribute names use the correct case, and no unsupported field values are sent.
User creation returns 403The token's user must hold a Program Manager or Administrator role, and can only create users with a role equal to or below its own.
User creation returns 409An existing Firstup user already holds that email address. Okta blocks duplicate emails within Okta, so this usually means Firstup has a record Okta does not know about, created by CSV import, in Creator Studio, by JIT provisioning, or by a previous Okta app instance. Locate and reconcile that record before retrying.
An existing Firstup user was overwritten instead of a new one being createdTwo Okta users were mapped to the same userName. userName is the record key, so a collision overwrites the existing Firstup user in place with no error. Audit the Okta attribute mapped to userName for uniqueness, then restore the affected profile from your source system.
User creation returns 422Check the detail array for a schema or business-rule validation error, such as an invalid date format, more than one role, or a malformed customAttributes array.
Standard attributes work but custom attributes do notConfirm the extension key is exactly urn:SocialChorus:1.0:User, including the urn: prefix and the 1.0 segment. Attributes sent under any other key are ignored without an error. Then confirm both Okta Profile Editor fields described above.
Unassigning a user did not delete the Firstup recordExpected. Okta deprovisioning sets active=false; it does not permanently delete the record. Use DELETE or /forget for permanent removal.
A user update removes unrelated valuesUse PATCH for partial changes. PATCH updates only the attributes supplied. PUT semantics for omitted attributes vary by program configuration, so it is not recommended for partial updates.

Testing user provisioning

  1. Assign a test user to the Firstup SCIM app in Okta.
  2. Confirm the user was created in Firstup, either in Creator Studio or with GET /scim/v2/Users.
  3. If the user was created but a custom attribute is missing, retrieve the record and check whether the value appears under urn:SocialChorus:1.0:User. A missing value with a success status indicates the attribute was sent under an unrecognized schema key.
  4. If provisioning failed, review the Okta system log and inspect the Firstup API response body.

Okta user group provisioning issue

When provisioning a group through Okta SCIM, if group members are included in the initial group creation (POST) request, Okta immediately issues a GET to confirm creation. That GET returns a 404 for 20 minutes, which breaks the sync.

This issue occurs only with Okta, not with other SCIM providers.

Workaround

  1. Create the group with the memberships box unticked.
  2. Activate the group and push members. This results in an error.
  3. Remove the group.
  4. Create the group again, without pushing users. The group must use the exact same name.
  5. Untick the memberships box.
  6. Push users.

Why this works

Okta sometimes delays marking a group as enabled when members are included in the initial POST, which causes the immediate GET to fail. Separating group creation from member assignment avoids the timing and state issue that produces the 404 errors.

External Resources