---
title: "List time entries"
method: GET
path: "/public-api/v1/time_entries"
tags: ["Time Entries"]
---

# List time entries

`GET /public-api/v1/time_entries`

## Request

- Base URL: `https://app.hellobonsai.com`
- URL: `https://app.hellobonsai.com/public-api/v1/time_entries`
- Auth: one of:
  - OAuth 2
    - Authorization code: `https://app.hellobonsai.com/oauth/authorize`
    - Token URL: `https://app.hellobonsai.com/oauth/token`
  - HTTP bearer

Lists logged time, newest first, a page at a time.

What comes back depends on the token: without permission to see the whole
team's time, you only get your own entries, and
`filter[owner_member_id]` cannot reach anyone else's.

The money fields — `rate`, `billable_amount`, `non_billable` and
`billing_status` — are left out entirely for a token that is not allowed
to see billing. Treat them as optional keys rather than assuming they
are always there. The same token cannot filter on
`filter[billing_status]` either: that would hand back the value the
field is hiding, so it returns `403` instead.

## Filtering

- `filter[date_from]` and `filter[date_to]` — a date range over the day
  the work was done. Both bounds are inclusive, and either works alone.
- `filter[owner_member_id]` — one or more team member ids, or `me` for
  whoever the token belongs to.
- `filter[project_id]` — one or more project ids.
- `filter[company_id]` — one or more client company ids, matched through
  each entry's project.
- `filter[billing_status]` — `billed`, `unbilled` or `non_billable`, or
  several at once. Needs permission to see billing.
- `filter[currency]` — one or more three-letter ISO 4217 currency codes.

## Query parameters

- `page[number]` integer
- `page[size]` integer
- `filter[date_from]` string, date
- `filter[date_to]` string, date
- `filter[owner_member_id]` string
- `filter[project_id]` string
- `filter[company_id]` string
- `filter[billing_status]` 'billed' | 'unbilled' | 'non_billable'
- `filter[currency]` string

## Response `200`

A page of time entries, newest first.

- object
  - `data` TimeEntry[], required
    - `key` string, required: Unique identifier for the time entry. This is the id the update endpoint takes in its path.
    - `seconds` integer, required: Duration of the entry in seconds.
    - `date` string, date, required: Date the work was done.
    - `notes` string, nullable, required: What the time was spent on, or `null`.
    - `rate` string, nullable: Hourly rate applied to the entry, as a decimal string in `currency`. `null` when no rate applies. Absent unless the token is allowed to see billing.
    - `non_billable` boolean: Whether the entry is excluded from billing. Absent unless the token is allowed to see billing.
    - `billable_amount` string: What the entry bills for, as a decimal string in `currency`. Absent unless the token is allowed to see billing.
    - `status` 'unbilled' | 'billed', required: Whether the entry has been placed on an invoice. `billing_status` is the fuller picture, and is what the list filter matches on.
    - `project_id` integer, nullable, required: Id of the project the time is logged against, or `null` when the entry is not attached to one.
    - `owner_member_id` integer, nullable, required: Team member id of whoever the time is logged for, or `null`.
    - `created_at` string, date-time, required: When the entry was logged.
    - `billing_status` 'non_billable' | 'unbilled' | 'billed': Effective billing state: `non_billable`, `unbilled` (billable, not on an invoice yet) or `billed` (on an invoice that has been sent, is overdue, is awaiting payment or has been paid, or marked billed by hand). Accepted by `filter[billing_status]` on the list endpoint, and writable as `billed` or `unbilled` on the update endpoint. Absent unless the token is allowed to see billing.
    - `currency` string, required: Three-letter ISO 4217 currency code for `rate` and `billable_amount`.
    - `formatted_time` string, required: `seconds` rendered as `HH:MM:SS`.
    - `task_uuid` string, nullable, required: `uuid` of the task the entry is linked to, or `null` when it is logged against a project only.
  - `meta` PaginatedMeta, required: Metadata returned alongside every list response.
    - `request_id` string, required: Identifier for this request. Quote it when contacting support about a specific call.
    - `pagination` Pagination, required: Where the returned page sits in the full result set.
      - `page` integer, required: The page that was returned.
      - `page_size` integer, required: How many records this page can hold.
      - `has_more` boolean, required: Whether at least one more page follows this one. Keep incrementing `page[number]` while this is `true`.

## Other responses

- `400`: A filter key is unknown, a filter value is not allowed, or a pagination parameter is not an integer.
- `401`: The access token is missing, expired or invalid.
- `403`: This token is not allowed to see logged time, or used `filter[billing_status]` without permission to see billing.
- `429`: Rate limit exceeded. Wait at least `Retry-After` seconds before trying again.

---

[API](https://skmtc.dev/hellobonsai/apis/bonsai-api.md) - [All operations](https://skmtc.dev/hellobonsai/apis/bonsai-api/llms.txt) - [OpenAPI document](https://skmtc.dev/hellobonsai/apis/bonsai-api/revisions/abf12ed6a8d3?raw)
