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

# Batch Read Time Logs

> Retrieves 1 or many **StopWatch Time Log** records by their ID(s).
<Note>
  See [HubSpot API documentation](https://developers.hubspot.com/docs/api-reference/crm-objects-v3/batch/post-crm-v3-objects-objectType-batch-read) for the request **Body** structure and available **Query Parameters**
</Note>




## OpenAPI

````yaml /apis/stopwatch-openapi.yaml post /stopwatch/v1/timelogs/batch/read
openapi: 3.0.3
info:
  title: StopWatch API
  description: >
    An authentication wrapper for read-only access to HubSpot App Object APIs. 

    This API allows programmatic access to StopWatch Time Log records,
    bypassing 

    standard HubSpot scope restrictions for App Objects.
  version: 1.0.0
servers:
  - url: https://api.threadi.au
    description: Production server
security:
  - bearerAuth: []
paths:
  /stopwatch/v1/timelogs/batch/read:
    post:
      summary: Batch Read Time Logs
      description: |
        Retrieves 1 or many **StopWatch Time Log** records by their ID(s).
        <Note>
          See [HubSpot API documentation](https://developers.hubspot.com/docs/api-reference/crm-objects-v3/batch/post-crm-v3-objects-objectType-batch-read) for the request **Body** structure and available **Query Parameters**
        </Note>
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchReadRequestBody'
      responses:
        '200':
          description: >-
            A list of StopWatch Time Log records where all requested records
            were found.
          content:
            application/json:
              schema:
                type: object
                properties:
                  completedAt:
                    type: string
                    format: date-time
                    example: '2026-03-25T06:01:32.819Z'
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/Timelog'
                  startedAt:
                    type: string
                    format: date-time
                    example: '2026-03-25T06:01:32.757Z'
                  status:
                    type: string
                    example: COMPLETE
        '207':
          $ref: '#/components/responses/MultiStatusResponse'
        '400':
          description: Invalid request body.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error400'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '429':
          $ref: '#/components/responses/TooManyRequestsError'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailableError'
components:
  schemas:
    BatchReadRequestBody:
      type: object
      required:
        - inputs
      properties:
        inputs:
          type: array
          items:
            $ref: '#/components/schemas/BatchReadInput'
        properties:
          type: array
          items:
            type: string
          description: >-
            The **StopWatch Time Log** properties that you'd like included in
            the response
          example:
            - a552213_record_id
            - hubspot_owner_id
            - a552213_category_text
        propertiesWithHistory:
          type: array
          items:
            type: string
          description: >-
            The **StopWatch Time Log** properties that you'd like included in
            the response, including a changelog history of their values
          example:
            - a552213_record_id
            - hubspot_owner_id
            - a552213_category_text
        idProperty:
          type: string
          example: a552213_record_id
          description: >-
            If omitted, defaults to `hs_object_id`. The only other property that
            can be used here for **StopWatch Time Logs** is `a552213_record_id`.
    Timelog:
      type: object
      properties:
        id:
          type: string
          example: 1234567890
        properties:
          type: object
          properties:
            a552213_record_id:
              type: string
              example: 28270412 -- 2026-03-20 04:22:15.536
            a552213_assoc_obj_type:
              type: string
              enum:
                - contact
                - company
                - deal
                - ticket
                - appointment
                - course
                - listing
                - service
                - project
                - other
            a552213_toggle:
              type: boolean
            a552213_assoc_record_id:
              type: string
              example: 9876543210
            a552213_first_start_date:
              type: string
              format: date-time
              example: '2026-02-27T21:24:18.038Z'
            a552213_first_end_date:
              type: string
              format: date-time
              example: '2026-02-28T21:24:18.038Z'
            a552213_last_start_date:
              type: string
              format: date-time
              example: '2026-02-27T21:24:18.038Z'
            a552213_last_end_date:
              type: string
              format: date-time
              example: '2026-02-28T21:24:18.038Z'
            a552213_total_minutes:
              type: number
              example: 1440
            a552213_total_hours:
              type: number
              example: 24
            a552213_total_days:
              type: number
              example: 1
            a552213_total_years:
              type: number
              example: 0.00273785
            a552213_total_decades:
              type: number
              example: 0.00027379
            a552213_total_centuries:
              type: number
              example: 0.00002738
            a552213_num_sessions:
              type: number
              example: 1
            a552213_week_year:
              type: string
              format: date
              example: '2026-02-23T00:00:00.000Z'
            a552213_month_year:
              type: string
              format: date
              example: '2026-02-01T00:00:00.000Z'
            a552213_is_split_week_record:
              type: boolean
            a552213_is_split_month_record:
              type: boolean
            a552213_workflow_managed_tag:
              type: string
              example: example_tag
            a552213_billable_minutes:
              type: number
              example: 0
            a552213_billable_hours:
              type: number
              example: 0
            a552213_billable_days:
              type: number
              example: 0
            a552213_billable_years:
              type: number
              example: 0
            a552213_billable_decades:
              type: number
              example: 0
            a552213_billable_centuries:
              type: number
              example: 0
            a552213_billable_amount:
              type: number
              example: 0
            a552213_cost_amount:
              type: number
              example: 0
            a552213_margin_amount:
              type: number
              example: 0
            a552213_is_one_time_log_per_session_record:
              type: boolean
            a552213_category_text:
              type: string
              example: Meetings
            a552213_description:
              type: string
              example: Meeting about Project XYZ
            a552213_billable_percentage:
              type: number
              example: 0
          additionalProperties: true
        createdAt:
          type: string
          format: date-time
          example: '2026-02-27T21:24:18.038Z'
        updatedAt:
          type: string
          format: date-time
          example: '2026-02-28T21:24:18.038Z'
        archived:
          type: boolean
    Error400:
      type: object
      properties:
        error:
          type: string
          example: HubSpot API Error
        details:
          type: string
          example: <hubspot error as string>
    BatchReadInput:
      type: object
      required:
        - id
      properties:
        id:
          type: string
          example: '1234567890'
          description: >-
            Must align with `idProperty` (if supplied). If `idProperty` is
            omitted, must reference `hs_object_id`.
    BatchReadMultiStatusResponse:
      type: object
      properties:
        completedAt:
          type: string
          format: date-time
        errors:
          type: array
          items:
            $ref: '#/components/schemas/BatchReadErrors'
        numErrors:
          type: integer
        results:
          type: array
          items:
            $ref: '#/components/schemas/Timelog'
        startedAt:
          type: string
          format: date-time
        status:
          type: string
          example: COMPLETE
    Error401:
      type: object
      properties:
        error:
          type: string
          example: Invalid API key
    Error403:
      type: object
      properties:
        error:
          type: string
          example: API key has been deactivated
    Error429:
      type: object
      properties:
        error:
          type: string
          example: Daily quota exceeded
        details:
          type: string
          example: >-
            This API key has reached its UTC daily request limit. Use response
            header x-stopwatch-ratelimit-reset to know when this quota will
            reset.
    Error500:
      type: object
      properties:
        error:
          type: string
          example: Internal Server Error
        details:
          type: string
          example: An unexpected error occurred.
    Error503:
      type: object
      properties:
        error:
          type: string
          example: Service temporarily busy
        details:
          type: string
          example: Unable to process request right now. Please retry shortly.
    BatchReadErrors:
      type: object
      properties:
        category:
          type: string
          example: OBJECT_NOT_FOUND
        context:
          type: object
          properties:
            ids:
              type: array
              items:
                type: string
                example: '12345'
        message:
          type: string
          example: >-
            Could not get some null objects, they may be deleted or not exist.
            Check that ids are valid.
        status:
          type: string
          example: error
  responses:
    MultiStatusResponse:
      description: >
        A Multi-Status response where some requested records were found and
        others were not. 

        This is returned with a `207` status code.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/BatchReadMultiStatusResponse'
          example:
            completedAt: '2026-03-25T05:55:26.329Z'
            errors:
              - category: OBJECT_NOT_FOUND
                context:
                  ids:
                    - '1111'
                message: >-
                  Could not get some null objects, they may be deleted or not
                  exist. Check that ids are valid.
                status: error
            numErrors: 1
            results:
              - archived: false
                createdAt: '2025-09-03T07:43:50.479Z'
                id: '151993156822'
                properties:
                  a3079614_assoc_record_id: '762476848343'
                  a3079614_billable_hours: '4.00'
                  hs_createdate: '2025-09-03T07:43:50.479Z'
                  hs_lastmodifieddate: '2025-09-03T07:43:51.260Z'
                  hs_object_id: '151993156822'
                updatedAt: '2025-09-03T07:43:51.260Z'
            startedAt: '2026-03-25T05:55:26.300Z'
            status: COMPLETE
    UnauthorizedError:
      description: API key is missing or invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error401'
    ForbiddenError:
      description: API key has been deactivated.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error403'
    TooManyRequestsError:
      description: UTC daily API quota exceeded for this API key.
      headers:
        x-stopwatch-ratelimit-reset:
          description: UTC timestamp indicating when the daily quota resets.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error429'
    InternalServerError:
      description: An unexpected error occurred.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error500'
    ServiceUnavailableError:
      description: Service is temporarily busy.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error503'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: >
        Bearer Authorization header of the form Bearer {token}, where {token} is
        your API key.

        By default, each API key is **rate-limited to 1,000 requests per day**
        (UTC). If you need a higher daily limit, please submit a [support
        request](https://www.threadi.au/support?app_name=stopwatch).

````