Recurring dates generator
Every 7 days from 1 January to 26 February 2024 gives 9 dates, with the first and last both included. Enter a start, a gap in days and an end to list every date on that cadence for standups, invoice runs or reminders. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Start
- 2024-01-01
- Interval days
- 7
- End
- 2024-02-26
- Quantity
- 9
- Span days
- 56
A recurring dates generator answers a practical planning question: given a first calendar day, a fixed gap of whole days, and a final day, which dates fall on that cadence inside the inclusive window. Teams use it for biweekly standups, weekly invoice runs, every-third-day medication reminders, and any schedule that is not a full cron expression. A non-positive interval is rejected as invalid input so a zero step cannot spin forever.
How the inclusive day-step series is defined
Start is the first candidate occurrence as an ISO calendar date YYYY-MM-DD; ISO-8601 datetimes are accepted and only the calendar date part is used for stepping. Interval_days is a positive integer meaning the gap in whole days between consecutive occurrences—seven for weekly, fourteen for biweekly, thirty for a simple every-thirty-days plan, and so on. End is the last date that may appear in the list; the range is inclusive, so if a stepped date lands exactly on end it is kept.
The engine converts start and end to serial civil day numbers with Howard Hinnant style integer formulas, then emits start, start plus the interval, start plus twice the interval, and so on while the serial day is less than or equal to end. If start is after end the dates array is empty and count is zero rather than an error, which keeps batch jobs simple.
Where the date list helps, and its limits
Call the free in-browser recurring dates generator for planning demos, spreadsheet checks, and product mockups without installing calendar libraries in every language. Source inputs follow the same retention rules as other KIT parse items. Prefer calendar-scale windows for UI tables and keep very dense daily series within the published occurrence cap.
Authors shipping SDKs can map the dates array directly into date pickers, ICS builders, and table columns—the same sequence a planner would write by hand when they mark every N days on a wall calendar from the first day through the last.
What you can do with it
Reminder and medication day grids
Health and habit apps list every N-day dose or check-in between two calendar bounds without embedding full RRULE engines for the simple fixed-gap case.
FAQ
How do I generate recurring dates every N days?
The response includes a dates array of every occurrence in the inclusive range.
What happens if the interval is zero or negative?
Interval_days must be a positive integer so the step cannot loop forever; validation failures are not charged.
Is the end date included?
Yes. The range is inclusive: if a stepped date lands exactly on end, it appears in dates. If start is after end, dates is empty and count is zero.
Is the recurring dates generator free?
The browser tool runs free on your device.
Does it use my local timezone or JavaScript Date?
No. Stepping uses pure Gregorian civil-day arithmetic on the YYYY-MM-DD calendar part only, so results are deterministic across hosts and time zones.
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/date/recurring-dates \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"start":"2024-01-01","interval_days":7,"end":"2024-02-26"}'const res = await fetch("https://api.kit.forhosting.com/date/recurring-dates", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"start": "2024-01-01",
"interval_days": 7,
"end": "2024-02-26"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/recurring-dates",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"start": "2024-01-01",
"interval_days": 7,
"end": "2024-02-26"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/recurring-dates", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"start":"2024-01-01","interval_days":7,"end":"2024-02-26"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"start":"2024-01-01","interval_days":7,"end":"2024-02-26"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/recurring-dates", 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": "2024-01-01",
"interval_days": 7,
"end": "2024-02-26"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.recurring_dates",
"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
This capability computes the series with pure Gregorian civil-day arithmetic, never touching the host clock or floating time zones for the date part, so the same JSON always comes back for the same inputs.
How the inclusive day-step series is defined
Provide three fields: start, interval_days, and end. Missing fields, malformed dates, impossible days such as February thirty-first, and any interval that is zero or negative fail with invalid_input and are not charged. Optional aliases such as from, to, and interval map to the same parameters so SDK callers can use familiar names without changing the mathematics.
Reading the response and choosing a practical interval
Span_days is the signed difference between end and start serial days, useful for UI summaries even when the list is empty. Inclusive is always true so clients do not have to guess boundary rules. Use count alone when you only need how many hits fall in a quarter; use the full dates array when calendars, reminders, or CSV exports need every row. On success the response echoes normalized start and end as YYYY-MM-DD, the interval_days you sent, count as the length of the series, and dates as an ascending array of ISO calendar strings. Method is always recurring_dates so downstream routers can branch without sniffing shapes. Choose interval_days to match the real cadence you mean: one for every day, seven for the same weekday each week starting from start, fourteen for every other week, and larger steps when you only need sparse checkpoints. Cap interval_days at three thousand six hundred fifty so a single request cannot request absurd multi-decade steps; occurrence count is also bounded for Worker safety, so extremely long ranges with a step of one should be split into chunks.
API usage, pricing, workflows, and limits
Send a JSON body with required start, interval_days, and end. Use the prepaid API when a billing pipeline, reminder service, curriculum scheduler, or ops runbook needs a stable contract under KIT balance at $0.002 per successful item; validation failures never consume balance after the engine rejects the request. Pair this endpoint with business-day counters when you must skip weekends and holidays, or with cron next-run tools when you need wall-clock execution times rather than a pure day list.
Integration use cases
Weekly and biweekly planning lists
Product and ops teams generate every Monday-style series from a known start through a quarter end by setting interval_days to 7 or 14 and exporting the dates array to calendars or spreadsheets.
Invoice and report run dates
Finance scripts compute recurring invoice or report days on a fixed day gap and pin the JSON in tests so batch jobs never drift across environments.