Skip to content
Developers

Build on the Worktivity API

One REST API for time tracking, activity data, projects and payouts.

Every screen in Worktivity is backed by the same public API you get. Authenticate with a single key, send JSON, and read a consistent response envelope. Endpoints below are generated from the live service, with request and response examples in cURL, JavaScript, Python and PHP.

Included on every plan. No separate API subscription.

At a glance

Everything you need before the first request.

Base URL
open-api.useworktivity.com
Authentication
x_api_key
Query parameter
Rate limits
5/sec · 100/min · 1000/hour
Documented endpoints
34
JSON in: JSON out

Authentication

Every request carries your organization's API key as a query string parameter. There is no OAuth flow and no bearer header, because the key alone scopes the request to your organization.

Getting your API key

  1. Sign in to the Worktivity dashboard.
  2. Open Organization → Settings → API Access.
  3. Click Generate API Key.
  4. Copy the key and store it in your server-side secret manager.

Keep the key server-side

The key grants full read and write access to your organization's data. Never ship it in browser JavaScript, a mobile bundle or a public repository. Rotate it from the same screen if it leaks.

A first request

This lists the employees in your organization. Every other endpoint follows the same shape.

cURL
curl -X POST "https://open-api.useworktivity.com/Employee/List?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "SearchTerm": "",
  "Page": 1,
  "PageSize": 15,
  "IncludeUsers": true
}'

Response format

Every endpoint returns the same envelope. Check HasError before reading Data, since the HTTP status is 200 for handled validation failures as well.

Successful response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {}
}

Validation error

JSON
{
  "HasError": true,
  "Message": "Validation failed",
  "ValidationErrors": [
    {
      "Key": "Email",
      "Value": "Email is required"
    },
    {
      "Key": "FirstName",
      "Value": "First name is required"
    }
  ],
  "Data": null
}

ValidationErrors is a flat list of field and message pairs. It is empty on success, never null.

HTTP status codes

  • 200Request handled. Read HasError to tell success from a validation failure.
  • 400Malformed request, usually invalid JSON or a wrong parameter type.
  • 401Missing, expired or revoked API key.
  • 403The key is valid but the organization lacks access to that resource.
  • 404The endpoint path does not exist.
  • 429Rate limit exceeded. Back off and retry after the reported delay.
  • 500Unexpected server error. Safe to retry with exponential backoff.

Rate limits

Limits are applied per API key across three windows at once. Exceeding any one of them returns 429 with the remaining budget for all three.

Headers on every response

Read these instead of counting requests yourself. They account for retries and parallel workers.

HTTP
X-RateLimit-Limit-Second: 5
X-RateLimit-Limit-Minute: 100
X-RateLimit-Limit-Hour: 1000

X-RateLimit-Remaining-Second: 4
X-RateLimit-Remaining-Minute: 87
X-RateLimit-Remaining-Hour: 943

X-RateLimit-Reset-Second: 1767182101
X-RateLimit-Reset-Minute: 1767182160
X-RateLimit-Reset-Hour: 1767184800

When you hit the limit

Rate limit exceeded. Back off and retry after the reported delay.

JSON
{
  "HasError": true,
  "Message": "Rate limit exceeded. Maximum 5 requests per second, 100 per minute, 1000 per hour.",
  "Data": {
    "RateLimits": {
      "PerSecond": {
        "Limit": 5,
        "Remaining": 0,
        "ResetAt": "2026-01-31T12:34:57+00:00"
      },
      "PerMinute": {
        "Limit": 100,
        "Remaining": 23,
        "ResetAt": "2026-01-31T12:35:00+00:00"
      },
      "PerHour": {
        "Limit": 1000,
        "Remaining": 456,
        "ResetAt": "2026-01-31T13:00:00+00:00"
      }
    },
    "RetryAfter": 1
  }
}

Staying under the limit

  • Retry on 429 using the RetryAfter value, then exponential backoff.
  • Page through lists with PageSize rather than fetching one record at a time.
  • Cache Definition/ListEnums and Definition/ListTimezones, which rarely change.
  • Poll on a schedule with CreatedAfter instead of re-reading whole date ranges.

Endpoint reference

Grouped by resource. Paths are relative to the base URL and every request needs the API key in the query string.

Definitions

Look up enum values and timezones before you send anything else. Both endpoints are cacheable.

GET/Definition/ListEnums

List enums

Returns every enumeration used by the API with its numeric value and display name, covering date filters, roles, task statuses, invoice statuses and more. Cache the result; it changes only with a release.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.

Request

cURL
curl -X GET "https://open-api.useworktivity.com/Definition/ListEnums?x_api_key=YOUR_API_KEY"

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "DateFilterTypes": [
      {
        "Value": 1,
        "DisplayName": "Today"
      },
      {
        "Value": 10,
        "DisplayName": "Custom date"
      }
    ],
    "EmployeeRoles": [
      {
        "Value": 2,
        "DisplayName": "Owner"
      },
      {
        "Value": 5,
        "DisplayName": "Employee"
      }
    ],
    "ProjectTaskStatuses": [
      {
        "Value": 0,
        "DisplayName": "Todo"
      },
      {
        "Value": 6,
        "DisplayName": "In progress"
      }
    ]
  }
}
GET/Definition/ListTimezones

List timezones

Returns supported timezones with UTC offsets and daylight saving information. All API timestamps are UTC, so use this to render local times.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.

Request

cURL
curl -X GET "https://open-api.useworktivity.com/Definition/ListTimezones?x_api_key=YOUR_API_KEY"

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "Id": "Europe/Istanbul",
        "DisplayName": "Istanbul (GMT+03:00)",
        "BaseUtcOffset": "+03:00:00",
        "SupportsDaylightSavingTime": false
      }
    ]
  }
}

Employees

Create, update, block and remove the people in your organization, and resend pending invitations.

POST/Employee/List

List employees

Returns a paged list of employees. Set IncludeUsers to get names and email addresses, which live on the linked user record rather than the employee record.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
SearchTermoptionalstringBodyFree-text filter. Empty string returns everything.
PageoptionalintegerBody1-based page number. Defaults to 1.
PageSizeoptionalintegerBodyRecords per page. Defaults to 15.
TeamIdoptionalstringBodyRestrict to one team. Empty string means all teams.
EmployeeIdsoptionalstring[]BodyRestrict to a specific set of employee IDs.
IsBlockedoptionalbooleanBodyFilter on blocked state. Omit to include both.
RegisteredoptionalbooleanBodyOnly employees who have accepted their invitation.
IncludeUsersoptionalbooleanBodyAttach the linked user record with name and email.
IncludeTeamsoptionalbooleanBodyAttach the full team record to each employee.
IncludeTodayClockInsoptionalbooleanBodyAttach today's clock-in activity log for each employee.
CreatedAfteroptionaldatetimeBodyOnly records created after this UTC timestamp. Use it for incremental syncing.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Employee/List?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "SearchTerm": "john",
  "Page": 1,
  "PageSize": 15,
  "TeamId": "",
  "IsBlocked": false,
  "IncludeUsers": true,
  "IncludeTeams": true
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "ID": "65f1c0a3b8d4e21f9c0a1b2c",
        "UserId": "65f1c0a3b8d4e21f9c0a1b30",
        "TeamId": "65f1c0a3b8d4e21f9c0a1b40",
        "OrganizationId": "65f1c0a3b8d4e21f9c0a1b50",
        "Role": 5,
        "IsActive": true,
        "Blocked": false,
        "EmployeeCode": "EMP-014",
        "PayRate": 25,
        "BillRate": 45,
        "EnableScreenshots": true,
        "ScreenCaptureIntervalMins": 5,
        "CreateDate": "2026-01-15T10:30:00Z",
        "User": {
          "ID": "65f1c0a3b8d4e21f9c0a1b30",
          "FirstName": "John",
          "LastName": "Doe",
          "Email": "john.doe@example.com"
        }
      }
    ],
    "TotalCount": 1,
    "PageCount": 1
  }
}
POST/Employee/Create

Create employee

Creates an employee and emails them an invitation. The seat is counted from creation, not from when the invitation is accepted.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
FirstNamerequiredstringBodyGiven name.
LastNamerequiredstringBodyFamily name.
EmailrequiredstringBodyWork email. The invitation is sent here and it must be unique.
TeamIdrequiredstringBodyRestrict to one team. Empty string means all teams.
RolerequiredenumTypeOfAuthorityBodyAccess level within the organization.
EmployeeCodeoptionalstringBodyYour own HR or accounting reference for this person.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Employee/Create?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "FirstName": "Jane",
  "LastName": "Smith",
  "Email": "jane.smith@example.com",
  "TeamId": "65f1c0a3b8d4e21f9c0a1b40",
  "Role": 5,
  "EmployeeCode": "EMP-015"
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {}
}
POST/Employee/Update

Update employee

Updates identity, team and role. Pay and bill rates are not part of this payload. They are managed by the cost settings endpoint.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
EmployeeIdrequiredstringBodyID of the employee to act on.
FirstNamerequiredstringBodyGiven name.
LastNamerequiredstringBodyFamily name.
EmailrequiredstringBodyWork email. The invitation is sent here and it must be unique.
TeamIdrequiredstringBodyRestrict to one team. Empty string means all teams.
RolerequiredenumTypeOfAuthorityBodyAccess level within the organization.
EmployeeCodeoptionalstringBodyYour own HR or accounting reference for this person.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Employee/Update?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "EmployeeId": "65f1c0a3b8d4e21f9c0a1b2c",
  "FirstName": "John",
  "LastName": "Doe",
  "Email": "john.doe@example.com",
  "TeamId": "65f1c0a3b8d4e21f9c0a1b40",
  "Role": 4,
  "EmployeeCode": "EMP-014"
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {}
}
POST/Employee/Block

Block employee

Blocks an employee. Their desktop agent stops tracking and they lose dashboard access, but historic data and reports stay intact.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
IdrequiredstringBodyID of the employee to block.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Employee/Block?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "Id": "65f1c0a3b8d4e21f9c0a1b2c"
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {}
}
POST/Employee/ResendInvitation

Resend invitation

Sends the invitation email again to an employee who has not signed up yet.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
EmployeeIdrequiredstringBodyID of the employee to act on.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Employee/ResendInvitation?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "EmployeeId": "65f1c0a3b8d4e21f9c0a1b2c"
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {}
}
POST/Employee/Delete

Delete employee

Permanently removes an employee. The account owner's password is required as a confirmation step, mirroring the dashboard.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
EmployeeIdrequiredstringBodyID of the employee to act on.
PasswordrequiredstringBodyThe account owner's password, required to confirm a destructive action.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Employee/Delete?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "EmployeeId": "65f1c0a3b8d4e21f9c0a1b2c",
  "Password": "account-owner-password"
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {}
}

Teams

Teams group employees and act as the filter dimension for almost every report.

POST/Team/List

List teams

Returns teams with their colour and, optionally, the number of employees in each.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
SearchTermoptionalstringBodyFree-text filter. Empty string returns everything.
PageoptionalintegerBody1-based page number. Defaults to 1.
PageSizeoptionalintegerBodyRecords per page. Defaults to 15.
TeamIdsoptionalstring[]BodyTeams assigned to the project.
IncludeEmployeeCountoptionalbooleanBodyAdd the number of employees in each team.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Team/List?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "SearchTerm": "",
  "Page": 1,
  "PageSize": 15,
  "IncludeEmployeeCount": true
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "ID": "65f1c0a3b8d4e21f9c0a1b40",
        "Title": "Engineering",
        "Color": "#8b4dff",
        "OrganizationId": "65f1c0a3b8d4e21f9c0a1b50",
        "EmployeeCount": 12,
        "CreateDate": "2026-01-02T09:00:00Z"
      }
    ],
    "TotalCount": 1,
    "PageCount": 1
  }
}
POST/Team/AddOrUpdate

Create or update team

Send an empty Id to create a team, or an existing Id to rename or recolour it.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
IdoptionalstringBodyLeave empty to create a team, or pass an existing ID to update it.
TitlerequiredstringBodyTeam name.
ColoroptionalstringBodySeven-character hex colour including the leading hash, for example #8b4dff.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Team/AddOrUpdate?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "Id": "",
  "Title": "Design",
  "Color": "#54a8c7"
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Item": {
      "ID": "65f1c0a3b8d4e21f9c0a1b41",
      "Title": "Design",
      "Color": "#54a8c7"
    }
  }
}
POST/Team/Delete

Delete team

Deletes a team. Employees are not deleted, so reassign them first or they end up without a team.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
IdrequiredstringBodyID of the team to delete.
PasswordrequiredstringBodyThe account owner's password, required to confirm a destructive action.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Team/Delete?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "Id": "65f1c0a3b8d4e21f9c0a1b41",
  "Password": "account-owner-password"
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {}
}

Time tracking

Timesheets, manual time entries and the raw activity log stream captured by the desktop agent.

POST/Timesheet/List

Get timesheet

Returns a day-by-day breakdown of working, break and idle minutes for the selected scope. Unlike the other list endpoints this one is not paged; narrow it with the date range instead.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
TeamIdoptionalstringBodyRestrict to one team. Empty string means all teams.
EmployeeIdoptionalstringBodyRestrict to one employee. Empty string means all employees.
DateFilteroptionalenumDateFilterTypeBodyPreset range. Send 10 (Custom) to use StartDate and EndDate.
StartDateoptionaldatetimeBodyRange start in UTC, ISO 8601. Used when DateFilter is Custom.
EndDateoptionaldatetimeBodyRange end in UTC, ISO 8601. Used when DateFilter is Custom.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Timesheet/List?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "TeamId": "",
  "EmployeeId": "65f1c0a3b8d4e21f9c0a1b2c",
  "DateFilter": 5,
  "StartDate": null,
  "EndDate": null
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Timesheet": [
      {
        "StartDate": "2026-01-15T00:00:00Z",
        "GetWorkTimesInsightsQueryResult": {
          "Items": [
            {
              "ID": "65f1c0a3b8d4e21f9c0a1b2c",
              "TotalMins": 510,
              "Working": 468,
              "OnBreak": 30,
              "Idle": 12,
              "Productive": 402,
              "Natural": 44,
              "Unproductive": 22,
              "ActivityLevel": 71,
              "ClockIn": "2026-01-15T08:58:00Z",
              "ClockOut": "2026-01-15T17:32:00Z"
            }
          ]
        }
      }
    ]
  }
}
POST/Timesheet/Export

Export timesheet

Generates the same data as a spreadsheet and returns a download URL in Data. The link is temporary.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
TeamIdoptionalstringBodyRestrict to one team. Empty string means all teams.
EmployeeIdoptionalstringBodyRestrict to one employee. Empty string means all employees.
DateFilteroptionalenumDateFilterTypeBodyPreset range. Send 10 (Custom) to use StartDate and EndDate.
StartDateoptionaldatetimeBodyRange start in UTC, ISO 8601. Used when DateFilter is Custom.
EndDateoptionaldatetimeBodyRange end in UTC, ISO 8601. Used when DateFilter is Custom.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Timesheet/Export?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "TeamId": "",
  "EmployeeId": "",
  "DateFilter": 5
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": "https://worktivity.b-cdn.net/exports/timesheet-2026-01.xlsx"
}
POST/TimeEntry/List

List time entries

Returns manually submitted time entries with their approval state, the reason given and any rejection note.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
SearchTermoptionalstringBodyFree-text filter. Empty string returns everything.
PageoptionalintegerBody1-based page number. Defaults to 1.
PageSizeoptionalintegerBodyRecords per page. Defaults to 15.
EmployeeIdoptionalstringBodyRestrict to one employee. Empty string means all employees.
TeamIdoptionalstringBodyRestrict to one team. Empty string means all teams.
DateFilteroptionalenumDateFilterTypeBodyPreset range. Send 10 (Custom) to use StartDate and EndDate.
StartDateoptionaldatetimeBodyRange start in UTC, ISO 8601. Used when DateFilter is Custom.
EndDateoptionaldatetimeBodyRange end in UTC, ISO 8601. Used when DateFilter is Custom.
StatusoptionalenumTimeEntryStatusBodyFilter by approval state. Omit to return every state.
IncludeEmployeesoptionalbooleanBodyAttach the employee record to each returned row.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/TimeEntry/List?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "Page": 1,
  "PageSize": 15,
  "EmployeeId": "",
  "TeamId": "",
  "DateFilter": 4,
  "Status": 0,
  "IncludeEmployees": true
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "ID": "65f1c0a3b8d4e21f9c0a1c10",
        "EmployeeId": "65f1c0a3b8d4e21f9c0a1b2c",
        "Status": 0,
        "StartDate": "2026-01-15T09:00:00Z",
        "EndDate": "2026-01-15T17:00:00Z",
        "TotalMinutes": 480,
        "LogStatus": 1,
        "ProductivityStatus": 1,
        "Reason": "Forgot to clock in",
        "ProjectId": "65f1c0a3b8d4e21f9c0a1d00",
        "ProjectTaskId": "65f1c0a3b8d4e21f9c0a1d10"
      }
    ],
    "TotalCount": 1,
    "PageCount": 1
  }
}
POST/TimeEntry/Create

Create time entry

Adds a manual entry on behalf of an employee, which is useful for offline work or a forgotten clock-in. The entry starts as Pending unless auto-approval is on.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
EmployeeIdrequiredstringBodyID of the employee to act on.
StartDaterequireddatetimeBodyWhen the work started, in UTC.
EndDaterequireddatetimeBodyWhen the work ended, in UTC.
ProjectIdoptionalstringBodyRestrict to one project. Empty string means all projects.
ProjectTaskIdoptionalstringBodyRestrict to one task. Empty string means all tasks.
ReasonrequiredstringBodyWhy the entry is being added. Shown to whoever approves it.
LogStatusrequiredenumEmployeeActivityLogStatusBodyHow the time should be classified: working, break or idle.
ProductivityStatusrequiredenumProductivityStatusBodyProductivity classification for the entry.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/TimeEntry/Create?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "EmployeeId": "65f1c0a3b8d4e21f9c0a1b2c",
  "StartDate": "2026-01-15T09:00:00Z",
  "EndDate": "2026-01-15T17:00:00Z",
  "ProjectId": "65f1c0a3b8d4e21f9c0a1d00",
  "ProjectTaskId": "",
  "Reason": "Offline work on the migration script",
  "LogStatus": 1,
  "ProductivityStatus": 1
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {}
}
POST/TimeEntry/Approve

Approve time entry

Approves a pending entry so its minutes count towards timesheets and payouts.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
IdrequiredstringBodyID of the time entry to act on.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/TimeEntry/Approve?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "Id": "65f1c0a3b8d4e21f9c0a1c10"
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {}
}
POST/TimeEntry/Reject

Reject time entry

Rejects a pending entry. The reason is shown to the employee in their dashboard.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
IdrequiredstringBodyID of the time entry to act on.
RejectionReasonrequiredstringBodyExplanation shown to the employee when a request is rejected.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/TimeEntry/Reject?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "Id": "65f1c0a3b8d4e21f9c0a1c10",
  "RejectionReason": "Overlaps an approved entry"
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {}
}
POST/ActivityLogs/List

List activity logs

The raw per-interval stream captured by the desktop agent: the active application, productivity classification, activity level and screenshot reference. This is the highest-volume endpoint, so page through it with CreatedAfter.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
SearchTermoptionalstringBodyFree-text filter. Empty string returns everything.
PageoptionalintegerBody1-based page number. Defaults to 1.
PageSizeoptionalintegerBodyRecords per page. Defaults to 15.
EmployeeIdoptionalstringBodyRestrict to one employee. Empty string means all employees.
TeamIdoptionalstringBodyRestrict to one team. Empty string means all teams.
ProjectIdoptionalstringBodyRestrict to one project. Empty string means all projects.
ProjectTaskIdoptionalstringBodyRestrict to one task. Empty string means all tasks.
DateFilteroptionalenumDateFilterTypeBodyPreset range. Send 10 (Custom) to use StartDate and EndDate.
StartDateoptionaldatetimeBodyRange start in UTC, ISO 8601. Used when DateFilter is Custom.
EndDateoptionaldatetimeBodyRange end in UTC, ISO 8601. Used when DateFilter is Custom.
ActivityLogStatusoptionalenumEmployeeActivityLogStatusBodyFilter the stream by a single activity status.
HasScreenshotoptionalbooleanBodyOnly intervals that do, or do not, have a screenshot.
ShowOnlyIdleoptionalbooleanBodyReturn idle intervals only.
IncludeEmployeesoptionalbooleanBodyAttach the employee record to each returned row.
IncludeOrganizationAppsoptionalbooleanBodyAttach application details, including name and icon.
CreatedAfteroptionaldatetimeBodyOnly records created after this UTC timestamp. Use it for incremental syncing.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/ActivityLogs/List?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "Page": 1,
  "PageSize": 50,
  "EmployeeId": "65f1c0a3b8d4e21f9c0a1b2c",
  "DateFilter": 1,
  "HasScreenshot": true,
  "IncludeOrganizationApps": true
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "ID": "65f1c0a3b8d4e21f9c0a1e00",
        "EmployeeId": "65f1c0a3b8d4e21f9c0a1b2c",
        "Title": "Visual Studio Code",
        "Status": 1,
        "Productivity": 1,
        "ActivityLevel": 78,
        "CreateDate": "2026-01-15T14:30:00Z",
        "Screenshot": "https://worktivity.b-cdn.net/...?X-Amz-Expires=172800",
        "LinkExpireDate": "2026-01-17T14:30:00Z",
        "OrganizationApp": {
          "ID": "65f1c0a3b8d4e21f9c0a1e10",
          "ActivityApp": {
            "Title": "Visual Studio Code"
          }
        }
      }
    ],
    "TotalCount": 1,
    "PageCount": 1
  }
}

Projects and tasks

Projects, their tasks and the customers they are billed to.

POST/Project/List

List projects

Returns projects with their assigned teams and employees, budget and notes.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
SearchTermoptionalstringBodyFree-text filter. Empty string returns everything.
PageoptionalintegerBody1-based page number. Defaults to 1.
PageSizeoptionalintegerBodyRecords per page. Defaults to 15.
TeamIdoptionalstringBodyRestrict to one team. Empty string means all teams.
CustomerIdoptionalstringBodyRestrict to one customer. Empty string means all customers.
CreatedAfteroptionaldatetimeBodyOnly records created after this UTC timestamp. Use it for incremental syncing.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Project/List?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "SearchTerm": "",
  "Page": 1,
  "PageSize": 15,
  "TeamId": "",
  "CustomerId": ""
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "ID": "65f1c0a3b8d4e21f9c0a1d00",
        "Title": "Website Redesign",
        "Color": "#8b4dff",
        "CustomerId": "65f1c0a3b8d4e21f9c0a1f00",
        "TeamIds": [
          "65f1c0a3b8d4e21f9c0a1b40"
        ],
        "EmployeeIds": [
          "65f1c0a3b8d4e21f9c0a1b2c"
        ],
        "TotalBudget": 25000,
        "Notes": "Phase two",
        "CreateDate": "2026-01-04T08:00:00Z"
      }
    ],
    "TotalCount": 1,
    "PageCount": 1
  }
}
POST/Project/AddUpdateProject

Create or update project

Send an empty Id to create. Colour is a seven-character hex value including the leading hash, and both TeamIds and EmployeeIds must be supplied.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
IdoptionalstringBodyLeave empty to create a project, or pass an existing ID to update it.
TitlerequiredstringBodyProject name, up to 100 characters.
ColorrequiredstringBodySeven-character hex colour including the leading hash, for example #8b4dff.
CustomerIdoptionalstringBodyRestrict to one customer. Empty string means all customers.
TeamIdsrequiredstring[]BodyTeams assigned to the project.
EmployeeIdsrequiredstring[]BodyEmployees assigned to the project.
NotesoptionalstringBodyInternal note on the project, up to 500 characters.
TotalBudgetoptionaldecimalBodyBudget for the project in your organization's currency.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Project/AddUpdateProject?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "Id": "",
  "Title": "Mobile App v2",
  "Color": "#45c4a0",
  "CustomerId": "65f1c0a3b8d4e21f9c0a1f00",
  "TeamIds": [
    "65f1c0a3b8d4e21f9c0a1b40"
  ],
  "EmployeeIds": [
    "65f1c0a3b8d4e21f9c0a1b2c"
  ],
  "Notes": "Kickoff in February",
  "TotalBudget": 40000
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Item": {
      "ID": "65f1c0a3b8d4e21f9c0a1d01",
      "Title": "Mobile App v2"
    }
  }
}
POST/Project/ListTasks

List tasks

Returns the tasks in a project with status, priority, assignees and due date.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
SearchTermoptionalstringBodyFree-text filter. Empty string returns everything.
PageoptionalintegerBody1-based page number. Defaults to 1.
PageSizeoptionalintegerBodyRecords per page. Defaults to 15.
ProjectIdoptionalstringBodyRestrict to one project. Empty string means all projects.
ExcludeTimeTrackedoptionalbooleanBodyOmit tasks that already have tracked time against them.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Project/ListTasks?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "ProjectId": "65f1c0a3b8d4e21f9c0a1d00",
  "Page": 1,
  "PageSize": 50
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "ID": "65f1c0a3b8d4e21f9c0a1d10",
        "ProjectId": "65f1c0a3b8d4e21f9c0a1d00",
        "Title": "Design the homepage",
        "Details": "Initial mockups for desktop and mobile",
        "Status": 6,
        "Priority": 2,
        "OrderNo": 1,
        "AssigneeIds": [
          "65f1c0a3b8d4e21f9c0a1b2c"
        ],
        "DueDate": "2026-01-25T00:00:00Z",
        "NonBillable": false
      }
    ],
    "TotalCount": 1,
    "PageCount": 1
  }
}
POST/Project/AddUpdateTask

Create or update task

Send an empty Id to create. Source records where the task came from, and ExternalTaskId keeps it linked to an issue in your own tracker.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
IdoptionalstringBodyLeave empty to create a task, or pass an existing ID to update it.
ProjectIdrequiredstringBodyRestrict to one project. Empty string means all projects.
TitlerequiredstringBodyTask title, up to 500 characters.
DetailsoptionalstringBodyTask description, up to 5000 characters.
SourcerequiredenumProjectTaskSourceBodyWhere the task originated, either manual entry or an integration.
OrderNorequiredintegerBodyPosition within the project board.
AssigneeIdsrequiredstring[]BodyEmployees assigned to the task.
StatusrequiredenumProjectTaskStatusBodyBoard column the task sits in.
PriorityoptionalenumProjectTaskPriorityBodyTask priority.
DueDateoptionaldatetimeBodyDue date in UTC, ISO 8601.
NonBillableoptionalbooleanBodyExclude tracked time on this task from billing.
ExternalTaskIdoptionalstringBodyYour own identifier, for keeping the task linked to an external tracker.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Project/AddUpdateTask?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "Id": "",
  "ProjectId": "65f1c0a3b8d4e21f9c0a1d00",
  "Title": "Wire up the pricing page",
  "Details": "Use the new plan matrix",
  "Source": 0,
  "OrderNo": 4,
  "AssigneeIds": [
    "65f1c0a3b8d4e21f9c0a1b2c"
  ],
  "Status": 0,
  "Priority": 2,
  "DueDate": "2026-02-10T00:00:00Z",
  "NonBillable": false
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Item": {
      "ID": "65f1c0a3b8d4e21f9c0a1d11",
      "Title": "Wire up the pricing page"
    }
  }
}
POST/Project/ListCustomers

List customers

Returns the customers projects are billed to. Needed when creating a project with a CustomerId.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
SearchTermoptionalstringBodyFree-text filter. Empty string returns everything.
PageoptionalintegerBody1-based page number. Defaults to 1.
PageSizeoptionalintegerBodyRecords per page. Defaults to 15.
IncludeTrackStatisticsoptionalbooleanBodyAdd tracked-time totals per customer.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Project/ListCustomers?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "SearchTerm": "",
  "Page": 1,
  "PageSize": 15
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "ID": "65f1c0a3b8d4e21f9c0a1f00",
        "Title": "ABC Company",
        "CreateDate": "2025-11-20T12:00:00Z"
      }
    ],
    "TotalCount": 1,
    "PageCount": 1
  }
}

Insights

Aggregated productivity, work time and application usage figures for a team, employee or project.

POST/Insights/Productivity

Productivity insights

Per-employee totals for working, break and idle minutes, split by productivity classification, plus the gap against expected work hours. Minutes, not seconds.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
TeamIdoptionalstringBodyRestrict to one team. Empty string means all teams.
EmployeeIdoptionalstringBodyRestrict to one employee. Empty string means all employees.
ProjectIdoptionalstringBodyRestrict to one project. Empty string means all projects.
ProjectTaskIdoptionalstringBodyRestrict to one task. Empty string means all tasks.
DateFilteroptionalenumDateFilterTypeBodyPreset range. Send 10 (Custom) to use StartDate and EndDate.
StartDateoptionaldatetimeBodyRange start in UTC, ISO 8601. Used when DateFilter is Custom.
EndDateoptionaldatetimeBodyRange end in UTC, ISO 8601. Used when DateFilter is Custom.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Insights/Productivity?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "TeamId": "",
  "EmployeeId": "",
  "DateFilter": 5
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "ID": "65f1c0a3b8d4e21f9c0a1b2c",
        "TotalMins": 9600,
        "Working": 8820,
        "OnBreak": 540,
        "Idle": 240,
        "Productive": 7420,
        "Natural": 940,
        "Unproductive": 460,
        "ActivityLevel": 74,
        "ExpectedWorkHoursDiff": -180,
        "Status": 1,
        "Productivity": 1,
        "Employee": {
          "Id": "65f1c0a3b8d4e21f9c0a1b2c",
          "FirstName": "John"
        }
      }
    ]
  }
}
POST/Insights/WorkTimes

Work time insights

Clock-in and clock-out behaviour over the selected range, including late clock-ins. Filter by activity status or productivity class to narrow it.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
TeamIdoptionalstringBodyRestrict to one team. Empty string means all teams.
EmployeeIdoptionalstringBodyRestrict to one employee. Empty string means all employees.
ProjectIdoptionalstringBodyRestrict to one project. Empty string means all projects.
ProjectTaskIdoptionalstringBodyRestrict to one task. Empty string means all tasks.
WorkNoteoptionalstringBodyFilter by the note an employee attached to their work.
Statusesoptionalenum[]EmployeeActivityLogStatusBodyActivity statuses to include. Empty list means all.
ProductivityStatusesoptionalenum[]ProductivityStatusBodyProductivity classifications to include. Empty list means all.
DateFilteroptionalenumDateFilterTypeBodyPreset range. Send 10 (Custom) to use StartDate and EndDate.
StartDateoptionaldatetimeBodyRange start in UTC, ISO 8601. Used when DateFilter is Custom.
EndDateoptionaldatetimeBodyRange end in UTC, ISO 8601. Used when DateFilter is Custom.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Insights/WorkTimes?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "TeamId": "",
  "EmployeeId": "",
  "Statuses": [
    1,
    3
  ],
  "ProductivityStatuses": [],
  "DateFilter": 4
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "ID": "65f1c0a3b8d4e21f9c0a1b2c",
        "TotalMins": 2400,
        "Working": 2180,
        "Idle": 120,
        "OnBreak": 100,
        "ClockIn": "2026-01-15T08:58:00Z",
        "ClockOut": "2026-01-15T17:32:00Z",
        "LateClockInCount": 1
      }
    ]
  }
}
POST/Insights/AppsSummary

Application usage summary

Time spent per application across the selected scope, with each application's productivity classification and icon.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
TeamIdoptionalstringBodyRestrict to one team. Empty string means all teams.
EmployeeIdoptionalstringBodyRestrict to one employee. Empty string means all employees.
ProjectIdoptionalstringBodyRestrict to one project. Empty string means all projects.
ProjectTaskIdoptionalstringBodyRestrict to one task. Empty string means all tasks.
DateFilteroptionalenumDateFilterTypeBodyPreset range. Send 10 (Custom) to use StartDate and EndDate.
StartDateoptionaldatetimeBodyRange start in UTC, ISO 8601. Used when DateFilter is Custom.
EndDateoptionaldatetimeBodyRange end in UTC, ISO 8601. Used when DateFilter is Custom.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Insights/AppsSummary?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "TeamId": "",
  "EmployeeId": "",
  "DateFilter": 5
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "ID": "65f1c0a3b8d4e21f9c0a1e10",
        "TotalMins": 1200,
        "Productive": 980,
        "Natural": 160,
        "Unproductive": 60,
        "ActivityApp": {
          "Title": "Visual Studio Code",
          "Icon": "https://worktivity.b-cdn.net/worktivity-public/apps/vscode.png"
        }
      }
    ]
  }
}

Screenshots and timelapse

Captured screenshots and generated timelapse videos. Media URLs are presigned and expire.

POST/Screenshots/List

List screenshots

Returns captured screenshots. The Screenshot field is a presigned URL that expires, so check LinkExpireDate and re-request rather than storing the URL.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
SearchTermoptionalstringBodyFree-text filter. Empty string returns everything.
PageoptionalintegerBody1-based page number. Defaults to 1.
PageSizeoptionalintegerBodyRecords per page. Defaults to 15.
EmployeeIdoptionalstringBodyRestrict to one employee. Empty string means all employees.
TeamIdoptionalstringBodyRestrict to one team. Empty string means all teams.
DateFilteroptionalenumDateFilterTypeBodyPreset range. Send 10 (Custom) to use StartDate and EndDate.
StartDateoptionaldatetimeBodyRange start in UTC, ISO 8601. Used when DateFilter is Custom.
EndDateoptionaldatetimeBodyRange end in UTC, ISO 8601. Used when DateFilter is Custom.
HasScreenshotoptionalbooleanBodyOnly intervals that do, or do not, have a screenshot.
IncludeEmployeesoptionalbooleanBodyAttach the employee record to each returned row.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Screenshots/List?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "Page": 1,
  "PageSize": 50,
  "EmployeeId": "65f1c0a3b8d4e21f9c0a1b2c",
  "DateFilter": 1,
  "HasScreenshot": true
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "ID": "65f1c0a3b8d4e21f9c0a1e00",
        "EmployeeId": "65f1c0a3b8d4e21f9c0a1b2c",
        "Screenshot": "https://worktivity.b-cdn.net/...?X-Amz-Expires=172800",
        "LinkExpireDate": "2026-01-17T14:30:00Z",
        "ObjectKey": "screenshots/2026/01/15/abc.jpg",
        "Status": 1,
        "CreateDate": "2026-01-15T14:30:00Z"
      }
    ],
    "TotalCount": 1,
    "PageCount": 1
  }
}
POST/Screenshots/Delete

Delete screenshot

Permanently deletes a single screenshot and its stored object. The surrounding activity log entry is kept.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
IdrequiredstringBodyID of the screenshot to delete.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/Screenshots/Delete?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "Id": "65f1c0a3b8d4e21f9c0a1e00"
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": true
}
POST/TimelapseVideos/List

List timelapse videos

Returns generated timelapse videos with a thumbnail, a video URL and the file size. Both URLs are presigned and expire.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
SearchTermoptionalstringBodyFree-text filter. Empty string returns everything.
PageoptionalintegerBody1-based page number. Defaults to 1.
PageSizeoptionalintegerBodyRecords per page. Defaults to 15.
EmployeeIdoptionalstringBodyRestrict to one employee. Empty string means all employees.
TeamIdoptionalstringBodyRestrict to one team. Empty string means all teams.
DateFilteroptionalenumDateFilterTypeBodyPreset range. Send 10 (Custom) to use StartDate and EndDate.
StartDateoptionaldatetimeBodyRange start in UTC, ISO 8601. Used when DateFilter is Custom.
EndDateoptionaldatetimeBodyRange end in UTC, ISO 8601. Used when DateFilter is Custom.
TimelapseVideoIdsoptionalstring[]BodyRestrict to a specific set of video IDs.
IncludeEmployeesoptionalbooleanBodyAttach the employee record to each returned row.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/TimelapseVideos/List?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "Page": 1,
  "PageSize": 20,
  "EmployeeId": "65f1c0a3b8d4e21f9c0a1b2c",
  "DateFilter": 4,
  "IncludeEmployees": true
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "ID": "65f1c0a3b8d4e21f9c0a1e50",
        "EmployeeId": "65f1c0a3b8d4e21f9c0a1b2c",
        "Url": "https://worktivity.b-cdn.net/...thumb.jpg",
        "VideoUrl": "https://worktivity.b-cdn.net/...timelapse.mp4",
        "Filename": "2026-01-15-john-doe.mp4",
        "FileSizeMb": 18.4,
        "LinkExpireDate": "2026-01-17T14:30:00Z",
        "CreateDate": "2026-01-15T18:00:00Z"
      }
    ],
    "TotalCount": 1,
    "PageCount": 1
  }
}

Cost management

Payout totals derived from tracked time and pay rates, plus customer invoices.

POST/CostManagement/Payroll

Calculate payouts

Returns tracked minutes, average pay rate and the payable amount per employee for an explicit date range. Filter by activity status to exclude idle or break time.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
TeamIdoptionalstringBodyRestrict to one team. Empty string means all teams.
EmployeeIdoptionalstringBodyRestrict to one employee. Empty string means all employees.
ProjectIdoptionalstringBodyRestrict to one project. Empty string means all projects.
ProjectTaskIdoptionalstringBodyRestrict to one task. Empty string means all tasks.
Statusesoptionalenum[]EmployeeActivityLogStatusBodyActivity statuses to include. Empty list means all.
ProductivityStatusesoptionalenum[]ProductivityStatusBodyProductivity classifications to include. Empty list means all.
StartDateoptionaldatetimeBodyRange start in UTC, ISO 8601. Used when DateFilter is Custom.
EndDateoptionaldatetimeBodyRange end in UTC, ISO 8601. Used when DateFilter is Custom.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/CostManagement/Payroll?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "TeamId": "",
  "EmployeeId": "",
  "Statuses": [
    1
  ],
  "StartDate": "2026-01-01T00:00:00Z",
  "EndDate": "2026-01-31T23:59:59Z"
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "ID": "65f1c0a3b8d4e21f9c0a1b2c",
        "TotalMins": 9600,
        "TotalSpent": 4000,
        "AvgPayRate": 25,
        "TotalPayable": 4000,
        "Employee": {
          "Id": "65f1c0a3b8d4e21f9c0a1b2c",
          "FirstName": "John",
          "LastName": "Doe"
        }
      }
    ]
  }
}
POST/CostManagement/ListInvoices

List invoices

Returns customer invoices with their status, total and due date.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
SearchTermoptionalstringBodyFree-text filter. Empty string returns everything.
PageoptionalintegerBody1-based page number. Defaults to 1.
PageSizeoptionalintegerBodyRecords per page. Defaults to 15.
CustomerIdoptionalstringBodyRestrict to one customer. Empty string means all customers.
StatusoptionalenumOrganizationCustomerInvoiceStatusBodyFilter by invoice state. Omit to return every state.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/CostManagement/ListInvoices?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "Page": 1,
  "PageSize": 15,
  "CustomerId": "",
  "Status": 2
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "ID": "65f1c0a3b8d4e21f9c0a1f50",
        "Title": "INV-2026-001",
        "CustomerId": "65f1c0a3b8d4e21f9c0a1f00",
        "Status": 2,
        "Total": 5000,
        "DueDate": "2026-02-15T00:00:00Z",
        "CreateDate": "2026-01-15T00:00:00Z"
      }
    ],
    "TotalCount": 1,
    "PageCount": 1
  }
}

Leave management

Leave entitlements, leave requests and approval actions.

POST/LeaveManagement/ListLeaveRights

List leave entitlements

Returns each employee's leave entitlement by type, with days used and days remaining.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
SearchTermoptionalstringBodyFree-text filter. Empty string returns everything.
PageoptionalintegerBody1-based page number. Defaults to 1.
PageSizeoptionalintegerBodyRecords per page. Defaults to 15.
TeamIdoptionalstringBodyRestrict to one team. Empty string means all teams.
EmployeeIdoptionalstringBodyRestrict to one employee. Empty string means all employees.
TypeoptionalenumLeaveRightTypeBodyLeave type, such as annual or sick leave.
StartDateoptionaldatetimeBodyRange start in UTC, ISO 8601. Used when DateFilter is Custom.
EndDateoptionaldatetimeBodyRange end in UTC, ISO 8601. Used when DateFilter is Custom.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/LeaveManagement/ListLeaveRights?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "Page": 1,
  "PageSize": 15,
  "TeamId": "",
  "EmployeeId": ""
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "ID": "65f1c0a3b8d4e21f9c0a2a00",
        "EmployeeId": "65f1c0a3b8d4e21f9c0a1b2c",
        "Type": 1,
        "TotalDays": 20,
        "UsedDays": 6,
        "RemainingDays": 14
      }
    ],
    "TotalCount": 1,
    "PageCount": 1
  }
}
POST/LeaveManagement/ListLeaveRequests

List leave requests

Returns leave requests with their type, date range and approval state.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
SearchTermoptionalstringBodyFree-text filter. Empty string returns everything.
PageoptionalintegerBody1-based page number. Defaults to 1.
PageSizeoptionalintegerBodyRecords per page. Defaults to 15.
TeamIdoptionalstringBodyRestrict to one team. Empty string means all teams.
EmployeeIdoptionalstringBodyRestrict to one employee. Empty string means all employees.
TypeoptionalenumLeaveRightTypeBodyLeave type, such as annual or sick leave.
StatusoptionalenumLeaveRequestStatusBodyFilter by approval state. Omit to return every state.
StartDateoptionaldatetimeBodyRange start in UTC, ISO 8601. Used when DateFilter is Custom.
EndDateoptionaldatetimeBodyRange end in UTC, ISO 8601. Used when DateFilter is Custom.
CreatedAfteroptionaldatetimeBodyOnly records created after this UTC timestamp. Use it for incremental syncing.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/LeaveManagement/ListLeaveRequests?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "Page": 1,
  "PageSize": 15,
  "EmployeeId": "",
  "Status": 0
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {
    "Items": [
      {
        "ID": "65f1c0a3b8d4e21f9c0a2b00",
        "EmployeeId": "65f1c0a3b8d4e21f9c0a1b2c",
        "Type": 1,
        "Status": 0,
        "StartDate": "2026-02-10T00:00:00Z",
        "EndDate": "2026-02-14T00:00:00Z",
        "TotalDays": 5
      }
    ],
    "TotalCount": 1,
    "PageCount": 1
  }
}
POST/LeaveManagement/ApproveLeaveRequest

Approve leave request

Approves a pending leave request and deducts the days from the matching entitlement.

Parameters

NameTypeInDescription
x_api_keyrequiredstringQueryYour organization's API key. Required on every request.
IdrequiredstringBodyID of the leave request to approve.

Request

cURL
curl -X POST "https://open-api.useworktivity.com/LeaveManagement/ApproveLeaveRequest?x_api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "Id": "65f1c0a3b8d4e21f9c0a2b00"
}'

Response

JSON
{
  "HasError": false,
  "Message": null,
  "ValidationErrors": [],
  "Data": {}
}

Enum reference

Enum fields are sent and returned as integers. The values below are stable, but Definition/ListEnums is the authoritative source and includes display names for enums not listed here.

DateFilterType

ValueName
1Today
2Yesterday
3Last3Days
4Last7Days
5Last30Days
10Custom

TypeOfAuthority

ValueName
0User
1Admin
2Owner
3Coowner
4Manager
5Employee

EmployeeActivityLogStatus

ValueName
0ClockIn
1Working
2OnBreak
3Idle
4ClockOut
5YetToStart

ProductivityStatus

ValueName
1Productive
2Natural
3Unproductive

TimeEntryStatus

ValueName
0Pending
1Approved
2Rejected

ProjectTaskStatus

ValueName
0Todo
1Completed
2Cancelled
3OnHold
4Postponed
5UnderReview
6InProgress

OrganizationCustomerInvoiceStatus

ValueName
1Draft
2Sent
3PartiallyPaid
4Paid

Try it interactively

The Swagger UI mirrors this documentation and lets you fire authenticated requests straight from the browser, including endpoints not covered on this page.

Ready to wire Worktivity into your stack?

Start a free trial, generate a key from the dashboard and make your first call in minutes. Every plan includes full API access.

14-day free trial. No credit card required.