Time entries
List, retrieve, create, update and delete time entries.
A time entry records tracked time, optionally linked to a client and project.
The time entry object
{
"object": "time_entry",
"id": "te_123",
"workspace_id": "ws_123",
"user_id": "usr_123",
"client_id": "cl_123",
"project_id": "pr_123",
"description": "Design review",
"category": "MEETING",
"billable": true,
"started_at": "2026-07-06T09:00:00.000Z",
"ended_at": "2026-07-06T10:00:00.000Z",
"duration_sec": 3600,
"notes": null,
"created_at": "2026-07-06T10:00:00.000Z",
"updated_at": "2026-07-06T10:00:00.000Z"
}category is one of DESIGN, DEVELOPMENT, MEETING, ADMIN, RESEARCH,
OTHER. An entry with a null ended_at is a running timer.
List time entries
GET /api/v1/time-entries — scope time_entries:read
| Query param | Description |
|---|---|
limit, cursor | Pagination. |
client_id, project_id, user_id | Filters. |
start, end | ISO 8601 bounds on started_at. |
curl "https://app.militime.ai/api/v1/time-entries?project_id=pr_123&start=2026-07-01T00:00:00Z" \
-H "Authorization: Bearer mt_live_your_token"Retrieve a time entry
GET /api/v1/time-entries/{id} — scope time_entries:read
Create a time entry
POST /api/v1/time-entries — scope time_entries:write
| Field | Required | Notes |
|---|---|---|
started_at | yes | ISO 8601. |
ended_at | no | ISO 8601. Include for a completed entry; must be after started_at. |
description | no | Up to 280 chars. |
category | no | Defaults to OTHER. |
billable | no | Defaults to true. |
client_id, project_id | no | |
notes | no | Up to 2000 chars. |
user_id | no | Attribute to this member; defaults to the key's creator. Must be a member of the organization. |
curl -X POST https://app.militime.ai/api/v1/time-entries \
-H "Authorization: Bearer mt_live_your_token" \
-H "Content-Type: application/json" \
-d '{
"started_at": "2026-07-06T09:00:00Z",
"ended_at": "2026-07-06T10:00:00Z",
"description": "Design review",
"category": "MEETING",
"client_id": "cl_123",
"project_id": "pr_123"
}'Responds 201 with the created entry.
If you omit both user_id and the key has no creator on record, the request
fails with invalid_request. Pass an explicit user_id for service tokens.
Update a time entry
PATCH /api/v1/time-entries/{id} — scope time_entries:write
Delete a time entry
DELETE /api/v1/time-entries/{id} — scope time_entries:write
curl -X DELETE https://app.militime.ai/api/v1/time-entries/te_123 \
-H "Authorization: Bearer mt_live_your_token"{ "object": "time_entry", "id": "te_123", "deleted": true }