---
title: "Log overtime"
method: POST
path: "/overtime-entries"
tags: ["Overtime"]
---

# Log overtime

`POST /overtime-entries`

## Request

- Base URL: `https://api.absentify.com/api/v1`
- URL: `https://api.absentify.com/api/v1/overtime-entries`
- Auth: API key in header `X-API-KEY`

Logs overtime on an allowance type that has overtime logging switched on. The entry follows the member's normal approval chain and its approvers are notified; it is credited once approved. An admin can log for another active member of the workspace with `member_id`, otherwise it is logged for the API key's member. Send the same `submission_id` again to get the existing entry back instead of a second one. Fails with 409 when that `submission_id` was already used for the same member with a different allowance type, date or amount.

## Request body

- object
  - `member_id` string, uuid: The member the overtime was worked by. Defaults to the API key's member. Only admins may name someone else.
  - `allowance_type_id` string, uuid, required: The allowance type the overtime is credited to. Overtime logging has to be switched on for it.
  - `date` string, required: The day the overtime was worked, `YYYY-MM-DD`. Today or a day in the past.
  - `amount` number, required: Days (0.5 or 1) when `allowance_unit` is `days`, whole MINUTES when it is `hours` (for example 90 = 1 hour 30 minutes).
  - `comment` string, nullable: A note for the approvers, at most 2500 characters.
  - `submission_id` string: Makes a retry safe: the same value for the same member with the same allowance type, date and amount returns the existing entry. With a different allowance type, date or amount it fails with 409. Generated when omitted, in which case a retry logs a second entry.

## Response `200`

Successful response

- object
  - `id` integer, required
  - `member` object, required: The member the overtime was worked by.
    - `id` string, required
    - `custom_id` string, nullable, required
    - `name` string, nullable, required
    - `email` string, nullable, required
  - `allowance_type_id` string, required
  - `allowance_unit` 'days' | 'hours', required: The unit of the allowance type. Amounts are in days for `days` and in MINUTES for `hours`.
  - `date` string, required: The day the overtime was worked, `YYYY-MM-DD`.
  - `amount` number, required: The amount that was logged. Days (0.5 or 1) when `allowance_unit` is `days`, whole MINUTES when it is `hours` (for example 90 = 1 hour 30 minutes).
  - `recognized_amount` number, required: The amount an approver recognized, never more than `amount`. Equal to `amount` until someone lowers it. Days (0.5 or 1) when `allowance_unit` is `days`, whole MINUTES when it is `hours` (for example 90 = 1 hour 30 minutes).
  - `day_kind` 'WORKDAY' | 'DAY_OFF' | 'PUBLIC_HOLIDAY', required: What kind of day it was when the entry was logged.
  - `factor` number, required: The multiplier applied to the recognized amount, fixed when the entry was logged.
  - `credit_expiry_date` string, nullable, required: The LAST day (inclusive, `YYYY-MM-DD`) the credit can still be used, or null when the credit has no expiry of its own; it then follows the allowance's carry-over at the end of the year.
  - `comment` string, nullable, required
  - `status` 'PENDING' | 'APPROVED' | 'DECLINED' | 'CANCELED', required
  - `decided_by` object, nullable, required: Who made the final decision. Null while the entry is open.
    - `id` string, required
    - `custom_id` string, nullable, required
    - `name` string, nullable, required
    - `email` string, nullable, required
  - `decided_at` string, nullable, required
  - `created_by` object, nullable, required: Who logged the entry. It differs from `member` when an admin logged it for someone else. Null for entries from before this was recorded and once that member has been deleted.
    - `id` string, required
    - `custom_id` string, nullable, required
    - `name` string, nullable, required
    - `email` string, nullable, required
  - `created_at` string, required
  - `canceled_at` string, nullable, required
  - `canceled_by` object, nullable, required: Who withdrew the entry. It differs from `member` when the member who logged it for them withdrew it. Null unless the status is CANCELED.
    - `id` string, required
    - `custom_id` string, nullable, required
    - `name` string, nullable, required
    - `email` string, nullable, required
  - `decline_reason` string, nullable, required: The reason given when the entry was declined, also when an admin declined for the approver.
  - `credited_amount` number, nullable, required: What was credited to the allowance: the recognized amount times `factor`, as booked. Null while there is no credit. Days (rounded to two decimals, for example 0.75 or 1.5) when `allowance_unit` is `days`, whole MINUTES when it is `hours`.
  - `credit_removed` boolean, required: True when the entry is approved but its credit was deleted from the allowance afterwards.

## Other responses

- `400`: Invalid input data
- `401`: Authorization not provided
- `403`: Insufficient access
- `500`: Internal server error

## Changes

- **2026-10-15** `d32b5ab6fd15`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/absentify/apis/absentify-crud-api/changes/overtime-entries/post.md)

---

[API](https://skmtc.dev/absentify/apis/absentify-crud-api.md) - [All operations](https://skmtc.dev/absentify/apis/absentify-crud-api/llms.txt) - [OpenAPI document](https://skmtc.dev/absentify/apis/absentify-crud-api/revisions/f617e161c057?raw)
