GET /api/time_entries
Get time entries list

Get a list of all time entries accessible to user.

Access rights:

  • Regular users can see only their own time entries.
  • User's time entries can also be seen by their approvers.
  • Cost centers' approvers and managers can also see all time entries for their cost centers.
  • Cost centers' managers cannot edit time entries.
  • Accountants and managers can see all time entries in the company.

Examples

{
  "collection": [
    {
      "id": 12,
      "entry_type": "work_time",
      "start_time": "2025-02-21T09:08:58.000Z",
      "date": "2025-02-21",
      "description": "Doing something important",
      "task_id": 175,
      "external_id": "abcd",
      "task_name": "Some Task",
      "is_task_billable": true,
      "task_notes": "These are the notes for Some Task",
      "cost_center_id": 18,
      "cost_center_name": "Project 660: Some Name",
      "user_id": 819,
      "user_name": "John Smith",
      "user_email": "john@test.com",
      "minutes": 60,
      "billable_minutes": 60,
      "invoiced_at": null,
      "reported_at": null,
      "is_locked": false,
      "updated_at": 1742464038
    }
  ],
  "pagination": {
    "current_page": 1,
    "total_pages": 1,
    "total_count": 1
  }
}

Params

Param name Description
page
optional

Page number.

Validations:

  • Must be a Integer

per_page
optional

Number of records per page. Default: 50.

Validations:

  • Must be a Integer

q
optional

Pass query to filter time entries by description or task name. Case-insensitive.

Validations:

  • Must be a String

date_range
optional

Get all time entries within the specified date range. Date range format: "DD/MM/YYYY - DD/MM/YYYY" (e.g. 15/02/2025 - 28/02/2025).

Validations:

  • Must be a String

start_date
optional

Get all time entries starting from the specified date, e.g. 2025-01-31.

Validations:

  • Must be a String

end_date
optional

Get all time entries up to and including the specified date, e.g. 2025-01-31.

Validations:

  • Must be a String

updated_after
optional

Get all time entries updated after the specifiex Unix timestamp.

Validations:

  • Must be a Integer

cost_center_id
optional

Get all time entries for the specified cost center (project).

Validations:

  • Must be a Integer

task_id
optional

Get all time entries for the specidied task.

Validations:

  • Must be a Integer

external_id
optional

Retrieve all time entries where the external_id contains the given substring (case-insensitive).

Validations:

  • Must be a String

user_id
optional

Get all time entries for the specified user.

Validations:

  • Must be a Integer

sort_by
optional

Sort by field. Default: date.

Validations:

  • Must be a String

order
optional

Sorting order (descending or ascending). Default: asc.

Validations:

  • Must be one of: desc, asc.


GET /api/time_entries/deleted
Get a list of deleted time entries

Get a list of deleted time entries that were accessible to the current user.

The response structure and the supported parameters are the same as in GET /api/time_entries endpoint.

To fetch time entries deleted after a specific timestamp, use updated_after parameter.


GET /api/time_entries/:id
Get a specific time entry

Params

Param name Description
id
required

Task ID

Validations:

  • Must be a Integer


POST /api/time_entries
Create a time entry

Params

Param name Description
time_entry
required

Time entry parameters.

Validations:

  • Must be a Hash

time_entry[entry_type]
optional

Time entry type. Default: "work_time".

Validations:

  • Must be one of: work_time, travel_time, on_call.

time_entry[user_id]
optional

User ID. By default, current user’s ID is used.

Validations:

  • Must be a Integer

time_entry[task_id]
required

Task ID.

Validations:

  • Must be a Integer

time_entry[description]
required

Time entry description.

Validations:

  • Must be a String

time_entry[date]
required

Time entry date. E.g. 2025-02-25.

Validations:

  • Must be a String

time_entry[start_time]
optional

Time entry’s start timestamp, in Unix time format.

Validations:

  • Must be a Integer

time_entry[minutes]
required

Time, in minutes.

Validations:

  • Must be a Integer

time_entry[billable_minutes]
optional

Billable time, in minutes. By default, will be considered equal to minutes.

Validations:

  • Must be a Integer


PUT /api/time_entries/:id
Update a time entry

Note: updating invoiced or reported time entries is not allowed.

Params

Param name Description
id
required

Time entry ID

Validations:

  • Must be a Integer

time_entry
required

Time entry parameters.

Validations:

  • Must be a Hash

time_entry[entry_type]
optional

Time entry type. Default: "work_time".

Validations:

  • Must be one of: work_time, travel_time, on_call.

time_entry[user_id]
optional

User ID. By default, current user’s ID is used.

Validations:

  • Must be a Integer

time_entry[task_id]
required

Task ID.

Validations:

  • Must be a Integer

time_entry[description]
required

Time entry description.

Validations:

  • Must be a String

time_entry[date]
required

Time entry date. E.g. 2025-02-25.

Validations:

  • Must be a String

time_entry[start_time]
optional

Time entry’s start timestamp, in Unix time format.

Validations:

  • Must be a Integer

time_entry[minutes]
required

Time, in minutes.

Validations:

  • Must be a Integer

time_entry[billable_minutes]
optional

Billable time, in minutes. By default, will be considered equal to minutes.

Validations:

  • Must be a Integer


DELETE /api/time_entries/:id
Delete a time entry

Params

Param name Description
id
required

Time entry ID

Validations:

  • Must be a Integer


PUT /api/time_entries/:id/set_invoiced_at
Save timestamp of invoicing the entry

Mark time entry as invoiced by setting its invoiced_at timestamp, or mark it as not invoiced by setting its invoiced_at to null.

Examples

{"invoiced_at":1740649659}
{"invoiced_at":true}
{"invoiced_at":null}

Params

Param name Description
invoiced_at
optional

Timestamp, in Unix time format. Pass true to use current time. Pass null to erase invoiced_at timestamp.

Validations:

  • Must be a String


PUT /api/time_entries/:id/set_reported_at
Save timestamp of reporting the entry to payroll

Mark time entry as reported to payroll by setting its reported_at timestamp, or mark it as not reported to payroll by setting its reported_at to null.

Examples

{"reported_at":1740649659}
{"reported_at":true}
{"reported_at":null}

Params

Param name Description
reported_at
optional

Timestamp, in Unix time format. Pass true to use current time. Pass null to erase reported_at timestamp.

Validations:

  • Must be a String


GET /api/time_entries/export
Download time entries in XLSX format

Params

Param name Description
empty
optional

Pass true to download an empty Spreadsheet (no time entries, column titles only), to be used as a template for inserting new time entries.

Validations:

  • Must be one of: true, false.


POST /api/time_entries/import
Upload an XLSX file with time entries to be created

Upload an XLSX file containing time entries to be created. Existing time entries cannot be updated via this feature.

The response will contain import stats: number of created entries, rows failed to be imported with errors etc. Row number is used as a key to identify the imported time entry in response stats.

Examples

{
  "ok": true,
  "new": 3,
  "updated": 0,
  "failed": [6, 7],
  "new_items": [4, 5, 8],
  "updated_items": [],
  "errors": {
    "4": [],
    "5": [],
    "6": ["Failed to find task with name 'Invoicing' for cost center ID 42"],
    "7": ["Failed to find user with name 'John Smith'"],
    "8": []
  }
}

Params

Param name Description
file
required

XLSX file with time entries to create.

Validations:

  • Must be a File


GET /api/time_entries/daily_stats
Get work time stats for a user with a daily breakdown

Get work time stats for a user with a daily breakdown for a given date range.

Stats will include:

  • date
  • actual (logged) work time, in minutes
  • billable time, in minutes
  • utilization rate, 0–100.0
  • mandatory working time, in minutes
  • absence time, in minutes
  • work time balance (ignoring balance correction), in minutes
  • imported balance correction, in minutes
  • is the date locked, boolean

Permissions. User's work time balance can be accessed by:

  • user themselves
  • user's approvers
  • company's managers and accountants

Examples

[
   {
    "date": "2025-03-25",
    "actual_worked_time": 720,
    "billable_time": 240,
    "utilization": 33.33,
    "mandatory_working_time": 480,
    "absence_time": 0,
    "is_locked": false,
    "work_time_balance": 240,
    "balance_correction": 0
  },
  {
    "date": "2025-03-26",
    "actual_worked_time": 0,
    "billable_time": 0,
    "utilization": null,
    "mandatory_working_time": 480,
    "absence_time": 0,
    "is_locked": true,
    "work_time_balance": -480,
    "balance_correction": 0
  }
]

Params

Param name Description
user_id
optional

User ID. Default: current user ID.

Validations:

  • Must be a Integer

start_date
optional

Date to start the balance calculations from. Default: date of the user’s first time entry. If start date has not been passed explicitly and user has no time entries, time balance will not be calculated.

Validations:

  • Must be a String

end_date
optional

Date to end the balance calculations with, inclusive. Default: yesterday.

Validations:

  • Must be a String

date_range
optional

Get stats within the specified date range.Either pass date_range or start/end dates. Date range format: "DD/MM/YYYY - DD/MM/YYYY" (e.g. 15/02/2025 - 28/02/2025).

Validations:

  • Must be a String


GET /api/time_entries/stats
Get work time stats for a user

Get work time stats for a user for a given date range and for today.

Stats will include:

  • start date
  • end date
  • total actual (logged) work time, in minutes
  • total billable time, in minutes
  • utilization rate, 0–100.0
  • work time balance, in minutes

Permissions. User's work time balance can be accessed by:

  • user themselves
  • user's approvers
  • company's managers and accountants

Examples

{
  "stats": {
    "start_date": "2025-03-25",
    "end_date": "2025-06-03",
    "actual_worked_time": 2220,
    "billable_time": 1740,
    "utilization": 78.38,
    "work_time_balance": -16500
  },
  "today_stats": {
    "start_date": "2025-06-04",
    "end_date": "2025-06-04",
    "actual_worked_time": 0,
    "billable_time": 0,
    "utilization": null,
    "work_time_balance": -480
  }
}

Params

Param name Description
user_id
optional

User ID. Default: current user ID.

Validations:

  • Must be a Integer

start_date
optional

Date to start the balance calculations from. Default: date of the user’s first time entry. If start date has not been passed explicitly and user has no time entries, time balance will not be calculated.

Validations:

  • Must be a String

end_date
optional

Date to end the balance calculations with, inclusive. Default: yesterday.

Validations:

  • Must be a String

date_range
optional

Get stats within the specified date range.Either pass date_range or start/end dates. Date range format: "DD/MM/YYYY - DD/MM/YYYY" (e.g. 15/02/2025 - 28/02/2025).

Validations:

  • Must be a String