Authentication
All API requests require authentication using a Bearer token. See the API Authentication documentation for details.
All endpoints are scoped to a specific account and require appropriate permissions.
The Tracked Time Object
A tracked time object represents a time entry logged by a team member.
Attributes
Attribute | Type | Description |
id | integer | Unique identifier for the time entry. |
date | string | Date the time was logged (ISO 8601 format: YYYY-MM-DD). |
duration | integer | Duration in seconds. |
duration_hours | decimal | Duration in hours (computed from duration). |
note | string | null | Optional note describing the work performed. |
billable | boolean | Whether this time is billable to the client. |
time_type | string | Type of time entry: |
billing_status | string | Billing status: |
account_user_id | integer | ID of the team member who logged this time. |
account_user_name | string | Full name of the team member. |
task_id | integer | null | ID of the associated task (null for non-project time). |
task_name | string | null | Name of the task (null for non-project time). |
project_name | string | null | Name of the project (null for non-project time). |
project_procedure_id | integer | null | ID of the project procedure/phase. |
resource_type_id | integer | null | ID of the resource type (role/discipline). |
resource_type_name | string | null | Name of the resource type. |
leave_type_id | integer | null | ID of leave type (for leave entries only). |
leave_type_name | string | null | Name of leave type (for leave entries only). |
business_overhead_id | integer | null | ID of business overhead category (for overhead time). |
business_overhead_name | string | null | Name of business overhead category. |
time_credit_type_id | integer | null | ID of time credit type (for time in lieu/credits). |
time_credit_type_name | string | null | Name of time credit type. |
created_at | string | Timestamp when the entry was created (ISO 8601 format). |
updated_at | string | Timestamp when the entry was last updated (ISO 8601 format). |
Financial Attributes (requires view_project_metrics permission)
Attribute | Type | Description |
currency | string | Three-letter ISO currency code (e.g., "AUD", "USD"). |
billable_rate_cents | integer | Billable rate per hour in cents. |
billable_amount_cents | integer | Total billable amount for this entry in cents. |
invoice_duration | integer | null | Duration that has been invoiced in seconds. |
invoice_duration_hours | decimal | null | Duration that has been invoiced in hours. |
invoice_amount_cents | integer | Amount that has been invoiced in cents. |
unbillable_duration | integer | null | Duration marked as unbillable in seconds. |
unbillable_duration_hours | decimal | null | Duration marked as unbillable in hours. |
billed_duration | integer | Duration that has been billed in seconds. |
Resource Financial Attributes (requires resource_financials permission)
These fields contain sensitive salary/cost information and require special permission.
Attribute | Type | Description |
expense_rate_cents | integer | Cost rate (salary rate) per hour in cents. |
expense_amount_cents | integer | Total cost for this entry in cents. |
Example Object
{
"id": 12345,
"date": "2025-11-07",
"duration": 28800,
"duration_hours": 8.0,
"note": "Implemented user authentication API endpoints",
"billable": true,
"time_type": "standard",
"billing_status": "unbilled",
"account_user_id": 42,
"account_user_name": "John Doe",
"task_id": 789,
"task_name": "Backend Development",
"project_name": "Mobile App Project",
"project_procedure_id": 101,
"resource_type_id": 5,
"resource_type_name": "Senior Developer",
"leave_type_id": null,
"leave_type_name": null,
"business_overhead_id": null,
"business_overhead_name": null,
"time_credit_type_id": null,
"time_credit_type_name": null,
"created_at": "2025-11-07T09:30:00Z",
"updated_at": "2025-11-07T09:30:00Z",
"currency": "AUD",
"billable_rate_cents": 15000,
"billable_amount_cents": 120000,
"invoice_duration": null,
"invoice_duration_hours": null,
"invoice_amount_cents": 0,
"unbillable_duration": null,
"unbillable_duration_hours": null,
"billed_duration": 0
}List Project Tracked Times
Retrieve all time entries for tasks within a specific project.
Endpoint
GET /api/v1/projects/:project_id/tracked_times
Authentication
Required.
Permissions
Requires
api_readpermissionRequires permission to view the project (based on project visibility settings and team membership)
Financial data requires
view_project_metricspermissionResource cost data requires
resource_financialspermission
Path Parameters
Parameter | Type | Required | Description |
account_id | integer | Yes | The account ID. |
project_id | integer | Yes | The project ID. |
Query Parameters (Filters)
Parameter | Type | Description |
start_date | string | Filter to entries on or after this date (YYYY-MM-DD). |
end_date | string | Filter to entries on or before this date (YYYY-MM-DD). |
account_user_id | integer | Filter to entries by a specific team member. |
task_id | integer | Filter to entries for a specific task. |
project_procedure_id | integer | Filter to entries for a specific project procedure/phase. |
billing_status | string | Filter by billing status: |
time_type | string | Filter by time type: |
resource_type_id | integer | Filter to entries by resource type (role). |
page | integer | Page number for pagination (default: 1). |
items | integer | Items per page (default: 20). |
Example Request
curl "https://app.getdrum.com/api/v1/projects/42/tracked_times" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Example Request with Filters
curl "https://app.getdrum.com/api/v1/projects/42/tracked_times?start_date=2025-11-01&end_date=2025-11-07&billing_status=unbilled&account_user_id=42" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Response
Returns a paginated array of tracked time objects, ordered by date (descending), then created_at (descending).
{
"data": [
{
"id": 12345,
"date": "2025-11-07",
"duration": 28800,
"duration_hours": 8.0,
"note": "Implemented user authentication API endpoints",
"billable": true,
"time_type": "standard",
"billing_status": "unbilled",
"account_user_id": 42,
"account_user_name": "John Doe",
"task_id": 789,
"task_name": "Backend Development",
"project_name": "Mobile App Project",
"project_procedure_id": 101,
"resource_type_id": 5,
"resource_type_name": "Senior Developer",
"leave_type_id": null,
"created_at": "2025-11-07T09:30:00Z",
"updated_at": "2025-11-07T09:30:00Z",
"currency": "AUD",
"billable_rate_cents": 15000,
"billable_amount_cents": 120000,
"invoice_amount_cents": 0
}
],
"pagination": {
"page": 1,
"items": 20,
"count": 1,
"pages": 1,
"from": 1,
"to": 1,
"prev": null,
"next": null
}
}Retrieve a Tracked Time Entry
Get details for a specific time entry within a project.
Endpoint
GET /api/v1/projects/:project_id/tracked_times/:id
Authentication
Required.
Permissions
Same as list endpoint.
Path Parameters
Parameter | Type | Required | Description |
account_id | integer | Yes | The account ID. |
project_id | integer | Yes | The project ID. |
id | integer | Yes | The tracked time entry ID. |
Example Request
curl "https://app.getdrum.com/api/v1/projects/42/tracked_times/12345" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Response
Returns a single tracked time object.
{
"id": 12345,
"date": "2025-11-07",
"duration": 28800,
"duration_hours": 8.0,
"note": "Implemented user authentication API endpoints",
"billable": true,
"time_type": "standard",
"billing_status": "unbilled",
"account_user_id": 42,
"account_user_name": "John Doe",
"task_id": 789,
"task_name": "Backend Development",
"project_name": "Mobile App Project",
"resource_type_id": 5,
"resource_type_name": "Senior Developer",
"created_at": "2025-11-07T09:30:00Z",
"updated_at": "2025-11-07T09:30:00Z",
"currency": "AUD",
"billable_rate_cents": 15000,
"billable_amount_cents": 120000
}List Member Tracked Times
Retrieve all time entries for a specific team member across all projects they have access to.
Endpoint
GET /api/v1/members/:member_id/tracked_times
Authentication
Required.
Permissions
Requires
api_readpermissionUser must be:
Viewing their own time entries, OR
An admin user, OR
Have
manage_staff_timesheetspermission
Only returns time entries from projects the current user has access to
Path Parameters
Parameter | Type | Required | Description |
account_id | integer | Yes | The account ID. |
member_id | integer | Yes | The account user ID (team member ID). |
Query Parameters (Filters)
Parameter | Type | Description |
start_date | string | Filter to entries on or after this date (YYYY-MM-DD). |
end_date | string | Filter to entries on or before this date (YYYY-MM-DD). |
project_id | integer | Filter to entries for a specific project. |
task_id | integer | Filter to entries for a specific task. |
project_procedure_id | integer | Filter to entries for a specific project procedure. |
billing_status | string | Filter by billing status: |
time_type | string | Filter by time type. |
resource_type_id | integer | Filter by resource type. |
page | integer | Page number for pagination. |
items | integer | Items per page. |
Example Request
curl "https://app.getdrum.com/api/v1/members/42/tracked_times" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Example Request with Filters
curl "https://app.getdrum.com/api/v1/members/42/tracked_times?start_date=2025-11-01&end_date=2025-11-07&time_type=standard" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Response
Returns a paginated array of tracked time objects. Includes project time, leave, overhead, and other time types.
{
"data": [
{
"id": 12345,
"date": "2025-11-07",
"duration": 28800,
"duration_hours": 8.0,
"note": "Backend development work",
"billable": true,
"time_type": "standard",
"billing_status": "unbilled",
"account_user_id": 42,
"account_user_name": "John Doe",
"task_id": 789,
"task_name": "Backend Development",
"project_name": "Mobile App Project",
"resource_type_id": 5,
"resource_type_name": "Senior Developer",
"created_at": "2025-11-07T09:30:00Z",
"updated_at": "2025-11-07T09:30:00Z"
},
{
"id": 12346,
"date": "2025-11-06",
"duration": 28800,
"duration_hours": 8.0,
"note": null,
"billable": false,
"time_type": "vacation",
"billing_status": "unbilled",
"account_user_id": 42,
"account_user_name": "John Doe",
"task_id": null,
"task_name": null,
"project_name": null,
"leave_type_id": 5,
"leave_type_name": "Annual Leave",
"created_at": "2025-11-06T08:00:00Z",
"updated_at": "2025-11-06T08:00:00Z"
}
],
"pagination": {
"page": 1,
"items": 20,
"count": 2,
"pages": 1,
"from": 1,
"to": 2,
"prev": null,
"next": null
}
}Retrieve a Member's Tracked Time Entry
Get details for a specific time entry for a team member.
Endpoint
GET /api/v1/members/:member_id/tracked_times/:id
Authentication
Required.
Permissions
Same as list member tracked times.
Path Parameters
Parameter | Type | Required | Description |
account_id | integer | Yes | The account ID. |
member_id | integer | Yes | The account user ID. |
id | integer | Yes | The tracked time entry ID. |
Example Request
curl "https://app.drumhq.com/api/v1/members/42/tracked_times/12345" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Response
Returns a single tracked time object.
{
"id": 12345,
"date": "2025-11-07",
"duration": 28800,
"duration_hours": 8.0,
"note": "Implemented user authentication API endpoints",
"billable": true,
"time_type": "standard",
"billing_status": "unbilled",
"account_user_id": 42,
"account_user_name": "John Doe",
"task_id": 789,
"task_name": "Backend Development",
"project_name": "Mobile App Project",
"created_at": "2025-11-07T09:30:00Z",
"updated_at": "2025-11-07T09:30:00Z"
}Time Types
Time entries can have different types depending on what the time represents:
Type | Description |
standard | Regular work hours on tasks. |
overtime | Overtime work hours. |
vacation | Vacation/annual leave time. |
holiday | Public holiday time. |
sick | Sick leave time. |
other | Other types of time (training, overhead, etc.). |
Billing Status
Time entries track their billing status:
Status | Description |
unbilled | Time has not been invoiced yet. |
partial | Some of the time has been invoiced. |
billed | All of the time has been invoiced. |
Non-Project Time
Time entries don't always belong to projects. They can also represent:
Leave: Time off (vacation, sick leave, public holidays)
Business Overhead: Internal activities (meetings, admin, training)
Time Credits: Time in lieu or other time bank entries
For these entries:
task_id,task_name, andproject_namewill benullOne of
leave_type_id,business_overhead_id, ortime_credit_type_idwill be presentThe corresponding name field will contain the category name
Financial Data Visibility
Financial data in tracked time entries has multiple permission levels:
Public Data (always visible)
Duration, date, note
Task and project associations
Billable flag
Billing status
Project Metrics (view_project_metrics permission)
Billable rates and amounts
Invoice amounts and durations
Currency information
Resource Financials (resource_financials permission)
Expense rates (salary/cost rates)
Expense amounts
⚠️ Sensitive: Contains employee compensation information
Error Responses
Status Code | Description |
200 | Success - Request completed successfully. |
401 | Unauthorized - Invalid or missing authentication token. |
403 | Forbidden - Insufficient permissions to access project or member. |
404 | Not Found - Project, member, or tracked time entry not found. |
Notes
Duration Format
duration: Stored in seconds (e.g., 28800 = 8 hours)duration_hours: Computed field in decimal hours for convenience (e.g., 8.0)
Project Access Filtering
When listing member tracked times, results are automatically filtered to only projects the current user has access to. This ensures users can't view time entries for projects they don't have permission to see.
Team-Based Permissions
If a user doesn't have "all projects" permission, they may only see tracked times for:
Projects they're assigned to
Projects with team members they share a team with
Their own time entries (when viewing via member endpoint)
Pagination
Default pagination settings apply (20 items per page). Results are ordered by date (most recent first), then by creation time.
Monetary Values
All monetary amounts are in cents. To display as currency:
Divide by 100
Format according to the
currencyfieldExample:
billable_amount_cents: 120000= $1,200.00 AUD
