---
title: "Update an entry's description, project or times"
method: PATCH
path: "/api/v1/entries/{entry}"
---

# Update an entry's description, project or times

`PATCH /api/v1/entries/{entry}`

## Request

- Base URL: `https://tallymeter.com`
- URL: `https://tallymeter.com/api/v1/entries/{entry}`
- Auth: HTTP bearer

Rewrites the description, project, start time and/or end time of one of your entries — running or finished. Made for the "timer started, described later" flow (no need to stop or restart anything) and for correcting times after the fact, e.g. a timer left running long after the work ended. Setting `ended_at` on a running entry finishes it at that moment instead of now. Entries already billed on an invoice are frozen and return 409. Requires the `entries:write` scope.

## Path parameters

- `entry` integer, required

## Request body

- object
  - `description` string: New description. Omit to keep the current one; cannot be cleared over the API.
  - `project_id` integer, nullable: New project id from GET /api/v1/projects; null detaches the entry from any project. Omit to keep the current project.
  - `started_at` string, date-time: New ISO-8601 start time (UTC unless an offset is given). Omit to keep the current start.
  - `ended_at` string, date-time: New ISO-8601 end time; on a running entry this finishes it at that moment. Must be after the start, and neither time may be in the future. Omit to leave the end as it is.

## Response `200`

Entry updated

- object
  - `updated` true, required
  - `entry` TimeEntry, required
    - `id` integer, required
    - `description` string, nullable, required
    - `project_id` integer, nullable, required
    - `project_name` string, nullable, required
    - `started_at` string, date-time, required: ISO-8601 UTC
    - `ended_at` string, date-time, nullable, required: ISO-8601 UTC; null while running
    - `duration_seconds` integer, required
    - `is_running` boolean, required
    - `source` 'web' | 'api' | 'mcp', required: Surface that created the entry
    - `agent` string, nullable, required: Name of the API token (= agent) that created the entry; null for web-created entries

## Other responses

- `401`: Missing or invalid token
- `403`: Token lacks the required scope, or the account has no active plan
- `404`: No entry with this id on the token's account
- `409`: Entry is already billed on an invoice — billed time is frozen and can only be edited in the web app
- `422`: Validation failed

---

[API](https://skmtc.dev/tallymeter/apis/tallymeter-api.md) · [All operations](https://skmtc.dev/tallymeter/apis/tallymeter-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tallymeter/apis/tallymeter-api/revisions/50044367b64e?raw)
