<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fh="http://purl.org/syndication/history/1.0"><channel><title>API Kalender MABIMS | Blog</title><description>API konversi tanggal Hijriah resmi MABIMS untuk Indonesia. Data Kemenag, bukan Umm al-Qura.</description><link>https://mabims.dev/</link><language>en</language><fh:complete/><atom:link rel="self" href="https://mabims.dev/en/blog/rss.xml"/><item><title>Why Search for Hilal in Sabang?</title><link>https://mabims.dev/en/blog/behind-hilal-viz/</link><guid isPermaLink="true">https://mabims.dev/en/blog/behind-hilal-viz/</guid><description>One of my favorite endpoints on mabims.dev isn&apos;t /today or /convert, but /hilal/viz. This endpoint generates a 720×1280 PNG showing a complete evening sky visualization with moon position, MABIMS criteria pass/fail status, and a sky chart with stars. A deep dive behind the scenes.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;One of my favorite endpoints on mabims.dev isn’t &lt;code dir=&quot;auto&quot;&gt;/today&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;/convert&lt;/code&gt;, but &lt;code dir=&quot;auto&quot;&gt;/hilal/viz&lt;/code&gt;. This endpoint generates a 720×1280 PNG showing a complete evening sky visualization with moon position, MABIMS criteria pass/fail status, and a sky chart with stars.&lt;/p&gt;
&lt;p&gt;No other Hijri calendar API (at least that I’ve found) has this feature. So this post discusses how it works, from astronomy to pixel rendering.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;why-sabang&quot;&gt;Why Sabang?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;This is the question I get most often. The answer is simple: &lt;strong&gt;Sabang is Indonesia’s westernmost point.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For moon sighting (rukyah), geographic position matters — the further west, the later sunset occurs. This means if the hilal doesn’t meet criteria elsewhere, its &lt;em&gt;last chance&lt;/em&gt; will be in Sabang.&lt;/p&gt;
&lt;p&gt;This isn’t an official MABIMS rule about “must use Sabang,” but it’s a practical reference point that makes sense for representing Indonesia-wide hilal visibility in a single coordinate.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;how-it-works&quot;&gt;How It Works&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A simplified version of the actual implementation:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FUNCTION hilal_viz(month, year):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sighting = resolve_sighting_evening(year, month)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;observation = observe_sighting_evening(sighting.evening_date)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;alt_ok = observation.moon_alt &gt;= 3.0°&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;elong_ok = observation.elongation &gt;= 6.4°&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;data = build_chart_data(...)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;img = render_chart(data)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return PNG&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;1-resolve-the-sighting-evening&quot;&gt;1. Resolve the sighting evening&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;If you request visibility for Ramadan, this endpoint doesn’t calculate the 1st of Ramadan itself — it goes back to the &lt;strong&gt;29th evening of Sya’ban&lt;/strong&gt;, because that’s the actual evening observed to determine whether tomorrow marks the start of Ramadan. This is the fundamental logic of rukyah: you observe the hilal at the end of the current month, not at the start of the target month.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;2-calculate-that-evenings-astronomy-from-sabang&quot;&gt;2. Calculate that evening’s astronomy, from Sabang&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Two categories of data are computed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Geocentric criteria&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;moon_alt&lt;/code&gt; (altitude), &lt;code dir=&quot;auto&quot;&gt;moon_az&lt;/code&gt; (azimuth), &lt;code dir=&quot;auto&quot;&gt;sun_alt&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;elongation&lt;/code&gt; (angular distance between moon and sun). These are the numbers directly compared against MABIMS thresholds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observer-clock times&lt;/strong&gt; — illumination, local sunset time, and moonset time. This is what’s displayed as additional info on the bottom card.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;3-check-neo-mabims-thresholds&quot;&gt;3. Check Neo MABIMS thresholds&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alt_ok  = moon_alt   &gt;= 3.0°&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;elong_ok = elongation &gt;= 6.4°&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Both conditions must be met simultaneously. If either fails, the hilal is considered not to meet visibility criteria, even if the moon is above the horizon.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;example-result&quot;&gt;Example Result&lt;/h2&gt;&lt;/div&gt;
&lt;img src=&quot;https://mabims.dev/viz.png&quot; alt=&quot;Hilal visualization from the /hilal/viz endpoint&quot;&gt;
&lt;p&gt;The screenshot above shows visibility for 1 Muharram 1448 H (evaluating the evening of 29 Dzulhijjah 1447 H, June 15 2026, from Sabang):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Moon altitude +5.0° (passes, threshold ≥3.0°)&lt;/li&gt;
&lt;li&gt;Elongation 7.0° (passes, threshold ≥6.4°)&lt;/li&gt;
&lt;li&gt;Illumination 0.2% — very thin, the hilal is extremely young&lt;/li&gt;
&lt;li&gt;Sunset 18:53, moonset 19:11, only 18 minutes apart&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Status: &lt;strong&gt;VISIBLE&lt;/strong&gt;, though with not much margin.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;why-bother-building-this&quot;&gt;Why Bother Building This?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Because raw numbers (&lt;code dir=&quot;auto&quot;&gt;moon_alt: 5.2, elongation: 8.7&lt;/code&gt;) aren’t intuitive for most people, including myself. But once visualized — see the moon’s position relative to the horizon, see the green/red pill, see the criteria table — it becomes much easier to digest. This endpoint isn’t just for developers who need JSON, but for anyone curious about “how can the hilal be declared visible/not visible” without needing to understand astronomy.&lt;/p&gt;
&lt;p&gt;Try it yourself on the &lt;a href=&quot;https://mabims.dev/en/playground/hilal&quot;&gt;playground&lt;/a&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GET https://api.mabims.dev/api/v1/hilal/viz?month=1&amp;#x26;year=1448&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Change &lt;code dir=&quot;auto&quot;&gt;month&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;year&lt;/code&gt; to the Hijri month you want to check. Full parameter documentation at &lt;a href=&quot;https://mabims.dev/en/endpoints/hilal&quot;&gt;mabims.dev/en/endpoints/hilal&lt;/a&gt;.&lt;/p&gt;
</content:encoded><category>Astronomy</category><category>Hilal</category><category>Visualization</category><category>MABIMS</category></item><item><title>Integration Tutorial</title><link>https://mabims.dev/en/blog/cara-pakai-mabims-api/</link><guid isPermaLink="true">https://mabims.dev/en/blog/cara-pakai-mabims-api/</guid><description>I built this API for developers, and I don&apos;t want integration to stop at documentation with just GET /today and that&apos;s it. So in this post I&apos;ll show examples from the simplest to more proper setups: plain JavaScript, Vue, React, and mobile apps.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I built this API for developers, and I don’t want integration to stop at documentation with just &lt;code dir=&quot;auto&quot;&gt;GET /today&lt;/code&gt; and that’s it. So in this post I’ll show examples from the simplest to more proper setups: plain JavaScript, Vue, React, and mobile apps.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;simplest-javascript&quot;&gt;Simplest: JavaScript&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;If your website only needs to display today’s Hijri date, it’s actually this simple:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The response looks like this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;input&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2026-08-28&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;calendar&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;gregorian&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;tz&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Asia/Jakarta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;output&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1448-03-15&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;calendar&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hijri&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;day&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;month&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;month_name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Rabiul Akhir&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;year&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1448&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;source&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mabims&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;warnings&quot;&lt;/span&gt;&lt;span&gt;: []&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Just grab the &lt;code dir=&quot;auto&quot;&gt;output&lt;/code&gt; field to display. It’s already complete, no parsing needed:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const { &lt;/span&gt;&lt;span&gt;day&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;month_name&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt; } = &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;querySelector&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;#hijri-date&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;textContent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;day&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;month_name&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; H&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;So if your website header has:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hijri-date&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Just call the function above and the Hijri date will appear.&lt;/p&gt;
&lt;p&gt;No library installation. No API key. No need to build your own server just to fetch a Hijri date.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;using-timezones&quot;&gt;Using timezones&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;This is a part I think is important.&lt;/p&gt;
&lt;p&gt;A Hijri date isn’t just about converting Gregorian → Hijri. &lt;strong&gt;Timezones also determine what “today” means.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For example, your server is in the US, but most of your users are in Indonesia. You don’t want 00:30 WIB to be treated as the previous day because your server is still on the day before.&lt;/p&gt;
&lt;p&gt;mabims.dev provides a timezone override so you can specify which timezone to use. Use the &lt;code dir=&quot;auto&quot;&gt;tz&lt;/code&gt; parameter:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today?tz=Asia/Jakarta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For apps targeting Indonesia, I usually explicitly use &lt;code dir=&quot;auto&quot;&gt;Asia/Jakarta&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Asia/Makassar&lt;/code&gt;, or &lt;code dir=&quot;auto&quot;&gt;Asia/Jayapura&lt;/code&gt; as needed.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;in-vue&quot;&gt;In Vue&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;If you use Vue, the concept is the same. The difference is we store the API result in state.&lt;/p&gt;
&lt;p&gt;Using Composition API:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setup&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { ref, onMounted } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;vue&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;hijriDate&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;ref&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;onMounted&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today?tz=Asia/Jakarta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;hijriDate&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;template&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;v-if&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hijriDate&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{{ hijriDate.output.date }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;v-else&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Loading Hijri date...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;template&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Done.&lt;/p&gt;
&lt;p&gt;I actually recommend this approach over including a Hijri calendar library that’s much larger, if your app’s need is just &lt;strong&gt;displaying the Hijri date&lt;/strong&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;in-react&quot;&gt;In React&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;React is more or less the same:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { useEffect, useState } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;react&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HijriDate&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const [&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setDate&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;useState&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;useEffect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today?tz=Asia/Jakarta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setDate&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; []);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Loading Hijri date...&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;No additional dependencies.&lt;/p&gt;
&lt;p&gt;React just fetches the API → stores the result → renders.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;if-you-need-a-specific-date&quot;&gt;If you need a specific date&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;/today&lt;/code&gt; works when all you need is today’s Hijri date.&lt;/p&gt;
&lt;p&gt;But what if the user picks a date from a date picker?&lt;/p&gt;
&lt;p&gt;Say the user picks:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;August 17, 2026&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can use the conversion endpoint:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/convert?date=2026-08-17&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This is useful for calendars, forms, articles with publication dates, or date search features.&lt;/p&gt;
&lt;p&gt;For example, the user picks August 17, 2026 and you want to display the Hijri version. Just send that Gregorian date to the API.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;dont-forget-to-check-source&quot;&gt;Don’t forget to check &lt;code dir=&quot;auto&quot;&gt;source&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;There’s one thing I think is quite important when consuming this API.&lt;/p&gt;
&lt;p&gt;The mabims.dev response includes a &lt;code dir=&quot;auto&quot;&gt;source&lt;/code&gt; field.&lt;/p&gt;
&lt;p&gt;Simply put, there are two possibilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;mabims&lt;/code&gt; — the date comes from Kemenag’s official table.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;mabims-computed&lt;/code&gt; — the date was calculated using Neo MABIMS criteria as a fallback when the date is outside the table’s coverage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Why do I expose this?&lt;/p&gt;
&lt;p&gt;Because I don’t want the API to silently return computed results while developers assume it’s the official date from Kemenag.&lt;/p&gt;
&lt;p&gt;If your app is serious about the calendar, you can store or display this information.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mabims-computed&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Date uses Neo MABIMS computed result&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And if the API returns &lt;code dir=&quot;auto&quot;&gt;warnings&lt;/code&gt;, don’t just throw them away.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;warnings&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;warn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;warnings&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;for-mobile-apps&quot;&gt;For mobile apps&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;If you’re building an Android/iOS app, the principle is actually the same.&lt;/p&gt;
&lt;p&gt;Whether it’s Flutter, React Native, Kotlin, Swift, or any other framework — as long as your app can make HTTP requests, you can call this API.&lt;/p&gt;
&lt;p&gt;Pseudocode:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GET https://api.mabims.dev/api/v1/today?tz=Asia/Jakarta&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;JSON response&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Store in state&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Display:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&quot;1448-03-15&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The API doesn’t care whether the request comes from a browser, server, or mobile app.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;but-should-every-page-make-its-own-api-request&quot;&gt;But should every page make its own API request?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Now we’re getting into architecture.&lt;/p&gt;
&lt;p&gt;If your website has 100 components that all need the Hijri date, &lt;strong&gt;don’t have every component call &lt;code dir=&quot;auto&quot;&gt;fetch(&quot;/today&quot;)&lt;/code&gt; independently.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Fetch once, then share the result.&lt;/p&gt;
&lt;p&gt;On the frontend, you can create your own composable/hook/service.&lt;/p&gt;
&lt;p&gt;For example in React:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getHijriToday&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today?tz=Asia/Jakarta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ok&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;throw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Failed to fetch Hijri date&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Then other components just use that function.&lt;/p&gt;
&lt;p&gt;For larger apps, you can even cache the result since the Hijri date doesn’t change every few seconds.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-about-ssr-or-backend&quot;&gt;What about SSR or backend?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;This is even more interesting.&lt;/p&gt;
&lt;p&gt;If you’re using Next.js, Nuxt, Laravel, Rails, Django, or any other backend, you can also call mabims.dev from your server.&lt;/p&gt;
&lt;p&gt;Simple example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today?tz=Asia/Jakarta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;hijriDate&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Then your server sends that date to the browser.&lt;/p&gt;
&lt;p&gt;The advantage is the Hijri date can already be available when the page first renders.&lt;/p&gt;
&lt;p&gt;But if you do this, still think about caching. There’s no point in your server requesting the same date multiple times a day.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;so-when-should-you-use-this-api&quot;&gt;So when should you use this API?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;In my opinion, if your need is just:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“I want to display the Hijri date on my website.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Don’t build your own calendar system.&lt;/p&gt;
&lt;p&gt;Don’t maintain your own table.&lt;/p&gt;
&lt;p&gt;Don’t copy-paste dates from a PDF calendar into a database.&lt;/p&gt;
&lt;p&gt;And don’t expect a calendar library that defaults to Umm al-Qura to automatically match Indonesia’s needs.&lt;/p&gt;
&lt;p&gt;Just:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Website / App&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mabims.dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;MABIMS-based Hijri date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;If you need today’s date, use &lt;code dir=&quot;auto&quot;&gt;/today&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you need to convert a specific date, use &lt;code dir=&quot;auto&quot;&gt;/convert&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If your app needs a specific timezone, specify it explicitly.&lt;/p&gt;
&lt;p&gt;And if your app is administratively or religiously significant, &lt;strong&gt;always treat the API as a technical data source, not a replacement for official Kemenag decisions.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That’s it. Hope it helps!&lt;/p&gt;
</content:encoded><category>Tutorial</category><category>JavaScript</category><category>Integration</category><category>Hijri</category></item><item><title>The Story Behind MABIMS API</title><link>https://mabims.dev/en/blog/kenapa-saya-bikin-mabims-dev/</link><guid isPermaLink="true">https://mabims.dev/en/blog/kenapa-saya-bikin-mabims-dev/</guid><description>Kemenag&apos;s website used to display Hijri dates on its homepage. Many people, including myself, relied on it. Just open the website, check the top corner, and you&apos;d know today&apos;s Hijri date. Until one day, a viral post appeared...</description><pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There’s a funny (and slightly sad) story behind mabims.dev.&lt;/p&gt;
&lt;p&gt;Kemenag’s website used to display Hijri dates on its homepage. Many people, including myself, relied on it. Just open the website, check the top corner, and you’d know today’s Hijri date.&lt;/p&gt;
&lt;p&gt;Until one day, a viral post appeared. The Kemenag calendar said the 30th, but the Kemenag website said the 1st of the next month had already started. Off by one day.&lt;/p&gt;
&lt;p&gt;The post spread everywhere. People questioned why an official site could differ from the calendar it itself issued.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-solution-just-delete-it&quot;&gt;The solution? Just delete it&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;At the time I didn’t know the details behind it — whether it was a bug, a miscalculation, or what. What I knew was that the ending was remarkably elegant: &lt;strong&gt;the Hijri date on the website was deleted&lt;/strong&gt;. Not fixed, deleted. Problem solved, I guess… but it felt kind of off.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;a-few-years-later-i-became-a-junior-dev&quot;&gt;A few years later, I became a junior dev&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;When I started working as a developer, I finally understood what probably happened. If you want to display a Hijri calendar on a website, the easiest way is to use a library or call a third-party API. And almost every Hijri calendar library/API you can easily find defaults to &lt;strong&gt;Umm al-Qura&lt;/strong&gt; — Saudi Arabia’s official calendar.&lt;/p&gt;
&lt;p&gt;It makes sense that this is what’s used. The documentation is thorough, easy to integrate, free. But Umm al-Qura is designed for Saudi Arabia’s needs, not for Kemenag RI’s moon sighting or isbat session results. That’s why it can differ by ±1 day from what’s announced in Indonesia — exactly the incident that went viral.&lt;/p&gt;
&lt;p&gt;So it was likely not a “bug” in the sense of a code error. It was a bug caused by using the wrong data source for the Indonesian context.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;filling-the-gap&quot;&gt;Filling the gap&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;After realizing this, I thought: if other developers in Indonesia want to build an app that displays the Hijri calendar and want it to match Kemenag’s decision (not Saudi’s), the options are very limited. Most have to scrape manually or maintain their own table (spoiler: developer ≠ astronomer).&lt;/p&gt;
&lt;p&gt;That’s why I built &lt;strong&gt;mabims.dev&lt;/strong&gt;: a Hijri calendar API sourced from Kemenag RI’s official calendar, using Neo MABIMS criteria for fallback beyond table coverage. Free, no API key, just call the endpoint.&lt;/p&gt;
&lt;p&gt;Realistically… I don’t know if many people will use it. But at least one app will definitely use it: &lt;a href=&quot;https://kajian.malangmengaji.com&quot;&gt;kajian.malangmengaji.com&lt;/a&gt;, which I also built. If no other developers need it, fine — this API will keep running for my own app.&lt;/p&gt;
&lt;p&gt;But if you’re developing an app that needs an accurate Hijri calendar for Indonesia, feel free to use it. Free, open source, and hopefully it will never need to be taken down because it was caught showing the wrong date :)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Try it now:&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Full documentation at &lt;a href=&quot;https://mabims.dev/en/quickstart&quot;&gt;mabims.dev/quickstart&lt;/a&gt;.&lt;/p&gt;
</content:encoded><category>Story</category><category>MABIMS</category><category>Kemenag</category><category>Hijri</category></item></channel></rss>