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

# List clock events

> List clock events in a date range. Optional IANA `timeZone` interprets `from`/`to` as local calendar days. Without `hr:attendance:write`, scope is self-only (`hr:attendance:self:write` only), direct reports (`hr:attendance:read`), or full reporting subtree (`hr:attendance:read` + `hr:attendance:team:read`).



## OpenAPI

````yaml /openapi/fluide-hr.json get /api/v1/hr/attendance/events
openapi: 3.0.0
info:
  title: Fluide HR API
  description: >-
    Employee records, contracts, leave, performance, OKRs, and HR insights. HR
    is the canonical employee source consumed by payroll and other suite
    services. In the API playground, click Authorize and provide Bearer JWT,
    X-Fluide-Api-Key, and X-Fluide-Client-Id (fluide-developer). For partner /
    ISV integrations acting on a merchant, also set optional X-Workspace-Id and
    X-Acting-Company-Id on each request (see Multi-tenancy).
  version: '1.0'
  contact: {}
servers:
  - url: https://test.api.fluidehr.com
    description: API
security:
  - bearer: []
    fluideApiKey: []
    fluideClientId: []
tags:
  - name: Health
    description: >-
      Liveness and readiness probes. Returns dependency status (database, Redis,
      etc.) for orchestrators and uptime monitors.
    x-group: Operations
  - name: Prometheus
    description: >-
      Prometheus scrape endpoint in text exposition format. Configure your
      metrics collector to poll this path on each service.
    x-group: Operations
  - name: Audit
  - name: HR Employees
    description: Create and manage employee records tied to your organization.
  - name: Onboarding
  - name: HR Employment contracts
  - name: Leave
  - name: Leave accrual
  - name: Performance
  - name: OKR
  - name: Country configuration (CCS)
  - name: Compliance
  - name: Insights
  - name: Dashboard
  - name: Attendance
  - name: Geofence sites
  - name: Recruitment
  - name: Workforce planning
  - name: Expenses
  - name: Benefits
  - name: Loans
  - name: Timesheets
  - name: Talent
  - name: Authorize
    description: >-
      Exchange API key and secret for a machine JWT, read developer metadata,
      rotate secrets, and manage API billing.
paths:
  /api/v1/hr/attendance/events:
    get:
      tags:
        - Attendance
      summary: List clock events
      description: >-
        List clock events in a date range. Optional IANA `timeZone` interprets
        `from`/`to` as local calendar days. Without `hr:attendance:write`, scope
        is self-only (`hr:attendance:self:write` only), direct reports
        (`hr:attendance:read`), or full reporting subtree (`hr:attendance:read`
        + `hr:attendance:team:read`).
      operationId: AttendanceController_listEvents
      parameters:
        - name: from
          required: true
          in: query
          description: Start calendar date (YYYY-MM-DD)
          schema:
            example: '2026-06-01'
            type: string
        - name: to
          required: true
          in: query
          description: End calendar date (YYYY-MM-DD), inclusive
          schema:
            example: '2026-06-30'
            type: string
        - name: timeZone
          required: false
          in: query
          description: >-
            IANA time zone (e.g. Africa/Douala). Interprets from/to as local
            calendar days.
          schema:
            maxLength: 64
            example: Africa/Douala
            type: string
        - name: hrEmployeeId
          required: false
          in: query
          description: >-
            Filter by HR employee UUID (requires hr:attendance:write for
            unrestricted scope).
          schema:
            type: string
            format: uuid
        - name: limit
          required: false
          in: query
          schema:
            minimum: 1
            maximum: 500
            default: 100
            type: number
        - name: X-Workspace-Id
          in: header
          required: false
          description: >-
            Partner / ISV only: UUID of the workspace that owns the client
            company. Required together with X-Acting-Company-Id when scoping
            product APIs to a merchant. See /getting-started/multi-tenancy.
          schema:
            type: string
            format: uuid
          example: b03fa178-67bd-4378-a5aa-d169c01ccb6f
        - name: X-Acting-Company-Id
          in: header
          required: false
          description: >-
            Partner / ISV only: UUID of the client company to act on. Must
            belong to the workspace in X-Workspace-Id.
          schema:
            type: string
            format: uuid
          example: ab2df10a-c66c-4bef-b7d6-efda26cca494
      responses:
        '200':
          description: Clock events in the requested date range
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: Operation completed successfully
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/AttendanceEventDto'
        '400':
          description: Validation failed or invalid request parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponseDto'
        '401':
          description: Missing or invalid JWT / API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponseDto'
        '403':
          description: Token valid but insufficient permission for this operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponseDto'
        '404':
          description: Resource not found or outside caller scope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponseDto'
      security:
        - bearer: []
          fluideApiKey: []
          fluideClientId: []
      x-codeSamples:
        - lang: bash
          label: cURL
          source: >-
            curl -sS -X GET
            "$FLUIDE_BASE_URL/api/v1/hr/attendance/events?from=2026-06-01&to=2026-06-30"
            \
              -H "Authorization: Bearer $FLUIDE_ACCESS_TOKEN" \
              -H "X-Fluide-Api-Key: $FLUIDE_API_KEY" \
              -H "X-Fluide-Client-Id: fluide-developer" \
              -H "X-Workspace-Id: $FLUIDE_WORKSPACE_ID" \
              -H "X-Acting-Company-Id: $FLUIDE_COMPANY_ID"
        - lang: node
          label: Node.js
          source: >-
            const baseUrl = process.env.FLUIDE_BASE_URL;


            const response = await
            fetch(`${baseUrl}/api/v1/hr/attendance/events?from=2026-06-01&to=2026-06-30`,
            {
              method: 'GET',
              headers: {
                Authorization: `Bearer ${process.env.FLUIDE_ACCESS_TOKEN}`,
                'X-Fluide-Api-Key': process.env.FLUIDE_API_KEY,
                'X-Fluide-Client-Id': 'fluide-developer',
                'X-Workspace-Id': process.env.FLUIDE_WORKSPACE_ID,
                'X-Acting-Company-Id': process.env.FLUIDE_COMPANY_ID,
              },
            });


            if (!response.ok) throw new Error(`HTTP ${response.status}: ${await
            response.text()}`);

            console.log(await response.json());
        - lang: python
          label: Python
          source: |-
            import os
            import requests

            base_url = os.environ["FLUIDE_BASE_URL"]
            headers = {
                    "Authorization": f"Bearer {os.environ['FLUIDE_ACCESS_TOKEN']}",
                    "X-Fluide-Api-Key": os.environ["FLUIDE_API_KEY"],
                    "X-Fluide-Client-Id": "fluide-developer",
                    "X-Workspace-Id": os.environ["FLUIDE_WORKSPACE_ID"],
                    "X-Acting-Company-Id": os.environ["FLUIDE_COMPANY_ID"],
            }

            response = requests.get(
                f"{base_url}/api/v1/hr/attendance/events?from=2026-06-01&to=2026-06-30",
                headers=headers,
                timeout=30,
            )
            response.raise_for_status()
            print(response.json())
        - lang: java
          label: Java
          source: >-
            import java.net.URI;

            import java.net.http.HttpClient;

            import java.net.http.HttpRequest;

            import java.net.http.HttpResponse;


            String baseUrl = System.getenv("FLUIDE_BASE_URL");

            HttpClient client = HttpClient.newHttpClient();

            HttpRequest.Builder builder = HttpRequest.newBuilder()
                .uri(URI.create(baseUrl + "/api/v1/hr/attendance/events?from=2026-06-01&to=2026-06-30"))
                .header("Authorization", "Bearer " + System.getenv("FLUIDE_ACCESS_TOKEN"))
                .header("X-Fluide-Api-Key", System.getenv("FLUIDE_API_KEY"))
                .header("X-Fluide-Client-Id", "fluide-developer")
                .header("X-Workspace-Id", System.getenv("FLUIDE_WORKSPACE_ID"))
                .header("X-Acting-Company-Id", System.getenv("FLUIDE_COMPANY_ID"))
                .GET(HttpRequest.BodyPublishers.noBody())
                .build();
            HttpResponse<String> response = client.send(builder.build(),
            HttpResponse.BodyHandlers.ofString());

            if (response.statusCode() >= 400) throw new RuntimeException("HTTP "
            + response.statusCode() + ": " + response.body());

            System.out.println(response.body());
        - lang: php
          label: PHP
          source: >-
            <?php

            $baseUrl = getenv("FLUIDE_BASE_URL");

            $ch = curl_init($baseUrl .
            "/api/v1/hr/attendance/events?from=2026-06-01&to=2026-06-30");

            curl_setopt_array($ch, [
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_CUSTOMREQUEST => 'GET',
                CURLOPT_HTTPHEADER => [
                    'Authorization: Bearer ' . getenv('FLUIDE_ACCESS_TOKEN'),
                    'X-Fluide-Api-Key: ' . getenv('FLUIDE_API_KEY'),
                    'X-Fluide-Client-Id: fluide-developer',
                    'X-Workspace-Id: ' . getenv('FLUIDE_WORKSPACE_ID'),
                    'X-Acting-Company-Id: ' . getenv('FLUIDE_COMPANY_ID'),
                ],
            ]);

            $response = curl_exec($ch);

            if ($response === false) throw new
            RuntimeException(curl_error($ch));

            $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

            if ($status >= 400) throw new RuntimeException("HTTP $status:
            $response");

            echo $response;
components:
  schemas:
    AttendanceEventDto:
      type: object
      properties:
        id:
          type: string
          example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
        hrEmployeeId:
          type: string
          example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
        occurredAt:
          type: string
          description: UTC timestamp of the punch
          example: '2026-06-03T08:15:00.000Z'
        kind:
          enum:
            - CLOCK_IN
            - CLOCK_OUT
          type: string
        source:
          enum:
            - WEB
            - MOBILE
            - KIOSK
            - SYSTEM
          type: string
        note:
          type: string
          nullable: true
        context:
          type: object
          additionalProperties: true
        employeeDisplayName:
          type: string
          example: Jane Doe
      required:
        - id
        - hrEmployeeId
        - occurredAt
        - kind
        - source
        - context
        - employeeDisplayName
    ApiErrorResponseDto:
      type: object
      properties:
        success:
          type: boolean
          example: false
        message:
          type: string
          example: Validation failed
          description: Human-readable error message (localized when i18n is configured)
        code:
          type: string
          example: VALIDATION_FAILED
          description: Stable machine-readable error code for client handling and support
        errors:
          type: object
          description: Field-level validation errors keyed by property name
          example:
            from:
              - from must be a valid date
        statusCode:
          type: number
          example: 400
        timestamp:
          type: string
          example: '2026-06-03T12:00:00.000Z'
      required:
        - success
        - message
        - code
        - statusCode
        - timestamp
  securitySchemes:
    bearer:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Access token JWT. Use as Authorization: Bearer <token>. In the API
        playground, paste the JWT only.
    fluideApiKey:
      type: apiKey
      in: header
      name: X-Fluide-Api-Key
      description: >-
        Developer API key (fl_dev_...). Required on every API call with a
        machine access token.
      x-default: fl_dev_your_key
    fluideClientId:
      type: apiKey
      in: header
      name: X-Fluide-Client-Id
      description: >-
        First-party client audience. Must match the fluide_client_id claim on
        the JWT. Use fluide-developer for Connect.
      x-default: fluide-developer

````