jadwal sholat

Prayer times for your app, agent or terminal.

Every Indonesian city and regency on the Kemenag RI method, plus any coordinates in the world. No key, no signup, CORS open.

Quick start

Terminal: today, as text
curl sholat.zakiego.com/banjarbaru
JSON
curl https://sholat.zakiego.com/api/v1/schedule/banjarbaru
JavaScript
const res = await fetch("https://sholat.zakiego.com/api/v1/next/surabaya")
const { next } = await res.json()
console.log(`${next.name} at ${next.time}`)

Endpoints

All GET, all JSON unless noted. {city} is a slug like banjarbaru or kab-bogor, or a Kemendagri code like 63.72. Every schedule endpoint takes method and asr.

PathWhat it returns
/api/v1/schedule/{city}Today for a city. Add ?date=YYYY-MM-DD for another day, or ?month=YYYY-MM for a month.
/api/v1/schedule?lat=&lng=Any coordinates. Time zone is guessed, or pass tz and elevation.
/api/v1/scheduleNo location at all: uses the caller's IP.
/api/v1/next/{city}The next of the five daily prayers, with seconds remaining.
/api/v1/cities?q=Search the 514 kabupaten and kota. Returns slugs.
/api/v1/cities/{city}One city with its coordinates, elevation and time zone.
/api/v1/calendar/{city}.icsCalendar feed. ?alarm=10 adds reminders, ?prayers=fajr,maghrib filters.
/api/v1/locateWhere we think the caller is.
/api/v1/methodsCalculation methods and their angles.

Full spec: /openapi.json (OpenAPI 3.1). Month schedules also come as CSV with &format=csv.

Response

Keys are English. Times are local to the place in 24-hour HH:mm, and timestamps carries the same instants as ISO 8601 with the offset. A time is null when the sun never reaches that angle, which only happens far from the equator.

GET /api/v1/schedule/banjarbaru
{
  "location": { "name": "Kota Banjarbaru", "slug": "banjarbaru", "timezone": "Asia/Makassar", "timezone_abbr": "WITA", ... },
  "method": { "id": "kemenag", "fajr_angle": 20, "isha_angle": 18, "ihtiyat_minutes": 2, "asr": "standard" },
  "date": "2026-11-11",
  "weekday": "Rabu",
  "hijri": { "date": "1448-06-01", "text": "1 Jumadil Akhir 1448 H", ... },
  "times": {
    "imsak": "04:28", "fajr": "04:38", "sunrise": "05:54", "dhuha": "06:22",
    "dhuhr": "12:08", "asr": "15:29", "maghrib": "18:16", "isha": "19:28"
  },
  "timestamps": { "fajr": "2026-11-11T04:38:00+08:00", ... },
  "next": { "key": "isha", "name": "Isya", "time": "19:28", "in_seconds": 3480, ... }
}

Errors come back as { "error": { "code", "message" } } with a 400 or 404 status.

MCP server

Streamable HTTP at https://sholat.zakiego.com/mcp. Stateless, no auth. Tools: search_cities, get_prayer_times, get_next_prayer, get_monthly_schedule and list_methods.

Claude Code
claude mcp add --transport http jadwal-sholat https://sholat.zakiego.com/mcp
Cursor (.cursor/mcp.json) and other clients that take a JSON config
{
  "mcpServers": {
    "jadwal-sholat": {
      "type": "http",
      "url": "https://sholat.zakiego.com/mcp"
    }
  }
}
Clients that only speak stdio
npx -y mcp-remote https://sholat.zakiego.com/mcp

Calendar

Subscribe to a city in Google Calendar, Apple Calendar or Outlook. It refreshes daily and covers the next 60 days by default.

Subscription URL
https://sholat.zakiego.com/api/v1/calendar/banjarbaru.ics?alarm=10

Methods and accuracy

Times are computed at the edge from the sun's position, so there's no upstream to rate limit you. The default kemenag method matched the official Kemenag schedule to the minute in 105 of 120 checks across five cities and three dates, and was 1 minute off in the other 15. City coordinates and elevations come from the Kemendagri regional dataset by cahyadsn (MIT).

methodNameFajrIsha
kemenagKemenag RI20°18°
mwlMuslim World League18°17°
isnaISNA15°15°
egyptEgyptian General Authority19.5°17.5°
makkahUmm al-Qura, Makkah18.5°90 min
karachiUniversity of Islamic Sciences, Karachi18°18°
jakimJAKIM20°18°
muisMUIS20°18°
diyanetDiyanet18°17°