> ## Documentation Index
> Fetch the complete documentation index at: https://help.gorelo.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Lists logged time across every ticket and task, narrowed by any of the filters.

> One flat collection rather than a list per ticket, because time is pulled across tickets for
billing sync, reporting and dashboards. Pass `ticketIds` to get a single ticket's time.


Every filter is optional and combining two narrows to the entries that satisfy both. Each id
filter is a comma-separated list and an entry matches if its id is any of them; a value that
is not an id is rejected with 400. A well-formed value that matches nothing — a client id
that does not exist, a ticket with no logged time — is an empty page, not a 404. Timestamps
are UTC; each `...Since` bound includes the instant it names and each `...Before`
bound excludes it, so two windows sharing an edge tile instead of both returning the entry
on it.

`ActualHours` is the duration actually logged. `AdjustedHours` is the duration after
the work type's minimum and increment rounding, and is null when no rounding applied — in
that case the billed duration is simply `ActualHours`.


Each entry names what it was logged against: an entry hangs off either a ticket or a task, so
one of `Ticket` and `Task` carries the id, number and title, and the other is null.




## OpenAPI

````yaml /api-reference/openapi.json get /v1/time-entries
openapi: 3.0.4
info:
  title: Public API
  description: Gorelo Public API documentation.
  version: 1.0.0
servers:
  - url: https://api.usw.gorelo.io
    description: US
  - url: https://api.aue.gorelo.io
    description: Australia
security:
  - ApiKeyAuth: []
tags:
  - name: Attachments
    description: "Uploading a file, for anything that can carry one. One endpoint rather than one per record\r\ntype, because the upload itself is identical - only the record it is checked against differs."
  - name: Alerts
    description: Alerts management operations
  - name: Assets
    description: Assets management operations
  - name: Billing
    description: Billing management operations
  - name: Tickets
    description: Tickets management operations
  - name: Clients
    description: Clients management operations
  - name: Contacts
    description: Contacts management operations
  - name: Deletions
    description: Deletions management operations
  - name: Documents
    description: Documents management operations
  - name: Forms
    description: Forms management operations
  - name: Organization
    description: Organization management operations
  - name: Projects
    description: Projects management operations
paths:
  /v1/time-entries:
    get:
      tags:
        - Billing
        - Tickets
      summary: >-
        Lists logged time across every ticket and task, narrowed by any of the
        filters.
      description: "One flat collection rather than a list per ticket, because time is pulled across tickets for\r\nbilling sync, reporting and dashboards. Pass `ticketIds` to get a single ticket's time.\r\n\n\r\nEvery filter is optional and combining two narrows to the entries that satisfy both. Each id\r\nfilter is a comma-separated list and an entry matches if its id is any of them; a value that\r\nis not an id is rejected with 400. A well-formed value that matches nothing — a client id\r\nthat does not exist, a ticket with no logged time — is an empty page, not a 404. Timestamps\r\nare UTC; each `...Since` bound includes the instant it names and each `...Before`\r\nbound excludes it, so two windows sharing an edge tile instead of both returning the entry\r\non it.\r\n\n`ActualHours` is the duration actually logged. `AdjustedHours` is the duration after\r\nthe work type's minimum and increment rounding, and is null when no rounding applied — in\r\nthat case the billed duration is simply `ActualHours`.\r\n\n\r\nEach entry names what it was logged against: an entry hangs off either a ticket or a task, so\r\none of `Ticket` and `Task` carries the id, number and title, and the other is null.\r\n"
      operationId: get_v1_time-entries
      parameters:
        - name: Cursor
          in: query
          description: >-
            Opaque pagination cursor from a previous page; omit for the first
            page. Only valid against the same filters that produced it.
          schema:
            type: string
        - name: PageSize
          in: query
          description: >-
            Number of items per page, 1-200 (default 50). Out of range is
            rejected, not clamped.
          schema:
            type: integer
            format: int32
            default: 50
        - name: ClientIds
          in: query
          description: >-
            Comma-separated client ids; keeps only time entries billed to any of
            them.
          schema:
            type: string
        - name: LocationIds
          in: query
          description: >-
            Comma-separated client location ids; keeps only time entries whose
            ticket sits at any of them. Entries logged against a task have no
            location and are excluded.
          schema:
            type: string
        - name: TicketIds
          in: query
          description: >-
            Comma-separated ticket ids; keeps only time entries logged against
            any of them.
          schema:
            type: string
        - name: TaskIds
          in: query
          description: >-
            Comma-separated task ids; keeps only time entries logged against any
            of them.
          schema:
            type: string
        - name: UserIds
          in: query
          description: >-
            Comma-separated user ids; keeps only time entries belonging to any
            of them.
          schema:
            type: string
        - name: InvoiceIds
          in: query
          description: >-
            Comma-separated invoice ids; keeps only time entries billed on any
            of them.
          schema:
            type: string
        - name: StartedSince
          in: query
          description: >-
            ISO-8601 timestamp; keeps only time entries whose work started at or
            after it.
          schema:
            type: string
            format: date-time
        - name: StartedBefore
          in: query
          description: >-
            ISO-8601 timestamp; keeps only time entries whose work started
            strictly before it.
          schema:
            type: string
            format: date-time
        - name: CreatedSince
          in: query
          description: ISO-8601 timestamp; keeps only time entries created at or after it.
          schema:
            type: string
            format: date-time
        - name: CreatedBefore
          in: query
          description: >-
            ISO-8601 timestamp; keeps only time entries created strictly before
            it.
          schema:
            type: string
            format: date-time
        - name: UpdatedSince
          in: query
          description: >-
            ISO-8601 timestamp; keeps only time entries updated at or after it.
            An entry that has never been changed is excluded.
          schema:
            type: string
            format: date-time
        - name: UpdatedBefore
          in: query
          description: >-
            ISO-8601 timestamp; keeps only time entries updated strictly before
            it. An entry that has never been changed is excluded.
          schema:
            type: string
            format: date-time
      responses:
        '200':
          description: OK
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/TimeEntryModelListBaseResponse'
            application/json:
              schema:
                $ref: '#/components/schemas/TimeEntryModelListBaseResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/TimeEntryModelListBaseResponse'
        '400':
          description: Bad Request
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/ObjectBaseResponse'
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectBaseResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ObjectBaseResponse'
        '401':
          description: Unauthorized
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/ObjectBaseResponse'
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectBaseResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ObjectBaseResponse'
        '500':
          description: Internal Server Error
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/ObjectBaseResponse'
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectBaseResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ObjectBaseResponse'
components:
  schemas:
    TimeEntryModelListBaseResponse:
      type: object
      properties:
        StatusCode:
          $ref: '#/components/schemas/HttpStatusCode'
        IsSuccess:
          type: boolean
        Data:
          type: array
          items:
            $ref: '#/components/schemas/TimeEntryModel'
          nullable: true
        DataContext:
          $ref: '#/components/schemas/PaginationDataContext'
        Notifications:
          type: array
          items:
            $ref: '#/components/schemas/Error'
      additionalProperties: false
    ObjectBaseResponse:
      type: object
      properties:
        StatusCode:
          $ref: '#/components/schemas/HttpStatusCode'
        IsSuccess:
          type: boolean
        Data:
          nullable: true
        DataContext:
          $ref: '#/components/schemas/ErrorDataContext'
        Notifications:
          type: array
          items:
            $ref: '#/components/schemas/Error'
      additionalProperties: false
    HttpStatusCode:
      enum:
        - 100
        - 101
        - 102
        - 103
        - 200
        - 201
        - 202
        - 203
        - 204
        - 205
        - 206
        - 207
        - 208
        - 226
        - 300
        - 301
        - 302
        - 303
        - 304
        - 305
        - 306
        - 307
        - 308
        - 400
        - 401
        - 402
        - 403
        - 404
        - 405
        - 406
        - 407
        - 408
        - 409
        - 410
        - 411
        - 412
        - 413
        - 414
        - 415
        - 416
        - 417
        - 421
        - 422
        - 423
        - 424
        - 426
        - 428
        - 429
        - 431
        - 451
        - 500
        - 501
        - 502
        - 503
        - 504
        - 505
        - 506
        - 507
        - 508
        - 510
        - 511
      type: integer
      format: int32
    TimeEntryModel:
      type: object
      properties:
        Id:
          type: integer
          description: Identifier of the time entry.
          format: int64
          example: 88214
        Ticket:
          $ref: '#/components/schemas/NumberedReferenceModel'
        Task:
          $ref: '#/components/schemas/NumberedReferenceModel'
        User:
          $ref: '#/components/schemas/CodeModel'
        StartedOn:
          type: string
          description: When the work started, in UTC.
          format: date-time
          nullable: true
          example: '2026-04-28T09:00:00.0000000+00:00'
        EndedOn:
          type: string
          description: When the work finished, in UTC.
          format: date-time
          nullable: true
          example: '2026-04-28T10:30:00.0000000+00:00'
        ActualHours:
          type: number
          description: >-
            Duration actually logged, in decimal hours — simply the span between
            StartedOn and EndedOn.
          format: double
          nullable: true
          example: 1.5
        AdjustedHours:
          type: number
          description: "Billed duration, in decimal hours: the logged duration after the work type's minimum and\r\nincrement rounding.\r\n            \r\nWhen no rounding applied — the logged duration already met the minimum and landed on a\r\nwhole increment — this equals `ActualHours`, so it is always the figure the\r\nentry is billed at. Null only when the entry has no StartedOn and EndedOn to bill from."
          format: double
          nullable: true
          example: 1.75
        BillableStatus:
          $ref: '#/components/schemas/CodeModel'
        BillingRole:
          $ref: '#/components/schemas/CodeModel'
        WorkType:
          $ref: '#/components/schemas/CodeModel'
        ServiceLine:
          $ref: '#/components/schemas/CodeModel'
        Comment:
          type: string
          description: Free-text note describing the work.
          nullable: true
          example: Replaced faulty NIC
        Distance:
          type: number
          description: >-
            Distance travelled for this work, when the service provider bills
            mileage.
          format: double
          nullable: true
          example: 12.5
        Attachments:
          type: array
          items:
            $ref: '#/components/schemas/TimeEntryAttachment'
          description: Files attached to this entry.
        CreatedOn:
          type: string
          description: When the entry was created, in UTC.
          format: date-time
          nullable: true
        UpdatedOn:
          type: string
          description: >-
            When the entry was last changed, in UTC. Null if it has never been
            changed.
          format: date-time
          nullable: true
      additionalProperties: false
      description: Time logged against a ticket.
    PaginationDataContext:
      type: object
      properties:
        Pagination:
          $ref: '#/components/schemas/PaginatedResponse'
      additionalProperties: false
      description: "The `DataContext` of a cursor-paginated success response: carries the paging metadata\r\nfor the returned page."
    Error:
      type: object
      properties:
        Code:
          pattern: ^[0-9]{6}$
          type: string
          description: 6-digit MMTTNN error code. See the Public API error-code registry.
          example: '070101'
        Message:
          type: string
        PropertyName:
          type: string
          nullable: true
        ActionHint:
          type: string
          nullable: true
        DocUrl:
          type: string
          nullable: true
      additionalProperties: false
    ErrorDataContext:
      type: object
      properties:
        TraceId:
          type: string
          description: Request correlation id. Quote this when reporting a problem.
          nullable: true
      additionalProperties: false
      description: "The `DataContext` of an error response: carries the correlation id for the failed\r\nrequest."
    NumberedReferenceModel:
      type: object
      properties:
        Id:
          type: string
          description: Identifier of the referenced ticket or task.
          format: uuid
          example: e5fb2939-3bd7-4893-8b47-a287003d5b8a
        Number:
          type: string
          description: "Number as shown in the app, including any prefix. A string rather than an integer — task\r\nnumbers are not purely numeric."
          example: T-1042
        Title:
          type: string
          description: Title of the referenced ticket or task.
          example: Laptop will not boot after update
      additionalProperties: false
      description: "A pointer to the ticket or task a record hangs off: the id to fetch it by, plus the number and\r\ntitle a person recognises it by. Kept separate from PublicCodeModel because a ticket has both a\r\nnumber and a title, and neither one alone identifies it to a reader."
    CodeModel:
      type: object
      properties:
        Id:
          type: integer
          description: >-
            Numeric identifier of the coded value (e.g. status, priority, type,
            or source id).
          format: int64
          example: 1
        Name:
          type: string
          description: Display name of the coded value.
      additionalProperties: false
      description: >-
        A coded value, such as a status, priority, type or source, as an id and
        a display name.
    TimeEntryAttachment:
      type: object
      properties:
        Name:
          type: string
          description: File name as it should be displayed.
          example: switch-photo.jpg
        Url:
          type: string
          description: Location the file can be fetched from.
          example: https://files.example.com/switch-photo.jpg
      additionalProperties: false
      description: A file attached to a time entry. Same shape as comment attachments.
    PaginatedResponse:
      type: object
      properties:
        NextCursor:
          type: string
          nullable: true
        PreviousCursor:
          type: string
          nullable: true
        HasMore:
          type: boolean
        HasPrevious:
          type: boolean
        TotalCount:
          type: integer
          format: int32
      additionalProperties: false
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      description: >-
        Your Gorelo API key. See [Generate API key](/generate-api-key). If your
        data is hosted in Australia, click the base URL at the top of this page
        and select `https://api.aue.gorelo.io`.
      name: X-API-Key
      in: header

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.