API Indonesia docsAPI referenceGet an API keyllms.txt

Finance: exchange rates, minimum wage, QRIS and rupiah

Documentation index for AI agents: /llms.txt. Every page is also available as markdown: add .md to the URL.

Bank Indonesia and ECB exchange rates, UMP 1997-2026, QRIS parsing and rupiah formatting/terbilang.

Exchange rates come from Bank Indonesia (/kurs-bi) and from Frankfurter/ECB (/kurs). Minimum provincial wage (UMP) covers 1997-2026. The utility endpoints parse QRIS payloads and format, parse or spell out (terbilang) rupiah amounts.

All endpoints need the x-api-key header (see Authentication) and return the standard envelope. A successful request costs 2 credits.

Endpoints on this page

Bank Indonesia Rates

GET /api/v1/kurs-bi/latest

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

ParameterInRequiredTypeDescription
currenciesquerynostringComma-separated ISO codes, e.g. USD,EUR,SGD
curl "https://use.apiindonesia.id/api/v1/kurs-bi/latest" \
  -H "x-api-key: YOUR_API_KEY"

Example response (shortened):

{
  "data": [
    {
      "date": "2026-07-09",
      "currency": "USD",
      "buy_rate": 18090,
      "sell_rate": 18095
    }
  ],
  "meta": {
    "attribution": "Sumber: Bank Indonesia",
    "source": "Bank Indonesia"
  }
}

GET /api/v1/kurs-bi/history

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

ParameterInRequiredTypeDescription
currencyquerynostringISO code, default USD
startqueryyesstringYYYY-MM-DD
endqueryyesstringYYYY-MM-DD
curl "https://use.apiindonesia.id/api/v1/kurs-bi/history?start=2026-07-01&end=2026-07-09" \
  -H "x-api-key: YOUR_API_KEY"

Example response (shortened):

{
  "data": [
    {
      "date": "2026-07-09",
      "currency": "USD",
      "mid_rate": 18092.52
    }
  ],
  "meta": {
    "attribution": "Sumber: Bank Indonesia"
  }
}

Exchange Rates

GET /api/v1/kurs/latest

Latest exchange rate. Returns the latest exchange rate for a given currency pair.

ParameterInRequiredTypeDescription
basequerynostringSource currency. Defaults to USD.
targetquerynostringTarget currency. Defaults to IDR.
curl "https://use.apiindonesia.id/api/v1/kurs/latest" \
  -H "x-api-key: YOUR_API_KEY"

Example response (shortened):

{
  "data": {
    "id": "kr_2026-07-03_USD_IDR",
    "date": "2026-07-03",
    "base": "USD",
    "target": "IDR",
    "rate": 16350.5,
    "source": "Frankfurter/ECB"
  }
}

GET /api/v1/kurs/history

Historical exchange rates. Returns historical exchange rates for a given date range.

ParameterInRequiredTypeDescription
basequerynostringSource currency. Defaults to USD.
targetquerynostringTarget currency. Defaults to IDR.
startqueryyesstringStart date, YYYY-MM-DD format.
endqueryyesstringEnd date, YYYY-MM-DD format.
curl "https://use.apiindonesia.id/api/v1/kurs/history?start=2026-06-01&end=2026-06-30" \
  -H "x-api-key: YOUR_API_KEY"

Example response (shortened):

{
  "data": [
    {
      "id": "kr_2026-06-01_USD_IDR",
      "date": "2026-06-01",
      "base": "USD",
      "target": "IDR",
      "rate": 16290,
      "source": "Frankfurter/ECB"
    }
  ]
}

Minimum Provincial Wages (UMP)

GET /api/v1/ump

List UMP (latest first). All provincial minimum wage records. Use query params to filter.

ParameterInRequiredTypeDescription
yearquerynonumberSpecific year (1997–2026)
province_namequerynostringProvince name (case-insensitive, partial)
min_salaryquerynonumberMinimum salary (IDR)
max_salaryquerynonumberMaximum salary (IDR)
curl "https://use.apiindonesia.id/api/v1/ump" \
  -H "x-api-key: YOUR_API_KEY"

Example response (shortened):

{
  "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
  }
}

GET /api/v1/ump/{province_code}

UMP per province (all years). All UMP records for one province, sorted by latest year.

ParameterInRequiredTypeDescription
province_codepathyesstringProvince code (e.g., 32 = West Java)
curl "https://use.apiindonesia.id/api/v1/ump/32" \
  -H "x-api-key: YOUR_API_KEY"

Example response (shortened):

{
  "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
  }
}

GET /api/v1/ump/{province_code}/{year}

UMP province × year. A single UMP record for a specific province and year.

ParameterInRequiredTypeDescription
province_codepathyesstringProvince code
yearpathyesnumberYear (1997–2026)
curl "https://use.apiindonesia.id/api/v1/ump/32/2025" \
  -H "x-api-key: YOUR_API_KEY"

Example response (shortened):

{
  "data": {
    "id": "ump-32-2025",
    "province_code": "32",
    "province_name": "JAWA BARAT",
    "year": 2025,
    "salary": 2500000
  }
}

Developer Utilities

POST /api/v1/util/rupiah/format

Format Rupiah. Formats a number as Indonesian Rupiah string.

Body fieldRequiredTypeDescription
amountyesnumberAmount in IDR
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}'

Example response (shortened):

{
  "data": {
    "formatted": "Rp125.000",
    "amount": 125000
  }
}

POST /api/v1/util/qris/parse

Parse QRIS. Decodes a QRIS EMVCo payload string.

Body fieldRequiredTypeDescription
payloadyesstringQRIS string
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"}'

Example response (shortened):

{
  "success": true,
  "data": {
    "valid": true,
    "fields": [
      {
        "id": "00",
        "length": 2,
        "value": "01"
      },
      {
        "id": "01",
        "length": 2,
        "value": "11"
      }
    ],
    "merchant_name": "TOKO CONTO",
    "merchant_city": "JAKARTA"
  }
}

POST /api/v1/util/rupiah/parse

Parse Rupiah. Parses Rupiah text into a number.

Body fieldRequiredTypeDescription
textyesstringRupiah text.
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"}'

Example response (shortened):

{
  "success": true,
  "data": {
    "amount": 125000
  }
}

POST /api/v1/util/rupiah/terbilang

Spell out Rupiah. Spells out an IDR amount.

Body fieldRequiredTypeDescription
amountyesnumberAmount.
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}'

Example response (shortened):

{
  "success": true,
  "data": {
    "terbilang": "seratus dua puluh lima ribu rupiah"
  }
}

POST /api/v1/util/qris/to-dynamic

Convert to dynamic QRIS. Adds an amount to static QRIS and recalculates CRC.

Body fieldRequiredTypeDescription
payloadyesstringStatic QRIS payload.
amountyesnumberIDR amount.
feenonumberOptional fee.
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}'

Example response (shortened):

{
  "success": true,
  "data": {
    "payload": "0002010102125204581253033605405500005802ID5910TOKO CONTO6007JAKARTA6304BB73"
  }
}