Skip to main content

SCIM API

frugally.app supports the SCIM 2.0 standard for automated user and group provisioning. Use SCIM to keep your frugally.app team membership in sync with your identity provider (IdP) — such as Okta, Azure AD, or OneLogin.

For general API conventions, see the API Reference Overview. For SCIM setup instructions, see SCIM Provisioning.

Enterprise feature

SCIM provisioning is available on the Enterprise plan only.


Base URL

https://api.frugally.app/scim/v2

Authentication

SCIM requests use a Bearer token generated in the frugally.app dashboard:

Authorization: Bearer <scim-token>

Generate a SCIM token at Settings > SSO & Provisioning > SCIM Token.


Supported resources

ResourceEndpointOperations
Users/scim/v2/UsersCreate, Read, Update, Deactivate, List
Groups/scim/v2/GroupsCreate, Read, Update, Delete, List

Users

List users

GET /scim/v2/Users

Query parameters:

ParameterTypeDescription
filterstringSCIM filter expression (e.g. userName eq "alice@example.com")
startIndexinteger1-based pagination start (default: 1)
countintegerResults per page (default: 25, max: 100)

Example response:

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
"totalResults": 42,
"startIndex": 1,
"itemsPerPage": 25,
"Resources": [
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"id": "user_abc123",
"userName": "alice@example.com",
"name": {
"givenName": "Alice",
"familyName": "Smith"
},
"emails": [
{ "value": "alice@example.com", "primary": true }
],
"active": true,
"groups": [
{ "value": "group_xyz", "display": "Engineering" }
],
"meta": {
"resourceType": "User",
"created": "2025-01-10T09:00:00Z",
"lastModified": "2025-02-15T14:30:00Z"
}
}
]
}

Get a user

GET /scim/v2/Users/:id

Create a user

POST /scim/v2/Users

Request body:

{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"userName": "bob@example.com",
"name": {
"givenName": "Bob",
"familyName": "Jones"
},
"emails": [
{ "value": "bob@example.com", "primary": true }
],
"active": true
}

When a user is created via SCIM, frugally.app sends a welcome email and assigns the default role configured in team settings.

Update a user

PUT /scim/v2/Users/:id

Full replacement of the user resource. Include all fields — omitted fields are reset to defaults.

Patch a user

PATCH /scim/v2/Users/:id

Request body:

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"path": "name.givenName",
"value": "Robert"
}
]
}

Deactivate a user

To deactivate (soft-delete) a user, set active to false:

PATCH /scim/v2/Users/:id
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"path": "active",
"value": false
}
]
}

Deactivated users lose access to the dashboard and API but their data is retained.


Groups

List groups

GET /scim/v2/Groups

Query parameters:

ParameterTypeDescription
filterstringSCIM filter expression (e.g. displayName eq "Engineering")
startIndexinteger1-based pagination start
countintegerResults per page

Example response:

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
"totalResults": 5,
"startIndex": 1,
"itemsPerPage": 25,
"Resources": [
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
"id": "group_xyz",
"displayName": "Engineering",
"members": [
{ "value": "user_abc123", "display": "alice@example.com" },
{ "value": "user_def456", "display": "bob@example.com" }
],
"meta": {
"resourceType": "Group",
"created": "2025-01-05T08:00:00Z",
"lastModified": "2025-02-20T11:15:00Z"
}
}
]
}

Get a group

GET /scim/v2/Groups/:id

Create a group

POST /scim/v2/Groups

Request body:

{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
"displayName": "Platform Team",
"members": [
{ "value": "user_abc123" }
]
}

Groups created via SCIM are mapped to frugally.app Groups, inheriting the same scope and notification policies.

Update a group

PUT /scim/v2/Groups/:id

Patch a group (add/remove members)

PATCH /scim/v2/Groups/:id

Add members:

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "add",
"path": "members",
"value": [{ "value": "user_ghi789" }]
}
]
}

Remove members:

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "remove",
"path": "members[value eq \"user_ghi789\"]"
}
]
}

Delete a group

DELETE /scim/v2/Groups/:id

Supported SCIM filters

FilterExample
eq (equals)userName eq "alice@example.com"
co (contains)userName co "example.com"
sw (starts with)name.familyName sw "Sm"

Multiple filters can be combined with and:

filter=userName co "example.com" and active eq true

Error responses

SCIM errors follow the SCIM 2.0 error schema:

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"],
"status": "409",
"scimType": "uniqueness",
"detail": "A user with userName bob@example.com already exists."
}
StatusscimTypeMeaning
400invalidFilterThe filter expression is malformed
400invalidValueA required field is missing or has an invalid value
401Invalid or expired SCIM token
404Resource not found
409uniquenessA resource with the same unique attribute already exists

IdP configuration guides

For step-by-step setup with your identity provider, see SCIM Provisioning.