OpenAPI Specification
openapi: 3.0.3
info:
title: hakuna Time Tracking Absences Time Entries 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: Time Entries
description: Recorded blocks of worked time
paths:
/time_entries:
get:
operationId: listTimeEntries
summary: List time entries
description: List recorded time entries for the authenticated user.
tags:
- Time Entries
responses:
'200':
description: A list of time entries
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/TimeEntry'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/RateLimited'
post:
operationId: createTimeEntry
summary: Create a time entry
description: Create a new recorded block of worked time.
tags:
- Time Entries
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TimeEntryInput'
responses:
'201':
description: Time entry created
content:
application/json:
schema:
$ref: '#/components/schemas/TimeEntry'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/UnprocessableEntity'
'429':
$ref: '#/components/responses/RateLimited'
/time_entries/{id}:
parameters:
- $ref: '#/components/parameters/Id'
get:
operationId: getTimeEntry
summary: Get a time entry
tags:
- Time Entries
responses:
'200':
description: The time entry
content:
application/json:
schema:
$ref: '#/components/schemas/TimeEntry'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
patch:
operationId: updateTimeEntry
summary: Update a time entry
tags:
- Time Entries
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TimeEntryInput'
responses:
'200':
description: Time entry updated
content:
application/json:
schema:
$ref: '#/components/schemas/TimeEntry'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/UnprocessableEntity'
'429':
$ref: '#/components/responses/RateLimited'
delete:
operationId: deleteTimeEntry
summary: Delete a time entry
tags:
- Time Entries
responses:
'204':
description: Time entry 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.
Task:
type: object
description: A categorization task.
properties:
id:
type: string
name:
type: string
archived:
type: boolean
Client:
type: object
description: A client that projects belong to.
properties:
id:
type: string
name:
type: string
archived:
type: boolean
TimeEntry:
type: object
description: A recorded block of worked time.
properties:
id:
type: string
date:
type: string
format: date
start_time:
type: string
format: date-time
end_time:
type: string
format: date-time
duration:
type: string
note:
type: string
task:
$ref: '#/components/schemas/Task'
project:
$ref: '#/components/schemas/Project'
user:
$ref: '#/components/schemas/User'
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'
TimeEntryInput:
type: object
properties:
date:
type: string
format: date
start_time:
type: string
format: date-time
end_time:
type: string
format: date-time
task_id:
type: string
project_id:
type: string
note:
type: string
User:
type: object
description: A user of the account.
properties:
id:
type: string
name:
type: string
email:
type: string
format: email
role:
type: string
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.