Apps for Indonesian users tend to need the same few things. A province, regency, district and village dropdown for an address form. The list of national holidays and cuti bersama for a scheduling feature. Today’s exchange rate. Sometimes prayer times, sometimes a school or hospital list.
All of that data is public. Finding it is the easy part. Using it is where the days go.
Where the data actually lives
Here is what I ran into, source by source:
- Region codes come from a Kemendagri decree. The current one is Kepmendagri No. 300.2.2-2138 of 2025, and it is a document, not a dataset. It covers 38 provinces, 514 regencies and cities, 7,285 districts and 83,762 villages, and someone has to turn it into tables before a form can use it.
- Exchange rates from Bank Indonesia come out of a SOAP web service that returns XML.
- BMKG weather warnings come as an RSS feed in XML, while the weather forecast comes from a separate JSON API.
- BPOM product registrations sit behind a search page, so getting data out means loading the page and handling its CSRF token first.
- School data is on the Kemendikbud reference site (referensi.data.kemdikbud.go.id), organised by region.
- Trademarks are in tables on the DJKI portal. The newer PDKI portal puts an anti-bot challenge and hCaptcha in front of every data path.
Each source has its own format, its own update rhythm and its own way of breaking. A decree changes once or twice a year. Exchange rates change every working day. A search page can change its markup without notice, and your parser finds out before you do.
So every developer who needs this data writes the same scrapers and the same parsers, then maintains them alone. That repeated work is what I wanted to get rid of.
Putting it in one place
API Indonesia is my answer to that. I collect the data from the official sources, clean it, and serve all of it with one API key and one JSON response format. Region codes, postal codes, holidays, prayer times, the Hijri calendar, schools, universities, hospitals, BMKG earthquakes and weather, Bank Indonesia rates, minimum wage, NIK and NPWP format checks, QRIS parsing, halal and BPOM lookups, OJK lists, KBBI, Al-Quran and Alkitab.
The parsing work happens once, on my side. When a source changes, I fix one parser and every user gets the fix.
Why this works as a SaaS
Look at it from a company’s side. Say you run an e-commerce checkout, an HR or payroll tool, or a fintech onboarding flow. You need regions for addresses, holidays and minimum wage for payroll rules, and maybe exchange rates and NIK format checks.
Building that in-house means an engineer spends days on scrapers and parsers, plus somewhere to run and store them. Then the real cost starts: someone has to notice when a decree is replaced, when a feed moves or when a page changes, and fix it before customers see wrong data. None of that work is your product. Every other company in your market is doing the identical job.
That is the shape of problem a shared service handles well:
- The work is the same for everyone. A village code is a village code, whether you sell shoes or run payroll.
- The value is in the upkeep, not the first import. Scraping a source once is easy. Keeping it correct for years is the part that costs money.
- The cost scales with use. You pay Rp2 per successful call, failed calls are free, and there is no fixed monthly fee to justify before you know how much you will use.
One honest note: the data is public, so anyone can copy it, and other services sell similar APIs. What a customer pays for is the maintenance and the single consistent interface, not exclusive access to the data. I think that is a fair thing to charge for, but it means the service only stays useful as long as I keep the sources current.
Then the agents showed up
AI agents need the same data. An agent filling in an address or planning around a holiday date should be able to look it up instead of guessing. So API Indonesia also runs as a hosted MCP server, and the latest step is a plugin on the Hermes Marketplace, the plugin catalog for Nous Research’s Hermes Agent.
hermes plugins install api-indonesia
You need Hermes 0.21.6 or newer and an API Indonesia key in API_INDONESIA_KEY, either in your profile .env or the plugin’s settings form. The plugin is configuration only, with no local code. Every tool call goes to https://mcp.apiindonesia.id/mcp with your key as a bearer header, and the tool list comes from the server at runtime, so new data shows up without a plugin update. All tools are read-only.
Pricing is the same as the REST API: Rp2 per successful call, failed calls free, a one-time 3,000 credit bonus for new accounts and no monthly free tier.
Links
- Hermes plugin: hermes-agent.nousresearch.com/marketplace/api-indonesia
- Docs: docs.apiindonesia.id
- Website: apiindonesia.id