Estimate time to finish a reading list
The reading list time estimator answers the question every reader with a backlog asks: when will I actually finish all these books?
Run — free
Give it your list — each book with its page count — plus how many pages you read per day and the day you start, and it returns a finish date for every book, read in order, together with the total pages, total days and the date the whole list is done. No account, no guesswork: the same arithmetic runs free in your browser and via the API.
Turn a vague backlog into concrete dates
A reading list feels manageable until you ask when it ends. Twenty books, some three hundred pages, some eight hundred, and a pace that changes with the week — doing that arithmetic in your head is how lists quietly become never-finished. The estimate time to finish reading list tool makes the plan explicit: you send the books in the order you intend to read them, your daily pace in pages, and today's date as the start. Each book comes back with the number of days it needs and the exact calendar date you will close its last page, assuming you hold the pace. Seeing 'this novel ends on March 12th, the next one on April 2nd' changes a pile of intentions into a schedule you can react to — speed up, drop a title, or simply enjoy knowing the end is real.
How the estimate is computed
The arithmetic is deliberately simple and honest. Each book takes its page count divided by your daily pace, rounded up to whole days — a 304-page book at 30 pages a day needs 11 days, because the partial last day still counts as a reading day. Days accumulate across the list in order, so the finish date of one book is the day before the next one starts gaining pages. The start date counts as day one, and every date is computed on the real Gregorian calendar, leap years included, so a list started in February lands on the correct March dates. The daily pace must be strictly positive: a pace of zero means the list never finishes, and the tool says so with a clear error instead of a silent infinity. Page counts must be positive whole numbers and dates are validated strictly, so a mistyped '2026-02-30' is rejected rather than silently rolled into March.
Using the result well
Treat the output as a baseline, not a prophecy. Real reading weeks vary, so the most useful habit is to re-run the estimate after finishing each book with your updated list and today's date — the dates recalibrate themselves. You can also use it for planning experiments: raise the pace from 20 to 30 pages a day and watch the final date move, or remove one long book and see what it costs you. The tool runs entirely on deterministic arithmetic with no storage of your list, and it costs $0.002 per request via the API, while the same calculation runs free on this page. Book clubs use it to set realistic deadlines, students to check whether a syllabus fits the semester, and individual readers to finally see the shape of their own backlog. Because every figure is derived from numbers you supplied, the estimate is easy to defend and easy to adjust: change one input and the whole schedule shifts accordingly, with nothing hidden in the middle.
What you can do with it
Plan a personal reading backlog
Enter your to-read pile in order and your honest daily pace to see the calendar date each book — and the whole list — will actually be finished.
Set a book club schedule
Check how many days each title needs at the group's typical pace and pick meeting dates that match reality instead of optimism.
Fit assigned reading into a semester
List the required books with page counts and verify whether the syllabus is finishable before the exam date at your reading speed.
FAQ
What does it cost?
$0.002 per request via the API. It is also free to run in your browser on this page — the same deterministic calculation.
What is the daily pace?
The number of pages you read per day on average. It must be strictly positive; a zero or negative pace is rejected because the list would never finish.
Are the books read in order?
Yes. Books are read one after another in the order you list them, and each finish date includes the days spent on all previous books.
Why does a book need one day even if my pace covers it fully?
Days are counted in whole units with the partial last day rounded up. Any book needs at least one reading day, and a book longer than your pace takes the ceiling of pages divided by pace.
Does it account for leap years and month lengths?
Yes. Dates are computed on the real Gregorian calendar from the start date you provide, so month lengths and leap years are handled correctly.
Is my reading list stored?
No. The list is processed in memory and discarded; only the computed dates are returned.
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/life/reading-list-time-estimate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"books":[{"title":"Dune","pages":412},{"title":"The Left Hand of Darkness","pages":304}],"pages_per_day":30,"start_date":"2026-07-25"}'const res = await fetch("https://api.kit.forhosting.com/life/reading-list-time-estimate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"books": [
{
"title": "Dune",
"pages": 412
},
{
"title": "The Left Hand of Darkness",
"pages": 304
}
],
"pages_per_day": 30,
"start_date": "2026-07-25"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/life/reading-list-time-estimate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"books": [
{
"title": "Dune",
"pages": 412
},
{
"title": "The Left Hand of Darkness",
"pages": 304
}
],
"pages_per_day": 30,
"start_date": "2026-07-25"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/life/reading-list-time-estimate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"books":[{"title":"Dune","pages":412},{"title":"The Left Hand of Darkness","pages":304}],"pages_per_day":30,"start_date":"2026-07-25"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"books":[{"title":"Dune","pages":412},{"title":"The Left Hand of Darkness","pages":304}],"pages_per_day":30,"start_date":"2026-07-25"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/life/reading-list-time-estimate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"books": [
{
"title": "Dune",
"pages": 412
},
{
"title": "The Left Hand of Darkness",
"pages": 304
}
],
"pages_per_day": 30,
"start_date": "2026-07-25"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "life.reading_list_time_estimate",
"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_items | 500 |
max_abs | 10000000 |
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. |