clockify
Time entries, projects, clients and users from Clockify.
Use case
Clockify's free tier is generous, so it is what the smallest firms run. This connector pulls the entries so a workflow can compute utilization and billable hours without anyone re-keying a timesheet.
Operations
| operation | endpoint | covers |
|---|---|---|
me |
GET /user |
the token's owner |
list-workspaces |
GET /workspaces |
— |
list-users |
GET /workspaces/{id}/users |
— |
list-projects |
GET /workspaces/{id}/projects |
— |
list-clients |
GET /workspaces/{id}/clients |
— |
user-time-entries |
GET /workspaces/{id}/user/{uid}/time-entries |
one person |
workspace-report |
POST {reports}/workspaces/{id}/reports/detailed |
everyone |
Use workspace-report for anything about the firm. user-time-entries covers exactly one person, and a report built from it will under-report without ever looking wrong.
Setup
Create an API key in Clockify under Profile Settings → API.
It goes in the X-Api-Key header as the raw key — no Bearer, no prefix of any kind. A 401 here is almost always someone having added one.
Store it in the InTouch credential vault, not in the workflow.
Three things that bite
pageSize defaults to 50. Fifty. A single person's week can exceed that, and a caller that does not paginate takes the first fifty records as the answer. This connector paginates everything at 200 per page and publishes truncated when it stops at the 25-page cap.
Durations are ISO 8601 strings, not numbers. "PT1H30M", not 1.5. The connector adds an hours field beside each timeInterval — PT1H30M → 1.5, P1DT2H → 26.0 — and leaves the original string in place. A duration it cannot parse gets no hours field rather than a zero, so a parse failure cannot quietly become "worked no time."
The reports API is on a different host. Core is api.clockify.me/api/v1; reports are reports.api.clockify.me/v1. A 404 on a reports call while everything else works is nearly always the base URL rather than the path.
Regional accounts
Clockify pins some workspaces to a region (euc1., use2., …). If yours is one, set baseOverride and reportsOverride rather than assuming the global hosts.
Published outputs
| key | meaning |
|---|---|
result |
JSON array of records, with hours added to time entries |
status |
HTTP status of the last call |
count |
records returned |
truncated |
"true" if the page cap stopped the walk — result is incomplete |
Source
clockify.py, tool.iml
Publishes
The keys a later task may reference as {{taskName.key}}. Referencing anything not listed here resolves to nothing at run time.
counterrorpagesresultstatustruncated
Input Properties
Every property this tool accepts, from its own tool.iml.
| Property | Type | Required | Default | Description |
|---|---|---|---|---|
apiKey |
string | yes | — | Clockify API key (Profile Settings). Sent raw in the X-Api-Key header, with no 'Bearer' prefix. |
operation |
string | yes | — | One of: me, list-workspaces, list-users, list-projects, list-clients, user-time-entries, workspace-report |
workspaceId |
string | no | — | Workspace id. Required for everything except me and list-workspaces. |
userId |
string | no | — | User id. Required for user-time-entries. |
startDate |
string | no | — | Start date YYYY-MM-DD (or full ISO instant). Required for workspace-report. |
endDate |
string | no | — | End date YYYY-MM-DD (or full ISO instant). Required for workspace-report. |
baseOverride |
string | no | — | Override the core API base URL for a regional account, e.g. https://euc1.clockify.me/api/v1 |
reportsOverride |
string | no | — | Override the reports API base URL for a regional account. The reports API is on a DIFFERENT host from the core API. |