Iqamah prayer times API

Free azaan times for any point on Earth, by month or year. No key, no sign-up; responses are cached at the edge.

Endpoints

EndpointReturns
GET /v1/times/{lat},{lon}/{yyyy-mm}.jsonA month of times for a point
GET /v1/times/{lat},{lon}/{yyyy}.jsonA year of times
GET /v1/ics/{lat},{lon}.icsA calendar feed of the next 60 days, to subscribe to
GET /v1/mosques/near/{lat},{lon}.jsonMosques near a point, nearest first (see Mosque times)
GET /v1/mosque/{id}.jsonA mosque's iqamah and Jumu'ah times, as it publishes them, with azaan from every source (see below)
GET /v1/methods.jsonMethods, their angles and the default for each country
GET /openapi.jsonThis API described in OpenAPI 3.1, for code generators and API tools
GET /embed/v1.jsThe same calculation in the browser, plus a drop-in widget (see below)

Example: /v1/times/41.88,-87.63/2026-11.json

Parameters

NameValues
methodOne of the methods below. Default: the usual method in the location's country (see methods.json). A country default can carry its own angle: Germany's is MWL with Isha at 16.5°, the common practice there. Naming a method, even method=mwl, gives that method as published.
asrstandard (Shafi'i, Maliki, Hanbali) or hanafi. Default by country.
highlatmiddle_of_the_night (default), seventh_of_the_night, twilight_angle: how Fajr and Isha are set where twilight does not end.
tzAn IANA time zone, to override the one found from the coordinates (useful near borders).
langen, ar, fr, id, ms, tr, bn, ur: adds prayer names in that language and a written Hijri date.
fajr_angle, isha_angleDegrees below the horizon (above 0, at most 30), replacing the method's own angle; an Isha angle also replaces a fixed Isha interval. Not with method=moonsighting, which sets Fajr and Isha by season.
sourceauto (default): the official authority timetable where one covers the location (see below), otherwise calculated. official: only the authority's times (404 no_official_source elsewhere). calculated: never the authority's.

Methods

methodName
mwlMuslim World League
isnaIslamic Society of North America
egyptianEgyptian General Authority of Survey
karachiUniversity of Islamic Sciences, Karachi
umm_al_quraUmm al-Qura University, Makkah
dubaiDubai
kuwaitKuwait
qatarQatar
singaporeMajlis Ugama Islam Singapura
turkeyDiyanet İşleri Başkanlığı, Turkey
tehranInstitute of Geophysics, University of Tehran
moonsightingMoonsighting Committee Worldwide
jakimJAKIM, Malaysia

Response

{
  "location": { "lat": 41.88, "lon": -87.63, "tz": "America/Chicago", "country": "US" },
  "source": { "kind": "calculated" },
  "method": { "id": "isna", "name": "Islamic Society of North America", "fajr": 15, "isha": 15,
              "adjustments": { "dhuhr": 1 }, "asr": "standard", "highlat": "middle_of_the_night" },
  "days": [
    { "date": "2026-11-01", "hijri": "1448-05-21",
      "fajr": "05:05", "sunrise": "06:23", "dhuhr": "11:35", "asr": "14:19", "maghrib": "16:45", "isha": "18:03",
      "utc": { "fajr": "2026-11-01T11:05:00Z", "...": "..." } }
  ],
  "api_version": "1c.1",
  "defaults_version": "2026-11-13"
}

Times are local to the location's time zone, 24-hour, rounded to the minute; utc gives the same instants in UTC. A time that cannot occur (the sun does not rise near the poles) is null. Above 48° latitude the response marks Fajr and Isha as approximated.

Official timetables

Where a national authority publishes the times, source=auto serves them as published, and each day also carries calculated: the same prayers from method (or the authority's own method), so you can show either. source in the response names the authority and zone, and hijri_official gives the authority's Hijri date where it publishes one. If a zone's timetable is unavailable, the response is calculated with the authority's method and source.note says so.

CountryAuthorityZones
MalaysiaJAKIM e-Solat60 zones; method jakim (18°/18°, 2 minutes ihtiyat)

Prayer times for Malaysia: Jabatan Kemajuan Islam Malaysia (JAKIM), e-Solat. Zone boundaries derived from geoBoundaries (CC BY 3.0, geoBoundaries and citypopulation.de). Timetables are refreshed weekly.

Mosque times

/v1/mosque/{id}.json gives one mosque's congregation (iqamah) times and Jumu'ah, from the mosque's own website or timetable provider, for every day we hold from today on. {id} is the mosque's Iqamah ID; find one with the search below.

Finding a mosque: /v1/mosques/near/{lat},{lon}.json lists the mosques within radius_km (2, 5, 10 (default), 25 or 50) of a point, nearest first: id, name, distance_km, location, city and country, has_source (whether we can read its times), and the url of its times. limit (1 to 50, default 20) caps the list; total says how many matched. q keeps only names containing it, ignoring case and accents. The list is rebuilt nightly and cached for an hour, so a newly added mosque appears the next day. Example: /v1/mosques/near/51.52,-0.07.json

Calendar feed

Subscribe to https://api.iqamah.net/v1/ics/{lat},{lon}.ics in Google Calendar (Other calendars → From URL), Apple Calendar (File → New Calendar Subscription) or Outlook (Add calendar → Subscribe from web). It holds Fajr, Dhuhr, Asr, Maghrib and Isha for the next 60 days as 15-minute events marked free, and takes the same parameters as the times endpoint; lang names the events. Calendar apps refresh it about once a day. Example: /v1/ics/41.88,-87.63.ics

Embed

One script tag gives a page the same calculated times as the API with no further requests: it calculates in the browser with the same code. It does not carry official timetables; for those, request the API.

<script src="https://api.iqamah.net/embed/v1.js" defer></script>

<!-- A ready-made table of today's times, next prayer highlighted -->
<div data-iqamah-times data-lat="41.88" data-lon="-87.63"></div>

<!-- Or your own markup -->
<script>
  addEventListener("DOMContentLoaded", () => {
    const today = IqamahTimes.today({ lat: 41.88, lon: -87.63 });
    console.log(today.fajr, today.isha);  // "HH:MM", local to the location
    const nov = IqamahTimes.month({ lat: 41.88, lon: -87.63, month: "2026-11" });
  });
</script>

IqamahTimes.today(options) and IqamahTimes.day({ ...options, date }) return one day as in the API's days; IqamahTimes.month({ ...options, month }) returns the same document as the month endpoint; IqamahTimes.settings(options) shows the settings in force. Options are lat, lon and the parameters above. The widget takes them as data- attributes (data-method, data-asr, data-lang, data-fajr-angle…) and its colours from --iqamah-accent, --iqamah-bg, --iqamah-text, --iqamah-muted and --iqamah-line.

Canonical URLs

Each answer has one URL. Coordinates are rounded to 2 decimals (about 1 km), parameters are sorted, and any parameter equal to the location's default is dropped. Other spellings get a 301 redirect to the canonical URL, so cache it, not the original.

Errors

Errors are JSON: {"error":{"code":"bad_coordinates","message":"…"}}. The code values are stable; the messages may change: bad_coordinates, bad_date, bad_method, bad_asr, bad_highlat, bad_tz, bad_lang, bad_source, bad_angle, bad_radius, bad_limit, no_official_source, not_found, rate_limited, blocked, temporarily_unavailable.

Fair use

The API is free and needs no key. To keep it that way for everyone:

Uncached requests are limited per client; past the limit the API answers 429 with "code":"rate_limited" and a Retry-After header. Questions or a higher limit: api@iqamah.org. To report abuse or ask about a block: support@iqamah.org.

Terms of use

Examples

Working examples in JavaScript, Python, a web page, Home Assistant and an ESP32 clock: github.com/shakillangha/iqamah-prayer-times-api.

Calculation

Times are computed with the open-source adhan library, the same one the Iqamah app uses, so they match what users see there.