Rabbiit is a time tracking and project management software for teams and freelancers,
built to make time management simple, fast, and accurate.
The Rabbiit API is a RESTful web service that enables full integration with your workspace. It accepts form-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP methods, authentication, and status codes.
Supported HTTP methods: GET, POST, DELETE.
Base URL
www.rabbiit.com/api/v1
To be able to use Rabbiit API you must send your API Token via the HTTP header x-api-token.
API tokens are generated using a user's email and password.
API tokens carry all of a user's privileges and grant access to your account, so make sure you keep them safe and secret!
Don't share your API tokens in publicly accessible areas like GitHub, client-side code, and so on.
Each API token is valid only for the User Agent it was generated.
The call made by another User Agent will return status code 401 Unauthorized and will destroy this API token and will always be invalid for news rejection.
API Tokens without access for more than 30 days are automatically destroyed.
Read the API Tokens guide to see how generate and manage your API tokens.
The Rabbiit 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.
Rabbiit 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.
Authentication requests are limited separately to prevent brute-force attempts or token abuse.
Each user can perform up to 60 authentication requests per day, intended for generating new API tokens in through the /auth endpoint.
If this limit is exceeded, further authentication attempts return HTTP 429 Too Many Requests or, in some cases, HTTP 401 Unauthorized when the request is blocked due to excessive invalid or repeated authentication attempts.
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:
| Plan | Daily Limit |
|---|---|
| Free / Free Trial / Legacy plans | 50 requests per day |
| Plus | 1 000 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; |
| email required | string User email |
| password required | string Default: 0 User password |
| account_id required | string Default: 0 Hash Id of Rabbiit account. |
{- "email": "john@acme.inc",
- "password": 123456,
- "account_id": "124893893dd8"
}{- "account_id": "124893893dd8",
- "token": "FrxRtCwWut3PMp9Boj7FQ9ndyZYQggcIF8xtpByI0Fis6-KPOzB1Ownj0b"
}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" User id |
{- "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
}{- "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",
- "value_honorary_hour": 100,
- "value_honorary_total": 600
}Retrive a Time Entry by ID
| id required | integer Example: 25 Time Entry ID |
{- "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",
- "value_honorary_hour": 100,
- "value_honorary_total": 600
}| 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" User id |
{- "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
}{- "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",
- "value_honorary_hour": 100,
- "value_honorary_total": 600
}Start stopwatch on a existing time entry
| id required | integer Example: 25 Time Entry ID |
{- "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",
- "value_honorary_hour": 100,
- "value_honorary_total": 600
}Stop stopwatch of a time entry with active stopwatch
| id required | integer Example: 25 Time Entry ID |
{- "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",
- "value_honorary_hour": 100,
- "value_honorary_total": 600
}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) |
| opt_page_limit | integer [ 1 .. 100 ] Default: 50 The numbers of items to return |
{- "data": [
- {
- "id": 7,
- "active": 1,
- "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",
- "privacy": 7,
- "privacy_s": "private",
- "rate": 110.3,
- "rate_start_at": "2023-01-31",
- "required_task": 0,
- "status": "active",
- "template": false,
- "time_total": 120,
- "total_uninvoiced": 120,
- "total_active_tasks": 120,
- "total_invoiced": 120,
- "total_members": 120,
- "value_total": 120
}
], - "has_next_page": true,
- "next_page_query_params": { },
- "totals": {
- "total_rows": 150
}
}New Project
| active | integer Default: 1 Enum: 0 1 Item is active ("1" is true and "0" is false) |
| billable | integer Deprecated Should be used the new property |
| bill_by | string Deprecated It's not necessary anymore. |
| budget | integer Budget value |
| budget_by | string Enum: "billing" "time" Budget type |
| contractor_id | integer (Deprecated) Will be removed on future and can be replaced by a custom field |
| 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 |
| 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 |
{- "active": 1,
- "billable": 0,
- "bill_by": "string",
- "budget": 160,
- "budget_by": "time",
- "contractor_id": 0,
- "customer_id": 7,
- "description": "Activities regarding API development (dev, testing, documentation, rollout, etc)",
- "is_billable": true,
- "name": "API development",
- "privacy": 7,
- "rate": 110.3,
- "rate_start_at_new": "2023-01-02",
- "required_task": 0,
- "template": false
}{- "id": 7,
- "active": 1,
- "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",
- "privacy": 7,
- "privacy_s": "private",
- "rate": 110.3,
- "rate_start_at": "2023-01-31",
- "required_task": 0,
- "status": "active",
- "template": false,
- "time_total": 120,
- "total_uninvoiced": 120,
- "total_active_tasks": 120,
- "total_invoiced": 120,
- "total_members": 120,
- "value_total": 120
}Retrive a Project by ID
| id required | integer Example: 57 Project ID |
{- "id": 7,
- "active": 1,
- "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",
- "privacy": 7,
- "privacy_s": "private",
- "rate": 110.3,
- "rate_start_at": "2023-01-31",
- "required_task": 0,
- "status": "active",
- "template": false,
- "time_total": 120,
- "total_uninvoiced": 120,
- "total_active_tasks": 120,
- "total_invoiced": 120,
- "total_members": 120,
- "value_total": 120
}| id required | integer Example: 57 Project ID |
| active | integer Default: 1 Enum: 0 1 Item is active ("1" is true and "0" is false) |
| billable | integer Deprecated Should be used the new property |
| bill_by | string Deprecated It's not necessary anymore. |
| budget | integer Budget value |
| budget_by | string Enum: "billing" "time" Budget type |
| contractor_id | integer (Deprecated) Will be removed on future and can be replaced by a custom field |
| 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 |
| 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 |
{- "active": 1,
- "billable": 0,
- "bill_by": "string",
- "budget": 160,
- "budget_by": "time",
- "contractor_id": 0,
- "customer_id": 7,
- "description": "Activities regarding API development (dev, testing, documentation, rollout, etc)",
- "is_billable": true,
- "name": "API development",
- "privacy": 7,
- "rate": 110.3,
- "rate_start_at_new": "2023-01-02",
- "required_task": 0,
- "template": false
}{- "id": 7,
- "active": 1,
- "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",
- "privacy": 7,
- "privacy_s": "private",
- "rate": 110.3,
- "rate_start_at": "2023-01-31",
- "required_task": 0,
- "status": "active",
- "template": false,
- "time_total": 120,
- "total_uninvoiced": 120,
- "total_active_tasks": 120,
- "total_invoiced": 120,
- "total_members": 120,
- "value_total": 120
}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,
- "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. |
| rate_start_at_new | string Default: null Start date for new rate. |
{- "manager": 1,
- "is_billable": true,
- "rate": 110.3,
- "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,
- "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@rabbiit.com",
- "teams": [
- {
- "name": "Sales",
- "id": 11
}
]
}
]
}Retrieve list of project members
| id required | integer Example: 57 Project 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,
- "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 |
{- "is_billable": true
}{- "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,
- "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,
- "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,
- "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,
- "date_created": "2022-01-01 12:33:00",
- "date_changed": "2022-01-03 10:01:00"
}
]
}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 |
| 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"
}
], - "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 |
{- "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
}{- "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"
}Retrive a To-do by ID
| id required | integer Example: 25 To-do ID |
{- "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"
}| 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 |
{- "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
}{- "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"
}To-do Lists are the activities list on projects
| id required | integer Example: 57 Project ID |
{- "data": [
- {
- "id": "c96r3a88u0k0b3e6hft0",
- "changed_at": "2022-01-03 10:01:00",
- "changed_by": 5,
- "created_at": "2022-01-01 12:33:00",
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "name": "Ideas",
- "position": 3,
- "project_id": 2,
- "project_name": "Processo ISO",
- "project_status": 1
}
]
}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 |
| position | integer Default: 1 To-do list position at project to ordering. Must be a integer greater than 0 |
{- "project_id": 2,
- "name": "Ideas",
- "position": 3
}{- "id": "c96r3a88u0k0b3e6hft0",
- "changed_at": "2022-01-03 10:01:00",
- "changed_by": 5,
- "created_at": "2022-01-01 12:33:00",
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "name": "Ideas",
- "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 |
{- "id": "c96r3a88u0k0b3e6hft0",
- "changed_at": "2022-01-03 10:01:00",
- "changed_by": 5,
- "created_at": "2022-01-01 12:33:00",
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "name": "Ideas",
- "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 |
| position | integer Default: 1 To-do list position at project to ordering. Must be a integer greater than 0 |
{- "name": "Ideas",
- "position": 3
}{- "id": "c96r3a88u0k0b3e6hft0",
- "changed_at": "2022-01-03 10:01:00",
- "changed_by": 5,
- "created_at": "2022-01-01 12:33:00",
- "created_by": 5,
- "created_by_user_name": "Dyorg",
- "name": "Ideas",
- "position": 3,
- "project_id": 2,
- "project_name": "Processo ISO",
- "project_status": 1
}List Customer
| 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",
- "observation": "Description...",
- "active": 1,
- "date_created": "2022-01-01 12:33:00",
- "date_changed": "2022-01-03 10:01:00"
}
]
}New Customer
| name required | string Customer name |
| observation | string Default: null Customer description |
| active | integer Default: 1 Enum: 0 1 Item is active ("1" is true and "0" is false) |
{- "name": "ACME",
- "observation": "Description...",
- "active": 1
}{- "id": 1,
- "name": "ACME",
- "observation": "Description...",
- "active": 1,
- "date_created": "2022-01-01 12:33:00",
- "date_changed": "2022-01-03 10:01:00"
}Retrive a Customer by ID
| id required | integer Example: 25 Customer ID |
{- "id": 1,
- "name": "ACME",
- "observation": "Description...",
- "active": 1,
- "date_created": "2022-01-01 12:33:00",
- "date_changed": "2022-01-03 10:01:00"
}| id required | integer Example: 25 Customer ID |
| name required | string Customer name |
| observation | string Default: null Customer description |
| active | integer Default: 1 Enum: 0 1 Item is active ("1" is true and "0" is false) |
{- "name": "ACME",
- "observation": "Description...",
- "active": 1
}{- "id": 1,
- "name": "ACME",
- "observation": "Description...",
- "active": 1,
- "date_created": "2022-01-01 12:33:00",
- "date_changed": "2022-01-03 10:01:00"
}New Task
| name | string Task name |
| description | string Default: null Task description |
{- "name": "ACME",
- "description": "Description..."
}{- "id": 1,
- "name": "ACME",
- "description": "Description...",
- "is_billable_default": true,
- "date_created": "2022-01-01 12:33:00",
- "date_changed": "2022-01-03 10:01:00"
}Retrive a Task by ID
| id required | integer Example: 25 Task ID |
{- "id": 1,
- "name": "ACME",
- "description": "Description...",
- "is_billable_default": true,
- "date_created": "2022-01-01 12:33:00",
- "date_changed": "2022-01-03 10:01:00"
}| id required | integer Example: 25 Task ID |
| name | string Task name |
| description | string Default: null Task description |
{- "name": "ACME",
- "description": "Description..."
}{- "id": 1,
- "name": "ACME",
- "description": "Description...",
- "is_billable_default": true,
- "date_created": "2022-01-01 12:33:00",
- "date_changed": "2022-01-03 10:01:00"
}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": [ ],
- "billable_rate_default": null,
- "capacity_per_day": 8,
- "cost_rate": "65",
- "cost_rate_start_at": null,
- "count_employees": 5,
- "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,
- "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,
- "role": "admin",
- "status": "active",
- "teams": [
- {
- "id": 1,
- "name": "Projects"
}
], - "work_days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "work_end_at": null,
- "work_start_at": null
}
]
}New User
| email required | string User email |
| active | integer Activity status of the user |
| assigned_team_ids | Array of integers IDs of teams assigned to the user. Only applied for |
| billable_rate_default | number <double> Default billable rate of the user |
| capacity_per_day | integer User's work capacity per day, in hours |
| cost_rate | string Latest cost rate of the user |
| cost_rate_start_at | string <datetime> Start date of the latest cost rate |
| is_billable_default | boolean Indicates if the time is billable by default |
| manager_id | integer Manager ID. References the User object who is the manager of this user |
| manage_restricted_teams | boolean Indicates if the user can manage restricted teams. Only applied for |
| name required | string Name of the user |
| role | string Enum: "admin" "regular" "super" "manager" Privilege role of the user |
| work_days | Array of integers User's work days, represented as numbers from 0 to 6. 0 is sunday and 6 is saturday. |
| 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@rabbiit.com",
- "active": 1,
- "assigned_team_ids": [ ],
- "billable_rate_default": null,
- "capacity_per_day": 8,
- "cost_rate": "65",
- "cost_rate_start_at": null,
- "is_billable_default": true,
- "manager_id": null,
- "manage_restricted_teams": false,
- "name": "Anna Santos",
- "role": "admin",
- "work_days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "work_end_at": null,
- "work_start_at": null
}{- "active": 1,
- "assigned_team_ids": [ ],
- "billable_rate_default": null,
- "capacity_per_day": 8,
- "cost_rate": "65",
- "cost_rate_start_at": null,
- "count_employees": 5,
- "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,
- "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,
- "role": "admin",
- "status": "active",
- "teams": [
- {
- "id": 1,
- "name": "Projects"
}
], - "work_days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "work_end_at": null,
- "work_start_at": null
}Retrive a user by ID
| id required | integer Example: 5 User ID |
{- "active": 1,
- "assigned_team_ids": [ ],
- "billable_rate_default": null,
- "capacity_per_day": 8,
- "cost_rate": "65",
- "cost_rate_start_at": null,
- "count_employees": 5,
- "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,
- "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,
- "role": "admin",
- "status": "active",
- "teams": [
- {
- "id": 1,
- "name": "Projects"
}
], - "work_days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "work_end_at": null,
- "work_start_at": null
}| id required | integer Example: 5 User ID |
| active | integer Activity status of the user |
| assigned_team_ids | Array of integers IDs of teams assigned to the user. Only applied for |
| billable_rate_default | number <double> Default billable rate of the user |
| capacity_per_day | integer User's work capacity per day, in hours |
| cost_rate | string Latest cost rate of the user |
| cost_rate_start_at | string <datetime> Start date of the latest cost rate |
| is_billable_default | boolean Indicates if the time is billable by default |
| manager_id | integer Manager ID. References the User object who is the manager of this user |
| manage_restricted_teams | boolean Indicates if the user can manage restricted teams. Only applied for |
| name required | string Name of the user |
| role | string Enum: "admin" "regular" "super" "manager" Privilege role of the user |
| work_days | Array of integers User's work days, represented as numbers from 0 to 6. 0 is sunday and 6 is saturday. |
| 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,
- "assigned_team_ids": [ ],
- "billable_rate_default": null,
- "capacity_per_day": 8,
- "cost_rate": "65",
- "cost_rate_start_at": null,
- "is_billable_default": true,
- "manager_id": null,
- "manage_restricted_teams": false,
- "name": "Anna Santos",
- "role": "admin",
- "work_days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "work_end_at": null,
- "work_start_at": null
}{- "active": 1,
- "assigned_team_ids": [ ],
- "billable_rate_default": null,
- "capacity_per_day": 8,
- "cost_rate": "65",
- "cost_rate_start_at": null,
- "count_employees": 5,
- "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,
- "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,
- "role": "admin",
- "status": "active",
- "teams": [
- {
- "id": 1,
- "name": "Projects"
}
], - "work_days": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "work_end_at": null,
- "work_start_at": null
}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. |
| 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" 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_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": null,
- "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_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" Report template are used to retrieve group data, even it is empty. Keep this column empty to retrieve default. Use |
| 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
}
}
}