PTO accrual balance calculator
This PTO accrual balance calculator turns a per-pay-period earning rate into a current leave balance.
Run — free
Enter the amount of paid time off earned in each pay period and the number of periods completed. If your policy limits how much leave an employee may hold, add that maximum and the result will stop at the cap. The response also shows the uncapped amount and whether the cap changed the final balance, making the calculation easy to explain, review, and reuse.
Translate an accrual policy into the right inputs
Start with the accrual rate stated in the leave policy. It may be expressed as hours per weekly, biweekly, semimonthly, or monthly pay period, or as days when the organization consistently tracks leave in days. Enter that amount as the accrual rate, then count only the pay periods that have actually elapsed for the balance you want to calculate. The calculator multiplies those two values, so both must use the same policy basis. For example, a biweekly rate should be paired with a count of completed biweekly periods, not calendar months. Partial periods are accepted when a policy prorates accrual, but the fraction should come from the employer's stated proration rule. Do not mix hours and days in one calculation, because the result retains the unit of the rate. The tool deliberately does not infer a schedule, employment start date, or payroll calendar. Keeping those assumptions outside the arithmetic makes the result transparent and lets payroll or HR supply the exact period count their policy recognizes.
Understand the uncapped and capped balances
The uncapped balance is the accrual rate multiplied by the elapsed pay periods. When no policy maximum is supplied, that product is also the accumulated balance and the cap indicator is false. When a maximum is supplied, the calculator compares the product with that maximum. If the product is greater, the accumulated balance is reduced to the policy maximum and the cap indicator is true. The uncapped value remains in the response so reviewers can see how much would have accrued without the restriction. If the product exactly equals the maximum, no reduction was necessary, so the cap indicator remains false even though the employee has reached the limit. A maximum of zero is valid for policies that suspend any available balance, while a zero accrual rate or zero elapsed periods produces a zero balance. Values are rounded only to remove insignificant floating-point noise, not to impose a payroll rounding policy. Apply any employer-specific rounding rule before submitting the inputs or after receiving the result.
Use the result in payroll and leave workflows
Use the accumulated balance as a calculation checkpoint rather than a full leave ledger. A production ledger may also need an opening balance, leave already taken, manual adjustments, carryover rules, waiting periods, and accrual pauses. Those events are intentionally not guessed here. Instead, this capability answers one narrow question consistently: how much PTO has accumulated from a fixed rate across a stated number of periods, subject to one optional ceiling? That makes it useful in spreadsheets, onboarding estimates, payroll reconciliation, policy comparisons, and automated audits. Store the inputs beside the output so another reviewer can reproduce the number and confirm that the rate, period count, and maximum came from the applicable policy version. For automation, each request costs $0.002. Reject negative accrual rates rather than treating them as deductions; record leave usage or corrections separately so accrual and consumption remain distinguishable. If a rate changes midyear, calculate each rate segment independently and combine the policy-approved results in the surrounding workflow.
What you can do with it
Check an employee's current accrual
Multiply the policy rate by completed pay periods and see whether the maximum balance limits the result.
Reconcile payroll calculations
Compare a payroll system's PTO figure with a transparent uncapped amount, final balance, and cap indicator.
Model a leave policy
Test rates and balance ceilings across a chosen number of pay periods without building a spreadsheet formula.
FAQ
What does the calculation cost?
Each API request costs $0.002. The calculation uses one item per request.
What unit does the result use?
The result uses the same unit as the accrual rate. Enter hours per period for an hours result or days per period for a days result.
What happens when the balance exceeds the policy maximum?
The accumulated balance is set to the maximum, cap_applied is true, and uncapped_balance preserves the original product.
Can the accrual rate be negative?
No. A negative accrual rate returns an invalid-input error. Record PTO usage or balance deductions in a separate ledger operation.
Can I use fractional pay periods?
Yes. Fractional periods are accepted for policies that prorate accrual, provided the fraction follows the policy's own rule.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/biz/pto-accrual-calc \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"accrual_rate":3.5,"pay_periods_elapsed":12}'const res = await fetch("https://api.kit.forhosting.com/biz/pto-accrual-calc", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"accrual_rate": 3.5,
"pay_periods_elapsed": 12
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/biz/pto-accrual-calc",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"accrual_rate": 3.5,
"pay_periods_elapsed": 12
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/biz/pto-accrual-calc", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"accrual_rate":3.5,"pay_periods_elapsed":12}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"accrual_rate":3.5,"pay_periods_elapsed":12}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/biz/pto-accrual-calc", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"accrual_rate": 3.5,
"pay_periods_elapsed": 12
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "biz.pto_accrual_calc",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |