Skip to content

Create time entry

POST
/time-entries
curl --request POST \
--url https://app.buildworkpro.com/api/v1/time-entries \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "userId": 1, "projectId": 1, "taskId": 1, "phaseId": 1, "date": "example", "hours": 1, "notes": "example", "entryType": "example", "clockIn": "example", "clockOut": "example", "lat": 1, "lng": 1, "clockInAccuracyM": 1, "clockOutLat": 1, "clockOutLng": 1, "clockOutAccuracyM": 1, "isReviewed": true, "reviewedBy": 1, "reviewedAt": "example" }'
Idempotency-Key
string format: uuid
<= 255 characters

Idempotent retry key for mutating operations. The first request with a given key executes normally and BuildWorkPro caches the response. Replaying the same key with the same request body (method + path + JSON body, SHA-256 hashed) returns the cached response without re-executing the mutation. Replaying with a DIFFERENT body returns 409 idempotency_key_reused. The cache TTL is 24 hours; after expiry the key is treated as a new operation. Keys are tenant-scoped. Recommended: a fresh UUID v4 per logical operation.

Media type application/json
object
userId
required
integer
>= -2147483648 <= 2147483647
projectId
required
integer
>= -2147483648 <= 2147483647
taskId
integer | null
>= -2147483648 <= 2147483647
phaseId
integer | null
>= -2147483648 <= 2147483647
date
required
string | null
hours
required
number
>= 0.25 <= 24
notes
string | null
entryType
string
<= 20 characters
clockIn
string | null
clockOut
string | null
lat
number | null
>= -90 <= 90
lng
number | null
>= -180 <= 180
clockInAccuracyM
number | null
<= 100000
clockOutLat
number | null
>= -90 <= 90
clockOutLng
number | null
>= -180 <= 180
clockOutAccuracyM
number | null
<= 100000
isReviewed
boolean
reviewedBy
integer | null
>= -2147483648 <= 2147483647
reviewedAt
string | null
Example generated
{
"userId": 1,
"projectId": 1,
"taskId": 1,
"phaseId": 1,
"date": "example",
"hours": 1,
"notes": "example",
"entryType": "example",
"clockIn": "example",
"clockOut": "example",
"lat": 1,
"lng": 1,
"clockInAccuracyM": 1,
"clockOutLat": 1,
"clockOutLng": 1,
"clockOutAccuracyM": 1,
"isReviewed": true,
"reviewedBy": 1,
"reviewedAt": "example"
}

Created

Media type application/json
object
data
required
object
id
required
integer
projectId
required
integer
userId
required
integer
taskId
required
integer | null
phaseId
required
integer | null
date
required
Any of:
string format: date-time
hours
required
string
hourlyRate
required
string | null
totalCost
required
string | null
description
required
string | null
lat
required
number | null
lng
required
number | null
isReviewed
required
boolean
createdAt
required
Any of:
string format: date-time
updatedAt
required
Any of:
string format: date-time
meta
required
object
request_id

Server-generated request identifier

string
pagination
object
cursor
required

Opaque cursor for the next page; null when no more results

string | null
has_more
required

Whether more pages are available after this one

boolean
count
required

Items in this page

integer
Example generated
{
"data": {
"id": 1,
"projectId": 1,
"userId": 1,
"taskId": 1,
"phaseId": 1,
"date": "2026-04-15T12:00:00Z",
"hours": "example",
"hourlyRate": "example",
"totalCost": "example",
"description": "example",
"lat": 1,
"lng": 1,
"isReviewed": true,
"createdAt": "2026-04-15T12:00:00Z",
"updatedAt": "2026-04-15T12:00:00Z"
},
"meta": {
"request_id": "example",
"pagination": {
"cursor": "example",
"has_more": true,
"count": 1
}
}
}

Error

Media type application/problem+json
object
type
required

URL identifying the problem type

string format: uri
title
required

Short human-readable summary

string
status
required

HTTP status code

integer
detail

Human-readable explanation

string
request_id

Server-generated request identifier

string
errors

Validation error array (422 only)

Array<object>
object
field
required

Field path that failed validation

string
code
required

Validation error code

string
message
required

Human-readable validation message

string
Example generated
{
"type": "https://example.com",
"title": "example",
"status": 1,
"detail": "example",
"request_id": "example",
"errors": [
{
"field": "example",
"code": "example",
"message": "example"
}
]
}