openapi: 3.0.3 info: title: hakuna Time Tracking Absences Management API description: 'The hakuna REST API provides programmatic access to the hakuna time-tracking and personnel-management platform: the running timer, time entries, absences, projects, tasks, clients, users, and account-wide company settings. Personal endpoints act in the context of the authenticated user; management endpoints require an admin token and the organization endpoint requires an organization-level token. All requests and responses are JSON. Generated by the API Evangelist enrichment pipeline from the published API documentation; not an official hakuna machine-readable specification.' version: v1 x-apievangelist-generated: '2026-07-19' x-apievangelist-method: generated x-apievangelist-source: https://app.hakuna.ch/api_docs contact: name: hakuna Support url: https://www.hakuna.ch/kontakt termsOfService: https://www.hakuna.ch/rechtliches/agb servers: - url: https://app.hakuna.ch/api/v1 description: Production security: - AuthToken: [] tags: - name: Management description: Admin-only management of projects, clients and tasks paths: /management/projects: get: operationId: listManagedProjects summary: List managed projects tags: - Management responses: '200': description: A list of projects content: application/json: schema: type: array items: $ref: '#/components/schemas/Project' '401': $ref: '#/components/responses/Unauthorized' '429': $ref: '#/components/responses/RateLimited' post: operationId: createManagedProject summary: Create a project tags: - Management requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProjectInput' responses: '201': description: Project created content: application/json: schema: $ref: '#/components/schemas/Project' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/UnprocessableEntity' '429': $ref: '#/components/responses/RateLimited' /management/projects/{id}: parameters: - $ref: '#/components/parameters/Id' get: operationId: getManagedProject summary: Get a project tags: - Management responses: '200': description: The project content: application/json: schema: $ref: '#/components/schemas/Project' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' patch: operationId: updateManagedProject summary: Update a project tags: - Management requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProjectInput' responses: '200': description: Project updated content: application/json: schema: $ref: '#/components/schemas/Project' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/UnprocessableEntity' '429': $ref: '#/components/responses/RateLimited' delete: operationId: deleteManagedProject summary: Delete a project tags: - Management responses: '204': description: Project deleted '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' /management/clients: get: operationId: listManagedClients summary: List managed clients tags: - Management responses: '200': description: A list of clients content: application/json: schema: type: array items: $ref: '#/components/schemas/Client' '401': $ref: '#/components/responses/Unauthorized' '429': $ref: '#/components/responses/RateLimited' post: operationId: createManagedClient summary: Create a client tags: - Management requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ClientInput' responses: '201': description: Client created content: application/json: schema: $ref: '#/components/schemas/Client' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/UnprocessableEntity' '429': $ref: '#/components/responses/RateLimited' /management/clients/{id}: parameters: - $ref: '#/components/parameters/Id' get: operationId: getManagedClient summary: Get a client tags: - Management responses: '200': description: The client content: application/json: schema: $ref: '#/components/schemas/Client' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' patch: operationId: updateManagedClient summary: Update a client tags: - Management requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ClientInput' responses: '200': description: Client updated content: application/json: schema: $ref: '#/components/schemas/Client' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/UnprocessableEntity' '429': $ref: '#/components/responses/RateLimited' delete: operationId: deleteManagedClient summary: Delete a client tags: - Management responses: '204': description: Client deleted '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' /management/tasks: get: operationId: listManagedTasks summary: List managed tasks tags: - Management responses: '200': description: A list of tasks content: application/json: schema: type: array items: $ref: '#/components/schemas/Task' '401': $ref: '#/components/responses/Unauthorized' '429': $ref: '#/components/responses/RateLimited' post: operationId: createManagedTask summary: Create a task tags: - Management requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TaskInput' responses: '201': description: Task created content: application/json: schema: $ref: '#/components/schemas/Task' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/UnprocessableEntity' '429': $ref: '#/components/responses/RateLimited' /management/tasks/{id}: parameters: - $ref: '#/components/parameters/Id' get: operationId: getManagedTask summary: Get a task tags: - Management responses: '200': description: The task content: application/json: schema: $ref: '#/components/schemas/Task' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' patch: operationId: updateManagedTask summary: Update a task tags: - Management requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TaskInput' responses: '200': description: Task updated content: application/json: schema: $ref: '#/components/schemas/Task' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/UnprocessableEntity' '429': $ref: '#/components/responses/RateLimited' delete: operationId: deleteManagedTask summary: Delete a task tags: - Management responses: '204': description: Task deleted '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' components: parameters: Id: name: id in: path required: true schema: type: string description: The unique identifier of the resource. schemas: Error: type: object description: JSON error object with a descriptive message. properties: message: type: string description: Human-readable description of the error. Client: type: object description: A client that projects belong to. properties: id: type: string name: type: string archived: type: boolean Task: type: object description: A categorization task. properties: id: type: string name: type: string archived: type: boolean ProjectInput: type: object required: - name properties: name: type: string client_id: type: string archived: type: boolean ClientInput: type: object required: - name properties: name: type: string archived: type: boolean Project: type: object description: A project that time can be tracked against. properties: id: type: string name: type: string archived: type: boolean client: $ref: '#/components/schemas/Client' TaskInput: type: object required: - name properties: name: type: string archived: type: boolean responses: Unauthorized: description: The auth token is missing or invalid. content: application/json: schema: $ref: '#/components/schemas/Error' NotFound: description: The requested resource was not found. content: application/json: schema: $ref: '#/components/schemas/Error' RateLimited: description: Too many requests. Limited to 100 requests per minute per customer. headers: X-RateLimit-Limit: schema: type: integer description: Maximum requests allowed in the window. X-RateLimit-Remaining: schema: type: integer description: Requests remaining in the current window. X-RateLimit-Reset: schema: type: integer description: Seconds until the window resets. Retry-After: schema: type: integer description: Seconds to wait before retrying. content: application/json: schema: $ref: '#/components/schemas/Error' UnprocessableEntity: description: The request payload failed validation. content: application/json: schema: $ref: '#/components/schemas/Error' securitySchemes: AuthToken: type: apiKey in: header name: X-Auth-Token description: Personal API token managed under "My Settings". Organization endpoints require a separate organization-level token; management endpoints require an admin token.