curl --request POST \
--url https://prod.skillsdbnext.com/api/v1/people/{personId}/careers/{careerId}/grades \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"grades": [
{
"skillId": "77",
"managerGradeId": "3",
"managerYearsOfExperience": 4,
"selfGradeId": "2",
"selfYearsOfExperience": 2
}
]
}
'import requests
url = "https://prod.skillsdbnext.com/api/v1/people/{personId}/careers/{careerId}/grades"
payload = { "grades": [
{
"skillId": "77",
"managerGradeId": "3",
"managerYearsOfExperience": 4,
"selfGradeId": "2",
"selfYearsOfExperience": 2
}
] }
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({
grades: [
{
skillId: '77',
managerGradeId: '3',
managerYearsOfExperience: 4,
selfGradeId: '2',
selfYearsOfExperience: 2
}
]
})
};
fetch('https://prod.skillsdbnext.com/api/v1/people/{personId}/careers/{careerId}/grades', 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/{personId}/careers/{careerId}/grades",
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([
'grades' => [
[
'skillId' => '77',
'managerGradeId' => '3',
'managerYearsOfExperience' => 4,
'selfGradeId' => '2',
'selfYearsOfExperience' => 2
]
]
]),
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/{personId}/careers/{careerId}/grades"
payload := strings.NewReader("{\n \"grades\": [\n {\n \"skillId\": \"77\",\n \"managerGradeId\": \"3\",\n \"managerYearsOfExperience\": 4,\n \"selfGradeId\": \"2\",\n \"selfYearsOfExperience\": 2\n }\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/{personId}/careers/{careerId}/grades")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"grades\": [\n {\n \"skillId\": \"77\",\n \"managerGradeId\": \"3\",\n \"managerYearsOfExperience\": 4,\n \"selfGradeId\": \"2\",\n \"selfYearsOfExperience\": 2\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://prod.skillsdbnext.com/api/v1/people/{personId}/careers/{careerId}/grades")
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 \"grades\": [\n {\n \"skillId\": \"77\",\n \"managerGradeId\": \"3\",\n \"managerYearsOfExperience\": 4,\n \"selfGradeId\": \"2\",\n \"selfYearsOfExperience\": 2\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "512",
"name": "TIG Welding",
"description": "Gas tungsten arc welding.",
"isCertification": false,
"selfGrade": {
"id": "3",
"grade": 3,
"label": "Proficient"
},
"selfYearsOfExperience": 4,
"managerGrade": {
"id": "3",
"grade": 3,
"label": "Proficient"
},
"managerYearsOfExperience": 3,
"managerGradeUpdatedAt": "2026-02-01T10:00:00.000Z",
"managerGradeUpdatedBy": {
"id": "1042",
"name": "Dana Whitfield"
},
"benchmark": {
"effective": {
"id": "3",
"grade": 3,
"label": "Proficient"
},
"source": "manager",
"manager": {
"id": "3",
"grade": 3,
"label": "Proficient"
},
"careers": [
{
"careerId": "31",
"careerName": "Warehouse Operator",
"careerSkillId": "512",
"levelId": "7",
"levelName": "Senior",
"career": {
"id": "3",
"grade": 3,
"label": "Proficient"
},
"level": {
"id": "3",
"grade": 3,
"label": "Proficient"
},
"effective": {
"id": "3",
"grade": 3,
"label": "Proficient"
},
"effectiveSource": "manager"
}
]
},
"notApplicable": false,
"focus": {
"employee": false,
"manager": true
},
"origin": {
"direct": true,
"careers": [
{
"careerId": "31",
"careerName": "Warehouse Operator",
"careerSkillId": "512"
}
]
}
}
],
"meta": {
"total": 1342,
"limit": 50,
"offset": 0
}
}{
"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"
}{
"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"
}Grade a person across a career
Sets manager and/or self grades for skills the career requires, in one call. A skill that is not part of the career for this person is a 422; self grades need the acting person to be the subject.
Requires scope: proficiency:write.
curl --request POST \
--url https://prod.skillsdbnext.com/api/v1/people/{personId}/careers/{careerId}/grades \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"grades": [
{
"skillId": "77",
"managerGradeId": "3",
"managerYearsOfExperience": 4,
"selfGradeId": "2",
"selfYearsOfExperience": 2
}
]
}
'import requests
url = "https://prod.skillsdbnext.com/api/v1/people/{personId}/careers/{careerId}/grades"
payload = { "grades": [
{
"skillId": "77",
"managerGradeId": "3",
"managerYearsOfExperience": 4,
"selfGradeId": "2",
"selfYearsOfExperience": 2
}
] }
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({
grades: [
{
skillId: '77',
managerGradeId: '3',
managerYearsOfExperience: 4,
selfGradeId: '2',
selfYearsOfExperience: 2
}
]
})
};
fetch('https://prod.skillsdbnext.com/api/v1/people/{personId}/careers/{careerId}/grades', 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/{personId}/careers/{careerId}/grades",
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([
'grades' => [
[
'skillId' => '77',
'managerGradeId' => '3',
'managerYearsOfExperience' => 4,
'selfGradeId' => '2',
'selfYearsOfExperience' => 2
]
]
]),
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/{personId}/careers/{careerId}/grades"
payload := strings.NewReader("{\n \"grades\": [\n {\n \"skillId\": \"77\",\n \"managerGradeId\": \"3\",\n \"managerYearsOfExperience\": 4,\n \"selfGradeId\": \"2\",\n \"selfYearsOfExperience\": 2\n }\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/{personId}/careers/{careerId}/grades")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"grades\": [\n {\n \"skillId\": \"77\",\n \"managerGradeId\": \"3\",\n \"managerYearsOfExperience\": 4,\n \"selfGradeId\": \"2\",\n \"selfYearsOfExperience\": 2\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://prod.skillsdbnext.com/api/v1/people/{personId}/careers/{careerId}/grades")
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 \"grades\": [\n {\n \"skillId\": \"77\",\n \"managerGradeId\": \"3\",\n \"managerYearsOfExperience\": 4,\n \"selfGradeId\": \"2\",\n \"selfYearsOfExperience\": 2\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "512",
"name": "TIG Welding",
"description": "Gas tungsten arc welding.",
"isCertification": false,
"selfGrade": {
"id": "3",
"grade": 3,
"label": "Proficient"
},
"selfYearsOfExperience": 4,
"managerGrade": {
"id": "3",
"grade": 3,
"label": "Proficient"
},
"managerYearsOfExperience": 3,
"managerGradeUpdatedAt": "2026-02-01T10:00:00.000Z",
"managerGradeUpdatedBy": {
"id": "1042",
"name": "Dana Whitfield"
},
"benchmark": {
"effective": {
"id": "3",
"grade": 3,
"label": "Proficient"
},
"source": "manager",
"manager": {
"id": "3",
"grade": 3,
"label": "Proficient"
},
"careers": [
{
"careerId": "31",
"careerName": "Warehouse Operator",
"careerSkillId": "512",
"levelId": "7",
"levelName": "Senior",
"career": {
"id": "3",
"grade": 3,
"label": "Proficient"
},
"level": {
"id": "3",
"grade": 3,
"label": "Proficient"
},
"effective": {
"id": "3",
"grade": 3,
"label": "Proficient"
},
"effectiveSource": "manager"
}
]
},
"notApplicable": false,
"focus": {
"employee": false,
"manager": true
},
"origin": {
"direct": true,
"careers": [
{
"careerId": "31",
"careerName": "Warehouse Operator",
"careerSkillId": "512"
}
]
}
}
],
"meta": {
"total": 1342,
"limit": 50,
"offset": 0
}
}{
"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"
}{
"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.
200Path Parameters
The person's email address — or the opaque person id from any response.
"ada@example.com"
Opaque resource id.
Body
One entry per skill of the career to grade.
Show child attributes
Show child attributes