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.
https://app.rabbitwork.io/api/v1
name or email. The other fields are optional.Sending back the full object from a GET also writes every writable field in that body. On an update, send only what should change.
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 }
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.
#/personal-tokens).ERP integration.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.
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.
The RabbitWork API follows standard HTTP status codes to indicate whether a request was successful or failed.
Each error response includes a clear message and, when applicable, an error code to help identify and handle the problem programmatically.
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.
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.
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.
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.
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.
| 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; |
This endpoint is deprecated and no longer returns data. Use /reports/detailed to retrieve time entry information.
{- "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
| 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 |
| 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 |
| todo_id | string To-do linked to this time entry. Send |
| breaks_total | string Total break time, formatted as HH:mm:ss |
Array of objects Break intervals inside the time entry |
{- "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": [
- {
- "time_start": "12:00:00",
- "time_end": "13:00:00"
}
]
}{- "data": {
- "id": 1201,
- "bill_by": null,
- "changed_by": 5,
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "customer_id": 2,
- "customer_name": "ACME",
- "date_changed": "2022-01-03 10:01:00",
- "date_created": "2022-01-01 12:33:00",
- "date_execution": "2022-01-14",
- "description": "activity description...",
- "form": "time_entry_form_1",
- "is_billable": true,
- "is_invoiced": 0,
- "is_locked": false,
- "locked_reason": "is invoiced",
- "permissions": {
- "can_modify_locked": false
}, - "project_id": 2,
- "project_is_billable": true,
- "project_name": "Processo ISO",
- "project_status": 1,
- "stopwatch_active": false,
- "stopwatch_date_start": "2022-01-01 12:33:00",
- "task_id": 10,
- "task_name": "Meeting",
- "time_end": "14:00:00",
- "time_start": "08:00:00",
- "time_total": "06:00:00",
- "user_id": 5,
- "user_name": "Dyorg",
- "rate_hour": 100,
- "rate_total": 600,
- "has_overtime": false,
- "overtime": "01:00:00",
- "regular_time": "05:00:00",
- "is_editable": true,
- "approval_id": 40,
- "approval_status": "pending",
- "created_at": "2024-05-14 19:11:25",
- "changed_at": "2024-05-15 10:00:00",
- "creator_id": 5,
- "changed_by_user_name": "Dyorg",
- "user_email": "dyorg@rabbitwork.io",
- "task_color": "#4C6EF5",
- "project_color": "#12B886",
- "manager_id": 3,
- "manager_name": "Ana",
- "todo_id": "c96r3a88u0k0b3e6hft0",
- "todo_name": "Buy a coffee",
- "cost_rate": 65,
- "cost_amount": 520,
- "billable_tax_rate": 8,
- "billable_tax_amount": 64,
- "billable_net_amount": 736,
- "margin_amount": 216,
- "breaks_total": "01:00:00",
- "break_intervals": [
- {
- "time_start": "12:00:00",
- "time_end": "13:00:00"
}
], - "external_ref": {
- "provider": "jira",
- "entity_type": "issue",
- "entity_id": "API-42",
- "parent_id": "string",
- "parent_type": "string",
- "display_name": "string",
- "alt_id": "string"
}, - "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}
}
}Returns the time entry whose stopwatch is running for the authenticated user. data is null when no timer is active.
{- "data": {
- "id": 1201,
- "bill_by": null,
- "changed_by": 5,
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "customer_id": 2,
- "customer_name": "ACME",
- "date_changed": "2022-01-03 10:01:00",
- "date_created": "2022-01-01 12:33:00",
- "date_execution": "2022-01-14",
- "description": "activity description...",
- "form": "time_entry_form_1",
- "is_billable": true,
- "is_invoiced": 0,
- "is_locked": false,
- "locked_reason": "is invoiced",
- "permissions": {
- "can_modify_locked": false
}, - "project_id": 2,
- "project_is_billable": true,
- "project_name": "Processo ISO",
- "project_status": 1,
- "stopwatch_active": false,
- "stopwatch_date_start": "2022-01-01 12:33:00",
- "task_id": 10,
- "task_name": "Meeting",
- "time_end": "14:00:00",
- "time_start": "08:00:00",
- "time_total": "06:00:00",
- "user_id": 5,
- "user_name": "Dyorg",
- "rate_hour": 100,
- "rate_total": 600,
- "has_overtime": false,
- "overtime": "01:00:00",
- "regular_time": "05:00:00",
- "is_editable": true,
- "approval_id": 40,
- "approval_status": "pending",
- "created_at": "2024-05-14 19:11:25",
- "changed_at": "2024-05-15 10:00:00",
- "creator_id": 5,
- "changed_by_user_name": "Dyorg",
- "user_email": "dyorg@rabbitwork.io",
- "task_color": "#4C6EF5",
- "project_color": "#12B886",
- "manager_id": 3,
- "manager_name": "Ana",
- "todo_id": "c96r3a88u0k0b3e6hft0",
- "todo_name": "Buy a coffee",
- "cost_rate": 65,
- "cost_amount": 520,
- "billable_tax_rate": 8,
- "billable_tax_amount": 64,
- "billable_net_amount": 736,
- "margin_amount": 216,
- "breaks_total": "01:00:00",
- "break_intervals": [
- {
- "time_start": "12:00:00",
- "time_end": "13:00:00"
}
], - "external_ref": {
- "provider": "jira",
- "entity_type": "issue",
- "entity_id": "API-42",
- "parent_id": "string",
- "parent_type": "string",
- "display_name": "string",
- "alt_id": "string"
}, - "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}
}
}Retrive a Time Entry by ID
| id required | integer Example: 25 Time Entry ID |
{- "data": {
- "id": 1201,
- "bill_by": null,
- "changed_by": 5,
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "customer_id": 2,
- "customer_name": "ACME",
- "date_changed": "2022-01-03 10:01:00",
- "date_created": "2022-01-01 12:33:00",
- "date_execution": "2022-01-14",
- "description": "activity description...",
- "form": "time_entry_form_1",
- "is_billable": true,
- "is_invoiced": 0,
- "is_locked": false,
- "locked_reason": "is invoiced",
- "permissions": {
- "can_modify_locked": false
}, - "project_id": 2,
- "project_is_billable": true,
- "project_name": "Processo ISO",
- "project_status": 1,
- "stopwatch_active": false,
- "stopwatch_date_start": "2022-01-01 12:33:00",
- "task_id": 10,
- "task_name": "Meeting",
- "time_end": "14:00:00",
- "time_start": "08:00:00",
- "time_total": "06:00:00",
- "user_id": 5,
- "user_name": "Dyorg",
- "rate_hour": 100,
- "rate_total": 600,
- "has_overtime": false,
- "overtime": "01:00:00",
- "regular_time": "05:00:00",
- "is_editable": true,
- "approval_id": 40,
- "approval_status": "pending",
- "created_at": "2024-05-14 19:11:25",
- "changed_at": "2024-05-15 10:00:00",
- "creator_id": 5,
- "changed_by_user_name": "Dyorg",
- "user_email": "dyorg@rabbitwork.io",
- "task_color": "#4C6EF5",
- "project_color": "#12B886",
- "manager_id": 3,
- "manager_name": "Ana",
- "todo_id": "c96r3a88u0k0b3e6hft0",
- "todo_name": "Buy a coffee",
- "cost_rate": 65,
- "cost_amount": 520,
- "billable_tax_rate": 8,
- "billable_tax_amount": 64,
- "billable_net_amount": 736,
- "margin_amount": 216,
- "breaks_total": "01:00:00",
- "break_intervals": [
- {
- "time_start": "12:00:00",
- "time_end": "13:00:00"
}
], - "external_ref": {
- "provider": "jira",
- "entity_type": "issue",
- "entity_id": "API-42",
- "parent_id": "string",
- "parent_type": "string",
- "display_name": "string",
- "alt_id": "string"
}, - "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}
}
}| id required | integer Example: 25 Time Entry ID |
| 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 |
| 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 |
| todo_id | string To-do linked to this time entry. Send |
| breaks_total | string Total break time, formatted as HH:mm:ss |
Array of objects Break intervals inside the time entry |
{- "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": [
- {
- "time_start": "12:00:00",
- "time_end": "13:00:00"
}
]
}{- "data": {
- "id": 1201,
- "bill_by": null,
- "changed_by": 5,
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "customer_id": 2,
- "customer_name": "ACME",
- "date_changed": "2022-01-03 10:01:00",
- "date_created": "2022-01-01 12:33:00",
- "date_execution": "2022-01-14",
- "description": "activity description...",
- "form": "time_entry_form_1",
- "is_billable": true,
- "is_invoiced": 0,
- "is_locked": false,
- "locked_reason": "is invoiced",
- "permissions": {
- "can_modify_locked": false
}, - "project_id": 2,
- "project_is_billable": true,
- "project_name": "Processo ISO",
- "project_status": 1,
- "stopwatch_active": false,
- "stopwatch_date_start": "2022-01-01 12:33:00",
- "task_id": 10,
- "task_name": "Meeting",
- "time_end": "14:00:00",
- "time_start": "08:00:00",
- "time_total": "06:00:00",
- "user_id": 5,
- "user_name": "Dyorg",
- "rate_hour": 100,
- "rate_total": 600,
- "has_overtime": false,
- "overtime": "01:00:00",
- "regular_time": "05:00:00",
- "is_editable": true,
- "approval_id": 40,
- "approval_status": "pending",
- "created_at": "2024-05-14 19:11:25",
- "changed_at": "2024-05-15 10:00:00",
- "creator_id": 5,
- "changed_by_user_name": "Dyorg",
- "user_email": "dyorg@rabbitwork.io",
- "task_color": "#4C6EF5",
- "project_color": "#12B886",
- "manager_id": 3,
- "manager_name": "Ana",
- "todo_id": "c96r3a88u0k0b3e6hft0",
- "todo_name": "Buy a coffee",
- "cost_rate": 65,
- "cost_amount": 520,
- "billable_tax_rate": 8,
- "billable_tax_amount": 64,
- "billable_net_amount": 736,
- "margin_amount": 216,
- "breaks_total": "01:00:00",
- "break_intervals": [
- {
- "time_start": "12:00:00",
- "time_end": "13:00:00"
}
], - "external_ref": {
- "provider": "jira",
- "entity_type": "issue",
- "entity_id": "API-42",
- "parent_id": "string",
- "parent_type": "string",
- "display_name": "string",
- "alt_id": "string"
}, - "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}
}
}Start stopwatch on a existing time entry
| id required | integer Example: 25 Time Entry ID |
| time_start | string Default: "00:00:00" Start time of this time entry |
| stopwatch_date_start | string Date and time when stopwatch was started |
{- "time_start": "08:00:00",
- "stopwatch_date_start": "2022-01-01 12:33:00"
}{- "data": {
- "id": 1201,
- "bill_by": null,
- "changed_by": 5,
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "customer_id": 2,
- "customer_name": "ACME",
- "date_changed": "2022-01-03 10:01:00",
- "date_created": "2022-01-01 12:33:00",
- "date_execution": "2022-01-14",
- "description": "activity description...",
- "form": "time_entry_form_1",
- "is_billable": true,
- "is_invoiced": 0,
- "is_locked": false,
- "locked_reason": "is invoiced",
- "permissions": {
- "can_modify_locked": false
}, - "project_id": 2,
- "project_is_billable": true,
- "project_name": "Processo ISO",
- "project_status": 1,
- "stopwatch_active": false,
- "stopwatch_date_start": "2022-01-01 12:33:00",
- "task_id": 10,
- "task_name": "Meeting",
- "time_end": "14:00:00",
- "time_start": "08:00:00",
- "time_total": "06:00:00",
- "user_id": 5,
- "user_name": "Dyorg",
- "rate_hour": 100,
- "rate_total": 600,
- "has_overtime": false,
- "overtime": "01:00:00",
- "regular_time": "05:00:00",
- "is_editable": true,
- "approval_id": 40,
- "approval_status": "pending",
- "created_at": "2024-05-14 19:11:25",
- "changed_at": "2024-05-15 10:00:00",
- "creator_id": 5,
- "changed_by_user_name": "Dyorg",
- "user_email": "dyorg@rabbitwork.io",
- "task_color": "#4C6EF5",
- "project_color": "#12B886",
- "manager_id": 3,
- "manager_name": "Ana",
- "todo_id": "c96r3a88u0k0b3e6hft0",
- "todo_name": "Buy a coffee",
- "cost_rate": 65,
- "cost_amount": 520,
- "billable_tax_rate": 8,
- "billable_tax_amount": 64,
- "billable_net_amount": 736,
- "margin_amount": 216,
- "breaks_total": "01:00:00",
- "break_intervals": [
- {
- "time_start": "12:00:00",
- "time_end": "13:00:00"
}
], - "external_ref": {
- "provider": "jira",
- "entity_type": "issue",
- "entity_id": "API-42",
- "parent_id": "string",
- "parent_type": "string",
- "display_name": "string",
- "alt_id": "string"
}, - "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}
}
}Stop stopwatch of a time entry with active stopwatch
| id required | integer Example: 25 Time Entry ID |
| time_total | string Default: "00:00:00" Total time of this time entry |
{- "time_total": "06:00:00"
}{- "data": {
- "id": 1201,
- "bill_by": null,
- "changed_by": 5,
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "customer_id": 2,
- "customer_name": "ACME",
- "date_changed": "2022-01-03 10:01:00",
- "date_created": "2022-01-01 12:33:00",
- "date_execution": "2022-01-14",
- "description": "activity description...",
- "form": "time_entry_form_1",
- "is_billable": true,
- "is_invoiced": 0,
- "is_locked": false,
- "locked_reason": "is invoiced",
- "permissions": {
- "can_modify_locked": false
}, - "project_id": 2,
- "project_is_billable": true,
- "project_name": "Processo ISO",
- "project_status": 1,
- "stopwatch_active": false,
- "stopwatch_date_start": "2022-01-01 12:33:00",
- "task_id": 10,
- "task_name": "Meeting",
- "time_end": "14:00:00",
- "time_start": "08:00:00",
- "time_total": "06:00:00",
- "user_id": 5,
- "user_name": "Dyorg",
- "rate_hour": 100,
- "rate_total": 600,
- "has_overtime": false,
- "overtime": "01:00:00",
- "regular_time": "05:00:00",
- "is_editable": true,
- "approval_id": 40,
- "approval_status": "pending",
- "created_at": "2024-05-14 19:11:25",
- "changed_at": "2024-05-15 10:00:00",
- "creator_id": 5,
- "changed_by_user_name": "Dyorg",
- "user_email": "dyorg@rabbitwork.io",
- "task_color": "#4C6EF5",
- "project_color": "#12B886",
- "manager_id": 3,
- "manager_name": "Ana",
- "todo_id": "c96r3a88u0k0b3e6hft0",
- "todo_name": "Buy a coffee",
- "cost_rate": 65,
- "cost_amount": 520,
- "billable_tax_rate": 8,
- "billable_tax_amount": 64,
- "billable_net_amount": 736,
- "margin_amount": 216,
- "breaks_total": "01:00:00",
- "break_intervals": [
- {
- "time_start": "12:00:00",
- "time_end": "13:00:00"
}
], - "external_ref": {
- "provider": "jira",
- "entity_type": "issue",
- "entity_id": "API-42",
- "parent_id": "string",
- "parent_type": "string",
- "display_name": "string",
- "alt_id": "string"
}, - "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}
}
}Generate time entries detailed report
| 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:
Filter by project ID. Use comma-separated list of IDs for many IDs. |
| task_id | Array of integers or guids Examples:
Filter by task ID. Use comma-separated list of IDs for many IDs. |
| customer_id | Array of integers or guids Examples:
Filter by customer ID. Use comma-separated list of IDs for many IDs. |
| user_id | Array of integers or guids Examples:
Filter by user. Use comma-separated list of IDs for many IDs. |
| team_id | Array of integers or guids Examples:
Filter assignees by team. Use comma-separated list of IDs for many IDs. |
| id | integer or guid Default: null Examples:
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 |
| task_empty | string Value: "true" Send |
| customer_empty | string Value: "true" Send |
| todo_id | string Filter by linked to-do id. |
| todo_id_empty | string Value: "true" Send |
| is_stopwatch_active | boolean Default: false When true, return only entries with a running timer. |
| include_unregistered_projects | boolean Deprecated Deprecated. Used only when |
| custom_fields.{id} | string Default: null Example: custom_fields.{id}=10 Filter entries based on custom fields. Replace |
| 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. |
{- "data": [
- {
- "billable_net_amount": 736,
- "billable_tax_amount": 64,
- "billable_tax_rate": 8,
- "changed_at": null,
- "changed_by": null,
- "changed_by_user_name": null,
- "cost_amount": 520,
- "cost_rate": 65,
- "created_at": "2024-05-14 19:11:25",
- "created_by": 1,
- "created_by_user_name": "Anna Santos",
- "creator_id": 1,
- "custom_fields": [ ],
- "customer_id": 2,
- "customer_name": "Negócios Digitais",
- "date_changed": null,
- "date_created": "2024-05-14T19:11:25-0300",
- "date_execution": "2024-01-01",
- "description": "",
- "id": 127,
- "is_billable": true,
- "is_invoiced": 0,
- "is_editable": true,
- "approval_id": 40,
- "approval_status": "pending",
- "regular_time": "07:00:00",
- "has_overtime": false,
- "overtime": "01:00:00",
- "breaks_total": "01:00:00",
- "break_intervals": [
- {
- "time_start": "12:00:00",
- "time_end": "13:00:00"
}
], - "external_ref": {
- "provider": "jira",
- "entity_type": "issue",
- "entity_id": "API-42",
- "parent_id": "string",
- "parent_type": "string",
- "display_name": "string",
- "alt_id": "string"
}, - "task_color": "#4C6EF5",
- "project_color": "#12B886",
- "manager_id": 3,
- "manager_name": "Ana",
- "is_locked": false,
- "locked_reason": null,
- "margin_amount": 216,
- "permissions": {
- "can_modify_locked": false
}, - "project_id": 12,
- "project_is_billable": true,
- "project_name": "Redesign do Site",
- "project_status": 1,
- "rate_hour": "100.00",
- "rate_total": "800.00",
- "stopwatch_active": 0,
- "stopwatch_date_start": null,
- "task_id": 3,
- "task_name": "Reunião",
- "time_end": null,
- "time_start": null,
- "time_total": "08:00:00",
- "todo_id": "c96r3a88u0k0b3e6hft0",
- "todo_name": null,
- "user_email": "anna@example.com",
- "user_id": 1,
- "user_name": "Anna Santos"
}
], - "totals": {
- "total_time": "2422:24:00",
- "total_rate": 184687.5,
- "total_cost": 164292.08,
- "total_uninvoiced": 184687.5,
- "total_overtime": "12:00:00",
- "total_breaks": "08:00:00",
- "total_rows": 150
}, - "has_next_page": true,
- "next_page_query_params": { }
}Generate reports with data groups and custom columns
| 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:
Filter by project ID. Use comma-separated list of IDs for many IDs. |
| task_id | Array of integers or guids Examples:
Filter by task ID. Use comma-separated list of IDs for many IDs. |
| customer_id | Array of integers or guids Examples:
Filter by customer ID. Use comma-separated list of IDs for many IDs. |
| user_id | Array of integers or guids Examples:
Filter by user. Use comma-separated list of IDs for many IDs. |
| team_id | Array of integers or guids Examples:
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_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 | 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. |
| 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. |
| capacity_filter_type | string Enum: "missing_percent_gte" "exceeded_percent_gte" "consumed_percent_lte" "logged_without_capacity" Post-filter used only when |
| capacity_filter_scope | string Default: "any_day" Enum: "any_day" "all_days" "period_total" How the capacity percentage is applied. Default is |
| 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 |
{- "items": [
- {
- "details": {
- "group_key": "project_id",
- "group_type": "project",
- "level": 1
}, - "total": {
- "billable_invoiced": 84687.5,
- "billable_net_total": 169912.5,
- "billable_taxes_total": 14775,
- "billable_total": 184687.5,
- "billable_uninvoiced": 100000,
- "cost_billable": 148072.33,
- "cost_non_billable": 16219.75,
- "cost_total": 164292.08,
- "margin_percentage": 3.04,
- "margin_total": 5620.42,
- "time_billable": {
- "time": "372:15:00",
- "hours": 372.25,
- "minutes": 22335,
- "seconds": 1340100
}, - "time_non_billable": {
- "time": "372:15:00",
- "hours": 372.25,
- "minutes": 22335,
- "seconds": 1340100
}, - "time_percentage": 100,
- "time_percentage_overall": 100,
- "time_total": {
- "time": "372:15:00",
- "hours": 372.25,
- "minutes": 22335,
- "seconds": 1340100
}
}, - "items": [ ]
}, - {
- "details": {
- "group_key": "project_id",
- "group_type": "project",
- "level": 1
}, - "total": {
- "billable_invoiced": 84687.5,
- "billable_net_total": 169912.5,
- "billable_taxes_total": 14775,
- "billable_total": 184687.5,
- "billable_uninvoiced": 100000,
- "cost_billable": 148072.33,
- "cost_non_billable": 16219.75,
- "cost_total": 164292.08,
- "margin_percentage": 3.04,
- "margin_total": 5620.42,
- "time_billable": {
- "time": "372:15:00",
- "hours": 372.25,
- "minutes": 22335,
- "seconds": 1340100
}, - "time_non_billable": {
- "time": "372:15:00",
- "hours": 372.25,
- "minutes": 22335,
- "seconds": 1340100
}, - "time_percentage": 100,
- "time_percentage_overall": 100,
- "time_total": {
- "time": "372:15:00",
- "hours": 372.25,
- "minutes": 22335,
- "seconds": 1340100
}
}, - "items": [ ]
}
], - "total": {
- "billable_invoiced": 84687.5,
- "billable_net_total": 169912.5,
- "billable_taxes_total": 14775,
- "billable_total": 184687.5,
- "billable_uninvoiced": 100000,
- "cost_billable": 148072.33,
- "cost_non_billable": 16219.75,
- "cost_total": 164292.08,
- "margin_percentage": 3.04,
- "margin_total": 5620.42,
- "time_billable": {
- "time": "372:15:00",
- "hours": 372.25,
- "minutes": 22335,
- "seconds": 1340100
}, - "time_non_billable": {
- "time": "372:15:00",
- "hours": 372.25,
- "minutes": 22335,
- "seconds": 1340100
}, - "time_percentage": 100,
- "time_percentage_overall": 100,
- "time_total": {
- "time": "372:15:00",
- "hours": 372.25,
- "minutes": 22335,
- "seconds": 1340100
}
}
}List Project
| id | Array of integers or guids Examples:
Filter by ID. Use comma-separated list of IDs for many IDs. |
| customer_id | Array of integers or guids Examples:
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 |
| 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 |
| 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 |
{- "data": [
- {
- "id": 7,
- "active": true,
- "billable": 0,
- "bill_by": "string",
- "budget": 160,
- "budget_by": "time",
- "budget_progress": 90.5,
- "contractor_id": 0,
- "customer_id": 7,
- "customer_name": "ACME",
- "created_by": 0,
- "description": "Activities regarding API development (dev, testing, documentation, rollout, etc)",
- "date_created": "2022-01-01 12:33:00",
- "date_changed": "2022-01-03 10:01:00",
- "is_billable": true,
- "is_manager": true,
- "is_member": true,
- "name": "API development",
- "color": "#12B886",
- "privacy": 7,
- "privacy_s": "private",
- "rate": 110.3,
- "rate_start_at": "2023-01-31",
- "required_task": 0,
- "status": "active",
- "template": false,
- "budget_options": {
- "only_billable_time": true,
- "progress": 90.5,
- "consumed": 0,
- "remaining": 0,
- "exceed": 0
}, - "time_total": "120:00:00",
- "total_pending_todos": 4,
- "total_uninvoiced": 120,
- "total_active_tasks": 120,
- "total_invoiced": 120,
- "total_members": 120,
- "value_total": 120,
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "51": {
- "type": "enum",
- "value": "139",
- "enum_name": "Cebola"
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}, - "todo_permissions": {
- "member_visibility": "all_activities",
- "create": "all_members",
- "edit": "all_members",
- "complete": "all_members",
- "comment": "all_members",
- "assign": "all_members",
- "planning": "all_members",
- "move": "all_members",
- "delete": "all_members",
- "manage_lists": "all_members"
}, - "todo_allowed_actions": {
- "bypass": true,
- "create": true,
- "edit": true,
- "complete": true,
- "delete": true,
- "comment": true,
- "move": true,
- "manage_lists": true
}
}
], - "has_next_page": true,
- "next_page_query_params": { },
- "totals": {
- "total_rows": 150
}
}New Project
| active | boolean Project is active. Filter lists with |
| 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 ( |
| rate | integer Default: 0 Most recently billable hourly rate of project |
| rate_start_at_new | string Default: null Start date for new rate. |
| required_task | integer Default: 0 Enum: 0 1 Required task when time entry is created on project. |
| template | boolean Default: false Project is defined as template |
object Budget options. On write, | |
| only_admin_publish | integer Deprecated Deprecated. Still accepted on save and not returned. Use |
| only_admin_see_others | integer Deprecated Deprecated. Still accepted on save and not returned. Use |
| 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 |
object Who can perform each to-do action on this project. |
{- "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_billable_time": true
}, - "only_admin_publish": 0,
- "only_admin_see_others": 0,
- "project_id_source": 12,
- "keep_from_source": [
- "string"
], - "todo_permissions": {
- "member_visibility": "all_activities",
- "create": "all_members",
- "edit": "all_members",
- "complete": "all_members",
- "comment": "all_members",
- "assign": "all_members",
- "planning": "all_members",
- "move": "all_members",
- "delete": "all_members",
- "manage_lists": "all_members"
}, - "custom_fields": {
- "26": "120",
- "45": 150000,
- "51": "139",
- "73": "2026-10-07"
}
}{- "data": {
- "id": 7,
- "active": true,
- "billable": 0,
- "bill_by": "string",
- "budget": 160,
- "budget_by": "time",
- "budget_progress": 90.5,
- "contractor_id": 0,
- "customer_id": 7,
- "customer_name": "ACME",
- "created_by": 0,
- "description": "Activities regarding API development (dev, testing, documentation, rollout, etc)",
- "date_created": "2022-01-01 12:33:00",
- "date_changed": "2022-01-03 10:01:00",
- "is_billable": true,
- "is_manager": true,
- "is_member": true,
- "name": "API development",
- "color": "#12B886",
- "privacy": 7,
- "privacy_s": "private",
- "rate": 110.3,
- "rate_start_at": "2023-01-31",
- "required_task": 0,
- "status": "active",
- "template": false,
- "budget_options": {
- "only_billable_time": true,
- "progress": 90.5,
- "consumed": 0,
- "remaining": 0,
- "exceed": 0
}, - "time_total": "120:00:00",
- "total_pending_todos": 4,
- "total_uninvoiced": 120,
- "total_active_tasks": 120,
- "total_invoiced": 120,
- "total_members": 120,
- "value_total": 120,
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "51": {
- "type": "enum",
- "value": "139",
- "enum_name": "Cebola"
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}, - "todo_permissions": {
- "member_visibility": "all_activities",
- "create": "all_members",
- "edit": "all_members",
- "complete": "all_members",
- "comment": "all_members",
- "assign": "all_members",
- "planning": "all_members",
- "move": "all_members",
- "delete": "all_members",
- "manage_lists": "all_members"
}, - "todo_allowed_actions": {
- "bypass": true,
- "create": true,
- "edit": true,
- "complete": true,
- "delete": true,
- "comment": true,
- "move": true,
- "manage_lists": true
}
}
}Retrive a Project by ID
| id required | integer Example: 57 Project ID |
| opt_expand | string Value: "custom_fields_settings" Send |
{- "data": {
- "id": 7,
- "active": true,
- "billable": 0,
- "bill_by": "string",
- "budget": 160,
- "budget_by": "time",
- "budget_progress": 90.5,
- "contractor_id": 0,
- "customer_id": 7,
- "customer_name": "ACME",
- "created_by": 0,
- "description": "Activities regarding API development (dev, testing, documentation, rollout, etc)",
- "date_created": "2022-01-01 12:33:00",
- "date_changed": "2022-01-03 10:01:00",
- "is_billable": true,
- "is_manager": true,
- "is_member": true,
- "name": "API development",
- "color": "#12B886",
- "privacy": 7,
- "privacy_s": "private",
- "rate": 110.3,
- "rate_start_at": "2023-01-31",
- "required_task": 0,
- "status": "active",
- "template": false,
- "budget_options": {
- "only_billable_time": true,
- "progress": 90.5,
- "consumed": 0,
- "remaining": 0,
- "exceed": 0
}, - "time_total": "120:00:00",
- "total_pending_todos": 4,
- "total_uninvoiced": 120,
- "total_active_tasks": 120,
- "total_invoiced": 120,
- "total_members": 120,
- "value_total": 120,
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "51": {
- "type": "enum",
- "value": "139",
- "enum_name": "Cebola"
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}, - "todo_permissions": {
- "member_visibility": "all_activities",
- "create": "all_members",
- "edit": "all_members",
- "complete": "all_members",
- "comment": "all_members",
- "assign": "all_members",
- "planning": "all_members",
- "move": "all_members",
- "delete": "all_members",
- "manage_lists": "all_members"
}, - "todo_allowed_actions": {
- "bypass": true,
- "create": true,
- "edit": true,
- "complete": true,
- "delete": true,
- "comment": true,
- "move": true,
- "manage_lists": true
}
}
}| id required | integer Example: 57 Project ID |
| active | boolean Project is active. Filter lists with |
| 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 ( |
| rate | integer Default: 0 Most recently billable hourly rate of project |
| rate_start_at_new | string Default: null Start date for new rate. |
| required_task | integer Default: 0 Enum: 0 1 Required task when time entry is created on project. |
| template | boolean Default: false Project is defined as template |
object Budget options. On write, | |
| only_admin_publish | integer Deprecated Deprecated. Still accepted on save and not returned. Use |
| only_admin_see_others | integer Deprecated Deprecated. Still accepted on save and not returned. Use |
| 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 |
object Who can perform each to-do action on this project. |
{- "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_billable_time": true
}, - "only_admin_publish": 0,
- "only_admin_see_others": 0,
- "project_id_source": 12,
- "keep_from_source": [
- "string"
], - "todo_permissions": {
- "member_visibility": "all_activities",
- "create": "all_members",
- "edit": "all_members",
- "complete": "all_members",
- "comment": "all_members",
- "assign": "all_members",
- "planning": "all_members",
- "move": "all_members",
- "delete": "all_members",
- "manage_lists": "all_members"
}, - "custom_fields": {
- "26": "120",
- "45": 150000,
- "51": "139",
- "73": "2026-10-07"
}
}{- "data": {
- "id": 7,
- "active": true,
- "billable": 0,
- "bill_by": "string",
- "budget": 160,
- "budget_by": "time",
- "budget_progress": 90.5,
- "contractor_id": 0,
- "customer_id": 7,
- "customer_name": "ACME",
- "created_by": 0,
- "description": "Activities regarding API development (dev, testing, documentation, rollout, etc)",
- "date_created": "2022-01-01 12:33:00",
- "date_changed": "2022-01-03 10:01:00",
- "is_billable": true,
- "is_manager": true,
- "is_member": true,
- "name": "API development",
- "color": "#12B886",
- "privacy": 7,
- "privacy_s": "private",
- "rate": 110.3,
- "rate_start_at": "2023-01-31",
- "required_task": 0,
- "status": "active",
- "template": false,
- "budget_options": {
- "only_billable_time": true,
- "progress": 90.5,
- "consumed": 0,
- "remaining": 0,
- "exceed": 0
}, - "time_total": "120:00:00",
- "total_pending_todos": 4,
- "total_uninvoiced": 120,
- "total_active_tasks": 120,
- "total_invoiced": 120,
- "total_members": 120,
- "value_total": 120,
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "51": {
- "type": "enum",
- "value": "139",
- "enum_name": "Cebola"
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}, - "todo_permissions": {
- "member_visibility": "all_activities",
- "create": "all_members",
- "edit": "all_members",
- "complete": "all_members",
- "comment": "all_members",
- "assign": "all_members",
- "planning": "all_members",
- "move": "all_members",
- "delete": "all_members",
- "manage_lists": "all_members"
}, - "todo_allowed_actions": {
- "bypass": true,
- "create": true,
- "edit": true,
- "complete": true,
- "delete": true,
- "comment": true,
- "move": true,
- "manage_lists": true
}
}
}Retrieve list of project members
| id required | integer Example: 57 Project ID |
{- "data": [
- {
- "id": 88,
- "user_email": "dyorg@rabbit.com",
- "user_name": "Dyorg",
- "manager": 1,
- "date_created": "2022-01-01 12:33:00",
- "active": 1,
- "is_billable": true,
- "rate": 110.3,
- "rate_start_at": "2023-01-31",
- "billable": 0,
- "budget": 40,
- "user_role": "member",
- "user_profile_photo": "string",
- "user_profile_photo_url": "string",
- "project_id": 57,
- "user_id": 1,
- "teams": [ ]
}
]
}Add user as project member and define custom rate per user on specified project
| id required | integer Example: 57 Project ID |
| id required | integer Example: 5 User ID |
| 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. |
| budget | number Budget for this member on the project. |
| rate_start_at_new | string Default: null Start date for new rate. |
{- "manager": 1,
- "is_billable": true,
- "rate": 110.3,
- "budget": 40,
- "rate_start_at_new": "2023-01-02"
}{- "data": {
- "id": 88,
- "user_email": "dyorg@rabbit.com",
- "user_name": "Dyorg",
- "manager": 1,
- "date_created": "2022-01-01 12:33:00",
- "active": 1,
- "is_billable": true,
- "rate": 110.3,
- "rate_start_at": "2023-01-31",
- "billable": 0,
- "budget": 40,
- "user_role": "member",
- "user_profile_photo": "string",
- "user_profile_photo_url": "string",
- "project_id": 57,
- "user_id": 1,
- "teams": [ ]
}
}List active users that are not a project member
| id required | integer Example: 57 Project ID |
{- "data": [
- {
- "id": 4,
- "name": "Anne",
- "email": "anne@rabbitwork.io",
- "profile_photo": "string",
- "profile_photo_url": "string",
- "teams": [
- {
- "id": 11,
- "name": "Sales"
}
]
}
]
}Retrieve list of project members
| id required | integer Example: 57 Project ID |
| checked | boolean Filter project tasks by the checked flag. |
{- "data": [
- {
- "id": 88,
- "project_id": 57,
- "task_id": 12,
- "task_name": "Meeting",
- "task_description": "Meeting description",
- "is_billable_default": 1,
- "date_created": "2022-01-01 12:33:00",
- "checked": 1,
- "is_billable": true,
- "budget": 20,
- "rate": 110,
- "color": "#4C6EF5",
- "user_id": 5,
- "user_name": "Dyorg",
- "user_email": "dyorg@rabbitwork.io",
- "billable": 0
}
]
}Add task as project member and define custom rate per task on specified project
| id required | integer Example: 57 Project ID |
| id required | integer Example: 25 Task ID |
| 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. |
{- "is_billable": true,
- "budget": 20,
- "rate": 110
}{- "data": {
- "id": 88,
- "project_id": 57,
- "task_id": 12,
- "task_name": "Meeting",
- "task_description": "Meeting description",
- "is_billable_default": 1,
- "date_created": "2022-01-01 12:33:00",
- "checked": 1,
- "is_billable": true,
- "budget": 20,
- "rate": 110,
- "color": "#4C6EF5",
- "user_id": 5,
- "user_name": "Dyorg",
- "user_email": "dyorg@rabbitwork.io",
- "billable": 0
}
}Mark a task as checked on project
| id required | integer Example: 57 Project ID |
| id required | integer Example: 25 Task ID |
{- "data": {
- "id": 88,
- "project_id": 57,
- "task_id": 12,
- "task_name": "Meeting",
- "task_description": "Meeting description",
- "is_billable_default": 1,
- "date_created": "2022-01-01 12:33:00",
- "checked": 1,
- "is_billable": true,
- "budget": 20,
- "rate": 110,
- "color": "#4C6EF5",
- "user_id": 5,
- "user_name": "Dyorg",
- "user_email": "dyorg@rabbitwork.io",
- "billable": 0
}
}Mark a task as unchecked on project
| id required | integer Example: 57 Project ID |
| id required | integer Example: 25 Task ID |
{- "data": {
- "id": 88,
- "project_id": 57,
- "task_id": 12,
- "task_name": "Meeting",
- "task_description": "Meeting description",
- "is_billable_default": 1,
- "date_created": "2022-01-01 12:33:00",
- "checked": 1,
- "is_billable": true,
- "budget": 20,
- "rate": 110,
- "color": "#4C6EF5",
- "user_id": 5,
- "user_name": "Dyorg",
- "user_email": "dyorg@rabbitwork.io",
- "billable": 0
}
}List active tasks that are not a project member
| id required | integer Example: 57 Project ID |
{- "data": [
- {
- "id": 1,
- "name": "ACME",
- "description": "Description...",
- "is_billable_default": true,
- "color": "#4C6EF5",
- "active": 1,
- "date_created": "2022-01-01 12:33:00",
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}
}
]
}To-do Lists are the activities list on projects
| id required | integer Example: 57 Project ID |
| id | string Filter by to-do list id. |
{- "data": [
- {
- "id": "c96r3a88u0k0b3e6hft0",
- "changed_at": "2022-01-03 10:01:00",
- "created_at": "2022-01-01 12:33:00",
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "name": "Ideas",
- "color": "#4C6EF5",
- "position": 3,
- "project_id": 2,
- "project_name": "Processo ISO",
- "project_status": 1
}
], - "has_next_page": true,
- "next_page_query_params": { },
- "totals": {
- "total_rows": 150
}
}New To-do List
| 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 |
{- "project_id": 2,
- "name": "Ideas",
- "color": "#4C6EF5",
- "position": 3
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "changed_at": "2022-01-03 10:01:00",
- "created_at": "2022-01-01 12:33:00",
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "name": "Ideas",
- "color": "#4C6EF5",
- "position": 3,
- "project_id": 2,
- "project_name": "Processo ISO",
- "project_status": 1
}
}Retrive a To-do List by ID
| id required | integer Example: 25 To-do List ID |
{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "changed_at": "2022-01-03 10:01:00",
- "created_at": "2022-01-01 12:33:00",
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "name": "Ideas",
- "color": "#4C6EF5",
- "position": 3,
- "project_id": 2,
- "project_name": "Processo ISO",
- "project_status": 1
}
}| id required | integer Example: 25 To-do List ID |
| 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 |
{- "name": "Ideas",
- "color": "#4C6EF5",
- "position": 3
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "changed_at": "2022-01-03 10:01:00",
- "created_at": "2022-01-01 12:33:00",
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "name": "Ideas",
- "color": "#4C6EF5",
- "position": 3,
- "project_id": 2,
- "project_name": "Processo ISO",
- "project_status": 1
}
}Restore a soft-deleted to-do list
| id required | integer Example: 25 To-do List ID |
{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "changed_at": "2022-01-03 10:01:00",
- "created_at": "2022-01-01 12:33:00",
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "name": "Ideas",
- "color": "#4C6EF5",
- "position": 3,
- "project_id": 2,
- "project_name": "Processo ISO",
- "project_status": 1
}
}To-dos are the activities list on projects
| 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:
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 |
| user_id | Array of integers or guids Examples:
Filter by user assignee. Use comma-separated list of IDs for many IDs. |
| team_id | Array of integers or guids Examples:
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 |
{- "data": [
- {
- "id": "c96r3a88u0k0b3e6hft0",
- "changed_by": 5,
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "changed_at": "2022-01-03 10:01:00",
- "created_at": "2022-01-01 12:33:00",
- "description": "To-do description...",
- "is_completed": true,
- "name": "Buy a coffee",
- "position": 3,
- "project_id": 2,
- "project_name": "Processo ISO",
- "project_status": 1,
- "todo_list_id": 10,
- "todo_list_name": "Meeting",
- "todo_list_position": 1,
- "time_estimate": "14:00:00",
- "user_id": 5,
- "user_name": "Dyorg",
- "due_on": "2024-01-15",
- "parent_todo_id": "c96r3a88u0k0b3e6hft0",
- "external_ref": {
- "provider": "jira",
- "entity_type": "issue",
- "entity_id": "API-42",
- "parent_id": "string",
- "parent_type": "string",
- "display_name": "string",
- "alt_id": "string"
}, - "time_total": "04:00:00",
- "subtodo_time_estimate_sum": "string",
- "subtodo_time_total_sum": "string",
- "time_progress": 50,
- "attachments_count": 1,
- "comments_count": 2,
- "subtodos_count": 3,
- "todo_list_color": "#4C6EF5",
- "changed_by_user_name": "string",
- "user_profile_photo": "string",
- "user_profile_photo_url": "string",
- "todo_allowed_actions": {
- "edit": true,
- "complete": true,
- "delete": true,
- "comment": true,
- "move": true
}, - "ancestor_name_path": "string",
- "name_path": "string",
- "depth": 1,
- "tags": [
- {
- "id": "c96r3a88u0k0b3e6hft0",
- "name": "Urgent",
- "color": "#E85D4C",
- "is_highlighted": true
}
]
}
], - "has_next_page": true,
- "next_page_query_params": { },
- "totals": {
- "total_rows": 150
}
}New To-do
| 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. |
{- "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": [
- "c96r3a88u0k0b3e6hft0"
], - "highlighted_tag_id": "c96r3a88u0k0b3e6hft0"
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "changed_by": 5,
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "changed_at": "2022-01-03 10:01:00",
- "created_at": "2022-01-01 12:33:00",
- "description": "To-do description...",
- "is_completed": true,
- "name": "Buy a coffee",
- "position": 3,
- "project_id": 2,
- "project_name": "Processo ISO",
- "project_status": 1,
- "todo_list_id": 10,
- "todo_list_name": "Meeting",
- "todo_list_position": 1,
- "time_estimate": "14:00:00",
- "user_id": 5,
- "user_name": "Dyorg",
- "due_on": "2024-01-15",
- "parent_todo_id": "c96r3a88u0k0b3e6hft0",
- "external_ref": {
- "provider": "jira",
- "entity_type": "issue",
- "entity_id": "API-42",
- "parent_id": "string",
- "parent_type": "string",
- "display_name": "string",
- "alt_id": "string"
}, - "time_total": "04:00:00",
- "subtodo_time_estimate_sum": "string",
- "subtodo_time_total_sum": "string",
- "time_progress": 50,
- "attachments_count": 1,
- "comments_count": 2,
- "subtodos_count": 3,
- "todo_list_color": "#4C6EF5",
- "changed_by_user_name": "string",
- "user_profile_photo": "string",
- "user_profile_photo_url": "string",
- "todo_allowed_actions": {
- "edit": true,
- "complete": true,
- "delete": true,
- "comment": true,
- "move": true
}, - "ancestor_name_path": "string",
- "name_path": "string",
- "depth": 1,
- "tags": [
- {
- "id": "c96r3a88u0k0b3e6hft0",
- "name": "Urgent",
- "color": "#E85D4C",
- "is_highlighted": true
}
]
}
}Retrive a To-do by ID
| id required | integer Example: 25 To-do ID |
| trashed | boolean Default: false When true, include to-dos in the trash from the last 30 days. Also accepted on find. |
{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "changed_by": 5,
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "changed_at": "2022-01-03 10:01:00",
- "created_at": "2022-01-01 12:33:00",
- "description": "To-do description...",
- "is_completed": true,
- "name": "Buy a coffee",
- "position": 3,
- "project_id": 2,
- "project_name": "Processo ISO",
- "project_status": 1,
- "todo_list_id": 10,
- "todo_list_name": "Meeting",
- "todo_list_position": 1,
- "time_estimate": "14:00:00",
- "user_id": 5,
- "user_name": "Dyorg",
- "due_on": "2024-01-15",
- "parent_todo_id": "c96r3a88u0k0b3e6hft0",
- "external_ref": {
- "provider": "jira",
- "entity_type": "issue",
- "entity_id": "API-42",
- "parent_id": "string",
- "parent_type": "string",
- "display_name": "string",
- "alt_id": "string"
}, - "time_total": "04:00:00",
- "subtodo_time_estimate_sum": "string",
- "subtodo_time_total_sum": "string",
- "time_progress": 50,
- "attachments_count": 1,
- "comments_count": 2,
- "subtodos_count": 3,
- "todo_list_color": "#4C6EF5",
- "changed_by_user_name": "string",
- "user_profile_photo": "string",
- "user_profile_photo_url": "string",
- "todo_allowed_actions": {
- "edit": true,
- "complete": true,
- "delete": true,
- "comment": true,
- "move": true
}, - "ancestor_name_path": "string",
- "name_path": "string",
- "depth": 1,
- "tags": [
- {
- "id": "c96r3a88u0k0b3e6hft0",
- "name": "Urgent",
- "color": "#E85D4C",
- "is_highlighted": true
}
]
}
}| id required | integer Example: 25 To-do ID |
| 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. |
{- "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": [
- "c96r3a88u0k0b3e6hft0"
], - "highlighted_tag_id": "c96r3a88u0k0b3e6hft0"
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "changed_by": 5,
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "changed_at": "2022-01-03 10:01:00",
- "created_at": "2022-01-01 12:33:00",
- "description": "To-do description...",
- "is_completed": true,
- "name": "Buy a coffee",
- "position": 3,
- "project_id": 2,
- "project_name": "Processo ISO",
- "project_status": 1,
- "todo_list_id": 10,
- "todo_list_name": "Meeting",
- "todo_list_position": 1,
- "time_estimate": "14:00:00",
- "user_id": 5,
- "user_name": "Dyorg",
- "due_on": "2024-01-15",
- "parent_todo_id": "c96r3a88u0k0b3e6hft0",
- "external_ref": {
- "provider": "jira",
- "entity_type": "issue",
- "entity_id": "API-42",
- "parent_id": "string",
- "parent_type": "string",
- "display_name": "string",
- "alt_id": "string"
}, - "time_total": "04:00:00",
- "subtodo_time_estimate_sum": "string",
- "subtodo_time_total_sum": "string",
- "time_progress": 50,
- "attachments_count": 1,
- "comments_count": 2,
- "subtodos_count": 3,
- "todo_list_color": "#4C6EF5",
- "changed_by_user_name": "string",
- "user_profile_photo": "string",
- "user_profile_photo_url": "string",
- "todo_allowed_actions": {
- "edit": true,
- "complete": true,
- "delete": true,
- "comment": true,
- "move": true
}, - "ancestor_name_path": "string",
- "name_path": "string",
- "depth": 1,
- "tags": [
- {
- "id": "c96r3a88u0k0b3e6hft0",
- "name": "Urgent",
- "color": "#E85D4C",
- "is_highlighted": true
}
]
}
}Restore a soft-deleted to-do
| id required | integer Example: 25 To-do ID |
{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "changed_by": 5,
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "changed_at": "2022-01-03 10:01:00",
- "created_at": "2022-01-01 12:33:00",
- "description": "To-do description...",
- "is_completed": true,
- "name": "Buy a coffee",
- "position": 3,
- "project_id": 2,
- "project_name": "Processo ISO",
- "project_status": 1,
- "todo_list_id": 10,
- "todo_list_name": "Meeting",
- "todo_list_position": 1,
- "time_estimate": "14:00:00",
- "user_id": 5,
- "user_name": "Dyorg",
- "due_on": "2024-01-15",
- "parent_todo_id": "c96r3a88u0k0b3e6hft0",
- "external_ref": {
- "provider": "jira",
- "entity_type": "issue",
- "entity_id": "API-42",
- "parent_id": "string",
- "parent_type": "string",
- "display_name": "string",
- "alt_id": "string"
}, - "time_total": "04:00:00",
- "subtodo_time_estimate_sum": "string",
- "subtodo_time_total_sum": "string",
- "time_progress": 50,
- "attachments_count": 1,
- "comments_count": 2,
- "subtodos_count": 3,
- "todo_list_color": "#4C6EF5",
- "changed_by_user_name": "string",
- "user_profile_photo": "string",
- "user_profile_photo_url": "string",
- "todo_allowed_actions": {
- "edit": true,
- "complete": true,
- "delete": true,
- "comment": true,
- "move": true
}, - "ancestor_name_path": "string",
- "name_path": "string",
- "depth": 1,
- "tags": [
- {
- "id": "c96r3a88u0k0b3e6hft0",
- "name": "Urgent",
- "color": "#E85D4C",
- "is_highlighted": true
}
]
}
}List Customer
| id | Array of integers or guids Examples:
Filter by ID. Use comma-separated list of IDs for many IDs. |
| customer_id | integer Alias of |
| active | integer Example: active=1 Filter by active status ("1" is active and "0" is archived) |
{- "data": [
- {
- "id": 1,
- "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",
- "contact": "string",
- "type_person": "string",
- "active": true,
- "date_created": "2022-01-01 12:33:00",
- "date_changed": "2022-01-03 10:01:00",
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}
}
]
}New Customer
| name required | string Customer name |
| observation | string Default: null Customer description |
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. |
{- "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": {
- "26": "120",
- "45": 150000,
- "73": "2026-10-07"
}
}{- "data": {
- "id": 1,
- "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",
- "contact": "string",
- "type_person": "string",
- "active": true,
- "date_created": "2022-01-01 12:33:00",
- "date_changed": "2022-01-03 10:01:00",
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}
}
}Retrive a Customer by ID
| id required | integer Example: 25 Customer ID |
{- "data": {
- "id": 1,
- "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",
- "contact": "string",
- "type_person": "string",
- "active": true,
- "date_created": "2022-01-01 12:33:00",
- "date_changed": "2022-01-03 10:01:00",
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}
}
}| id required | integer Example: 25 Customer ID |
| name required | string Customer name |
| observation | string Default: null Customer description |
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. |
{- "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": {
- "26": "120",
- "45": 150000,
- "73": "2026-10-07"
}
}{- "data": {
- "id": 1,
- "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",
- "contact": "string",
- "type_person": "string",
- "active": true,
- "date_created": "2022-01-01 12:33:00",
- "date_changed": "2022-01-03 10:01:00",
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}
}
}List Task
| id | Array of integers or guids Examples:
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) |
{- "data": [
- {
- "id": 1,
- "name": "ACME",
- "description": "Description...",
- "is_billable_default": true,
- "color": "#4C6EF5",
- "active": 1,
- "date_created": "2022-01-01 12:33:00",
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}
}
]
}New Task
| 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 ( |
{- "name": "ACME",
- "description": "Description...",
- "color": "#4C6EF5",
- "is_billable_default": true,
- "active": 1,
- "custom_fields": {
- "26": "120",
- "45": 150000,
- "73": "2026-10-07"
}
}{- "data": {
- "id": 1,
- "name": "ACME",
- "description": "Description...",
- "is_billable_default": true,
- "color": "#4C6EF5",
- "active": 1,
- "date_created": "2022-01-01 12:33:00",
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}
}
}Retrive a Task by ID
| id required | integer Example: 25 Task ID |
{- "data": {
- "id": 1,
- "name": "ACME",
- "description": "Description...",
- "is_billable_default": true,
- "color": "#4C6EF5",
- "active": 1,
- "date_created": "2022-01-01 12:33:00",
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}
}
}| id required | integer Example: 25 Task ID |
| 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 ( |
{- "name": "ACME",
- "description": "Description...",
- "color": "#4C6EF5",
- "is_billable_default": true,
- "active": 1,
- "custom_fields": {
- "26": "120",
- "45": 150000,
- "73": "2026-10-07"
}
}{- "data": {
- "id": 1,
- "name": "ACME",
- "description": "Description...",
- "is_billable_default": true,
- "color": "#4C6EF5",
- "active": 1,
- "date_created": "2022-01-01 12:33:00",
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}
}
}List Users
| id | Array of integers or guids Examples:
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) |
{- "data": [
- {
- "active": 1,
- "assigned_team_ids": [ ],
- "auto_assign_new_users": false,
- "billable_rate_default": null,
- "capacity_per_day": null,
- "cost_rate": "65",
- "cost_rate_start_at": null,
- "count_employees": 5,
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}, - "date_changed": "2024-05-20T13:36:46-0300",
- "date_created": "2022-02-10T15:06:32-0300",
- "date_deleted": null,
- "email": "name@example.com",
- "id": 1,
- "last_calendar_start_at": "2026-04-01",
- "profile_photo": "9f1c0a.png",
- "total_projects": 12,
- "total_assigned_users": 4,
- "is_billable_default": true,
- "is_owner": true,
- "manager_email": null,
- "manager_id": null,
- "manager_name": null,
- "manage_restricted_teams": false,
- "name": "Anna Santos",
- "owner": true,
- "permissions": [
- "can_manage_assigned_users"
], - "role": "regular",
- "status": "active",
- "teams": [
- {
- "id": 1,
- "name": "Projects"
}
], - "work_days": null,
- "work_end_at": null,
- "work_start_at": null
}
]
}New User
| email required | string User email (required on create). |
| active | integer Default: 1
|
| 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 |
| 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 |
| 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 |
{- "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": [
- "can_manage_assigned_users"
], - "role": "regular",
- "work_days": null,
- "work_end_at": null,
- "work_start_at": null,
- "custom_fields": {
- "26": "120",
- "45": 150000,
- "73": "2026-10-07"
}
}{- "data": {
- "active": 1,
- "assigned_team_ids": [ ],
- "auto_assign_new_users": false,
- "billable_rate_default": null,
- "capacity_per_day": null,
- "cost_rate": "65",
- "cost_rate_start_at": null,
- "count_employees": 5,
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}, - "date_changed": "2024-05-20T13:36:46-0300",
- "date_created": "2022-02-10T15:06:32-0300",
- "date_deleted": null,
- "email": "name@example.com",
- "id": 1,
- "last_calendar_start_at": "2026-04-01",
- "profile_photo": "9f1c0a.png",
- "total_projects": 12,
- "total_assigned_users": 4,
- "is_billable_default": true,
- "is_owner": true,
- "manager_email": null,
- "manager_id": null,
- "manager_name": null,
- "manage_restricted_teams": false,
- "name": "Anna Santos",
- "owner": true,
- "permissions": [
- "can_manage_assigned_users"
], - "role": "regular",
- "status": "active",
- "teams": [
- {
- "id": 1,
- "name": "Projects"
}
], - "work_days": null,
- "work_end_at": null,
- "work_start_at": null
}
}Retrive a user by ID
| id required | integer Example: 5 User ID |
{- "data": {
- "active": 1,
- "assigned_team_ids": [ ],
- "auto_assign_new_users": false,
- "billable_rate_default": null,
- "capacity_per_day": null,
- "cost_rate": "65",
- "cost_rate_start_at": null,
- "count_employees": 5,
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}, - "date_changed": "2024-05-20T13:36:46-0300",
- "date_created": "2022-02-10T15:06:32-0300",
- "date_deleted": null,
- "email": "name@example.com",
- "id": 1,
- "last_calendar_start_at": "2026-04-01",
- "profile_photo": "9f1c0a.png",
- "total_projects": 12,
- "total_assigned_users": 4,
- "is_billable_default": true,
- "is_owner": true,
- "manager_email": null,
- "manager_id": null,
- "manager_name": null,
- "manage_restricted_teams": false,
- "name": "Anna Santos",
- "owner": true,
- "permissions": [
- "can_manage_assigned_users"
], - "role": "regular",
- "status": "active",
- "teams": [
- {
- "id": 1,
- "name": "Projects"
}
], - "work_days": null,
- "work_end_at": null,
- "work_start_at": null
}
}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.
| id required | integer Example: 5 User ID |
| active | integer
|
| 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 |
| 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 |
| 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 |
{- "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": [
- "can_manage_assigned_users"
], - "role": "regular",
- "work_days": null,
- "work_end_at": null,
- "work_start_at": null,
- "custom_fields": {
- "26": "120",
- "45": 150000,
- "73": "2026-10-07"
}
}{- "data": {
- "active": 1,
- "assigned_team_ids": [ ],
- "auto_assign_new_users": false,
- "billable_rate_default": null,
- "capacity_per_day": null,
- "cost_rate": "65",
- "cost_rate_start_at": null,
- "count_employees": 5,
- "custom_fields": {
- "26": {
- "type": "enum",
- "value": "120",
- "enum_name": "Em campo"
}, - "45": {
- "type": "money",
- "value": 150000
}, - "73": {
- "type": "date",
- "value": "2026-10-07"
}
}, - "date_changed": "2024-05-20T13:36:46-0300",
- "date_created": "2022-02-10T15:06:32-0300",
- "date_deleted": null,
- "email": "name@example.com",
- "id": 1,
- "last_calendar_start_at": "2026-04-01",
- "profile_photo": "9f1c0a.png",
- "total_projects": 12,
- "total_assigned_users": 4,
- "is_billable_default": true,
- "is_owner": true,
- "manager_email": null,
- "manager_id": null,
- "manager_name": null,
- "manage_restricted_teams": false,
- "name": "Anna Santos",
- "owner": true,
- "permissions": [
- "can_manage_assigned_users"
], - "role": "regular",
- "status": "active",
- "teams": [
- {
- "id": 1,
- "name": "Projects"
}
], - "work_days": null,
- "work_end_at": null,
- "work_start_at": null
}
}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.
| id required | integer Example: 5 User ID |
{- "message": "The requested user does not exist",
- "status": 400
}Multipart field file. PNG or JPEG, up to 2 MB. The image is stored as a square thumbnail.
| id required | integer Example: 5 User ID |
| file required | string <binary> Multipart field file. PNG or JPEG, up to 2 MB. The image is stored as a square thumbnail. |
{- "data": {
- "profile_photo": "9f1c0a.png"
}
}Active projects where the user is a member.
| id required | integer Example: 5 User ID |
{- "data": [
- {
- "id": "57",
- "customer_id": "string",
- "customer_name": "Acme",
- "name": "Website",
- "active": 1,
- "color": "#12B886",
- "required_task": 0,
- "is_member": true,
- "is_manager": false,
- "current_user_can_manage": true
}
]
}project_id accepts an array of IDs or a comma-separated string.
| id required | integer Example: 5 User ID |
required | Array of strings or string One project ID, a comma-separated list, or an array of IDs. |
{- "project_id": [
- "57",
- "58"
]
}Uses the same project_id body as the add request.
| id required | integer Example: 5 User ID |
required | Array of strings or string One project ID, a comma-separated list, or an array of IDs. |
{- "project_id": [
- "57",
- "58"
]
}Active projects where the user is not a member and the caller can manage membership.
| id required | integer Example: 5 User ID |
{- "data": [
- {
- "id": "57",
- "customer_id": "string",
- "customer_name": "Acme",
- "name": "Website",
- "active": 1,
- "color": "#12B886",
- "required_task": 0,
- "is_member": true,
- "is_manager": false,
- "current_user_can_manage": true
}
]
}Returns users and teams assigned to this user. The payload is not wrapped in data.
| id required | integer Example: 5 User ID |
{- "users": [
- {
- "id": "8",
- "name": "Ana",
- "profile_photo_url": "string",
- "email": "ana@rabbitwork.io",
- "active": 1
}
], - "teams": [
- {
- "id": "11",
- "name": "Sales",
- "total_members": 4
}
]
}Send users, teams, or both as arrays of IDs. Requires the role-permissions feature.
| id required | integer Example: 5 User ID |
| users | Array of strings User IDs to assign or remove. |
| teams | Array of strings Team IDs to assign or remove. |
{- "users": [
- "string"
], - "teams": [
- "string"
]
}| id required | integer Example: 5 User ID |
{- "users": [
- {
- "id": "8",
- "name": "Ana",
- "profile_photo_url": "string",
- "email": "ana@rabbitwork.io",
- "active": 1
}
], - "teams": [
- {
- "id": "11",
- "name": "Sales",
- "total_members": 4
}
]
}Send the user and team IDs to remove.
| id required | integer Example: 5 User ID |
| users | Array of strings User IDs to assign or remove. |
| teams | Array of strings Team IDs to assign or remove. |
{- "users": [
- "string"
], - "teams": [
- "string"
]
}Filter by type (vacation or leave) and by year.
| id required | integer Example: 5 User ID |
| type | string Enum: "vacation" "leave" |
| year | integer Example: year=2026 |
{- "data": [
- {
- "id": "c96r3a88u0k0b3e6hft0",
- "user_id": "5",
- "type": "vacation",
- "start_date": "2026-07-01",
- "end_date": "2026-07-15",
- "hours": 8,
- "description": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "changed_at": "2019-08-24T14:15:22Z"
}
]
}type, start_date, and end_date are required. end_date must be on or after start_date.
| id required | integer Example: 5 User ID |
| 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 |
{- "type": "vacation",
- "start_date": "2026-07-01",
- "end_date": "2026-07-15",
- "hours": 8,
- "description": "string"
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "user_id": "5",
- "type": "vacation",
- "start_date": "2026-07-01",
- "end_date": "2026-07-15",
- "hours": 8,
- "description": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "changed_at": "2019-08-24T14:15:22Z"
}
}| id required | integer Example: 5 User ID |
| allocationId required | string Example: c96r3a88u0k0b3e6hft0 Day off or vacation ID. |
| 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 |
{- "type": "vacation",
- "start_date": "2026-07-01",
- "end_date": "2026-07-15",
- "hours": 8,
- "description": "string"
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "user_id": "5",
- "type": "vacation",
- "start_date": "2026-07-01",
- "end_date": "2026-07-15",
- "hours": 8,
- "description": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "changed_at": "2019-08-24T14:15:22Z"
}
}Periods that assign a work calendar to the user, newest first. An open period has a null end_at.
| id required | integer Example: 5 User ID |
{- "data": [
- {
- "id": "c96r3a88u0k0b3e6hftg",
- "user_id": "5",
- "calendar_id": "c96r3a88u0k0b3e6hft0",
- "start_at": "2026-01-01",
- "end_at": "2026-12-31",
- "created_at": "2019-08-24T14:15:22Z",
- "changed_at": "2019-08-24T14:15:22Z"
}
]
}calendar_id and start_at are required.
| id required | integer Example: 5 User ID |
| 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. |
{- "calendar_id": "c96r3a88u0k0b3e6hft0",
- "start_at": "2026-01-01",
- "end_at": "2026-12-31"
}{- "data": {
- "id": "c96r3a88u0k0b3e6hftg",
- "user_id": "5",
- "calendar_id": "c96r3a88u0k0b3e6hft0",
- "start_at": "2026-01-01",
- "end_at": "2026-12-31",
- "created_at": "2019-08-24T14:15:22Z",
- "changed_at": "2019-08-24T14:15:22Z"
}
}| id required | integer Example: 5 User ID |
| calendarHistoryId required | string Example: c96r3a88u0k0b3e6hftg Calendar history ID. |
| 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. |
{- "calendar_id": "c96r3a88u0k0b3e6hft0",
- "start_at": "2026-01-01",
- "end_at": "2026-12-31"
}{- "data": {
- "id": "c96r3a88u0k0b3e6hftg",
- "user_id": "5",
- "calendar_id": "c96r3a88u0k0b3e6hft0",
- "start_at": "2026-01-01",
- "end_at": "2026-12-31",
- "created_at": "2019-08-24T14:15:22Z",
- "changed_at": "2019-08-24T14:15:22Z"
}
}List teams in the account
| id | Array of integers or guids Examples:
Filter by ID. Use comma-separated list of IDs for many IDs. |
{- "data": [
- {
- "id": 11,
- "name": "Projects",
- "date_created": "2022-01-01 12:33:00",
- "assigned_to": [
- {
- "id": 1,
- "name": "Ana",
- "email": "ana@rabbitwork.io",
- "active": 1
}
], - "total_members": 4,
- "users": [
- {
- "id": 5,
- "name": "Dyorg",
- "email": "dyorg@rabbitwork.io",
- "active": 1,
- "profile_photo": "string",
- "profile_photo_url": "string"
}
], - "timesheet_submission_configured": false
}
]
}Create a team. name is required.
| name required | string Team name |
{- "name": "Projects"
}{- "data": {
- "id": 11,
- "name": "Projects",
- "date_created": "2022-01-01 12:33:00"
}
}| teamId required | integer Example: 11 Team ID |
| name required | string |
{- "name": "Projects"
}{- "data": {
- "id": 11,
- "name": "Projects",
- "date_created": "2022-01-01 12:33:00"
}
}| teamId required | integer Example: 11 Team ID |
| include_archived_users | boolean Default: false When true, the member list includes archived users. The default excludes them. |
{- "data": [
- {
- "id": 5,
- "name": "Dyorg",
- "email": "dyorg@rabbitwork.io",
- "active": 1,
- "profile_photo": "string",
- "profile_photo_url": "string"
}
]
}| 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) |
{- "data": [
- {
- "id": "c96r3a88u0k0b3e6hft0",
- "name": "Cost center",
- "description": "string",
- "entity": "time_entries",
- "type": "text",
- "active": true,
- "required": false,
- "importance": "string",
- "position": 0,
- "json_version": 1,
- "is_restricted": false,
- "restricted_roles": [ ],
- "created_at": "2022-01-01 12:33:00",
- "changed_at": "2022-01-03 10:01:00",
- "enum_options": [
- {
- "id": "c96r3a88u0k0b3e6hftg",
- "custom_field_id": "c96r3a88u0k0b3e6hft0",
- "name": "Buildings",
- "active": true,
- "created_at": "2022-01-01 12:33:00",
- "changed_at": "2022-01-03 10:01:00"
}
]
}
]
}| 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 |
| 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 |
{- "name": "Cost center",
- "description": "string",
- "entity": "time_entries",
- "type": "text",
- "active": true,
- "required": false,
- "importance": "string",
- "position": 0,
- "is_restricted": false,
- "restricted_roles": [ ]
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "name": "Cost center",
- "description": "string",
- "entity": "time_entries",
- "type": "text",
- "active": true,
- "required": false,
- "importance": "string",
- "position": 0,
- "json_version": 1,
- "is_restricted": false,
- "restricted_roles": [ ],
- "created_at": "2022-01-01 12:33:00",
- "changed_at": "2022-01-03 10:01:00",
- "enum_options": [
- {
- "id": "c96r3a88u0k0b3e6hftg",
- "custom_field_id": "c96r3a88u0k0b3e6hft0",
- "name": "Buildings",
- "active": true,
- "created_at": "2022-01-01 12:33:00",
- "changed_at": "2022-01-03 10:01:00"
}
]
}
}Enum fields include their options.
| customFieldId required | string Example: c96r3a88u0k0b3e6hft0 Custom field ID |
{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "name": "Cost center",
- "description": "string",
- "entity": "time_entries",
- "type": "text",
- "active": true,
- "required": false,
- "importance": "string",
- "position": 0,
- "json_version": 1,
- "is_restricted": false,
- "restricted_roles": [ ],
- "created_at": "2022-01-01 12:33:00",
- "changed_at": "2022-01-03 10:01:00",
- "enum_options": [
- {
- "id": "c96r3a88u0k0b3e6hftg",
- "custom_field_id": "c96r3a88u0k0b3e6hft0",
- "name": "Buildings",
- "active": true,
- "created_at": "2022-01-01 12:33:00",
- "changed_at": "2022-01-03 10:01:00"
}
]
}
}| customFieldId required | string Example: c96r3a88u0k0b3e6hft0 Custom field ID |
| 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 |
| 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 |
{- "name": "Cost center",
- "description": "string",
- "entity": "time_entries",
- "type": "text",
- "active": true,
- "required": false,
- "importance": "string",
- "position": 0,
- "is_restricted": false,
- "restricted_roles": [ ]
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "name": "Cost center",
- "description": "string",
- "entity": "time_entries",
- "type": "text",
- "active": true,
- "required": false,
- "importance": "string",
- "position": 0,
- "json_version": 1,
- "is_restricted": false,
- "restricted_roles": [ ],
- "created_at": "2022-01-01 12:33:00",
- "changed_at": "2022-01-03 10:01:00",
- "enum_options": [
- {
- "id": "c96r3a88u0k0b3e6hftg",
- "custom_field_id": "c96r3a88u0k0b3e6hft0",
- "name": "Buildings",
- "active": true,
- "created_at": "2022-01-01 12:33:00",
- "changed_at": "2022-01-03 10:01:00"
}
]
}
}| customFieldId required | string Example: c96r3a88u0k0b3e6hft0 Custom field ID |
{- "data": [
- {
- "id": "c96r3a88u0k0b3e6hftg",
- "custom_field_id": "c96r3a88u0k0b3e6hft0",
- "name": "Buildings",
- "active": true,
- "created_at": "2022-01-01 12:33:00",
- "changed_at": "2022-01-03 10:01:00"
}
]
}| customFieldId required | string Example: c96r3a88u0k0b3e6hft0 Custom field ID |
| custom_field_id | string |
| name required | string |
| active | boolean |
{- "custom_field_id": "c96r3a88u0k0b3e6hft0",
- "name": "Buildings",
- "active": true
}{- "data": {
- "id": "c96r3a88u0k0b3e6hftg",
- "custom_field_id": "c96r3a88u0k0b3e6hft0",
- "name": "Buildings",
- "active": true,
- "created_at": "2022-01-01 12:33:00",
- "changed_at": "2022-01-03 10:01:00"
}
}| customFieldId required | string Example: c96r3a88u0k0b3e6hft0 Custom field ID |
| enumOptionId required | string Example: c96r3a88u0k0b3e6hftg Enum option ID |
{- "data": {
- "id": "c96r3a88u0k0b3e6hftg",
- "custom_field_id": "c96r3a88u0k0b3e6hft0",
- "name": "Buildings",
- "active": true,
- "created_at": "2022-01-01 12:33:00",
- "changed_at": "2022-01-03 10:01:00"
}
}| customFieldId required | string Example: c96r3a88u0k0b3e6hft0 Custom field ID |
| enumOptionId required | string Example: c96r3a88u0k0b3e6hftg Enum option ID |
| custom_field_id | string |
| name required | string |
| active | boolean |
{- "custom_field_id": "c96r3a88u0k0b3e6hft0",
- "name": "Buildings",
- "active": true
}{- "data": {
- "id": "c96r3a88u0k0b3e6hftg",
- "custom_field_id": "c96r3a88u0k0b3e6hft0",
- "name": "Buildings",
- "active": true,
- "created_at": "2022-01-01 12:33:00",
- "changed_at": "2022-01-03 10:01:00"
}
}| id required | integer Example: 57 Project ID |
| 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. |
{- "data": [
- {
- "custom_field_id": "c96r3a88u0k0b3e6hft0",
- "project_id": 7,
- "position": 0,
- "importance": "string",
- "required": false,
- "active": true,
- "created_at": "string",
- "changed_at": "string"
}
]
}| id required | integer Example: 57 Project ID |
| customFieldId required | string Example: c96r3a88u0k0b3e6hft0 Custom field ID |
{- "data": {
- "custom_field_id": "c96r3a88u0k0b3e6hft0",
- "project_id": 7,
- "position": 0,
- "importance": "string",
- "required": false,
- "active": true,
- "created_at": "string",
- "changed_at": "string"
}
}| id required | integer Example: 57 Project ID |
| customFieldId required | string Example: c96r3a88u0k0b3e6hft0 Custom field ID |
| custom_field_id | string |
| project_id | integer |
| position | integer |
| importance | string or null |
| required | boolean |
| active | boolean |
{- "custom_field_id": "c96r3a88u0k0b3e6hft0",
- "project_id": 7,
- "position": 0,
- "importance": "string",
- "required": false,
- "active": true
}{- "data": {
- "custom_field_id": "c96r3a88u0k0b3e6hft0",
- "project_id": 7,
- "position": 0,
- "importance": "string",
- "required": false,
- "active": true,
- "created_at": "string",
- "changed_at": "string"
}
}Submitted and approved timesheets lock the related time entries. Locked entries return is_locked and locked_reason.
| user_id | Array of integers or guids Examples:
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 |
{- "data": [
- {
- "id": "c96r3a88u0k0b3e6hft0",
- "user_id": 5,
- "user_name": "Anna Santos",
- "approver_user_id": 1,
- "approver_name": "Dyorg",
- "period_start": "2026-10-05",
- "period_end": "2026-10-11",
- "status": "submitted",
- "submitted_at": "string",
- "submitted_by": 0,
- "last_rejection_comment": "string",
- "created_at": "string",
- "changed_at": "string",
- "created_by": 0,
- "changed_by": 0,
- "week_capacity_hours": 0,
- "total_hours": "string",
- "billable_hours": "string"
}
], - "has_next_page": true,
- "next_page_query_params": { },
- "totals": {
- "total_rows": 150
}
}Submits the week for the current user, or for user_id when the caller can force-submit.
| user_id | integer Defaults to the authenticated user |
| period_start required | string <date> |
| period_end required | string <date> |
{- "user_id": 0,
- "period_start": "2026-10-05",
- "period_end": "2026-10-11"
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "user_id": 5,
- "user_name": "Anna Santos",
- "approver_user_id": 1,
- "approver_name": "Dyorg",
- "period_start": "2026-10-05",
- "period_end": "2026-10-11",
- "status": "submitted",
- "submitted_at": "string",
- "submitted_by": 0,
- "last_rejection_comment": "string",
- "created_at": "string",
- "changed_at": "string",
- "created_by": 0,
- "changed_by": 0,
- "week_capacity_hours": 0,
- "total_hours": "string",
- "billable_hours": "string"
}
}| timesheetApprovalId required | string Example: c96r3a88u0k0b3e6hft0 Timesheet approval ID |
{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "user_id": 5,
- "user_name": "Anna Santos",
- "approver_user_id": 1,
- "approver_name": "Dyorg",
- "period_start": "2026-10-05",
- "period_end": "2026-10-11",
- "status": "submitted",
- "submitted_at": "string",
- "submitted_by": 0,
- "last_rejection_comment": "string",
- "created_at": "string",
- "changed_at": "string",
- "created_by": 0,
- "changed_by": 0,
- "week_capacity_hours": 0,
- "total_hours": "string",
- "billable_hours": "string"
}
}| timesheetApprovalId required | string Example: c96r3a88u0k0b3e6hft0 Timesheet approval ID |
{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "user_id": 5,
- "user_name": "Anna Santos",
- "approver_user_id": 1,
- "approver_name": "Dyorg",
- "period_start": "2026-10-05",
- "period_end": "2026-10-11",
- "status": "submitted",
- "submitted_at": "string",
- "submitted_by": 0,
- "last_rejection_comment": "string",
- "created_at": "string",
- "changed_at": "string",
- "created_by": 0,
- "changed_by": 0,
- "week_capacity_hours": 0,
- "total_hours": "string",
- "billable_hours": "string"
}
}comment is required.
| timesheetApprovalId required | string Example: c96r3a88u0k0b3e6hft0 Timesheet approval ID |
| comment required | string |
{- "comment": "Missing Monday hours"
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "user_id": 5,
- "user_name": "Anna Santos",
- "approver_user_id": 1,
- "approver_name": "Dyorg",
- "period_start": "2026-10-05",
- "period_end": "2026-10-11",
- "status": "submitted",
- "submitted_at": "string",
- "submitted_by": 0,
- "last_rejection_comment": "string",
- "created_at": "string",
- "changed_at": "string",
- "created_by": 0,
- "changed_by": 0,
- "week_capacity_hours": 0,
- "total_hours": "string",
- "billable_hours": "string"
}
}| timesheetApprovalId required | string Example: c96r3a88u0k0b3e6hft0 Timesheet approval ID |
{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "user_id": 5,
- "user_name": "Anna Santos",
- "approver_user_id": 1,
- "approver_name": "Dyorg",
- "period_start": "2026-10-05",
- "period_end": "2026-10-11",
- "status": "submitted",
- "submitted_at": "string",
- "submitted_by": 0,
- "last_rejection_comment": "string",
- "created_at": "string",
- "changed_at": "string",
- "created_by": 0,
- "changed_by": 0,
- "week_capacity_hours": 0,
- "total_hours": "string",
- "billable_hours": "string"
}
}| timesheetApprovalId required | string Example: c96r3a88u0k0b3e6hft0 Timesheet approval ID |
{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "user_id": 5,
- "user_name": "Anna Santos",
- "approver_user_id": 1,
- "approver_name": "Dyorg",
- "period_start": "2026-10-05",
- "period_end": "2026-10-11",
- "status": "submitted",
- "submitted_at": "string",
- "submitted_by": 0,
- "last_rejection_comment": "string",
- "created_at": "string",
- "changed_at": "string",
- "created_by": 0,
- "changed_by": 0,
- "week_capacity_hours": 0,
- "total_hours": "string",
- "billable_hours": "string"
}
}| timesheetApprovalId required | string Example: c96r3a88u0k0b3e6hft0 Timesheet approval ID |
| approver_user_id required | integer |
{- "approver_user_id": 2
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "user_id": 5,
- "user_name": "Anna Santos",
- "approver_user_id": 1,
- "approver_name": "Dyorg",
- "period_start": "2026-10-05",
- "period_end": "2026-10-11",
- "status": "submitted",
- "submitted_at": "string",
- "submitted_by": 0,
- "last_rejection_comment": "string",
- "created_at": "string",
- "changed_at": "string",
- "created_by": 0,
- "changed_by": 0,
- "week_capacity_hours": 0,
- "total_hours": "string",
- "billable_hours": "string"
}
}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.
| 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. |
{- "data": [
- {
- "id": "c96r3a88u0k0b3e6hft0",
- "type": "billable",
- "user_name": "Ana",
- "rate": 150,
- "project_id": "57",
- "user_id": "5",
- "start_at": "2026-01-01",
- "end_at": "2026-06-30",
- "date_created": "2022-01-01 12:33:00"
}
]
}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.
| 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. |
{- "type": "billable",
- "rate": 0,
- "project_id": "string",
- "user_id": "string",
- "rate_start_at_new": "2019-08-24"
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "type": "billable",
- "user_name": "Ana",
- "rate": 150,
- "project_id": "57",
- "user_id": "5",
- "start_at": "2026-01-01",
- "end_at": "2026-06-30",
- "date_created": "2022-01-01 12:33:00"
}
}Uses the same filters as the list. data is an empty object when no rate exists.
| type required | string Enum: "billable" "cost" "tax" |
| project_id | string |
| user_id | string |
{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "type": "billable",
- "user_name": "Ana",
- "rate": 150,
- "project_id": "57",
- "user_id": "5",
- "start_at": "2026-01-01",
- "end_at": "2026-06-30",
- "date_created": "2022-01-01 12:33:00"
}
}Requires entity_type and entity_id. Pinned comments come first. Send the returned next_page_query_params to read the next page.
| entity_type required | string Value: "todo" |
| entity_id required | string |
| opt_page_limit | integer [ 1 .. 100 ] Default: 50 The numbers of items to return |
{- "data": [
- {
- "id": "c96r3a88u0k0b3e6hft0",
- "entity_type": "todo",
- "entity_id": "c96r3a88u0k0b3e6hftg",
- "user_id": "5",
- "user_name": "Dyorg",
- "profile_photo_url": "string",
- "content": "Please review this @[Dyorg](mention:5)",
- "pinned_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "attachments": [
- {
- "id": "string",
- "original_name": "string",
- "size_bytes": 0,
- "mime_type": "string"
}
]
}
], - "has_next_page": true,
- "total_rows": 0,
- "next_page_query_params": { }
}content is required. Mention a user with @Name.
| 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. |
{- "entity_type": "todo",
- "entity_id": "string",
- "content": "string",
- "attachment_ids": [
- "string"
]
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "entity_type": "todo",
- "entity_id": "c96r3a88u0k0b3e6hftg",
- "user_id": "5",
- "user_name": "Dyorg",
- "profile_photo_url": "string",
- "content": "Please review this @[Dyorg](mention:5)",
- "pinned_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "attachments": [
- {
- "id": "string",
- "original_name": "string",
- "size_bytes": 0,
- "mime_type": "string"
}
]
}
}Send content, pinned, or both. pinned true sets pinned_at. pinned false clears it.
| commentId required | string Example: c96r3a88u0k0b3e6hft0 Comment ID. |
| content | string |
| pinned | boolean Set true to pin the comment, or false to unpin it. |
{- "content": "string",
- "pinned": true
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "entity_type": "todo",
- "entity_id": "c96r3a88u0k0b3e6hftg",
- "user_id": "5",
- "user_name": "Dyorg",
- "profile_photo_url": "string",
- "content": "Please review this @[Dyorg](mention:5)",
- "pinned_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "attachments": [
- {
- "id": "string",
- "original_name": "string",
- "size_bytes": 0,
- "mime_type": "string"
}
]
}
}| name | string Case-insensitive name filter. |
{- "data": [
- {
- "id": "c96r3a88u0k0b3e6hft0",
- "name": "Brazil",
- "parent_id": "c96r3a88u0k0b3e6hftg",
- "created_at": "2019-08-24T14:15:22Z",
- "changed_at": "2019-08-24T14:15:22Z",
- "people_count": 12
}
]
}Requires permission to edit account settings. name is required. parent_id inherits holidays from another calendar.
| name required | string Calendar name. |
| parent_id | string or null Parent calendar whose holidays are also listed. |
{- "name": "Brazil",
- "parent_id": "c96r3a88u0k0b3e6hftg"
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "name": "Brazil",
- "parent_id": "c96r3a88u0k0b3e6hftg",
- "created_at": "2019-08-24T14:15:22Z",
- "changed_at": "2019-08-24T14:15:22Z"
}
}| calendarId required | string Example: c96r3a88u0k0b3e6hft0 Calendar ID. |
{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "name": "Brazil",
- "parent_id": "c96r3a88u0k0b3e6hftg",
- "created_at": "2019-08-24T14:15:22Z",
- "changed_at": "2019-08-24T14:15:22Z"
}
}| calendarId required | string Example: c96r3a88u0k0b3e6hft0 Calendar ID. |
| name required | string Calendar name. |
| parent_id | string or null Parent calendar whose holidays are also listed. |
{- "name": "Brazil",
- "parent_id": "c96r3a88u0k0b3e6hftg"
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "name": "Brazil",
- "parent_id": "c96r3a88u0k0b3e6hftg",
- "created_at": "2019-08-24T14:15:22Z",
- "changed_at": "2019-08-24T14:15:22Z"
}
}Includes holidays from the parent calendar when parent_id is set.
| calendarId required | string Example: c96r3a88u0k0b3e6hft0 Calendar ID. |
| year | integer Example: year=2026 Limit holidays to one calendar year. |
{- "data": [
- {
- "id": "c96r3a88u0k0b3e6hftg",
- "calendar_id": "c96r3a88u0k0b3e6hft0",
- "holiday_date": "2026-01-01",
- "description": "New Year",
- "created_at": "2019-08-24T14:15:22Z",
- "changed_at": "2019-08-24T14:15:22Z"
}
]
}holiday_date is required and must be unique on the calendar.
| calendarId required | string Example: c96r3a88u0k0b3e6hft0 Calendar ID. |
| holiday_date required | string <date> |
| description | string |
{- "holiday_date": "2019-08-24",
- "description": "string"
}{- "data": {
- "id": "c96r3a88u0k0b3e6hftg",
- "calendar_id": "c96r3a88u0k0b3e6hft0",
- "holiday_date": "2026-01-01",
- "description": "New Year",
- "created_at": "2019-08-24T14:15:22Z",
- "changed_at": "2019-08-24T14:15:22Z"
}
}| calendarId required | string Example: c96r3a88u0k0b3e6hft0 Calendar ID. |
| holidayId required | string Example: c96r3a88u0k0b3e6hftg Holiday ID. |
| holiday_date required | string <date> Holiday date. |
| description | string or null Holiday name. |
{- "holiday_date": "2026-01-01",
- "description": "New Year"
}{- "data": {
- "id": "c96r3a88u0k0b3e6hftg",
- "calendar_id": "c96r3a88u0k0b3e6hft0",
- "holiday_date": "2026-01-01",
- "description": "New Year",
- "created_at": "2019-08-24T14:15:22Z",
- "changed_at": "2019-08-24T14:15:22Z"
}
}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.
{- "data": [
- {
- "id": "c96r3a88u0k0b3e6hft0",
- "name": "ERP sync",
- "event_types": [
- "project.created"
], - "enabled": true,
- "secret": "string",
- "created_at": "2026-10-09 13:00:00",
- "updated_at": "2026-10-09 13:00:00"
}
], - "usage": { }
}The signing secret is returned only in this response.
| 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 |
{- "name": "ERP sync",
- "event_types": [
- "project.created"
], - "enabled": true,
- "secret": "string"
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "name": "ERP sync",
- "event_types": [
- "project.created"
], - "enabled": true,
- "secret": "string",
- "created_at": "2026-10-09 13:00:00",
- "updated_at": "2026-10-09 13:00:00"
}
}Send regenerate_secret as true to rotate the signing secret. The new secret is returned once.
| webhookSubscriptionId required | string Example: c96r3a88u0k0b3e6hft0 Webhook subscription ID |
| 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 |
| regenerate_secret | boolean |
{- "name": "ERP sync",
- "event_types": [
- "project.created"
], - "enabled": true,
- "secret": "string",
- "regenerate_secret": false
}{- "data": {
- "id": "c96r3a88u0k0b3e6hft0",
- "name": "ERP sync",
- "event_types": [
- "project.created"
], - "enabled": true,
- "secret": "string",
- "created_at": "2026-10-09 13:00:00",
- "updated_at": "2026-10-09 13:00:00"
}
}| 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. |
{- "data": [
- {
- "id": "string",
- "webhook_subscription_id": "string",
- "event_type": "project.created",
- "event_log_id": "string",
- "payload": { },
- "status": "delivered",
- "http_status": 200,
- "response_body": "string",
- "attempts": 1,
- "next_retry_at": "string",
- "last_error": "string",
- "created_at": "string",
- "updated_at": "string"
}
], - "has_next_page": true,
- "next_page_query_params": { },
- "totals": {
- "total_rows": 150
}
}