curl --request POST \
--url https://prod.skillsdbnext.com/api/v1/people \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "Dana",
"lastName": "Reviewer",
"email": "dana@example.com",
"accessLevel": "basic",
"externalId": "EMP-0042",
"managerEmail": "lead@example.com",
"jobTitleId": "12",
"peopleTypeId": "3",
"countryId": "231",
"businessPhone": "+1 555 0100",
"mobilePhone": "+1 555 0101",
"homePhone": "+1 555 0102",
"address": "12 Foundry Rd",
"city": "Springfield",
"stateProvince": "IL",
"postalCode": "62704",
"webPage": "https://example.com",
"externalCompanyName": "Acme Contracting",
"nextAvailableDate": "2026-04-01T00:00:00.000Z",
"careerIds": [
"18"
],
"learningIds": [
"7"
]
}
'import requests
url = "https://prod.skillsdbnext.com/api/v1/people"
payload = {
"firstName": "Dana",
"lastName": "Reviewer",
"email": "dana@example.com",
"accessLevel": "basic",
"externalId": "EMP-0042",
"managerEmail": "lead@example.com",
"jobTitleId": "12",
"peopleTypeId": "3",
"countryId": "231",
"businessPhone": "+1 555 0100",
"mobilePhone": "+1 555 0101",
"homePhone": "+1 555 0102",
"address": "12 Foundry Rd",
"city": "Springfield",
"stateProvince": "IL",
"postalCode": "62704",
"webPage": "https://example.com",
"externalCompanyName": "Acme Contracting",
"nextAvailableDate": "2026-04-01T00:00:00.000Z",
"careerIds": ["18"],
"learningIds": ["7"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
firstName: 'Dana',
lastName: 'Reviewer',
email: 'dana@example.com',
accessLevel: 'basic',
externalId: 'EMP-0042',
managerEmail: 'lead@example.com',
jobTitleId: '12',
peopleTypeId: '3',
countryId: '231',
businessPhone: '+1 555 0100',
mobilePhone: '+1 555 0101',
homePhone: '+1 555 0102',
address: '12 Foundry Rd',
city: 'Springfield',
stateProvince: 'IL',
postalCode: '62704',
webPage: 'https://example.com',
externalCompanyName: 'Acme Contracting',
nextAvailableDate: '2026-04-01T00:00:00.000Z',
careerIds: ['18'],
learningIds: ['7']
})
};
fetch('https://prod.skillsdbnext.com/api/v1/people', 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://prod.skillsdbnext.com/api/v1/people",
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([
'firstName' => 'Dana',
'lastName' => 'Reviewer',
'email' => 'dana@example.com',
'accessLevel' => 'basic',
'externalId' => 'EMP-0042',
'managerEmail' => 'lead@example.com',
'jobTitleId' => '12',
'peopleTypeId' => '3',
'countryId' => '231',
'businessPhone' => '+1 555 0100',
'mobilePhone' => '+1 555 0101',
'homePhone' => '+1 555 0102',
'address' => '12 Foundry Rd',
'city' => 'Springfield',
'stateProvince' => 'IL',
'postalCode' => '62704',
'webPage' => 'https://example.com',
'externalCompanyName' => 'Acme Contracting',
'nextAvailableDate' => '2026-04-01T00:00:00.000Z',
'careerIds' => [
'18'
],
'learningIds' => [
'7'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/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://prod.skillsdbnext.com/api/v1/people"
payload := strings.NewReader("{\n \"firstName\": \"Dana\",\n \"lastName\": \"Reviewer\",\n \"email\": \"dana@example.com\",\n \"accessLevel\": \"basic\",\n \"externalId\": \"EMP-0042\",\n \"managerEmail\": \"lead@example.com\",\n \"jobTitleId\": \"12\",\n \"peopleTypeId\": \"3\",\n \"countryId\": \"231\",\n \"businessPhone\": \"+1 555 0100\",\n \"mobilePhone\": \"+1 555 0101\",\n \"homePhone\": \"+1 555 0102\",\n \"address\": \"12 Foundry Rd\",\n \"city\": \"Springfield\",\n \"stateProvince\": \"IL\",\n \"postalCode\": \"62704\",\n \"webPage\": \"https://example.com\",\n \"externalCompanyName\": \"Acme Contracting\",\n \"nextAvailableDate\": \"2026-04-01T00:00:00.000Z\",\n \"careerIds\": [\n \"18\"\n ],\n \"learningIds\": [\n \"7\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/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://prod.skillsdbnext.com/api/v1/people")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"firstName\": \"Dana\",\n \"lastName\": \"Reviewer\",\n \"email\": \"dana@example.com\",\n \"accessLevel\": \"basic\",\n \"externalId\": \"EMP-0042\",\n \"managerEmail\": \"lead@example.com\",\n \"jobTitleId\": \"12\",\n \"peopleTypeId\": \"3\",\n \"countryId\": \"231\",\n \"businessPhone\": \"+1 555 0100\",\n \"mobilePhone\": \"+1 555 0101\",\n \"homePhone\": \"+1 555 0102\",\n \"address\": \"12 Foundry Rd\",\n \"city\": \"Springfield\",\n \"stateProvince\": \"IL\",\n \"postalCode\": \"62704\",\n \"webPage\": \"https://example.com\",\n \"externalCompanyName\": \"Acme Contracting\",\n \"nextAvailableDate\": \"2026-04-01T00:00:00.000Z\",\n \"careerIds\": [\n \"18\"\n ],\n \"learningIds\": [\n \"7\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://prod.skillsdbnext.com/api/v1/people")
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/json'
request.body = "{\n \"firstName\": \"Dana\",\n \"lastName\": \"Reviewer\",\n \"email\": \"dana@example.com\",\n \"accessLevel\": \"basic\",\n \"externalId\": \"EMP-0042\",\n \"managerEmail\": \"lead@example.com\",\n \"jobTitleId\": \"12\",\n \"peopleTypeId\": \"3\",\n \"countryId\": \"231\",\n \"businessPhone\": \"+1 555 0100\",\n \"mobilePhone\": \"+1 555 0101\",\n \"homePhone\": \"+1 555 0102\",\n \"address\": \"12 Foundry Rd\",\n \"city\": \"Springfield\",\n \"stateProvince\": \"IL\",\n \"postalCode\": \"62704\",\n \"webPage\": \"https://example.com\",\n \"externalCompanyName\": \"Acme Contracting\",\n \"nextAvailableDate\": \"2026-04-01T00:00:00.000Z\",\n \"careerIds\": [\n \"18\"\n ],\n \"learningIds\": [\n \"7\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "91",
"externalId": "EMP-0042",
"firstName": "Dana",
"lastName": "Reviewer",
"email": "dana@example.com",
"accessLevel": {
"slug": "admin",
"name": "Admin",
"isAssignable": true
},
"manager": {
"id": "42",
"name": "Welding"
},
"isActive": true,
"jobTitle": {
"id": "42",
"name": "Welding"
},
"peopleType": {
"id": "42",
"name": "Welding",
"expiresAt": "2026-12-31T00:00:00.000Z"
},
"orgSchema": {
"businessUnits": [
{
"id": "42",
"name": "Welding"
}
],
"divisions": [
{
"id": "42",
"name": "Welding"
}
],
"businessRegions": [
{
"id": "42",
"name": "Welding"
}
],
"countries": [
{
"id": "42",
"name": "Welding"
}
],
"states": [
{
"id": "42",
"name": "Welding"
}
],
"cities": [
{
"id": "42",
"name": "Welding"
}
],
"sites": [
{
"id": "42",
"name": "Welding"
}
],
"buildings": [
{
"id": "42",
"name": "Welding"
}
],
"departments": [
{
"id": "42",
"name": "Welding"
}
],
"teams": [
{
"id": "42",
"name": "Welding"
}
],
"shifts": [
{
"id": "42",
"name": "Welding"
}
]
},
"businessPhone": "+1 555 0100",
"mobilePhone": "+1 555 0101",
"homePhone": "+1 555 0102",
"address": "12 Foundry Rd",
"city": "Springfield",
"stateProvince": "IL",
"postalCode": "62704",
"country": {
"id": "42",
"name": "Welding"
},
"webPage": "https://example.com",
"externalCompanyName": "Acme Contracting",
"nextAvailableDate": "2026-04-01T00:00:00.000Z",
"inactiveAt": null,
"createdAt": "2026-01-12T08:30:00.000Z",
"createdById": "88",
"updatedAt": "2026-03-02T14:00:00.000Z",
"updatedById": "88"
}
}{
"type": "https://help.skillsdb.com/api-docs/errors/validation-error",
"title": "Validation failed",
"status": 400,
"detail": "limit must be between 1 and 200",
"instance": "/api/v1/people",
"requestId": "0192c2f1-6f4e-7ab3-b1c4-5f6a7b8c9d0e",
"errors": [
{
"field": "email",
"code": "max_length",
"message": "email must be shorter than or equal to 75 characters"
}
],
"error": "trial_expired",
"upgrade_url": "https://app.skillsdb.com/settings/billing"
}{
"type": "https://help.skillsdb.com/api-docs/errors/validation-error",
"title": "Validation failed",
"status": 400,
"detail": "limit must be between 1 and 200",
"instance": "/api/v1/people",
"requestId": "0192c2f1-6f4e-7ab3-b1c4-5f6a7b8c9d0e",
"errors": [
{
"field": "email",
"code": "max_length",
"message": "email must be shorter than or equal to 75 characters"
}
],
"error": "trial_expired",
"upgrade_url": "https://app.skillsdb.com/settings/billing"
}{
"type": "https://help.skillsdb.com/api-docs/errors/validation-error",
"title": "Validation failed",
"status": 400,
"detail": "limit must be between 1 and 200",
"instance": "/api/v1/people",
"requestId": "0192c2f1-6f4e-7ab3-b1c4-5f6a7b8c9d0e",
"errors": [
{
"field": "email",
"code": "max_length",
"message": "email must be shorter than or equal to 75 characters"
}
],
"error": "trial_expired",
"upgrade_url": "https://app.skillsdb.com/settings/billing"
}{
"type": "https://help.skillsdb.com/api-docs/errors/validation-error",
"title": "Validation failed",
"status": 400,
"detail": "limit must be between 1 and 200",
"instance": "/api/v1/people",
"requestId": "0192c2f1-6f4e-7ab3-b1c4-5f6a7b8c9d0e",
"errors": [
{
"field": "email",
"code": "max_length",
"message": "email must be shorter than or equal to 75 characters"
}
],
"error": "trial_expired",
"upgrade_url": "https://app.skillsdb.com/settings/billing"
}{
"type": "https://help.skillsdb.com/api-docs/errors/validation-error",
"title": "Validation failed",
"status": 400,
"detail": "limit must be between 1 and 200",
"instance": "/api/v1/people",
"requestId": "0192c2f1-6f4e-7ab3-b1c4-5f6a7b8c9d0e",
"errors": [
{
"field": "email",
"code": "max_length",
"message": "email must be shorter than or equal to 75 characters"
}
],
"error": "trial_expired",
"upgrade_url": "https://app.skillsdb.com/settings/billing"
}{
"type": "https://help.skillsdb.com/api-docs/errors/validation-error",
"title": "Validation failed",
"status": 400,
"detail": "limit must be between 1 and 200",
"instance": "/api/v1/people",
"requestId": "0192c2f1-6f4e-7ab3-b1c4-5f6a7b8c9d0e",
"errors": [
{
"field": "email",
"code": "max_length",
"message": "email must be shorter than or equal to 75 characters"
}
],
"error": "trial_expired",
"upgrade_url": "https://app.skillsdb.com/settings/billing"
}{
"type": "https://help.skillsdb.com/api-docs/errors/validation-error",
"title": "Validation failed",
"status": 400,
"detail": "limit must be between 1 and 200",
"instance": "/api/v1/people",
"requestId": "0192c2f1-6f4e-7ab3-b1c4-5f6a7b8c9d0e",
"errors": [
{
"field": "email",
"code": "max_length",
"message": "email must be shorter than or equal to 75 characters"
}
],
"error": "trial_expired",
"upgrade_url": "https://app.skillsdb.com/settings/billing"
}Create a person
First name, last name, email and an assignable access level are mandatory. Creating a person also creates their identity in the authentication provider. Returns a conflict when the email is already in use in the company. The granted access level can never exceed the acting identity’s own.
Requires scope: people:write.
curl --request POST \
--url https://prod.skillsdbnext.com/api/v1/people \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "Dana",
"lastName": "Reviewer",
"email": "dana@example.com",
"accessLevel": "basic",
"externalId": "EMP-0042",
"managerEmail": "lead@example.com",
"jobTitleId": "12",
"peopleTypeId": "3",
"countryId": "231",
"businessPhone": "+1 555 0100",
"mobilePhone": "+1 555 0101",
"homePhone": "+1 555 0102",
"address": "12 Foundry Rd",
"city": "Springfield",
"stateProvince": "IL",
"postalCode": "62704",
"webPage": "https://example.com",
"externalCompanyName": "Acme Contracting",
"nextAvailableDate": "2026-04-01T00:00:00.000Z",
"careerIds": [
"18"
],
"learningIds": [
"7"
]
}
'import requests
url = "https://prod.skillsdbnext.com/api/v1/people"
payload = {
"firstName": "Dana",
"lastName": "Reviewer",
"email": "dana@example.com",
"accessLevel": "basic",
"externalId": "EMP-0042",
"managerEmail": "lead@example.com",
"jobTitleId": "12",
"peopleTypeId": "3",
"countryId": "231",
"businessPhone": "+1 555 0100",
"mobilePhone": "+1 555 0101",
"homePhone": "+1 555 0102",
"address": "12 Foundry Rd",
"city": "Springfield",
"stateProvince": "IL",
"postalCode": "62704",
"webPage": "https://example.com",
"externalCompanyName": "Acme Contracting",
"nextAvailableDate": "2026-04-01T00:00:00.000Z",
"careerIds": ["18"],
"learningIds": ["7"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
firstName: 'Dana',
lastName: 'Reviewer',
email: 'dana@example.com',
accessLevel: 'basic',
externalId: 'EMP-0042',
managerEmail: 'lead@example.com',
jobTitleId: '12',
peopleTypeId: '3',
countryId: '231',
businessPhone: '+1 555 0100',
mobilePhone: '+1 555 0101',
homePhone: '+1 555 0102',
address: '12 Foundry Rd',
city: 'Springfield',
stateProvince: 'IL',
postalCode: '62704',
webPage: 'https://example.com',
externalCompanyName: 'Acme Contracting',
nextAvailableDate: '2026-04-01T00:00:00.000Z',
careerIds: ['18'],
learningIds: ['7']
})
};
fetch('https://prod.skillsdbnext.com/api/v1/people', 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://prod.skillsdbnext.com/api/v1/people",
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([
'firstName' => 'Dana',
'lastName' => 'Reviewer',
'email' => 'dana@example.com',
'accessLevel' => 'basic',
'externalId' => 'EMP-0042',
'managerEmail' => 'lead@example.com',
'jobTitleId' => '12',
'peopleTypeId' => '3',
'countryId' => '231',
'businessPhone' => '+1 555 0100',
'mobilePhone' => '+1 555 0101',
'homePhone' => '+1 555 0102',
'address' => '12 Foundry Rd',
'city' => 'Springfield',
'stateProvince' => 'IL',
'postalCode' => '62704',
'webPage' => 'https://example.com',
'externalCompanyName' => 'Acme Contracting',
'nextAvailableDate' => '2026-04-01T00:00:00.000Z',
'careerIds' => [
'18'
],
'learningIds' => [
'7'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/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://prod.skillsdbnext.com/api/v1/people"
payload := strings.NewReader("{\n \"firstName\": \"Dana\",\n \"lastName\": \"Reviewer\",\n \"email\": \"dana@example.com\",\n \"accessLevel\": \"basic\",\n \"externalId\": \"EMP-0042\",\n \"managerEmail\": \"lead@example.com\",\n \"jobTitleId\": \"12\",\n \"peopleTypeId\": \"3\",\n \"countryId\": \"231\",\n \"businessPhone\": \"+1 555 0100\",\n \"mobilePhone\": \"+1 555 0101\",\n \"homePhone\": \"+1 555 0102\",\n \"address\": \"12 Foundry Rd\",\n \"city\": \"Springfield\",\n \"stateProvince\": \"IL\",\n \"postalCode\": \"62704\",\n \"webPage\": \"https://example.com\",\n \"externalCompanyName\": \"Acme Contracting\",\n \"nextAvailableDate\": \"2026-04-01T00:00:00.000Z\",\n \"careerIds\": [\n \"18\"\n ],\n \"learningIds\": [\n \"7\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/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://prod.skillsdbnext.com/api/v1/people")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"firstName\": \"Dana\",\n \"lastName\": \"Reviewer\",\n \"email\": \"dana@example.com\",\n \"accessLevel\": \"basic\",\n \"externalId\": \"EMP-0042\",\n \"managerEmail\": \"lead@example.com\",\n \"jobTitleId\": \"12\",\n \"peopleTypeId\": \"3\",\n \"countryId\": \"231\",\n \"businessPhone\": \"+1 555 0100\",\n \"mobilePhone\": \"+1 555 0101\",\n \"homePhone\": \"+1 555 0102\",\n \"address\": \"12 Foundry Rd\",\n \"city\": \"Springfield\",\n \"stateProvince\": \"IL\",\n \"postalCode\": \"62704\",\n \"webPage\": \"https://example.com\",\n \"externalCompanyName\": \"Acme Contracting\",\n \"nextAvailableDate\": \"2026-04-01T00:00:00.000Z\",\n \"careerIds\": [\n \"18\"\n ],\n \"learningIds\": [\n \"7\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://prod.skillsdbnext.com/api/v1/people")
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/json'
request.body = "{\n \"firstName\": \"Dana\",\n \"lastName\": \"Reviewer\",\n \"email\": \"dana@example.com\",\n \"accessLevel\": \"basic\",\n \"externalId\": \"EMP-0042\",\n \"managerEmail\": \"lead@example.com\",\n \"jobTitleId\": \"12\",\n \"peopleTypeId\": \"3\",\n \"countryId\": \"231\",\n \"businessPhone\": \"+1 555 0100\",\n \"mobilePhone\": \"+1 555 0101\",\n \"homePhone\": \"+1 555 0102\",\n \"address\": \"12 Foundry Rd\",\n \"city\": \"Springfield\",\n \"stateProvince\": \"IL\",\n \"postalCode\": \"62704\",\n \"webPage\": \"https://example.com\",\n \"externalCompanyName\": \"Acme Contracting\",\n \"nextAvailableDate\": \"2026-04-01T00:00:00.000Z\",\n \"careerIds\": [\n \"18\"\n ],\n \"learningIds\": [\n \"7\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "91",
"externalId": "EMP-0042",
"firstName": "Dana",
"lastName": "Reviewer",
"email": "dana@example.com",
"accessLevel": {
"slug": "admin",
"name": "Admin",
"isAssignable": true
},
"manager": {
"id": "42",
"name": "Welding"
},
"isActive": true,
"jobTitle": {
"id": "42",
"name": "Welding"
},
"peopleType": {
"id": "42",
"name": "Welding",
"expiresAt": "2026-12-31T00:00:00.000Z"
},
"orgSchema": {
"businessUnits": [
{
"id": "42",
"name": "Welding"
}
],
"divisions": [
{
"id": "42",
"name": "Welding"
}
],
"businessRegions": [
{
"id": "42",
"name": "Welding"
}
],
"countries": [
{
"id": "42",
"name": "Welding"
}
],
"states": [
{
"id": "42",
"name": "Welding"
}
],
"cities": [
{
"id": "42",
"name": "Welding"
}
],
"sites": [
{
"id": "42",
"name": "Welding"
}
],
"buildings": [
{
"id": "42",
"name": "Welding"
}
],
"departments": [
{
"id": "42",
"name": "Welding"
}
],
"teams": [
{
"id": "42",
"name": "Welding"
}
],
"shifts": [
{
"id": "42",
"name": "Welding"
}
]
},
"businessPhone": "+1 555 0100",
"mobilePhone": "+1 555 0101",
"homePhone": "+1 555 0102",
"address": "12 Foundry Rd",
"city": "Springfield",
"stateProvince": "IL",
"postalCode": "62704",
"country": {
"id": "42",
"name": "Welding"
},
"webPage": "https://example.com",
"externalCompanyName": "Acme Contracting",
"nextAvailableDate": "2026-04-01T00:00:00.000Z",
"inactiveAt": null,
"createdAt": "2026-01-12T08:30:00.000Z",
"createdById": "88",
"updatedAt": "2026-03-02T14:00:00.000Z",
"updatedById": "88"
}
}{
"type": "https://help.skillsdb.com/api-docs/errors/validation-error",
"title": "Validation failed",
"status": 400,
"detail": "limit must be between 1 and 200",
"instance": "/api/v1/people",
"requestId": "0192c2f1-6f4e-7ab3-b1c4-5f6a7b8c9d0e",
"errors": [
{
"field": "email",
"code": "max_length",
"message": "email must be shorter than or equal to 75 characters"
}
],
"error": "trial_expired",
"upgrade_url": "https://app.skillsdb.com/settings/billing"
}{
"type": "https://help.skillsdb.com/api-docs/errors/validation-error",
"title": "Validation failed",
"status": 400,
"detail": "limit must be between 1 and 200",
"instance": "/api/v1/people",
"requestId": "0192c2f1-6f4e-7ab3-b1c4-5f6a7b8c9d0e",
"errors": [
{
"field": "email",
"code": "max_length",
"message": "email must be shorter than or equal to 75 characters"
}
],
"error": "trial_expired",
"upgrade_url": "https://app.skillsdb.com/settings/billing"
}{
"type": "https://help.skillsdb.com/api-docs/errors/validation-error",
"title": "Validation failed",
"status": 400,
"detail": "limit must be between 1 and 200",
"instance": "/api/v1/people",
"requestId": "0192c2f1-6f4e-7ab3-b1c4-5f6a7b8c9d0e",
"errors": [
{
"field": "email",
"code": "max_length",
"message": "email must be shorter than or equal to 75 characters"
}
],
"error": "trial_expired",
"upgrade_url": "https://app.skillsdb.com/settings/billing"
}{
"type": "https://help.skillsdb.com/api-docs/errors/validation-error",
"title": "Validation failed",
"status": 400,
"detail": "limit must be between 1 and 200",
"instance": "/api/v1/people",
"requestId": "0192c2f1-6f4e-7ab3-b1c4-5f6a7b8c9d0e",
"errors": [
{
"field": "email",
"code": "max_length",
"message": "email must be shorter than or equal to 75 characters"
}
],
"error": "trial_expired",
"upgrade_url": "https://app.skillsdb.com/settings/billing"
}{
"type": "https://help.skillsdb.com/api-docs/errors/validation-error",
"title": "Validation failed",
"status": 400,
"detail": "limit must be between 1 and 200",
"instance": "/api/v1/people",
"requestId": "0192c2f1-6f4e-7ab3-b1c4-5f6a7b8c9d0e",
"errors": [
{
"field": "email",
"code": "max_length",
"message": "email must be shorter than or equal to 75 characters"
}
],
"error": "trial_expired",
"upgrade_url": "https://app.skillsdb.com/settings/billing"
}{
"type": "https://help.skillsdb.com/api-docs/errors/validation-error",
"title": "Validation failed",
"status": 400,
"detail": "limit must be between 1 and 200",
"instance": "/api/v1/people",
"requestId": "0192c2f1-6f4e-7ab3-b1c4-5f6a7b8c9d0e",
"errors": [
{
"field": "email",
"code": "max_length",
"message": "email must be shorter than or equal to 75 characters"
}
],
"error": "trial_expired",
"upgrade_url": "https://app.skillsdb.com/settings/billing"
}{
"type": "https://help.skillsdb.com/api-docs/errors/validation-error",
"title": "Validation failed",
"status": 400,
"detail": "limit must be between 1 and 200",
"instance": "/api/v1/people",
"requestId": "0192c2f1-6f4e-7ab3-b1c4-5f6a7b8c9d0e",
"errors": [
{
"field": "email",
"code": "max_length",
"message": "email must be shorter than or equal to 75 characters"
}
],
"error": "trial_expired",
"upgrade_url": "https://app.skillsdb.com/settings/billing"
}Authorizations
An API key issued by a company administrator — an environment prefix (production: sdb_live_) followed by 32 characters. The prefix identifies the environment and MUST NOT be hard-coded or validated by clients; treat the whole key as opaque. Shown exactly once at creation; only a one-way hash is stored.
Scopes (granted per key on the create screen; :write never implies :read):
skills:readskills:writepeople:readpeople:writecareers:readcareers:writetraining:readtraining:writeflags:readflags:writeorg:readorg:writeassessments:readlearning:readlearning:writecertifications:readcertifications:writeassessments:writeproficiency:readproficiency:writesurveys:readsurveys:writelabels:readlabels:write
Headers
Any unique string (at most 200 characters). Retrying with the same key and identical content replays the stored response for 24h instead of executing twice.
200Body
50"Dana"
50"Reviewer"
"dana@example.com"
One of the four assignable slugs: basic, manager, admin, fullaccess.
"basic"
20"EMP-0042"
The manager's email address (ENG-4110 — people are addressed by email; the same field the bulk sync endpoint uses).
"lead@example.com"
"12"
"3"
"231"
"+1 555 0100"
"+1 555 0101"
"+1 555 0102"
"12 Foundry Rd"
"Springfield"
"IL"
"62704"
"https://example.com"
"Acme Contracting"
"2026-04-01T00:00:00.000Z"
Careers to assign at creation. Changing them afterwards is the Careers scope.
["18"]
Learning to assign at creation. Changing it afterwards is the Learning scope.
["7"]
Response
The created resource, enveloped.
Show child attributes
Show child attributes