> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.coperniq.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.coperniq.io/_mcp/server.

## Timesheets

### New: Timesheet (time entry) endpoints

Create, read, update, and delete timesheets — time entries logged by a worker against a project, account, or opportunity (and optionally a work order).

| Method   | Path                         | Description                                      |
| -------- | ---------------------------- | ------------------------------------------------ |
| `GET`    | `/timesheets`                | List timesheets (pagination, filtering, sorting) |
| `POST`   | `/timesheets`                | Create a timesheet                               |
| `GET`    | `/timesheets/{timesheet_id}` | Get a timesheet by ID                            |
| `PATCH`  | `/timesheets/{timesheet_id}` | Update a timesheet, or archive/unarchive it      |
| `DELETE` | `/timesheets/{timesheet_id}` | Delete a timesheet                               |

#### Notes

* `POST` requires exactly one of `projectId`, `accountId`, or `opportunityId`; `PATCH` accepts at most one of the three to reassign the timesheet. Responses key the parent id under whichever field matches the record's actual type — only one of `projectId` / `accountId` / `opportunityId` is ever non-null.
* List filters: `user_id`, `project_id` / `account_id` / `opportunity_id` (aliases for the same filter), `work_order_id`, `type` (`WORKING` or `TRAVEL`), `status`, `start_date` / `end_date` (the entry's own time range), `updated_after` / `updated_before`, and `include_archived`.
* Set `isArchived` to `true`/`false` on `PATCH` to archive/unarchive a timesheet; this is applied independently of any other fields in the same request. Archived timesheets are excluded from `GET` unless `include_archived=true` is passed.