EmployeesGet timesheet approval status for an ISO week

Get timesheet approval status for an ISO week

Returns the approval status of the seven days of one ISO week of an employee's timesheet.

Turns year + week into the ISO 8601 week (Monday to Sunday) and returns the same ApprovalTimesheetPeriodRead as get-status-by-period for that range. Week numbers outside 1..52/53 are not rejected: they are counted on from week 1 of year (week 0 = the last week of the previous year, week 53 in a 52-week year = week 1 of the next).

Use it to:

  • Weekly timesheet UI or bot: 'is week 41 submitted and approved?'

Not for:

  • Several weeks at once — use GET /v1/approval/timesheets/get-status-range-by-nearby-week-of-year.

Behaviour:

  • Idempotent.
  • Safe to retry.
  • Changes are visible to the next read immediately.

Call first: GET /v1/user

Next: POST /v1/approval/timesheets/submit-period

See also: GET /v1/approval/timesheets/get-status-by-period, GET /v1/approval/timesheets/get-status-range-by-nearby-week-of-year

Not yet documented: examples (success); request → query params → description.

curl -X GET "https://app3.timelog.com/your-account/api/v1/approval/timesheets/get-status-by-week-of-year?employeeUserId=123&year=42&week=42&$expand=RejectedRegistrations&$page=25&$pagesize=25" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
{
  "Properties": {
    "WeekDays": [
      {
        "ApprovalStatus": "Empty",
        "Hours": 3.14,
        "Date": "2024-12-25T10:00:00Z",
        "LastRejectedComment": "null",
        "RecentRejectedComment": {
          "ManagerName": "null",
          "ManagerComment": "example_string"
        },
        "RejectedRegistrations": [
          {
            "CustomerID": "null",
            "CustomerName": "John Doe",
            "CustomerNo": "example_string",
            "ProjectID": "null",
            "ProjectName": "John Doe",
            "ProjectNo": "example_string",
            "TaskID": "null",
            "TaskName": "John Doe",
            "TaskFullName": "John Doe",
            "IsFixedPrice": "null",
            "TaskNo": "example_string",
            "TaskIsActive": "null",
            "AbsenceCodeID": "null",
            "AbsenceName": "John Doe",
            "AbsenceCode": "example_string",
            "AbsenceIsActive": "null",
            "AdditionalTextIsRequired": true,
            "DefaultBillable": true,
            "IsETCProject": true,
            "ShowBillable": true,
            "AllocatedHour": "null",
            "TimeRegistrationID": 123,
            "EntityID": 123,
            "EntityType": 42,
            "UserID": 123,
            "Created": "2024-12-25T10:00:00Z",
            "CreatedBy": 42,
            "LastModified": "2024-12-25T10:00:00Z",
            "LastModifiedBy": 42,
            "IsBillable": true,
            "Status": true,
            "Date": "2024-12-25T10:00:00Z",
            "MonthlyPeriod": "example_string",
            "Comment": "example_string",
            "Hours": 3.14,
            "AdditionalTextField": "example_string",
            "InvoiceStatus": true,
            "TimeRegistrationApprovalStatus": 42,
            "TimeTrackingFormat": 42,
            "Minutes": 42,
            "BillableHours": 3.14,
            "BillableMinutes": 42,
            "IsFavourite": true,
            "StartTime": "null",
            "EndTime": "null",
            "IsTimestampOverlapping": true
          }
        ],
        "HasResubmittedRejectedRegistration": true
      }
    ],
    "PeriodStatus": "Empty",
    "LastRejectedComment": "null",
    "RecentRejectedComment": {
      "ManagerName": "null",
      "ManagerComment": "example_string"
    }
  },
  "Links": [
    {
      "Href": "example_string",
      "Rel": "example_string"
    }
  ],
  "Actions": [
    {}
  ]
}
GET
/v1/approval/timesheets/get-status-by-week-of-year
GET
Base URLstring

Target server for requests. Edit to use your own host.

Bearer Token
Bearer Tokenstring
Required

OAuth 2.0 bearer token, sent as Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp). The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user. > Not yet documented: how to obtain a token. > Not yet documented: token lifetime.

OAuth 2.0 bearer token, sent as Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp). The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user. > Not yet documented: how to obtain a token. > Not yet documented: token lifetime.
query
employeeUserIdinteger
Required

User ID of the employee. Omitted -> 404 action-not-matched. Refers to UserRead.UserID. Look up valid values with GET /v1/user.

Format: int32
query
yearinteger
Required

ISO week-numbering year as a calendar year (1..9999; outside -> 500).

Format: int32
query
weekinteger
Required

ISO week number. Not range-checked: values outside the year's weeks roll into the neighbouring year.

Format: int32
query
$expandstring

Expansion of the per-day rejected registrations. Allowed values: | Value | Name | Meaning | |---|---|---| | RejectedRegistrations | RejectedRegistrations | Fill RejectedRegistrations on each Rejected day (case-insensitive; other values ignored). |

Options: RejectedRegistrations
query
$pageinteger

Applied to each Rejected day's RejectedRegistrations list.

query
$pagesizeinteger

Page size of each Rejected day's RejectedRegistrations list.

Request Preview
Response

Response will appear here after sending the request

Authentication

header
Authorizationstring
Required

Bearer token. OAuth 2.0 bearer token, sent as Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp).

The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user.

Not yet documented: how to obtain a token.

Not yet documented: token lifetime.

Query Parameters

employeeUserIdinteger
Required

User ID of the employee. Omitted -> 404 action-not-matched.

Refers to UserRead.UserID. Look up valid values with GET /v1/user.

yearinteger
Required

ISO week-numbering year as a calendar year (1..9999; outside -> 500).

weekinteger
Required

ISO week number. Not range-checked: values outside the year's weeks roll into the neighbouring year.

$expandstring

Expansion of the per-day rejected registrations.

Allowed values:

ValueNameMeaning
RejectedRegistrationsRejectedRegistrationsFill RejectedRegistrations on each Rejected day (case-insensitive; other values ignored).
Allowed values:RejectedRegistrations
$pageinteger

Applied to each Rejected day's RejectedRegistrations list.

$pagesizeinteger

Page size of each Rejected day's RejectedRegistrations list.

Responses

Propertiesobject

The approval state of a run of consecutive days of one employee's timesheet (a period or an ISO week): every day's status in WeekDays plus one aggregated PeriodStatus. No ID: identified by (employee, first day, last day).

Linksarray
Actionsobject[]