curl --request POST \
--url https://{tenant_name}.{region}.techwolf.ai/employees/{employee_external_id}/skill_events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"external_id": "a3903505-eb84-42dc-a79f-5e7b1fe897b7",
"event_type": "working_history",
"timestamp": "2025-05-02",
"content": {
"job_title": "HR Manager",
"start_date": "2018-09-05",
"end_date": "2020-06-17",
"company": "TechWolf BV",
"job_description": "Manage the HR department and perform workforce planning"
},
"source": "employee-archives"
}
'import requests
url = "https://{tenant_name}.{region}.techwolf.ai/employees/{employee_external_id}/skill_events"
payload = {
"external_id": "a3903505-eb84-42dc-a79f-5e7b1fe897b7",
"event_type": "working_history",
"timestamp": "2025-05-02",
"content": {
"job_title": "HR Manager",
"start_date": "2018-09-05",
"end_date": "2020-06-17",
"company": "TechWolf BV",
"job_description": "Manage the HR department and perform workforce planning"
},
"source": "employee-archives"
}
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({
external_id: 'a3903505-eb84-42dc-a79f-5e7b1fe897b7',
event_type: 'working_history',
timestamp: '2025-05-02',
content: {
job_title: 'HR Manager',
start_date: '2018-09-05',
end_date: '2020-06-17',
company: 'TechWolf BV',
job_description: 'Manage the HR department and perform workforce planning'
},
source: 'employee-archives'
})
};
fetch('https://{tenant_name}.{region}.techwolf.ai/employees/{employee_external_id}/skill_events', 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://{tenant_name}.{region}.techwolf.ai/employees/{employee_external_id}/skill_events",
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([
'external_id' => 'a3903505-eb84-42dc-a79f-5e7b1fe897b7',
'event_type' => 'working_history',
'timestamp' => '2025-05-02',
'content' => [
'job_title' => 'HR Manager',
'start_date' => '2018-09-05',
'end_date' => '2020-06-17',
'company' => 'TechWolf BV',
'job_description' => 'Manage the HR department and perform workforce planning'
],
'source' => 'employee-archives'
]),
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://{tenant_name}.{region}.techwolf.ai/employees/{employee_external_id}/skill_events"
payload := strings.NewReader("{\n \"external_id\": \"a3903505-eb84-42dc-a79f-5e7b1fe897b7\",\n \"event_type\": \"working_history\",\n \"timestamp\": \"2025-05-02\",\n \"content\": {\n \"job_title\": \"HR Manager\",\n \"start_date\": \"2018-09-05\",\n \"end_date\": \"2020-06-17\",\n \"company\": \"TechWolf BV\",\n \"job_description\": \"Manage the HR department and perform workforce planning\"\n },\n \"source\": \"employee-archives\"\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://{tenant_name}.{region}.techwolf.ai/employees/{employee_external_id}/skill_events")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"external_id\": \"a3903505-eb84-42dc-a79f-5e7b1fe897b7\",\n \"event_type\": \"working_history\",\n \"timestamp\": \"2025-05-02\",\n \"content\": {\n \"job_title\": \"HR Manager\",\n \"start_date\": \"2018-09-05\",\n \"end_date\": \"2020-06-17\",\n \"company\": \"TechWolf BV\",\n \"job_description\": \"Manage the HR department and perform workforce planning\"\n },\n \"source\": \"employee-archives\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{tenant_name}.{region}.techwolf.ai/employees/{employee_external_id}/skill_events")
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 \"external_id\": \"a3903505-eb84-42dc-a79f-5e7b1fe897b7\",\n \"event_type\": \"working_history\",\n \"timestamp\": \"2025-05-02\",\n \"content\": {\n \"job_title\": \"HR Manager\",\n \"start_date\": \"2018-09-05\",\n \"end_date\": \"2020-06-17\",\n \"company\": \"TechWolf BV\",\n \"job_description\": \"Manage the HR department and perform workforce planning\"\n },\n \"source\": \"employee-archives\"\n}"
response = http.request(request)
puts response.read_body[
{
"title": "400 Bad Request",
"description": "The request body was not structured correctly."
}
][
{
"title": "401 Unauthorized",
"description": "OAuth access token is missing, invalid or expired."
}
][
{
"title": "403 Forbidden",
"description": "You don't have access to this resource."
}
][
{
"title": "404 Not Found",
"description": "Unknown external_id describing this resource. Please create this resource first."
}
][
{
"title": "405 Method Not Allowed",
"description": "This method is not allowed for the requested URL."
}
][
{
"title": "409 Conflict",
"description": "The resource already exists."
}
][
{
"title": "415 Unsupported Media Type",
"description": "Content-type must be one of: application/json"
}
][
{
"title": "422 Unprocessable entity",
"description": "The request body contains some fields with invalid data (e.g. invalid date, invalid enumeration value ..)"
}
]"max connections reached: <limit>"[
{
"title": "503 Service Unavailable",
"description": "The Skill Engine API is currently not available. Please contact TechWolf or try again later."
}
]Create a new Skill Event for an Employee
Create a new Skill Event for an Employee. This can be used to track the Skill Profile of an Employee over time.
Note: It may take some time for these changes to be reflected in the employee’s final skill profile, since they are processed asynchronously.
ticket, merge_request and dynamic Skill Events require model configuration MC_2025_Q1_V1 or later. On tenants with an older model configuration the request is rejected with a 422 response stating that the model configuration is outdated and asking to upgrade to the latest model configuration.
curl --request POST \
--url https://{tenant_name}.{region}.techwolf.ai/employees/{employee_external_id}/skill_events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"external_id": "a3903505-eb84-42dc-a79f-5e7b1fe897b7",
"event_type": "working_history",
"timestamp": "2025-05-02",
"content": {
"job_title": "HR Manager",
"start_date": "2018-09-05",
"end_date": "2020-06-17",
"company": "TechWolf BV",
"job_description": "Manage the HR department and perform workforce planning"
},
"source": "employee-archives"
}
'import requests
url = "https://{tenant_name}.{region}.techwolf.ai/employees/{employee_external_id}/skill_events"
payload = {
"external_id": "a3903505-eb84-42dc-a79f-5e7b1fe897b7",
"event_type": "working_history",
"timestamp": "2025-05-02",
"content": {
"job_title": "HR Manager",
"start_date": "2018-09-05",
"end_date": "2020-06-17",
"company": "TechWolf BV",
"job_description": "Manage the HR department and perform workforce planning"
},
"source": "employee-archives"
}
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({
external_id: 'a3903505-eb84-42dc-a79f-5e7b1fe897b7',
event_type: 'working_history',
timestamp: '2025-05-02',
content: {
job_title: 'HR Manager',
start_date: '2018-09-05',
end_date: '2020-06-17',
company: 'TechWolf BV',
job_description: 'Manage the HR department and perform workforce planning'
},
source: 'employee-archives'
})
};
fetch('https://{tenant_name}.{region}.techwolf.ai/employees/{employee_external_id}/skill_events', 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://{tenant_name}.{region}.techwolf.ai/employees/{employee_external_id}/skill_events",
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([
'external_id' => 'a3903505-eb84-42dc-a79f-5e7b1fe897b7',
'event_type' => 'working_history',
'timestamp' => '2025-05-02',
'content' => [
'job_title' => 'HR Manager',
'start_date' => '2018-09-05',
'end_date' => '2020-06-17',
'company' => 'TechWolf BV',
'job_description' => 'Manage the HR department and perform workforce planning'
],
'source' => 'employee-archives'
]),
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://{tenant_name}.{region}.techwolf.ai/employees/{employee_external_id}/skill_events"
payload := strings.NewReader("{\n \"external_id\": \"a3903505-eb84-42dc-a79f-5e7b1fe897b7\",\n \"event_type\": \"working_history\",\n \"timestamp\": \"2025-05-02\",\n \"content\": {\n \"job_title\": \"HR Manager\",\n \"start_date\": \"2018-09-05\",\n \"end_date\": \"2020-06-17\",\n \"company\": \"TechWolf BV\",\n \"job_description\": \"Manage the HR department and perform workforce planning\"\n },\n \"source\": \"employee-archives\"\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://{tenant_name}.{region}.techwolf.ai/employees/{employee_external_id}/skill_events")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"external_id\": \"a3903505-eb84-42dc-a79f-5e7b1fe897b7\",\n \"event_type\": \"working_history\",\n \"timestamp\": \"2025-05-02\",\n \"content\": {\n \"job_title\": \"HR Manager\",\n \"start_date\": \"2018-09-05\",\n \"end_date\": \"2020-06-17\",\n \"company\": \"TechWolf BV\",\n \"job_description\": \"Manage the HR department and perform workforce planning\"\n },\n \"source\": \"employee-archives\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{tenant_name}.{region}.techwolf.ai/employees/{employee_external_id}/skill_events")
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 \"external_id\": \"a3903505-eb84-42dc-a79f-5e7b1fe897b7\",\n \"event_type\": \"working_history\",\n \"timestamp\": \"2025-05-02\",\n \"content\": {\n \"job_title\": \"HR Manager\",\n \"start_date\": \"2018-09-05\",\n \"end_date\": \"2020-06-17\",\n \"company\": \"TechWolf BV\",\n \"job_description\": \"Manage the HR department and perform workforce planning\"\n },\n \"source\": \"employee-archives\"\n}"
response = http.request(request)
puts response.read_body[
{
"title": "400 Bad Request",
"description": "The request body was not structured correctly."
}
][
{
"title": "401 Unauthorized",
"description": "OAuth access token is missing, invalid or expired."
}
][
{
"title": "403 Forbidden",
"description": "You don't have access to this resource."
}
][
{
"title": "404 Not Found",
"description": "Unknown external_id describing this resource. Please create this resource first."
}
][
{
"title": "405 Method Not Allowed",
"description": "This method is not allowed for the requested URL."
}
][
{
"title": "409 Conflict",
"description": "The resource already exists."
}
][
{
"title": "415 Unsupported Media Type",
"description": "Content-type must be one of: application/json"
}
][
{
"title": "422 Unprocessable entity",
"description": "The request body contains some fields with invalid data (e.g. invalid date, invalid enumeration value ..)"
}
]"max connections reached: <limit>"[
{
"title": "503 Service Unavailable",
"description": "The Skill Engine API is currently not available. Please contact TechWolf or try again later."
}
]Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Path Parameters
Unique ID linked to an Employee, consisting of alphanumeric characters, hyphens and underscores. The unique ID in your system, consisting of alphanumeric characters, hyphens and underscores.
1 - 100[a-zA-Z0-9_-]+"a3903505-eb84-42dc-a79f-5e7b1fe897b7"
Query Parameters
The language of the input data, which has an impact on the Skill extraction. auto will automatically detect the language used in the provided data.
auto, nl, fr, en, de "en"
If strict is enabled, entity creation will fail when a Skill Profile cannot be constructed. If strict is set to false, failed Skill Profile creation will still result in entity creation, but the Skill Profile will be empty.
If enabled, any currently active working history Skill Event (i.e. one without an end_date) for this Employee will be ended automatically when the new Skill Event is created.
Body
Default structure of a Skill Event.
The unique Skill Event ID in your system, consisting of alphanumeric characters, hyphens and underscores.
1 - 100[a-zA-Z0-9_-]+"a3903505-eb84-42dc-a79f-5e7b1fe897b7"
Type of the Skill Event. Learn more about the Skill Event Types at How it works.
working_history, education_history, resume_document, learning, feedback, goal, project, ticket, merge_request, certificate, skill_notes, skill_profile_feedback "working_history"
The completion date (in IS08601 format) of the Skill Event. From this point on, the Employee is considered to have obtained the Skills of this Event.
"2025-05-02"
The content of the Skill Event. Each type of Skill Event has a different content. The content should align with the event_type. Expanding this field shows you the supported Skill Event content bodies.
- working_history
- working_history_job
- education_history
- resume_document
- learning
- learning_course
- feedback
- goal
- project
- ticket
- merge_request
- certificate
- skill_notes
- skill_profile_feedback
Show child attributes
Show child attributes
The source system of the Skill Event. This is used to keep track of where Skill Events originate from.
"employee-archives"
Response
No Content
Was this page helpful?