List competences by group
Lists every competence group with its competences, optionally filtering the competences.
The tree view of the competence catalogue. Every group of the account is returned, ordered by name, whatever the filters; the filters only decide which competences appear under each group. A group with no matching competence keeps its place but has no Items member. Groups carry GroupCanBeDeleted, competences CanBeDeleted.
Use it to:
- Render or export the skills catalogue as a tree
Not for:
- A flat list —
GET /v2/competences
Behaviour:
- Idempotent.
- Safe to retry.
- Changes are visible to the next read immediately.
Next: POST /v2/competences
See also: GET /v2/competences
curl -X GET "https://app3.timelog.com/your-account/api/v2/competences/by-group?searchText=example_string&groupIds=example_string&isActive=true" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN"
import requests
import json
url = "https://app3.timelog.com/your-account/api/v2/competences/by-group?searchText=example_string&groupIds=example_string&isActive=true"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
response = requests.get(url, headers=headers)
print(response.json())
const response = await fetch("https://app3.timelog.com/your-account/api/v2/competences/by-group?searchText=example_string&groupIds=example_string&isActive=true", {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://app3.timelog.com/your-account/api/v2/competences/by-group?searchText=example_string&groupIds=example_string&isActive=true", nil)
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/by-group?searchText=example_string&groupIds=example_string&isActive=true')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
request['Content-Type'] = 'application/json'
request['Authorization'] = 'Bearer YOUR_API_TOKEN'
response = http.request(request)
puts response.body
{
"Entities": [
{
"Properties": {
"GroupId": 1,
"GroupName": "Skills",
"GroupCanBeDeleted": true,
"Items": [
{
"Id": 1,
"Name": "Frontend",
"IsActive": true,
"CanBeDeleted": true
}
]
}
}
],
"Links": [
{
"Href": "https://app{server-number}.timelog.com/{account}/api/v2/competences/by-group",
"Rel": "self"
}
]
}
{
"error": "Bad Request",
"message": "The request contains invalid parameters or malformed data",
"code": 400,
"details": [
{
"field": "email",
"message": "Invalid email format"
}
]
}
{
"error": "Unauthorized",
"message": "Authentication required. Please provide a valid API token",
"code": 401
}
{
"error": "Internal Server Error",
"message": "An unexpected error occurred on the server",
"code": 500,
"requestId": "req_1234567890"
}
/v2/competences/by-group
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.Filters the competences (not the groups); same LIKE / 50-character behaviour as on the flat list.
Filters on CompetenceGroupDetailItemRead.Name (contains).
Comma-separated group IDs. Filters the COMPETENCES only: groups not listed are still returned, with Items omitted. Non-integer entry → 500 Code 100.
Several values: one string, separated by ,.
Filters on CompetenceRead.GroupId (in).
Filters the competences by active state; omitted = both.
Filters on CompetenceGroupDetailItemRead.IsActive (eq).
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.
Query Parameters
Filters the competences (not the groups); same LIKE / 50-character behaviour as on the flat list.
Filters on CompetenceGroupDetailItemRead.Name (contains).
Comma-separated group IDs. Filters the COMPETENCES only: groups not listed are still returned, with Items omitted. Non-integer entry → 500 Code 100.
Several values: one string, separated by ,.
Filters on CompetenceRead.GroupId (in).
Filters the competences by active state; omitted = both.
Filters on CompetenceGroupDetailItemRead.IsActive (eq).
Responses
Omitted (not []) when the list is empty.