---
title: "Create a manual time entry"
method: POST
path: "/time-entries"
tags: ["Time entries"]
---

# Create a manual time entry

`POST /time-entries`

## Request

- Base URL: `https://api.teamo360.com/api/v1`
- URL: `https://api.teamo360.com/api/v1/time-entries`
- Auth: HTTP bearer

The record is optional: omit recordId to log unlinked time the owner can link later. Send the deepest of recordId / activityId / activityDetailId and the server fills the parents (a detail under a different activity answers 400). Timing: durationMinutes, or startedAt and endedAt (the duration is derived), or all three (they must agree within a minute). isBillable defaults from the detail, activity, record and module when omitted. Admin principals may send userId to log for another member of the organization (audited). externalId (the source system id, e.g. clockify:<id>) is unique per organization: a taken one answers 409 DUPLICATE_EXTERNAL_ID with the existing entry id in details.id. moduleId is accepted and ignored.

Requires the `data:write` token scope.

## Request body

- object

## Response `200`

Success

## Other responses

- `400`: Malformed parameters or body
- `401`: Missing, invalid, expired, or legacy token
- `403`: Blocked by role, token scope, module grant, or org policy
- `404`: Entity missing or outside the principal’s access
- `429`: Rate limit exceeded - see Retry-After

---

[API](https://skmtc.dev/teamo360/apis/teamo-public-api.md) · [All operations](https://skmtc.dev/teamo360/apis/teamo-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/teamo360/apis/teamo-public-api/revisions/32528ecbc4f4?raw)
