Welcome to the absentify developer documentation
Welcome to the developer documentation for absentify! This guide provides everything you need to start using the absentify API for efficient management of absence requests, approvals, and real-time integrations via webhooks.Access to the API requires a Plus plan, which includes an API key and supports up to 150 requests per second per IP. For higher throughput, you can upgrade to 1500 requests per second for $100/€100 per month by contacting support.
Choose your starting point
Quick start guide
Get started quickly with your first API request by following the quick start guide. It covers everything you need to set up and make your first API call with absentify.
Webhook integration
Set up webhook integrations to receive instant notifications for events in absentify. Webhooks enable real-time connections for actions like request creation and status updates.
MCP server
Connect AI assistants to our documentation using the Model Context Protocol (MCP). Enable AI applications to search and retrieve relevant information from the absentify documentation.MCP server URL:
https://absentify.com/docs/mcpManaging allowances through the API
Allowances are driven by allowance rules. A rule defines how much is granted per cycle, when the allowance year starts, and what happens to unused allowance. Every rule belongs to an allowance type, the balance that leave types draw from. Employees are connected to a rule through a rule assignment with a validity period, and individual corrections are recorded as adjustments on top of the rule. The Allowance Management endpoints follow that model:
A few things to know before you integrate:
- All Allowance Management endpoints require an admin API key. The exceptions are the read-only
GET /allowance-types,GET /allowance-types/{id}, andGET /members/{member_id}/allowances, which a manager key can also call for the members it is allowed to see. GET /allowance-typesreturns the ids that every rule, rule assignment, adjustment, and balance endpoint expects asallowance_type_id.- Date-only fields (
rule_start_date,rule_end_date,accrual_anchor_date, adjustmentdateandexpiry_date) must be sent asYYYY-MM-DD. Values that are not real calendar dates, such as2026-02-30, are rejected. - On a rule assignment,
rule_start_dateis the first day the rule applies andrule_end_dateis the last day it applies. To cover a member through August 31, 2026, send2026-08-31. Sendnullfor an open-ended assignment.GETreturns the same convention, so a value you read can be sent straight back in aPATCH. - On
PATCH /rule-assignments/{id}, omitrule_end_dateto leave the current end date unchanged, and sendnullto make the assignment open-ended. - Amounts follow the allowance type’s unit: days for day-based types, minutes for hour-based types.
proration_basiscontrols how a partial year is calculated on yearly rules.monthcounts whole months and prorates the started month by day;dayis calendar-day exact. It defaults tomonthand is ignored for monthly and bi-weekly cycles.DELETE /rules/{id}requiresreassign_towhenever members are still assigned to the rule.- Rule changes accept an optional
reasonthat is stored in the audit trail. Creating, updating, or deleting a rule assignment requires areasonof 3–500 characters; leading and trailing whitespace is ignored, and whitespace-only values are rejected.
Managing allowance types
POST /allowance-typescreates a type without any rule, so nothing accrues on it until you add one throughPOST /allowance-types/{allowance_type_id}/rules. How many allowance types a workspace may have depends on its plan.allowance_unitisdaysorhoursand cannot be changed after the type exists. On anhourstype, every amount in the API is expressed in minutes.PATCH /allowance-types/{id}applies only the fields you send. Omit a field to leave its current value untouched, so two integrations changing different fields cannot overwrite each other. Sendingtranslationsreplaces the stored translations; omit the field to keep them.- In responses,
nameis translated into the language of the API key owner where a translation exists, whiledefault_nameis always the stored name. DELETE /allowance-types/{id}is rejected while leave types still draw from the type, while it is any member’s default type, while it still has rules, and for the last remaining type of the workspace.POST /allowance-types/reordersets the order the types appear in throughout the app and inGET /allowance-types. Send every id of the workspace. An id you leave out keeps its old position, which makes the resulting order ambiguous.PUT /allowance-types/{allowance_type_id}/default-rulepoints the organisation default at another rule. New members are put on it unless their department has a default rule of its own; members who already exist are not moved. The rule must be an active, shared rule of that allowance type.
Moving members between rules
POST /members/{member_id}/rule-changemoves a member to another rule. It ends the current assignment onvalid_fromand starts the new rule the same day, in one transaction, so there is neither a gap nor an overlap and the move is recorded as a single audit entry. Prefer it over deleting and recreating an assignment. Pass the assignment you are replacing ascurrent_assignment_id, taken fromGET /members/{member_id}/rule-assignments.POST /members/{member_id}/manual-ruletakes a member off automatic accrual for one allowance type fromvalid_fromon. Nothing accrues afterwards, and the balance is whatever you set through adjustments. Pass the member’s active assignment ascurrent_assignment_idand it is ended in the same transaction; without it, an assignment that overlapsvalid_frommakes the call fail. Sendnullwhen the member has no assignment.- On both endpoints,
valid_fromis the first day covered andvalid_untilis the last day covered, inYYYY-MM-DDformat, the same convention asrule_end_date. Sendnullfor an open-ended assignment. Both require areasonof 3–500 characters. GET /rules/{rule_id}/memberslists the members whose assignment to a rule has not ended yet.limitcaps how many are returned (1–50, default 10) andtotalalways counts all of them. There is no offset, so treat the list as a preview rather than full pagination.
Reading balances and history
GET /members/{member_id}/allowancesreturns every fiscal year of every allowance type the member can use, oldest first, and is the read side of the deprecatedPUTendpoint below.allowanceis the effective entitlement and equalsrule_allowanceplusadjustments: the part the rule granted, plus the part that came from manual adjustments. Allowance types that are switched off for the member are left out.GET /members/{member_id}/allowance-breakdownexplains a single fiscal year the way the ledger does in the app: the rule that was active, what accrued month by month, what was carried over, what expired, and which requests were booked out of it. Whenlegacy_unmigratedorno_allowance_for_yearistrue, there is nothing to explain and the remaining fields are empty.POST /allowances/{id}/revert-carryover-overridedrops a carry-over that was set by hand and recomputes the member’s allowances before the response returns. Theidis themember_allowance_idfrom the breakdown, and thebrought_forwardit returns is the value from before the revert. Read the allowances again for the recomputed figure.- The four audit endpoints answer different questions:
GET /rules/{rule_id}/audit-logfor one rule and its assignments,GET /allowance-types/{allowance_type_id}/audit-logfor every rule of a type,GET /members/{member_id}/rule-audit-logfor which rules a member was put on or moved to, andGET /members/{member_id}/allowance-audit-logfor hand-set balances, carry-over overrides, and deleted adjustments. All return the newest entries first. - On the rule and allowance-type logs,
takecontrols how many entries you get (1–200, default 100); the member allowance history returns at most the 200 newest entries. Thechangesobject depends onevent_type: a rule edit carries{ field: { from, to } }pairs, a rule change carriesfrom_rule_idandto_rule_id. - A member moving to another rule is filed under the rule they moved to, with the previous rule in
changes.from_rule_id. Rules that were deleted keep their history, and the allowance-type audit log is the only place those entries can still be read.