# Indonesia KBLI 2025 Converter & Search (`lokalapi/indonesia-kbli`) Actor

Convert KBLI 2020 business codes to KBLI 2025 (mandatory in OSS since June 2026) and find KBLI 2025 codes for a business activity. Official BPS data, flags splits and merges that need review.

- **URL**: https://apify.com/lokalapi/indonesia-kbli.md
- **Developed by:** [lokalapi Data](https://apify.com/lokalapi) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 code converteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Indonesia KBLI 2025 Converter & Search

Convert old **KBLI 2020** business classification codes to **KBLI 2025**, and find the right KBLI 2025 code for a business activity. Built on the official tables of BPS-Statistics Indonesia. Every result says whether a person needs to review it.

### Why you need this

Since **15 June 2026**, Indonesia's licensing system **OSS** (and AHU Online) uses **KBLI 2025**. Every NIB, business license and company record that still carries KBLI 2020 codes has to be mapped to the new classification. The mapping is not one-to-one:

- The official BPS conversion table covers **1,789** KBLI 2020 codes.
- **328** of them are **split** into several KBLI 2025 codes. You have to pick the one(s) that match the actual activity.
- **592** are **merged**: their new KBLI 2025 code also replaces other old codes, so the scope (and possibly the licensing requirements) is broader than before.
- Only **869** map one-to-one.

Consultants, notaries, PMA setup agencies and compliance teams with many client entities get a clean, reviewable list from this Actor instead of searching the PDF code by code.

### What it does

| Mode | Input | Output (one dataset item per…) |
|---|---|---|
| `convert` | List of KBLI 2020 codes (up to 1,000 per run) | …code: status, `needs_review`, hint, KBLI 2025 code(s) with titles |
| `search` | Business activities in English or Indonesian (up to 20 per run) | …activity: best-matching KBLI 2025 codes with title, description and hierarchy |

Status values in `convert` mode:

| `status` | Meaning | `needs_review` |
|---|---|---|
| `one_to_one` | Exactly one KBLI 2025 code, nothing else maps to it | `false` |
| `split` | Several KBLI 2025 candidates. Pick by actual activity; OSS may need more than one | `true` |
| `merged` | One KBLI 2025 code that also replaces other KBLI 2020 codes (`merged_from`) | `true` |
| `not_found` | 5-digit code that is not in the KBLI 2020 conversion table | `true` |
| `invalid` | Not a 5-digit code | `true` |

`split` takes precedence over `merged`. Download the results as CSV, Excel or JSON from the dataset. The run's key-value store also holds an `OUTPUT` record with totals per status.

### Input example

```json
{
  "mode": "convert",
  "codes": ["62019", "46900", "82110", "63122"]
}
```

```json
{
  "mode": "search",
  "queries": ["coffee shop", "software development", "kos-kosan"],
  "limit": 5
}
```

The search understands common English terms (for example "coffee shop", "online store", "boarding house") and maps them to the official Indonesian vocabulary. Search on the `kelompok` level (5 digits) is the default, since OSS uses that level.

### Output example (`convert`)

```json
[
  {
    "kbli2020": "62019",
    "judul2020": "Aktivitas Pemrograman Komputer Lainnya",
    "status": "one_to_one",
    "needs_review": false,
    "hint": null,
    "kbli2025": [{ "kode": "62199", "judul": "AKTIVITAS PEMROGRAMAN KOMPUTER LAINNYA YTDL" }],
    "source": { "publisher": "Badan Pusat Statistik (BPS-Statistics Indonesia), https://www.bps.go.id", "verify": "Verify the final KBLI 2025 codes on oss.go.id before updating OSS/NIB data.", "…": "…" }
  },
  {
    "kbli2020": "82110",
    "judul2020": "Aktivitas Penyedia Gabungan Jasa Administrasi Kantor",
    "status": "merged",
    "needs_review": true,
    "hint": "KBLI 2025 82100 also replaces KBLI 2020 82190. The mapping is clear, but check that the broader scope and its licensing requirements fit.",
    "kbli2025": [{ "kode": "82100", "judul": "AKTIVITAS ADMINISTRASI KANTOR DAN PENUNJANG KANTOR", "merged_from": ["82110", "82190"] }],
    "source": { "…": "…" }
  },
  {
    "kbli2020": "46900",
    "judul2020": "Perdagangan Besar Berbagai Macam Barang",
    "status": "split",
    "needs_review": true,
    "hint": "Split into 2 KBLI 2025 codes. Pick the code(s) that match the actual business activity; OSS may need more than one.",
    "kbli2025": [
      { "kode": "46901", "judul": "PERDAGANGAN BESAR BERBAGAI MACAM BARANG DI GROSIR/PERKULAKAN SWALAYAN" },
      { "kode": "46902", "judul": "PERDAGANGAN BESAR BERBAGAI MACAM BARANG SELAIN DI GROSIR/PERKULAKAN SWALAYAN" }
    ],
    "source": { "…": "…" }
  }
]
```

### Output example (`search`, `"limit": 1`)

```json
{
  "query": "coffee shop",
  "count": 1,
  "hint": null,
  "candidates": [
    {
      "kode": "56303",
      "judul": "AKTIVITAS RUMAH MINUM/KAFE",
      "level": "kelompok",
      "uraian": "Kelompok ini mencakup penyediaan utamanya minuman, baik panas maupun dingin, yang dikonsumsi di tempat usahanya, …",
      "hierarchy": [
        { "kode": "I", "judul": "AKTIVITAS PENYEDIAAN AKOMODASI DAN MAKAN MINUM", "level": "kategori" },
        { "kode": "56", "judul": "AKTIVITAS PENYEDIAAN MAKANAN DAN MINUMAN", "level": "golongan_pokok" },
        { "kode": "563", "judul": "AKTIVITAS PENYEDIAAN MINUMAN", "level": "golongan" },
        { "kode": "5630", "judul": "AKTIVITAS PENYEDIAAN MINUMAN", "level": "subgolongan" }
      ]
    }
  ],
  "source": { "…": "…" }
}
```

### Pricing (pay per event)

| Event | Price | Charged when |
|---|---|---|
| Code converted | **$0.02** per code | A code is `one_to_one`, `split` or `merged` |
| Search query | **$0.02** per activity | The activity returns at least one KBLI 2025 candidate |

**Not charged:** codes that are `not_found` or `invalid`, activities without a match, duplicates in your input, and runs rejected because of invalid input. Apify's standard Actor start fee applies per run.

Examples: 50 codes cost $1.00, a portfolio of 400 codes costs $8.00, 10 activity searches cost $0.20.

The Actor respects the **maximum cost per run** you set. When the limit is reached, it stops, keeps the results so far, and says in the status message how many codes or activities were not processed. Apify's default limit of $5 covers about 249 codes, so raise it for longer lists (for example $20 for 1,000 codes).

### Data sources

- **KBLI 2025** (Klasifikasi Baku Lapangan Usaha Indonesia 2025) and **Tabel Konversi KBLI 2020 – KBLI 2025**, published by Badan Pusat Statistik (BPS-Statistics Indonesia), [bps.go.id](https://www.bps.go.id). Reused with attribution under the BPS terms of use. Every result carries the source in its `source` field.
- This Actor is not affiliated with BPS, OSS or any Indonesian government agency.

### Reference data, not legal advice

The results are reference data from the official BPS tables. They are not legal advice and do not tell you which licenses a business needs. **Verify the final KBLI 2025 codes and their licensing requirements on [oss.go.id](https://oss.go.id) before updating OSS/NIB data.**

### For AI agents and developers

The same data is available as a pay-per-request API and as a remote MCP server at [lokalapi.com](https://lokalapi.com), paid per call with USDC via the [x402](https://www.x402.org) protocol. No account is needed there. The API also includes Indonesian administrative region codes (wilayah).

# Actor input Schema

## `mode` (type: `string`):

<b>convert</b>: turn a list of old KBLI 2020 codes into their KBLI 2025 codes (one result per code). <b>search</b>: find KBLI 2025 codes for business activities described in words.

## `codes` (type: `array`):

5-digit KBLI 2020 codes, e.g. from an NIB, an OSS export or a client list. One code per line; comma-separated lines also work. Duplicates are removed. Up to 1,000 unique codes per run. Each converted code costs $0.02: with Apify's default maximum cost per run of $5, a run stops after about 249 codes, so raise "Max cost per run" for longer lists. Each result says whether the code maps one-to-one, was split into several KBLI 2025 codes, or was merged with other codes, and whether it needs review.

## `queries` (type: `array`):

Describe each business activity in English or Indonesian, e.g. "coffee shop", "software development", "kos-kosan", "nickel mining". One activity per line, up to 20 per run. Each activity returns the best-matching KBLI 2025 codes with title, description and hierarchy.

## `limit` (type: `integer`):

How many KBLI 2025 candidates to return per activity (1–25).

## `level` (type: `string`):

Level of the KBLI hierarchy to search. <b>kelompok</b> (5-digit) is the level used in OSS licensing; the other levels are broader groups.

## Actor input object example

```json
{
  "mode": "convert",
  "codes": [
    "62019",
    "46900",
    "82110",
    "63122"
  ],
  "queries": [
    "coffee shop",
    "software development",
    "boarding house"
  ],
  "limit": 5,
  "level": "kelompok"
}
```

# Actor output Schema

## `results` (type: `string`):

One item per KBLI 2020 code (mode convert) or per business activity (mode search). Download as JSON, CSV or Excel.

## `summary` (type: `string`):

Totals of the run: codes per status (convert) or activities with and without a match (search), charged events, codes skipped because the maximum cost per run was reached.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "convert",
    "codes": [
        "62019",
        "46900",
        "82110",
        "63122"
    ],
    "queries": [
        "coffee shop",
        "software development"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lokalapi/indonesia-kbli").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "convert",
    "codes": [
        "62019",
        "46900",
        "82110",
        "63122",
    ],
    "queries": [
        "coffee shop",
        "software development",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("lokalapi/indonesia-kbli").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "convert",
  "codes": [
    "62019",
    "46900",
    "82110",
    "63122"
  ],
  "queries": [
    "coffee shop",
    "software development"
  ]
}' |
apify call lokalapi/indonesia-kbli --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lokalapi/indonesia-kbli"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/HZwRaaBYSpseHJmdV/builds/8SgtuBw1EWtfkDRli/openapi.json
