Next full moon date calculator
The next full moon date calculator estimates the first full moon after a date you provide.
Run — free
Runs in your browser. Free, unlimited — your data never leaves this page.
It uses a fixed reference new moon and the mean synodic month, performs all calendar arithmetic in UTC, and never reads the current clock. The result is therefore reproducible across servers, browsers, devices, and time zones. It is useful when a stable planning estimate matters more than observatory-grade precision. Because the real lunar orbit varies, treat the returned day as an approximation rather than an official astronomical event time.
What the returned date means
Enter one Gregorian calendar date in strict YYYY-MM-DD form. The calculator interprets that input as midnight at the start of the day in UTC, then finds the first modeled full-moon instant that occurs later. The response reports the UTC calendar date containing that instant. This definition makes “next” precise: if a modeled full moon occurs later on the input day, that same date may be returned; an event exactly at the input boundary would not qualify because the calculation asks for an instant strictly after the boundary. The result is designed as a consistent calendar estimate. It does not claim that the Moon will look perfectly full for every observer on that local civil date, since local time zones can place the same astronomical instant on a neighboring date. It also does not calculate moonrise, visibility, weather, altitude, or illumination for a location. Use the value to place a stable approximate marker in a schedule, and use a professional ephemeris when an exact event time is required.
How the mean-cycle model works
The algorithm begins with a reference new moon at 2000-01-06 18:14 UTC and a mean synodic month of 29.530588853 days. Half of that period identifies the modeled reference full moon. The calculator converts the requested Gregorian date to an integer day count using arithmetic rules for leap years and month lengths, without using the JavaScript Date object. It then determines how many complete synodic periods are needed to reach the first modeled full-moon instant after the input boundary. Finally, it converts the resulting day count back to a Gregorian calendar date. Every constant and rule is fixed, so identical input always produces identical output. This simplicity is also the model’s limitation. Real lunations are not all exactly the mean length because the Moon’s orbital speed and the Earth-Moon-Sun geometry vary. The returned date can consequently differ from an authoritative astronomical almanac, especially near a UTC day boundary. It is an approximation intended for reproducible general planning, teaching, testing, and data enrichment.
Validation, automation, and appropriate use
The input must contain a real date with a four-digit year from 0001 through 9999, a two-digit month, and a two-digit day. Impossible dates such as February 30 are rejected instead of being silently normalized. The calculation uses no network request, device locale, current date, stored state, or random value. Those properties make it well suited to automated workflows: a batch process and an interactive browser can reproduce the same answer from the same input, while tests can preserve exact expected results without becoming stale as time passes. The response also names the model, its cycle length, and the reference epoch so downstream users can see the assumptions rather than receiving an unexplained date. For API automation, the base request price is $0.002. This tool should not be used for spacecraft operations, navigation, scientific observation timing, legal deadlines tied to an official lunar calendar, or religious determinations that depend on local sighting rules. In those settings, consult the relevant astronomical or institutional authority.
What you can do with it
Add an approximate calendar marker
Place the next modeled full moon after an event date into a calendar or editorial schedule.
Build deterministic test fixtures
Generate stable lunar-date expectations without depending on the clock, a time zone, or an external ephemeris.
Teach periodic date models
Demonstrate how a reference epoch and a mean repeating cycle map onto Gregorian dates.
FAQ
How accurate is the date?
It is a mean-cycle approximation and may differ from an authoritative astronomical ephemeris, particularly near a UTC date boundary.
What does after the input date mean?
The input is midnight UTC at the start of the supplied day, and the first modeled full-moon instant strictly after that boundary is selected.
Does the calculation use my time zone?
No. Both the input boundary and the returned calendar date are defined in UTC for deterministic results.
Does it use the current date or a live astronomy service?
No. It uses only the explicit input, fixed constants, and Gregorian calendar arithmetic.
What does the API request cost?
The base price is $0.002 per request. The browser execution can use the same pure calculation.
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/next-full-moon \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"date":"2026-07-25"}'const res = await fetch("https://api.kit.forhosting.com/date/next-full-moon", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"date": "2026-07-25"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/next-full-moon",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"date": "2026-07-25"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/next-full-moon", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"date":"2026-07-25"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"date":"2026-07-25"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/next-full-moon", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"date": "2026-07-25"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.next_full_moon",
"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. |