Create a user
curl --request POST \
--url https://api.onecli.sh/scim/v2/Users \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/scim+json' \
--data '
{
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"id": "<string>",
"userName": "<string>",
"displayName": "<string>",
"name": {
"givenName": "<string>",
"familyName": "<string>",
"formatted": "<string>"
},
"emails": [
{
"value": "<string>",
"primary": true
}
],
"active": true,
"meta": {
"resourceType": "<string>",
"created": "<string>",
"lastModified": "<string>",
"location": "<string>"
}
}
'import requests
url = "https://api.onecli.sh/scim/v2/Users"
payload = {
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"id": "<string>",
"userName": "<string>",
"displayName": "<string>",
"name": {
"givenName": "<string>",
"familyName": "<string>",
"formatted": "<string>"
},
"emails": [
{
"value": "<string>",
"primary": True
}
],
"active": True,
"meta": {
"resourceType": "<string>",
"created": "<string>",
"lastModified": "<string>",
"location": "<string>"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/scim+json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/scim+json'},
body: JSON.stringify({
schemas: ['urn:ietf:params:scim:schemas:core:2.0:User'],
id: '<string>',
userName: '<string>',
displayName: '<string>',
name: {givenName: '<string>', familyName: '<string>', formatted: '<string>'},
emails: [{value: '<string>', primary: true}],
active: true,
meta: {
resourceType: '<string>',
created: '<string>',
lastModified: '<string>',
location: '<string>'
}
})
};
fetch('https://api.onecli.sh/scim/v2/Users', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.onecli.sh/scim/v2/Users",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'schemas' => [
'urn:ietf:params:scim:schemas:core:2.0:User'
],
'id' => '<string>',
'userName' => '<string>',
'displayName' => '<string>',
'name' => [
'givenName' => '<string>',
'familyName' => '<string>',
'formatted' => '<string>'
],
'emails' => [
[
'value' => '<string>',
'primary' => true
]
],
'active' => true,
'meta' => [
'resourceType' => '<string>',
'created' => '<string>',
'lastModified' => '<string>',
'location' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/scim+json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.onecli.sh/scim/v2/Users"
payload := strings.NewReader("{\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:User\"\n ],\n \"id\": \"<string>\",\n \"userName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"name\": {\n \"givenName\": \"<string>\",\n \"familyName\": \"<string>\",\n \"formatted\": \"<string>\"\n },\n \"emails\": [\n {\n \"value\": \"<string>\",\n \"primary\": true\n }\n ],\n \"active\": true,\n \"meta\": {\n \"resourceType\": \"<string>\",\n \"created\": \"<string>\",\n \"lastModified\": \"<string>\",\n \"location\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/scim+json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.onecli.sh/scim/v2/Users")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/scim+json")
.body("{\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:User\"\n ],\n \"id\": \"<string>\",\n \"userName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"name\": {\n \"givenName\": \"<string>\",\n \"familyName\": \"<string>\",\n \"formatted\": \"<string>\"\n },\n \"emails\": [\n {\n \"value\": \"<string>\",\n \"primary\": true\n }\n ],\n \"active\": true,\n \"meta\": {\n \"resourceType\": \"<string>\",\n \"created\": \"<string>\",\n \"lastModified\": \"<string>\",\n \"location\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.onecli.sh/scim/v2/Users")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/scim+json'
request.body = "{\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:User\"\n ],\n \"id\": \"<string>\",\n \"userName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"name\": {\n \"givenName\": \"<string>\",\n \"familyName\": \"<string>\",\n \"formatted\": \"<string>\"\n },\n \"emails\": [\n {\n \"value\": \"<string>\",\n \"primary\": true\n }\n ],\n \"active\": true,\n \"meta\": {\n \"resourceType\": \"<string>\",\n \"created\": \"<string>\",\n \"lastModified\": \"<string>\",\n \"location\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"id": "<string>",
"userName": "<string>",
"displayName": "<string>",
"name": {
"givenName": "<string>",
"familyName": "<string>",
"formatted": "<string>"
},
"emails": [
{
"value": "<string>",
"primary": true
}
],
"active": true,
"meta": {
"resourceType": "<string>",
"created": "<string>",
"lastModified": "<string>",
"location": "<string>"
}
}{
"schemas": [
"urn:ietf:params:scim:api:messages:2.0:Error"
],
"status": "<string>",
"scimType": "<string>",
"detail": "<string>"
}{
"schemas": [
"urn:ietf:params:scim:api:messages:2.0:Error"
],
"status": "<string>",
"scimType": "<string>",
"detail": "<string>"
}SCIM 2.0
Create a user via SCIM provisioning
Creates an organization member from your identity provider, and the user too when new. The SCIM userName is the email. Returns 409 for a duplicate.
POST
/
Users
Create a user
curl --request POST \
--url https://api.onecli.sh/scim/v2/Users \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/scim+json' \
--data '
{
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"id": "<string>",
"userName": "<string>",
"displayName": "<string>",
"name": {
"givenName": "<string>",
"familyName": "<string>",
"formatted": "<string>"
},
"emails": [
{
"value": "<string>",
"primary": true
}
],
"active": true,
"meta": {
"resourceType": "<string>",
"created": "<string>",
"lastModified": "<string>",
"location": "<string>"
}
}
'import requests
url = "https://api.onecli.sh/scim/v2/Users"
payload = {
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"id": "<string>",
"userName": "<string>",
"displayName": "<string>",
"name": {
"givenName": "<string>",
"familyName": "<string>",
"formatted": "<string>"
},
"emails": [
{
"value": "<string>",
"primary": True
}
],
"active": True,
"meta": {
"resourceType": "<string>",
"created": "<string>",
"lastModified": "<string>",
"location": "<string>"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/scim+json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/scim+json'},
body: JSON.stringify({
schemas: ['urn:ietf:params:scim:schemas:core:2.0:User'],
id: '<string>',
userName: '<string>',
displayName: '<string>',
name: {givenName: '<string>', familyName: '<string>', formatted: '<string>'},
emails: [{value: '<string>', primary: true}],
active: true,
meta: {
resourceType: '<string>',
created: '<string>',
lastModified: '<string>',
location: '<string>'
}
})
};
fetch('https://api.onecli.sh/scim/v2/Users', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.onecli.sh/scim/v2/Users",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'schemas' => [
'urn:ietf:params:scim:schemas:core:2.0:User'
],
'id' => '<string>',
'userName' => '<string>',
'displayName' => '<string>',
'name' => [
'givenName' => '<string>',
'familyName' => '<string>',
'formatted' => '<string>'
],
'emails' => [
[
'value' => '<string>',
'primary' => true
]
],
'active' => true,
'meta' => [
'resourceType' => '<string>',
'created' => '<string>',
'lastModified' => '<string>',
'location' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/scim+json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.onecli.sh/scim/v2/Users"
payload := strings.NewReader("{\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:User\"\n ],\n \"id\": \"<string>\",\n \"userName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"name\": {\n \"givenName\": \"<string>\",\n \"familyName\": \"<string>\",\n \"formatted\": \"<string>\"\n },\n \"emails\": [\n {\n \"value\": \"<string>\",\n \"primary\": true\n }\n ],\n \"active\": true,\n \"meta\": {\n \"resourceType\": \"<string>\",\n \"created\": \"<string>\",\n \"lastModified\": \"<string>\",\n \"location\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/scim+json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.onecli.sh/scim/v2/Users")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/scim+json")
.body("{\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:User\"\n ],\n \"id\": \"<string>\",\n \"userName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"name\": {\n \"givenName\": \"<string>\",\n \"familyName\": \"<string>\",\n \"formatted\": \"<string>\"\n },\n \"emails\": [\n {\n \"value\": \"<string>\",\n \"primary\": true\n }\n ],\n \"active\": true,\n \"meta\": {\n \"resourceType\": \"<string>\",\n \"created\": \"<string>\",\n \"lastModified\": \"<string>\",\n \"location\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.onecli.sh/scim/v2/Users")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/scim+json'
request.body = "{\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:User\"\n ],\n \"id\": \"<string>\",\n \"userName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"name\": {\n \"givenName\": \"<string>\",\n \"familyName\": \"<string>\",\n \"formatted\": \"<string>\"\n },\n \"emails\": [\n {\n \"value\": \"<string>\",\n \"primary\": true\n }\n ],\n \"active\": true,\n \"meta\": {\n \"resourceType\": \"<string>\",\n \"created\": \"<string>\",\n \"lastModified\": \"<string>\",\n \"location\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"id": "<string>",
"userName": "<string>",
"displayName": "<string>",
"name": {
"givenName": "<string>",
"familyName": "<string>",
"formatted": "<string>"
},
"emails": [
{
"value": "<string>",
"primary": true
}
],
"active": true,
"meta": {
"resourceType": "<string>",
"created": "<string>",
"lastModified": "<string>",
"location": "<string>"
}
}{
"schemas": [
"urn:ietf:params:scim:api:messages:2.0:Error"
],
"status": "<string>",
"scimType": "<string>",
"detail": "<string>"
}{
"schemas": [
"urn:ietf:params:scim:api:messages:2.0:Error"
],
"status": "<string>",
"scimType": "<string>",
"detail": "<string>"
}Creates an organization member, and the user account when the email is new, from your identity provider.
userName is the email address. Most teams let Okta or Entra ID call this, after you create a SCIM token.
Creates the member (and the user, when new). userName is the email.
Availability: Cloud · Enterprise (self-hosted). The SCIM endpoint answers
401 on an unlicensed self-hosted deployment.SCIM lives on its own base URL:
https://api.onecli.sh/scim/v2 on Cloud, http://localhost:10254/scim/v2 self-hosted. It authenticates with a SCIM token (oc_scim_…, minted at POST /org/scim/tokens), never a OneCLI API key, and speaks application/scim+json per RFC 7644. Each token is rate-limited to 600 requests per minute.Authorizations
A workspace API key (oc_…) or organization API key (oc_org_…). Workspace-scoped endpoints called with an organization key also need X-Workspace-Id.
Body
application/scim+json
RFC 7643 User. OneCLI maps userName and emails[0] to the member's email, displayName (or name) to the display name, and active to the membership status (false = suspended). Group membership is managed through /Groups.
Response
The User
RFC 7643 User. OneCLI maps userName and emails[0] to the member's email, displayName (or name) to the display name, and active to the membership status (false = suspended). Group membership is managed through /Groups.