Time Doctor provides an API that can be used to retrieve most of its reports and resources. Please reach out to support2@timedoctor.com if you need any help with the API or have any suggestions regarding it.
The APIs use REST principles to create a standard and familiar interface. REST, which stands for REpresentational State Transformation, defines a set of principles for organizing web services using the HTTP protocol and a specific set of HTTP verbs or methods. The methods used in the Time Doctor API are:
POST: Create a resource GET: Read a resource PUT: Update a resource DELETE: Delete a resource
Together these are often known as CRUD operations – Create, Read, Update, and Delete.
Time doctor API calls actually use the HTTPS protocol, the secure form of HTTP. All calls for version 1.0 begin with the prefix:
The request header for all API calls must include the following parameters: "accept: application/json" "content: application/json"
If the request body is not empty, it consists of a sequence of parameters given in JSON format. If a response body is returned, its content is given in JSON format as well.
Note: Every call to a Time Doctor API must be authenticated using a “bearer token” based on OAuth 2.0. Tokens are generated by the following APIs:
The token is valid for six months. After this, you will need to create a new token. Once your token is generated, it must be provided as a query parameter named "token" in every subsequent API call.
Time Doctor API support ISO date and time format i.e. YYYY-MM-DDT00:00:00Z (Z refers to UTC timezone)
Having timezone offset can result in performance issues for reasons such as daylight savings changes. Time Doctor stores and returns data only in the UTC timezone. You will need to convert the local time into UTC timezone before you pass it as a query parameter in the API call. For example Jul 2nd, 2021 06:36 AM UTC+8 = Jul 1st, 2021 10:36 PM UTC time
Time Doctor API supports ISO date and time format. If you are running the report for the same day, you’ll need to provide the date range as below.
For example from=2021-07-02T00:00:00Z & to=2021-07-02T23:59:59Z OR from=2021-07-02T00:00:00Z & to=2021-07-03T00:00:00Z
This could be due to an issue with the specific application permissions that the data wasn’t captured. It could also be that the web & app tracking was disabled before it was enabled, so the black titles are from the time when the setting was disabled.
The tags refer to Groups in Time Doctor.
Files refer to the screencasts (screenshots and screen videos) in Time Doctor.
Categories refer to the productivity ratings in Time Doctor.
The Disconnectivity report works with Time Doctor application v3.4.8 and above. Please make sure the users are using this app version or the newest. Send an email to support2@timedoctor.com in case you still experience any issues after upgrading the application version.
We don’t currently have webhooks. You may create custom scripts to call the API endpoints. Feel free to email support2@timedoctor.com in case you have any questions.
Time Doctor API supports the filtering of data in some of the API calls. You can specify using the filter keyword and provide multiple data points that you want to get in the response, i.e., filter=name, user ID, email, etc. You will see the filters query parameters in some of the API calls where you can use them.
Login and get access token
email required | string An email, which was used for registration |
password required | string A password, specified on registration |
totpCode | string TOTP code for 2FA (if enabled) |
permissions | string Default: "write" API permissions. There are two states: "read" or "write" allows the bearer of the token to perform actions that can change state (POST, PUT, PATCH, DELETE). |
{- "email": "string",
- "password": "string",
- "totpCode": "string",
- "permissions": "write"
}
{- "data": {
- "token": "string",
- "expires": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z"
}
}
Register account
name required | string User full name |
email required | string User email to register |
timezone | string User timezone self setting |
password required | string Desired password, must meet password policy (at least 6 characters) |
twoFactorAuth | boolean Default: false Enable 2FA |
referrer | string If specified, a referrer, where the user was brought from |
{- "name": "string",
- "email": "string",
- "timezone": "string",
- "password": "string",
- "twoFactorAuth": false,
- "referrer": "string"
}
{- "data": {
- "token": "string",
- "expires": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z"
}
}
Register account
name required | string User full name |
email required | string User email to register |
timezone | string If specified, specifies which time zone company works on. Etc/UTC by default |
password required | string Desired password, must meet password policy (at least 6 characters) |
referrer | string If specified, a referrer, where the user was brought from |
company | string If specified, is a name for newly created company, default: "Someone's company" |
trackingMode required | string Tracking mode of company |
pricingPlan | string Default: "standard_new" Pricing plan of company |
{- "name": "string",
- "email": "string",
- "timezone": "string",
- "password": "string",
- "referrer": "string",
- "company": "string",
- "trackingMode": "mixed",
- "pricingPlan": "standard_new"
}
{- "data": {
- "token": "string",
- "expires": "string",
- "createdAt": "string",
- "userId": "string",
- "companyId": "string",
- "workspaceId": "string",
- "noWorkspaces": true
}
}
Modify profile data
name required | string User full name |
email required | string User email to register |
timezone | string User timezone self setting |
password required | string Desired password, must meet password policy (at least 6 characters) |
twoFactorAuth | boolean Default: false Enable 2FA |
referrer | string If specified, a referrer, where the user was brought from |
{- "name": "string",
- "email": "string",
- "timezone": "string",
- "password": "string",
- "twoFactorAuth": false,
- "referrer": "string"
}
{- "data": { }
}
Get an email to restore (reset) your password
email required | string |
const fetch = require('node-fetch'); const query = new URLSearchParams({email: 'string'}).toString(); const resp = await fetch( `https://api2.timedoctor.com/api/1.0/profile/restore-password?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": { }
}
const fetch = require('node-fetch'); const query = new URLSearchParams({ token: 'YOUR_API_KEY_HERE' }).toString(); const resp = await fetch( `https://api2.timedoctor.com/api/1.0/logout?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": { }
}
Get list of own administered companies or workspaces in a company. In case there is no owned company record for this auth token, it will return an empty list.
no-workspaces | string If specified, result will contain directly tracking companies/workspaces |
const fetch = require('node-fetch'); const query = new URLSearchParams({ 'no-workspaces': 'true', token: 'YOUR_API_KEY_HERE' }).toString(); const resp = await fetch( `https://api2.timedoctor.com/api/1.0/companies?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": [
- {
- "role": "string",
- "hiredAt": "string",
- "lastSeen": {
- "updatedAt": "string",
- "online": true,
- "ip": "string"
}, - "tagIds": [
- "string"
], - "onlyProjectIds": [
- "string"
], - "name": "string",
- "company": {
- "id": "string",
- "name": "string",
- "createdAt": "string",
- "oldCompanyId": "string",
- "noWorkspaces": true,
- "timezone": "string",
- "locked": true,
- "userCount": 0,
- "userDiscount": 0,
- "forceUserCount": 0,
- "minBillableUsers": 0,
- "allUsersTagId": "string",
- "subscription": {
- "plan": "string",
- "status": "string",
- "expires": "string"
}, - "settings": {
- "name": "string",
- "employeeId": "string",
- "exists": true,
- "active": true,
- "screenshots": 0,
- "videos": "string",
- "workCheckInterval": 0,
- "allowEditTime": true,
- "poorTimeusePopup": true,
- "allowDeleteScreenshots": true,
- "tasksMode": "string",
- "trackingMode": "string",
- "showOnReports": true,
- "emailReports": "string",
- "blurScreenshots": true,
- "allowNoBreak": true,
- "trackInternetConnectivity": true,
- "signupStep": 0,
- "stripUrlQuery": true,
- "allowAdminSID": true,
- "hideScreencasts": true,
- "payrollAccess": true,
- "payrollFeature": true,
- "workScheduleFeature": true,
- "trackConnectivity": true,
- "allowManagerTagCategories": true,
- "allowManagerProjectsTasks": true,
- "allowManagerInviteUsers": true,
- "allowManagerWorkSchedules": true,
- "forceAutostart": true,
- "firstDayOfWeek": true,
- "custom": {
- "browserExtensionEnabled": true,
- "completedStep": {
- "manageUsers": true,
- "setupGroups": true,
- "companySettings": true
}
}, - "webAndAppTracking": "off"
}, - "splitTest": [
- {
- "name": "string",
- "value": "string"
}
], - "pricingPlan": "string"
}, - "custom": {
- "completedStep": {
- "addEmployee": true,
- "employeeTrack": true,
- "confirmEmail": true,
- "companySettings": true
}
}, - "isSilent": true,
- "isInteractive": true,
- "allowManual": true
}
]
}
Add a company or a workspace
company | string If specified, ID of Company or Workspace, user refers to. If omitted, the operation refers to global |
noWorkspaces | boolean |
name required | string Name of the company/workspace |
description | string Optional description of company/workspace |
creator | string ID of User who created |
timezone | string Name of timezone, it works by (default: "Etc/UTC") |
pricingPlan | string Pricing plan of company |
newOwnerId | string New company owner |
object Tracking time information for silent companies |
{- "noWorkspaces": true,
- "name": "string",
- "description": "string",
- "creator": "string",
- "timezone": "string",
- "pricingPlan": "basic",
- "newOwnerId": "string",
- "silentTrackingTimes": {
- "days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "hours": [
- [
- "8:00",
- "13:00"
], - [
- "14:00",
- "17:00"
]
], - "timezone": "UTC"
}
}
{- "data": {
- "id": "string",
- "name": "string",
- "createdAt": "string",
- "creatorId": "string",
- "oldCompanyId": "string",
- "noWorkspaces": true,
- "timezone": "string",
- "locked": true,
- "userCount": 0,
- "userDiscount": 0,
- "forceUserCount": 0,
- "minBillableUsers": 0,
- "uniqueUserCount": 0,
- "allUsersTagId": "string",
- "subscription": {
- "plan": "string",
- "status": "string",
- "expires": "string"
}, - "settings": {
- "name": "string",
- "employeeId": "string",
- "exists": true,
- "active": true,
- "screenshots": 0,
- "videos": "string",
- "workCheckInterval": 0,
- "allowEditTime": true,
- "poorTimeusePopup": true,
- "allowDeleteScreenshots": true,
- "tasksMode": "string",
- "trackingMode": "string",
- "showOnReports": true,
- "emailReports": "string",
- "blurScreenshots": true,
- "allowNoBreak": true,
- "trackInternetConnectivity": true,
- "signupStep": 0,
- "stripUrlQuery": true,
- "allowAdminSID": true,
- "hideScreencasts": true,
- "payrollAccess": true,
- "payrollFeature": true,
- "workScheduleFeature": true,
- "trackConnectivity": true,
- "allowManagerTagCategories": true,
- "allowManagerProjectsTasks": true,
- "allowManagerInviteUsers": true,
- "allowManagerWorkSchedules": true,
- "forceAutostart": true,
- "firstDayOfWeek": true,
- "custom": {
- "browserExtensionEnabled": true,
- "completedStep": {
- "manageUsers": true,
- "setupGroups": true,
- "companySettings": true
}
}, - "webAndAppTracking": "off"
}, - "splitTest": [
- {
- "name": "string",
- "value": "string"
}
], - "pricingPlan": "string"
}
}
Get company by ID
companyId required | string ID of Company or Workspace |
const fetch = require('node-fetch'); const query = new URLSearchParams({ token: 'YOUR_API_KEY_HERE' }).toString(); const companyId = 'YOUR_companyId_PARAMETER'; const resp = await fetch( `https://api2.timedoctor.com/api/1.0/companies/${companyId}?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": {
- "id": "string",
- "name": "string",
- "createdAt": "string",
- "creatorId": "string",
- "oldCompanyId": "string",
- "noWorkspaces": true,
- "timezone": "string",
- "locked": true,
- "userCount": 0,
- "userDiscount": 0,
- "forceUserCount": 0,
- "minBillableUsers": 0,
- "uniqueUserCount": 0,
- "allUsersTagId": "string",
- "subscription": {
- "plan": "string",
- "status": "string",
- "expires": "string"
}, - "settings": {
- "name": "string",
- "employeeId": "string",
- "exists": true,
- "active": true,
- "screenshots": 0,
- "videos": "string",
- "workCheckInterval": 0,
- "allowEditTime": true,
- "poorTimeusePopup": true,
- "allowDeleteScreenshots": true,
- "tasksMode": "string",
- "trackingMode": "string",
- "showOnReports": true,
- "emailReports": "string",
- "blurScreenshots": true,
- "allowNoBreak": true,
- "trackInternetConnectivity": true,
- "signupStep": 0,
- "stripUrlQuery": true,
- "allowAdminSID": true,
- "hideScreencasts": true,
- "payrollAccess": true,
- "payrollFeature": true,
- "workScheduleFeature": true,
- "trackConnectivity": true,
- "allowManagerTagCategories": true,
- "allowManagerProjectsTasks": true,
- "allowManagerInviteUsers": true,
- "allowManagerWorkSchedules": true,
- "forceAutostart": true,
- "firstDayOfWeek": true,
- "custom": {
- "browserExtensionEnabled": true,
- "completedStep": {
- "manageUsers": true,
- "setupGroups": true,
- "companySettings": true
}
}, - "webAndAppTracking": "off"
}, - "splitTest": [
- {
- "name": "string",
- "value": "string"
}
], - "pricingPlan": "string"
}
}
Modify details of a company
companyId required | string ID of Company or Workspace |
noWorkspaces | boolean |
name required | string Name of the company/workspace |
description | string Optional description of company/workspace |
creator | string ID of User who created |
timezone | string Name of timezone, it works by (default: "Etc/UTC") |
pricingPlan | string Pricing plan of company |
newOwnerId | string New company owner |
object Tracking time information for silent companies |
{- "noWorkspaces": true,
- "name": "string",
- "description": "string",
- "creator": "string",
- "timezone": "string",
- "pricingPlan": "basic",
- "newOwnerId": "string",
- "silentTrackingTimes": {
- "days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "hours": [
- [
- "8:00",
- "13:00"
], - [
- "14:00",
- "17:00"
]
], - "timezone": "UTC"
}
}
{- "data": { }
}
Get all the timezones for all company users
companyId required | string ID of Company or Workspace |
const fetch = require('node-fetch'); const query = new URLSearchParams({ token: 'YOUR_API_KEY_HERE' }).toString(); const companyId = 'YOUR_companyId_PARAMETER'; const resp = await fetch( `https://api2.timedoctor.com/api/1.0/companies/${companyId}/timezones?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": [
- "string"
]
}
Get list of own administered companies
userId required | string ID of User ( |
company required | string ID of Company or Workspace, user refers to. |
self | string If specified, returns user data of |
detail | string Level of detail in reply |
task-project-names | string If specified, the method will resolve the names for tasks and projects |
no-tag | string Return only users without tags |
page | string if specified, page ID to get results for; or first page by default |
limit | string if specified, maximum number of items to be returned; or use API-specific hard limit by default |
sort | string which field to sort by, prepend it with "_" for descending sorting |
filter[id] | Array of strings "string" -- exact match |
filter[email] | Array of strings "string" -- starts with |
filter[name] | Array of strings "string" -- starts with |
filter[tag] | Array of strings "string" -- exact match |
filter[keywords] | Array of strings unknown API-defined value |
filter[role] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[showOnReports] | Array of strings unknown API-defined value |
filter[payrollAccess] | Array of strings unknown API-defined value |
filter[screenshots] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[videos] | Array of strings "string" -- exact match |
filter[created] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[hostName] | Array of strings "string" -- starts with |
filter[os] | Array of strings "string" -- exact match |
filter[hiredAt] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[lastTrack] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[lastActiveTrack] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[clientVersion] | Array of strings "string" -- exact match |
filter[ip] | Array of strings "string" -- starts with |
filter[show-on-reports] | Array of strings unknown API-defined value |
filter[payroll-access] | Array of strings unknown API-defined value |
filter[host-name] | Array of strings "string" -- starts with |
filter[hired-at] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[last-track] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[last-active-track] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[client-version] | Array of strings "string" -- exact match |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', self: 'true', detail: 'id', 'task-project-names': 'true', 'no-tag': 'true', page: 'string', limit: 'string', sort: 'id', 'filter[id]': 'string', 'filter[email]': 'string', 'filter[name]': 'string', 'filter[tag]': 'string', 'filter[keywords]': 'string', 'filter[role]': 'string', 'filter[showOnReports]': 'string', 'filter[payrollAccess]': 'string', 'filter[screenshots]': 'string', 'filter[videos]': 'string', 'filter[created]': 'string', 'filter[hostName]': 'string', 'filter[os]': 'string', 'filter[hiredAt]': 'string', 'filter[lastTrack]': 'string', 'filter[lastActiveTrack]': 'string', 'filter[clientVersion]': 'string', 'filter[ip]': 'string', 'filter[show-on-reports]': 'string', 'filter[payroll-access]': 'string', 'filter[host-name]': 'string', 'filter[hired-at]': 'string', 'filter[last-track]': 'string', 'filter[last-active-track]': 'string', 'filter[client-version]': 'string', token: 'YOUR_API_KEY_HERE' }).toString(); const userId = 'YOUR_userId_PARAMETER'; const resp = await fetch( `https://api2.timedoctor.com/api/1.0/users/${userId}/managed?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": [
- {
- "hiredAt": "string",
- "timezone": "string",
- "active": true,
- "profileTimezone": "string",
- "status": "string",
- "createdAt": "string",
- "id": "string",
- "twoFactorAuth": true,
- "email": "string",
- "emailConfirmed": true,
- "reportIn24HourFormat": true,
- "managerBannerDismissed": "notShown",
- "name": "string",
- "role": "owner",
- "onlyProjectIds": [
- "string"
]
}
], - "page": {
- "cur": "string",
- "next": "string",
- "limit": 0,
- "totalCount": 0
}, - "self": {
- "hiredAt": "string",
- "timezone": "string",
- "active": true,
- "profileTimezone": "string",
- "status": "string",
- "createdAt": "string",
- "id": "string",
- "twoFactorAuth": true,
- "email": "string",
- "emailConfirmed": true,
- "reportIn24HourFormat": true,
- "managerBannerDismissed": "notShown",
- "name": "string",
- "role": "owner",
- "onlyProjectIds": [
- "string"
]
}
}
Get/resolve list of users
company | string If specified, ID of Company or Workspace, user refers to. If omitted, the operation refers to global |
user | string If specified, a comma-separated list of user IDs to resolve with same array indexes in reply as indexes in list (alias of this param is |
manager | string If specified, a user ID of a manager, the only managed users of whom to return |
tag | string If specified, an ID of a tag, the only members of which to return |
self | string If specified, returns user data of |
detail | string Level of detail in reply |
task-project-names | string If specified, the method will resolve the names for tasks and projects |
no-tag | string Return only users without tags |
deleted | string Operate on active or disabled (deleted) user |
page | string if specified, page ID to get results for; or first page by default |
limit | string if specified, maximum number of items to be returned; or use API-specific hard limit by default |
sort | string which field to sort by, prepend it with "_" for descending sorting |
filter[id] | Array of strings "string" -- exact match |
filter[email] | Array of strings "string" -- starts with |
filter[name] | Array of strings "string" -- starts with |
filter[tag] | Array of strings "string" -- exact match |
filter[keywords] | Array of strings unknown API-defined value |
filter[role] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[showOnReports] | Array of strings unknown API-defined value |
filter[payrollAccess] | Array of strings unknown API-defined value |
filter[screenshots] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[videos] | Array of strings "string" -- exact match |
filter[created] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[hostName] | Array of strings "string" -- starts with |
filter[os] | Array of strings "string" -- exact match |
filter[hiredAt] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[lastTrack] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[lastActiveTrack] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[clientVersion] | Array of strings "string" -- exact match |
filter[ip] | Array of strings "string" -- starts with |
filter[show-on-reports] | Array of strings unknown API-defined value |
filter[payroll-access] | Array of strings unknown API-defined value |
filter[host-name] | Array of strings "string" -- starts with |
filter[hired-at] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[last-track] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[last-active-track] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[client-version] | Array of strings "string" -- exact match |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', user: 'string', manager: 'string', tag: 'string', self: 'true', detail: 'id', 'task-project-names': 'true', 'no-tag': 'true', deleted: 'true', page: 'string', limit: 'string', sort: 'id', 'filter[id]': 'string', 'filter[email]': 'string', 'filter[name]': 'string', 'filter[tag]': 'string', 'filter[keywords]': 'string', 'filter[role]': 'string', 'filter[showOnReports]': 'string', 'filter[payrollAccess]': 'string', 'filter[screenshots]': 'string', 'filter[videos]': 'string', 'filter[created]': 'string', 'filter[hostName]': 'string', 'filter[os]': 'string', 'filter[hiredAt]': 'string', 'filter[lastTrack]': 'string', 'filter[lastActiveTrack]': 'string', 'filter[clientVersion]': 'string', 'filter[ip]': 'string', 'filter[show-on-reports]': 'string', 'filter[payroll-access]': 'string', 'filter[host-name]': 'string', 'filter[hired-at]': 'string', 'filter[last-track]': 'string', 'filter[last-active-track]': 'string', 'filter[client-version]': 'string', token: 'YOUR_API_KEY_HERE' }).toString(); const resp = await fetch( `https://api2.timedoctor.com/api/1.0/users?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": [
- {
- "hiredAt": "string",
- "timezone": "string",
- "active": true,
- "profileTimezone": "string",
- "status": "string",
- "createdAt": "string",
- "id": "string",
- "twoFactorAuth": true,
- "email": "string",
- "emailConfirmed": true,
- "reportIn24HourFormat": true,
- "managerBannerDismissed": "notShown",
- "name": "string",
- "role": "owner",
- "onlyProjectIds": [
- "string"
]
}
], - "page": {
- "cur": "string",
- "next": "string",
- "limit": 0,
- "totalCount": 0
}, - "self": {
- "hiredAt": "string",
- "timezone": "string",
- "active": true,
- "profileTimezone": "string",
- "status": "string",
- "createdAt": "string",
- "id": "string",
- "twoFactorAuth": true,
- "email": "string",
- "emailConfirmed": true,
- "reportIn24HourFormat": true,
- "managerBannerDismissed": "notShown",
- "name": "string",
- "role": "owner",
- "onlyProjectIds": [
- "string"
]
}
}
Get user by ID
userId required | string ID of User ( |
company | string If specified, ID of Company or Workspace, user refers to. If omitted, the operation refers to global |
detail | string Level of detail in reply |
task-project-names | string If specified, the method will resolve the names for tasks and projects |
no-tag | string Return only users without tags |
deleted | string Operate on active or disabled (deleted) user |
page | string if specified, page ID to get results for; or first page by default |
limit | string if specified, maximum number of items to be returned; or use API-specific hard limit by default |
sort | string which field to sort by, prepend it with "_" for descending sorting |
filter[id] | Array of strings "string" -- exact match |
filter[email] | Array of strings "string" -- starts with |
filter[name] | Array of strings "string" -- starts with |
filter[tag] | Array of strings "string" -- exact match |
filter[keywords] | Array of strings unknown API-defined value |
filter[role] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[showOnReports] | Array of strings unknown API-defined value |
filter[payrollAccess] | Array of strings unknown API-defined value |
filter[screenshots] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[videos] | Array of strings "string" -- exact match |
filter[created] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[hostName] | Array of strings "string" -- starts with |
filter[os] | Array of strings "string" -- exact match |
filter[hiredAt] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[lastTrack] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[lastActiveTrack] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[clientVersion] | Array of strings "string" -- exact match |
filter[ip] | Array of strings "string" -- starts with |
filter[show-on-reports] | Array of strings unknown API-defined value |
filter[payroll-access] | Array of strings unknown API-defined value |
filter[host-name] | Array of strings "string" -- starts with |
filter[hired-at] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[last-track] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[last-active-track] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[client-version] | Array of strings "string" -- exact match |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', detail: 'id', 'task-project-names': 'true', 'no-tag': 'true', deleted: 'true', page: 'string', limit: 'string', sort: 'id', 'filter[id]': 'string', 'filter[email]': 'string', 'filter[name]': 'string', 'filter[tag]': 'string', 'filter[keywords]': 'string', 'filter[role]': 'string', 'filter[showOnReports]': 'string', 'filter[payrollAccess]': 'string', 'filter[screenshots]': 'string', 'filter[videos]': 'string', 'filter[created]': 'string', 'filter[hostName]': 'string', 'filter[os]': 'string', 'filter[hiredAt]': 'string', 'filter[lastTrack]': 'string', 'filter[lastActiveTrack]': 'string', 'filter[clientVersion]': 'string', 'filter[ip]': 'string', 'filter[show-on-reports]': 'string', 'filter[payroll-access]': 'string', 'filter[host-name]': 'string', 'filter[hired-at]': 'string', 'filter[last-track]': 'string', 'filter[last-active-track]': 'string', 'filter[client-version]': 'string', token: 'YOUR_API_KEY_HERE' }).toString(); const userId = 'YOUR_userId_PARAMETER'; const resp = await fetch( `https://api2.timedoctor.com/api/1.0/users/${userId}?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": {
- "hiredAt": "string",
- "timezone": "string",
- "active": true,
- "profileTimezone": "string",
- "status": "string",
- "createdAt": "string",
- "id": "string",
- "twoFactorAuth": true,
- "email": "string",
- "emailConfirmed": true,
- "reportIn24HourFormat": true,
- "managerBannerDismissed": "notShown",
- "name": "string",
- "role": "owner",
- "onlyProjectIds": [
- "string"
], - "employeeId": "string",
- "exists": true,
- "screenshots": 0,
- "videos": "string",
- "workCheckInterval": 0,
- "allowEditTime": true,
- "poorTimeusePopup": true,
- "allowDeleteScreenshots": true,
- "tasksMode": "string",
- "trackingMode": "string",
- "showOnReports": true,
- "emailReports": "string",
- "blurScreenshots": true,
- "allowNoBreak": true,
- "trackInternetConnectivity": true,
- "signupStep": 0,
- "stripUrlQuery": true,
- "allowAdminSID": true,
- "hideScreencasts": true,
- "payrollAccess": true,
- "payrollFeature": true,
- "workScheduleFeature": true,
- "trackConnectivity": true,
- "allowManagerTagCategories": true,
- "allowManagerProjectsTasks": true,
- "allowManagerInviteUsers": true,
- "allowManagerWorkSchedules": true,
- "forceAutostart": true,
- "firstDayOfWeek": true,
- "custom": {
- "browserExtensionEnabled": true,
- "completedStep": {
- "manageUsers": true,
- "setupGroups": true,
- "companySettings": true
}
}, - "webAndAppTracking": "off",
- "managerIds": [
- "string"
], - "tagIds": [
- "string"
], - "silentInfo": [
- "string"
]
}
}
Modify user data in company
userId required | string ID of User ( |
company required | string ID of Company or Workspace, user refers to. |
deleted | string Operate on active or disabled (deleted) user |
name | string User's name |
role | string User role in company |
onlyProjectIds | Array of strings If specified, will replace project access, use empty array to allow all access |
employeeId | string The ID of the employee at the company where they work |
exists | boolean |
active | boolean Determines if the invited user is ready to work without post-confirmaton |
screenshots | integer <int32> The interval (in seconds) at which screenshots are taken of the user's screen(s) while they're working. |
videos | string "Video" means that a continuous video of the user's computer screen(s) will be taken while working, broken into 3-minute chunks. "Off" means that no videos will be recorded. |
workCheckInterval | integer <int32> How many seconds interval before checking if the user is working |
allowEditTime | boolean Regular users edit their own time, managers edit their own time and the time of the people they manage while admins edit anyone's time. |
poorTimeusePopup | boolean Show pop up if the user is not making proper use of their time |
allowDeleteScreenshots | boolean Allows users to delete screenshots and video recordings that are taken of their screen. When one is deleted, the associated work time is also removed. |
tasksMode | string Determines if a user is allowed to track tasks or not. There are two options: "preset" and "off" |
trackingMode | string Determines how the user's time is tracked. There are two settings: "silent" and "interactive". Interactive mode allows the user select the tasks to track time on. Silent mode just records all activities non-stop. |
showOnReports | boolean Sets if the user should show on the report like the Daily Report email |
emailReports | string Sets if the admin will get email report |
blurScreenshots | boolean Screenshots taken of the user's computer and activity will be blurred. |
allowNoBreak | boolean When a user is using certain call/video applications like Zoom for work, do not put the user on break |
trackInternetConnectivity | boolean Monitor user internet connectivity and notify them if it is poor |
stripUrlQuery | boolean This removes query parameters from visited URLs (everything after “?”) that are stored and shown in reports. You might want to enable it due to privacy and security concerns. |
allowAdminSID | boolean Allow app to run on administrator accounts |
hideScreencasts | boolean Allow the user see screencasts or not |
payrollAccess | boolean Allow the user access the payroll feature. Only the company owner can set this for a user |
payrollFeature | boolean Only the company owner can turn the Payroll feature on or off. |
workScheduleFeature | boolean Turn the Work Schedule feature on or off for a company. |
trackConnectivity | boolean Start tracking connectivity data for the company. |
allowManagerTagCategories | boolean Allow managers to set productivity ratings |
allowManagerProjectsTasks | boolean Allow managers to create projects and tasks |
allowManagerInviteUsers | boolean Allow managers to invite new users |
allowManagerWorkSchedules | boolean Allow managers to set their work schedules and the schedules of people they manage |
forceAutostart | boolean Force desktop apps to start tracking automatically at the start of each day |
firstDayOfWeek | boolean Set first day of week (0=Sunday; 1 by default) |
webAndAppTracking | string Set tracking type (extended by default) |
{- "name": "string",
- "role": "owner",
- "onlyProjectIds": [
- "string"
], - "employeeId": "string",
- "exists": true,
- "active": true,
- "screenshots": 0,
- "videos": "string",
- "workCheckInterval": 0,
- "allowEditTime": true,
- "poorTimeusePopup": true,
- "allowDeleteScreenshots": true,
- "tasksMode": "string",
- "trackingMode": "string",
- "showOnReports": true,
- "emailReports": "string",
- "blurScreenshots": true,
- "allowNoBreak": true,
- "trackInternetConnectivity": true,
- "stripUrlQuery": true,
- "allowAdminSID": true,
- "hideScreencasts": true,
- "payrollAccess": true,
- "payrollFeature": true,
- "workScheduleFeature": true,
- "trackConnectivity": true,
- "allowManagerTagCategories": true,
- "allowManagerProjectsTasks": true,
- "allowManagerInviteUsers": true,
- "allowManagerWorkSchedules": true,
- "forceAutostart": true,
- "firstDayOfWeek": true,
- "webAndAppTracking": "off"
}
{- "data": { }
}
Delete user from a company
userId required | string ID of User ( |
company required | string ID of Company or Workspace, user refers to. |
deleted | string Operate on active or disabled (deleted) user |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', deleted: 'true', token: 'YOUR_API_KEY_HERE' }).toString(); const userId = 'YOUR_userId_PARAMETER'; const resp = await fetch( `https://api2.timedoctor.com/api/1.0/users/${userId}?${query}`, {method: 'DELETE'} ); const data = await resp.text(); console.log(data);
{- "data": { }
}
Invite new user to company
NOTE: If you have paid for the month and then you add more users to the account later, you’ll be charged a prorated amount for the remainder of the month for each new user added.
company required | string ID of Company or Workspace, user refers to. |
name | string Optional full name of invited user |
email required | string Email of invited user |
role | string A role of invited user in company |
employeeId | string Optional employee ID of invited user |
noSendEmail | string Don't send invitation email |
onlyProjectIds | Array of strings If specified, allows only specified project IDs to be accessed |
{- "name": "string",
- "email": "string",
- "role": "owner",
- "employeeId": "string",
- "noSendEmail": "true",
- "onlyProjectIds": [
- "string"
]
}
{- "data": { }
}
Get list of user's invitations (TODO:)
company required | string ID of Company or Workspace, user refers to. |
email required | string |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', email: 'string', token: 'YOUR_API_KEY_HERE' }).toString(); const resp = await fetch( `https://api2.timedoctor.com/api/1.0/invitations/exists?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": {
- "name": "string",
- "invitePending": true,
- "id": "string"
}
}
Get list of projects in company
company required | string ID of Company or Workspace, user refers to. |
projects | string If specified, comma-separated list of IDs of projects to resolve |
all | string If specified, returns all projects instead of assigned |
show-integration | string If set, integration projects will be also listed |
detail | string Level of details ( |
user | string If specified, a comma-separated list of user IDs to resolve the accessible projects for; it's for yourself by default |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', projects: 'string', all: 'true', 'show-integration': 'true', detail: 'basic', user: 'string', token: 'YOUR_API_KEY_HERE' }).toString(); const resp = await fetch( `https://api2.timedoctor.com/api/1.0/projects?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": [
- {
- "integration": {
- "provider": "string",
- "data": { }
}, - "name": "string",
- "description": "string",
- "deleted": true,
- "weight": 0
}
], - "page": {
- "cur": "string",
- "next": "string",
- "limit": 0,
- "totalCount": 0
}
}
Add a project
company required | string ID of Company or Workspace, user refers to. |
scope | string Scope of project |
Array of objects Details of users who have access to | |
cloneTasksFromId | string If specified, all the tasks for new project will be cloned from project with given ID |
cloneAccessFromId | string If specified, users access will be cloned from project with given ID |
name | string Project name |
description | string Project description |
deleted | boolean Is project deleted (archived)? |
weight | number Priority measure |
{- "scope": "workspace",
- "users": [
- {
- "id": "string",
- "role": "tag"
}
], - "cloneTasksFromId": "string",
- "cloneAccessFromId": "string",
- "name": "string",
- "description": "string",
- "deleted": true,
- "weight": 0
}
{- "data": {
- "integration": {
- "provider": "string",
- "data": { }
}, - "name": "string",
- "description": "string",
- "deleted": true,
- "weight": 0
}
}
Get details of a project
projectId required | string ID of Project |
company required | string ID of Company or Workspace, user refers to. |
deleted | string If specified, operates on deleted project instead of active. |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', deleted: 'true', token: 'YOUR_API_KEY_HERE' }).toString(); const projectId = 'YOUR_projectId_PARAMETER'; const resp = await fetch( `https://api2.timedoctor.com/api/1.0/projects/${projectId}?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": {
- "integration": {
- "provider": "string",
- "data": { }
}, - "name": "string",
- "description": "string",
- "deleted": true,
- "weight": 0
}
}
Modify details of a project
projectId required | string ID of Project |
company required | string ID of Company or Workspace, user refers to. |
deleted | string If specified, operates on deleted project instead of active. |
name | string Project name |
description | string Project description |
deleted | boolean Is project deleted (archived)? |
weight | number Priority measure |
{- "name": "string",
- "description": "string",
- "deleted": true,
- "weight": 0
}
{- "data": { }
}
Delete a project
projectId required | string ID of Project |
company required | string ID of Company or Workspace, user refers to. |
deleted | string If specified, operates on deleted project instead of active. |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', deleted: 'true', token: 'YOUR_API_KEY_HERE' }).toString(); const projectId = 'YOUR_projectId_PARAMETER'; const resp = await fetch( `https://api2.timedoctor.com/api/1.0/projects/${projectId}?${query}`, {method: 'DELETE'} ); const data = await resp.text(); console.log(data);
{ }
Make project private and add/change user access
projectId required | string ID of Project |
userId required | string ID of User which access shall be changed |
company required | string ID of Company or Workspace, user refers to. |
deleted | string If specified, operates on deleted project instead of active. |
role | string Role of user in project ( |
{- "role": "tag"
}
{ }
Delete a project user access
projectId required | string ID of Project |
userId required | string ID of User which access shall be changed |
company required | string ID of Company or Workspace, user refers to. |
deleted | string If specified, operates on deleted project instead of active. |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', deleted: 'true', token: 'YOUR_API_KEY_HERE' }).toString(); const projectId = 'YOUR_projectId_PARAMETER'; const userId = 'YOUR_userId_PARAMETER'; const resp = await fetch( `https://api2.timedoctor.com/api/1.0/projects/${projectId}/users/${userId}?${query}`, {method: 'DELETE'} ); const data = await resp.text(); console.log(data);
{ }
Make project public access
projectId required | string ID of Project |
company required | string ID of Company or Workspace, user refers to. |
deleted | string If specified, operates on deleted project instead of active. |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', deleted: 'true', token: 'YOUR_API_KEY_HERE' }).toString(); const projectId = 'YOUR_projectId_PARAMETER'; const resp = await fetch( `https://api2.timedoctor.com/api/1.0/projects/${projectId}/users?${query}`, {method: 'DELETE'} ); const data = await resp.text(); console.log(data);
{ }
Get list of tasks in company
company required | string ID of Company or Workspace, user refers to. |
tasks | string If specified, comma-separated list of IDs of tasks to resolve. |
projects | string Comma-separated IDs of Projects to filter tasks by. |
folders | string Comma-separated IDs of Folders to filter tasks by. |
filter | string Filter the tasks by user. |
user | string ID of user to get the tasks for. (caller by default) |
show-integration | string If set, integration tasks will be also listed |
deleted | string Set to get deleted tasks instead of active. |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', tasks: 'string', projects: 'string', folders: 'string', filter: 'assigned', user: 'string', 'show-integration': 'true', deleted: 'true', token: 'YOUR_API_KEY_HERE' }).toString(); const resp = await fetch( `https://api2.timedoctor.com/api/1.0/tasks?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": [
- {
- "id": "string",
- "status": "string",
- "reporterId": "string",
- "deleted": true,
- "deletedAt": "string",
- "folders": { },
- "project": {
- "id": "string",
- "weight": 0
}, - "name": "string",
- "description": "string",
- "integration": {
- "provider": "string",
- "data": { }
}
}
], - "page": {
- "cur": "string",
- "next": "string",
- "limit": 0,
- "totalCount": 0
}
}
Add a task
company required | string ID of Company or Workspace, user refers to. |
object | |
name | string Task name |
description | string Task description |
weight | number Priority measure |
deleted | boolean Is task deleted? |
assignedTo | string ID of User, task is assigned to |
{- "project": {
- "id": "string",
- "weight": 0
}, - "name": "string",
- "description": "string",
- "weight": 0,
- "deleted": true,
- "assignedTo": "string"
}
{- "data": {
- "id": "string",
- "status": "string",
- "reporterId": "string",
- "deleted": true,
- "deletedAt": "string",
- "folders": { },
- "project": {
- "id": "string",
- "weight": 0
}, - "name": "string",
- "description": "string",
- "integration": {
- "provider": "string",
- "data": { }
}
}
}
Get details of a task
taskId required | string ID of Task |
company required | string ID of Company or Workspace, user refers to. |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', token: 'YOUR_API_KEY_HERE' }).toString(); const taskId = 'YOUR_taskId_PARAMETER'; const resp = await fetch( `https://api2.timedoctor.com/api/1.0/tasks/${taskId}?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": {
- "id": "string",
- "status": "string",
- "reporterId": "string",
- "deleted": true,
- "deletedAt": "string",
- "folders": { },
- "project": {
- "id": "string",
- "weight": 0
}, - "name": "string",
- "description": "string",
- "integration": {
- "provider": "string",
- "data": { }
}
}
}
Modify details of a task
taskId required | string ID of Task |
company required | string ID of Company or Workspace, user refers to. |
object | |
name | string Task name |
description | string Task description |
weight | number Priority measure |
deleted | boolean Is task deleted? |
assignedTo | string ID of User, task is assigned to |
{- "project": {
- "id": "string",
- "weight": 0
}, - "name": "string",
- "description": "string",
- "weight": 0,
- "deleted": true,
- "assignedTo": "string"
}
{- "data": { }
}
Set to restore (unarchive) the task instead of archiving it.
taskId required | string ID of Task |
company required | string ID of Company or Workspace, user refers to. |
deleted | string Set to restore (unarchive) the task instead of archiving it. |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', deleted: 'true', token: 'YOUR_API_KEY_HERE' }).toString(); const taskId = 'YOUR_taskId_PARAMETER'; const resp = await fetch( `https://api2.timedoctor.com/api/1.0/tasks/${taskId}?${query}`, {method: 'DELETE'} ); const data = await resp.text(); console.log(data);
{- "data": { }
}
Get detailed worklog for a user
NOTE: It is recommended to run this API call for 7 days at a time to avoid performance issues.
company required | string ID of Company or Workspace, user refers to. |
user | string Comma-separated list of user IDs |
from | string <date-time> ISO Date of range beginning (inclusive); ( |
to | string <date-time> ISO Date of range ending (exclusive); current by default |
detail | string If specified, the method will return detailed activities with device IDs and comments |
task-project-names | string If specified, the method will resolve the names for tasks and projects |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', user: 'string', from: '2019-08-24T14:15:22Z', to: '2019-08-24T14:15:22Z', detail: 'true', 'task-project-names': 'true', token: 'YOUR_API_KEY_HERE' }).toString(); const resp = await fetch( `https://api2.timedoctor.com/api/1.0/activity/worklog?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": [
- {
- "taskId": "string",
- "projectId": "string",
- "mode": "offline",
- "date": "2019-08-24T14:15:22Z",
- "start": "2019-08-24T14:15:22Z",
- "time": 0,
- "userId": "string",
- "taskName": "string",
- "projectName": "string",
- "deviceId": "string"
}
]
}
Get detailed timeuse for a user
company required | string ID of Company or Workspace, user refers to. |
user | string Comma-separated list of user IDs |
from | string <date-time> ISO Date of range beginning (inclusive); ( |
to | string <date-time> ISO Date of range ending (exclusive); current by default |
detail | string If specified, the method will return detailed activities with device IDs and comments |
category | string If specified, ID of category to filter by |
category-details | string If specified, the method will resolve the details for categories |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', user: 'string', from: '2019-08-24T14:15:22Z', to: '2019-08-24T14:15:22Z', detail: 'true', category: 'string', 'category-details': 'true', token: 'YOUR_API_KEY_HERE' }).toString(); const resp = await fetch( `https://api2.timedoctor.com/api/1.0/activity/timeuse?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": [
- {
- "start": "2019-08-24T14:15:22Z",
- "time": 0,
- "score": 0,
- "category": {
- "id": "string",
- "entity": "string",
- "name": "string",
- "scope": "string",
- "score": 0,
- "time": 0
}, - "type": "string",
- "value": "string",
- "title": "string"
}
]
}
Get timeise stats of user
company required | string ID of Company or Workspace, user refers to. |
from | string <date-time> ISO Date of range beginning (inclusive); ( |
to | string <date-time> ISO Date of range ending (exclusive); current by default |
user | string Comma-separated list of user IDs |
category | string Category to fetch report for |
page | string if specified, page ID to get results for; or first page by default |
limit | string if specified, maximum number of items to be returned; or use API-specific hard limit by default |
sort | string which field to sort by, prepend it with "_" for descending sorting |
filter[time] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[score] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[category] | Array of strings "string" -- exact match |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', from: '2019-08-24T14:15:22Z', to: '2019-08-24T14:15:22Z', user: 'string', category: 'string', page: 'string', limit: 'string', sort: 'time', 'filter[time]': 'string', 'filter[score]': 'string', 'filter[category]': 'string', token: 'YOUR_API_KEY_HERE' }).toString(); const resp = await fetch( `https://api2.timedoctor.com/api/1.0/activity/timeuse/stats?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": [
- {
- "type": "string",
- "value": "string",
- "title": "string",
- "score": 0,
- "time": 0,
- "category": "string",
- "start": "2019-08-24T14:15:22Z",
- "end": "2019-08-24T14:15:22Z"
}
]
}
Get stats for single time range for users
detail required | string Default: "mode-ratio" Determines what stats details to return ( |
company required | string ID of Company or Workspace, user refers to. |
user | string Comma-separated list of User IDs yourself if omitted; |
tag | string Comma-separated list of Tag IDs. If specified, users will be filtered by these tags |
task | string If specified, return only statistics on this task |
fields | string Optional comma-separated list of field names to return. |
group-by | string If specified, will group the results by given field (if such grouping is supported). |
score | string For |
min-time | number >= 0 For |
ids | string If specified, comma-separated IDs of tasks/projects/categories to return info about |
from | string <date-time> ISO Date of range beginning (inclusive); ( |
to | string <date-time> ISO Date of range ending (exclusive); current by default |
page | string if specified, page ID to get results for; or first page by default |
limit | string if specified, maximum number of items to be returned; or use API-specific hard limit by default |
sort | string which field to sort by, prepend it with "_" for descending sorting |
filter[id] | Array of strings "string" -- exact match |
filter[tagId] | Array of strings "string" -- exact match |
filter[userId] | Array of strings "string" -- exact match |
filter[ratio] | Array of strings "string" -- exact match |
filter[partial] | Array of strings "string" -- exact match |
filter[total] | Array of strings "string" -- exact match |
filter[entity] | Array of strings "string" -- exact match |
filter[name] | Array of strings "string" -- exact match |
filter[score] | Array of strings "string" -- exact match |
filter[project] | Array of strings "string" -- exact match |
filter[weight] | Array of strings "string" -- exact match |
filter[status] | Array of strings "string" -- exact match |
filter[active] | Array of strings "string" -- exact match |
filter[assigned] | Array of strings "string" -- exact match |
filter[reporter] | Array of strings "string" -- exact match |
filter[folder] | Array of strings "string" -- exact match |
filter[creator] | Array of strings "string" -- exact match |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', user: 'string', tag: 'string', task: 'string', fields: 'string', 'group-by': 'string', score: 'string', 'min-time': '0', ids: 'string', from: '2019-08-24T14:15:22Z', to: '2019-08-24T14:15:22Z', page: 'string', limit: 'string', sort: 'id', 'filter[id]': 'string', 'filter[tagId]': 'string', 'filter[userId]': 'string', 'filter[ratio]': 'string', 'filter[partial]': 'string', 'filter[total]': 'string', 'filter[entity]': 'string', 'filter[name]': 'string', 'filter[score]': 'string', 'filter[project]': 'string', 'filter[weight]': 'string', 'filter[status]': 'string', 'filter[active]': 'string', 'filter[assigned]': 'string', 'filter[reporter]': 'string', 'filter[folder]': 'string', 'filter[creator]': 'string', token: 'YOUR_API_KEY_HERE' }).toString(); const detail = 'YOUR_detail_PARAMETER'; const resp = await fetch( `https://api2.timedoctor.com/api/1.0/stats/${detail}?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": {
- "users": [
- { }
]
}
}
Get stats for multiple time ranges for users
detail required | string Default: "mode-ratio" Determines what stats details to return ( |
company required | string ID of Company or Workspace, user refers to. |
timezone | string Timezone of ranges breaks. |
period | string Default: "days" Period unit of ranges subdivision. |
interval | integer <int32> >= 1 Number of period units. |
user | string Comma-separated list of User IDs yourself if omitted; |
tag | string Comma-separated list of Tag IDs. If specified, users will be filtered by these tags |
task | string If specified, return only statistics on this task |
fields | string Optional comma-separated list of field names to return. |
group-by | string If specified, will group the results by given field (if such grouping is supported). |
score | string For |
min-time | number >= 0 For |
ids | string If specified, comma-separated IDs of tasks/projects/categories to return info about |
from | string <date-time> ISO Date of range beginning (inclusive); ( |
to | string <date-time> ISO Date of range ending (exclusive); current by default |
page | string if specified, page ID to get results for; or first page by default |
limit | string if specified, maximum number of items to be returned; or use API-specific hard limit by default |
sort | string which field to sort by, prepend it with "_" for descending sorting |
filter[id] | Array of strings "string" -- exact match |
filter[tagId] | Array of strings "string" -- exact match |
filter[userId] | Array of strings "string" -- exact match |
filter[ratio] | Array of strings "string" -- exact match |
filter[partial] | Array of strings "string" -- exact match |
filter[total] | Array of strings "string" -- exact match |
filter[entity] | Array of strings "string" -- exact match |
filter[name] | Array of strings "string" -- exact match |
filter[score] | Array of strings "string" -- exact match |
filter[project] | Array of strings "string" -- exact match |
filter[weight] | Array of strings "string" -- exact match |
filter[status] | Array of strings "string" -- exact match |
filter[active] | Array of strings "string" -- exact match |
filter[assigned] | Array of strings "string" -- exact match |
filter[reporter] | Array of strings "string" -- exact match |
filter[folder] | Array of strings "string" -- exact match |
filter[creator] | Array of strings "string" -- exact match |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', timezone: 'string', period: 'days', interval: '1', user: 'string', tag: 'string', task: 'string', fields: 'string', 'group-by': 'string', score: 'string', 'min-time': '0', ids: 'string', from: '2019-08-24T14:15:22Z', to: '2019-08-24T14:15:22Z', page: 'string', limit: 'string', sort: 'id', 'filter[id]': 'string', 'filter[tagId]': 'string', 'filter[userId]': 'string', 'filter[ratio]': 'string', 'filter[partial]': 'string', 'filter[total]': 'string', 'filter[entity]': 'string', 'filter[name]': 'string', 'filter[score]': 'string', 'filter[project]': 'string', 'filter[weight]': 'string', 'filter[status]': 'string', 'filter[active]': 'string', 'filter[assigned]': 'string', 'filter[reporter]': 'string', 'filter[folder]': 'string', 'filter[creator]': 'string', token: 'YOUR_API_KEY_HERE' }).toString(); const detail = 'YOUR_detail_PARAMETER'; const resp = await fetch( `https://api2.timedoctor.com/api/1.0/stats/timesheet/${detail}?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": [
- {
- "users": [
- { }
]
}
]
}
Get stats for tasks by users
detail required | string Default: "mode" Determines what stats details to return ( |
company required | string ID of Company or Workspace, user refers to. |
task | string If specified, return only statistics on this task |
from | string <date-time> ISO Date of range beginning (inclusive); ( |
to | string <date-time> ISO Date of range ending (exclusive); current by default |
user | string comma separated value of user ids |
tag | string comma separated value of user ids |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', task: 'string', from: '2019-08-24T14:15:22Z', to: '2019-08-24T14:15:22Z', user: 'string', tag: 'string', token: 'YOUR_API_KEY_HERE' }).toString(); const detail = 'YOUR_detail_PARAMETER'; const resp = await fetch( `https://api2.timedoctor.com/api/1.0/stats/${detail}/tasks?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": {
- "users": [
- { }
]
}
}
Get users worked on task
task required | string If specified, return only statistics on this task |
company required | string ID of Company or Workspace, user refers to. |
detail required | string Default: "mode" Determines what stats details to return ( |
from | string <date-time> ISO Date of range beginning (inclusive); ( |
to | string <date-time> ISO Date of range ending (exclusive); current by default |
user | string comma separated value of user ids |
tag | string comma separated value of user ids |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', detail: 'mode', from: '2019-08-24T14:15:22Z', to: '2019-08-24T14:15:22Z', user: 'string', tag: 'string', token: 'YOUR_API_KEY_HERE' }).toString(); const task = 'YOUR_task_PARAMETER'; const resp = await fetch( `https://api2.timedoctor.com/api/1.0/stats/task/${task}/users?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": [
- null
]
}
Get edit time ranges for a user(s)
company required | string ID of Company or Workspace, user refers to. |
user | string Comma-separated list of user IDs |
from | string <date-time> ISO Date of range beginning (inclusive); ( |
to | string <date-time> ISO Date of range ending (exclusive); current by default |
task-project-names | string If specified, the method will resolve the names for tasks and projects |
operation | string If specified, the method will filter by edit operation |
approved | string If specified, the method will filter by approval |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', user: 'string', from: '2019-08-24T14:15:22Z', to: '2019-08-24T14:15:22Z', 'task-project-names': 'true', operation: 'add', approved: 'false', token: 'YOUR_API_KEY_HERE' }).toString(); const resp = await fetch( `https://api2.timedoctor.com/api/1.0/activity/edit-time?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": [
- {
- "userId": "string",
- "start": "2019-08-24T14:15:22Z",
- "taskId": "string",
- "projectId": "string",
- "end": "2019-08-24T14:15:22Z",
- "operation": "add",
- "reason": "string"
}
]
}
Add edit time range for a user
company required | string ID of Company or Workspace, user refers to. |
userId | string ID of the user |
start required | string <date-time> ISO date of beginning |
taskId required | string ID of Task. |
projectId required | string ID of Project. |
end | string <date-time> ISO date of ending (a moment of ending, f.x. a minute interval ends on a moment of next 00-th second) |
operation required | string Edit Time Operation |
reason required | string |
{- "userId": "string",
- "start": "2019-08-24T14:15:22Z",
- "taskId": "string",
- "projectId": "string",
- "end": "2019-08-24T14:15:22Z",
- "operation": "add",
- "reason": "string"
}
{- "data": {
- "userId": "string",
- "start": "2019-08-24T14:15:22Z",
- "taskId": "string",
- "projectId": "string",
- "end": "2019-08-24T14:15:22Z",
- "operation": "add",
- "reason": "string"
}
}
Modify edit time range for a user
id required | string ID of the time to edit |
company required | string ID of Company or Workspace, user refers to. |
userId | string ID of the user |
start required | string <date-time> ISO date of beginning |
taskId required | string ID of Task. |
projectId required | string ID of Project. |
end | string <date-time> ISO date of ending (a moment of ending, f.x. a minute interval ends on a moment of next 00-th second) |
operation required | string Edit Time Operation |
reason required | string |
{- "userId": "string",
- "start": "2019-08-24T14:15:22Z",
- "taskId": "string",
- "projectId": "string",
- "end": "2019-08-24T14:15:22Z",
- "operation": "add",
- "reason": "string"
}
{- "data": {
- "id": "string",
- "mqId": "string"
}
}
Get detailed disconnectivity data for a user
company required | string ID of Company or Workspace, user refers to. |
user | string Comma-separated list of user IDs |
from | string <date-time> ISO Date of range beginning (inclusive); ( |
to | string <date-time> ISO Date of range ending (exclusive); current by default |
const fetch = require('node-fetch'); const query = new URLSearchParams({ company: 'string', user: 'string', from: '2019-08-24T14:15:22Z', to: '2019-08-24T14:15:22Z', token: 'YOUR_API_KEY_HERE' }).toString(); const resp = await fetch( `https://api2.timedoctor.com/api/1.0/activity/disconnectivity?${query}`, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": [
- {
- "start": "2019-08-24T14:15:22Z",
- "end": "2019-08-24T14:15:22Z",
- "time": 0,
- "userId": "string"
}
]
}
Get total stats v1.1.
NOTE:
This documentation uses ratio=score
and sort=modeTotal
as an example.
As such, you can get responses that contain score
and modeTotal
, depending on the parameters you specify when making the request.
It is important to understand that score
will be replaced by the value you specify for the ratio
param and modeTotal
will be replaced by the value you specify for sort
.
For work range use 1.1/stats/total?fields=start,end,workRange
company required | string ID of Company or Workspace, user refers to. |
from | string <date-time> ISO Date of range beginning (inclusive); ( |
to | string <date-time> ISO Date of range ending (exclusive); current by default |
user | string Comma-separated list of User IDs yourself if omitted; |
tag | string Comma-separated list of Tag IDs. If specified, users will be filtered by these tags |
task | string If specified, return only statistics on this task |
unpaid | integer If set to 1, includes unpaid time (from unpaid breaks) into report |
breaks | string Specifies breaks to get. This may not be combined with "task" parameter |
fields | string Optional comma-separated list of field names to return. |
group-by | string If specified, will group the results by given field (if such grouping is supported). |
resolve | string Optional comma-separated list of field names to resolve. |
ratio | string Optional comma-separated list of field names to get total ratio of. |
level | string Level of information ("user" by default) |
timezone | string Timezone of ranges breaks. |
period | string Default: "days" Period unit of ranges subdivision. |
interval | integer <int32> >= 1 Number of period units. |
page | string if specified, page ID to get results for; or first page by default |
limit | string if specified, maximum number of items to be returned; or use API-specific hard limit by default |
sort | string which field to sort by, prepend it with "_" for descending sorting |
filter[offcomputer] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[computer] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[mobile] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[manual] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[mobMan] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[paidBreak] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[unpaidBreak] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[offcomputerRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[computerRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[mobileRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[manualRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[mobManRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[paidBreakRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[unpaidBreakRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[unratedHis] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[unprodHis] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[neutralHis] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[prodHis] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[unratedHisRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[unprodHisRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[neutralHisRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[prodHisRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[unrated] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[unprod] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[neutral] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[prod] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[unratedRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[unprodRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[neutralRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[prodRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[clicks] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[idleSec] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[keys] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[moves] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[totalSec] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[clicksRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[idleSecRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[keysRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[movesRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[totalSecRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[totalMins] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[idleMins] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[idleMinsRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[outShift] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[outShiftRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[project] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[task] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[shift] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[projectRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[taskRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[shiftRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[comCat] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[comCatRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[scoreTotal] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[scoreTotalRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[workRange] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[workRangeRatio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[modeTotal] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[total] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
prefilter[userId] | Array of strings "string" -- exact match |
prefilter[taskId] | Array of strings "string" -- exact match |
prefilter[date] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
prefilter[timezone] | Array of strings "string" -- starts with |
prefilter[start] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
prefilter[end] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
prefilter[item] | Array of strings "string" -- exact match |
filter[ratio] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[ratioTotal] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[count] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
prefilter[quants] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
prefilter[offsets] | Array of strings "ISO_date" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[quant0] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[quant1] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
filter[quant2] | Array of strings "number" -- exact match; or "from_to" -- inclusive range; or "from_"; or "_to" |
ratio-page | string if specified, page ID to get results for; or first page by default |
ratio-limit | string if specified, maximum number of items to be returned; or use API-specific hard limit by default |
ratio-sort | string which field to sort by, prepend it with "_" for descending sorting |