---
title: "Update an allowance rule"
method: PATCH
path: "/rules/{id}"
tags: ["Allowance Management"]
---

# Update an allowance rule

`PATCH /rules/{id}`

Updates an existing allowance rule. Only provide the fields you want to change. Changes are applied to all members subscribed to this rule.

## Path parameters

- `id` string, uuid, required

## Request body

- object
  - `name` string
  - `accrual_month` integer
  - `rule_amount` number — Allowance amount per accrual cycle. For hour-based allowance types the value is in MINUTES (e.g. 480 = 8 hours).
  - `accrual_cycle` 'month' | 'year' | 'biweek'
  - `accrual_anchor_date` string, nullable
  - `cycle_on_employment_start` boolean
  - `rule_duration` integer, nullable — Per-accrual rolling expiry in months (each accrual valid this many months from its accrual date). Min 1; null = off. Cannot be combined with any carry-forward setting, and is not allowed on a 0-amount (manual) rule.
  - `upfront_allocation` boolean
  - `proration_basis` 'month' | 'day' — How partial yearly rules are prorated. month = whole months count fully, the partial start or end month is prorated by day; day = calendar-day exact. Ignored for monthly and biweekly cycles. Defaults to month.
  - `max_carry_forward` number, nullable — Hard cap on the amount carried into the next fiscal year, applied at the year boundary. null = unlimited (everything carries), 0 = nothing carries. For hour-based allowance types the value is in MINUTES.
  - `carry_forward_expiry_months` integer, nullable — How long carried-forward allowance stays usable in the new fiscal year. null = it never expires; N (>= 1) = months after fiscal year end.
  - `carry_forward_kept_after_expiry` number, nullable — Amount surviving permanently after the expiry deadline. Requires carry_forward_expiry_months; must be lower than max_carry_forward when both are set.
  - `reason` string — Why this rule is being changed — stored in the rule audit log.

## Response `200`

Successful response

- object
  - `count` number, required

## Other responses

- `400` — Invalid input data
- `401` — Authorization not provided
- `403` — Insufficient access
- `404` — Not found
- `500` — Internal server error

---

[API](https://skmtc.net/absentify/apis/absentify-crud-api.md) · [All operations](https://skmtc.net/absentify/apis/absentify-crud-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/absentify/absentify-crud-api/revisions/ef777d51e6f2/schema)
