List a member's timesheet entries
- Permissions
members:read,timesheets:read+ conditional- Pagination
- Cursor, up to 100 per page
- Also available as
fieldtask_list_timesheet_entries
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
| Permission | Dependency in the permission map |
|---|---|
members:read | No dependencies |
timesheets:read | Depends on members:read |
Some response fields need more:
| When | Additional permission | Including its dependencies |
|---|---|---|
To receive the job summary on each entry | jobs:read | jobs:read |
Without jobs:read, job is always null.
Request
Responses
- 200
- 400
- 401
- 403
- 404
- 405
- 422
- 429
- 503
OK
Response Headers
Responses must not be cached.
Server-generated request correlation ID.
Bad Request
Response Headers
Responses must not be cached.
Server-generated request correlation ID.
Unauthorized
Response Headers
Responses must not be cached.
Server-generated request correlation ID.
Forbidden
Response Headers
Responses must not be cached.
Server-generated request correlation ID.
Not Found
Response Headers
Responses must not be cached.
Server-generated request correlation ID.
Method Not Allowed
Response Headers
Responses must not be cached.
Server-generated request correlation ID.
Too many entries; narrow the date range
Response Headers
Responses must not be cached.
Server-generated request correlation ID.
Too Many Requests
Response Headers
Responses must not be cached.
Seconds before retry; present on 429 and an in-progress operation.
Server-generated request correlation ID.
Service Unavailable
Response Headers
Responses must not be cached.
Server-generated request correlation ID.
Query parameters
| Parameter | Required | What to send |
|---|---|---|
member_id | Yes | The member ID of an active member, from GET /public/v1/members. |
start_date | Yes | The first day to include, as YYYY-MM-DD. |
end_date | Yes | The last day to include, as YYYY-MM-DD. Both dates are included, and the range must be 1–31 days long. |
page_size | No | Entries per page, from 1 to 100. Defaults to 25. |
cursor | No | page.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_dateand starts before the end ofend_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_dateappears with its realstarts_at. - Entries are ordered by
starts_at, then byid. - Times are UTC with a
Zsuffix.
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
| Field | Meaning |
|---|---|
id | The timesheet entry's ID. |
member_id | The member's ID, the same as the member_id you sent. |
starts_at, ends_at | When the entry started and ended, in UTC. ends_at is always later than starts_at. |
job | The 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_moreistrue, requestpage.next_page_urlwith the sameAuthorizationheader. It keepsmember_id, both dates andpage_size. It'snullon the last page. - If you build URLs yourself, pass
page.next_cursorascursorand 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
| Status | code | Meaning | What to do |
|---|---|---|---|
| 400 | invalid_query | A 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. |
| 400 | invalid_cursor | The 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. |
| 401 | invalid_token | The 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 …. |
| 403 | api_access_not_enabled | FieldTask hasn't enabled API access for this organization, or has disabled it. | An owner or admin requests access in Settings → API connections. |
| 403 | insufficient_scope | The 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. |
| 404 | resource_not_found | member_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. |
| 405 | method_not_allowed | This 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. |
| 422 | report_too_large | The member has more than 5,000 entries in the date range. | Use a shorter date range. A smaller page_size doesn't help. |
| 429 | rate_limit_exceeded | Too many requests in the current minute, or too many concurrent requests, for the organization or connection. | Wait for Retry-After seconds, then retry. |
| 429 | daily_quota_exceeded | The 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. |
| 503 | temporarily_unavailable | FieldTask couldn't read the entries. No partial page is returned in its place. | Retry with exponential backoff, using the same URL. |