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. The free plan includes 1,000 requests per month, enough to start building.

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 a monthly quota based on your plan.

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

1,000 requests/month (Free)

When exhausted, the API responds with 402 QUOTA_EXCEEDED. The Pro planincludes 50,000 requests/month, and Business includes 250,000 requests/month. The quota resets 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.
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 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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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/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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response · 200 OK
{
  "data": [
    {
      "id": "3273",
      "province_id": "32",
      "code": "32.73",
      "name": "KOTA BANDUNG",
      "alt_name": "Kota Bandung",
      "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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response · 200 OK
{
  "data": {
    "id": "3273",
    "province_id": "32",
    "code": "32.73",
    "name": "KOTA BANDUNG",
    "alt_name": "Kota Bandung",
    "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/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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response · 200 OK
{
  "data": [
    {
      "id": "3273010",
      "regency_id": "3273",
      "code": "32.73.01",
      "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. 3273010.
Request
curl "https://use.apiindonesia.id/api/v1/wilayah/kecamatan/3273010" \
  -H "x-api-key: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response · 200 OK
{
  "data": {
    "id": "3273010",
    "regency_id": "3273",
    "code": "32.73.01",
    "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/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=3273010" \
  -H "x-api-key: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response · 200 OK
{
  "data": [
    {
      "id": "3273010001",
      "district_id": "3273010",
      "code": "32.73.01.1001",
      "name": "ISOLA",
      "alt_name": "Isola",
      "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. 3273010001.
Request
curl "https://use.apiindonesia.id/api/v1/wilayah/kelurahan/3273010001" \
  -H "x-api-key: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response · 200 OK
{
  "data": {
    "id": "3273010001",
    "district_id": "3273010",
    "code": "32.73.01.1001",
    "name": "ISOLA",
    "alt_name": "Isola",
    "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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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 region, level, and status filters.

Query Parameter

provinsi_idstring
Filter by province code.
kabupaten_idstring
Filter by regency/city code.
jenisstring
School level: SD, SMP, SMA, SMK, or SLB.
statusstring
School status: Negeri (state) or Swasta (private).
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?kabupaten_id=3273&jenis=SMA&status=Negeri" \
  -H "x-api-key: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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",
      "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 its province and regency/city names.

Path Parameter

npsnstringRequired
NPSN (national school ID).
Request
curl "https://use.apiindonesia.id/api/v1/sekolah/20219557" \
  -H "x-api-key: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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"
  }
}
Try it out
Ready
The response will appear here.
API Referencex-api-key

Universities

Directory of 4,300+ state and private 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

provinsi_idstring
Filter by province code.
kabupaten_idstring
Filter by regency/city code.
jenisstring
Type: universitas, institut, politeknik, akademi, or sekolah_tinggi.
kelompokstring
Group: PTN (state) or PTS (private).
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?provinsi_id=32&kelompok=PTN" \
  -H "x-api-key: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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 3,000+ hospitals across Indonesia with type, class, ownership, bed capacity, and contact details.

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

List hospitals

Returns a paginated, filterable list of hospitals, including province and regency/city names.

Query Parameter

provinsi_idstring
Filter by province code.
kabupaten_idstring
Filter by regency/city code.
jenisstring
Hospital type: RSUM (general), RSWS (regional/private), RSP (teaching), RSJ (psychiatric), RSK (specialty).
kelasstring
Hospital class: A, B, C, D, or Pratama.
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?kabupaten_id=3273&kelas=A" \
  -H "x-api-key: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response · 200 OK
{
  "data": [
    {
      "id": "rs_3273_001",
      "name": "RSUP Dr. Hasan Sadikin",
      "jenis": "RSUM",
      "kelas": "A",
      "ownership": "Kemenkes",
      "is_blu": 1,
      "province_id": "32",
      "regency_id": "3273",
      "address": "Jl. Pasteur No. 38",
      "postal_code": "40161",
      "phone": "0222034953",
      "beds_total": 944,
      "icu_beds": 40,
      "is_active": 1,
      "province_name": "JAWA BARAT",
      "regency_name": "KOTA BANDUNG"
    }
  ],
  "meta": {
    "total": 3,
    "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 single hospital by ID, including province and regency/city names.

Path Parameter

idstringRequired
Hospital ID.
Request
curl "https://use.apiindonesia.id/api/v1/rumah-sakit/rs_3273_001" \
  -H "x-api-key: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response · 200 OK
{
  "data": {
    "id": "rs_3273_001",
    "name": "RSUP Dr. Hasan Sadikin",
    "jenis": "RSUM",
    "kelas": "A",
    "ownership": "Kemenkes",
    "is_blu": 1,
    "province_id": "32",
    "regency_id": "3273",
    "address": "Jl. Pasteur No. 38",
    "postal_code": "40161",
    "phone": "0222034953",
    "beds_total": 944,
    "icu_beds": 40,
    "doctors_gp": 78,
    "doctors_spec": 312,
    "is_active": 1,
    "province_name": "JAWA BARAT",
    "regency_name": "KOTA BANDUNG"
  }
}
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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 a paginated list of postal codes. Can be filtered by province, regency/city, or district.

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.
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response · 200 OK
{
  "data": [
    {
      "id": "kp_3273010001",
      "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
    }
  ],
  "meta": {
    "total": 151,
    "page": 1,
    "per_page": 20,
    "total_pages": 8
  }
}
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_3273010001.
Request
curl "https://use.apiindonesia.id/api/v1/kodepos/kp_3273010001" \\
  -H "x-api-key: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response · 200 OK
{
  "data": {
    "id": "kp_3273010001",
    "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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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 56 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 56 vehicle plate codes, sorted by code.

Request
curl "https://use.apiindonesia.id/api/v1/plates" \\
  -H "x-api-key: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxx" -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: aip_live_xxx" -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: aip_live_xxx" -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: aip_live_xxx" -H "Content-Type: application/json" \
  -d '{"payload":"000201..."}'
Response · 200 OK
{
  "data": { "merchant_name": "TOKO", "amount": 50000, "currency": "360" }
}
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: aip_live_xxx"
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: aip_live_xxx"
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: aip_live_xxx"
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: aip_live_xxx"
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: aip_live_xxx"
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: aip_live_xxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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. Every paid plan grants credits; requests beyond the included quota debit 1 credit per successful request.

GET/billing/plans

Plan list

Returns available plans, monthly/yearly pricing, quotas, and rate limits.

Request
curl "https://use.apiindonesia.id/billing/plans"
Response · 200 OK
{
  "data": {
    "plans": {
      "free": { "monthlyPrice": 0, "monthlyQuota": 1000 },
      "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": 25000, "amount": 29000 },
      "standard": { "credits": 50000, "amount": 59000 },
      "growth": { "credits": 100000, "amount": 109000 },
      "scale": { "credits": 250000, "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.

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. 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": 50000,
    "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 and the 50 most recent ledger entries. Successful requests beyond the included quota debit 1 credit; failed requests are refunded automatically.

Request
curl "https://use.apiindonesia.id/billing/credits" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Response · 200 OK
{
  "data": {
    "balance": 48750,
    "cost_per_successful_request": 1,
    "free_monthly_included_credits": 1000,
    "ledger": [
      {
        "id": "8f1c...",
        "type": "usage",
        "amount": 1,
        "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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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: aip_li...x"
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: aip_li...x"
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.

Ready to build?

Sign up for free and get 1,000 requests per month. No credit card, no commitment.