Annuity payment calculator
Borrow 10,000 at 1% a month over 12 months and exactly one installment clears it: 888.49. Use it to price a loan payment, size withdrawals from a savings pot or check a lease quote. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Principal amount
- 10,000
- Rate per period
- 0.01
- Periods
- 12
- Payment
- 888.49
Use it to price a loan installment, size the withdrawal from a retirement pot or check the lease quote a dealer just handed you — one deterministic call, no spreadsheet, no signup.
What an annuity payment actually is
An annuity is a stream of equal payments made at regular intervals — monthly loan installments, quarterly pension withdrawals, annual lease charges. The payment is the number that makes the whole stream equivalent, at the given interest rate, to the principal today. The formula behind it, payment = principal × r ÷ (1 − (1 + r)^(−n)), is the same one every bank, landlord and pension fund uses, derived from discounting each future payment back to today and solving for the level amount.
Because the rate is expressed per period, the calculation works for any cadence: a monthly rate with monthly periods, an annual rate with annual periods, or any other consistent pair. What matters is consistency — the rate and the period count must describe the same interval. Send a monthly rate with a period count measured in years and the answer will be wrong by construction, and no calculator can rescue mismatched units.
Keep the two aligned and the result is exact, deterministic and reproducible on any machine, which is why the same computation runs identically in your browser and on our edge.
Inputs, units and edge cases
The principal is the present value of the annuity: the loan amount, the pot being drawn down, the price being financed — it must be positive. The periods field is the number of payments and must be a positive integer up to 1200, which comfortably covers a hundred years of monthly payments. Two edge cases are handled deliberately.
And the returned payment is rounded to two decimals — cents — so the response is byte-for-byte stable between runs and between machines. If you need more precision, keep full precision on your side and treat the returned value as the canonical settled amount.
How to use it well and what it does not do
Typical uses fall into three patterns. Lenders and marketplaces call it to quote an installment before running a full underwriting flow, because the payment is the first number a customer asks for. SaaS products embed it behind their own pricing calculators so the math is maintained in one place instead of re-implemented — often incorrectly — in every frontend.
And finance teams use it to reverse-check quotes they receive: if a dealer's monthly figure does not match the formula, something else, a fee or an insurance premium, is hiding in the payment. And it models no fees, taxes, balloons or rate changes. When your case fits the plain annuity model, this is the right tool; when it does not, compute the payment here as a baseline and layer the extras on top in your own code.
What you can do with it
Quote a loan installment
Return the monthly payment for a financed amount and rate before the customer commits to a full application.
Size retirement withdrawals
Compute the fixed withdrawal a lump sum can sustain over a chosen number of periods at an expected return.
Reverse-check a dealer quote
Compare the quoted monthly payment against the formula to expose hidden fees or bundled extras.
FAQ
Is the rate a percentage or a decimal?
A decimal per period: 0.01 means 1% per period. Divide an annual percentage by 100 and then by the number of periods per year.
What happens with a 0% rate?
It is supported: the payment is simply the principal divided by the number of periods, which is the exact limit of the annuity formula at zero interest.
Does it return the full amortization schedule?
No. It returns the payment amount only. The period-by-period schedule is a separate capability.
Is it an annuity due or an ordinary annuity?
An ordinary annuity: payments are assumed at the end of each period. For annuity-due payments, multiply the result accordingly on your side.
How can I check a dealer's monthly payment quote?
Enter the amount financed, the rate per period and the number of payments. If the dealer's monthly figure is higher than the result, something else, such as a fee or an insurance premium, is hiding in the payment.
Related tools
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/fin/annuity \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"principal":10000,"rate_per_period":0.01,"periods":12}'const res = await fetch("https://api.kit.forhosting.com/fin/annuity", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"principal": 10000,
"rate_per_period": 0.01,
"periods": 12
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/annuity",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"principal": 10000,
"rate_per_period": 0.01,
"periods": 12
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/annuity", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"principal":10000,"rate_per_period":0.01,"periods":12}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"principal":10000,"rate_per_period":0.01,"periods":12}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/annuity", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"principal": 10000,
"rate_per_period": 0.01,
"periods": 12
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.annuity",
"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.
Limits
max_periods | 1200 |
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. |
Technical notes
The annuity payment API answers one of the oldest questions in finance: given a sum of money today, an interest rate per period and a number of periods, what fixed payment extinguishes the balance exactly on schedule? It applies the closed-form annuity formula and returns the payment amount, nothing more and nothing less.
What an annuity payment actually is
Borrow 10,000 at 1% per month for 12 months and there is exactly one monthly amount that brings the balance to zero with the last payment: that amount is what this endpoint returns.
Inputs, units and edge cases
The endpoint takes three numbers. The rate per period is a decimal, so 1% per month is 0.01, not 1 and not 0.01% — and it must be non-negative; a negative rate is rejected with an invalid_input error and is never charged. A zero rate is legal and means simple division: with no interest, the payment is exactly the principal split across the periods, which is the correct mathematical limit of the formula as the rate approaches zero, so the endpoint returns it directly rather than failing on a division by zero.
How to use it well and what it does not do
It is worth being clear about what the endpoint deliberately leaves out. It returns the payment only; it does not produce the period-by-period amortization schedule with the split between interest and principal — that is a different capability. It assumes an ordinary annuity, meaning payments land at the end of each period; annuities due, where payments come at the start, differ by one factor of (1 + r). Those omissions are what keep it fast, cheap at $0.002 per request, and exactly predictable.
Technical questions
What does it cost?
$0.002 per request via the API. It is also free to run in your browser on this page.
Why was my negative rate rejected?
A negative interest rate has no meaning for this payment model, so the request fails with invalid_input and is not charged.