Full-time equivalent calculator
400 hours worked against a 40-hour full-time week is 10 FTE. Enter the group's total hours and the full-time standard for the same period, and get the headcount your budget line asks for, without listing anyone. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Total hours
- 400
- Full time hours
- 40
- Fte
- 10
Full-time equivalent, or FTE, converts a pile of worked hours into the number of full-time jobs those hours would fill. Finance, payroll, grant, and workforce-planning teams need that single headcount-like figure when part-time, seasonal, and full-time people share the same period and the budget is expressed in FTE, not badges. This full-time equivalent calculator takes two finite numbers — the total hours worked by all employees in a period, and the standard full-time hours for that same period — divides them, and returns the FTE count with the formula shown beside the result.
How total hours and a full-time standard become one FTE count
Full-time equivalent is the labor identity that turns mixed schedules into a single headcount-like total without listing every person. You start with the hours actually worked — or contracted — by everyone in the group during one period, then divide by the hours one full-time person would work in that same period. Four hundred hours against a forty-hour full-time week is ten FTE.
Two thousand eighty hours against a two-thousand-eighty-hour year is one FTE. One thousand six hundred sixty-four hours against that same annual standard is zero point eight FTE, the classic four-day or reduced-hours year. Zero total hours is a legitimate outcome and returns an FTE of zero rather than an error: nobody worked, so the equivalent headcount is zero.
What is not legitimate is a full-time standard of zero hours, because dividing by a zero-hour definition does not produce a full-time equivalent. Negative hours and a negative standard are rejected for the same reason. Both numbers must describe the same period and the same hour unit: do not mix weekly totals with an annual standard, and do not mix overtime-inclusive clocks with a contracted week unless that is the policy you mean to model.
You supply two finite numbers that already share one period; the calculator divides them and rounds the FTE half-up to six decimal places so goldens compare byte-for-byte across runtimes. This is the aggregate finance identity used in budgets, grants, and labor-cost models, not a per-person weekly breakdown and not a payroll engine.
Where a full-time equivalent calculator earns its keep
Controllers open a full-time equivalent calculator when a department reports a lump of hours from payroll and the budget line is still written in FTE, not in clock hours. Grant administrators convert effort hours on a sponsored project into the FTE the agency asked for on the face page, using the institution’s annual full-time standard rather than a weekly roster.
Shared-service and outsourcing desks quote coverage as FTE so a client who buys eight hundred hours in a month can see how many full-time seats that buy represents against a one-hundred-sixty-hour month. Workforce planners who already summed hours in a spreadsheet do not want to re-key every name; they want the two-number identity that matches the line they will put in the board pack. Failed validation does not consume balance.
If you instead need a named staff list with a per-person weekly breakdown, that is a different search and a different input contract; this calculator is the aggregate hours-over-standard identity finance teams already use on a single line.
What you can do with it
Budget line from a payroll hour dump
Controllers take total hours from payroll and divide by the policy full-time standard so a mixed-hours department becomes one FTE figure on the budget line.
Grant effort converted to agency FTE
Sponsored-project desks convert effort hours on a grant into the FTE the agency requested, using the institution’s annual full-time hour standard.
Shared-service coverage quoted as seats
Outsourcing teams turn a block of billed hours into FTE seats against a monthly full-time standard so coverage quotes match the client’s headcount language.
FAQ
Can total hours be zero?
Yes. Zero total hours against a positive full-time standard returns an FTE of zero, which is the honest result when nobody worked in the period.
How do I calculate FTE from total hours?
Divide the hours worked by everyone in the period by the hours one full-time person works in that same period. With 400 hours and a 40-hour week, the result is 10 FTE, rounded to six decimals.
Which full-time standard should I use?
Use the hours your budget or policy defines as one full-time job for the period you are measuring: a 40-hour week, a shorter contracted week, or an annual standard if your hours are yearly totals.
Can I compare weekly hours with an annual standard?
No. Both numbers must cover the same period and the same kind of hours. Mixing a weekly total with a yearly standard, or overtime clocks with a contracted week, gives a figure that means nothing.
What if the full-time standard is zero?
The calculation stops instead of returning a number, because dividing by a zero-hour definition of a full-time job has no meaning. A negative standard or negative hours are refused for the same reason.
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/full-time-equivalent \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"total_hours":400,"full_time_hours":40}'const res = await fetch("https://api.kit.forhosting.com/fin/full-time-equivalent", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"total_hours": 400,
"full_time_hours": 40
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/full-time-equivalent",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"total_hours": 400,
"full_time_hours": 40
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/full-time-equivalent", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"total_hours":400,"full_time_hours":40}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"total_hours":400,"full_time_hours":40}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/full-time-equivalent", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"total_hours": 400,
"full_time_hours": 40
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.full_time_equivalent",
"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. |
Technical notes
A full-time standard of zero hours is rejected with invalid_input and is not billed, because dividing by a zero-hour definition does not produce an FTE.
How total hours and a full-time standard become one FTE count
The identity this calculator uses is fte equals total_hours divided by full_time_hours. This endpoint does not walk a named staff roster, does not apply overtime multipliers, does not decide benefits eligibility, and does not annualise a stub period.
Input contract, response shape, and error behaviour
A negative full-time standard is also rejected, because a period definition cannot be less than zero. Zero total hours are allowed: a period with no worked hours against a positive standard produces an FTE of zero, which is the honest going-in result rather than a clamped count. Example: four hundred of total hours and forty of full-time hours yield an FTE of ten. POST a JSON body with two required finite numbers. total_hours is the hours worked by all employees in one period; aliases hours, hours_worked, and total_hours_worked map to the same field so a worksheet can keep its column names. full_time_hours is the standard hours one full-time person works in that same period — a forty-hour week, a thirty-five-hour week, a two-thousand-eighty-hour year, or whatever policy your budget uses; aliases standard_hours, fte_hours, and ft_hours are accepted. Each numeric field may arrive as a JSON number or a numeric string. Missing fields, empty strings, and non-finite values fail with invalid_input naming the field. Negative total_hours is rejected for the same reason. Those failures are not billed. On success the body echoes total_hours and full_time_hours, then reports fte as the rounded count, plus a formula string restating the identity. Pair the JSON with your own note for which hours you counted — regular time only, overtime included, paid leave included — because this endpoint divides the two numbers you send; it does not rebuild a timesheet, strip absences, or convert pay frequencies. Keep full_time_hours strictly positive, pin the rounded FTE in tests, and you get a reproducible full-time equivalent for teasers, LMS plugins, and edge workers without standing up a human-capital management database of your own.
Technical questions
How is full-time equivalent calculated from hours?
Send finite numbers total_hours (greater than or equal to zero) and full_time_hours (strictly greater than zero). The API returns fte = total_hours / full_time_hours, rounded half-up to six decimal places.
What happens if full-time hours is zero?
The task fails with invalid_input. Full-time equivalent is undefined when the full-time standard is zero, so the request is not billed.
Do the two numbers have to cover the same period?
Yes. Both total_hours and full_time_hours must describe the same period and the same hour unit — a week, a month, or a year — or the ratio will not mean FTE for that period.
What does the full-time equivalent calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.