Allocate Exam Time per Question by Points
Create a practical exam pacing plan from the two facts already printed on most assessments: the total duration and the points available for each question.
Run — free
This calculator distributes the available minutes in direct proportion to the point values, so heavily weighted work receives more time while smaller questions receive less. It preserves the complete duration after rounding and keeps the original question order, giving students a useful schedule and instructors a clear way to compare marks with expected effort.
Enter the complete scoring structure
Begin with the full exam duration in minutes and list every question in the same order in which it appears on the paper. Give each item a short recognizable label and copy its maximum point value exactly. The calculator totals those values and treats each question's share of the points as its share of the available time. A twenty-point task on a one-hundred-point paper therefore receives twenty percent of the entered duration. This creates a consistent baseline without requiring assumptions about subject matter or student ability. Zero-point items may remain in the list, which is helpful for instructions, optional prompts, or unscored reflections, but they receive zero suggested minutes. At least one question must have a positive point value. If every value is zero, no proportional relationship exists and the request returns an invalid input error. Check the official scoring scheme carefully before calculating, because one mistyped point value changes every allocation in the resulting plan.
Read the rounded allocation correctly
The result reports suggested minutes to hundredths while ensuring that all displayed allocations add up to the displayed exam duration. That exact total matters because rounding every raw proportion independently can create or remove small amounts of time. The algorithm first gives each question the whole hundredths contained in its mathematical share. It then assigns any leftover hundredths to the questions with the largest fractional remainders. When two remainders are equal, their order on the exam decides which receives the earlier extra hundredth. This largest-remainder method is deterministic, so identical input always produces identical output. It also keeps rounding differences as small as the output precision permits. Extremely short durations combined with many low-point questions can produce an allocation of zero displayed minutes for some items. That outcome does not mean the question should be skipped; it means the chosen duration and display precision cannot give every item a positive slice. Use the result as a realistic warning about an overcrowded assessment or an overly detailed question list.
Turn the schedule into useful checkpoints
A point-based allocation works best as a pacing reference rather than an inflexible command. Students can add the suggested times cumulatively and write checkpoint times beside section boundaries. If the first two questions receive a combined thirty-five minutes, beginning the third near that point offers an immediate indication of whether the attempt is on schedule. Reading and final review time can be reserved before calculation by subtracting those minutes from the total and allocating only the working period. Instructors can compare each suggested allocation with the time they expect a prepared student to need. A low-value prompt that requires a long passage, complicated diagram, or several calculations may reveal a mismatch between effort and marks. Accessibility adjustments can be handled by entering the student's approved duration before calculating; the same point proportions will then apply to the adjusted time. The tool does not estimate difficulty, reading speed, transitions, or personal strengths, so thoughtful manual changes remain appropriate. Its value is providing a transparent, reproducible starting point for those decisions.
What you can do with it
Prepare a student pacing plan
Turn marks into question-level time targets and cumulative checkpoints before the exam begins.
Audit assessment balance
Compare point-based time shares with the effort an instructor expects each task to require.
Apply approved extra time
Recalculate the same scoring proportions using an accommodated total exam duration.
FAQ
How are the suggested times calculated?
Each question receives the same proportion of the duration as its proportion of the total points.
What happens when the total points equal zero?
The request returns an invalid input error because a proportional allocation cannot be calculated from an all-zero total.
May one question have zero points?
Yes. It receives zero suggested minutes as long as at least one other question has a positive point value.
Will the rounded times add up exactly?
Yes. Remaining hundredths are assigned by fractional remainder so the displayed allocations preserve the displayed duration.
What does an API request cost?
The API price is $0.002 per request.
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/edu/exam-time-per-question \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"duration_minutes":120,"questions":[{"question":"Definitions","points":15},{"question":"Analysis","points":35},{"question":"Essay","points":50}]}'const res = await fetch("https://api.kit.forhosting.com/edu/exam-time-per-question", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"duration_minutes": 120,
"questions": [
{
"question": "Definitions",
"points": 15
},
{
"question": "Analysis",
"points": 35
},
{
"question": "Essay",
"points": 50
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/edu/exam-time-per-question",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"duration_minutes": 120,
"questions": [
{
"question": "Definitions",
"points": 15
},
{
"question": "Analysis",
"points": 35
},
{
"question": "Essay",
"points": 50
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/edu/exam-time-per-question", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"duration_minutes":120,"questions":[{"question":"Definitions","points":15},{"question":"Analysis","points":35},{"question":"Essay","points":50}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"duration_minutes":120,"questions":[{"question":"Definitions","points":15},{"question":"Analysis","points":35},{"question":"Essay","points":50}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/edu/exam-time-per-question", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"duration_minutes": 120,
"questions": [
{
"question": "Definitions",
"points": 15
},
{
"question": "Analysis",
"points": 35
},
{
"question": "Essay",
"points": 50
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "edu.exam_time_per_question",
"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. |