Download OpenAPI specification:Download
For access to this API and assistance using it, please contact us at support2@timedoctor.com
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 Enum: "mixed" "interactive" "silent" Tracking mode of company |
pricingPlan required | string Enum: "10peruserpermonth" "basic" "standard_new" "premium" "business" "enterprise" "basic_july20" "standard_july20" "premium_july20" "resellers" "business_annual" "enterprise_annual" "basic_annual" "standard_new_annual" "premium_annual" Pricing plan of company |
Array of objects If specified, specifies array of objects, describing current split-test |
{- "name": "string",
- "email": "string",
- "timezone": "string",
- "password": "string",
- "referrer": "string",
- "company": "string",
- "trackingMode": "mixed",
- "pricingPlan": "10peruserpermonth",
- "splitTest": [
- {
- "name": "string",
- "value": "string"
}
]
}
{- "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": { }
}
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
no-workspaces | string Enum: "true" "false" 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",
- "parentId": "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,
- "allowManagerTagCategories": true,
- "allowManagerProjectsTasks": true,
- "allowManagerInviteUsers": true,
- "allowManagerWorkSchedules": true,
- "forceAutostart": true,
- "firstDayOfWeek": true,
- "custom": {
- "browserExtensionEnabled": true,
- "completedStep": {
- "manageUsers": true,
- "setupGroups": true,
- "companySettings": true
}
}, - "webAndAppTracking": "off",
- "hasDismissedBanner": true
}, - "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") |
parentId | string If omitted, a new company will be created. If specified, a workspace will be created inside this specified company ID |
pricingPlan | string Enum: "10peruserpermonth" "basic" "standard_new" "premium" "business" "enterprise" "basic_july20" "standard_july20" "premium_july20" "resellers" "business_annual" "enterprise_annual" "basic_annual" "standard_new_annual" "premium_annual" Pricing plan of company |
newOwnerId | string New company owner |
{- "noWorkspaces": true,
- "name": "string",
- "description": "string",
- "creator": "string",
- "timezone": "string",
- "parentId": "string",
- "pricingPlan": "10peruserpermonth",
- "newOwnerId": "string"
}
{- "data": {
- "id": "string",
- "name": "string",
- "createdAt": "string",
- "creatorId": "string",
- "parentId": "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,
- "allowManagerTagCategories": true,
- "allowManagerProjectsTasks": true,
- "allowManagerInviteUsers": true,
- "allowManagerWorkSchedules": true,
- "forceAutostart": true,
- "firstDayOfWeek": true,
- "custom": {
- "browserExtensionEnabled": true,
- "completedStep": {
- "manageUsers": true,
- "setupGroups": true,
- "companySettings": true
}
}, - "webAndAppTracking": "off",
- "hasDismissedBanner": true
}, - "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 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",
- "parentId": "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,
- "allowManagerTagCategories": true,
- "allowManagerProjectsTasks": true,
- "allowManagerInviteUsers": true,
- "allowManagerWorkSchedules": true,
- "forceAutostart": true,
- "firstDayOfWeek": true,
- "custom": {
- "browserExtensionEnabled": true,
- "completedStep": {
- "manageUsers": true,
- "setupGroups": true,
- "companySettings": true
}
}, - "webAndAppTracking": "off",
- "hasDismissedBanner": true
}, - "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") |
parentId | string If omitted, a new company will be created. If specified, a workspace will be created inside this specified company ID |
pricingPlan | string Enum: "10peruserpermonth" "basic" "standard_new" "premium" "business" "enterprise" "basic_july20" "standard_july20" "premium_july20" "resellers" "business_annual" "enterprise_annual" "basic_annual" "standard_new_annual" "premium_annual" Pricing plan of company |
newOwnerId | string New company owner |
{- "noWorkspaces": true,
- "name": "string",
- "description": "string",
- "creator": "string",
- "timezone": "string",
- "parentId": "string",
- "pricingPlan": "10peruserpermonth",
- "newOwnerId": "string"
}
{- "data": { }
}
Delete a company
companyId required | string ID of Company or Workspace |
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/companies/:companyId?' + query, {method: 'DELETE'} ); const data = await resp.text(); console.log(data);
{- "data": { }
}
Modify subscription details of a company
companyId required | string ID of Company or Workspace |
expires | string <date-time> Expiration date |
forceUserCount | integer Always send this nonzero user count to accounting |
userDiscount | integer Send actual number of users minus this value to accounting |
minBillableUsers | integer If nonzero, will force this number of users if less than this |
{- "expires": "2019-08-24T14:15:22Z",
- "forceUserCount": 0,
- "userDiscount": 0,
- "minBillableUsers": 0
}
{- "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 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 Enum: "true" "false" If specified, returns user data of |
detail | string Enum: "id" "name" "info" "alias" "tags" "settings" "managers" Level of detail in reply |
task-project-names | string Enum: "true" "false" If specified, the method will resolve the names for tasks and projects |
no-tag | string Enum: "true" "false" 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 Enum: "id" "email" "name" "tag" "keywords" "role" "show-on-reports" "payroll-access" "screenshots" "videos" "created" "host-name" "os" "hired-at" "last-track" "last-active-track" "client-version" "ip" "_id" "_email" "_name" "_tag" "_keywords" "_role" "_show-on-reports" "_payroll-access" "_screenshots" "_videos" "_created" "_host-name" "_os" "_hired-at" "_last-track" "_last-active-track" "_client-version" "_ip" 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[show-on-reports] | Array of strings unknown API-defined value |
filter[payroll-access] | 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[host-name] | Array of strings "string" -- starts with |
filter[os] | Array of strings "string" -- exact match |
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 |
filter[ip] | Array of strings "string" -- starts with |
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[show-on-reports]': 'string', 'filter[payroll-access]': 'string', 'filter[screenshots]': 'string', 'filter[videos]': 'string', 'filter[created]': 'string', 'filter[host-name]': 'string', 'filter[os]': 'string', 'filter[hired-at]': 'string', 'filter[last-track]': 'string', 'filter[last-active-track]': 'string', 'filter[client-version]': 'string', 'filter[ip]': 'string', token: 'YOUR_API_KEY_HERE' }).toString(); 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,
- "name": "string",
- "role": "tag",
- "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,
- "name": "string",
- "role": "tag",
- "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 Enum: "true" "false" If specified, returns user data of |
detail | string Enum: "id" "name" "info" "alias" "tags" "settings" "managers" Level of detail in reply |
task-project-names | string Enum: "true" "false" If specified, the method will resolve the names for tasks and projects |
no-tag | string Enum: "true" "false" Return only users without tags |
deleted | string Enum: "true" "false" 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 Enum: "id" "email" "name" "tag" "keywords" "role" "show-on-reports" "payroll-access" "screenshots" "videos" "created" "host-name" "os" "hired-at" "last-track" "last-active-track" "client-version" "ip" "_id" "_email" "_name" "_tag" "_keywords" "_role" "_show-on-reports" "_payroll-access" "_screenshots" "_videos" "_created" "_host-name" "_os" "_hired-at" "_last-track" "_last-active-track" "_client-version" "_ip" 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[show-on-reports] | Array of strings unknown API-defined value |
filter[payroll-access] | 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[host-name] | Array of strings "string" -- starts with |
filter[os] | Array of strings "string" -- exact match |
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 |
filter[ip] | Array of strings "string" -- starts with |
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[show-on-reports]': 'string', 'filter[payroll-access]': 'string', 'filter[screenshots]': 'string', 'filter[videos]': 'string', 'filter[created]': 'string', 'filter[host-name]': 'string', 'filter[os]': 'string', 'filter[hired-at]': 'string', 'filter[last-track]': 'string', 'filter[last-active-track]': 'string', 'filter[client-version]': 'string', 'filter[ip]': '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,
- "name": "string",
- "role": "tag",
- "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,
- "name": "string",
- "role": "tag",
- "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 Enum: "id" "name" "info" "alias" "tags" "settings" "managers" Level of detail in reply |
task-project-names | string Enum: "true" "false" If specified, the method will resolve the names for tasks and projects |
no-tag | string Enum: "true" "false" Return only users without tags |
deleted | string Enum: "true" "false" 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 Enum: "id" "email" "name" "tag" "keywords" "role" "show-on-reports" "payroll-access" "screenshots" "videos" "created" "host-name" "os" "hired-at" "last-track" "last-active-track" "client-version" "ip" "_id" "_email" "_name" "_tag" "_keywords" "_role" "_show-on-reports" "_payroll-access" "_screenshots" "_videos" "_created" "_host-name" "_os" "_hired-at" "_last-track" "_last-active-track" "_client-version" "_ip" 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[show-on-reports] | Array of strings unknown API-defined value |
filter[payroll-access] | 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[host-name] | Array of strings "string" -- starts with |
filter[os] | Array of strings "string" -- exact match |
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 |
filter[ip] | Array of strings "string" -- starts with |
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[show-on-reports]': 'string', 'filter[payroll-access]': 'string', 'filter[screenshots]': 'string', 'filter[videos]': 'string', 'filter[created]': 'string', 'filter[host-name]': 'string', 'filter[os]': 'string', 'filter[hired-at]': 'string', 'filter[last-track]': 'string', 'filter[last-active-track]': 'string', 'filter[client-version]': 'string', 'filter[ip]': 'string', token: 'YOUR_API_KEY_HERE' }).toString(); 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,
- "name": "string",
- "role": "tag",
- "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,
- "allowManagerTagCategories": true,
- "allowManagerProjectsTasks": true,
- "allowManagerInviteUsers": true,
- "allowManagerWorkSchedules": true,
- "forceAutostart": true,
- "firstDayOfWeek": true,
- "custom": {
- "browserExtensionEnabled": true,
- "completedStep": {
- "manageUsers": true,
- "setupGroups": true,
- "companySettings": true
}
}, - "webAndAppTracking": "off",
- "hasDismissedBanner": true,
- "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 Enum: "true" "false" Operate on active or disabled (deleted) user |
name | string User's name |
role | string Enum: "tag" "superAdmin" "owner" "admin" "guest" "manager" "user" 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. |
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 Enum: "off" "basic" "extended" "custom" Set tracking type (extended by default) |
hasDismissedBanner | boolean Determine if to show a manager the banner to learn how the reports work. Defaults to false |
{- "name": "string",
- "role": "tag",
- "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,
- "allowManagerTagCategories": true,
- "allowManagerProjectsTasks": true,
- "allowManagerInviteUsers": true,
- "allowManagerWorkSchedules": true,
- "forceAutostart": true,
- "firstDayOfWeek": true,
- "webAndAppTracking": "off",
- "hasDismissedBanner": true
}
{- "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 Enum: "true" "false" 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 resp = await fetch( 'https://api2.timedoctor.com/api/1.0/users/:userId?' + query, {method: 'DELETE'} ); const data = await resp.text(); console.log(data);
{- "data": { }
}
Merge users in company
userId required | string ID of User ( |
company required | string ID of Company or Workspace, user refers to. |
src | Array of strings Array of user IDs to be merged from |
{- "src": [
- "string"
]
}
{- "data": { }
}
Invite new user to company
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 Enum: "tag" "superAdmin" "owner" "admin" "guest" "manager" "user" A role of invited user in company |
employeeId | string Optional employee ID of invited user |
noSendEmail | string Enum: "true" "false" Don't send invitation email |
onlyProjectIds | Array of strings If specified, allows only specified project IDs to be accessed |
{- "name": "string",
- "email": "string",
- "role": "tag",
- "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"
}
}
Delete owned companies
userId required | string ID of User ( |
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/users/:userId/companies?' + query, {method: 'DELETE'} ); const data = await resp.text(); console.log(data);
{- "data": { }
}
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 Enum: "true" "false" If specified, returns all projects instead of assigned |
show-integration | string Enum: "true" "false" If set, integration projects will be also listed |
detail | string Enum: "basic" "users" 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. |
projects | string If specified, comma-separated list of IDs of projects to resolve |
all | string Enum: "true" "false" If specified, returns all projects instead of assigned |
show-integration | string Enum: "true" "false" If set, integration projects will be also listed |
detail | string Enum: "basic" "users" 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 |
scope | string Enum: "workspace" "user" "tag" 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 |
id | string Unique Identifier within all the entities in API instance |
{- "scope": "workspace",
- "users": [
- {
- "id": "string",
- "role": "tag"
}
], - "cloneTasksFromId": "string",
- "cloneAccessFromId": "string",
- "name": "string",
- "description": "string",
- "deleted": true,
- "weight": 0,
- "id": "string"
}
{- "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 Enum: "true" "false" 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 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 Enum: "true" "false" 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 Enum: "true" "false" 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 resp = await fetch( 'https://api2.timedoctor.com/api/1.0/projects/:projectId?' + query, {method: 'DELETE'} ); const data = await resp.text(); console.log(data);
{ }
Ensure integration project
projectId required | string ID of Project |
company required | string ID of Company or Workspace, user refers to. |
deleted | string Enum: "true" "false" If specified, operates on deleted project instead of active. |
name | string Project name |
description | string Project description |
required | object |
{- "name": "string",
- "description": "string",
- "integration": {
- "provider": "string",
- "data": { }
}
}
{- "data": {
- "integration": {
- "provider": "string",
- "data": { }
}, - "name": "string",
- "description": "string",
- "deleted": true,
- "weight": 0
}
}
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 Enum: "true" "false" If specified, operates on deleted project instead of active. |
role | string Enum: "tag" "superAdmin" "owner" "admin" "guest" "manager" "user" 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 Enum: "true" "false" 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 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 Enum: "true" "false" 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 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 folders in company
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 resp = await fetch( 'https://api2.timedoctor.com/api/1.0/folders?' + query, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": [
- {
- "name": "string",
- "description": "string",
- "weight": 0,
- "id": "string",
- "creatorId": "string",
- "delete": true
}
], - "page": {
- "cur": "string",
- "next": "string",
- "limit": 0,
- "totalCount": 0
}
}
Add a folder
company required | string ID of Company or Workspace, user refers to. |
name | string Folder name |
description | string Folder description |
weight | number Priority measure |
id | string Unique Identifier within all the entities in API instance |
creatorId | string |
delete | boolean |
{- "name": "string",
- "description": "string",
- "weight": 0,
- "id": "string",
- "creatorId": "string",
- "delete": true
}
{- "data": {
- "name": "string",
- "description": "string",
- "weight": 0,
- "id": "string",
- "creatorId": "string",
- "delete": true
}
}
Get details of a folder
folderId required | string ID of Folder |
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 resp = await fetch( 'https://api2.timedoctor.com/api/1.0/folders/:folderId?' + query, {method: 'GET'} ); const data = await resp.text(); console.log(data);
{- "data": {
- "name": "string",
- "description": "string",
- "weight": 0,
- "id": "string",
- "creatorId": "string",
- "delete": true
}
}
Modify details of a folder
folderId required | string ID of Folder |
company required | string ID of Company or Workspace, user refers to. |
name | string Folder name |
description | string Folder description |
weight | number Priority measure |
active | boolean Is folder active? Not active means archived |
{- "name": "string",
- "description": "string",
- "weight": 0,
- "active": true
}
{- "data": { }
}
Delete a folder
folderId required | string ID of Folder |
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 resp = await fetch( 'https://api2.timedoctor.com/api/1.0/folders/:folderId?' + query, {method: 'DELETE'} ); const data = await resp.text(); console.log(data);
{- "data": { }
}
Modify details of a folder's task
taskId required | string ID of Task |
folderId required | string ID of Folder |
company required | string ID of Company or Workspace, user refers to. |
weight | number Priority measure |
{- "weight": 0
}
{- "data": { }
}
Delete a folder's task
taskId required | string ID of Task |
folderId required | string ID of Folder |
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 resp = await fetch( 'https://api2.timedoctor.com/api/1.0/folders/:folderId/tasks/:taskId?' + query, {method: 'DELETE'} ); const data = await resp.text(); console.log(data);
{- "data": { }
}
Modify details of a folder's project
projectId required | string ID of Project |
folderId required | string ID of Folder |
company required | string ID of Company or Workspace, user refers to. |
weight | number Priority measure |
{- "weight": 0
}
{- "data": { }
}
Delete a folder's project
projectId required | string ID of Project |
folderId required | string ID of Folder |
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 resp = await fetch( 'https://api2.timedoctor.com/api/1.0/folders/:folderId/projects/:projectId?' + query, {method: 'DELETE'} ); const data = await resp.text(); console.log(data);
{- "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 Enum: "assigned" "reported" "managed" Filter the tasks by user. |
user | string ID of user to get the tasks for. (caller by default) |
show-integration | string Enum: "true" "false" If set, integration tasks will be also listed |
deleted | string Enum: "true" "false" 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. |
id required | string Unique Identifier within all the entities in API instance |
status required | string |
reporterId required | string |
deleted required | boolean |
deletedAt | string <full-date> |
folders required | object |
required | object |
name required | string Task name |
description | string Task description |
required | object |
{- "id": "string",
- "status": "string",
- "reporterId": "string",
- "deleted": true,
- "deletedAt": "string",
- "folders": { },
- "project": {
- "id": "string",
- "weight": 0
}, - "name": "string",
- "description": "string",
- "integration": {
- "provider": "string",
- "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": { }
}
}
}
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 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 |
status | string Enum: "new" "open" "progress" "resolved" "closed" "reopen" Task status: working phase |
weight | number Priority measure |
Array of objects Folders, which the task belongs to | |
deleted | boolean Is task deleted? |
assignedTo | string ID of User, task is assigned to |
{- "project": {
- "id": "string",
- "weight": 0
}, - "name": "string",
- "description": "string",
- "status": "new",
- "weight": 0,
- "folders": [
- {
- "id": "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 Enum: "true" "false" 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 resp = await fetch( 'https://api2.timedoctor.com/api/1.0/tasks/:taskId?' + query, {method: 'DELETE'} ); const data = await resp.text(); console.log(data);
{- "data": { }
}
Ensure integration 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 |
required | object |
{- "project": {
- "id": "string",
- "weight": 0
}, - "name": "string",
- "description": "string",
- "integration": {
- "provider": "string",
- "data": { }
}
}
{- "data": { }
}
Update user working status
company required | string ID of Company or Workspace, user refers to. |
taskId | string ID of Task. |
projectId | string ID of Project. |
mode required | string Enum: "offline" "offcomputer" "computer" "mobile" "manual" "break" Working Status |
date | string <date-time> ISO date of beginning |
{- "taskId": "string",
- "projectId": "string",
- "mode": "offline",
- "date": "2019-08-24T14:15:22Z"
}
{- "data": { }
}
Update activity using dates
company required | string ID of Company or Workspace, user refers to. |
required | Array of objects Items of Worklog |
required | Array of objects Items of Timeuse |
{- "worklog": [
- {
- "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"
}
], - "timeuse": [
- {
- "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"
}
]
}
{- "data": {
- "id": "string",
- "mqId": "string"
}
}
Add/Update activity using base date and seconds offsets
baseDate required | string <date-time> Base date of a chunk, since which start/end offsets go |
company required | string ID of Company or Workspace, user refers to. |
X-Device-ID required | string Device ID of the laptop where the app is tracking time |
clicks required | integer |
fakeActivities required | integer |
keys required | integer |
movements required | integer |
sign required | string A SHA-256 hash of the chunk data, signed with the public/private keys on the desktop app |
required | object Time series recordings for clicks, keystrokes and mousemovements |
required | Array of objects Items of Worklog |
required | Array of objects Items of Timeuse |
required | object A key:value pair showing the times when changes in connectivity are detected. key represents time in sec while the value is either |
{- "clicks": 0,
- "fakeActivities": 0,
- "keys": 0,
- "movements": 0,
- "sign": "string",
- "rawActivity": {
- "buttonClicks": "stringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstring",
- "fakeActivities": "stringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstring",
- "keystrokes": "stringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstring",
- "mouseMovements": "stringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstring"
}, - "worklog": [
- {
- "combinedId": "string",
- "taskName": "string",
- "start": 0,
- "end": 0,
- "taskId": "string",
- "projectId": "string",
- "mode": "offline",
- "date": "2019-08-24T14:15:22Z"
}
], - "timeuse": [
- {
- "start": 0,
- "end": 0,
- "app": "string",
- "ageOfData": 0,
- "appName": "string",
- "title": "string",
- "url": "string"
}
], - "connectivity": {
- "0": 0
}
}
{- "data": {
- "id": "string",
- "mqId": "string"
}
}
Get detailed worklog 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 Enum: "true" "false" If specified, the method will return detailed activities with device IDs and comments |
task-project-names | string Enum: "true" "false" 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"
}
]
}
Modify worklog ranges for a user
company required | string ID of Company or Workspace, user refers to. |
user | string Comma-separated list of user IDs |
start required | string <date-time> ISO date of beginning |
end required | 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) |
taskId | string ID of Task. |
projectId | string ID of Project. |
{- "start": "2019-08-24T14:15:22Z",
- "end": "2019-08-24T14:15:22Z",
- "taskId": "string",
- "projectId": "string"
}
{- "data": { }
}
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 Enum: "true" "false" 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 Enum: "true" "false" 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 Enum: "time" "score" "category" "_time" "_score" "_category" 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" Enum: "user-count" "mode-ratio" "summary-ratio" "raw-ratio" "project-total" "task-total" "work-range" 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 Enum: "id" "tagId" "userId" "ratio" "partial" "total" "entity" "name" "score" "project" "weight" "status" "active" "assigned" "reporter" "folder" "creator" "_id" "_tagId" "_userId" "_ratio" "_partial" "_total" "_entity" "_name" "_score" "_project" "_weight" "_status" "_active" "_assigned" "_reporter" "_folder" "_creator" 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 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" Enum: "user-count" "mode-ratio" "summary-ratio" "raw-ratio" "project-total" "task-total" "work-range" 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" Enum: "minutes" "hours" "days" "months" "years" Period unit of ranges subdivision. |