EmployeesGet timesheet approval status for days

Get timesheet approval status for days

Returns, for each requested day, where one employee's timesheet is in the approval flow.

For every date in dates returns one ApprovalTimesheetDayRead: the day's approval status (Empty, Open, PendingApproval, Approved, Rejected, PartiallyApproved), the hours registered, whether rejected time was resubmitted, and — for rejected days — the latest rejection comment and, with $expand=RejectedRegistrations, the rejected registrations. Days need not be consecutive.

Use it to:

  • Payroll export: before exporting a day's hours, check that every day of the pay period is Approved.
  • Reminder bot: find days still Open (not submitted) for an employee.

Not for:

  • A contiguous range — use GET /v1/approval/timesheets/get-status-by-period, which adds an aggregated period status.

Behaviour:

  • Idempotent.
  • Safe to retry.
  • Duplicates: A date sent twice is reported twice.
  • Changes are visible to the next read immediately.

Call first: GET /v1/user

Next: POST /v1/approval/timesheets/submit-dates, POST /v1/approval/timesheets/resubmit-rejected-time-registrations

See also: GET /v1/approval/timesheets/get-status-by-period, GET /v1/employee-projection/get-in-period

Not yet documented: examples (success); request → query params; response → empty result.

curl -X GET "https://app3.timelog.com/your-account/api/v1/approval/timesheets/get-status-by-dates?employeeUserId=123&dates=%5B%222024-12-25T10%3A00%3A00Z%22%5D&$expand=RejectedRegistrations&$page=25&$pagesize=25" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
{
  "Entities": [
    {
      "Properties": {
        "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
      },
      "Links": [
        {
          "Href": "example_string",
          "Rel": "example_string"
        }
      ],
      "Actions": [
        {}
      ]
    }
  ],
  "Links": [
    {
      "Href": "example_string",
      "Rel": "example_string"
    }
  ]
}
GET
/v1/approval/timesheets/get-status-by-dates
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
datesarray
Required

Days to report, one parameter per day: ?dates=2026-10-05&dates=2026-10-07. Returned in the order sent.

query
$expandstring

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

Options: RejectedRegistrations
query
$pageinteger

Does NOT page the response; applied to each Rejected day's RejectedRegistrations list.

query
$pagesizeinteger

As $page: page size of each 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.

datesarray
Required

Days to report, one parameter per day: ?dates=2026-10-05&dates=2026-10-07. Returned in the order sent.

$expandstring

Expansion of the per-day rejected registrations.

Allowed values:

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

Does NOT page the response; applied to each Rejected day's RejectedRegistrations list.

$pagesizeinteger

As $page: page size of each day's RejectedRegistrations list.

Responses

Entitiesarray

Omitted (not []) when the list is empty.

Linksarray