Create a competence
Adds a competence to the account's competence catalogue, in an existing competence group.
Administration operation (System administration > Employee competencies). The response is the literal null: the new competence's ID is not returned — list the catalogue to find it. Names are not unique, so a retried create makes a second competence with the same name. IsActive defaults to false: send true, or the new competence is inactive and cannot be picked for employees in the UI.
Use it to:
- Seed the competence catalogue from an external skills taxonomy
Behaviour:
- Not idempotent.
- Not safe to retry blindly. Names are not unique: a retry after a lost response creates a duplicate competence. List first.
- Duplicates: Not deduplicated — no uniqueness on Name.
- Changes are visible to the next read immediately.
Call first: GET /v2/competences/by-group
Next: GET /v2/competences
See also: PUT /v2/competences
Not yet documented: examples.
curl -X POST "https://app3.timelog.com/your-account/api/v2/competences" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-d '{
"Name": "John Doe",
"GroupId": 123,
"IsActive": true
}'
import requests
import json
url = "https://app3.timelog.com/your-account/api/v2/competences"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
data = {
"Name": "John Doe",
"GroupId": 123,
"IsActive": true
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const response = await fetch("https://app3.timelog.com/your-account/api/v2/competences", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
},
body: JSON.stringify({
"Name": "John Doe",
"GroupId": 123,
"IsActive": true
})
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
"bytes"
"encoding/json"
)
func main() {
data := []byte(`{
"Name": "John Doe",
"GroupId": 123,
"IsActive": true
}`)
req, err := http.NewRequest("POST", "https://app3.timelog.com/your-account/api/v2/competences", bytes.NewBuffer(data))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://app3.timelog.com/your-account/api/v2/competences')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request['Authorization'] = 'Bearer YOUR_API_TOKEN'
request.body = '{
"Name": "John Doe",
"GroupId": 123,
"IsActive": true
}'
response = http.request(request)
puts response.body
"null"
{
"error": "Unauthorized",
"message": "Authentication required. Please provide a valid API token",
"code": 401
}
{
"Code": 102,
"Details": [
{
"Message": "Name must be set on Competence",
"ErrorCode": 60015
}
],
"Message": "Business rules exception.",
"Parameters": "model: {"Name":null,"GroupId":0,"IsActive":false}",
"Url": "https://app{server-number}.timelog.com/{account}/api/v2/competences"
}
/v2/competences
Target server for requests. Edit to use your own host.
OAuth 2.0 bearer token, sent as Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp).
The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user.
> Not yet documented: how to obtain a token.
> Not yet documented: token lifetime.
Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp).
The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user.
> Not yet documented: how to obtain a token.
> Not yet documented: token lifetime.The media type of the request body
Competence name. Duplicates are allowed. Can be set on create only. - Missing, empty or whitespace — 500 Code 102 / 60015 (captured). > Not yet documented: behaviour.
ID of the competence group the competence belongs to.
Can be set on create only.
Refers to CompetenceGroupDetailRead.GroupId. Look up valid values with GET /v2/competences/by-group.
- Not validated.
> Not yet documented: behaviour.
true = the competence is active and can be picked for employees; false = created deactivated. Can be set on create only. - Omitted — Binds as false: the new competence is INACTIVE and does not appear in the 'available' list. Send true explicitly.
Request Preview
Response
Response will appear here after sending the request
Authentication
Bearer token. OAuth 2.0 bearer token, sent as Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp).
The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user.
Not yet documented: how to obtain a token.
Not yet documented: token lifetime.
Body
Competence name. Duplicates are allowed.
Can be set on create only.
- Missing, empty or whitespace — 500 Code 102 / 60015 (captured).
Not yet documented: behaviour.
ID of the competence group the competence belongs to.
Can be set on create only.
Refers to CompetenceGroupDetailRead.GroupId. Look up valid values with GET /v2/competences/by-group.
- Not validated.
Not yet documented: behaviour.
true = the competence is active and can be picked for employees; false = created deactivated.
Can be set on create only.
- Omitted — Binds as false: the new competence is INACTIVE and does not appear in the 'available' list. Send true explicitly.
Responses
*Success without content: HTTP 200 with the literal JSON body null. Literal JSON null (TafSuccessResult).
Order: none
Empty result: none*