RabbitWork

RabbitWork API V1 (1.0)

Download OpenAPI specification:Download

Introduction

RabbitWork is a time tracking and project management software for teams and freelancers, built to make time management simple, fast, and accurate.

The RabbitWork API is a RESTful web service that enables full integration with your workspace. It accepts JSON (application/json) and form-encoded (application/x-www-form-urlencoded) request bodies, returns JSON responses, and uses standard HTTP methods, authentication, and status codes. The examples in this documentation use JSON.

Base URL

https://app.rabbitwork.io/api/v1

Sending data

  • GET reads data. It lists resources or fetches one resource by ID. It does not change anything.
  • POST creates or updates a resource.
    • When creating, send the required fields, such as name or email. The other fields are optional.
    • When updating, send only the attributes you want to change. Anything you omit stays as it is.
  • DELETE removes a resource.

Sending back the full object from a GET also writes every writable field in that body. On an update, send only what should change.

How to archive records

Archiving updates only the record itself. Related records stay as they are and the full history remains. Send only active set to 0. The record can be reactivated at any time by sending active set to 1.

Archive user 15:

POST /users/15

{ "active": 0 }

Archive project 449:

POST /projects/449

{ "active": 0 }



Authentication

Send your personal API token on every request in the HTTP header x-api-token.

Personal tokens are created inside the RabbitWork app, while you are logged in. They are not created by sending an email and password to the API.

A personal token has the same access as the user who created it. Keep it secret. Do not commit it to GitHub, ship it in client-side code, or share it in public channels.

Personal tokens are not tied to a User-Agent and do not expire after 30 days of inactivity. Revoke a token from the app when an integration should stop working.

Create a personal token

  1. Sign in at app.rabbitwork.io.
  2. Open the account menu and go to Settings.
  3. In the You section, open My tokens (#/personal-tokens).
  4. Choose New token and give it a name that identifies the integration, such as ERP integration.
  5. Copy the token immediately. For security, RabbitWork shows the full value only once.

The account administrator controls who can create tokens (Administrators only, Administrators and super users, or All members) under Settings > Integrations > API management.

Administrators can review and revoke every token in the account under Settings > Integrations > Account tokens.

Deprecated login

Stop using email and password to authenticate with the API. POST /auth is deprecated.

Use a personal token. It is secure, more flexible, and managed in the app under Settings > You > My tokens.

The token created with email and password has a time limit and is tied to the browser user agent. New integrations are no longer accepted through this path. Integrations that already use this login can continue until April 30, 2027. After that date, this access stops working.

Errors

The RabbitWork API follows standard HTTP status codes to indicate whether a request was successful or failed.

  • 2xx — The request was successful, and the response contains the expected data.
  • 4xx — The request failed due to invalid input, missing parameters, or authentication errors. The response body usually includes a message explaining the issue.
  • 5xx — A server-side error occurred while processing the request. These are unexpected and typically temporary.

Each error response includes a clear message and, when applicable, an error code to help identify and handle the problem programmatically.

Rate Limit

RabbitWork API enforces multiple rate-limit layers to ensure fair usage and consistent performance.
These combined mechanisms guarantee stability for all tenants while allowing higher-tier accounts to scale safely.

All rate limits described below may be adjusted at any time based on system performance or usage behavior.
Integrators are responsible for implementing safeguards to prevent service interruption by monitoring the Retry-After header and applying automatic backoff or retry logic when limits are reached.

Available Limits

  • Authentication Limit — per user
  • Per-Token Limit (per minute) — per API token
  • Per-Account Daily Limit — shared by all users and tokens within the same account
  • Per-IP Limit (global) — applies to all incoming requests regardless of authentication

Authentication Limit

The deprecated email-and-password login (POST /auth) is limited to 60 requests per day per user, to reduce brute-force attempts.

Personal tokens are created in the app and do not use that endpoint. If the deprecated login limit is exceeded, the API returns HTTP 429 Too Many Requests or, in some cases, HTTP 401 Unauthorized.

Per-Token Limit (per minute)

Each API token has its own short-term quota of 600 requests per minute, with a burst capacity of 30 requests per second.
These limits prevent excessive concurrent usage from a single integration. Different tokens will have independent limits.

If the limit is exceeded, the API returns HTTP 429 Too Many Requests and includes an minute_limit_exceeded or second_limit_exceeded error in response.

Per-Account Daily Limit

Each account has a single daily quota shared across all its users and tokens, according to the subscribed plan:

The quota in force for an account is the plan limit. Current usage, remaining requests, and the reset time are shown in the app under Settings > Integrations > API management.

Plan Daily Limit
Free / Free Trial / Legacy plans 50 requests per day
Plus 1 000 requests per day
Ultimate 2 500 requests per day
Business 5 000 requests per day (soft limit*)
Business Max 25 000 requests per day (soft limit*)

If the limit is exceeded, the API returns HTTP 429 Too Many Requests and includes an account_daily_limit_exceeded error in response.

* Business plans operate under a soft limit — requests beyond this threshold are temporarily accepted, but a warning is returned. For consistent overuse, an add-on is recommended to expand the daily quota.

Per-IP Limit (general)

Additionally, all incoming traffic is protected by a global network limit of 2 000 requests per minute per IP address, independent of authentication.

If the limit is exceeded, the API returns HTTP 429 Too Many Requests and includes an ip_rate_limit_exceeded error in response.

Rate Limit Headers

Header Description
X-RateLimit-Minute Minute-based limit for the current token (limit, used, remaining, reset)
X-RateLimit-AccountDaily Daily limit for the entire account (limit, used, remaining, reset)
X-RateLimit-AccountDaily-Warning Indicates when the daily quota has been exceeded — possible values:
• soft_limit_exceeded: soft limit reached (temporary allowance for Business plans)
• hard_limit_blocked: hard block applied (requests rejected)
Retry-After Returned with HTTP 429 Too Many Requests — specifies how many seconds to wait before retrying;

Time Entries

This object is a representation of time entries.

List Time Entries (deprecated) Deprecated

This endpoint is deprecated and no longer returns data. Use /reports/detailed to retrieve time entry information.

Authorizations:
Token

Responses

Response samples

Content type
application/json
{
  • "message": "This endpoint is deprecated. Please use the new endpoint to retrieve paginated time entries: /reports/detailed.",
  • "status": "deprecated",
  • "deprecated_since": "2025-07-11"
}

New Time Entry

New Time Entry

Authorizations:
Token
Request Body schema: application/json
date_execution
string

Actual date when activity was executed by the collaborator

description
string

Description of the executed activity

project_id
required
integer

Project Id

task_id
integer

Task Id

time_end
string
Default: "00:00:00"

End time of this time entry

time_start
string
Default: "00:00:00"

Start time of this time entry

time_total
string
Default: "00:00:00"

Total time of this time entry

user_id
integer
Default: "Logged user"

ID of the user responsible for the time entry. You may send it when creating or editing; if omitted, the authenticated user is used. To filter entries by assignee, use the user_id query parameter on /reports/detailed and on other reports that support it.

has_overtime
boolean

Whether this entry has overtime. Accepted on save only while the timer is stopped.

overtime
string

Overtime duration, formatted as HH:mm:ss. Accepted on save only while the timer is stopped.

start_stopwatch
string
Value: "1"

Send "1" to start the timer after the entry is saved.

todo_id
string

To-do linked to this time entry. Send null to clear it.

breaks_total
string

Total break time, formatted as HH:mm:ss

Array of objects

Break intervals inside the time entry

Responses

Request samples

Content type
application/json
{
  • "date_execution": "2022-01-14",
  • "description": "activity description...",
  • "project_id": 2,
  • "task_id": 10,
  • "time_end": "14:00:00",
  • "time_start": "08:00:00",
  • "time_total": "06:00:00",
  • "user_id": 5,
  • "has_overtime": false,
  • "overtime": "01:00:00",
  • "start_stopwatch": "1",
  • "todo_id": "c96r3a88u0k0b3e6hft0",
  • "breaks_total": "01:00:00",
  • "break_intervals": [
    ]
}

Response samples

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

Get the active timer

Returns the time entry whose stopwatch is running for the authenticated user. data is null when no timer is active.

Authorizations:
Token

Responses

Response samples

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

Get Time Entry

Retrive a Time Entry by ID

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

Time Entry ID

Responses

Response samples

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

Edit Time Entry

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

Time Entry ID

Request Body schema: application/json
date_execution
string

Actual date when activity was executed by the collaborator

description
string

Description of the executed activity

project_id
required
integer

Project Id

task_id
integer

Task Id

time_end
string
Default: "00:00:00"

End time of this time entry

time_start
string
Default: "00:00:00"

Start time of this time entry

time_total
string
Default: "00:00:00"

Total time of this time entry

user_id
integer
Default: "Logged user"

ID of the user responsible for the time entry. You may send it when creating or editing; if omitted, the authenticated user is used. To filter entries by assignee, use the user_id query parameter on /reports/detailed and on other reports that support it.

has_overtime
boolean

Whether this entry has overtime. Accepted on save only while the timer is stopped.

overtime
string

Overtime duration, formatted as HH:mm:ss. Accepted on save only while the timer is stopped.

start_stopwatch
string
Value: "1"

Send "1" to start the timer after the entry is saved.

todo_id
string

To-do linked to this time entry. Send null to clear it.

breaks_total
string

Total break time, formatted as HH:mm:ss

Array of objects

Break intervals inside the time entry

Responses

Request samples

Content type
application/json
{
  • "date_execution": "2022-01-14",
  • "description": "activity description...",
  • "project_id": 2,
  • "task_id": 10,
  • "time_end": "14:00:00",
  • "time_start": "08:00:00",
  • "time_total": "06:00:00",
  • "user_id": 5,
  • "has_overtime": false,
  • "overtime": "01:00:00",
  • "start_stopwatch": "1",
  • "todo_id": "c96r3a88u0k0b3e6hft0",
  • "breaks_total": "01:00:00",
  • "break_intervals": [
    ]
}

Response samples

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

Delete Time Entry

Delete permanently a Time Entry by ID

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

Time Entry ID

Responses

Start stopwatch

Start stopwatch on a existing time entry

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

Time Entry ID

Request Body schema: application/json
time_start
string
Default: "00:00:00"

Start time of this time entry

stopwatch_date_start
string

Date and time when stopwatch was started

Responses

Request samples

Content type
application/json
{
  • "time_start": "08:00:00",
  • "stopwatch_date_start": "2022-01-01 12:33:00"
}

Response samples

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

Stop stopwatch

Stop stopwatch of a time entry with active stopwatch

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

Time Entry ID

Request Body schema: application/json
time_total
string
Default: "00:00:00"

Total time of this time entry

Responses

Request samples

Content type
application/json
{
  • "time_total": "06:00:00"
}

Response samples

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

Reports

This object is a representation of reports.

Detailed Report

Generate time entries detailed report

Authorizations:
Token
query Parameters
date_execution_start
string <date>
Example: date_execution_start=2024-01-01

Only retrieve time data where date execution is greater than or equal to a given date.

date_execution_end
string <date>
Example: date_execution_end=2024-01-30

Only retrieve time data where date execution is less than or equal to a given date.

project_id
Array of integers or guids
Examples:
  • project_id=5 - Example of a single ID
  • project_id=1,5,7 - Example of multiple IDs

Filter by project ID. Use comma-separated list of IDs for many IDs.

task_id
Array of integers or guids
Examples:
  • task_id=5 - Example of a single ID
  • task_id=1,5,7 - Example of multiple IDs

Filter by task ID. Use comma-separated list of IDs for many IDs.

customer_id
Array of integers or guids
Examples:
  • customer_id=5 - Example of a single ID
  • customer_id=1,5,7 - Example of multiple IDs

Filter by customer ID. Use comma-separated list of IDs for many IDs.

user_id
Array of integers or guids
Examples:
  • user_id=5 - Example of a single ID
  • user_id=1,5,7 - Example of multiple IDs

Filter by user. Use comma-separated list of IDs for many IDs.

team_id
Array of integers or guids
Examples:
  • team_id=5 - Example of a single ID
  • team_id=1,5,7 - Example of multiple IDs

Filter assignees by team. Use comma-separated list of IDs for many IDs.

id
integer or guid
Default: null
Examples:
  • id=5 - Example of a single ID
  • id=1&id=5&id=7 - Example of multiple IDs

The unique identifier of the entry. Use comma-separated list of IDs for many IDs.

is_invoiced
boolean
Default: null
Example: is_invoiced=true

Filter entries based on whether they have been invoiced or not.

only_active_users
boolean
Deprecated
Default: false
Example: only_active_users=true

Ignored. This report does not filter by active users.

only_active_projects
boolean
Default: false
Example: only_active_projects=true

Filter to include only active projects.

only_projects_member_of
boolean
Default: false
Example: only_projects_member_of=true

When true, return only projects the authenticated user belongs to. The default is false.

project_privacy
string
Default: null
Enum: "public" "private"
Example: project_privacy=public

Filter projects based on their privacy settings.

description
string

Match the entry description.

manager_id
string
Example: manager_id=3,8

Filter by the entry user manager. Comma-separated ids.

manager_empty
string
Value: "true"

Send true to include entries whose user has no manager. Combined with manager_id, it also includes those managers.

task_empty
string
Value: "true"

Send true to include entries with no task.

customer_empty
string
Value: "true"

Send true to include entries whose project has no customer.

todo_id
string

Filter by linked to-do id.

todo_id_empty
string
Value: "true"

Send true to include entries with no to-do.

is_stopwatch_active
boolean
Default: false

When true, return only entries with a running timer.

include_unregistered_projects
boolean
Deprecated

Deprecated. Used only when only_projects_member_of is omitted. True means do not restrict to the user projects.

custom_fields.{id}
string
Default: null
Example: custom_fields.{id}=10

Filter entries based on custom fields. Replace {id} with the specific custom field ID.

Not supported to custom field type text.

For filtering custom fields type ENUM, should be used the enum option ID as value

opt_page_limit
integer [ 1 .. 100 ]
Default: 50

The numbers of items to return

opt_sort_direction
string
Default: "asc"
Enum: "asc" "desc"

Sort direction of items.

opt_sort_by
string
Enum: "date_execution" "user_name" "project_name" "customer_name" "task_name" "todo_name" "description" "manager_name" "time_total" "time_start" "rate_total" "cost_amount" "created_at" "created_by_user_name" "changed_at" "changed_by_user_name" "regular_time" "overtime" "breaks_total" "is_invoiced"

Sort items by column. Use comma-separated list of columns to sort by many.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "totals": {
    },
  • "has_next_page": true,
  • "next_page_query_params": { }
}

Summary Report

Generate reports with data groups and custom columns

Authorizations:
Token
query Parameters
date_execution_start
string <date>
Example: date_execution_start=2024-01-01

Only retrieve time data where date execution is greater than or equal to a given date.

date_execution_end
string <date>
Example: date_execution_end=2024-01-30

Only retrieve time data where date execution is less than or equal to a given date.

project_id
Array of integers or guids
Examples:
  • project_id=5 - Example of a single ID
  • project_id=1,5,7 - Example of multiple IDs

Filter by project ID. Use comma-separated list of IDs for many IDs.

task_id
Array of integers or guids
Examples:
  • task_id=5 - Example of a single ID
  • task_id=1,5,7 - Example of multiple IDs

Filter by task ID. Use comma-separated list of IDs for many IDs.

customer_id
Array of integers or guids
Examples:
  • customer_id=5 - Example of a single ID
  • customer_id=1,5,7 - Example of multiple IDs

Filter by customer ID. Use comma-separated list of IDs for many IDs.

user_id
Array of integers or guids
Examples:
  • user_id=5 - Example of a single ID
  • user_id=1,5,7 - Example of multiple IDs

Filter by user. Use comma-separated list of IDs for many IDs.

team_id
Array of integers or guids
Examples:
  • team_id=5 - Example of a single ID
  • team_id=1,5,7 - Example of multiple IDs

Filter assignees by team. Use comma-separated list of IDs for many IDs.

include_archived_users
boolean
Default: false
Example: include_archived_users=true

Retrieve both active and archived users. By default, only active users are retrieved. This option works only when opt_report_template is set to users_and_days.

opt_export_columns
string
Enum: "user_id" "user_name" "user_email" "user_active" "user_role" "user_is_owner" "user_work_start_at" "user_work_end_at" "user_cost_rate" "user_capacity_*" "task_id" "task_name" "todo_id" "todo_name" "project_id" "project_name" "project_budget_*" "customer_id" "customer_name" "time_billable" "time_non_billable" "billable_total" "billable_taxes_total" "billable_net_total" "billable_invoiced" "billable_uninvoiced" "cost_total" "cost_billable" "cost_non_billable" "margin_*" "custom_field_|:id:|" "custom_field_|:id:|_enum_name"

Define the optionals columns to be retrieved. Columns used in opt_group_by will automatically include their identifiers, such as *_id and *_name. Some columns will only be displayed depending on the grouping information used in opt_group_by.

To include custom fields data, include custom_field_{id} replacing the {id} by the properly custom field ID. For custom fields type enum, include custom_field_{id}_enum_name to get their label description.

opt_group_by
string
Enum: "date" "week" "month" "year" "user_id" "task_id" "todo_id" "project_id" "customer_id" "custom_field_|:id:|"

Group time data by columns. Use comma-separated list of columns to group by many.

A maximum of 5 groups are allowed. Each group in the response will be displayed as a sublevel.

Beyond of native columns, is allowed grouping by custom fields of type enum, by including custom_field_{id} replacing the {id} by the properly custom field ID.

opt_report_template
string
Default: null
Enum: "days" "months" "users_and_days" "users_and_weeks" "users_and_months"

Templates return grouped rows even when a group is empty. Leave empty for the default. days returns every day in the period. months returns every month. users_and_days, users_and_weeks, and users_and_months return every user crossed with that period.

capacity_filter_type
string
Enum: "missing_percent_gte" "exceeded_percent_gte" "consumed_percent_lte" "logged_without_capacity"

Post-filter used only when opt_report_template is users_and_days.

capacity_filter_scope
string
Default: "any_day"
Enum: "any_day" "all_days" "period_total"

How the capacity percentage is applied. Default is any_day.

capacity_filter_value
string
Example: capacity_filter_value=20

Percentage threshold used by the capacity filter.

opt_sort_direction
string
Default: "asc"
Enum: "asc" "desc"

Sort direction of items.

opt_sort_by
string
Enum: "date" "week" "month" "year" "user_id" "task_id" "todo_id" "project_id" "customer_id"

Sort items by column. Use comma-separated list of columns to sort by many. Only columns include in opt_group_by parameter could be used to sort items.

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": {
    }
}

Projects

This object is a representation of projects.

List Project

List Project

Authorizations:
Token
query Parameters
id
Array of integers or guids
Examples:
  • id=5 - Example of a single ID
  • id=1,5,7 - Example of multiple IDs

Filter by ID. Use comma-separated list of IDs for many IDs.

customer_id
Array of integers or guids
Examples:
  • customer_id=5 - Example of a single ID
  • customer_id=1,5,7 - Example of multiple IDs

Filter by customer ID. Use comma-separated list of IDs for many IDs.

active
integer
Example: active=1

Filter by active status ("1" is active and "0" is archived)

custom_fields.{id}
string
Default: null
Example: custom_fields.{id}=10

Filter entries based on custom fields. Replace {id} with the specific custom field ID.

Not supported to custom field type text.

For filtering custom fields type ENUM, should be used the enum option ID as value

opt_page_limit
integer [ 1 .. 100 ]
Default: 50

The numbers of items to return

only_active_projects
boolean
Default: false

When true, return only active projects. This is separate from the active filter.

opt_sort_by
string
Enum: "name" "customer_name" "budget" "budget_by" "time_total" "total_invoiced" "total_uninvoiced" "value_total" "active" "total_members" "total_active_tasks" "total_pending_todos" "date_created"

Sort items by column. Use comma-separated list of columns to sort by many.

opt_sort_direction
string
Default: "asc"
Enum: "asc" "desc"

Sort direction of items.

opt_show_total
boolean

When true, the paginated response includes totals.total_rows.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "has_next_page": true,
  • "next_page_query_params": { },
  • "totals": {
    }
}

New Project

New Project

Authorizations:
Token
Request Body schema: application/json
active
boolean

Project is active. Filter lists with 1 (active) or 0 (archived).

bill_by
string
Deprecated

It's not necessary anymore.

budget
integer

Budget value

budget_by
string
Enum: "billing" "time" "none"

Budget type

customer_id
integer

Customer Id - Every project belongs to one customer

description
string

Project description

is_billable
boolean
Default: false

Project time entry is billable by default

name
required
string

Project name

color
string

Project color as a hex value.

privacy
integer
Enum: 1 2

Project is private or public (1 is public and 2 is private)

rate
integer
Default: 0

Most recently billable hourly rate of project

rate_start_at_new
string
Default: null

Start date for new rate.
You can use this property to define a new rate starting from a date. When not defined, replaces most recent rate or create a valid rate from the beginning ot the project.

required_task
integer
Default: 0
Enum: 0 1

Required task when time entry is created on project.
(1 is required and 0 is not required)

template
boolean
Default: false

Project is defined as template

object

Budget options. On write, only_billable_time is stored. On read, the list also includes progress, consumed, remaining, and exceed.

only_admin_publish
integer
Deprecated

Deprecated. Still accepted on save and not returned. Use todo_permissions instead.

only_admin_see_others
integer
Deprecated

Deprecated. Still accepted on save and not returned. Use todo_permissions instead.

project_id_source
integer

On create, copy data from this project. Not returned afterwards.

keep_from_source
Array of strings

Parts to keep when copying project_id_source. Not returned afterwards.

object

Who can perform each to-do action on this project. member_visibility is all_activities or assigned_only. create, assign, move, and manage_lists are project_manager or all_members. The other actions also accept assigned_member.

Responses

Request samples

Content type
application/json
{
  • "active": true,
  • "bill_by": "string",
  • "budget": 160,
  • "budget_by": "time",
  • "customer_id": 7,
  • "description": "Activities regarding API development (dev, testing, documentation, rollout, etc)",
  • "is_billable": true,
  • "name": "API development",
  • "color": "#12B886",
  • "privacy": 7,
  • "rate": 110.3,
  • "rate_start_at_new": "2023-01-02",
  • "required_task": 0,
  • "template": false,
  • "budget_options": {
    },
  • "only_admin_publish": 0,
  • "only_admin_see_others": 0,
  • "project_id_source": 12,
  • "keep_from_source": [
    ],
  • "todo_permissions": {
    },
  • "custom_fields": {
    }
}

Response samples

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

Get Project

Retrive a Project by ID

Authorizations:
Token
path Parameters
id
required
integer
Example: 57

Project ID

query Parameters
opt_expand
string
Value: "custom_fields_settings"

Send custom_fields_settings to include the project custom-field settings on find.

Responses

Response samples

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

Edit Project

Authorizations:
Token
path Parameters
id
required
integer
Example: 57

Project ID

Request Body schema: application/json
active
boolean

Project is active. Filter lists with 1 (active) or 0 (archived).

bill_by
string
Deprecated

It's not necessary anymore.

budget
integer

Budget value

budget_by
string
Enum: "billing" "time" "none"

Budget type

customer_id
integer

Customer Id - Every project belongs to one customer

description
string

Project description

is_billable
boolean
Default: false

Project time entry is billable by default

name
required
string

Project name

color
string

Project color as a hex value.

privacy
integer
Enum: 1 2

Project is private or public (1 is public and 2 is private)

rate
integer
Default: 0

Most recently billable hourly rate of project

rate_start_at_new
string
Default: null

Start date for new rate.
You can use this property to define a new rate starting from a date. When not defined, replaces most recent rate or create a valid rate from the beginning ot the project.

required_task
integer
Default: 0
Enum: 0 1

Required task when time entry is created on project.
(1 is required and 0 is not required)

template
boolean
Default: false

Project is defined as template

object

Budget options. On write, only_billable_time is stored. On read, the list also includes progress, consumed, remaining, and exceed.

only_admin_publish
integer
Deprecated

Deprecated. Still accepted on save and not returned. Use todo_permissions instead.

only_admin_see_others
integer
Deprecated

Deprecated. Still accepted on save and not returned. Use todo_permissions instead.

project_id_source
integer

On create, copy data from this project. Not returned afterwards.

keep_from_source
Array of strings

Parts to keep when copying project_id_source. Not returned afterwards.

object

Who can perform each to-do action on this project. member_visibility is all_activities or assigned_only. create, assign, move, and manage_lists are project_manager or all_members. The other actions also accept assigned_member.

Responses

Request samples

Content type
application/json
{
  • "active": true,
  • "bill_by": "string",
  • "budget": 160,
  • "budget_by": "time",
  • "customer_id": 7,
  • "description": "Activities regarding API development (dev, testing, documentation, rollout, etc)",
  • "is_billable": true,
  • "name": "API development",
  • "color": "#12B886",
  • "privacy": 7,
  • "rate": 110.3,
  • "rate_start_at_new": "2023-01-02",
  • "required_task": 0,
  • "template": false,
  • "budget_options": {
    },
  • "only_admin_publish": 0,
  • "only_admin_see_others": 0,
  • "project_id_source": 12,
  • "keep_from_source": [
    ],
  • "todo_permissions": {
    },
  • "custom_fields": {
    }
}

Response samples

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

Delete Project

Delete permanently a Project by ID

Authorizations:
Token
path Parameters
id
required
integer
Example: 57

Project ID

Responses

Projects Members

This object is a representation of users inside projects.

List project Users

Retrieve list of project members

Authorizations:
Token
path Parameters
id
required
integer
Example: 57

Project ID

Responses

Response samples

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

Add a user to project

Add user as project member and define custom rate per user on specified project

Authorizations:
Token
path Parameters
id
required
integer
Example: 57

Project ID

id
required
integer
Example: 5

User ID

Request Body schema: application/json
manager
integer
Default: 0

Project member has project manager privileges on this project ("1" is true and "0" is false)

is_billable
boolean
Default: true

Project member time is billable on this project

rate
string
Default: "project houly rate"

Most recently billable hourly rate of project member.
When not defined, applies hourly rate defined in project.

budget
number

Budget for this member on the project.

rate_start_at_new
string
Default: null

Start date for new rate.
You can use this property to define a new rate starting from a date. When not defined, replaces most recent rate or create a valid rate from the beginning ot the project.

Responses

Request samples

Content type
application/json
{
  • "manager": 1,
  • "is_billable": true,
  • "rate": 110.3,
  • "budget": 40,
  • "rate_start_at_new": "2023-01-02"
}

Response samples

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

Delete a user from project

Delete a user from project

Authorizations:
Token

Responses

List user available to project

List active users that are not a project member

Authorizations:
Token
path Parameters
id
required
integer
Example: 57

Project ID

Responses

Response samples

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

Projects Tasks

This object is a representation of tasks inside projects.

List project Tasks

Retrieve list of project members

Authorizations:
Token
path Parameters
id
required
integer
Example: 57

Project ID

query Parameters
checked
boolean

Filter project tasks by the checked flag.

Responses

Response samples

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

Add a task to project

Add task as project member and define custom rate per task on specified project

Authorizations:
Token
path Parameters
id
required
integer
Example: 57

Project ID

id
required
integer
Example: 25

Task ID

Request Body schema: application/json
is_billable
boolean
Default: true

Time allocated on this task is billable or not on this project

budget
number

Budget for this task on the project.

rate
number

Billable rate for this task on the project.

Responses

Request samples

Content type
application/json
{
  • "is_billable": true,
  • "budget": 20,
  • "rate": 110
}

Response samples

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

Delete a task from project

Delete a task from project

Authorizations:
Token

Responses

Check a task

Mark a task as checked on project

Authorizations:
Token
path Parameters
id
required
integer
Example: 57

Project ID

id
required
integer
Example: 25

Task ID

Responses

Response samples

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

Uncheck a task

Mark a task as unchecked on project

Authorizations:
Token
path Parameters
id
required
integer
Example: 57

Project ID

id
required
integer
Example: 25

Task ID

Responses

Response samples

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

List task available to project

List active tasks that are not a project member

Authorizations:
Token
path Parameters
id
required
integer
Example: 57

Project ID

Responses

Response samples

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

To-do Lists

This object is a representation of to-dos lists.

List To-do Lists

To-do Lists are the activities list on projects

Authorizations:
Token
path Parameters
id
required
integer
Example: 57

Project ID

query Parameters
id
string

Filter by to-do list id. todo_list_id is accepted as an alias.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "has_next_page": true,
  • "next_page_query_params": { },
  • "totals": {
    }
}

New To-do List

New To-do List

Authorizations:
Token
Request Body schema: application/json
project_id
required
integer

Project Id. Can't be changed project Id after creation.

name
required
string

To-do list name

color
string or null

List color

position
integer
Default: 1

To-do list position at project to ordering. Must be a integer greater than 0

Responses

Request samples

Content type
application/json
{
  • "project_id": 2,
  • "name": "Ideas",
  • "color": "#4C6EF5",
  • "position": 3
}

Response samples

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

Get To-do List

Retrive a To-do List by ID

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

To-do List ID

Responses

Response samples

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

Edit To-do List

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

To-do List ID

Request Body schema: application/json
name
required
string

To-do list name

color
string or null

List color

position
integer
Default: 1

To-do list position at project to ordering. Must be a integer greater than 0

Responses

Request samples

Content type
application/json
{
  • "name": "Ideas",
  • "color": "#4C6EF5",
  • "position": 3
}

Response samples

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

Delete To-do List

Soft-delete a to-do list by ID. The list can be restored later.

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

To-do List ID

Responses

Restore To-do List

Restore a soft-deleted to-do list

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

To-do List ID

Responses

Response samples

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

To-dos

This object is a representation of to-dos.

List To-dos

To-dos are the activities list on projects

Authorizations:
Token
query Parameters
id
guid
Example: id=c96r3a88u0k0b3e6hft0

Filter by to-do ID. Use comma-separated list of IDs for many IDs.

project_id
Array of integers or guids
Examples:
  • project_id=5 - Example of a single ID
  • project_id=1,5,7 - Example of multiple IDs

Filter by project ID. Use comma-separated list of IDs for many IDs.

is_completed
boolean
Example: is_completed=false

Filter by to-do is completed or not

only_active_projects
boolean
Example: only_active_projects=true

Only retrieve to-dos from active projects

only_my_projects
boolean
Example: only_my_projects=true

Only retrieve to-dos from projects where logged user is member of.

trashed
boolean
Default: false

When true, include to-dos in the trash from the last 30 days. Also accepted on find.

parent_todo_id
string

Filter by parent to-do.

only_root_todos
boolean

When true, return only to-dos without a parent.

has_name
string

Filter to-dos whose name matches this text.

enrich_hierarchy_display
boolean
Default: false

When true, each list item includes ancestor_name_path, name_path, and depth.

user_id
Array of integers or guids
Examples:
  • user_id=5 - Example of a single ID
  • user_id=1,5,7 - Example of multiple IDs

Filter by user assignee. Use comma-separated list of IDs for many IDs.

team_id
Array of integers or guids
Examples:
  • team_id=5 - Example of a single ID
  • team_id=1,5,7 - Example of multiple IDs

Filter assignees by team. Use comma-separated list of IDs for many IDs.

due_on
string <date>
Example: due_on=2024-01-15

Only retrieve to-dos where due on has exact match to a given date.

due_on_gte
string <date>
Example: due_on_gte=2024-01-01

Only retrieve to-dos where due on is greater than or equal to a given date.

due_on_lte
string <date>
Example: due_on_lte=2024-01-30

Only retrieve to-dos where due on is less than or equal to a given date.

opt_page_limit
integer [ 1 .. 100 ]
Default: 50

The numbers of items to return

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "has_next_page": true,
  • "next_page_query_params": { },
  • "totals": {
    }
}

New To-do

New To-do

Authorizations:
Token
Request Body schema: application/json
project_id
required
integer

Project Id. Can't be changed project Id after creation.

description
string

Notes about this To-do

is_completed
boolean
Default: false

To-do is completed

name
required
string

To-do name

position
integer
Default: 1

To-do position at project to ordering. Must be a integer greater than 0

todo_list_id
string

Todo list Id

time_estimate
string
Default: "00:00:00"

Estimate time to complete

user_id
integer

User id of assignee

due_on
string or null <date>

Date when the to-do is due

parent_todo_id
string or null

Parent to-do ID when this record is a subtask

tag_ids
Array of strings

Replaces the to-do tags with this list of tag IDs. Send an empty array to clear them.

highlighted_tag_id
string or null

Tag ID to highlight. It must be included in tag_ids. Null clears the highlight.

Responses

Request samples

Content type
application/json
{
  • "project_id": 2,
  • "description": "To-do description...",
  • "is_completed": true,
  • "name": "Buy a coffee",
  • "position": 3,
  • "todo_list_id": 10,
  • "time_estimate": "14:00:00",
  • "user_id": 5,
  • "due_on": "2024-01-15",
  • "parent_todo_id": "c96r3a88u0k0b3e6hft0",
  • "tag_ids": [
    ],
  • "highlighted_tag_id": "c96r3a88u0k0b3e6hft0"
}

Response samples

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

Get To-do

Retrive a To-do by ID

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

To-do ID

query Parameters
trashed
boolean
Default: false

When true, include to-dos in the trash from the last 30 days. Also accepted on find.

Responses

Response samples

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

Edit To-do

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

To-do ID

Request Body schema: application/json
description
string

Notes about this To-do

is_completed
boolean
Default: false

To-do is completed

name
required
string

To-do name

position
integer
Default: 1

To-do position at project to ordering. Must be a integer greater than 0

todo_list_id
string

Todo list Id

time_estimate
string
Default: "00:00:00"

Estimate time to complete

user_id
integer

User id of assignee

due_on
string or null <date>

Date when the to-do is due

parent_todo_id
string or null

Parent to-do ID when this record is a subtask

tag_ids
Array of strings

Replaces the to-do tags with this list of tag IDs. Send an empty array to clear them.

highlighted_tag_id
string or null

Tag ID to highlight. It must be included in tag_ids. Null clears the highlight.

Responses

Request samples

Content type
application/json
{
  • "description": "To-do description...",
  • "is_completed": true,
  • "name": "Buy a coffee",
  • "position": 3,
  • "todo_list_id": 10,
  • "time_estimate": "14:00:00",
  • "user_id": 5,
  • "due_on": "2024-01-15",
  • "parent_todo_id": "c96r3a88u0k0b3e6hft0",
  • "tag_ids": [
    ],
  • "highlighted_tag_id": "c96r3a88u0k0b3e6hft0"
}

Response samples

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

Delete To-do

Soft-delete a to-do by ID. The record can be restored later.

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

To-do ID

Responses

Restore To-do

Restore a soft-deleted to-do

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

To-do ID

Responses

Response samples

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

To-do Tags

Labels that can be assigned to to-dos.

List to-do tags

Returns active tags for the account, ordered by name.

Authorizations:
Token
query Parameters
id
string

Filter by one tag ID.

Responses

Response samples

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

New to-do tag

Name is required and must be unique in the account. Color is an optional hex value.

Authorizations:
Token
Request Body schema: application/json
name
required
string

Unique tag name in the account.

color
string or null

Optional hex color.

Responses

Request samples

Content type
application/json
{
  • "name": "Urgent",
  • "color": "#E85D4C"
}

Response samples

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

Get a to-do tag

Authorizations:
Token
path Parameters
todoTagId
required
string
Example: c96r3a88u0k0b3e6hft0

To-do tag ID.

Responses

Response samples

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

Edit a to-do tag

Authorizations:
Token
path Parameters
todoTagId
required
string
Example: c96r3a88u0k0b3e6hft0

To-do tag ID.

Request Body schema: application/json
name
required
string

Unique tag name in the account.

color
string or null

Optional hex color.

Responses

Request samples

Content type
application/json
{
  • "name": "Urgent",
  • "color": "#E85D4C"
}

Response samples

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

Delete a to-do tag

Soft-deletes the tag. Fails when the tag is still assigned to an active to-do.

Authorizations:
Token
path Parameters
todoTagId
required
string
Example: c96r3a88u0k0b3e6hft0

To-do tag ID.

Responses

Customers

This object is a representation of customers.

List Customer

List Customer

Authorizations:
Token
query Parameters
id
Array of integers or guids
Examples:
  • id=5 - Example of a single ID
  • id=1,5,7 - Example of multiple IDs

Filter by ID. Use comma-separated list of IDs for many IDs.

customer_id
integer

Alias of id.

active
integer
Example: active=1

Filter by active status ("1" is active and "0" is archived)

Responses

Response samples

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

New Customer

New Customer

Authorizations:
Token
Request Body schema: application/json
name
required
string

Customer name

observation
string
Default: null

Customer description

email
string

Customer email.

phone
string

Primary phone.

phone2
string or null

Second phone.

phone3
string or null

Third phone.

address
string

Street address.

city
string

City.

state
string

State or region.

country
string

Country.

cnpj
string

Brazilian company tax id.

cpf
string

Brazilian personal tax id.

active
boolean

Whether the customer is active. The response uses a boolean.

Responses

Request samples

Content type
application/json
{
  • "name": "ACME",
  • "observation": "Description...",
  • "email": "billing@acme.com",
  • "phone": "+55 11 99999-0000",
  • "phone2": "string",
  • "phone3": "string",
  • "address": "string",
  • "city": "string",
  • "state": "string",
  • "country": "string",
  • "cnpj": "string",
  • "cpf": "string",
  • "active": true,
  • "custom_fields": {
    }
}

Response samples

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

Get Customer

Retrive a Customer by ID

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

Customer ID

Responses

Response samples

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

Edit Customer

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

Customer ID

Request Body schema: application/json
name
required
string

Customer name

observation
string
Default: null

Customer description

email
string

Customer email.

phone
string

Primary phone.

phone2
string or null

Second phone.

phone3
string or null

Third phone.

address
string

Street address.

city
string

City.

state
string

State or region.

country
string

Country.

cnpj
string

Brazilian company tax id.

cpf
string

Brazilian personal tax id.

active
boolean

Whether the customer is active. The response uses a boolean.

Responses

Request samples

Content type
application/json
{
  • "name": "ACME",
  • "observation": "Description...",
  • "email": "billing@acme.com",
  • "phone": "+55 11 99999-0000",
  • "phone2": "string",
  • "phone3": "string",
  • "address": "string",
  • "city": "string",
  • "state": "string",
  • "country": "string",
  • "cnpj": "string",
  • "cpf": "string",
  • "active": true,
  • "custom_fields": {
    }
}

Response samples

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

Delete Customer

Delete permanently a Customer by ID

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

Customer ID

Responses

Tasks

This object is a representation of tasks.

List Task

List Task

Authorizations:
Token
query Parameters
id
Array of integers or guids
Examples:
  • id=5 - Example of a single ID
  • id=1,5,7 - Example of multiple IDs

Filter by ID. Use comma-separated list of IDs for many IDs.

active
integer
Example: active=1

Filter by active status ("1" is active and "0" is archived)

Responses

Response samples

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

New Task

New Task

Authorizations:
Token
Request Body schema: application/json
name
string

Task name

description
string
Default: null

Task description

color
string

Task color as a hex value.

is_billable_default
boolean
Default: false

Define this task as billable by default when added on project

active
integer
Enum: 0 1

1 active, 0 archived.

object

On save, a map of custom field ID to the plain value: text, number, date (YYYY-MM-DD), or the enum option ID. An empty value removes the field.

Responses

Request samples

Content type
application/json
{
  • "name": "ACME",
  • "description": "Description...",
  • "color": "#4C6EF5",
  • "is_billable_default": true,
  • "active": 1,
  • "custom_fields": {
    }
}

Response samples

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

Get Task

Retrive a Task by ID

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

Task ID

Responses

Response samples

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

Edit Task

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

Task ID

Request Body schema: application/json
name
string

Task name

description
string
Default: null

Task description

color
string

Task color as a hex value.

is_billable_default
boolean
Default: false

Define this task as billable by default when added on project

active
integer
Enum: 0 1

1 active, 0 archived.

object

On save, a map of custom field ID to the plain value: text, number, date (YYYY-MM-DD), or the enum option ID. An empty value removes the field.

Responses

Request samples

Content type
application/json
{
  • "name": "ACME",
  • "description": "Description...",
  • "color": "#4C6EF5",
  • "is_billable_default": true,
  • "active": 1,
  • "custom_fields": {
    }
}

Response samples

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

Delete Task

Delete permanently a Task by ID

Authorizations:
Token
path Parameters
id
required
integer
Example: 25

Task ID

Responses

Users

This object is a representation of users.

List Users

List Users

Authorizations:
Token
query Parameters
id
Array of integers or guids
Examples:
  • id=5 - Example of a single ID
  • id=1,5,7 - Example of multiple IDs

Filter by ID. Use comma-separated list of IDs for many IDs.

active
integer
Example: active=1

Filter by active status ("1" is active and "0" is archived)

Responses

Response samples

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

New User

New User

Authorizations:
Token
Request Body schema: application/json
email
required
string

User email (required on create).

active
integer
Default: 1

1 or true is active. 0 or false archives the user. On edit, send only to change; omitting leaves the value unchanged and does not apply create defaults.

auto_assign_new_users
boolean
Default: false

When true, new users are assigned to this user automatically. Applies to a super user. On edit, send only to change.

billable_rate_default
number or null <double>
Default: null

Default billable rate of the user. On edit, send only to change.

capacity_per_day
number or null <float>
Default: null

User's work capacity per day, in hours. On edit, send only to change.

cost_rate
string or null
Default: null

Cost rate on write; latest rate on read. On edit, send only to change.

cost_rate_start_at_new
string or null <date>
Default: null

Start date of a new cost rate on edit. When omitted on edit, the current cost rate is replaced. On partial edit, send together with cost_rate when changing cost.

last_calendar_id
integer or null
Default: null

Work calendar to assign to the user. On edit, send only to change.

last_calendar_start_at_new
string or null <date>
Default: null

Start date of a new calendar period on edit. When omitted on edit, the current period is updated.

is_billable_default
boolean
Default: true

Indicates if the time is billable by default. On edit, send only to change.

manager_id
integer or null
Default: null

Manager ID. References the User object who is the manager of this user. On edit, send only to change.

manage_restricted_teams
boolean
Deprecated

(Deprecated) Indicates if the user can manage restricted teams. Only applied for manager roles.

name
required
string

Name of the user. On edit, send only to change.

Array of "can_manage_own_projects" (string) or "can_time_log_for_assigned_users" (string) or "can_manage_all_customers" (string) or "can_manage_all_tasks" (string) or "can_manage_assigned_users" (string) or "can_report_costs_of_assigned_users" (string) or "can_edit_costs_of_assigned_users" (string) or "can_report_billing_of_assigned_users" (string) or "can_report_billing_of_managed_projects" (string) or "can_edit_billing_of_managed_projects" (string) or "can_mark_entries_as_invoiced" (string) or "can_approve_timesheets" (string)

Extra permissions for a super user. Send the full list. An empty list clears them. Expand items to see each allowed value and what it grants.

role
string
Default: "regular"
Enum: "admin" "regular" "super" "manager"

Privilege role of the user. On edit, send only to change; omitting does not reset to the create default.

work_days
Array of integers or null
Default: null

User's work days, represented as numbers from 0 to 6. 0 is sunday and 6 is saturday. On edit, send only to change.

work_end_at
string <time>

User's work end time used at capacity dashboard

work_start_at
string <time>

User's work start time used at capacity dashboard

Responses

Request samples

Content type
application/json
{
  • "email": "anne@rabbitwork.io",
  • "active": 1,
  • "auto_assign_new_users": false,
  • "billable_rate_default": null,
  • "capacity_per_day": null,
  • "cost_rate": null,
  • "cost_rate_start_at_new": null,
  • "last_calendar_id": null,
  • "last_calendar_start_at_new": null,
  • "is_billable_default": true,
  • "manager_id": null,
  • "manage_restricted_teams": false,
  • "name": "string",
  • "permissions": [
    ],
  • "role": "regular",
  • "work_days": null,
  • "work_end_at": null,
  • "work_start_at": null,
  • "custom_fields": {
    }
}

Response samples

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

Get User

Retrive a user by ID

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Responses

Response samples

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

Edit User

Updates only the fields you send. To archive a user and keep their time entries, send { "active": 0 }. Archiving removes that user's login access and tokens. It leaves project membership in place. An administrator can archive any user except the account owner. A super user with the can_manage_assigned_users permission can archive regular users who belong to one of their assigned teams.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Request Body schema: application/json
active
integer

1 or true is active. 0 or false archives the user. On edit, send only to change; omitting leaves the value unchanged and does not apply create defaults.

auto_assign_new_users
boolean

When true, new users are assigned to this user automatically. Applies to a super user. On edit, send only to change.

billable_rate_default
number <double>

Default billable rate of the user. On edit, send only to change.

capacity_per_day
number or null <float>

User's work capacity per day, in hours. On edit, send only to change.

cost_rate
string

Cost rate on write; latest rate on read. On edit, send only to change.

cost_rate_start_at_new
string or null <date>

Start date of a new cost rate on edit. When omitted on edit, the current cost rate is replaced. On partial edit, send together with cost_rate when changing cost.

last_calendar_id
integer

Work calendar to assign to the user. On edit, send only to change.

last_calendar_start_at_new
string or null <date>

Start date of a new calendar period on edit. When omitted on edit, the current period is updated.

is_billable_default
boolean

Indicates if the time is billable by default. On edit, send only to change.

manager_id
integer

Manager ID. References the User object who is the manager of this user. On edit, send only to change.

manage_restricted_teams
boolean
Deprecated

(Deprecated) Indicates if the user can manage restricted teams. Only applied for manager roles.

name
required
string

Name of the user. On edit, send only to change.

Array of "can_manage_own_projects" (string) or "can_time_log_for_assigned_users" (string) or "can_manage_all_customers" (string) or "can_manage_all_tasks" (string) or "can_manage_assigned_users" (string) or "can_report_costs_of_assigned_users" (string) or "can_edit_costs_of_assigned_users" (string) or "can_report_billing_of_assigned_users" (string) or "can_report_billing_of_managed_projects" (string) or "can_edit_billing_of_managed_projects" (string) or "can_mark_entries_as_invoiced" (string) or "can_approve_timesheets" (string)

Extra permissions for a super user. Send the full list. An empty list clears them. Expand items to see each allowed value and what it grants.

role
string
Enum: "admin" "regular" "super" "manager"

Privilege role of the user. On edit, send only to change; omitting does not reset to the create default.

work_days
Array of integers or null

User's work days, represented as numbers from 0 to 6. 0 is sunday and 6 is saturday. On edit, send only to change.

work_end_at
string <time>

User's work end time used at capacity dashboard

work_start_at
string <time>

User's work start time used at capacity dashboard

Responses

Request samples

Content type
application/json
{
  • "active": 1,
  • "auto_assign_new_users": false,
  • "billable_rate_default": null,
  • "capacity_per_day": null,
  • "cost_rate": "65",
  • "cost_rate_start_at_new": null,
  • "last_calendar_id": 3,
  • "last_calendar_start_at_new": null,
  • "is_billable_default": true,
  • "manager_id": null,
  • "manage_restricted_teams": false,
  • "name": "Anna Santos",
  • "permissions": [
    ],
  • "role": "regular",
  • "work_days": null,
  • "work_end_at": null,
  • "work_start_at": null,
  • "custom_fields": {
    }
}

Response samples

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

Delete User

Permanently deletes a user. The request fails when the user has time entries. Archiving with active: 0 keeps that history. Only an administrator can delete users.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Responses

Response samples

Content type
application/json
Example
{
  • "message": "The requested user does not exist",
  • "status": 400
}

Get profile photo URL

Returns data.url, or null when the user has no photo.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Responses

Response samples

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

Upload a profile photo

Multipart field file. PNG or JPEG, up to 2 MB. The image is stored as a square thumbnail.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Request Body schema: multipart/form-data
file
required
string <binary>

Multipart field file. PNG or JPEG, up to 2 MB. The image is stored as a square thumbnail.

Responses

Response samples

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

Delete the profile photo

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Responses

Response samples

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

List the user's projects

Active projects where the user is a member.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Responses

Response samples

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

Add projects to a user

project_id accepts an array of IDs or a comma-separated string.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Request Body schema: application/json
required
Array of strings or string

One project ID, a comma-separated list, or an array of IDs.

Responses

Request samples

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

Remove projects from a user

Uses the same project_id body as the add request.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Request Body schema: application/json
required
Array of strings or string

One project ID, a comma-separated list, or an array of IDs.

Responses

Request samples

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

List projects the user can join

Active projects where the user is not a member and the caller can manage membership.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Responses

Response samples

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

List user assignments

Returns users and teams assigned to this user. The payload is not wrapped in data.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Responses

Response samples

Content type
application/json
{
  • "users": [
    ],
  • "teams": [
    ]
}

Add assignments

Send users, teams, or both as arrays of IDs. Requires the role-permissions feature.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Request Body schema: application/json
users
Array of strings

User IDs to assign or remove.

teams
Array of strings

Team IDs to assign or remove.

Responses

Request samples

Content type
application/json
{
  • "users": [
    ],
  • "teams": [
    ]
}

List assignments available to add

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Responses

Response samples

Content type
application/json
{
  • "users": [
    ],
  • "teams": [
    ]
}

Remove assignments

Send the user and team IDs to remove.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Request Body schema: application/json
users
Array of strings

User IDs to assign or remove.

teams
Array of strings

Team IDs to assign or remove.

Responses

Request samples

Content type
application/json
{
  • "users": [
    ],
  • "teams": [
    ]
}

List days off and vacation

Filter by type (vacation or leave) and by year.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

query Parameters
type
string
Enum: "vacation" "leave"
year
integer
Example: year=2026

Responses

Response samples

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

New day off or vacation

type, start_date, and end_date are required. end_date must be on or after start_date.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Request Body schema: application/json
type
required
string
Enum: "vacation" "leave"

vacation or leave.

start_date
required
string <date>
end_date
required
string <date>
hours
number or null

Optional hour amount for the period.

description
string or null

Responses

Request samples

Content type
application/json
{
  • "type": "vacation",
  • "start_date": "2026-07-01",
  • "end_date": "2026-07-15",
  • "hours": 8,
  • "description": "string"
}

Response samples

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

Edit a day off or vacation

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

allocationId
required
string
Example: c96r3a88u0k0b3e6hft0

Day off or vacation ID.

Request Body schema: application/json
type
required
string
Enum: "vacation" "leave"

vacation or leave.

start_date
required
string <date>
end_date
required
string <date>
hours
number or null

Optional hour amount for the period.

description
string or null

Responses

Request samples

Content type
application/json
{
  • "type": "vacation",
  • "start_date": "2026-07-01",
  • "end_date": "2026-07-15",
  • "hours": 8,
  • "description": "string"
}

Response samples

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

Delete a day off or vacation

Soft-deletes the record.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

allocationId
required
string
Example: c96r3a88u0k0b3e6hft0

Day off or vacation ID.

Responses

List calendar history

Periods that assign a work calendar to the user, newest first. An open period has a null end_at.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Responses

Response samples

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

New calendar period

calendar_id and start_at are required.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

Request Body schema: application/json
calendar_id
required
string
start_at
required
string <date>

First day of this calendar assignment.

end_at
string or null <date>

Last day of this calendar assignment. Null while the period is open.

Responses

Request samples

Content type
application/json
{
  • "calendar_id": "c96r3a88u0k0b3e6hft0",
  • "start_at": "2026-01-01",
  • "end_at": "2026-12-31"
}

Response samples

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

Edit a calendar period

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

calendarHistoryId
required
string
Example: c96r3a88u0k0b3e6hftg

Calendar history ID.

Request Body schema: application/json
calendar_id
required
string
start_at
required
string <date>

First day of this calendar assignment.

end_at
string or null <date>

Last day of this calendar assignment. Null while the period is open.

Responses

Request samples

Content type
application/json
{
  • "calendar_id": "c96r3a88u0k0b3e6hft0",
  • "start_at": "2026-01-01",
  • "end_at": "2026-12-31"
}

Response samples

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

Delete a calendar period

Soft-deletes the history row.

Authorizations:
Token
path Parameters
id
required
integer
Example: 5

User ID

calendarHistoryId
required
string
Example: c96r3a88u0k0b3e6hftg

Calendar history ID.

Responses

Teams

Teams group users inside the account.

List teams

List teams in the account

Authorizations:
Token
query Parameters
id
Array of integers or guids
Examples:
  • id=5 - Example of a single ID
  • id=1,5,7 - Example of multiple IDs

Filter by ID. Use comma-separated list of IDs for many IDs.

Responses

Response samples

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

New team

Create a team. name is required.

Authorizations:
Token
Request Body schema: application/json
name
required
string

Team name

Responses

Request samples

Content type
application/json
{
  • "name": "Projects"
}

Response samples

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

Get team

Authorizations:
Token
path Parameters
teamId
required
integer
Example: 11

Team ID

Responses

Response samples

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

Edit team

Authorizations:
Token
path Parameters
teamId
required
integer
Example: 11

Team ID

Request Body schema: application/json
name
required
string

Responses

Request samples

Content type
application/json
{
  • "name": "Projects"
}

Response samples

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

Delete team

Soft-delete a team. A team assigned to a user cannot be deleted.

Authorizations:
Token
path Parameters
teamId
required
integer
Example: 11

Team ID

Responses

Team Members

Users that belong to a team.

List team members

Authorizations:
Token
path Parameters
teamId
required
integer
Example: 11

Team ID

query Parameters
include_archived_users
boolean
Default: false

When true, the member list includes archived users. The default excludes them.

Responses

Response samples

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

List users available to add

Authorizations:
Token
path Parameters
teamId
required
integer
Example: 11

Team ID

Responses

Response samples

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

Add user to team

Authorizations:
Token
path Parameters
teamId
required
integer
Example: 11

Team ID

id
required
integer
Example: 5

User ID

Responses

Response samples

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

Remove user from team

Authorizations:
Token
path Parameters
teamId
required
integer
Example: 11

Team ID

id
required
integer
Example: 5

User ID

Responses

Custom Fields

Custom fields attached to account records.

List custom fields

Authorizations:
Token
query Parameters
entity
string
Enum: "time_entries" "projects" "customers" "tasks" "users" "todos"

Filter by the record the field belongs to

type
string
Enum: "text" "enum" "numeric" "date" "money" "time" "user"

Filter by field type.

id
string

Filter by custom field id.

active
integer
Example: active=1

Filter by active status ("1" is active and "0" is archived)

Responses

Response samples

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

New custom field

Authorizations:
Token
Request Body schema: application/json
name
required
string
description
string or null
entity
required
string
Enum: "time_entries" "projects" "customers" "tasks" "users"

Record the field belongs to. Create accepts time_entries, projects, customers, tasks, and users. Listing can filter todos, but creating a field for todos is rejected.

type
required
string
Enum: "text" "enum" "numeric" "date" "money" "time" "user"
active
boolean
required
boolean
importance
string or null
position
integer
is_restricted
boolean
restricted_roles
Array of strings

Responses

Request samples

Content type
application/json
{
  • "name": "Cost center",
  • "description": "string",
  • "entity": "time_entries",
  • "type": "text",
  • "active": true,
  • "required": false,
  • "importance": "string",
  • "position": 0,
  • "is_restricted": false,
  • "restricted_roles": [ ]
}

Response samples

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

Get custom field

Enum fields include their options.

Authorizations:
Token
path Parameters
customFieldId
required
string
Example: c96r3a88u0k0b3e6hft0

Custom field ID

Responses

Response samples

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

Edit custom field

Authorizations:
Token
path Parameters
customFieldId
required
string
Example: c96r3a88u0k0b3e6hft0

Custom field ID

Request Body schema: application/json
name
required
string
description
string or null
entity
required
string
Enum: "time_entries" "projects" "customers" "tasks" "users"

Record the field belongs to. Create accepts time_entries, projects, customers, tasks, and users. Listing can filter todos, but creating a field for todos is rejected.

type
required
string
Enum: "text" "enum" "numeric" "date" "money" "time" "user"
active
boolean
required
boolean
importance
string or null
position
integer
is_restricted
boolean
restricted_roles
Array of strings

Responses

Request samples

Content type
application/json
{
  • "name": "Cost center",
  • "description": "string",
  • "entity": "time_entries",
  • "type": "text",
  • "active": true,
  • "required": false,
  • "importance": "string",
  • "position": 0,
  • "is_restricted": false,
  • "restricted_roles": [ ]
}

Response samples

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

Delete custom field

Authorizations:
Token
path Parameters
customFieldId
required
string
Example: c96r3a88u0k0b3e6hft0

Custom field ID

Responses

List enum options

Authorizations:
Token
path Parameters
customFieldId
required
string
Example: c96r3a88u0k0b3e6hft0

Custom field ID

Responses

Response samples

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

New enum option

Authorizations:
Token
path Parameters
customFieldId
required
string
Example: c96r3a88u0k0b3e6hft0

Custom field ID

Request Body schema: application/json
custom_field_id
string
name
required
string
active
boolean

Responses

Request samples

Content type
application/json
{
  • "custom_field_id": "c96r3a88u0k0b3e6hft0",
  • "name": "Buildings",
  • "active": true
}

Response samples

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

Get enum option

Authorizations:
Token
path Parameters
customFieldId
required
string
Example: c96r3a88u0k0b3e6hft0

Custom field ID

enumOptionId
required
string
Example: c96r3a88u0k0b3e6hftg

Enum option ID

Responses

Response samples

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

Edit enum option

Authorizations:
Token
path Parameters
customFieldId
required
string
Example: c96r3a88u0k0b3e6hft0

Custom field ID

enumOptionId
required
string
Example: c96r3a88u0k0b3e6hftg

Enum option ID

Request Body schema: application/json
custom_field_id
string
name
required
string
active
boolean

Responses

Request samples

Content type
application/json
{
  • "custom_field_id": "c96r3a88u0k0b3e6hft0",
  • "name": "Buildings",
  • "active": true
}

Response samples

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

Delete enum option

Authorizations:
Token
path Parameters
customFieldId
required
string
Example: c96r3a88u0k0b3e6hft0

Custom field ID

enumOptionId
required
string
Example: c96r3a88u0k0b3e6hftg

Enum option ID

Responses

List project custom field settings

Authorizations:
Token
path Parameters
id
required
integer
Example: 57

Project ID

query Parameters
active
integer
Example: active=1

Filter by active status ("1" is active and "0" is archived)

custom_field_id
string

Filter settings by custom field id.

id
string

Filter settings by setting id. The response omits id.

Responses

Response samples

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

Get project custom field setting

Authorizations:
Token
path Parameters
id
required
integer
Example: 57

Project ID

customFieldId
required
string
Example: c96r3a88u0k0b3e6hft0

Custom field ID

Responses

Response samples

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

Save project custom field setting

Authorizations:
Token
path Parameters
id
required
integer
Example: 57

Project ID

customFieldId
required
string
Example: c96r3a88u0k0b3e6hft0

Custom field ID

Request Body schema: application/json
custom_field_id
string
project_id
integer
position
integer
importance
string or null
required
boolean
active
boolean

Responses

Request samples

Content type
application/json
{
  • "custom_field_id": "c96r3a88u0k0b3e6hft0",
  • "project_id": 7,
  • "position": 0,
  • "importance": "string",
  • "required": false,
  • "active": true
}

Response samples

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

Remove project custom field setting

Authorizations:
Token
path Parameters
id
required
integer
Example: 57

Project ID

customFieldId
required
string
Example: c96r3a88u0k0b3e6hft0

Custom field ID

Responses

Timesheet Approvals

Weekly timesheet submission and approval.

List timesheet approvals

Submitted and approved timesheets lock the related time entries. Locked entries return is_locked and locked_reason.

Authorizations:
Token
query Parameters
user_id
Array of integers or guids
Examples:
  • user_id=5 - Example of a single ID
  • user_id=1,5,7 - Example of multiple IDs

Filter by user ID. Use comma-separated list of IDs for many IDs.

approver_user_id
string

Filter by approver. Use a comma-separated list for many IDs.

status
string
Enum: "draft" "submitted" "approved" "rejected"
period_start
string <date>

Only approvals whose period starts on or after this date

period_end
string <date>

Only approvals whose period ends on or before this date

opt_page_limit
integer [ 1 .. 100 ]
Default: 50

The numbers of items to return

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "has_next_page": true,
  • "next_page_query_params": { },
  • "totals": {
    }
}

Submit a timesheet

Submits the week for the current user, or for user_id when the caller can force-submit.

Authorizations:
Token
Request Body schema: application/json
user_id
integer

Defaults to the authenticated user

period_start
required
string <date>
period_end
required
string <date>

Responses

Request samples

Content type
application/json
{
  • "user_id": 0,
  • "period_start": "2026-10-05",
  • "period_end": "2026-10-11"
}

Response samples

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

Get timesheet approval

Authorizations:
Token
path Parameters
timesheetApprovalId
required
string
Example: c96r3a88u0k0b3e6hft0

Timesheet approval ID

Responses

Response samples

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

Approve timesheet

Authorizations:
Token
path Parameters
timesheetApprovalId
required
string
Example: c96r3a88u0k0b3e6hft0

Timesheet approval ID

Responses

Response samples

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

Reject timesheet

comment is required.

Authorizations:
Token
path Parameters
timesheetApprovalId
required
string
Example: c96r3a88u0k0b3e6hft0

Timesheet approval ID

Request Body schema: application/json
comment
required
string

Responses

Request samples

Content type
application/json
{
  • "comment": "Missing Monday hours"
}

Response samples

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

Undo approval

Authorizations:
Token
path Parameters
timesheetApprovalId
required
string
Example: c96r3a88u0k0b3e6hft0

Timesheet approval ID

Responses

Response samples

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

Undo submission

Authorizations:
Token
path Parameters
timesheetApprovalId
required
string
Example: c96r3a88u0k0b3e6hft0

Timesheet approval ID

Responses

Response samples

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

Change approver

Authorizations:
Token
path Parameters
timesheetApprovalId
required
string
Example: c96r3a88u0k0b3e6hft0

Timesheet approval ID

Request Body schema: application/json
approver_user_id
required
integer

Responses

Request samples

Content type
application/json
{
  • "approver_user_id": 2
}

Response samples

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

Rates

Billable, cost, and tax rates kept as history.

List rates

type is required. billable requires project_id. Without user_id it lists the project rate. cost requires user_id. tax is the account tax rate.

Authorizations:
Token
query Parameters
type
required
string
Enum: "billable" "cost" "tax"

billable, cost, or tax.

project_id
string

Required when type is billable.

user_id
string

Required when type is cost. Optional member override when type is billable.

Responses

Response samples

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

Save a rate

Creates the current rate. Send rate_start_at_new to keep the previous rate as history from that date. Without it, the current rate is replaced. A null rate clears the value.

Authorizations:
Token
Request Body schema: application/json
type
required
string
Enum: "billable" "cost" "tax"
rate
required
number or null
project_id
string
user_id
string
rate_start_at_new
string <date>

Start date of a new historical period. Must be after the current rate start date.

Responses

Request samples

Content type
application/json
{
  • "type": "billable",
  • "rate": 0,
  • "project_id": "string",
  • "user_id": "string",
  • "rate_start_at_new": "2019-08-24"
}

Response samples

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

Get the latest rate

Uses the same filters as the list. data is an empty object when no rate exists.

Authorizations:
Token
query Parameters
type
required
string
Enum: "billable" "cost" "tax"
project_id
string
user_id
string

Responses

Response samples

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

Delete the latest rate

Removes the current rate and reopens the previous period when one exists.

Authorizations:
Token
query Parameters
type
required
string
Enum: "billable" "cost" "tax"
project_id
string
user_id
string

Responses

Comments

Comments on to-dos.

List comments

Requires entity_type and entity_id. Pinned comments come first. Send the returned next_page_query_params to read the next page.

Authorizations:
Token
query Parameters
entity_type
required
string
Value: "todo"
entity_id
required
string
opt_page_limit
integer [ 1 .. 100 ]
Default: 50

The numbers of items to return

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "has_next_page": true,
  • "total_rows": 0,
  • "next_page_query_params": { }
}

New comment

content is required. Mention a user with @Name.

Authorizations:
Token
Request Body schema: application/json
entity_type
required
string
Value: "todo"
entity_id
required
string
content
required
string

Comment text. Mention a user with @Name.

attachment_ids
Array of strings

Ids of attachments already uploaded for this comment.

Responses

Request samples

Content type
application/json
{
  • "entity_type": "todo",
  • "entity_id": "string",
  • "content": "string",
  • "attachment_ids": [
    ]
}

Response samples

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

Edit a comment

Send content, pinned, or both. pinned true sets pinned_at. pinned false clears it.

Authorizations:
Token
path Parameters
commentId
required
string
Example: c96r3a88u0k0b3e6hft0

Comment ID.

Request Body schema: application/json
content
string
pinned
boolean

Set true to pin the comment, or false to unpin it.

Responses

Request samples

Content type
application/json
{
  • "content": "string",
  • "pinned": true
}

Response samples

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

Delete a comment

Soft-deletes the comment.

Authorizations:
Token
path Parameters
commentId
required
string
Example: c96r3a88u0k0b3e6hft0

Comment ID.

Responses

Response samples

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

Calendars

Work calendars and their holidays.

List calendars

Authorizations:
Token
query Parameters
name
string

Case-insensitive name filter.

Responses

Response samples

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

New calendar

Requires permission to edit account settings. name is required. parent_id inherits holidays from another calendar.

Authorizations:
Token
Request Body schema: application/json
name
required
string

Calendar name.

parent_id
string or null

Parent calendar whose holidays are also listed.

Responses

Request samples

Content type
application/json
{
  • "name": "Brazil",
  • "parent_id": "c96r3a88u0k0b3e6hftg"
}

Response samples

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

Get a calendar

Authorizations:
Token
path Parameters
calendarId
required
string
Example: c96r3a88u0k0b3e6hft0

Calendar ID.

Responses

Response samples

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

Edit a calendar

Authorizations:
Token
path Parameters
calendarId
required
string
Example: c96r3a88u0k0b3e6hft0

Calendar ID.

Request Body schema: application/json
name
required
string

Calendar name.

parent_id
string or null

Parent calendar whose holidays are also listed.

Responses

Request samples

Content type
application/json
{
  • "name": "Brazil",
  • "parent_id": "c96r3a88u0k0b3e6hftg"
}

Response samples

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

Delete a calendar

Soft-deletes the calendar. Fails while a user calendar history still references it.

Authorizations:
Token
path Parameters
calendarId
required
string
Example: c96r3a88u0k0b3e6hft0

Calendar ID.

Responses

List holidays

Includes holidays from the parent calendar when parent_id is set.

Authorizations:
Token
path Parameters
calendarId
required
string
Example: c96r3a88u0k0b3e6hft0

Calendar ID.

query Parameters
year
integer
Example: year=2026

Limit holidays to one calendar year.

Responses

Response samples

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

New holiday

holiday_date is required and must be unique on the calendar.

Authorizations:
Token
path Parameters
calendarId
required
string
Example: c96r3a88u0k0b3e6hft0

Calendar ID.

Request Body schema: application/json
holiday_date
required
string <date>
description
string

Responses

Request samples

Content type
application/json
{
  • "holiday_date": "2019-08-24",
  • "description": "string"
}

Response samples

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

Edit a holiday

Authorizations:
Token
path Parameters
calendarId
required
string
Example: c96r3a88u0k0b3e6hft0

Calendar ID.

holidayId
required
string
Example: c96r3a88u0k0b3e6hftg

Holiday ID.

Request Body schema: application/json
holiday_date
required
string <date>

Holiday date.

description
string or null

Holiday name.

Responses

Request samples

Content type
application/json
{
  • "holiday_date": "2026-01-01",
  • "description": "New Year"
}

Response samples

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

Delete a holiday

Soft-deletes the holiday.

Authorizations:
Token
path Parameters
calendarId
required
string
Example: c96r3a88u0k0b3e6hft0

Calendar ID.

holidayId
required
string
Example: c96r3a88u0k0b3e6hftg

Holiday ID.

Responses

Webhooks

Subscriptions that deliver account events to an external URL.

List webhook event types

Authorizations:
Token

Responses

Response samples

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

List webhook subscriptions

Each delivery is an HTTP POST with Content-Type: application/json. RabbitWork signs the raw body with HMAC-SHA256 using the subscription secret and sends the hex digest in X-Signature. Deliveries also include X-Event-Id, X-Event-Type, and X-Delivery-Id.

Authorizations:
Token

Responses

Response samples

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

New webhook subscription

The signing secret is returned only in this response.

Authorizations:
Token
Request Body schema: application/json
name
required
string
url
required
string <uri>
event_types
required
Array of strings
Items Enum: "project.created" "project.updated" "project.deleted" "customer.created" "customer.updated" "customer.deleted" "rate.created" "rate.updated" "rate.deleted" "user.created" "user.updated" "user.deleted" "task.created" "task.updated" "task.deleted" "team.created" "team.updated" "team.deleted" "team_user.created" "team_user.deleted" "project_user.created" "project_user.updated" "project_user.deleted" "project_task.created" "project_task.updated" "project_task.deleted" "time_entry.created" "time_entry.updated" "time_entry.deleted" "time_entry.timer_started" "time_entry.timer_stopped" "todo_list.created" "todo_list.updated" "todo_list.deleted" "todo_list.restored" "todo.created" "todo.updated" "todo.deleted" "todo.restored" "timesheet_approval.created" "timesheet_approval.update"
enabled
boolean
secret
string

Optional on create and update. When omitted, RabbitWork generates one. The value is returned only when the subscription is created or the secret is regenerated. Use it to verify X-Signature.

Responses

Request samples

Content type
application/json
{}

Response samples

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

Edit webhook subscription

Send regenerate_secret as true to rotate the signing secret. The new secret is returned once.

Authorizations:
Token
path Parameters
webhookSubscriptionId
required
string
Example: c96r3a88u0k0b3e6hft0

Webhook subscription ID

Request Body schema: application/json
name
required
string
url
required
string <uri>
event_types
required
Array of strings
Items Enum: "project.created" "project.updated" "project.deleted" "customer.created" "customer.updated" "customer.deleted" "rate.created" "rate.updated" "rate.deleted" "user.created" "user.updated" "user.deleted" "task.created" "task.updated" "task.deleted" "team.created" "team.updated" "team.deleted" "team_user.created" "team_user.deleted" "project_user.created" "project_user.updated" "project_user.deleted" "project_task.created" "project_task.updated" "project_task.deleted" "time_entry.created" "time_entry.updated" "time_entry.deleted" "time_entry.timer_started" "time_entry.timer_stopped" "todo_list.created" "todo_list.updated" "todo_list.deleted" "todo_list.restored" "todo.created" "todo.updated" "todo.deleted" "todo.restored" "timesheet_approval.created" "timesheet_approval.update"
enabled
boolean
secret
string

Optional on create and update. When omitted, RabbitWork generates one. The value is returned only when the subscription is created or the secret is regenerated. Use it to verify X-Signature.

regenerate_secret
boolean

Responses

Request samples

Content type
application/json
{}

Response samples

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

Delete webhook subscription

Authorizations:
Token
path Parameters
webhookSubscriptionId
required
string
Example: c96r3a88u0k0b3e6hft0

Webhook subscription ID

Responses

List webhook deliveries

Authorizations:
Token
query Parameters
event_type
string
Enum: "project.created" "project.updated" "project.deleted" "customer.created" "customer.updated" "customer.deleted" "rate.created" "rate.updated" "rate.deleted" "user.created" "user.updated" "user.deleted" "task.created" "task.updated" "task.deleted" "team.created" "team.updated" "team.deleted" "team_user.created" "team_user.deleted" "project_user.created" "project_user.updated" "project_user.deleted" "project_task.created" "project_task.updated" "project_task.deleted" "time_entry.created" "time_entry.updated" "time_entry.deleted" "time_entry.timer_started" "time_entry.timer_stopped" "todo_list.created" "todo_list.updated" "todo_list.deleted" "todo_list.restored" "todo.created" "todo.updated" "todo.deleted" "todo.restored" "timesheet_approval.created" "timesheet_approval.update"
status
string
Enum: "pending" "delivered" "failed" "retrying"

Filter deliveries by status.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "has_next_page": true,
  • "next_page_query_params": { },
  • "totals": {
    }
}