The CycleCalcs API

A free astronomy API that answers the question, not the coordinates. Ask for the Moon and get "Waning Gibbous, 95% lit, sets at 06:14", not a longitude to decode.

Every answer is computed live by the same engine that powers this site. Start with a single curl, or run one in the browser. Version 1 is frozen and keeps working.

Quick startv2

Every v2 endpoint is a plain GET under /v2/. No headers, no auth, no key. Try tonight's Moon from London:

curl "https://www.cyclecalcs.com/v2/moon?lat=51.5074&lon=-0.1278"

Response (trimmed; the full body also carries bright limb, libration, tropical sign, constellation, and the full geocentric and topocentric position):

{
  "endpoint": "/v2/moon",
  "data": {
    "phase": { "name": "Waning Gibbous", "illumination_percent": 95.2, "day_of_cycle": 18 },
    "summary": "The Moon is a waning gibbous, 95.2 percent lit, 17.4 days into its cycle. It sets at 06:14 and rises at 20:36 UTC.",
    "next_phases": [
      { "name": "Last Quarter", "instant": "2026-08-06T02:21:58.672Z", "days_until": 5.28 }
    ]
  },
  "links": { "docs": "https://www.cyclecalcs.com/api/reference.html#moon" },
  "meta": { "api_version": "2" }
}

Add ?at= (any ISO 8601 date or datetime) to ask about another moment; leave it off for right now. Location (lat and lon, decimal degrees) is optional on most endpoints and required on a few, including /v2/sun, /v2/rise-set, /v2/twilight and /v2/dark-window; each route's entry in the table below says which. Add ?format=csv on endpoints that support it for a spreadsheet-friendly download instead of JSON.

Run it in Postman

The same endpoints as a Postman collection, organised as worked examples rather than a route list: the response contract, the refusals and their cap blocks, field projection and CSV, and a chained observing-night workflow. Its tests assert the answers, not just the status codes. Nothing needs a key, so every request runs the moment you fork it.

Run CycleCalcs Astronomy API in Postman

Or browse it first on the public workspace.

Try it livev2

Pick an endpoint, optionally set a date and a place, and run it against the live API.

Choose an endpoint and press "Run request".

/v2/sun requires a location; the rest work with or without one. Full parameter lists are in the table below and at the endpoint reference.

The 29 v2 routes

Every route is a GET under /v2/. Click a route for its full parameter list, response shape and examples on the endpoint reference.

RouteWhat it returnsFormats
/v2Every endpoint, parameter, convention and limit, as one documentjson
/v2/conventionsEvery threshold, model and limit the API uses, as datajson
/v2/enumsEvery enumerated value the API can emit or acceptThe meteor_showers set is withheld pending a licence review.json
/v2/attributionEvery source behind every endpoint, with its licencejson
/v2/positionsWhere any body is, in any frame, with refraction statedjson, csv
/v2/rise-setRise, transit, set and lower transit for a named objectlat and lon required.json, csv
/v2/sunSunrise, sunset, twilights, day length and azimuth for a placelat and lon required.json, csv, txt
/v2/moonPhase, illumination, bright limb and libration, render-readyjson, csv, txt
/v2/timeEvery time scale, sidereal time, the equation of time, Julian datesjson, csv
/v2/seasonsEvery equinox and solstice in a window, with season lengthjson, csv
/v2/apsidesEvery perigee, apogee, perihelion and aphelion, with distancejson, csv
/v2/moon-nodesEvery ecliptic crossing of the Moon, and the eclipse seasons they definejson, csv
/v2/eclipsesSolar and lunar eclipses with local circumstances and visibilityThe Saros member number is withheld pending a licence review; the series number is published.json, csv, txt
/v2/planet-boardAll eight planets at once: place, brightness, retrograde state, next stationjson, csv, txt
/v2/retrogradesEvery retrograde and direct station, with loop length and arcjson, csv
/v2/planet-eventsThe apparition cycle of Mercury and Venus: conjunctions, greatest elongations, peak brightness and transits, with the current cycle statejson, csv
/v2/conjunctionsClose approaches between body pairs, ranked, with separationjson, csv
/v2/separationAngular separation between two targets, and its minima across a windowjson, csv
/v2/cyclesWhere we are in every astronomical cycle the site tracksjson, csv, txt
/v2/twilightAll three twilights plus day and night as tiling intervalslat and lon required.json, csv
/v2/dark-windowThe genuinely dark, moonless observing window of a nightlat and lon required.json, csv
/v2/sidereal-timeGreenwich and local sidereal time, apparent and meanjson, csv, txt
/v2/equation-of-timeHow far a sundial runs ahead of or behind the clockjson, csv, txt
/v2/librationLunar libration, the sub-Earth point and the terminatorjson, csv
/v2/jupiter-moonsThe four Galilean moons: transits, eclipses and occultationsjson, csv
/v2/sky-qualityLimiting magnitude and aperture reach for a sky class you supplyjson, csv, txt
/v2/placesPlace-name search and reverse lookup, with IANA timezoneGeoNames, CC BY 4.0: attribution required, credited in meta.attribution.text.json, csv
/v2/phasesThe lunar phase calendar: every quarter, distance and supermoon statusjson, csv, txt
/v2/todayThe whole sky for a place, right now, in one requestMeteor-shower events are withheld pending a licence review.json, txt

Start free, grow into it

Every tier serves the same 29 endpoints, the same precision and the same answers. What money buys is volume, and how much sky one request may ask for. Most integrations live on the free tier indefinitely; that is the design, not a trial.

The table scrolls sideways. The first column stays put.

The four tiers compared: who each one suits, how many requests you may make, and the largest range a single request may ask for. Everything else is identical on every tier and is listed under the table.
Basic Free no key needed Pro $5 a month Recommended Ultra $9 a month Mega $15 a month
Start now Available on RapidAPI Available on RapidAPI Available on RapidAPI
Suited to One small app A script, a page, or a product that fits the free day. One busy app Traffic that outgrew the free day. A live product Backfills, and traffic you do not control. Several products Bulk jobs, or several apps on one key.
The step up daily volume, against the rung below The baseline 10x Basic 2x Pro 2x Ultra
Volume: how many requests you may make
Requests a minute 300 600 1,200 2,000
Requests an hour 2,000 10,000 25,000 50,000
Requests a day 5,000 50,000 100,000 200,000
Requests a month metered by RapidAPI, not by the API 5,000 a day no monthly meter 500,000 10 days at the daily cap 800,000 8 days at the daily cap 1,000,000 5 days at the daily cap
Range: how much sky one request may ask for
Daily rows, one body one body over a date range; on the fattest endpoints the response size binds first 366 up to one year 1,830 up to five years 3,660 up to ten years 3,660 up to ten years, same as Ultra
Daily rows, all bodies every body, one row a date 93 up to three months 366 up to one year 366 up to one year, same as Pro 366 up to one year, same as Ultra
Sub-daily grid days one hourly or finer grid may span 31 up to one month 93 up to three months 186 up to six months 186 up to six months, same as Ultra
Events in one list eclipses, conjunctions, phases 100 400 500 500 same as Ultra

Identical on every tier

Nothing here is held back for a paid rung, which is why there is not one cross in the table above.

  • All 29 endpoints
  • Every field, full precision
  • The same answer, to the last digit
  • JSON, CSV and TXT
  • RFC 9457 error documents
  • RateLimit headers on every response
  • CDN cache hits, which cost nothing
  • The MCP server

No tier changes an answer. The limiter only counts requests that reach the origin, and a deterministic query is served from the CDN, so asking for a range in one request rather than one request per day keeps most integrations far below every number above.

Recommended: Ultra, $9 a month

Available on RapidAPI

Or start on Basic now: no key, no signup, no card, and inside /v2 its published limits can only ever go up.

Ultra and Mega carry the same range caps, so above Ultra you are buying volume, not reach: if the size of one request is what bounds you, Ultra is the last rung that changes it. Range maxima are per request shape, and on the largest endpoints the response-size bound binds before the tier bound; a refusal always names which one applied.

The paid rungs sell through the RapidAPI listing, which issues the key and handles billing. A subscriber's requests arrive through RapidAPI's gateway and are served at their plan's caps; the direct API stays keyless and free, which the keys page states as data.

Outgrowing Mega, or needing a shape the tiers do not fit? Contact us at info@cyclecalcs.com.

Going over returns 429 with a Retry-After you can honour, never a silently truncated answer, and the RateLimit and RateLimit-Policy headers carry your remaining budget so a client can back off before it is throttled rather than after.

These are a floor, not a ceiling: the versioning policy makes tightening a published limit a breaking change that never happens inside /v2, so these numbers can only ever go up. Full detail, including the headers and what a 429 looks like, is on API status and limits.

Version 1 has no hard limit but is meant for fair, cached use of a few requests a second; see its own fair use note.

More v2 documentation

Frequently asked questions

Is the CycleCalcs API free?

Yes. The free Basic tier needs no key, no signup and no card, and inside /v2 its published limits can only ever go up, by the versioning policy. Three paid tiers, Pro at 5 dollars a month, Ultra at 9 and Mega at 15, sell monthly volume through the RapidAPI marketplace, which issues and bills the key. No tier changes an answer.

Do I need an API key?

No. The direct API needs no key and is served at the free Basic tier, and any key you send it is ignored with a disclosed warning. The paid tiers sell through RapidAPI, whose gateway holds the key; a subscription buys a higher rate limit and larger single requests, exactly as api/keys.html describes, and nothing else.

What are the rate limits?

Version 2 enforces 300 requests a minute, 2,000 an hour and 5,000 a day per caller. A caller is an IP address for direct keyless requests and an individual subscriber behind the RapidAPI gateway, so a backend that proxies every request for its users counts as one caller, while browsers or devices calling directly each count as their own; that is what the open CORS is for. Limits are reported on every response in the RateLimit header. Version 1 has no hard limit but is meant for fair, cached use of a few requests a second.

How accurate is it, and how should I credit it?

Positions are reliable from 1700 to 2200, in UTC; see api/accuracy.html for the full statement. Responses are computed facts and need no attribution, with one exception: /v2/places serves GeoNames data under CC BY 4.0 and requires the credit named in its meta.attribution.text.

What happened to version 1?

Nothing, on purpose. Version 1 is frozen: its endpoints, fields and behaviour will not change, so integrations built against it keep working. All new development happens on version 2; the version 1 page gives the version 2 equivalent of every version 1 route.

Older versions

Version 1 is frozen and keeps working. Its six endpoints answer exactly as always; nothing built against them breaks. The full v1 documentation, its fair-use note and the field-by-field migration map to v2 now live on their own page, so this one can stay about the current version.

Version 1 documentation and migration guide →

Terms of use

The short version: the answers are computed astronomical facts and facts are yours to use, commercially or not; keep each response's attribution string in place, stay inside the published limits, and nothing here is navigation or safety advice. Provided as is, no warranty. The full terms say all of this precisely, and versioning promises that v1 never changes and v2 only grows.

All API documentation