---
title: "Create a timesheet"
method: POST
path: "/timesheets"
tags: ["Timesheets"]
---

# Create a timesheet

`POST /timesheets`

## Request

- Base URL: `https://www.ruddr.io/api/workspace`
- URL: `https://www.ruddr.io/api/workspace/timesheets`
- Auth: HTTP bearer

Creates a timesheet for a member. All time entries within the specified date range are associated with the timesheet and submitted for approval.

The `start` and `end` must fall within the same ISO week (Monday through Sunday). In the simplest case, `start` is Monday and `end` is Sunday of the same week.

### Split weeks

When a workspace has split-week timesheets enabled (at month boundaries or semi-month boundaries), the timesheet period may be shorter than a full week. In these cases, `start` and `end` must match one of the valid split boundaries:

- **Month-end split**: If the workspace splits timesheets at the end of the month and a week crosses a month boundary, valid periods are Monday through the last day of the month, or the first day of the new month through Sunday.
- **Semi-month split**: If the workspace splits timesheets at the 15th of the month and a week crosses the 15th, valid periods are Monday through the 15th, or the 16th through Sunday.

If the provided dates do not match a valid period, the API returns a `400` error listing the accepted start and end dates.

### Timesheet attestation

A timesheet attestation requires a signature at the time of submission, and the API does not accept one. A timesheet for a member who is assigned a timesheet attestation must be submitted in the Ruddr app, and a request to submit one through the API returns a `400` error.

## Request body

- object
  - `memberId` string, required: The unique identifier of the member to create the timesheet for.
  - `start` string, date, required: The start date of the timesheet period. Must be in the form `YYYY-MM-DD`.
  - `end` string, date, required: The end date of the timesheet period. Must be on or after `start` and within the same ISO week. Must be in the form `YYYY-MM-DD`.

## Response `200`

200

- Timesheet
  - `id` string: The unique identifier for the object.
  - `start` string, date: The start date of the timesheet period. Will be in the form YYYY-MM-DD.
  - `end` string, date: The end date of the timesheet period. Will be in the form YYYY-MM-DD.
  - `createdAt` string, date-time: The timestamp when the object was created.
  - `submittedOn` string, date-time: The timestamp when the timesheet was submitted.
  - `hours` number: The total number of hours tracked in this timesheet period.
  - `attestationText` string, nullable: The statement the member attested to when the timesheet was submitted. `null` when no attestation was captured.
  - `attestationSignature` string, nullable: The signature the member provided when attesting to the timesheet. `null` when no attestation was captured.
  - `member` object: The member this timesheet was submitted for.
    - `id` string: The unique identifier for the object.
    - `name` string: The name of the member.
  - `timeEntries` object[]: The time entries included in this timesheet.
    - `id` string: The unique identifier for the object.
    - `minutes` integer: The duration of the time entry in minutes.
  - `submittedByMember` object, nullable: The member who submitted the timesheet. This is the timesheet's own `member` when they submitted it themselves, and a different member when someone submitted on their behalf. `null` when the timesheet was submitted through the API, submitted automatically on a schedule, or submitted before this field was introduced.
    - `id` string: The unique identifier for the object.
    - `name` string: The name of the member.
  - `attested` boolean: Whether the timesheet was attested. This is a calculated value based on whether an `attestationSignature` was captured.

## Other responses

- `400`: 400
- `403`: 403
- `409`: 409

---

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