Sunscreen reapplication schedule
Dermatologists recommend reapplying sunscreen about every two hours of sun exposure, and sooner after swimming or heavy sweating, but almost nobody can turn 'every two hours from 9:30 until 15:30' into actual clock times while packing a beach bag.
Run — free
This capability does that arithmetic for you: give it the time of your first application, the reapplication interval in hours and the total exposure duration, and it returns the complete schedule — the initial application plus every reapplication with its exact time, including day rollover if your exposure runs past midnight. It is pure deterministic arithmetic: same input, same schedule, every time, with no account, no storage and no guesswork. Use it free on this page, or call the API for $0.002 per request to build reminders into your own app.
Why reapplication timing matters
Sunscreen does not last all day. UV filters degrade in sunlight, and the film on your skin is physically removed by sweat, water, towel drying and simple contact with clothing. That is why every major dermatology association recommends reapplying at least every two hours during continuous exposure, and immediately after swimming or heavy perspiration, regardless of the SPF on the label. A single morning application at 8:00 offers little meaningful protection by lunchtime. The problem is that the recommendation is expressed as an interval, while people live by the clock: knowing you should reapply 'every two hours' does not tell you whether that means 11:15 or 11:40 after a late start and a swim. Miscounting by one interval silently leaves an hour of unprotected skin. A precise sunscreen reapplication schedule converts the interval rule into concrete times you can set as phone alarms, which is the difference between a rule you vaguely remember and a habit you actually follow through a long day outdoors.
How the schedule is computed
The algorithm is deliberately simple and transparent. You provide three values: the start time of the first application in 24-hour HH:MM format, the reapplication interval in hours, and the total exposure duration in hours. Internally everything is converted to minutes from midnight, the interval is added repeatedly to the start, and every step that falls within the exposure window becomes a reapplication — including one that lands exactly at the end of the window. Times that roll past midnight wrap to the next day and are labelled with a day number, so a 22:00 start with a six-hour duration produces early-morning times on day two rather than impossible hours. The interval and duration must both be positive numbers; a zero or negative interval is rejected with a clear invalid-input error instead of producing an infinite or empty schedule. There is no clock dependency anywhere: the output depends only on your input, which makes the result reproducible and safe to cache, audit or regenerate.
Choosing the right interval
The interval you pass should reflect what you are actually doing, not just the label on the bottle. The standard baseline is two hours of continuous exposure, which suits a normal day outdoors with moderate activity. Shorten it to one hour or eighty minutes — expressed in decimal hours — when you are in and out of the water, sweating heavily, or towelling off regularly, because each of those physically removes the protective film. Water-resistant formulas extend the film's life under water, typically to forty or eighty minutes of swimming, but they do not change the reapplication rule afterwards. If your day mixes activities, run the calculator once per phase: a two-hour schedule for the morning walk, a shorter interval for the pool session, and back to baseline for the afternoon. Keep in mind that no schedule replaces using enough product — roughly a shot-glass full for the body — or shade during peak UV hours. The schedule tells you when; the amount and the SPF still do the protecting.
What you can do with it
Beach-day alarm plan
Generate the full list of reapplication times from arrival to departure and set one phone alarm per entry before leaving home.
Kids' outdoor camp reminders
Print the schedule for a camp counsellor so a group of children is reprotected on time throughout a full day outside.
Reminder logic in a health app
Call the API with the user's start time and planned exposure to push notifications at each computed reapplication time.
FAQ
What does it cost?
$0.002 per API request. It is also free to run in your browser on this page.
What interval should I use?
Two hours is the standard recommendation for continuous exposure. Use a shorter interval — one hour or less — after swimming, heavy sweating or towel drying, even with water-resistant formulas.
What time format does it accept?
A 24-hour HH:MM string such as 09:30 for the first application. All times in the result use the same format.
What happens if my exposure goes past midnight?
Times wrap to the next day and each entry carries a day number, so day 1 is the start day and day 2 is the following one.
Why was my interval rejected?
The interval must be a positive number of hours. Zero, negative or non-numeric values are invalid because they cannot produce a meaningful schedule.
Does the tool store my data?
No. The computation is pure arithmetic over your three inputs; nothing is stored and the same input always returns the same schedule.
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/beauty/spf-reapply-schedule \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"start":"09:30","interval_hours":2,"duration_hours":6}'const res = await fetch("https://api.kit.forhosting.com/beauty/spf-reapply-schedule", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"start": "09:30",
"interval_hours": 2,
"duration_hours": 6
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/beauty/spf-reapply-schedule",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"start": "09:30",
"interval_hours": 2,
"duration_hours": 6
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/beauty/spf-reapply-schedule", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"start":"09:30","interval_hours":2,"duration_hours":6}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"start":"09:30","interval_hours":2,"duration_hours":6}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/beauty/spf-reapply-schedule", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"start": "09:30",
"interval_hours": 2,
"duration_hours": 6
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "beauty.spf_reapply_schedule",
"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. |