API Documentation · v1

API Reference

Everything you need to integrate Indonesian public data: authentication, response format, and a complete reference for every endpoint.

Base URLhttps://use.apiindonesia.id
OpenAPI JSON
Also available on RapidAPI
On this page
Getting Started

Introduction

API Indonesia is a REST API for Indonesian public data: administrative regions, national public holidays, prayer times, schools, universities, hospitals, earthquakes, weather forecasts, postal codes, exchange rates, Al-Quran, weather warnings, vehicle plates, and minimum provincial wages. All responses are JSON, encoded in UTF-8.

All data endpoints live under the /api/v1 prefix and require an API key. A new account gets a one-time 3,000 credit bonus (Rp3,000) once the email is verified, and the bonus never expires. There is no monthly free allowance on any plan tier, so usage comes out of your credit balance: one credit equals Rp1, a successful public data request costs 2 credits (Rp2), and a request that fails, errors on validation, or times out is never charged.

Quickstart

  1. 1

    Sign up for a free account— your first API key is generated automatically at registration.

  2. 2

    Store your API key (format aip_live_...) — the key is shown only once.

  3. 3

    Send your first request with the x-api-key header:

Terminal
curl "https://use.apiindonesia.id/api/v1/wilayah/provinsi" \
  -H "x-api-key: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

To monitor service availability, theGET /healthendpoint can be accessed without authentication.

RapidAPI

If your team already uses RapidAPI, API Indonesia is also available in the marketplace with RapidAPI keys and billing.

Open RapidAPI listing
OpenAPI 3.1

API contract

The specification covers public endpoints, data endpoints, account authentication, parameters, request bodies, and response examples. Use this URL with Postman, Insomnia, or client generators that support OpenAPI 3.1.

https://docs.apiindonesia.id/openapi.jsonOpen specification
Getting Started

Authentication

API Indonesia uses two authentication schemes depending on the kind of endpoint being accessed:

x-api-key

Data endpoints

All endpoints under /api/v1/* require anx-api-key header containing your API key.

x-api-key: aip_live_xxxxxxxx...
Bearer JWT

Account endpoints

The /user/* and /billing/* endpoints require the JWT token from login in the Authorization header.

Authorization: Bearer eyJhbGci...

Important
Never put your API key in publicly visible frontend code. Call the API from your server, or scope keys per application so a leaked key is easy to revoke.

Getting Started

Response Format

All responses use a consistent envelope. Successful responses always contain adata field; error responses always contain anerror field.

Success · 200
{
  "data": [ ... ],
  "meta": {
    "total": 514,
    "page": 1,
    "per_page": 20,
    "total_pages": 26
  }
}
Error · 4xx / 5xx
{
  "error": {
    "code": "NOT_FOUND",
    "message": "School not found"
  }
}
Getting Started

Pagination

List endpoints use page-based pagination via thepage andper_page query parameters. Pagination details are returned in the meta object.

ParameterDefaultDescription
page1Page number, starting at 1.
per_page20–50Items per page. Maximum 100 for Regions, 200 for Schools, Universities, and Hospitals.
Getting Started

Rate Limits & Quota

Two limits apply to /api/v1/* endpoints: a per-second rate limit and, for paid plans, a monthly credit quota.

Rate Limit

20 req/second

Applies per API key. When exceeded, the API responds with429 RATE_LIMIT_EXCEEDED — just wait a moment and retry.

Monthly Quota

50,000 credits/month (Pro)

There is no monthly free allowance on any plan tier: a new account gets a one-time 3,000 credit bonus (Rp3,000) after email verification, and the bonus never expires. An exhausted paid quota answers 402 QUOTA_EXCEEDED. The Pro plangrants 50,000 credits (Rp50,000) per month and Business grants 250,000 credits (Rp250,000) per month. One credit equals Rp1 and a successful public data request costs 2 credits, so 50,000 credits equal 25,000 successful requests and 250,000 credits equal 125,000. Paid quotas reset at the start of each month (UTC).

Getting Started

Error Codes

The API uses standard HTTP status codes. The error.code field provides detail you can rely on programmatically.

StatusCodeDescription
400VALIDATION_ERRORA required parameter is missing or malformed.
400INVALID_QUERYThe search keyword is too short.
401MISSING_API_KEYThe x-api-key header was not sent.
401INVALID_API_KEYThe API key was not found or has been revoked.
401REVOKED_API_KEYThe API key has been revoked.
401UNAUTHORIZEDThe JWT token is missing, invalid, or expired.
401INVALID_CREDENTIALSWrong email or password at login.
402QUOTA_EXCEEDEDThe plan quota is exhausted. Upgrade to Pro or Business.
402INSUFFICIENT_CREDITSThe credit balance is empty. Every successful public data request costs 2 credits (Rp2) and one credit equals Rp1, so top up the balance from the dashboard.
403ACCOUNT_SUSPENDEDThe account is suspended and cannot be used.
404NOT_FOUNDThe requested resource was not found.
409EMAIL_EXISTSThe email is already registered.
429RATE_LIMIT_EXCEEDEDExceeded the limit of 20 requests/second. Retry after a short wait.
500INTERNAL_ERRORAn unexpected server error occurred.
Getting Started

MCP Server

Model Context Protocol (MCP) is a standardized framework that lets AI agents interact with API Indonesia data using natural language. With MCP, you can automate workflows, connect third-party AI tools, and enable agentic AI features — all using your existing API key.

🧪

Public Beta: The MCP server is currently in public beta. Available on all plans, including Free tier.

Server URL

Our MCP server URL is

https://mcp.apiindonesia.id/mcp

What you can do

With the API Indonesia MCP server, you can:

  • —Query administrative regions: provinces, regencies, districts, villages, and postal codes.
  • —Monitor recent earthquakes and weather forecasts from BMKG in real time.
  • —Search schools, universities, and hospitals across Indonesia.
  • —Check prayer times, national holidays, exchange rates, BI rates, minimum wages, and the Hijri calendar.
  • —Validate NIK/NPWP format, parse QRIS, search halal certificates (BPJPH) and BPOM products.
  • —Access the Indonesian dictionary (KBBI), Al-Quran, and Bible — 77 tools total.

Supported MCP Clients

The MCP server is compatible with all major MCP clients that support HTTP+SSE transport:

Claude DesktopCursorVS CodeWindsurfChatGPTDevinPostmanZed

Setup instructions

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "api-indonesia": {
      "url": "https://mcp.apiindonesia.id/mcp",
      "headers": {
        "Authorization": "Bearer aip_live_xxx"
      }
    }
  }
}

Cursor

Open Settings → MCP → Add new MCP server, fill in:

URLhttps://mcp.apiindonesia.id/mcp
HeaderAuthorization: Bearer aip_live_xxx

Rate limits

MCP usage is subject to the same rate limits as the REST API, depending on your plan:

PlanHits / monthRequests / second
Free1.00010
Pro50.00020
Business250.00060

FAQ

Do I need a separate API key for MCP?

No. MCP uses the same API key as the REST API (format aip_live_xxx). Create one from the dashboard.

Does MCP support write/delete operations?

Most tools are read-only (GET). Validation and utility tools use POST for format checks, Rupiah formatting, dummy generators, and QRIS parsing — no create/update/delete of public data.

Can I use it for local development?

Yes. In addition to remote HTTP, a stdio transport is available for local use. See the README in the repository.

API ReferencePublic

Dataset Metadata

Snapshot and provenance metadata for datasets, including source, version, item count, synchronization time, checksum, status, and warnings.

GET/api/v1/meta/datasets

List dataset metadata

Returns metadata for every registered dataset. This endpoint does not require an API key.

Request
curl "https://use.apiindonesia.id/api/v1/meta/datasets"
Response · 200 OK
{
  "success": true,
  "data": [
    {
      "dataset": "sekolah",
      "source_url": "https://example.go.id/sekolah.csv",
      "source_kind": "snapshot",
      "source_version": "2026-09-18",
      "source_year": 2026,
      "total_items": 200123,
      "synced_at": "2026-09-18T01:02:03.000Z",
      "schema_version": "1",
      "payload_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
      "status": "ready",
      "warnings": []
    }
  ]
}
Try it out
Ready
The response will appear here.
GET/api/v1/meta/datasets/:dataset

Retrieve dataset metadata

Returns snapshot and provenance metadata for one dataset.

Path Parameter

datasetstringRequired
Dataset ID, e.g. sekolah.
Request
curl "https://use.apiindonesia.id/api/v1/meta/datasets/sekolah"
Response · 200 OK
{
  "success": true,
  "data": {
    "dataset": "sekolah",
    "source_url": null,
    "source_kind": "unknown",
    "source_version": null,
    "source_year": null,
    "total_items": 200123,
    "synced_at": null,
    "schema_version": null,
    "payload_sha256": null,
    "status": "unknown",
    "warnings": [
      "Backfilled from an existing table; original sync provenance is unavailable."
    ]
  }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Regions

Indonesian administrative region data from province down to village level, complete with region codes, postal codes, and coordinates. All list endpoints support pagination.

← View landing page
GET/api/v1/wilayah/provinsi

List provinces

Returns a list of all provinces in Indonesia.

Query Parameter

pageinteger
Page to retrieve. Defaults to 1.
per_pageinteger
Items per page. Defaults to 20, maximum 100.
Request
curl "https://use.apiindonesia.id/api/v1/wilayah/provinsi?page=1&per_page=20" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "32",
      "code": "32",
      "name": "JAWA BARAT",
      "alt_name": "Jawa Barat",
      "lat": -6.914744,
      "lng": 107.609811,
      "is_active": 1
    }
  ],
  "meta": {
    "total": 38,
    "page": 1,
    "per_page": 20,
    "total_pages": 2
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/wilayah/provinsi/:id

Retrieve a province

Returns a single province by its region code.

Path Parameter

idstringRequired
Province code, e.g. 32.
Request
curl "https://use.apiindonesia.id/api/v1/wilayah/provinsi/32" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "id": "32",
    "code": "32",
    "name": "JAWA BARAT",
    "alt_name": "Jawa Barat",
    "lat": -6.914744,
    "lng": 107.609811,
    "is_active": 1
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/wilayah/provinsi/:id/kabupaten

List regencies/cities in a province

Nested alias for listing regencies/cities by province code.

Path Parameter

idstringRequired
Province code.

Query Parameter

pageinteger
Page to retrieve. Defaults to 1.
per_pageinteger
Items per page. Maximum 100.
Request
curl "https://use.apiindonesia.id/api/v1/wilayah/provinsi/94/kabupaten" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{ "data": [{ "id": "9401", "province_id": "94", "name": "Kabupaten Nabire", "type": "kabupaten" }], "meta": { "total": 8, "page": 1, "per_page": 20, "total_pages": 1 } }
Try it out
Ready
The response will appear here.
GET/api/v1/wilayah/kabupaten

List regencies/cities

Returns a list of regencies and cities, optionally filtered by province.

Query Parameter

provinsi_idstring
Filter by province code.
pageinteger
Page to retrieve. Defaults to 1.
per_pageinteger
Items per page. Defaults to 20, maximum 100.
Request
curl "https://use.apiindonesia.id/api/v1/wilayah/kabupaten?provinsi_id=32" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "3273",
      "province_id": "32",
      "code": "3273",
      "name": "KOTA BANDUNG",
      "alt_name": "Kota Bandung",
      "type": "kota",
      "is_city": 1,
      "lat": -6.9175,
      "lng": 107.6191,
      "is_active": 1
    }
  ],
  "meta": {
    "total": 27,
    "page": 1,
    "per_page": 20,
    "total_pages": 2
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/wilayah/kabupaten/:id

Retrieve a regency/city

Returns a single regency/city by its region code.

Path Parameter

idstringRequired
Regency/city code, e.g. 3273.
Request
curl "https://use.apiindonesia.id/api/v1/wilayah/kabupaten/3273" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "id": "3273",
    "province_id": "32",
    "code": "3273",
    "name": "KOTA BANDUNG",
    "alt_name": "Kota Bandung",
    "type": "kota",
    "is_city": 1,
    "lat": -6.9175,
    "lng": 107.6191,
    "is_active": 1
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/wilayah/kabupaten/:id/kecamatan

List districts in a regency/city

Nested alias for listing districts by regency/city code.

Path Parameter

idstringRequired
Regency/city code.

Query Parameter

pageinteger
Page to retrieve. Defaults to 1.
per_pageinteger
Items per page. Maximum 100.
Request
curl "https://use.apiindonesia.id/api/v1/wilayah/kabupaten/9401/kecamatan" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{ "data": [{ "id": "940101", "regency_id": "9401", "name": "Nabire" }], "meta": { "total": 15, "page": 1, "per_page": 20, "total_pages": 1 } }
Try it out
Ready
The response will appear here.
GET/api/v1/wilayah/kecamatan

List districts

Returns a list of districts, optionally filtered by regency/city.

Query Parameter

kabupaten_idstring
Filter by regency/city code.
pageinteger
Page to retrieve. Defaults to 1.
per_pageinteger
Items per page. Defaults to 20, maximum 100.
Request
curl "https://use.apiindonesia.id/api/v1/wilayah/kecamatan?kabupaten_id=3273" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "327301",
      "regency_id": "3273",
      "code": "327301",
      "name": "SUKASARI",
      "alt_name": "Sukasari",
      "lat": -6.8636,
      "lng": 107.5843,
      "is_active": 1
    }
  ],
  "meta": {
    "total": 30,
    "page": 1,
    "per_page": 20,
    "total_pages": 2
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/wilayah/kecamatan/:id

Retrieve a district

Returns a single district by its region code.

Path Parameter

idstringRequired
District code, e.g. 327301.
Request
curl "https://use.apiindonesia.id/api/v1/wilayah/kecamatan/327301" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "id": "327301",
    "regency_id": "3273",
    "code": "327301",
    "name": "SUKASARI",
    "alt_name": "Sukasari",
    "lat": -6.8636,
    "lng": 107.5843,
    "is_active": 1
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/wilayah/kecamatan/:id/kelurahan

List villages in a district

Nested alias for listing villages and customary villages by district code.

Path Parameter

idstringRequired
District code.

Query Parameter

pageinteger
Page to retrieve. Defaults to 1.
per_pageinteger
Items per page. Maximum 100.
Request
curl "https://use.apiindonesia.id/api/v1/wilayah/kecamatan/940101/kelurahan" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{ "data": [{ "id": "9401011001", "district_id": "940101", "name": "Wonorejo", "type": "kelurahan" }], "meta": { "total": 11, "page": 1, "per_page": 20, "total_pages": 1 } }
Try it out
Ready
The response will appear here.
GET/api/v1/wilayah/kelurahan

List villages

Returns a list of villages complete with postal codes, optionally filtered by district.

Query Parameter

kecamatan_idstring
Filter by district code.
pageinteger
Page to retrieve. Defaults to 1.
per_pageinteger
Items per page. Defaults to 20, maximum 100.
Request
curl "https://use.apiindonesia.id/api/v1/wilayah/kelurahan?kecamatan_id=327301" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "3273011001",
      "district_id": "327301",
      "code": "3273011001",
      "name": "ISOLA",
      "alt_name": "Isola",
      "type": "kelurahan",
      "postal_code": "40154",
      "is_courier_support": 1,
      "lat": -6.8593,
      "lng": 107.5921,
      "is_active": 1
    }
  ],
  "meta": {
    "total": 4,
    "page": 1,
    "per_page": 20,
    "total_pages": 1
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/wilayah/kelurahan/:id

Retrieve a village

Returns a single village by its region code.

Path Parameter

idstringRequired
Village code, e.g. 3273011001.
Request
curl "https://use.apiindonesia.id/api/v1/wilayah/kelurahan/3273011001" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "id": "3273011001",
    "district_id": "327301",
    "code": "3273011001",
    "name": "ISOLA",
    "alt_name": "Isola",
    "type": "kelurahan",
    "postal_code": "40154",
    "is_courier_support": 1,
    "lat": -6.8593,
    "lng": 107.5921,
    "is_active": 1
  }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Public Holidays

Calendar of national public holidays, religious holidays, and joint leave days based on the SKB 3 Menteri (joint ministerial decree).

← View landing page
GET/api/v1/libur

List public holidays

Returns a list of public holidays, sorted by date. Can be filtered by year and month.

Query Parameter

tahuninteger
Filter by year, e.g. 2026.
bulanstring
Filter by month (two digits), e.g. 06.
Request
curl "https://use.apiindonesia.id/api/v1/libur?tahun=2026" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "hol_2026_001",
      "date": "2026-01-01",
      "name": "Tahun Baru 2026 Masehi",
      "type": "nasional",
      "is_joint_leave": 0,
      "description": null,
      "source": "SKB 3 Menteri",
      "year": 2026,
      "is_active": 1
    }
  ]
}
Try it out
Ready
The response will appear here.
GET/api/v1/libur/upcoming

Upcoming holidays

Returns up to 10 upcoming public holidays, counted from today.

Request
curl "https://use.apiindonesia.id/api/v1/libur/upcoming" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "hol_2026_014",
      "date": "2026-08-17",
      "name": "Hari Kemerdekaan RI",
      "type": "nasional",
      "is_joint_leave": 0,
      "source": "SKB 3 Menteri",
      "year": 2026,
      "is_active": 1
    }
  ]
}
Try it out
Ready
The response will appear here.
GET/api/v1/libur/:id

Retrieve a holiday

Returns a single public holiday by ID.

Path Parameter

idstringRequired
Holiday ID.
Request
curl "https://use.apiindonesia.id/api/v1/libur/hol_2026_014" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "id": "hol_2026_014",
    "date": "2026-08-17",
    "name": "Hari Kemerdekaan RI",
    "type": "nasional",
    "is_joint_leave": 0,
    "description": null,
    "source": "SKB 3 Menteri",
    "year": 2026,
    "is_active": 1
  }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Prayer Times

Daily and monthly prayer times for 514 regencies/cities across Indonesia. Data is sourced from Kemenag (Ministry of Religious Affairs).

← View landing page
GET/api/v1/sholat/list-kota

List available cities

Returns the regencies/cities that have prayer time data. Use the regency_id from this response with the schedule endpoints.

Request
curl "https://use.apiindonesia.id/api/v1/sholat/list-kota" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "regency_id": "3273",
      "regency_name": "KOTA BANDUNG",
      "province_id": "32",
      "province_name": "JAWA BARAT"
    }
  ]
}
Try it out
Ready
The response will appear here.
GET/api/v1/sholat

Daily prayer times

Returns one day of prayer times for a given regency/city.

Query Parameter

kabupaten_idstringRequired
Regency/city code, e.g. 3273.
tanggalstring
Date in YYYY-MM-DD format. Defaults to today.
Request
curl "https://use.apiindonesia.id/api/v1/sholat?kabupaten_id=3273&tanggal=2026-07-03" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "id": "pt_3273_2026-07-03",
    "regency_id": "3273",
    "date": "2026-07-03",
    "imsyak": "04:29",
    "shubuh": "04:39",
    "terbit": "05:58",
    "dhuha": "06:26",
    "dzuhur": "11:56",
    "ashr": "15:17",
    "maghrib": "17:47",
    "isya": "19:01",
    "source": "Kemenag"
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/sholat/monthly

Monthly prayer times

Returns a full month of prayer times for a given regency/city, sorted by date.

Query Parameter

kabupaten_idstringRequired
Regency/city code, e.g. 3273.
tahunintegerRequired
Year, e.g. 2026.
bulanintegerRequired
Month (1–12), e.g. 7.
Request
curl "https://use.apiindonesia.id/api/v1/sholat/monthly?kabupaten_id=3273&tahun=2026&bulan=7" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "pt_3273_2026-07-01",
      "regency_id": "3273",
      "date": "2026-07-01",
      "imsyak": "04:28",
      "shubuh": "04:38",
      "terbit": "05:57",
      "dhuha": "06:25",
      "dzuhur": "11:55",
      "ashr": "15:17",
      "maghrib": "17:46",
      "isya": "19:00",
      "source": "Kemenag"
    }
  ]
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Schools

Directory of 200,000+ schools across Indonesia (SD, SMP, SMA, SMK, SLB) with NPSN (national school ID), address, accreditation, and coordinates.

← View landing page
GET/api/v1/sekolah

List schools

Returns a paginated list of schools with name/NPSN search plus region, level, status, and accreditation filters.

Query Parameter

provinsi_idstring
Filter by province code.
kabupaten_idstring
Filter by regency/city code.
district_idstring
Filter by district ID. Indonesian alias: kecamatan_id.
district_codestring
Filter by district code. Indonesian alias: kecamatan_code.
jenisstring
School level: SD, SMP, SMA, SMK, or SLB.
gradestring
English alias for jenis/school level.
typestring
Additional alias for jenis/school level.
statusstring
School status: Negeri (state) or Swasta (private).
accreditationstring
Filter by accreditation grade. Indonesian alias: akreditasi.
qstring
Exact NPSN or school-name prefix, minimum 2 characters.
pageinteger
Page to retrieve. Defaults to 1.
per_pageinteger
Items per page. Defaults to 50, maximum 200.
Request
curl "https://use.apiindonesia.id/api/v1/sekolah?district_id=3273190&grade=SMA&status=Negeri&accreditation=A&q=SMA" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "npsn": "20219557",
      "name": "SMA NEGERI 3 BANDUNG",
      "jenis": "SMA",
      "status": "Negeri",
      "province_id": "32",
      "regency_id": "3273",
      "district_id": "3273190",
      "village_id": "3273190004",
      "address": "Jl. Belitung No. 8",
      "postal_code": "40113",
      "lat": -6.9106,
      "lng": 107.6183,
      "phone": "0224235154",
      "email": null,
      "website": null,
      "accreditation": "A",
      "source_name": "kemendikbud-reference",
      "source_url": "https://referensi.data.kemdikbud.go.id/",
      "source_synced_at": "2026-09-18T00:00:00Z",
      "is_active": 1
    }
  ],
  "meta": {
    "total": 27,
    "page": 1,
    "per_page": 50,
    "total_pages": 1
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/sekolah/:npsn

Retrieve a school

Returns a single school by NPSN, including province, regency/city, district, and village names.

Path Parameter

npsnstringRequired
NPSN (national school ID).
Request
curl "https://use.apiindonesia.id/api/v1/sekolah/20219557" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "npsn": "20219557",
    "name": "SMA NEGERI 3 BANDUNG",
    "jenis": "SMA",
    "status": "Negeri",
    "province_id": "32",
    "regency_id": "3273",
    "address": "Jl. Belitung No. 8",
    "postal_code": "40113",
    "accreditation": "A",
    "is_active": 1,
    "province_name": "JAWA BARAT",
    "regency_name": "KOTA BANDUNG",
    "district_name": "SUMUR BANDUNG",
    "village_name": "MERDEKA"
  }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Universities

Directory of 2,100+ PTN, PTS, PTA, and PTK higher-education institutions: universities, institutes, polytechnics, academies, and colleges.

← View landing page
GET/api/v1/kampus

List universities

Returns a paginated, filterable list of higher-education institutions, including province and regency/city names.

Query Parameter

qstring
Search by name or abbreviation.
provincestring
Filter by province code. Legacy alias: provinsi_id.
regencystring
Filter by regency/city code. Legacy alias: kabupaten_id.
typestring
Type: universitas, institut, politeknik, akademi, or sekolah_tinggi. Legacy alias: jenis.
groupstring
Group: PTN, PTS, PTA, or PTK. Legacy alias: kelompok.
pageinteger
Page to retrieve. Defaults to 1.
per_pageinteger
Items per page. Defaults to 50, maximum 200.
Request
curl "https://use.apiindonesia.id/api/v1/kampus?province=32&group=PTN&q=teknologi" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "pt_001",
      "name": "INSTITUT TEKNOLOGI BANDUNG",
      "short_name": "ITB",
      "jenis": "institut",
      "kelompok": "PTN",
      "province_id": "32",
      "regency_id": "3273",
      "address": "Jl. Ganesha No. 10",
      "postal_code": "40132",
      "website": "https://itb.ac.id",
      "accreditation": "Unggul",
      "is_active": 1,
      "province_name": "JAWA BARAT",
      "regency_name": "KOTA BANDUNG"
    }
  ],
  "meta": {
    "total": 12,
    "page": 1,
    "per_page": 50,
    "total_pages": 1
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/kampus/:id

Retrieve a university

Returns a single institution by ID, including province and regency/city names.

Path Parameter

idstringRequired
Institution ID.
Request
curl "https://use.apiindonesia.id/api/v1/kampus/pt_001" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "id": "pt_001",
    "name": "INSTITUT TEKNOLOGI BANDUNG",
    "short_name": "ITB",
    "jenis": "institut",
    "kelompok": "PTN",
    "province_id": "32",
    "regency_id": "3273",
    "address": "Jl. Ganesha No. 10",
    "postal_code": "40132",
    "website": "https://itb.ac.id",
    "accreditation": "Unggul",
    "is_active": 1,
    "province_name": "JAWA BARAT",
    "regency_name": "KOTA BANDUNG"
  }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Hospitals

Directory of 2,900+ hospitals from a Ministry of Health data-center export, with hospital codes, types, locations, contacts, bed capacity, and source metadata.

← View landing page
GET/api/v1/rumah-sakit

List hospitals

Compact list with name/code search and region, type, class, ownership, and BLU filters. Use the detail endpoint for service, staff, bed, and facility collections.

Query Parameter

qstring
Search partial hospital name or code.
codestring
Filter by exact SIRS code.
province_idstring
Filter by province code. Legacy alias: provinsi_id.
regency_idstring
Filter by regency/city code. Legacy alias: kabupaten_id.
typestring
Filter by raw SIRS hospital type or legacy type code. Alias: jenis.
classstring
Filter by hospital class. Alias: kelas.
ownershipstring
Filter by ownership. Alias: kepemilikan.
blustring
Filter BLU/BLUD status by SIRS label or boolean. Alias: blu_status/is_blu.
pageinteger
Page to retrieve. Defaults to 1.
per_pageinteger
Items per page. Defaults to 50, maximum 200.
Request
curl "https://use.apiindonesia.id/api/v1/rumah-sakit?q=al+ihsan&province_id=32" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "rs-3204086",
      "code": "3204086",
      "name": "RS UMUM DAERAH AL IHSAN PROVINSI JAWA BARAT",
      "jenis": "RSUM",
      "hospital_type": "RS_RUJUKAN_PROVINSI",
      "kelas": null,
      "ownership": null,
      "is_blu": 0,
      "blu_status": null,
      "province_id": "32",
      "regency_id": "3204",
      "lat": -7.0081,
      "lng": 107.624,
      "beds_total": 462,
      "province_name": "JAWA BARAT",
      "regency_name": "KABUPATEN BANDUNG"
    }
  ],
  "meta": {
    "total": 1,
    "page": 1,
    "per_page": 50,
    "total_pages": 1
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/rumah-sakit/:id

Retrieve a hospital

Returns a full profile by internal ID or SIRS code, including available bed, service, staff, facility, provenance, and synchronization details.

Path Parameter

idstringRequired
Internal ID or SIRS code.
Request
curl "https://use.apiindonesia.id/api/v1/rumah-sakit/3204086" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "id": "rs-3204086",
    "code": "3204086",
    "name": "RS UMUM DAERAH AL IHSAN PROVINSI JAWA BARAT",
    "jenis": "RSUM",
    "hospital_type": "RS_RUJUKAN_PROVINSI",
    "kelas": null,
    "ownership": null,
    "is_blu": 0,
    "blu_status": null,
    "director": null,
    "address": "JL. KI ASTRAMANGGALA BALE ENDAH KAB. BANDUNG",
    "phone": "(022) 5940872",
    "beds_total": 462,
    "source_name": "Pusdatin Kemenkes export via zakiego/data-pusdatin-kemenkes",
    "source_url": "https://github.com/zakiego/data-pusdatin-kemenkes",
    "province_name": "JAWA BARAT",
    "regency_name": "KABUPATEN BANDUNG",
    "beds": [],
    "services": [],
    "staff": [],
    "facilities": [],
    "provenance": {
      "source_record_code": "3204086"
    }
  }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Earthquakes

Realtime earthquake data sourced from BMKG, refreshed automatically every hour via cron.

← View landing page
GET/api/v1/gempa/terkini

Latest earthquakes

Returns the 15 most recent earthquakes, newest first.

Request
curl "https://use.apiindonesia.id/api/v1/gempa/terkini" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "eq_20260702_0413",
      "datetime": "2026-07-02 04:13:21",
      "magnitude": 5.4,
      "depth_km": 10,
      "lat": -8.12,
      "lng": 110.34,
      "region": "Pacitan, Jawa Timur",
      "potential": "Tidak berpotensi tsunami",
      "is_felt": 1,
      "felt_areas": "III Yogyakarta, II-III Pacitan",
      "source": "BMKG"
    }
  ]
}
Try it out
Ready
The response will appear here.
GET/api/v1/gempa/dirasakan

Felt earthquakes

Returns the 15 most recent felt earthquakes (BMKG term for quakes reported felt by the public), complete with the MMI scale per area.

Request
curl "https://use.apiindonesia.id/api/v1/gempa/dirasakan" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "eq_20260702_0413",
      "datetime": "2026-07-02 04:13:21",
      "magnitude": 5.4,
      "depth_km": 10,
      "lat": -8.12,
      "lng": 110.34,
      "region": "Pacitan, Jawa Timur",
      "potential": "Tidak berpotensi tsunami",
      "is_felt": 1,
      "felt_areas": "III Yogyakarta, II-III Pacitan",
      "source": "BMKG"
    }
  ]
}
Try it out
Ready
The response will appear here.
GET/api/v1/gempa/history

Earthquake history

Returns earthquakes within a given date range, up to 100 records, newest first.

Query Parameter

startstringRequired
Start date, YYYY-MM-DD format.
endstringRequired
End date, YYYY-MM-DD format.
Request
curl "https://use.apiindonesia.id/api/v1/gempa/history?start=2026-06-01&end=2026-06-30" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "eq_20260628_2205",
      "datetime": "2026-06-28 22:05:44",
      "magnitude": 4.8,
      "depth_km": 22,
      "lat": -3.51,
      "lng": 128.09,
      "region": "Ambon, Maluku",
      "potential": "Tidak berpotensi tsunami",
      "is_felt": 0,
      "felt_areas": null,
      "source": "BMKG"
    }
  ]
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Weather Forecast

3-day weather forecast from BMKG for all villages across Indonesia. Data is fetched on demand and cached for 6 hours. Use the village code (adm4) from the Regions endpoint.

← View landing page
GET/api/v1/cuaca

Village weather forecast

Returns a 3-day weather forecast for a single village. Choose between adm4 (village code) or kabupaten_id to fetch a representative forecast for the regency.

Query Parameter

adm4string
Village code from the Regions endpoint, e.g. 32.73.01.1001.
kabupaten_idstring
Regency/city code (alternative to adm4), e.g. 3273.
Request
curl "https://use.apiindonesia.id/api/v1/cuaca?adm4=32.73.01.1001" \\
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "w_327301100120260706010000",
      "adm4": "32.73.01.1001",
      "provinsi": "Jawa Barat",
      "kotkab": "Kota Bandung",
      "kecamatan": "Sukasari",
      "desa": "Isola",
      "datetime": "2026-07-06T01:00:00",
      "local_datetime": "2026-07-06 08:00:00",
      "weather": "Cerah",
      "weather_code": "0",
      "weather_desc": "Cerah Berawan",
      "weather_desc_en": "Partly Cloudy",
      "temperature_c": 29,
      "humidity_percent": 62,
      "cloud_cover_percent": 2,
      "precipitation_mm": 0,
      "wind_direction": "E",
      "wind_direction_to": "W",
      "wind_direction_degrees": 125,
      "wind_speed": 3.5,
      "visibility_m": 15060,
      "visibility_text": "> 10 km",
      "analysis_date": "2026-07-05T12:00:00",
      "source": "BMKG"
    }
  ]
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Weather Warnings

Extreme weather warnings from BMKG RSS/CAP. Data is refreshed hourly and refreshed on demand when the cache is empty.

← View landing page
GET/api/v1/peringatan-dini

List weather warnings

Returns all currently active weather warnings. Can be filtered by province name.

Query Parameter

provinsistring
Filter by province name, e.g. Jawa Barat.
Request
curl "https://use.apiindonesia.id/api/v1/peringatan-dini?provinsi=Jawa+Barat" \\
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "warn_2-49-0-1-360-0-2026-07-05-21-18-003",
      "alert_id": "2.49.0.1.360.0.2026.07.05.21.18.003",
      "event": "Hujan Lebat disertai Petir",
      "urgency": "Expected",
      "severity": "Moderate",
      "certainty": "Likely",
      "area": "Batanghari, Bumi Waras, Enggal",
      "province": "Lampung",
      "effective": "2026-07-05T21:00:00.000Z",
      "expires": "06 July 2026, 07:30 WIB",
      "headline": "Hujan Lebat disertai Petir di Lampung",
      "description": "Hujan lebat disertai petir akan terjadi...",
      "instruction": "Ikuti informasi resmi BMKG dan arahan petugas setempat.",
      "source": "BMKG-CAP",
      "is_active": 1
    }
  ]
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Postal Codes

Directory of 83,000+ postal codes across Indonesia complete with regional hierarchy from province to village. Static data sourced from the official dataset.

← View landing page
GET/api/v1/kodepos

List postal codes

Returns paginated postal codes with explicit BPS and Kemendagri administrative codes.

Query Parameter

provinsi_idstring
Filter by province code, e.g. 32.
kabupaten_idstring
Filter by regency/city code, e.g. 3273.
kecamatan_idstring
Filter by district code, e.g. 3273010.
kode_posstring
Exact 5-digit postal-code filter.
bps_province_codestring
BPS province code.
bps_regency_codestring
BPS regency/city code.
bps_district_codestring
BPS district code.
bps_village_codestring
BPS village code.
kemendagri_province_codestring
Kemendagri province code.
kemendagri_regency_codestring
Kemendagri regency/city code.
kemendagri_district_codestring
Kemendagri district code.
kemendagri_village_codestring
Kemendagri village code.
pageinteger
Page to retrieve. Defaults to 1.
per_pageinteger
Items per page. Defaults to 20, maximum 100.
Request
curl "https://use.apiindonesia.id/api/v1/kodepos?kabupaten_id=3273" \\
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "kp_3273011001",
      "village_code": "32.73.01.1001",
      "village_name": "ISOLA",
      "district_code": "32.73.01",
      "district_name": "SUKASARI",
      "regency_code": "32.73",
      "regency_name": "KOTA BANDUNG",
      "province_code": "32",
      "province_name": "JAWA BARAT",
      "postal_code": "40154",
      "kode_pos": "40154",
      "bps_village_code": "3273010001",
      "kemendagri_village_code": "32.73.01.1001",
      "source_version": "2026.06",
      "crosswalk_source_version": "BPS Semester 1 2025 / Kemendagri 2025",
      "is_active": 1
    }
  ],
  "meta": {
    "total": 151,
    "page": 1,
    "per_page": 20,
    "total_pages": 8
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/kodepos/lookup

Cross-system code lookup

Exact lookup by postal, BPS, or Kemendagri code. At least one filter is required.

Query Parameter

kode_posstring
5-digit postal code.
bps_province_codestring
BPS province code.
bps_regency_codestring
BPS regency/city code.
bps_district_codestring
BPS district code.
bps_village_codestring
BPS village code.
kemendagri_province_codestring
Kemendagri province code.
kemendagri_regency_codestring
Kemendagri regency/city code.
kemendagri_district_codestring
Kemendagri district code.
kemendagri_village_codestring
Kemendagri village code.
pageinteger
Page. Defaults to 1.
per_pageinteger
Items per page. Maximum 100.
Request
curl "https://use.apiindonesia.id/api/v1/kodepos/lookup?kemendagri_village_code=32.73.01.1001" \\
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [{
    "id": "kp_3273010001",
    "kode_pos": "40154",
    "bps_village_code": "3273010001",
    "kemendagri_village_code": "32.73.01.1001",
    "source_version": "2026.06",
    "crosswalk_source_version": "BPS Semester 1 2025 / Kemendagri 2025"
  }]
}
Try it out
Ready
The response will appear here.
GET/api/v1/kodepos/:id

Retrieve a postal code

Returns a single postal code entry by ID.

Path Parameter

idstringRequired
Postal code entry ID, e.g. kp_3273011001.
Request
curl "https://use.apiindonesia.id/api/v1/kodepos/kp_3273011001" \\
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "id": "kp_3273011001",
    "village_code": "32.73.01.1001",
    "village_name": "ISOLA",
    "district_code": "32.73.01",
    "district_name": "SUKASARI",
    "regency_code": "32.73",
    "regency_name": "KOTA BANDUNG",
    "province_code": "32",
    "province_name": "JAWA BARAT",
    "postal_code": "40154",
    "is_active": 1
  }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Exchange Rates

Foreign exchange rates against Indonesian Rupiah (IDR) from Frankfurter/ECB. Data is refreshed automatically daily via cron. Available pairs: USD, EUR, SGD, GBP to IDR.

← View landing page
GET/api/v1/kurs/latest

Latest exchange rate

Returns the latest exchange rate for a given currency pair.

Query Parameter

basestring
Source currency. Defaults to USD.
targetstring
Target currency. Defaults to IDR.
Request
curl "https://use.apiindonesia.id/api/v1/kurs/latest?base=USD&target=IDR" \\
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "id": "kr_2026-07-03_USD_IDR",
    "date": "2026-07-03",
    "base": "USD",
    "target": "IDR",
    "rate": 16350.5,
    "source": "Frankfurter/ECB"
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/kurs/history

Historical exchange rates

Returns historical exchange rates for a given date range.

Query Parameter

basestring
Source currency. Defaults to USD.
targetstring
Target currency. Defaults to IDR.
startstringRequired
Start date, YYYY-MM-DD format.
endstringRequired
End date, YYYY-MM-DD format.
Request
curl "https://use.apiindonesia.id/api/v1/kurs/history?base=USD&target=IDR&start=2026-06-01&end=2026-06-30" \\
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "kr_2026-06-01_USD_IDR",
      "date": "2026-06-01",
      "base": "USD",
      "target": "IDR",
      "rate": 16290.0,
      "source": "Frankfurter/ECB"
    }
  ]
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Al-Quran

Complete list of 114 Al-Quran surahs with Arabic name, Latin transliteration, translation, number of verses, and revelation place. Static data sourced from quran.gading.dev.

← View landing page
GET/api/v1/quran/list-surah

List surah

Returns the complete list of 114 Al-Quran surahs, ordered by number.

Request
curl "https://use.apiindonesia.id/api/v1/quran/list-surah" \\
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": 1,
      "name": "الفاتحة",
      "name_latin": "Al-Fatihah",
      "name_arabic": "الفاتحة",
      "name_translation": "Pembukaan",
      "number_of_ayahs": 7,
      "revelation_place": "mecca",
      "revelation_order": 5,
      "audio_url": "https://cdn.islamic.network/quran/audio/128/ar.alafasy/1.mp3"
    }
  ]
}
Try it out
Ready
The response will appear here.
GET/api/v1/quran/surah/:id

Retrieve a surah

Returns the metadata of a single surah by number (1–114).

Path Parameter

idintegerRequired
Surah number, 1–114.
Request
curl "https://use.apiindonesia.id/api/v1/quran/surah/1" \\
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "id": 1,
    "name": "الفاتحة",
    "name_latin": "Al-Fatihah",
    "name_arabic": "الفاتحة",
    "name_translation": "Pembukaan",
    "number_of_ayahs": 7,
    "revelation_place": "mecca",
    "revelation_order": 5,
    "audio_url": "https://cdn.islamic.network/quran/audio/128/ar.alafasy/1.mp3",
    "is_active": 1
  }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Alkitab (Bible)

Indonesian Bible (TB translation) — 66 books (39 Old Testament + 27 New Testament) with 31,104 verses. Data sourced from alkitab.sabda.org.

← View landing page
GET/api/v1/alkitab/books

List books

Returns all 66 Bible books with chapter counts and testament classification (OT/NT).

Request
curl "https://use.apiindonesia.id/api/v1/alkitab/books" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": 1,
      "abbr": "Kej",
      "name": "Kejadian",
      "chapter_count": 50,
      "testament": "PL"
    },
    {
      "id": 40,
      "abbr": "Mat",
      "name": "Matius",
      "chapter_count": 28,
      "testament": "PB"
    }
  ]
}
Try it out
Ready
The response will appear here.
GET/api/v1/alkitab/books/:testament

List books by testament

Filter books by testament: PL (Old Testament) or PB (New Testament).

Path Parameter

testamentstringRequired
PL or PB.
Request
curl "https://use.apiindonesia.id/api/v1/alkitab/books/PB" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": 40,
      "abbr": "Mat",
      "name": "Matius",
      "chapter_count": 28,
      "testament": "PB"
    },
    {
      "id": 41,
      "abbr": "Mrk",
      "name": "Markus",
      "chapter_count": 16,
      "testament": "PB"
    }
  ]
}
Try it out
Ready
The response will appear here.
GET/api/v1/alkitab/passage/:bookAbbr/:chapter

Read a chapter

Returns all verses in a chapter. Use book abbreviation (e.g. Gen, John, Ps) or full name.

Path Parameter

bookAbbrstringRequired
Book abbreviation or name, e.g. Kej, Yoh, Mzm.
chapterintegerRequired
Chapter number.
Request
curl "https://use.apiindonesia.id/api/v1/alkitab/passage/Kej/1" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "book": { "id": 1, "abbr": "Kej", "name": "Kejadian" },
    "chapter": 1,
    "total_verses": 31,
    "verses": [
      { "verse_number": 1, "title": null, "text": "Pada mulanya Allah menciptakan langit dan bumi." },
      { "verse_number": 2, "title": null, "text": "Bumi itu batal dan kosong, gelap gulita menutupi samudera raya..." }
    ]
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/alkitab/verse/:bookAbbr/:chapter/:verse

Read a single verse

Returns a single verse by book, chapter, and verse number.

Path Parameter

bookAbbrstringRequired
Book abbreviation or name.
chapterintegerRequired
Chapter number.
verseintegerRequired
Verse number.
Request
curl "https://use.apiindonesia.id/api/v1/alkitab/verse/Yoh/3/16" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "book": { "id": 43, "abbr": "Yoh", "name": "Yohanes" },
    "chapter": 3,
    "verse_number": 16,
    "title": null,
    "text": "Karena begitu besar kasih Allah akan dunia ini, sehingga Ia telah mengaruniakan Anak-Nya yang tunggal, supaya setiap orang yang percaya kepada-Nya tidak binasa, melainkan beroleh hidup yang kekal."
  }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

KBBI (Indonesian Dictionary)

Indonesian Great Dictionary (KBBI) with 62,850+ word entries. Supports word search, exact word lookup, and random words. Data sourced from github.com/dyazincahya/KBBI-SQL-database (MIT License).

← View landing page
GET/api/v1/kbbi/word/:word

Look up a word

Returns all KBBI entries for a specific word (some words have multiple entries).

Path Parameter

wordstringRequired
Word to look up, e.g. rumah.
Request
curl "https://use.apiindonesia.id/api/v1/kbbi/word/rumah" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": 50001,
      "word": "rumah",
      "arti": "Nomina (kata benda)\n(1) bangunan untuk tempat tinggal manusia",
      "type": 2
    }
  ]
}
Try it out
Ready
The response will appear here.
GET/api/v1/kbbi/random

Random words

Returns random words from KBBI. Useful for games or learning apps.

Query Parameter

countinteger
Number of words (default 1, max 20).
Request
curl "https://use.apiindonesia.id/api/v1/kbbi/random?count=3" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": 12345,
      "word": "budaya",
      "arti": "Nomina (kata benda)\n(1) pikiran; akal budi",
      "type": 2
    },
    {
      "id": 67890,
      "word": "karya",
      "arti": "Nomina (kata benda)\n(1) hasil perbuatan; cipta",
      "type": 2
    }
  ]
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Vehicle Plates

Complete list of 61 Indonesian vehicle plate codes with region and province names. Static data sourced from an open dataset.

← View landing page
GET/api/v1/plates

List vehicle plates

Returns all 61 vehicle plate codes, sorted by code.

Request
curl "https://use.apiindonesia.id/api/v1/plates" \\
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": "plate_B",
      "plate_code": "B",
      "region": "Jakarta",
      "province": "DKI Jakarta",
      "cities": "Jakarta Pusat, Jakarta Utara, Jakarta Barat, Jakarta Selatan, Jakarta Timur, Kepulauan Seribu",
      "is_active": 1
    }
  ]
}
Try it out
Ready
The response will appear here.
GET/api/v1/plates/:code

Retrieve a plate code

Returns details for a single plate code.

Path Parameter

codestringRequired
Plate code, e.g. B, DK, L.
Request
curl "https://use.apiindonesia.id/api/v1/plates/B" \\
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "id": "plate_B",
    "plate_code": "B",
    "region": "Jakarta",
    "province": "DKI Jakarta",
    "cities": "Jakarta Pusat, Jakarta Utara, Jakarta Barat, Jakarta Selatan, Jakarta Timur, Kepulauan Seribu",
    "is_active": 1
  }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Minimum Provincial Wages (UMP)

Provincial Minimum Wage (UMP) data from 1997 to 2025 across 38 Indonesian provinces. Source: Kaggle "Indonesian Salary by Region" (Apache 2.0). Supports filtering by year, province name, and salary range.

← View landing page
GET/api/v1/ump

List UMP (latest first)

All provincial minimum wage records. Use query params to filter.

Query Parameter

yearnumber
Specific year (1997–2025)
province_namestring
Province name (case-insensitive, partial)
min_salarynumber
Minimum salary (IDR)
max_salarynumber
Maximum salary (IDR)
Request
curl "https://use.apiindonesia.id/api/v1/ump?year=2025&province_name=jawa" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    { "id": "ump-32-2025", "province_code": "32", "province_name": "JAWA BARAT", "year": 2025, "salary": 2500000 },
    { "id": "ump-35-2025", "province_code": "35", "province_name": "JAWA TIMUR", "year": 2025, "salary": 2305984 }
  ],
  "meta": { "total": 2, "page": 1, "per_page": 20, "total_pages": 1 }
}
Try it out
Ready
The response will appear here.
GET/api/v1/ump/:province_code

UMP per province (all years)

All UMP records for one province, sorted by latest year.

Path Parameter

province_codestringRequired
Province code (e.g., 32 = West Java)
Request
curl "https://use.apiindonesia.id/api/v1/ump/32" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    { "id": "ump-32-2025", "province_code": "32", "province_name": "JAWA BARAT", "year": 2025, "salary": 2500000 },
    { "id": "ump-32-2024", "province_code": "32", "province_name": "JAWA BARAT", "year": 2024, "salary": 2200000 }
  ],
  "meta": { "total": 2, "page": 1, "per_page": 20, "total_pages": 1 }
}
Try it out
Ready
The response will appear here.
GET/api/v1/ump/:province_code/:year

UMP province × year

A single UMP record for a specific province and year.

Path Parameter

province_codestringRequired
Province code
yearnumberRequired
Year (1997–2025)
Request
curl "https://use.apiindonesia.id/api/v1/ump/32/2025" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": { "id": "ump-32-2025", "province_code": "32", "province_name": "JAWA BARAT", "year": 2025, "salary": 2500000 }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Format Validation

Structural validation for NIK, NPWP, phone numbers, and bank accounts — no lookup to official databases. Includes Indonesian bank code list.

← View landing page
GET/api/v1/validasi/bank

List banks

Returns bank codes with valid account number lengths.

Request
curl "https://use.apiindonesia.id/api/v1/validasi/bank" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    { "code": "014", "name": "Bank BCA", "short_name": "BCA", "min_account_length": 10, "max_account_length": 10 }
  ]
}
Try it out
Ready
The response will appear here.
POST/api/v1/validasi/nik

Validate NIK

Checks 16-digit NIK format and extracts region/birth date codes. Not Dukcapil verification.

Body (JSON)

nikstringRequired
16-digit NIK
Request
curl -X POST "https://use.apiindonesia.id/api/v1/validasi/nik" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"nik":"3201010101900001"}'
Response · 200 OK
{
  "data": { "valid": true, "province_code": "32", "birth_date": "1990-01-01" },
  "meta": { "disclaimer": "Validasi struktural saja..." }
}
Try it out
Ready
The response will appear here.
POST/api/v1/validasi/npwp

Validate NPWP

Checks 15-digit NPWP format. Not DJP verification.

Body (JSON)

npwpstringRequired
NPWP number
Request
curl -X POST "https://use.apiindonesia.id/api/v1/validasi/npwp" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"npwp":"01.234.567.8-901.000"}'
Response · 200 OK
{
  "data": { "valid": true, "formatted": "01.234.567.8-901.000" }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Developer Utilities

Pure local utilities: Rupiah format/parse, dummy data generators (NIK/NPWP/phone), and QRIS parser.

← View landing page
POST/api/v1/util/rupiah/format

Format Rupiah

Formats a number as Indonesian Rupiah string.

Body (JSON)

amountnumberRequired
Amount in IDR
Request
curl -X POST "https://use.apiindonesia.id/api/v1/util/rupiah/format" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"amount":125000}'
Response · 200 OK
{
  "data": { "formatted": "Rp125.000", "amount": 125000 }
}
Try it out
Ready
The response will appear here.
POST/api/v1/util/qris/parse

Parse QRIS

Decodes a QRIS EMVCo payload string.

Body (JSON)

payloadstringRequired
QRIS string
Request
curl -X POST "https://use.apiindonesia.id/api/v1/util/qris/parse" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"payload":"0002010102115204581253033605802ID5910TOKO CONTO6007JAKARTA630451E9"}'
Response · 200 OK
{
  "success": true, "data": { "valid": true, "fields": [{ "id": "00", "length": 2, "value": "01" }, { "id": "01", "length": 2, "value": "11" }, { "id": "52", "length": 4, "value": "5812" }, { "id": "53", "length": 3, "value": "360" }, { "id": "58", "length": 2, "value": "ID" }, { "id": "59", "length": 10, "value": "TOKO CONTO" }, { "id": "60", "length": 7, "value": "JAKARTA" }, { "id": "63", "length": 4, "value": "51E9" }], "merchant_name": "TOKO CONTO", "merchant_city": "JAKARTA" }
}
Try it out
Ready
The response will appear here.
POST/api/v1/util/rupiah/parse

Parse Rupiah

Parses Rupiah text into a number.

Body (JSON)

textstringRequired
Rupiah text.
Request
curl -X POST "https://use.apiindonesia.id/api/v1/util/rupiah/parse"   -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" -d '{"text":"Rp125.000"}'
Response · 200 OK
{ "success": true, "data": { "amount": 125000 } }
Try it out
Ready
The response will appear here.
POST/api/v1/util/rupiah/terbilang

Spell out Rupiah

Spells out an IDR amount.

Body (JSON)

amountnumberRequired
Amount.
Request
curl -X POST "https://use.apiindonesia.id/api/v1/util/rupiah/terbilang"   -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" -d '{"amount":125000}'
Response · 200 OK
{ "success": true, "data": { "terbilang": "seratus dua puluh lima ribu rupiah" } }
Try it out
Ready
The response will appear here.
POST/api/v1/util/dummy/nik

Generate dummy NIK

Synthetic test data, not official verification.

Request
curl -X POST "https://use.apiindonesia.id/api/v1/util/dummy/nik" -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" -d '{}'
Response · 200 OK
{ "data": {}, "meta": { "disclaimer": "Data sintetis untuk testing. Bukan data Dukcapil/DJP." } }
Try it out
Ready
The response will appear here.
POST/api/v1/util/dummy/npwp

Generate dummy NPWP

Synthetic test data, not official verification.

Request
curl -X POST "https://use.apiindonesia.id/api/v1/util/dummy/npwp" -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" -d '{}'
Response · 200 OK
{ "data": {}, "meta": { "disclaimer": "Data sintetis untuk testing. Bukan data Dukcapil/DJP." } }
Try it out
Ready
The response will appear here.
POST/api/v1/util/dummy/telepon

Generate dummy TELEPON

Synthetic test data, not official verification.

Request
curl -X POST "https://use.apiindonesia.id/api/v1/util/dummy/telepon" -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" -d '{}'
Response · 200 OK
{ "data": {}, "meta": { "disclaimer": "Data sintetis untuk testing. Bukan data Dukcapil/DJP." } }
Try it out
Ready
The response will appear here.
POST/api/v1/util/qris/to-dynamic

Convert to dynamic QRIS

Adds an amount to static QRIS and recalculates CRC.

Body (JSON)

payloadstringRequired
Static QRIS payload.
amountnumberRequired
IDR amount.
feenumber
Optional fee.
Request
curl -X POST "https://use.apiindonesia.id/api/v1/util/qris/to-dynamic" -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" -d '{"payload":"0002010102115204581253033605802ID5910TOKO CONTO6007JAKARTA630451E9","amount":50000}'
Response · 200 OK
{ "success": true, "data": { "payload": "0002010102125204581253033605405500005802ID5910TOKO CONTO6007JAKARTA6304BB73" } }
Try it out
Ready
The response will appear here.
API Referencex-api-key

Bank Indonesia Rates

Official Bank Indonesia exchange rates (transaction rates). Cached in D1 and refreshed via cron. BI attribution required.

← View landing page
GET/api/v1/kurs-bi/latest

Latest rates

Latest transaction rates for USD/EUR/SGD (default) or other currencies.

Query Parameter

currenciesstring
Comma-separated ISO codes, e.g. USD,EUR,SGD
Request
curl "https://use.apiindonesia.id/api/v1/kurs-bi/latest?currencies=USD,EUR,SGD" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [{ "date": "2026-07-09", "currency": "USD", "buy_rate": 18090, "sell_rate": 18095 }],
  "meta": { "attribution": "Sumber: Bank Indonesia", "source": "Bank Indonesia" }
}
Try it out
Ready
The response will appear here.
GET/api/v1/kurs-bi/history

Rate history

Daily rate history for one currency (max 366 days).

Query Parameter

currencystring
ISO code, default USD
startstringRequired
YYYY-MM-DD
endstringRequired
YYYY-MM-DD
Request
curl "https://use.apiindonesia.id/api/v1/kurs-bi/history?currency=USD&start=2026-07-01&end=2026-07-09" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [{ "date": "2026-07-09", "currency": "USD", "mid_rate": 18092.52 }],
  "meta": { "attribution": "Sumber: Bank Indonesia" }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Halal (BPJPH)

Search halal supervisors/businesses from the BPJPH portal. On-demand: fetches upstream on cache miss, 24h TTL per keyword.

← View landing page
GET/api/v1/halal/:id

Supervisor detail

Get one record by id_penyelia UUID.

Path Parameter

idstringRequired
Supervisor UUID
Request
curl "https://use.apiindonesia.id/api/v1/halal/C7A753BB-3282-4D57-A485-B2B724D8267C" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": { "id_penyelia": "...", "company_name": "...", "issuer": "BPJPH" }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

BPOM Products

Search BPOM registered products (NIE, name, ingredients). On-demand with 24h cache per keyword.

← View landing page
GET/api/v1/bpom/:nie

NIE detail

Get product by NIE (registration number).

Path Parameter

niestringRequired
NIE e.g. DBL9424502004A1
Request
curl "https://use.apiindonesia.id/api/v1/bpom/DBL9424502004A1" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": { "nie": "DBL9424502004A1", "product_name": "PANADOL EXTRA", "category": "Obat" }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Hijri Calendar

Gregorian ↔ Hijri date conversion based on the Indonesian Hijri Calendar (Kemenag, MABIMS). Static 2026 data.

← View landing page
GET/api/v1/hijriah/konversi

Convert date

Convert one Gregorian date to Hijri.

Query Parameter

tanggalstringRequired
YYYY-MM-DD
Request
curl "https://use.apiindonesia.id/api/v1/hijriah/konversi?tanggal=2026-07-11" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": { "gregorian_date": "2026-07-11", "hijri_formatted": "26 Muharram 1448 H" },
  "meta": { "disclaimer": "Berdasarkan Kalender Hijriah Indonesia (hisab MABIMS)..." }
}
Try it out
Ready
The response will appear here.
GET/api/v1/hijriah/kalender

Year calendar

Full date mapping for one Gregorian year (currently 2026).

Query Parameter

tahunintegerRequired
Gregorian year, e.g. 2026
Request
curl "https://use.apiindonesia.id/api/v1/hijriah/kalender?tahun=2026" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [{ "gregorian_date": "2026-01-01", "hijri_day": 12, "hijri_month_name": "Rajab", "hijri_year": 1447 }],
  "meta": { "tahun": 2026, "total_days": 365 }
}
Try it out
Ready
The response will appear here.
Account & BillingPublic

Account Authentication

Register and log in to obtain a JWT token. The token is used to manage API keys, view usage, and subscribe.

POST/auth/register

Register

Creates a new account. This endpoint is protected by Turnstile; use a token from the dashboard. The first API key is generated automatically and returned once in this response.

Body (JSON)

emailstringRequired
Email address, must be unique.
passwordstringRequired
Account password.
namestring
Full name (optional).
turnstileTokenstringRequired
Cloudflare Turnstile token from the dashboard form.
Request
curl -X POST "https://use.apiindonesia.id/auth/register" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "anda@perusahaan.com",
    "password": "rahasia123",
    "name": "Budi Santoso",
    "turnstileToken": "0.xxxxx"
  }'
Response · 201 Created
{
  "data": {
    "id": "user_a1b2c3d4e5f6",
    "email": "anda@perusahaan.com",
    "name": "Budi Santoso",
    "plan": "free"
  },
  "api_key": "aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
Try it out
Ready
The response will appear here.
POST/auth/login

Log in

Exchanges an email and password for a JWT token. This endpoint is protected by Turnstile; use a token from the dashboard.

Body (JSON)

emailstringRequired
Registered email address.
passwordstringRequired
Account password.
turnstileTokenstringRequired
Cloudflare Turnstile token from the dashboard form.
Request
curl -X POST "https://use.apiindonesia.id/auth/login" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "anda@perusahaan.com",
    "password": "rahasia123",
    "turnstileToken": "0.xxxxx"
  }'
Response · 200 OK
{
  "data": {
    "id": "user_a1b2c3d4e5f6",
    "email": "anda@perusahaan.com",
    "name": "Budi Santoso",
    "plan": "free"
  },
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
Try it out
Ready
The response will appear here.
GET/auth/me

Get current user

Returns the profile of the currently authenticated user based on the JWT token.

Request
curl "https://use.apiindonesia.id/auth/me" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Response · 200 OK
{
  "data": {
    "id": "user_a1b2c3d4e5f6",
    "email": "anda@perusahaan.com",
    "name": "Budi Santoso",
    "plan": "free",
    "status": "active"
  }
}
Try it out
Ready
The response will appear here.
Account & BillingBearer JWT

API Keys

Manage your API keys: create a key per application, list your keys, and revoke keys you no longer use. All endpoints require a JWT token.

GET/user/keys

List API keys

Returns all API keys owned by the user. The full key is never shown again — only its prefix.

Request
curl "https://use.apiindonesia.id/user/keys" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Response · 200 OK
{
  "data": [
    {
      "id": "key_9f8e7d6c5b4a",
      "key_prefix": "aip_live_Ab1",
      "name": "Default",
      "plan": "free",
      "status": "active",
      "created_at": "2026-07-01T08:12:44.000Z",
      "last_used_at": "2026-07-03T02:31:09.000Z"
    }
  ]
}
Try it out
Ready
The response will appear here.
POST/user/keys

Create an API key

Creates a new API key. The api_key field is returned only once in this response and cannot be retrieved again.

Body (JSON)

namestring
Key name for identification, e.g. "Android App". Defaults to "Default".
Request
curl -X POST "https://use.apiindonesia.id/user/keys" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{ "name": "Aplikasi Android" }'
Response · 201 Created
{
  "data": {
    "id": "key_1a2b3c4d5e6f",
    "key_prefix": "aip_live_Xy9",
    "name": "Aplikasi Android",
    "plan": "free",
    "status": "active",
    "api_key": "aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  }
}
Try it out
Ready
The response will appear here.
DELETE/user/keys/:id

Revoke an API key

Permanently revokes an API key. Revoked keys are rejected immediately on all endpoints.

Path Parameter

idstringRequired
ID of the API key to revoke.
Request
curl -X DELETE "https://use.apiindonesia.id/user/keys/key_1a2b3c4d5e6f" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Response · 200 OK
{
  "data": {
    "id": "key_1a2b3c4d5e6f",
    "status": "revoked"
  }
}
Try it out
Ready
The response will appear here.
GET/user/usage

Usage statistics

Returns monthly, per-product API usage summaries across all of the user's keys.

Request
curl "https://use.apiindonesia.id/user/usage" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Response · 200 OK
{
  "data": [
    {
      "year": 2026,
      "month": 7,
      "api_product": "wilayah",
      "total_hits": 1240,
      "successful_hits": 1233,
      "failed_hits": 7
    }
  ]
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

OJK Investment

Investment data from Otoritas Jasa Keuangan (OJK — Indonesian Financial Services Authority): legal mutual fund products, legal investment apps, and illegal investment watchlist. Data sourced from Namchee/ojk-invest-api (MIT License).

← View landing page
GET/api/v1/ojk/products

List legal investment products

Returns a list of legal mutual fund products registered with OJK. Supports pagination and name search.

Query Parameter

namestring
Search products by name (fuzzy match).
limitnumber
Items per page (max 200, default 50).
offsetnumber
Number of items to skip (for pagination).
Request
curl "https://use.apiindonesia.id/api/v1/ojk/products?limit=5" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": 1,
      "name": "Schroder Dana Likuid",
      "management": "Schroder Investment Management Indonesia",
      "custodian": "PT Bank HSBC Indonesia",
      "type": "Money Market"
    }
  ],
  "meta": {
    "total": 2189,
    "page": 1,
    "per_page": 5,
    "total_pages": 438
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/ojk/products/:id

Investment product detail

Returns details of a single mutual fund product by ID.

Path Parameter

idnumber
Product ID.
Request
curl "https://use.apiindonesia.id/api/v1/ojk/products/1" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "id": 1,
    "name": "Schroder Dana Likuid",
    "management": "Schroder Investment Management Indonesia",
    "custodian": "PT Bank HSBC Indonesia",
    "type": "Money Market"
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/ojk/apps

List legal investment apps

Returns a list of legal investment apps registered with OJK. Supports pagination and name search.

Query Parameter

namestring
Search apps by name (fuzzy match).
limitnumber
Items per page (max 200, default 50).
offsetnumber
Number of items to skip (for pagination).
Request
curl "https://use.apiindonesia.id/api/v1/ojk/apps?limit=5" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": 1,
      "name": "Ajaib",
      "url": "https://ajaib.co.id",
      "owner": "Ajaib Sekuritas Asia"
    }
  ],
  "meta": {
    "total": 93,
    "page": 1,
    "per_page": 5,
    "total_pages": 19
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/ojk/apps/:id

Investment app detail

Returns details of a single investment app by ID.

Path Parameter

idnumber
App ID.
Request
curl "https://use.apiindonesia.id/api/v1/ojk/apps/1" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "id": 1,
    "name": "Ajaib",
    "url": "https://ajaib.co.id",
    "owner": "Ajaib Sekuritas Asia"
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/ojk/illegals

List illegal investments

Returns a list of illegal investments flagged by OJK. Each entry may include aliases, addresses, phone numbers, emails, websites, entity type, activity types, and a description. Supports pagination and name search.

Query Parameter

namestring
Search illegal investments by name (fuzzy match).
limitnumber
Items per page (max 200, default 50).
offsetnumber
Number of items to skip (for pagination).
Request
curl "https://use.apiindonesia.id/api/v1/ojk/illegals?limit=3" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": 1,
      "name": "PT Jelita Harmoni Mas",
      "alias": [],
      "address": ["Jakarta"],
      "phone": [],
      "email": [],
      "web": [],
      "entity_type": "Investasi Bodong",
      "activity_type": ["Penipuan"],
      "input_date": "20/01/2020",
      "description": "SP1/III/INFEST/2019"
    }
  ],
  "meta": {
    "total": 11278,
    "page": 1,
    "per_page": 3,
    "total_pages": 3760
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/ojk/illegals/:id

Illegal investment detail

Returns details of a single illegal investment by ID.

Path Parameter

idnumber
Illegal investment ID.
Request
curl "https://use.apiindonesia.id/api/v1/ojk/illegals/1" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "id": 1,
    "name": "PT Jelita Harmoni Mas",
    "alias": [],
    "address": ["Jakarta"],
    "phone": [],
    "email": [],
    "web": [],
    "entity_type": "Investasi Bodong",
    "activity_type": ["Penipuan"],
    "input_date": "20/01/2020",
    "description": "SP1/III/INFEST/2019"
  }
}
Try it out
Ready
The response will appear here.
Account & BillingBearer JWT

Billing

Subscribe to the Pro or Business plan, or buy pay-as-you-go credits, through Sumopod. Payments default to QRIS. One credit equals Rp1, and the price is per product per hit: one successful public data request costs 2 credits (Rp2). A failed request costs nothing. The AI wallet is a separate balance metered per token, apart from these credits.

GET/billing/plans

Plan list

Returns available plans, monthly/yearly pricing, monthly credit quotas, and rate limits, and the pay-as-you-go credit packs. The Free plan has no monthly allowance (monthlyQuota 0); a one-time 3,000 credit bonus is granted after email verification. Every credit figure is rupiah, because one credit equals Rp1.

Request
curl "https://use.apiindonesia.id/billing/plans"
Response · 200 OK
{
  "data": {
    "plans": {
      "free": { "monthlyPrice": 0, "monthlyQuota": 0 },
      "pro": { "monthlyPrice": 49000, "yearlyPrice": 490000, "monthlyQuota": 50000 },
      "business": { "monthlyPrice": 149000, "yearlyPrice": 1490000, "monthlyQuota": 250000 }
    },
    "checkout_plans": ["pro", "business"],
    "billing_cycles": ["monthly", "yearly"],
    "payg_packages": {
      "starter": { "credits": 29000, "amount": 29000 },
      "standard": { "credits": 59000, "amount": 59000 },
      "growth": { "credits": 109000, "amount": 109000 },
      "scale": { "credits": 249000, "amount": 249000 }
    }

  }
}
Try it out
Ready
The response will appear here.
POST/billing/subscribe

Start checkout

Creates a pending subscription and generates a Sumopod payment link. Redirect the user to redirect_url to complete the payment. Plan credits are granted once the paid webhook arrives, and one credit equals Rp1, so a monthly Pro plan grants 50,000 credits (Rp50,000).

Body (JSON)

planstring
Subscription plan: "pro" or "business".
billing_cyclestring
Billing cycle: "monthly" or "yearly". Default: "monthly".
Request
curl -X POST "https://use.apiindonesia.id/billing/subscribe" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{ "plan": "pro", "billing_cycle": "monthly" }'
Response · 200 OK
{
  "data": {
    "subscription_id": "sub_7c1e...",
    "invoice_id": "inv_2f9a...",
    "plan": "pro",
    "billing_cycle": "monthly",
    "amount": 49000,
    "currency": "IDR",
    "payment_provider": "sumopod",
    "payment_url": "https://pay.sumopod.com/...",
    "redirect_url": "https://pay.sumopod.com/...",
    "payment_id": "pay_8b3d...",
    "credits": 50000,
    "expires_at": "2026-07-31T08:15:00.000Z"
  }
}
Try it out
Ready
The response will appear here.
GET/billing/status

Subscription status

Returns the user's most recent subscription. Returns 404 if the user has never subscribed.

Request
curl "https://use.apiindonesia.id/billing/status" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Response · 200 OK
{
  "data": {
    "id": "sub-7c1e...",
    "user_id": "user_a1b2c3d4e5f6",
    "plan": "pro",
    "status": "active",
    "started_at": "2026-07-01T08:15:00.000Z",
    "expires_at": "2026-07-31T08:15:00.000Z",
    "auto_renew": 0
  }
}
Try it out
Ready
The response will appear here.
POST/billing/webhook

Sumopod webhook

Payment notification endpoint called by Sumopod (not meant to be called directly). Register this URL as the webhook URL in the Sumopod dashboard. Requests are verified via the x-webhook-token header or a Svix signature (svix-id, svix-timestamp, svix-signature) — either one being valid is enough. When the payment status becomes paid, the invoice is marked paid, the user's plan is upgraded, and credits are granted.

Request
# Called automatically by Sumopod, example payload:
curl -X POST "https://use.apiindonesia.id/billing/webhook" \
  -H "x-webhook-token: <SUMOPOD_WEBHOOK_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "event_type": "payment.completed",
    "data": {
      "payment_id": "pay_8b3d...",
      "order_id": "inv_2f9a...",
      "status": "completed",
      "amount": 49000,
      "payment_method": "qris",
      "completed_at": "2026-07-01T08:16:30.000Z"
    }
  }'
Response · 200 OK
{
  "status": "ok"
}
Try it out
Ready
The response will appear here.
POST/billing/topup

Buy credits (pay as you go)

Buys a one-off credit package without a subscription. One credit equals Rp1, so the Rp59,000 pack grants 59,000 credits. Credits do not expire and are added once the payment is settled.

Body (JSON)

package_idstring
Credit package: "starter", "standard", "growth", or "scale".
Request
curl -X POST "https://use.apiindonesia.id/billing/topup" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{ "package_id": "standard" }'
Response · 200 OK
{
  "data": {
    "invoice_id": "inv_2f9a...",
    "package_id": "standard",
    "credits": 59000,
    "amount": 59000,
    "currency": "IDR",
    "payment_provider": "sumopod",
    "payment_url": "https://pay.sumopod.com/...",
    "redirect_url": "https://pay.sumopod.com/...",
    "payment_id": "pay_8b3d...",
    "expires_at": "2026-07-02T08:15:00.000Z"
  }
}
Try it out
Ready
The response will appear here.
GET/billing/credits

Credit balance

Returns the credit balance, the per-product prices, and the 50 most recent ledger entries from public data products. One credit equals Rp1: a successful public data request debits 2 credits, and a failed request is refunded automatically.

Request
curl "https://use.apiindonesia.id/billing/credits" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Response · 200 OK
{
  "data": {
    "balance": 48750,
    "credits_per_rupiah": 1,
    "cost_per_successful_request": 2,
    "free_monthly_included_credits": 0,
    "product_prices": {
      "default": { "credits": 2, "unit": "request" }
    },
    "ledger": [
      {
        "id": "8f1c...",
        "product": "api",
        "type": "usage",
        "amount": -2,
        "balance_after": 48750,
        "description": "GET /api/v1/wilayah/provinces",
        "created_at": "2026-07-01T09:02:11.000Z"
      }
    ]
  }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Astronomy

Computed astronomy from public NOAA/USNO formulas: sunrise/sunset, day length, twilight, moon phase, upcoming moon phases, and eclipse predictions. Pure local computation — no external data source, commercially safe to use.

← View landing page
GET/api/v1/astronomi/sun

Sunrise & sunset

Returns sunrise, sunset, solar noon, and day length for a given lat/lon and date. Handles polar night / midnight sun.

Query Parameter

latnumberRequired
Decimal latitude (-90..90), e.g. -6.2.
lonnumberRequired
Decimal longitude (-180..180), e.g. 106.8.
tanggalstring
Date in YYYY-MM-DD. Defaults to today.
tzstring
ISO timezone offset, e.g. +07:00. Defaults to +00:00.
Request
curl "https://use.apiindonesia.id/api/v1/astronomi/sun?lat=-6.2&lon=106.8&tanggal=2025-06-21&tz=%2B07:00" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "date": "2025-06-21",
    "latitude": -6.2,
    "longitude": 106.8,
    "timezone": "+07:00",
    "sunrise": "06:00",
    "sunset": "17:46",
    "solarNoon": "11:53",
    "dayLength": 42343,
    "declination": 23.44,
    "equationOfTime": -0.76,
    "polarPhase": "normal"
  },
  "meta": {
    "disclaimer": "Hasil dihitung dari rumus astronomi publik (NOAA/USNO). Aksen ±2 menit adalah normal untuk terbit/terbenam.",
    "source": "Computed (NOAA/USNO)"
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/astronomi/twilight

Twilight times

Returns civil, nautical, and astronomical twilight boundaries for photography/observation.

Query Parameter

latnumberRequired
Decimal latitude.
lonnumberRequired
Decimal longitude.
tanggalstring
Date in YYYY-MM-DD. Defaults to today.
tzstring
ISO timezone offset, e.g. +07:00.
Request
curl "https://use.apiindonesia.id/api/v1/astronomi/twilight?lat=-6.2&lon=106.8&tanggal=2025-06-21&tz=%2B07:00" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "civilDawn": "05:35",
    "civilDusk": "18:11",
    "nauticalDawn": "05:06",
    "nauticalDusk": "18:40",
    "astronomicalDawn": "04:37",
    "astronomicalDusk": "19:09"
  },
  "meta": { "disclaimer": "Hasil dihitung dari rumus astronomi publik (NOAA/USNO)...", "source": "Computed (NOAA/USNO)" }
}
Try it out
Ready
The response will appear here.
GET/api/v1/astronomi/moon

Moon phase

Returns the moon phase (illumination, phase name, age, distance) for a given date.

Query Parameter

tanggalstring
Date in YYYY-MM-DD. Defaults to today.
Request
curl "https://use.apiindonesia.id/api/v1/astronomi/moon?tanggal=2025-02-12" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": {
    "date": "2025-02-12",
    "illumination": 0.98,
    "phaseAngle": 178.2,
    "phaseName": "Bulan Purnama",
    "phaseNameEn": "Full Moon",
    "age": 14.7,
    "visiblePercent": 98,
    "trend": "waxing",
    "distanceEarthRadii": 60.3,
    "julianDay": 2460713.5
  },
  "meta": { "source": "Computed (NOAA/USNO)" }
}
Try it out
Ready
The response will appear here.
GET/api/v1/astronomi/moon/next

Upcoming moon phases

Returns the next major moon phases (new/first quarter/full/last quarter), up to 12 ahead.

Query Parameter

tanggalstring
Start date in YYYY-MM-DD. Defaults to today.
countinteger
Number of phases (1–12). Defaults to 4.
Request
curl "https://use.apiindonesia.id/api/v1/astronomi/moon/next?tanggal=2025-01-01&count=4" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    { "phase": "first_quarter", "name": "Kuartil Awal", "nameEn": "First Quarter", "date": "2025-01-05", "daysUntil": 4, "phaseAngle": 90 },
    { "phase": "full", "name": "Bulan Purnama", "nameEn": "Full Moon", "date": "2025-01-13", "daysUntil": 12, "phaseAngle": 180 }
  ],
  "meta": { "source": "Computed (NOAA/USNO)" }
}
Try it out
Ready
The response will appear here.
GET/api/v1/astronomi/gerhana

Eclipse predictions

Returns upcoming solar & lunar eclipses (approximation based on saros/draconic cycles). Dates & kinds are indicative.

Query Parameter

tanggalstring
Start date in YYYY-MM-DD. Defaults to today.
daysinteger
Horizon in days (1–1825). Defaults to 365.
Request
curl "https://use.apiindonesia.id/api/v1/astronomi/gerhana?tanggal=2025-01-01&days=730" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "data": [
    { "type": "lunar", "date": "2025-03-14", "kind": "Total", "kindEn": "Total", "magnitude": 0.93 },
    { "type": "solar", "date": "2025-03-29", "kind": "Sebagian", "kindEn": "Partial", "magnitude": 0.71 }
  ],
  "meta": { "source": "Computed (NOAA/USNO)", "note": "Prediksi aproximasi berbasis siklus saros/draconic. Tanggal & jenis bersifat indikatif." }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Trademarks (DJKI)

Indonesian trademark data from DJKI: 900,000+ registered marks with application numbers, owners, NICE classes, and consultants, plus the trademark journal (Berita Resmi Merek) to monitor new filings by your brand or competitors. Search by name, owner, and class.

← View landing page
GET/api/v1/merek/:appNumber

Trademark detail

Returns details of a single trademark by application number. If the number only appears in the publication journal (not yet registered), the response still returns 200 with journal data plus a journal_events list.

Path Parameter

appNumberstring
Trademark application number, e.g. DID2019050403.
Request
curl "https://use.apiindonesia.id/api/v1/merek/DID2019050403"   -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "success": true,
  "data": {
    "app_number": "DID2019050403",
    "mark_name": "GARUDA SUPER",
    "class": "16",
    "owner": "DARWIN EFFENDY",
    "consultant": null,
    "reg_date": "2019-09-03",
    "journal_events": []
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/merek/journal

Search the trademark journal

Returns trademark applications published in the DJKI Berita Resmi Merek journal. Coverage is a rolling window of recent editions (roughly twice a month, last few months). Use it to monitor lookalike filings during the opposition window.

Query Parameter

qstring
Search keyword, e.g. garuda.
pageinteger
Page to retrieve. Defaults to 1.
limitinteger
Items per page. Defaults to 20.
journal_nostring
Filter by journal number, e.g. 140/P-M/VII/A/2026.
Request
curl "https://use.apiindonesia.id/api/v1/merek/journal?q=garuda&page=1&limit=5"   -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "success": true,
  "data": [
    {
      "app_number": "DID2026064189",
      "journal_no": "140/P-M/VII/A/2026",
      "journal_date": "2026-07-10",
      "opposition_end": "2026-09-10",
      "mark_name": "GLS Garuda Lintas Segoro + Logo",
      "class": "20",
      "owner": "LILY",
      "filing_date": "2026-07-02"
    },
    {
      "app_number": "JID2026033404",
      "journal_no": "137/P-M/VII/A/2026",
      "journal_date": "2026-07-06",
      "opposition_end": "2026-09-06",
      "mark_name": "Sama Juga Bohong",
      "class": "41",
      "owner": "PT Garuda Film",
      "filing_date": "2026-04-15"
    },
    {
      "app_number": "DID2026061024",
      "journal_no": "141/P-M/VII/A/2026",
      "journal_date": "2026-07-10",
      "opposition_end": "2026-09-10",
      "mark_name": "GARUDAFLY",
      "class": "12",
      "owner": "PT GARUDAFLY AGRI DRONE",
      "filing_date": "2026-06-24"
    }
  ],
  "pagination": { "page": 1, "limit": 5, "total": 51 }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Administrative Boundaries

Province-to-village administrative GeoJSON.

Source: open-admin-data/indonesia-administrative-divisions by jakkrapongt, version 2026.06, CC BY 4.0. Preserve attribution.

← View landing page
GET/api/v1/wilayah-boundary

List boundaries

Active boundary metadata.

Query Parameter

levelstring
province, regency, district, village.
pageinteger
Page, default 1.
per_pageinteger
Default 20, maximum 100.
Request
curl "https://use.apiindonesia.id/api/v1/wilayah-boundary?level=province" -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{ "success": true, "data": [{ "code": "31", "name": "DKI Jakarta", "level": "province", "centroid_lat": -6.2, "centroid_lng": 106.8, "source_version": "2026.06", "license": "CC BY 4.0", "attribution": "Data boundary dari open-admin-data/indonesia-administrative-divisions oleh jakkrapongt, dilisensikan CC BY 4.0", "geometry_type": "MultiPolygon" }], "meta": { "page": 1, "per_page": 20, "total": 1, "total_pages": 1 } }
Try it out
Ready
The response will appear here.
GET/api/v1/wilayah-boundary/:code/metadata

Boundary metadata

Source, license, GeoJSON URL.

Path Parameter

codestringRequired
Dotted code, e.g. 31.
Request
curl "https://use.apiindonesia.id/api/v1/wilayah-boundary/31/metadata" -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{ "success": true, "data": { "code": "31", "name": "DKI Jakarta", "level": "province", "source": "open-admin-data/indonesia-administrative-divisions", "source_version": "2026.06", "license": "CC BY 4.0", "attribution": "Data boundary dari open-admin-data/indonesia-administrative-divisions oleh jakkrapongt, dilisensikan CC BY 4.0", "geometry_type": "MultiPolygon", "status": "active", "url": "https://cdn.apiindonesia.id/api/v1/wilayah-boundary/31" } }
Try it out
Ready
The response will appear here.
GET/api/v1/wilayah-boundary/:code

Boundary GeoJSON

GeoJSON application/geo+json; X-Data-* headers carry source, version, license and attribution. Illustrative geometry.

Path Parameter

codestringRequired
Dotted region code.
Request
curl "https://use.apiindonesia.id/api/v1/wilayah-boundary/31" -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{ "type": "FeatureCollection", "features": [] }
Try it out
Ready
The response will appear here.
API Referencex-api-key

Air Quality

List only readings cached today; city lookup returns the latest reading, which may be older.

Per-reading source is in source: BMKG-CAMS or AQICN/WAQI. Check cached_at and updated_at before treating readings as current.

← View landing page
GET/api/v1/kualitas-udara

Today cached readings

List may be empty.

Request
curl "https://use.apiindonesia.id/api/v1/kualitas-udara" -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{ "success": true, "data": [] }
Try it out
Ready
The response will appear here.
GET/api/v1/kualitas-udara/:city

Latest city reading

Substring city lookup; 404 when absent.

Path Parameter

citystringRequired
City name.
Request
curl "https://use.apiindonesia.id/api/v1/kualitas-udara/Jakarta" -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{ "success": true, "data": { "city": "Jakarta", "aqi": 75, "source": "BMKG-CAMS", "cached_at": "2026-09-27 00:00:00" } }
Try it out
Ready
The response will appear here.
API Referencex-api-key

Food Prices & Anomaly Index (National Food Agency)

Official National Food Agency (Bapanas) food-price data: monthly average consumer prices (since 2021) and producer prices (since 2019), national and per-province. The latest available open price edition ends in January 2026, not real-time prices, plus the Price Anomaly Index (QIPA/AIPA/IFPA) to flag abnormal spikes and drops. Sourced from BPN Open Data.

Data source: National Food Agency, Open Data Pangan (data.badanpangan.go.id). Data follows official BPN releases and may change with agency updates. API Indonesia adds an access and aggregation layer, not a replacement for official channels in government decision-making.

← View landing page
GET/api/v1/harga-pangan

Food-price series overview

Returns a summary of every series (consumer/producer level x national/province region): commodity count, row count, and the available month range.

Request
curl "https://use.apiindonesia.id/api/v1/harga-pangan" -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "success": true,
  "data": [
    { "tingkat": "konsumen", "wilayah": "nasional", "komoditas": 46, "rows": 1146, "dari": "2021-01", "sampai": "2026-01" },
    { "tingkat": "konsumen", "wilayah": "provinsi", "komoditas": 27, "rows": 36348, "dari": "2021-01", "sampai": "2026-01" }
  ]
}
Try it out
Ready
The response will appear here.
GET/api/v1/harga-pangan/harga

Monthly food prices

Returns monthly average food prices, filterable by level, region, commodity, province, and month range. Prices are integers in rupiah; "-" in the source becomes null.

Query Parameter

tingkatstring
Set tingkat=konsumen or tingkat=produsen.
wilayahstring
Set wilayah=nasional or wilayah=provinsi.
komoditasstring
Filter by commodity name, e.g. beras premium (partial match).
provinsistring
Filter by province name or code, e.g. aceh or 11.
daristring
Start month, format yyyy-mm, e.g. 2025-01.
sampaistring
End month, format yyyy-mm, e.g. 2026-01.
pageinteger
Page to retrieve. Defaults to 1.
limitinteger
Items per page. Default 20, max 100.
Request
curl "https://use.apiindonesia.id/api/v1/harga-pangan/harga?tingkat=konsumen&wilayah=nasional&komoditas=beras&dari=2025-01&sampai=2026-01&limit=3" -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "success": true,
  "data": [
    { "tingkat": "konsumen", "wilayah": "nasional", "kode_provinsi": null, "provinsi": null, "komoditas": "Beras Premium", "tanggal": "2026-01", "harga": 16080, "harga_raw": "Rp16,080" },
    { "tingkat": "konsumen", "wilayah": "nasional", "kode_provinsi": null, "provinsi": null, "komoditas": "Beras Medium", "tanggal": "2026-01", "harga": 15100, "harga_raw": "Rp15,100" }
  ],
  "meta": { "total": 36, "page": 1, "per_page": 3, "total_pages": 12 }
}
Try it out
Ready
The response will appear here.
GET/api/v1/harga-pangan/anomali

Food-price anomaly index

Strategic commodity price-anomaly indices (QIPA, AIPA, IFPA) with status Alert (Low/High Price) or Normal. From National Food Agency monthly releases (check the latest date in the response); useful to flag abnormal price spikes or drops.

Query Parameter

komoditasstring
Filter by commodity name, e.g. beras premium.
daristring
Start month, format yyyy-mm.
sampaistring
End month, format yyyy-mm.
pageinteger
Page to retrieve. Defaults to 1.
limitinteger
Items per page. Default 20.
Request
curl "https://use.apiindonesia.id/api/v1/harga-pangan/anomali?komoditas=beras&limit=3" -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "success": true,
  "data": [
    { "tanggal": "2026-08", "komoditas": "Beras Premium", "qipa": -1.97, "aipa": -0.86, "ifpa": -1.30, "status": "Alert (Low Price)" }
  ],
  "meta": { "total": 105, "page": 1, "per_page": 20, "total_pages": 6 }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Transjakarta (Official PT Transportasi Jakarta GTFS)

Public transport category: Transjakarta bus routes with the halte they serve, nearest-halte search from a coordinate, fares, and per-route departure headways. The data is the official static GTFS published by PT Transportasi Jakarta, licensed CC BY 4.0, so it may be reused commercially as long as the attribution is kept.

Data source: GTFS Static Transjakarta (c) 2026 by PT Transportasi Jakarta, licensed under the Creative Commons Attribution 4.0 International licence (CC BY 4.0). The licence statement is at https://ppid.transjakarta.co.id/informasi/berkala and the file is downloaded from https://gtfs.transjakarta.co.id/files/file_gtfs.zip. Because that licence requires attribution, a licence link, and an indication of changes, every successful response carries meta.attribution with the publisher, the licence name, a licence link, a link to the source file, the licence-statement page, and the statement of changes "Data diubah: dinormalisasi ke format JSON API Indonesia" — so you do not have to assemble the credit yourself, just pass that object through in every redistribution. What API Indonesia changed: the GTFS was normalised to JSON, the stop_times rows were condensed into one stop list per route and direction, and shapes.txt (geometry) is not included in this version.

← View landing page
GET/api/v1/transjakarta/rute

List routes

Returns the 240 Transjakarta routes with their short and long names, service description (BRT, integrated public transport, Mikrotrans, Transjabodetabek, tour bus), GTFS route type, corporate colour with its text colour, and the number of unique halte the route serves (counted across both directions, not the number of rows).

Query Parameter

qstring
Partial, case-insensitive route-name search, e.g. blok (23 routes).
pageinteger
Page to retrieve. Defaults to 1; a page past the offset ceiling answers 400 PAGINATION_LIMIT.
per_pageinteger
Items per page. Defaults to 20, maximum 100.
Request
curl "https://use.apiindonesia.id/api/v1/transjakarta/rute?q=blok&per_page=2" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "success": true,
  "data": [
    { "id": "1", "short_name": "1", "long_name": "Blok M - Kota", "description": "BRT", "route_type": 3, "color": "D62126", "text_color": "FFFFFF", "jumlah_halte": 59 },
    { "id": "1C", "short_name": "1C", "long_name": "Pesanggrahan - Blok M", "description": "Angkutan Umum Integrasi", "route_type": 3, "color": "D65E62", "text_color": "000000", "jumlah_halte": 76 }
  ],
  "meta": {
    "total": 23,
    "page": 1,
    "per_page": 2,
    "total_pages": 12,
    "attribution": {
      "source": "PT Transportasi Jakarta (Transjakarta) GTFS",
      "license": "CC BY 4.0",
      "license_url": "https://creativecommons.org/licenses/by/4.0/",
      "source_url": "https://gtfs.transjakarta.co.id/files/file_gtfs.zip",
      "attribution_page": "https://ppid.transjakarta.co.id/informasi/berkala",
      "notice": "Data diubah: dinormalisasi ke format JSON API Indonesia"
    }
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/transjakarta/rute/:id

Retrieve a route

One route with the fares that apply to it (from fare_rules), its departure headways (per trip), and the halte list of both directions: "ke" for direction_id 0 and "kembali" for direction_id 1, each ordered by ascending stop_sequence. An unknown route answers 404 NOT_FOUND. The official release carries no street geometry, so per-segment travel distances are not available here.

Path Parameter

idstringRequired
Route ID, e.g. 1, 1C, 10A, or JAK.79.
Request
curl "https://use.apiindonesia.id/api/v1/transjakarta/rute/1" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "success": true,
  "data": {
    "id": "1",
    "short_name": "1",
    "long_name": "Blok M - Kota",
    "description": "BRT",
    "route_type": 3,
    "color": "D62126",
    "text_color": "FFFFFF",
    "tarif": [
      { "id": "FP", "price": 3500, "currency": "IDR" }
    ],
    "frekuensi": [
      { "trip_id": "1-P23", "start_time": "00:00:00", "end_time": "23:59:59", "headway_secs": 900 },
      { "trip_id": "1-P28", "start_time": "00:00:00", "end_time": "23:59:59", "headway_secs": 900 }
    ],
    "halte": {
      "ke": [
        { "stop_id": "P00017", "name": "Blok M", "lat": -6.243312, "lng": 106.80175, "stop_sequence": 0 },
        { "stop_id": "G00012", "name": "Asean", "lat": -6.239911, "lng": 106.79897, "stop_sequence": 1 }
      ],
      "kembali": [
        { "stop_id": "G00060", "name": "Kali Besar", "lat": -6.135355, "lng": 106.81143, "stop_sequence": 0 },
        { "stop_id": "G00064", "name": "Museum Sejarah Jakarta", "lat": -6.133882, "lng": 106.81214, "stop_sequence": 1 }
      ]
    }
  },
  "meta": {
    "attribution": {
      "source": "PT Transportasi Jakarta (Transjakarta) GTFS",
      "license": "CC BY 4.0",
      "license_url": "https://creativecommons.org/licenses/by/4.0/",
      "source_url": "https://gtfs.transjakarta.co.id/files/file_gtfs.zip",
      "attribution_page": "https://ppid.transjakarta.co.id/informasi/berkala",
      "notice": "Data diubah: dinormalisasi ke format JSON API Indonesia"
    }
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/transjakarta/halte

List halte

Returns the 8,091 Transjakarta halte with code, name, coordinates, and GTFS stop type. The q filter partially matches name, code, or halte ID.

Query Parameter

qstring
Search a halte by name, code, or ID, e.g. monas or B02475P.
pageinteger
Page to retrieve. Defaults to 1.
per_pageinteger
Items per page. Defaults to 20, maximum 100.
Request
curl "https://use.apiindonesia.id/api/v1/transjakarta/halte?q=monas&per_page=3" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "success": true,
  "data": [
    { "id": "B02475P", "code": null, "name": "Monas 1", "lat": -6.172531, "lng": 106.82315, "stop_type": 0 },
    { "id": "B02476P", "code": null, "name": "Monas 2", "lat": -6.175999, "lng": 106.82311, "stop_type": 0 },
    { "id": "B02477P", "code": null, "name": "Monas 3", "lat": -6.178787, "lng": 106.82304, "stop_type": 0 }
  ],
  "meta": {
    "total": 3,
    "page": 1,
    "per_page": 3,
    "total_pages": 1,
    "attribution": {
      "source": "PT Transportasi Jakarta (Transjakarta) GTFS",
      "license": "CC BY 4.0",
      "license_url": "https://creativecommons.org/licenses/by/4.0/",
      "source_url": "https://gtfs.transjakarta.co.id/files/file_gtfs.zip",
      "attribution_page": "https://ppid.transjakarta.co.id/informasi/berkala",
      "notice": "Data diubah: dinormalisasi ke format JSON API Indonesia"
    }
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/transjakarta/halte/nearby

Nearest halte

Finds the halte around a coordinate, nearest first, with the distance in metres (distance_m). The search applies a bounding box first and the exact great-circle distance second, so a 5 km radius stays cheap. Radius defaults to 1,000 metres (maximum 5,000) and limit to 20 (maximum 100); a missing or non-numeric lat/lng, a radius outside 1-5,000, or a limit outside 1-100 answers 400 VALIDATION_ERROR.

Query Parameter

latnumberRequired
Latitude of the reference point, -90 to 90, e.g. -6.172531.
lngnumberRequired
Longitude of the reference point, -180 to 180, e.g. 106.82315.
radiusinteger
Search radius in metres, 1 to 5,000. Defaults to 1,000.
limitinteger
Maximum halte returned, 1 to 100. Defaults to 20.
Request
curl "https://use.apiindonesia.id/api/v1/transjakarta/halte/nearby?lat=-6.172531&lng=106.82315&radius=1000&limit=3" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "success": true,
  "data": [
    { "id": "B02475P", "code": null, "name": "Monas 1", "lat": -6.172531, "lng": 106.82315, "stop_type": 0, "distance_m": 0 },
    { "id": "B01649P", "code": null, "name": "Jln. Tanah Abang I", "lat": -6.173433, "lng": 106.8214, "stop_type": 0, "distance_m": 218 },
    { "id": "B02983P", "code": null, "name": "PPI", "lat": -6.170855, "lng": 106.82136, "stop_type": 0, "distance_m": 272 }
  ],
  "meta": {
    "attribution": {
      "source": "PT Transportasi Jakarta (Transjakarta) GTFS",
      "license": "CC BY 4.0",
      "license_url": "https://creativecommons.org/licenses/by/4.0/",
      "source_url": "https://gtfs.transjakarta.co.id/files/file_gtfs.zip",
      "attribution_page": "https://ppid.transjakarta.co.id/informasi/berkala",
      "notice": "Data diubah: dinormalisasi ke format JSON API Indonesia"
    }
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/transjakarta/halte/:id

Retrieve a halte

One halte plus the routes that call there, one row per route and direction pair (direction_id). A halte served in both directions appears twice, and a tourist halte can be served by several routes. An unknown halte answers 404 NOT_FOUND.

Path Parameter

idstringRequired
Halte ID, e.g. B02475P.
Request
curl "https://use.apiindonesia.id/api/v1/transjakarta/halte/B02475P" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "success": true,
  "data": {
    "id": "B02475P",
    "code": null,
    "name": "Monas 1",
    "lat": -6.172531,
    "lng": 106.82315,
    "stop_type": 0,
    "rute": [
      { "route_id": "BW2", "short_name": "BW2", "long_name": "Monas Explorer", "direction_id": 0 },
      { "route_id": "BW4", "short_name": "BW4", "long_name": "Pencakar Langit", "direction_id": 0 }
    ]
  },
  "meta": {
    "attribution": {
      "source": "PT Transportasi Jakarta (Transjakarta) GTFS",
      "license": "CC BY 4.0",
      "license_url": "https://creativecommons.org/licenses/by/4.0/",
      "source_url": "https://gtfs.transjakarta.co.id/files/file_gtfs.zip",
      "attribution_page": "https://ppid.transjakarta.co.id/informasi/berkala",
      "notice": "Data diubah: dinormalisasi ke format JSON API Indonesia"
    }
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/transjakarta/tarif

List fares

The six GTFS fares with their rupiah prices: FP (Rp3,500, the flat Transjakarta fare), GR (Rp0, free on selected routes), PP (Rp20,000) and PP2/PP3 for airport services, plus how many transfers are allowed (null means the fare covers a single journey). This endpoint does not paginate, so meta carries the attribution only.

Request
curl "https://use.apiindonesia.id/api/v1/transjakarta/tarif" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "success": true,
  "data": [
    { "id": "GR", "price": 0, "currency": "IDR", "payment_method": 0, "transfers": null, "transfer_duration": 10800 },
    { "id": "FP", "price": 3500, "currency": "IDR", "payment_method": 0, "transfers": null, "transfer_duration": 10800 },
    { "id": "FP2", "price": 3500, "currency": "IDR", "payment_method": 0, "transfers": 1, "transfer_duration": 10800 },
    { "id": "PP", "price": 20000, "currency": "IDR", "payment_method": 0, "transfers": null, "transfer_duration": 10800 },
    { "id": "PP2", "price": 25000, "currency": "IDR", "payment_method": 0, "transfers": null, "transfer_duration": 10800 },
    { "id": "PP3", "price": 35000, "currency": "IDR", "payment_method": 0, "transfers": null, "transfer_duration": 10800 }
  ],
  "meta": {
    "attribution": {
      "source": "PT Transportasi Jakarta (Transjakarta) GTFS",
      "license": "CC BY 4.0",
      "license_url": "https://creativecommons.org/licenses/by/4.0/",
      "source_url": "https://gtfs.transjakarta.co.id/files/file_gtfs.zip",
      "attribution_page": "https://ppid.transjakarta.co.id/informasi/berkala",
      "notice": "Data diubah: dinormalisasi ke format JSON API Indonesia"
    }
  }
}
Try it out
Ready
The response will appear here.
GET/api/v1/transjakarta/jadwal

Departure headways

Departure frequencies from GTFS frequencies.txt: one row per trip serving that route, with the operating window and the headway in seconds (900 seconds means a bus every 15 minutes). The route filter narrows the result to one route; a route without frequency rows answers an empty list, not a 404. Times are returned as the source "HH:MM:SS" strings, so night services can exceed 24:00:00.

Query Parameter

rutestring
Route ID to narrow the result, e.g. 10A.
pageinteger
Page to retrieve. Defaults to 1.
per_pageinteger
Items per page. Defaults to 20, maximum 100.
Request
curl "https://use.apiindonesia.id/api/v1/transjakarta/jadwal?rute=10A" \
  -H "x-api-key: YOUR_API_KEY"
Response · 200 OK
{
  "success": true,
  "data": [
    { "trip_id": "10A-L02", "route_id": "10A", "start_time": "05:00:00", "end_time": "22:00:00", "headway_secs": 2180, "exact_times": 0 },
    { "trip_id": "10A-R01", "route_id": "10A", "start_time": "05:00:00", "end_time": "22:00:00", "headway_secs": 1200, "exact_times": 0 }
  ],
  "meta": {
    "total": 2,
    "page": 1,
    "per_page": 20,
    "total_pages": 1,
    "attribution": {
      "source": "PT Transportasi Jakarta (Transjakarta) GTFS",
      "license": "CC BY 4.0",
      "license_url": "https://creativecommons.org/licenses/by/4.0/",
      "source_url": "https://gtfs.transjakarta.co.id/files/file_gtfs.zip",
      "attribution_page": "https://ppid.transjakarta.co.id/informasi/berkala",
      "notice": "Data diubah: dinormalisasi ke format JSON API Indonesia"
    }
  }
}
Try it out
Ready
The response will appear here.

Ready to build?

Sign up for free and get a 3,000 credit bonus (Rp3,000) after email verification. No credit card, no commitment.