Welcome to the absentify developer documentation
Use the REST API to read and write absence data, manage allowances, and connect absentify to other tools. Start with the quick start, or go to webhooks for event notifications.The API requires a Plus plan; see the plan feature matrix. The included limit is 150 requests per second per IP. You can raise that to 1500 requests per second by contacting support for current pricing.
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/mcpLocalized names
Endpoints that return leave-type or allowance-type names accept an optionallocale (en, de, fr, hu, it, pl, pt, ru, es, tr, or uk). On GET requests it is a query parameter.
When you send locale, name uses that language if a translation exists, otherwise the stored name. Responses always include default_name, the stored name, whether you send locale or not. An unsupported value such as DE or de-DE returns 400.
If you omit locale, existing name values stay as they are. Leave-type names stay as the stored name. Allowance-type names still follow the language of the member who owns the API key.
On GET /requests_per_day, month, weekday, and fullday also use locale when you send it.
POST /leave_types and PUT /leave_types/{id} accept an optional translations array of { language, name } objects, the same pattern as allowance types. Sending translations replaces the stored set. Omit the field to leave them unchanged.
Current webhook payloads send the stored name only. They do not accept locale.
Managing 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. Users 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 write endpoints require an authenticated administrator. The read-only
GET /allowance-types,GET /allowance-types/{id}, andGET /members/{member_id}/allowancescan also run in an authenticated manager’s context for members that manager may see. Workspace API keys can only be created and used by active administrators; a manager context can come from a validated Microsoft Entra ID Bearer token. GET /allowance-typesreturns the ids that every rule, rule assignment, adjustment, and balance endpoint expects asallowance_type_id. Each type also includesdefault_rule_idanddefault_rule_manually_managed. Whendefault_rule_manually_managedistrue, new members are managed manually unless their department selects a rule.- 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.GETalso returnscoverage_start_dateasYYYY-MM-DD. - On a rule assignment,
rule_start_dateis the first day the assignment itself applies, inclusive. For assignments created by absentify, that is often the start of the fiscal year. It does not change when a member joins later or when you correct their employment start date.GETreturns the same value thatPOSTandPATCHaccept, so you can send a value you read straight back. coverage_start_dateis the first day this member actually accrues, inclusive. Use this field when you need the day entitlement begins. It isrule_start_date, or the member’semployment_start_datewhen they joined after the assignment began. It stays onrule_start_dateif there is no employment start date, if they were already employed on the assignment start, or if the assignment ended on or before they started. The field is read-only.POSTandPATCHdo not accept it. Do not write it back intorule_start_date. Correcting the employment start date later updatescoverage_start_dateon the next read.rule_end_dateis the last day the assignment applies. To cover a member through August 31, 2026, send2026-08-31. Sendnullfor an open-ended assignment.- On
PATCH /rule-assignments/{id}, omitrule_end_dateto leave the current end date unchanged, and sendnullto make the assignment open-ended. - On an adjustment,
expiry_dateis the last day the granted amount can still be used, the same inclusive convention asrule_end_date. To let an amount expire after August 31, 2026, send2026-08-31. It can be the same day as the adjustment’sdate, and an earlier date is rejected. - 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.month= whole months count fully, the partial start or end month is prorated by day;day= calendar-day exact;full_monthcounts only whole months as 1/12 each, a started month counts nothing.nonegrants the full yearly amount when employment starts or ends in that rule year. Every other partial year, such as a switch to another rule or an assignment that starts or ends during the year while the member is employed, still counts its months. It defaults tomonthand is ignored for monthly and bi-weekly cycles.nonecannot be combined withrule_duration. The API then returns Always the full amount can’t be combined with an expiry for each grant. Workspaces that still have balances from before rules existed can also see a refusal whennonewould cover a year in which that member joined or left.rule_amountonPOST /allowance-types/{allowance_type_id}/rulesand onPATCH /rules/{id}must be greater than 0. To manage an allowance manually with no automatic accrual, assign the member withPOST /members/{member_id}/manual-ruleinstead of creating a rule with amount 0.DELETE /rules/{id}requiresreassign_towhenever members are still assigned to the rule. Those members keep the deleted rule until the first fiscal-year start on or after today, then move to the replacement. They never move mid year.- 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.
Rule assignment chains
Assignments for one allowance type form a chain. An end date (rule_end_date or valid_until) is only accepted on the day before the next assignment starts, or on the member’s last employment day. Leave it null when nothing follows. Gaps or overlaps that already existed are tolerated, but a write may not widen them. DELETE /rule-assignments/{id} extends a neighbouring assignment to cover the removed period: the preceding one extends forward, or, when there is none, the following one reaches back.
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,
nameuseslocalewhen you send one. Withoutlocale, it still follows the API key owner’s language.default_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-rulesets the organisation default for new members. Sendrule_id: nullto set manual management as the organisation default. Only a non-nullrule_idmust be an active, shared rule of that allowance type. Allowance-type responses includedefault_rule_manually_managed; when that flag istrue, new members are managed manually unless their department selects a rule. New members are put on that default unless their department has a default of its own. Members who already exist are not moved.
Moving members between rules
POST /members/{member_id}/rule-changemoves a member to another rule. It ends the current assignment on the day beforevalid_fromand starts the new rule onvalid_from, 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. Avalid_untilis only accepted on the day before the next assignment starts or on the member’s last employment day, so sendnullwhen nothing follows. Gaps or overlaps that predate this call are tolerated, but the move may not widen them.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. Avalid_untilis only accepted on the day before the next assignment starts or on the member’s last employment day, so leave itnullto stay open ended. Gaps or overlaps that predate this call are tolerated, but the switch may not widen them.- 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.rule_allowanceis the part the rule granted.adjustmentsincludes administrator corrections and the adjustment set by the deprecatedPUT, excluding overtime compensation. Overtime compensation is returned separately ascompensatory_time_off. 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 balances that were set directly, whether by an administrator or through the deprecatedPUT, plus 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 deleted rule with members carriesreassigned_to(the replacement rule id) orreassigned_to_manual(true), pluseffective_from(the fiscal-year start when they move). - 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.