List Workforce Trainings
const options = {
method: 'GET',
headers: {'x-api-key': '<x-api-key>', 'x-organization-id': '<x-organization-id>'}
};
fetch('https://api.dcycle.io/v1/own_workforce_trainings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.dcycle.io/v1/own_workforce_trainings"
headers = {
"x-api-key": "<x-api-key>",
"x-organization-id": "<x-organization-id>"
}
response = requests.get(url, headers=headers)
print(response.text)curl --request GET \
--url https://api.dcycle.io/v1/own_workforce_trainings \
--header 'x-api-key: <x-api-key>' \
--header 'x-organization-id: <x-organization-id>'{
"id": "<string>",
"own_workforce_id": "<string>",
"external_employee_id": "<string>",
"type": "<string>",
"description": "<string>",
"hours": 123,
"start_date": "<string>",
"end_date": "<string>",
"created_by": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"file_id": {},
"file_name": {},
"processing_job_id": {},
"status": {},
"custom_values": {},
"organization_id": {}
}List Workforce Trainings
Retrieve every training record for the organization, unpaginated
GET
/
v1
/
own_workforce_trainings
List Workforce Trainings
const options = {
method: 'GET',
headers: {'x-api-key': '<x-api-key>', 'x-organization-id': '<x-organization-id>'}
};
fetch('https://api.dcycle.io/v1/own_workforce_trainings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.dcycle.io/v1/own_workforce_trainings"
headers = {
"x-api-key": "<x-api-key>",
"x-organization-id": "<x-organization-id>"
}
response = requests.get(url, headers=headers)
print(response.text)curl --request GET \
--url https://api.dcycle.io/v1/own_workforce_trainings \
--header 'x-api-key: <x-api-key>' \
--header 'x-organization-id: <x-organization-id>'{
"id": "<string>",
"own_workforce_id": "<string>",
"external_employee_id": "<string>",
"type": "<string>",
"description": "<string>",
"hours": 123,
"start_date": "<string>",
"end_date": "<string>",
"created_by": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"file_id": {},
"file_name": {},
"processing_job_id": {},
"status": {},
"custom_values": {},
"organization_id": {}
}← Own Workforce API
Return the training records of the header organization as a flat array.
This endpoint does not paginate. It returns every matching row in one response, with no row cap. Organizations with years of training history can return tens of thousands of records. Use List Workforce Trainings Paginated unless you specifically need the whole set in one payload, and always narrow with
created_at_from / created_at_to when you do.Request
Headers
string
required
Your API key for authenticationExample:
sk_live_1234567890abcdefstring
required
Your organization UUIDExample:
a8315ef3-dd50-43f8-b7ce-d839e68d51faQuery Parameters
array[string]
Filter by source upload file. Pass the nil UUID
00000000-0000-0000-0000-000000000000 to match rows with no file.datetime
Only rows created at or after this instantFormat: ISO 8601 —
2026-01-01T00:00:00datetime
Only rows created on or before this instant, inclusive
string
Free-text search, up to 255 characters
Response
A bare JSON array of training records.string
Training UUID
string
Employee the training belongs to
string
That employee’s identifier in your HR system
string
Training type, free text as uploaded. Expect wide variation across files — this field is not a controlled vocabulary.
string
What the training was
number
Duration in hours
string
YYYY-MM-DDstring
YYYY-MM-DDstring
User who created the record
string
ISO 8601 timestamp
string
ISO 8601 timestamp
string | null
Source upload file
string | null
Name of that file
string | null
Ingestion job that produced the row
string | null
Ingestion status:
active once ingested, loading while its job runs, error if that job failedobject
Values of the custom columns your organization defined for trainings, keyed by field key. Empty object when none are defined.
string | null
Owning organization. Populated on group-view responses only.
Example
curl -X GET "https://api.dcycle.io/v1/own_workforce_trainings?created_at_from=2026-01-01T00:00:00" \
-H "x-api-key: ${DCYCLE_API_KEY}" \
-H "x-organization-id: ${DCYCLE_ORG_ID}"
import os
import requests
headers = {
"x-api-key": os.getenv("DCYCLE_API_KEY"),
"x-organization-id": os.getenv("DCYCLE_ORG_ID"),
}
response = requests.get(
"https://api.dcycle.io/v1/own_workforce_trainings",
headers=headers,
params={"created_at_from": "2026-01-01T00:00:00"},
timeout=120,
)
records = response.json()
print(f"{len(records)} trainings, {sum(r['hours'] for r in records)} hours")
const axios = require('axios');
const headers = {
'x-api-key': process.env.DCYCLE_API_KEY,
'x-organization-id': process.env.DCYCLE_ORG_ID
};
axios.get('https://api.dcycle.io/v1/own_workforce_trainings', {
headers,
params: { created_at_from: '2026-01-01T00:00:00' },
timeout: 120000
})
.then(({ data }) => {
const hours = data.reduce((total, record) => total + record.hours, 0);
console.log(`${data.length} trainings, ${hours} hours`);
})
.catch(error => console.error(error));
Successful Response
[
{
"id": "3d9b0a11-2c4e-4f6a-8b1d-5e7f9a0c2d4e",
"own_workforce_id": "550e8400-e29b-41d4-a716-446655440000",
"external_employee_id": "EMP-2024-001",
"type": "Health and safety",
"description": "Annual fire safety refresher",
"hours": 4.0,
"start_date": "2026-03-02",
"end_date": "2026-03-02",
"created_by": "8a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"created_at": "2026-03-05T11:20:00",
"updated_at": "2026-03-05T11:20:00",
"file_id": "aa11bb22-cc33-4d44-8e55-ff6677889900",
"file_name": "trainings_2026.csv",
"processing_job_id": "c2a7b81e-3f55-4c0b-9a6d-1e2f3a4b5c6d",
"status": "active",
"custom_values": {},
"organization_id": null
}
]
Common Errors
401 Unauthorized
Cause: the key is invalid, or it does not belong to the organization inx-organization-id — the two are looked up as a pair. A request carrying no credentials at all answers AUTH_REQUIRED instead.
{
"detail": "Invalid API key for organization",
"code": "INVALID_API_KEY"
}
403 Forbidden
Cause: the key’s owner is not an enabled member of the organization inx-organization-id.
{
"detail": "Logged User is not Member of Organization",
"code": "LOGGED_USER_NOT_MEMBER"
}
Related Endpoints
List trainings paginated
The same data, in pages
Trainings of an employee
Narrowed to one person
Was this page helpful?