Wake-up calculator
Heading to bed at 23:00, with 15 minutes to drift off, 5 cycles wake you at 06:45 and 6 cycles at 08:15. You get one alarm time for every cycle count, so you can pick the one that fits your morning. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Bedtime
- 23:00
- Cycle minutes
- 90
- Cycles
- 6
- Latency minutes
- 15
- Wake up count
- 6
Going to bed at a known hour and still waking groggy is usually a cycle problem, not a willpower problem. This wake-up calculator takes the time you plan to fall asleep, adds a fall-asleep latency, and counts forward in ninety-minute REM and NREM cycles so each suggested alarm lands at the end of a cycle rather than in deep sleep. It returns a list of wake-up times, one for each completed cycle from the longest option down to a single cycle.
How ninety-minute sleep cycles turn a bedtime into wake-up times
A sleep cycle is the roughly ninety-minute sequence in which the brain moves through light sleep, deep slow-wave sleep, and REM. Waking at the end of a cycle, in lighter sleep, usually feels far kinder than an alarm that cuts through slow-wave sleep, which is why so many people search for a wake up calculator rather than a generic hours-of-sleep table. You supply a planned bedtime as a clock string.
The engine converts that clock to minutes since midnight, adds the fall-asleep latency, then adds one complete cycle, two cycles, three cycles, and so on up to the requested count, wrapping past midnight with modular arithmetic on a 1440-minute day. Each result is a wake-up time plus the cycle count, the minutes of sleep that option represents, and the same duration in hours.
Six cycles are nine hours of sleep, five cycles are seven and a half hours, four cycles are six hours, three cycles are four and a half hours, two cycles are three hours, and one cycle is ninety minutes. Adults who want a full night typically pick five or six cycles; nap planners, late-night workers, and parents on a broken night use the shorter options.
Who plans their alarm with sleep cycles
Coaching programs, exam-prep sleep hygiene modules, and late-shift planners can assert the wake-up list against a deterministic oracle instead of hand-maintained spreadsheets that drift when someone forgets midnight wrap. Failed validation does not consume balance. Present the educational disclaimer: ninety-minute cycles are a useful planning heuristic, not a laboratory sleep-stage measurement, and they do not replace clinical advice for insomnia, circadian disorders, or safety-critical work.
Keep requests small, pin the returned wake-up times in tests, and you get reproducible suggestions for widgets, LMS plugins, and edge workers without standing up a sleep-science stack of your own.
What you can do with it
Pick tonight’s alarm from a known bedtime
Enter a 23:00 bedtime and pick a 5- or 6-cycle wake-up so the alarm rings at the end of a cycle rather than in deep sleep.
Short nights and late-shift options
When you cannot lie down until 01:30, list 3- and 4-cycle wake-up times so a truncated night still ends on a cycle boundary.
FAQ
What is a 90-minute sleep cycle in this tool?
It is a planning unit for one typical REM–NREM round. This tool does not measure your stages; it only counts complete 90-minute blocks forward from the bedtime you provide.
What happens if the bedtime is not a valid time?
Send 24-hour HH:MM (00:00–23:59) or 12-hour h:mm AM/PM. Words, dates, and 24:00 are rejected and not billed.
Why is fall-asleep latency fifteen minutes by default?
Most consumer wake-up calculators reserve about a quarter of an hour to fall asleep before the first 90-minute block.
Does this use the current time of day?
There is no Date, no timezone, and no clock read, so the same input always returns the same wake-up times.
How many cycles should I pick for a full night?
Most adults who want a full night choose 5 or 6 cycles, which are 7.5 and 9 hours of sleep. The shorter options suit naps, late shifts and broken nights.
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/health/wake-up \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"bedtime":"23:00"}'const res = await fetch("https://api.kit.forhosting.com/health/wake-up", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"bedtime": "23:00"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/wake-up",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"bedtime": "23:00"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/wake-up", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"bedtime":"23:00"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"bedtime":"23:00"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/wake-up", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"bedtime": "23:00"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.wake_up",
"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
An invalid bedtime fails with invalid_input instead of inventing a clock.
How ninety-minute sleep cycles turn a bedtime into wake-up times
This endpoint treats that ninety-minute block as a fixed unit of arithmetic.
Input contract, clock formats, latency, and error behaviour
Pass zero if you want a pure count-forward of ninety-minute blocks with no latency. POST a JSON body with one required field, bedtime, plus two optional integers. bedtime is a clock, not a calendar date: 24-hour HH:MM from 00:00 through 23:59, with or without a leading zero, or a 12-hour h:mm AM/PM form such as 11:00 PM or 7:30 AM. Aliases time, sleep, bed_time, and fall_asleep are accepted and mean the same field. Anything that is not a valid time—empty strings, missing fields, 24:00, 7:60, midnight as a word, ISO timestamps with a date, and non-strings that do not parse as a clock—fails with invalid_input naming bedtime, and those failures are not billed. cycles defaults to six and must be an integer from one through twelve; it is the longest option in the list, and the response still includes every shorter count down to one so the caller can present a menu. latency_minutes defaults to fifteen and must be an integer from zero through sixty; it models how long you take to fall asleep and is added before the cycle math, because real rest starts after you drift off, not the moment you lie down. On success the body echoes the normalized bedtime in zero-padded 24-hour HH:MM, cycle_minutes equal to ninety, the cycles and latency_minutes that were applied, wake_up_count, a wake_ups array ordered from most sleep to least, and a short formula string. Pair the list with your own reminder UI if you need notifications; this endpoint only computes clock times.
Where a wake-up time API earns its keep
Wellness apps and sleep bots can call a tiny parse API to fill a list of alarm suggestions from a user’s planned bedtime without shipping sleep-cycle arithmetic in every client build and without reading the device clock, which keeps tests deterministic.
Integration use cases
Wellness apps and sleep bots
Embed the same deterministic wake-up list in a chat bot or tracker via the API, tuning latency_minutes per user.
Technical questions
How does the wake-up calculator choose alarm times?
It converts bedtime to minutes since midnight, adds latency_minutes (default 15), then adds n × 90 minutes for n from cycles down to 1, wrapping on a 24-hour clock. Each n is one row in wake_ups.