Time Doctor API (1.0.0)

Download OpenAPI specification:Download

Introduction

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.

RESTful APIs

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.

HTTPS

Time doctor API calls actually use the HTTPS protocol, the secure form of HTTP. All calls for version 1.0 begin with the prefix:

https://timedoctor.redoc.ly/

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.

Auth Token/Key

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:

  • Login
  • Register

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.

API Version

1.0.0

Request/Response Format

  • Dates are returned in ISO format e.g. 2019-08-24T14:15:22Z
  • Time is returned in seconds and by default, it is in the UTC timezone
  • Blank fields are generally included as a null or empty string instead of being omitted

Frequently Asked Questions

1) What are the date and time formats I should use when using the API?

Time Doctor API support ISO date and time format i.e. YYYY-MM-DDT00:00:00Z (Z refers to UTC timezone)

2) How can I get the data in a different timezone than UTC?

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

3) What date range should I use when running a report for the same day?

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

4) What is the reason for blank titles for web & app activity records in the API result?

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.

5) What is meant by “Tags” in the Time Doctor API documentation?

The tags refer to Groups in Time Doctor.

6) What is meant by “Files” in the Time Doctor API documentation?

Files refer to the screencasts (screenshots and screen videos) in Time Doctor.

7) What is meant by “Categories” in the Time Doctor API documentation?

Categories refer to the productivity ratings in Time Doctor.

8) Why is the Disconnectivity report API not showing any data?

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.

9) Does the API provide or support webhooks?

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.

10) How can I filter out response data for an API call?

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.

Authentication

ApiKeyAuth

Security Scheme Type API Key
Query parameter name: token

Auth

login, register, authorization

login

Login and get access token

Request Body schema: application/json
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).

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "password": "string",
  • "totpCode": "string",
  • "permissions": "write"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

register

Register account

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "email": "string",
  • "timezone": "string",
  • "password": "string",
  • "twoFactorAuth": false,
  • "referrer": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

registerSignup

Register account

Request Body schema: application/json
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

Enum: "mixed" "interactive" "silent"
pricingPlan
required
string

Pricing plan of company

Enum: "basic" "standard_new" "premium" "basic_annual" "standard_new_annual" "premium_annual"

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "email": "string",
  • "timezone": "string",
  • "password": "string",
  • "referrer": "string",
  • "company": "string",
  • "trackingMode": "mixed",
  • "pricingPlan": "basic"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

profile

Modify profile data

Authorizations:
Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "email": "string",
  • "timezone": "string",
  • "password": "string",
  • "twoFactorAuth": false,
  • "referrer": "string"
}

Response samples

Content type
application/json
{
  • "data": { }
}

restorePassword

Get an email to restore (reset) your password

query Parameters
email
required
string

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": { }
}

authorization

Get the following details:

  1. Company details and settings

  2. Details of the logged-in user and the user settings
Authorizations:
query Parameters
company
string

If specified, ID of company, which workspaces to list in companies; otherwise lists companies

task-project-names
string

If specified, the method will resolve the names for tasks and projects

Enum: "true" "false"
has-managed-screencasts
string

If specified, resolve whether screencasts enabled for you and your managed users

Enum: "true" "false"

Responses

Request samples

const fetch = require('node-fetch');

const query = new URLSearchParams({
  company: 'string',
  'task-project-names': 'true',
  'has-managed-screencasts': 'true',
  token: 'YOUR_API_KEY_HERE'
}).toString();

const resp = await fetch(
  `https://api2.timedoctor.com/api/1.0/authorization?${query}`,
  {method: 'GET'}
);

const data = await resp.text();
console.log(data);

Response samples

Content type
application/json
{
  • "data": {
    }
}

authorizationLogin

Login, get access token and get authorization

Request Body schema: application/json
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).

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "password": "string",
  • "totpCode": "string",
  • "permissions": "write"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

logout

Logout and invalidate access token

Authorizations:

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": { }
}

Companies

companies

companies

Get list of own administered companies or workspaces in a company

Authorizations:
query Parameters
no-workspaces
string

If specified, result will contain directly tracking companies/workspaces

Enum: "true" "false"

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": [
    ]
}

addCompany

Add a company or a workspace

Authorizations:
query Parameters
company
string

If specified, ID of Company or Workspace, user refers to. If omitted, the operation refers to global

Request Body schema: application/json
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

Pricing plan of company

Enum: "basic" "standard_new" "premium" "basic_annual" "standard_new_annual" "premium_annual"
newOwnerId
string

New company owner

object

Tracking time information for silent companies

Responses

Request samples

Content type
application/json
{
  • "noWorkspaces": true,
  • "name": "string",
  • "description": "string",
  • "creator": "string",
  • "timezone": "string",
  • "parentId": "string",
  • "pricingPlan": "basic",
  • "newOwnerId": "string",
  • "silentTrackingTimes": {
    }
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

company

Get company by ID

Authorizations:
path Parameters
companyId
required
string

ID of Company or Workspace

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": {
    }
}

putCompany

Modify details of a company

Authorizations:
path Parameters
companyId
required
string

ID of Company or Workspace

Request Body schema: application/json
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

Pricing plan of company

Enum: "basic" "standard_new" "premium" "basic_annual" "standard_new_annual" "premium_annual"
newOwnerId
string

New company owner

object

Tracking time information for silent companies

Responses

Request samples

Content type
application/json
{
  • "noWorkspaces": true,
  • "name": "string",
  • "description": "string",
  • "creator": "string",
  • "timezone": "string",
  • "parentId": "string",
  • "pricingPlan": "basic",
  • "newOwnerId": "string",
  • "silentTrackingTimes": {
    }
}

Response samples

Content type
application/json
{
  • "data": { }
}

getCompanyTimezone

Get all the timezones for all company users

Authorizations:
path Parameters
companyId
required
string

ID of Company or Workspace

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Users

users, invitations

getManagedUsers

Get list of own administered companies

Authorizations:
path Parameters
userId
required
string

ID of User (me or empty means caller)

query Parameters
company
required
string

ID of Company or Workspace, user refers to.

self
string

If specified, returns user data of userId in self reply field

Enum: "true" "false"
detail
string

Level of detail in reply

Enum: "id" "name" "info" "alias" "tags" "settings" "managers"
task-project-names
string

If specified, the method will resolve the names for tasks and projects

Enum: "true" "false"
no-tag
string

Return only users without tags

Enum: "true" "false"
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

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"
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

Responses

Request samples

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 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);

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    },
  • "self": {
    }
}

getUsers

Get/resolve list of users

Authorizations:
query Parameters
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 id)

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 userId in self reply field

Enum: "true" "false"
detail
string

Level of detail in reply

Enum: "id" "name" "info" "alias" "tags" "settings" "managers"
task-project-names
string

If specified, the method will resolve the names for tasks and projects

Enum: "true" "false"
no-tag
string

Return only users without tags

Enum: "true" "false"
deleted
string

Operate on active or disabled (deleted) user

Enum: "true" "false"
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

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"
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

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    },
  • "self": {
    }
}

getUser

Get user by ID

Authorizations:
path Parameters
userId
required
string

ID of User (me or empty means caller)

query Parameters
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

Enum: "id" "name" "info" "alias" "tags" "settings" "managers"
task-project-names
string

If specified, the method will resolve the names for tasks and projects

Enum: "true" "false"
no-tag
string

Return only users without tags

Enum: "true" "false"
deleted
string

Operate on active or disabled (deleted) user

Enum: "true" "false"
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

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"
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

Responses

Request samples

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 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);

Response samples

Content type
application/json
{
  • "data": {
    }
}

putUser

Modify user data in company

Authorizations:
path Parameters
userId
required
string

ID of User (me or empty means caller)

query Parameters
company
required
string

ID of Company or Workspace, user refers to.

deleted
string

Operate on active or disabled (deleted) user

Enum: "true" "false"
Request Body schema: application/json
name
string

User's name

role
string

User role in company

Enum: "owner" "admin" "guest" "manager" "user"
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)

Enum: "off" "basic" "extended" "custom"

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "role": "owner",
  • "onlyProjectIds": [
    ],
  • "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"
}

Response samples

Content type
application/json
{
  • "data": { }
}

deleteUser

Delete user from a company

Authorizations:
path Parameters
userId
required
string

ID of User (me or empty means caller)

query Parameters
company
required
string

ID of Company or Workspace, user refers to.

deleted
string

Operate on active or disabled (deleted) user

Enum: "true" "false"

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": { }
}

invite

Invite new user to company

Authorizations:
query Parameters
company
required
string

ID of Company or Workspace, user refers to.

Request Body schema: application/json
name
string

Optional full name of invited user

email
required
string

Email of invited user

role
string

A role of invited user in company

Enum: "owner" "admin" "guest" "manager" "user"
employeeId
string

Optional employee ID of invited user

noSendEmail
string

Don't send invitation email

Enum: "true" "false"
onlyProjectIds
Array of strings

If specified, allows only specified project IDs to be accessed

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "email": "string",
  • "role": "owner",
  • "employeeId": "string",
  • "noSendEmail": "true",
  • "onlyProjectIds": [
    ]
}

Response samples

Content type
application/json
{
  • "data": { }
}

getInvitations

Get list of user's invitations (TODO:)

Authorizations:
query Parameters
company
required
string

ID of Company or Workspace, user refers to.

email
required
string

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": {
    }
}

Projects

status, activity, stats

projects

Get list of projects in company

Authorizations:
query Parameters
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

Enum: "true" "false"
show-integration
string

If set, integration projects will be also listed

Enum: "true" "false"
detail
string

Level of details (basic by default)

Enum: "basic" "users"
user
string

If specified, a comma-separated list of user IDs to resolve the accessible projects for; it's for yourself by default

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

newProject

Add a project

Authorizations:
query Parameters
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

Enum: "true" "false"
show-integration
string

If set, integration projects will be also listed

Enum: "true" "false"
detail
string

Level of details (basic by default)

Enum: "basic" "users"
user
string

If specified, a comma-separated list of user IDs to resolve the accessible projects for; it's for yourself by default

Request Body schema: application/json
scope
string

Scope of project

Enum: "workspace" "user" "tag"
Array of objects

Details of users who have access to user-scope project

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

Responses

Request samples

Content type
application/json
{
  • "scope": "workspace",
  • "users": [
    ],
  • "cloneTasksFromId": "string",
  • "cloneAccessFromId": "string",
  • "name": "string",
  • "description": "string",
  • "deleted": true,
  • "weight": 0,
  • "id": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

project

Get details of a project

Authorizations:
path Parameters
projectId
required
string

ID of Project

query Parameters
company
required
string

ID of Company or Workspace, user refers to.

deleted
string

If specified, operates on deleted project instead of active.

Enum: "true" "false"

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": {
    }
}

putProject

Modify details of a project

Authorizations:
path Parameters
projectId
required
string

ID of Project

query Parameters
company
required
string

ID of Company or Workspace, user refers to.

deleted
string

If specified, operates on deleted project instead of active.

Enum: "true" "false"
Request Body schema: application/json
name
string

Project name

description
string

Project description

deleted
boolean

Is project deleted (archived)?

weight
number

Priority measure

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "description": "string",
  • "deleted": true,
  • "weight": 0
}

Response samples

Content type
application/json
{
  • "data": { }
}

deleteProject

Delete a project

Authorizations:
path Parameters
projectId
required
string

ID of Project

query Parameters
company
required
string

ID of Company or Workspace, user refers to.

deleted
string

If specified, operates on deleted project instead of active.

Enum: "true" "false"

Responses

Request samples

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);

Response samples

Content type
application/json
{ }

putProjectUser

Make project private and add/change user access

Authorizations:
path Parameters
projectId
required
string

ID of Project

userId
required
string

ID of User which access shall be changed

query Parameters
company
required
string

ID of Company or Workspace, user refers to.

deleted
string

If specified, operates on deleted project instead of active.

Enum: "true" "false"
Request Body schema: application/json
role
string

Role of user in project (user by default)

Enum: "tag" "superAdmin" "owner" "admin" "guest" "manager" "user"

Responses

Request samples

Content type
application/json
{
  • "role": "tag"
}

Response samples

Content type
application/json
{ }

deleteProjectUser

Delete a project user access

Authorizations:
path Parameters
projectId
required
string

ID of Project

userId
required
string

ID of User which access shall be changed

query Parameters
company
required
string

ID of Company or Workspace, user refers to.

deleted
string

If specified, operates on deleted project instead of active.

Enum: "true" "false"

Responses

Request samples

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);

Response samples

Content type
application/json
{ }

deleteProjectUsers

Make project public access

Authorizations:
path Parameters
projectId
required
string

ID of Project

query Parameters
company
required
string

ID of Company or Workspace, user refers to.

deleted
string

If specified, operates on deleted project instead of active.

Enum: "true" "false"

Responses

Request samples

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);

Response samples

Content type
application/json
{ }

Tasks

tasks

tasks

Get list of tasks in company

Authorizations:
query Parameters
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.

Enum: "assigned" "reported" "managed"
user
string

ID of user to get the tasks for. (caller by default)

show-integration
string

If set, integration tasks will be also listed

Enum: "true" "false"
deleted
string

Set to get deleted tasks instead of active.

Enum: "true" "false"

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

newTask

Add a task

Authorizations:
query Parameters
company
required
string

ID of Company or Workspace, user refers to.

Request Body schema: application/json
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
object
object
name
required
string

Task name

description
string

Task description

object

Responses

Request samples

Content type
application/json
{
  • "id": "string",
  • "status": "string",
  • "reporterId": "string",
  • "deleted": true,
  • "deletedAt": "string",
  • "folders": { },
  • "project": {
    },
  • "name": "string",
  • "description": "string",
  • "integration": {
    }
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

task

Get details of a task

Authorizations:
path Parameters
taskId
required
string

ID of Task

query Parameters
company
required
string

ID of Company or Workspace, user refers to.

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": {
    }
}

putTask

Modify details of a task

Authorizations:
path Parameters
taskId
required
string

ID of Task

query Parameters
company
required
string

ID of Company or Workspace, user refers to.

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "project": {
    },
  • "name": "string",
  • "description": "string",
  • "weight": 0,
  • "deleted": true,
  • "assignedTo": "string"
}

Response samples

Content type
application/json
{
  • "data": { }
}

deleteTask

Set to restore (unarchive) the task instead of archiving it.

Authorizations:
path Parameters
taskId
required
string

ID of Task

query Parameters
company
required
string

ID of Company or Workspace, user refers to.

deleted
string

Set to restore (unarchive) the task instead of archiving it.

Enum: "true" "false"

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": { }
}

Activity

status, stats, worklog, timeuse, timesheet, edit-time

getActivityWorklog

Get detailed worklog for a user

Authorizations:
query Parameters
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 minus 30mins) by default

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

Enum: "true" "false"
task-project-names
string

If specified, the method will resolve the names for tasks and projects

Enum: "true" "false"

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": [
    ]
}

getActivityTimeuse

Get detailed timeuse for a user

Authorizations:
query Parameters
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 minus 30mins) by default

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

Enum: "true" "false"
category
string

If specified, ID of category to filter by

category-details
string

If specified, the method will resolve the details for categories

Enum: "true" "false"

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": [
    ]
}

timeuseStats

Get timeise stats of user

Authorizations:
query Parameters
company
required
string

ID of Company or Workspace, user refers to.

from
string <date-time>

ISO Date of range beginning (inclusive); (to minus 30mins) by default

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

Enum: "time" "score" "category" "_time" "_score" "_category"
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

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": [
    ]
}

stats

Get stats for single time range for users

Authorizations:
path Parameters
detail
required
string
Default: "mode-ratio"

Determines what stats details to return (mode-ratio by default; work-range = mode + task + project; summary-ratio = app + score; ); or ratings method

Enum: "user-count" "mode-ratio" "summary-ratio" "raw-ratio" "project-total" "task-total" "work-range"
query Parameters
company
required
string

ID of Company or Workspace, user refers to.

user
string

Comma-separated list of User IDs yourself if omitted; all -- to get totals for workspace

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 score-ratio ratings: comma separated list of scores to get compound ratios for

min-time
number >= 0

For user-count: comma-separated minimal time values of value ranges

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 minus 30mins) by default

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

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"
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

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": {
    }
}

statsTimesheet

Get stats for multiple time ranges for users

Authorizations:
path Parameters
detail
required
string
Default: "mode-ratio"

Determines what stats details to return (mode-ratio by default; work-range = mode + task + project; summary-ratio = app + score; ); or ratings method

Enum: "user-count" "mode-ratio" "summary-ratio" "raw-ratio" "project-total" "task-total" "work-range"
query Parameters
company
required
string

ID of Company or Workspace, user refers to.

timezone
string

Timezone of ranges breaks. Etc/UTC by default

period
string
Default: "days"

Period unit of ranges subdivision. days by default

Enum: "minutes" "hours" "days" "months" "years"
interval
integer <int32> >= 1

Number of period units. 1 by default

user
string

Comma-separated list of User IDs yourself if omitted; all -- to get totals for workspace

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 score-ratio ratings: comma separated list of scores to get compound ratios for

min-time
number >= 0

For user-count: comma-separated minimal time values of value ranges

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 minus 30mins) by default

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

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"
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

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": [
    ]
}

statsTasks

Get stats for tasks by users

Authorizations:
path Parameters
detail
required
string
Default: "mode"

Determines what stats details to return (mode by default; worklog = mode + task + project; timeuse = app + score; all = worklog + timeuse)

Enum: "mode" "task" "project" "worklog" "app" "score" "category" "timeuse" "all"
query Parameters
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 minus 30mins) by default

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

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": {
    }
}

statsTasksUsers

Get users worked on task

Authorizations:
path Parameters
task
required
string

If specified, return only statistics on this task

query Parameters
company
required
string

ID of Company or Workspace, user refers to.

detail
required
string
Default: "mode"

Determines what stats details to return (mode by default; worklog = mode + task + project; timeuse = app + score; all = worklog + timeuse)

Enum: "mode" "task" "project" "worklog" "app" "score" "category" "timeuse" "all"
from
string <date-time>

ISO Date of range beginning (inclusive); (to minus 30mins) by default

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

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": [
    ]
}

getActivityEditTime

Get edit time ranges for a user(s)

Authorizations:
query Parameters
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 minus 30mins) by default

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

Enum: "true" "false"
operation
string

If specified, the method will filter by edit operation

Enum: "add" "remove"
approved
string

If specified, the method will filter by approval

Enum: "false" "true"

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": [
    ]
}

postActivityEditTime

Add edit time range for a user

Authorizations:
query Parameters
company
required
string

ID of Company or Workspace, user refers to.

Request Body schema: application/json
id
required
string

ID of range

start
required
string <date-time>

ISO date of beginning

time
required
number <float>
taskId
required
string

ID of Task.

taskName
required
string
projectId
required
string

ID of Project.

projectName
required
string
approved
required
string

Is Approved?

Enum: "true" "false"
operation
required
string

Edit Time Operation

Enum: "add" "remove"
reason
required
string

Responses

Request samples

Content type
application/json
{
  • "id": "string",
  • "start": "2019-08-24T14:15:22Z",
  • "time": 0,
  • "taskId": "string",
  • "taskName": "string",
  • "projectId": "string",
  • "projectName": "string",
  • "approved": "true",
  • "operation": "add",
  • "reason": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

putActivityEditTime

Modify edit time range for a user

Authorizations:
path Parameters
id
required
string

ID of the time to edit

query Parameters
company
required
string

ID of Company or Workspace, user refers to.

Request Body schema: application/json
id
required
string

ID of range

start
required
string <date-time>

ISO date of beginning

time
required
number <float>
taskId
required
string

ID of Task.

taskName
required
string
projectId
required
string

ID of Project.

projectName
required
string
approved
required
string

Is Approved?

Enum: "true" "false"
operation
required
string

Edit Time Operation

Enum: "add" "remove"
reason
required
string

Responses

Request samples

Content type
application/json
{
  • "id": "string",
  • "start": "2019-08-24T14:15:22Z",
  • "time": 0,
  • "taskId": "string",
  • "taskName": "string",
  • "projectId": "string",
  • "projectName": "string",
  • "approved": "true",
  • "operation": "add",
  • "reason": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

getDisconnectivity

Get detailed disconnectivity data for a user

Authorizations:
query Parameters
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 minus 30mins) by default

to
string <date-time>

ISO Date of range ending (exclusive); current by default

Responses

Request samples

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);

Response samples

Content type
application/json
{
  • "data": [
    ]
}

stats1_1_total

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.

Authorizations:
query Parameters
company
required
string

ID of Company or Workspace, user refers to.

from
string <date-time>

ISO Date of range beginning (inclusive); (to minus 30mins) by default

to
string <date-time>

ISO Date of range ending (exclusive); current by default

user
string

Comma-separated list of User IDs yourself if omitted; all -- to get totals for workspace

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).

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)

Enum: "company" "user"
timezone
string

Timezone of ranges breaks. Etc/UTC by default

period
string
Default: "days"

Period unit of ranges subdivision. days by default

Enum: "minutes" "hours" "days" "months" "years"
interval
integer <int32> >= 1

Number of period units. 1 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

Enum: "offcomputer" "computer" "mobile" "manual" "mobMan" "offcomputerRatio" "computerRatio" "mobileRatio" "manualRatio" "mobManRatio" "unrated" "unprod" "neutral" "prod" "unratedRatio" "unprodRatio" "neutralRatio" "prodRatio" "clicks" "idleMins" "idleSec" "keys" "moves" "totalSec" "totalMins" "clicksRatio" "idleMinsRatio" "idleSecRatio" "keysRatio" "movesRatio" "totalSecRatio" "totalMinsRatio" "outShift" "modeTotal" "scoreTotal" "total" "userId" "taskId" "date" "timezone" "start" "end" "item" "ratio" "ratioTotal" "count" "quants" "offsets" "quant0" "quant1" "quant2" "_offcomputer" "_computer" "_mobile" "_manual" "_mobMan" "_offcomputerRatio" "_computerRatio" "_mobileRatio" "_manualRatio" "_mobManRatio" "_unrated" "_unprod" "_neutral" "_prod" "_unratedRatio" "_unprodRatio" "_neutralRatio" "_prodRatio" "_clicks" "_idleMins" "_idleSec" "_keys" "_moves" "_totalSec" "_totalMins" "_clicksRatio" "_idleMinsRatio" "_idleSecRatio" "_keysRatio" "_movesRatio" "_totalSecRatio" "_totalMinsRatio" "_outShift" "_modeTotal" "_scoreTotal" "_total" "_userId" "_taskId" "_date" "_timezone" "_start" "_end" "_item" "_ratio" "_ratioTotal" "_count" "_quants" "_offsets" "_quant0" "_quant1" "_quant2"
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[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[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[idleMins]
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[totalMins]
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[idleMinsRatio]
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[totalMinsRatio]
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[modeTotal]
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[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

Enum: "offcomputer" "computer" "mobile" "manual" "mobMan" "offcomputerRatio" "computerRatio" "mobileRatio" "manualRatio" "mobManRatio" "unrated" "unprod" "neutral" "prod" "unratedRatio" "unprodRatio" "neutralRatio" "prodRatio" "clicks" "idleMins" "idleSec" "keys" "moves" "totalSec" "totalMins" "clicksRatio" "idleMinsRatio" "idleSecRatio" "keysRatio" "movesRatio" "totalSecRatio" "totalMinsRatio" "outShift" "modeTotal" "scoreTotal" "total" "userId" "taskId" "date" "timezone" "start" "end" "item" "ratio" "ratioTotal" "count" "quants" "offsets" "quant0" "quant1" "quant2" "_offcomputer" "_computer" "_mobile" "_manual" "_mobMan" "_offcomputerRatio" "_computerRatio" "_mobileRatio" "_manualRatio" "_mobManRatio" "_unrated" "_unprod" "_neutral" "_prod" "_unratedRatio" "_unprodRatio" "_neutralRatio" "_prodRatio" "_clicks" "_idleMins" "_idleSec" "_keys" "_moves" "_totalSec" "_totalMins" "_clicksRatio" "_idleMinsRatio" "_idleSecRatio" "_keysRatio" "_movesRatio" "_totalSecRatio" "_totalMinsRatio" "_outShift" "_modeTotal" "_scoreTotal" "_total" "_userId" "_taskId" "_date" "_timezone" "_start" "_end" "_item" "_ratio" "_ratioTotal" "_count" "_quants" "_offsets" "_quant0" "_quant1" "_quant2"
ratio-filter[total]
string

Prefilter ratio totals.

ratio-field
string

A field to specify for "ratio" paging. Default is first specified in "ratio" param

ratio-id
string

ID of ratio item for "ratio" paging. Default is top first in ratio array.

date-page
string

if specified, page ID to get results for; or first page by default

date-limit
string

if specified, maximum number of items to be returned; or use API-specific hard limit by default

Responses

Request samples

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',
  tag: 'string',
  task: 'string',
  fields: 'string',
  'group-by': 'string',
  resolve: 'string',
  ratio: 'string',
  level: 'company',
  timezone: 'string',
  period: 'days',
  interval: '1',
  page: 'string',
  limit: 'string',
  sort: 'offcomputer',
  'filter[offcomputer]': 'string',
  'filter[computer]': 'string',
  'filter[mobile]': 'string',
  'filter[manual]': 'string',
  'filter[mobMan]': 'string',
  'filter[offcomputerRatio]': 'string',
  'filter[computerRatio]': 'string',
  'filter[mobileRatio]': 'string',
  'filter[manualRatio]': 'string',
  'filter[mobManRatio]': 'string',
  'filter[unrated]': 'string',
  'filter[unprod]': 'string',
  'filter[neutral]': 'string',
  'filter[prod]': 'string',
  'filter[unratedRatio]': 'string',
  'filter[unprodRatio]': 'string',
  'filter[neutralRatio]': 'string',
  'filter[prodRatio]': 'string',
  'filter[clicks]': 'string',
  'filter[idleMins]': 'string',
  'filter[idleSec]': 'string',
  'filter[keys]': 'string',
  'filter[moves]': 'string',
  'filter[totalSec]': 'string',
  'filter[totalMins]': 'string',
  'filter[clicksRatio]': 'string',
  'filter[idleMinsRatio]': 'string',
  'filter[idleSecRatio]': 'string',
  'filter[keysRatio]': 'string',
  'filter[movesRatio]': 'string',
  'filter[totalSecRatio]': 'string',
  'filter[totalMinsRatio]': 'string',
  'filter[outShift]': 'string',
  'filter[modeTotal]': 'string',
  'filter[scoreTotal]': 'string',
  'filter[total]': 'string',
  'prefilter[userId]': 'string',
  'prefilter[taskId]': 'string',
  'prefilter[date]': 'string',
  'prefilter[timezone]': 'string',
  'prefilter[start]': 'string',
  'prefilter[end]': 'string',
  'prefilter[item]': 'string',
  'filter[ratio]': 'string',
  'filter[ratioTotal]': 'string',
  'filter[count]': 'string',
  'prefilter[quants]': 'string',
  'prefilter[offsets]': 'string',
  'filter[quant0]': 'string',
  'filter[quant1]':