# Finance: exchange rates, minimum wage, QRIS and rupiah

> Documentation index for AI agents: [/llms.txt](https://docs.apiindonesia.id/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](https://docs.apiindonesia.id/authentication.md)) and return the standard [envelope](https://docs.apiindonesia.id/errors.md). A successful request costs 2 credits.

## Endpoints on this page

- [`GET /api/v1/kurs/latest`](#get-api-v1-kurs-latest): Latest exchange rate
- [`GET /api/v1/kurs/history`](#get-api-v1-kurs-history): Historical exchange rates
- [`GET /api/v1/ump`](#get-api-v1-ump): List UMP (latest first)
- [`GET /api/v1/ump/{province_code}`](#get-api-v1-ump-province-code): UMP per province (all years)
- [`GET /api/v1/ump/{province_code}/{year}`](#get-api-v1-ump-province-code-year): UMP province × year
- [`POST /api/v1/util/rupiah/format`](#post-api-v1-util-rupiah-format): Format Rupiah
- [`POST /api/v1/util/qris/parse`](#post-api-v1-util-qris-parse): Parse QRIS
- [`POST /api/v1/util/rupiah/parse`](#post-api-v1-util-rupiah-parse): Parse Rupiah
- [`POST /api/v1/util/rupiah/terbilang`](#post-api-v1-util-rupiah-terbilang): Spell out Rupiah
- [`POST /api/v1/util/qris/to-dynamic`](#post-api-v1-util-qris-to-dynamic): Convert to dynamic QRIS
- [`GET /api/v1/kurs-bi/latest`](#get-api-v1-kurs-bi-latest): Latest rates
- [`GET /api/v1/kurs-bi/history`](#get-api-v1-kurs-bi-history): Rate history

## Bank Indonesia Rates

### GET /api/v1/kurs-bi/latest

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

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `currencies` | query | no | string | Comma-separated ISO codes, e.g. USD,EUR,SGD |

```bash
curl "https://use.apiindonesia.id/api/v1/kurs-bi/latest" \
  -H "x-api-key: YOUR_API_KEY"
```

Example response (shortened):

```json
{
  "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).

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `currency` | query | no | string | ISO code, default USD |
| `start` | query | yes | string | YYYY-MM-DD |
| `end` | query | yes | string | YYYY-MM-DD |

```bash
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):

```json
{
  "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.

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `base` | query | no | string | Source currency. Defaults to USD. |
| `target` | query | no | string | Target currency. Defaults to IDR. |

```bash
curl "https://use.apiindonesia.id/api/v1/kurs/latest" \
  -H "x-api-key: YOUR_API_KEY"
```

Example response (shortened):

```json
{
  "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.

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `base` | query | no | string | Source currency. Defaults to USD. |
| `target` | query | no | string | Target currency. Defaults to IDR. |
| `start` | query | yes | string | Start date, YYYY-MM-DD format. |
| `end` | query | yes | string | End date, YYYY-MM-DD format. |

```bash
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):

```json
{
  "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.

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `year` | query | no | number | Specific year (1997–2026) |
| `province_name` | query | no | string | Province name (case-insensitive, partial) |
| `min_salary` | query | no | number | Minimum salary (IDR) |
| `max_salary` | query | no | number | Maximum salary (IDR) |

```bash
curl "https://use.apiindonesia.id/api/v1/ump" \
  -H "x-api-key: YOUR_API_KEY"
```

Example response (shortened):

```json
{
  "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.

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `province_code` | path | yes | string | Province code (e.g., 32 = West Java) |

```bash
curl "https://use.apiindonesia.id/api/v1/ump/32" \
  -H "x-api-key: YOUR_API_KEY"
```

Example response (shortened):

```json
{
  "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.

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `province_code` | path | yes | string | Province code |
| `year` | path | yes | number | Year (1997–2026) |

```bash
curl "https://use.apiindonesia.id/api/v1/ump/32/2025" \
  -H "x-api-key: YOUR_API_KEY"
```

Example response (shortened):

```json
{
  "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 field | Required | Type | Description |
| --- | --- | --- | --- |
| `amount` | yes | number | Amount in IDR |

```bash
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):

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

### POST /api/v1/util/qris/parse

**Parse QRIS.** Decodes a QRIS EMVCo payload string.

| Body field | Required | Type | Description |
| --- | --- | --- | --- |
| `payload` | yes | string | QRIS string |

```bash
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):

```json
{
  "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 field | Required | Type | Description |
| --- | --- | --- | --- |
| `text` | yes | string | Rupiah text. |

```bash
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):

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

### POST /api/v1/util/rupiah/terbilang

**Spell out Rupiah.** Spells out an IDR amount.

| Body field | Required | Type | Description |
| --- | --- | --- | --- |
| `amount` | yes | number | Amount. |

```bash
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):

```json
{
  "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 field | Required | Type | Description |
| --- | --- | --- | --- |
| `payload` | yes | string | Static QRIS payload. |
| `amount` | yes | number | IDR amount. |
| `fee` | no | number | Optional fee. |

```bash
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):

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