Skip to main content

List a member's timesheet entries

GEThttps://api.fieldtask.example/public/v1/timesheets/entries
Permissions
members:read, timesheets:read + conditional
Pagination
Cursor, up to 100 per page

Returns one member's individual timesheet entries for a date range of 1–31 days, one page at a time, ordered by start time.

Each entry has its start and end time and, where available, the job it was recorded against. Use it to show or reconcile what a member worked on. For worked hours per day and in total, use Get a member's timesheet totals instead.

Before you start​

  • Timesheet reads enabled by FieldTask. Where they aren't, this endpoint returns 404 resource_not_found.
  • The member's ID. Find it with GET /public/v1/members. It's a membership ID, not a user account ID. Only active members can be read.

Permissions​

PermissionDependency in the permission map
members:readNo dependencies
timesheets:readDepends on members:read

Some response fields need more:

WhenAdditional permissionIncluding its dependencies
To receive the job summary on each entryjobs:readjobs:read

Without jobs:read, job is always null.

Request​

Responses​

OK

Response Headers
    Cache-Control

    Responses must not be cached.

    X-Request-ID

    Server-generated request correlation ID.

Query parameters​

ParameterRequiredWhat to send
member_idYesThe member ID of an active member, from GET /public/v1/members.
start_dateYesThe first day to include, as YYYY-MM-DD.
end_dateYesThe last day to include, as YYYY-MM-DD. Both dates are included, and the range must be 1–31 days long.
page_sizeNoEntries per page, from 1 to 100. Defaults to 25.
cursorNopage.next_cursor from the previous page.

There's no ordering parameter and no other filter. Dates are calendar days in your organization's time zone, returned as range.timezone (UTC if the organization has none set). The date rules are the same as for timesheet totals.

Which entries are returned​

  • Every entry for the member that overlaps the range: it ends after the start of start_date and starts before the end of end_date, in the organization's time zone.
  • Entries keep their full stored start and end times. They aren't cut at the edges of the range, so an entry that began the evening before start_date appears with its real starts_at.
  • Entries are ordered by starts_at, then by id.
  • Times are UTC with a Z suffix.

Because entries aren't cut at the range edges, don't add them up to get worked hours for the range. Use timesheet totals for that.

What an entry includes​

FieldMeaning
idThe timesheet entry's ID.
member_idThe member's ID, the same as the member_id you sent.
starts_at, ends_atWhen the entry started and ended, in UTC. ends_at is always later than starts_at.
jobThe job's id and name, or null.

job is null when the entry isn't linked to a job, when the connection doesn't have jobs:read, when job details aren't published in your environment, or when the job is no longer available.

The response also has member, with the member's current display_name, and range, with the dates and time zone used.

Entries don't include approval status, pay rates or amounts, location tracking, idle time or edit history.

Pagination​

  • When page.has_more is true, request page.next_page_url with the same Authorization header. It keeps member_id, both dates and page_size. It's null on the last page.
  • If you build URLs yourself, pass page.next_cursor as cursor and keep every other parameter unchanged. A cursor only works with the same member, dates, page size and connection, and it expires within 24 hours.
  • Each page is read live. An entry added or changed while you page through may or may not appear.

Large ranges​

A range can contain at most 5,000 entries for the member. If it has more, every page of the request returns 422 report_too_large. A smaller page_size doesn't help, because the limit applies to the whole range. Split the range into shorter ones.

Errors​

StatuscodeMeaningWhat to do
400invalid_queryA required parameter is missing, a parameter is repeated or unknown (including ordering), a date isn't a valid YYYY-MM-DD date, end_date is before start_date, the range is longer than 31 days, or page_size is outside 1–100.Send member_id, start_date and end_date once each for a range of 1–31 days, and optionally page_size and cursor.
400invalid_cursorThe cursor is malformed, has expired, or was issued for a different member, date range, page size, connection or set of permissions.Use next_page_url or the cursor exactly as returned, with the same query. To change the query, start again without a cursor.
401invalid_tokenThe bearer token is missing, malformed, expired, revoked or issued for a different resource (for example an MCP sign-in).Send a current REST API token or REST OAuth access token as Authorization: Bearer ….
403api_access_not_enabledFieldTask hasn't enabled API access for this organization, or has disabled it.An owner or admin requests access in Settings → API connections.
403insufficient_scopeThe connection lacks timesheets:read or members:read. error.code is missing_permission.Add the permission named in error.message to the connection in Settings → API connections.
404resource_not_foundmember_id isn't the ID of an active member of your organization (for example a user account ID, or a removed member), or timesheet reads aren't enabled in this environment.Look the person up with GET /public/v1/members and use their id.
405method_not_allowedThis path doesn't accept the HTTP method, or the create isn't enabled in this environment. The Allow header lists the methods that are.Use a method listed in Allow.
422report_too_largeThe member has more than 5,000 entries in the date range.Use a shorter date range. A smaller page_size doesn't help.
429rate_limit_exceededToo many requests in the current minute, or too many concurrent requests, for the organization or connection.Wait for Retry-After seconds, then retry.
429daily_quota_exceededThe organization or connection has used its daily allowance for this kind of request. Allowances reset at 00:00 UTC.Wait for Retry-After seconds, or check remaining allowance in Settings → API connections.
503temporarily_unavailableFieldTask couldn't read the entries. No partial page is returned in its place.Retry with exponential backoff, using the same URL.