Reonic Time Tracking API

Time entries logged against projects. > [!warning] > **Beta:** These endpoints are in beta and may change as the service evolves. Please report issues or unexpected behavior to our team.

OpenAPI Specification

reonic-time-tracking-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Reonic REST Api v3 Activities Time Tracking API
  description: 'The Reonic REST API v3 provides programmatic access to create and manage resources. The API follows REST principles and returns responses in JSON format. Authentication is required via an API key passed in the X-Authorization header.


    ## Errors


    All endpoints return errors with the same JSON shape:


    ```json

    { "message": "human-readable description" }

    ```


    `400` responses additionally include an `errors` field with per-field validation details.


    The HTTP status code identifies the cause:


    | Status  | Meaning | When |

    |--------|---------|------|

    | `400` | Bad Request | Path params, query string, or request body failed validation. Inspect `errors` for the field-level breakdown. |

    | `401` | Unauthorized | The `X-Authorization` header is missing, malformed, does not match an active API key, or belongs to a different API version. The response never indicates which check failed; check that the key matches the endpoint version. API v3 endpoints require a v3 key with the `rnc_v3_` prefix. |

    | `403` | Forbidden | The API key is read-only and the request targeted a write endpoint (`POST`). Issue a key with write access. |

    | `404` | Not Found | A resource referenced by a path id does not exist or is not visible to your workspace. |

    | `429` | Too Many Requests | The per-client rate limit was exceeded. See **Rate limiting** below. |

    | `500` | Internal Server Error | Unexpected failure. Safe to retry once; if it persists, contact support. |

    | `503` | Service Unavailable | A backing dependency is temporarily unavailable. Retry with exponential backoff. |


    ## Rate limiting


    Limits are shared across all API keys you hold and reset on a 1-minute window. Two buckets:


    | Bucket | Limit | Applies to |

    |--------|-------|------------|

    | `cached` | 500 / min | `GET` requests served from the response cache |

    | `uncached` | 30 / min | Cache misses, `GET` requests sent with `Reonic-Cache-Control: no-cache`, and all `POST` requests |


    Every response includes:


    - `X-RateLimit-Bucket` — `cached` or `uncached`

    - `X-RateLimit-Limit` — the bucket''s ceiling (`500` or `30`)

    - `X-RateLimit-Remaining` — calls left in the current window

    - `X-RateLimit-Reset` — Unix epoch seconds at which the window resets

    - `X-RateLimit-Policy` — `<limit>;w=60`


    `429` responses additionally set `Retry-After` (in seconds). Wait at least that long before retrying.


    ## Caching and Reonic-Cache-Control


    `GET` responses are cached for up to 1 hour. Identical requests (same path and query) on the same API key return the cached result. To force a fresh read, send `Reonic-Cache-Control: no-cache`; the response is then refreshed and re-cached. Forced refreshes count against the `uncached` rate-limit bucket.


    The standard `Cache-Control` header is not honored. Use `Reonic-Cache-Control` to control caching behavior.


    ## Authentication


    Every request must include your API key in the `X-Authorization` header:


    ```

    X-Authorization: <your-api-key>

    ```


    API keys are issued from the Reonic web app and look like `rnc_v3_…`. Send the full value, including the prefix.

    '
  version: 3.2.0
  contact:
    email: kontakt@reonic.de
    url: https://reonic.com
    name: Reonic GmbH
servers:
- url: '{apiBaseUrl}/rest/v3/'
security:
- X-Authorization: []
tags:
- name: Time Tracking
  description: "Time entries logged against projects.\n\n> [!warning] \n> **Beta:** These endpoints are in beta and may change as the service evolves. Please report issues or unexpected behavior to our team."
  x-displayName: Time Tracking (BETA)
paths:
  /timetracking/eventTypes:
    get:
      summary: Get time tracking event types
      description: 'Get all time tracking event types, optionally including archived ones.


        **Allowed API keys:** Read-only, Read and Write'
      tags:
      - Time Tracking
      x-badges:
      - name: BETA
        position: before
        color: '#ea580c'
      parameters:
      - schema:
          type:
          - boolean
          - 'null'
          default: false
        required: false
        name: showArchived
        in: query
      - schema:
          type: string
          example: no-cache
        required: false
        name: Reonic-Cache-Control
        in: header
        description: Set to 'no-cache' to bypass the 1-hour response cache and force a fresh read. The fresh response is then written back to the cache for subsequent callers. Forced refreshes count against the uncached rate-limit bucket (30/min); only cache hits count against the cached bucket (500/min).
      responses:
        '200':
          description: Array of event types
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/TimetrackingEventType'
                    description: List of items
                required:
                - data
  /timetracking:
    get:
      summary: List time tracking entries
      description: 'List time tracking entries with filters and pagination. Page size is fixed at 50.


        **Allowed API keys:** Read-only, Read and Write'
      tags:
      - Time Tracking
      x-badges:
      - name: BETA
        position: before
        color: '#ea580c'
      parameters:
      - schema:
          type: integer
          minimum: 1
          default: 1
          description: 'Page number, starting from 1. Default: 1.'
        required: false
        description: 'Page number, starting from 1. Default: 1.'
        name: page
        in: query
      - schema:
          type:
          - boolean
          - 'null'
          default: false
        required: false
        name: archived
        in: query
      - schema:
          type:
          - array
          - 'null'
          items:
            type: string
            format: uuid
          maxItems: 50
          description: Comma-separated list or repeated query param.
        required: false
        description: Comma-separated list or repeated query param.
        name: userIds
        in: query
      - schema:
          type:
          - array
          - 'null'
          items:
            type: string
            format: uuid
          maxItems: 50
          description: Comma-separated list or repeated query param.
        required: false
        description: Comma-separated list or repeated query param.
        name: eventTypeIds
        in: query
      - schema:
          type: string
          format: uuid
          example: 123e4567-e89b-12d3-a456-426614174000
        required: false
        name: parentId
        in: query
      - schema:
          type: string
          enum:
          - residentialProject
          - commercialProject
        required: false
        name: parentType
        in: query
      - schema:
          type:
          - string
          - 'null'
          format: date-time
          description: Filter records where startAt is after this datetime (exclusive)
          example: '2026-01-01T15:30:00.000Z'
        required: false
        description: Filter records where startAt is after this datetime (exclusive)
        name: startAt.gt
        in: query
      - schema:
          type:
          - string
          - 'null'
          format: date-time
          description: Filter records where startAt is before this datetime (exclusive)
          example: '2026-01-01T15:30:00.000Z'
        required: false
        description: Filter records where startAt is before this datetime (exclusive)
        name: startAt.lt
        in: query
      - schema:
          type: string
          example: no-cache
        required: false
        name: Reonic-Cache-Control
        in: header
        description: Set to 'no-cache' to bypass the 1-hour response cache and force a fresh read. The fresh response is then written back to the cache for subsequent callers. Forced refreshes count against the uncached rate-limit bucket (30/min); only cache hits count against the cached bucket (500/min).
      responses:
        '200':
          description: Paginated time tracking entries
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/TimetrackingEntry'
                  pagination:
                    type: object
                    properties:
                      page:
                        type: integer
                        minimum: 1
                        description: Current page number
                      perPage:
                        type: integer
                        minimum: 1
                        description: Number of items per page
                      total:
                        type: integer
                        minimum: 0
                        description: Total number of items across all pages
                      totalPages:
                        type: integer
                        minimum: 1
                      next:
                        type:
                        - string
                        - 'null'
                        description: Path to the next page, or null if there is no next page
                      prev:
                        type:
                        - string
                        - 'null'
                        description: Path to the previous page, or null if there is no previous page
                    required:
                    - page
                    - perPage
                    - total
                    - totalPages
                    - next
                    - prev
                required:
                - data
                - pagination
  /timetracking/create:
    post:
      summary: Create time tracking entries
      description: 'Bulk create one or more time tracking entries.


        **Allowed API keys:** Read and Write'
      tags:
      - Time Tracking
      x-badges:
      - name: BETA
        position: before
        color: '#ea580c'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                entries:
                  type: array
                  items:
                    type: object
                    properties:
                      startAt:
                        type: string
                        format: date-time
                        example: '2026-01-01T15:30:00.000Z'
                      endAt:
                        type: string
                        format: date-time
                        example: '2026-01-01T15:30:00.000Z'
                      timestamp:
                        type: string
                        format: date-time
                        example: '2026-01-01T15:30:00.000Z'
                      userId:
                        type: string
                        format: uuid
                        example: 123e4567-e89b-12d3-a456-426614174000
                      comment:
                        type: string
                        maxLength: 4000
                      typeId:
                        type: string
                        format: uuid
                        example: 123e4567-e89b-12d3-a456-426614174000
                      parentId:
                        type: string
                        format: uuid
                        example: 123e4567-e89b-12d3-a456-426614174000
                      parentType:
                        type: string
                        enum:
                        - residentialProject
                        - commercialProject
                      breaks:
                        type: array
                        items:
                          type: object
                          properties:
                            start:
                              type: string
                              format: date-time
                              example: '2026-01-01T15:30:00.000Z'
                            end:
                              type: string
                              format: date-time
                              example: '2026-01-01T15:30:00.000Z'
                          required:
                          - start
                          - end
                          additionalProperties: false
                        maxItems: 100
                      latLng:
                        type: object
                        properties:
                          lat:
                            type: number
                            minimum: -90
                            maximum: 90
                          lng:
                            type: number
                            minimum: -180
                            maximum: 180
                        required:
                        - lat
                        - lng
                        additionalProperties: false
                    required:
                    - startAt
                    - endAt
                    - timestamp
                    - userId
                    additionalProperties: false
                  minItems: 1
                  maxItems: 100
              required:
              - entries
              additionalProperties: false
      responses:
        '201':
          description: The created entries
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/TimetrackingEntry'
                    description: List of items
                required:
                - data
  /timetracking/{entryId}/update:
    post:
      summary: Update time tracking entry
      description: 'Update an existing time tracking entry. Omit fields to leave them unchanged.


        **Allowed API keys:** Read and Write'
      tags:
      - Time Tracking
      x-badges:
      - name: BETA
        position: before
        color: '#ea580c'
      parameters:
      - schema:
          type: string
          format: uuid
          example: 123e4567-e89b-12d3-a456-426614174000
        required: true
        name: entryId
        in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                startAt:
                  type: string
                  format: date-time
                  example: '2026-01-01T15:30:00.000Z'
                endAt:
                  type: string
                  format: date-time
                  example: '2026-01-01T15:30:00.000Z'
                timestamp:
                  type: string
                  format: date-time
                  example: '2026-01-01T15:30:00.000Z'
                userId:
                  type: string
                  format: uuid
                  example: 123e4567-e89b-12d3-a456-426614174000
                comment:
                  type:
                  - string
                  - 'null'
                  maxLength: 4000
                typeId:
                  type: string
                  format: uuid
                  example: 123e4567-e89b-12d3-a456-426614174000
                parentId:
                  type: string
                  format: uuid
                  example: 123e4567-e89b-12d3-a456-426614174000
                parentType:
                  type: string
                  enum:
                  - residentialProject
                  - commercialProject
                breaks:
                  type: array
                  items:
                    type: object
                    properties:
                      start:
                        type: string
                        format: date-time
                        example: '2026-01-01T15:30:00.000Z'
                      end:
                        type: string
                        format: date-time
                        example: '2026-01-01T15:30:00.000Z'
                    required:
                    - start
                    - end
                    additionalProperties: false
                  maxItems: 100
                latLng:
                  type: object
                  properties:
                    lat:
                      type: number
                      minimum: -90
                      maximum: 90
                    lng:
                      type: number
                      minimum: -180
                      maximum: 180
                  required:
                  - lat
                  - lng
                  additionalProperties: false
              additionalProperties: false
      responses:
        '200':
          description: The updated entry
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/TimetrackingEntry'
                required:
                - data
  /timetracking/{entryId}/archive:
    post:
      summary: Archive or restore time tracking entry
      description: 'Archive or restore a time tracking entry.


        **Allowed API keys:** Read and Write'
      tags:
      - Time Tracking
      x-badges:
      - name: BETA
        position: before
        color: '#ea580c'
      parameters:
      - schema:
          type: string
          format: uuid
          example: 123e4567-e89b-12d3-a456-426614174000
        required: true
        name: entryId
        in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                archive:
                  type: boolean
              required:
              - archive
              additionalProperties: false
      responses:
        '200':
          description: The updated entry
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimetrackingEntry'
components:
  schemas:
    TimetrackingEntry:
      type: object
      properties:
        id:
          type: string
          format: uuid
          example: 123e4567-e89b-12d3-a456-426614174000
        trackingId:
          type: string
          format: uuid
          example: 123e4567-e89b-12d3-a456-426614174000
        userId:
          type: string
          format: uuid
          example: 123e4567-e89b-12d3-a456-426614174000
        createdAt:
          type:
          - string
          - 'null'
          format: date-time
          example: '2026-01-01T15:30:00.000Z'
        createdById:
          type: string
          format: uuid
          example: 123e4567-e89b-12d3-a456-426614174000
        updatedAt:
          type:
          - string
          - 'null'
          format: date-time
          example: '2026-01-01T15:30:00.000Z'
        updatedById:
          type:
          - string
          - 'null'
          format: uuid
          example: 123e4567-e89b-12d3-a456-426614174000
        archivedAt:
          type:
          - string
          - 'null'
          format: date-time
          example: '2026-01-01T15:30:00.000Z'
        startAt:
          type:
          - string
          - 'null'
          format: date-time
          example: '2026-01-01T15:30:00.000Z'
        endAt:
          type:
          - string
          - 'null'
          format: date-time
          example: '2026-01-01T15:30:00.000Z'
        workingTimeMinutes:
          type:
          - number
          - 'null'
        breakDurationMinutes:
          type:
          - number
          - 'null'
        breaks:
          type: array
          items:
            type: object
            properties:
              start:
                type:
                - string
                - 'null'
                format: date-time
                example: '2026-01-01T15:30:00.000Z'
              end:
                type:
                - string
                - 'null'
                format: date-time
                example: '2026-01-01T15:30:00.000Z'
            required:
            - start
            - end
        comment:
          type:
          - string
          - 'null'
        typeId:
          type:
          - string
          - 'null'
          format: uuid
          example: 123e4567-e89b-12d3-a456-426614174000
        type:
          allOf:
          - $ref: '#/components/schemas/TimetrackingEventType'
          - type:
            - object
            - 'null'
        parentId:
          type:
          - string
          - 'null'
          format: uuid
          example: 123e4567-e89b-12d3-a456-426614174000
        parentType:
          type:
          - string
          - 'null'
          enum:
          - residentialProject
          - commercialProject
          - null
        parentName:
          type:
          - string
          - 'null'
      required:
      - id
      - trackingId
      - userId
      - createdAt
      - createdById
      - updatedAt
      - updatedById
      - archivedAt
      - startAt
      - endAt
      - workingTimeMinutes
      - breakDurationMinutes
      - breaks
      - comment
      - typeId
      - type
      - parentId
      - parentType
      - parentName
    TimetrackingEventType:
      type: object
      properties:
        id:
          type: string
          format: uuid
          example: 123e4567-e89b-12d3-a456-426614174000
        name:
          type: string
        position:
          type: number
        textColor:
          type: string
        backgroundColor:
          type: string
        archivedAt:
          type:
          - string
          - 'null'
          format: date-time
          example: '2026-01-01T15:30:00.000Z'
      required:
      - id
      - name
      - position
      - textColor
      - backgroundColor
      - archivedAt
  securitySchemes:
    X-Authorization:
      type: apiKey
      in: header
      name: X-Authorization
x-tagGroups:
- name: People
  tags:
  - Contacts
  - Users
  - Teams
- name: Projects
  tags:
  - Residential Projects
  - Commercial Projects
- name: Working on a project
  tags:
  - Notes
  - Tasks
  - Files
  - File Folders
  - Activities
  - Time Tracking
  - Checklists
  - Checklist Templates
  - Signature Requests
- name: Calendar
  tags:
  - Calendars
  - Calendar Categories
  - Appointments
- name: Catalog
  tags:
  - Components
  - Planning Templates
  - Planning Packages
  - Offer Templates
- name: Workspace setup
  tags:
  - Kanban Boards
  - Kanban Columns
  - Tags
  - Lead Sources
- name: Wiki
  tags:
  - Wiki
- name: Services
  tags:
  - Photogrammetry
- name: API helpers
  tags:
  - Upload
  - Links
- name: Integrations
  tags:
  - Webhooks
- name: Guides
  tags:
  - Migrating from API v2 to v3
  - Changelog