Commute Data Platform

Referensi API

Commute Data API

Data transit Jakarta dan Jabodetabek: stasiun, lin, pumpunan moda, jadwal, dan tarif dari Commuter Line (KCI), MRT Jakarta, LRT Jakarta, LRT Jabodebek, dan TransJakarta.

https://api.commute.shiorilabs.id openapi.json

v1.0.0 · ODbL-1.0 · 12 endpoint

Datanya bebas dipakai dan diolah, asal sumbernya tetap dicantumkan dan hasil olahannya dibagi dengan lisensi yang sama.

Stasiun

Stasiun, jadwalnya, dan transfer antar stasiun.

/stationsget

Semua stasiun dari seluruh operator yang bisa dicari. Stasiun yang cuma dipakai buat routing tidak termasuk di sini. Isinya jarang berubah, jadi bisa di-cache di sisi kamu.

Bentuk data

statusnumber

Sama dengan HTTP status code-nya.

dataStation[]

Berhasil.

{
  "status": 200,
  "data": [
    {
      "id": "KCI-AC",
      "name": "Ancol",
      "officialName": "ANCOL",
      "code": "AC",
      "regionCode": "CGK",
      "operator": "KCI",
      "lines": [
        "KCI:TP"
      ],
      "amenities": [],
      "latitude": -6.128,
      "longitude": 106.8451,
      "score": 19,
      "searchable": true
    },
    {
      "id": "KCI-AK",
      "name": "Angke",
      "officialName": "ANGKE",
      "code": "AK",
      "regionCode": "CGK",
      "operator": "KCI",
      "lines": [
        "KCI:C"
      ],
      "amenities": [],
      "latitude": -6.1446,
      "longitude": 106.8008,
      "score": 46,
      "searchable": true
    },
    "… 401 lainnya"
  ]
}
/stations/{operator}get

Parameter path

operatorstringwajibKCI

Kode operator, misalnya KCI, MRTJ, TJ.

Bentuk data

statusnumber

Sama dengan HTTP status code-nya.

dataStation[]

Berhasil.

{
  "status": 200,
  "data": [
    {
      "id": "KCI-AC",
      "name": "Ancol",
      "officialName": "ANCOL",
      "code": "AC",
      "regionCode": "CGK",
      "operator": "KCI",
      "lines": [
        "KCI:TP"
      ],
      "amenities": [],
      "latitude": -6.128,
      "longitude": 106.8451,
      "score": 19,
      "searchable": true
    },
    {
      "id": "KCI-AK",
      "name": "Angke",
      "officialName": "ANGKE",
      "code": "AK",
      "regionCode": "CGK",
      "operator": "KCI",
      "lines": [
        "KCI:C"
      ],
      "amenities": [],
      "latitude": -6.1446,
      "longitude": 106.8008,
      "score": 46,
      "searchable": true
    },
    "… 110 lainnya"
  ]
}

Kode operator tidak ditemukan.

{
  "status": 404,
  "error": "string"
}
/stations/{operator}/{stationCode}get

Detail lengkap satu stasiun, termasuk fasilitas dan koordinatnya. Beda dengan endpoint daftar, di sini stasiun yang cuma dipakai buat routing juga ikut dikembalikan.

Parameter path

operatorstringwajibKCI

Kode operator, misalnya KCI, MRTJ, TJ.

stationCodestringwajibSUD

Kode stasiun versi operatornya, bukan station id yang lengkap.

Bentuk data

statusnumber

Sama dengan HTTP status code-nya.

Berhasil.

{
  "status": 200,
  "data": {
    "id": "KCI-SUD",
    "name": "Sudirman",
    "officialName": "SUDIRMAN",
    "code": "SUD",
    "regionCode": "CGK",
    "operator": "KCI",
    "lines": [
      "KCI:C"
    ],
    "amenities": [
      {
        "type": "TOILET",
        "text": "Peron 1"
      },
      {
        "type": "PRAYING_ROOM",
        "text": "Peron 1"
      },
      "… 5 lainnya"
    ],
    "latitude": -6.2024,
    "longitude": 106.8237,
    "score": 79,
    "searchable": true
  }
}

Kode operator atau stasiun tidak ditemukan.

{
  "status": 404,
  "error": "string"
}
/stations/{operator}/{stationCode}/timetableget

Semua jadwal keberangkatan dalam satu daftar, tanpa dipisah per lin. Kalau butuh yang sudah dikelompokkan per arah seperti papan keberangkatan, pakai /timetable/grouped. Bisa dipersempit ke rentang jam pakai from dan to (format HH:MM, waktu lokal Asia/Jakarta). Rentangnya dibulatkan ke jam bulat: from=12:13&to=15:18 jadi jam 12 sampai 15, mencakup keberangkatan sampai 15:59. Rentang yang melewati tengah malam ditulis biasa saja, misalnya from=22:00&to=02:00 buat kereta terakhir. Kalau from dan to persis sama, yang keluar sehari penuh.

Parameter path

operatorstringwajibKCI

Kode operator, misalnya KCI, MRTJ, TJ.

stationCodestringwajibSUD

Kode stasiun versi operatornya, bukan station id yang lengkap.

Parameter query

fromstring12:00

Awal rentang jam keberangkatan, format HH:MM 24 jam, waktu lokal Asia/Jakarta. Dibulatkan ke bawah ke jam bulat, jadi 12:13 sama saja dengan 12:00. Kalau cuma to yang diisi, rentangnya mulai dari 00:00.

tostring15:00

Akhir rentang jam keberangkatan. Dibulatkan ke atas sampai akhir jamnya, jadi 15:18 mencakup semua keberangkatan sampai 15:59 dan yang diminta tidak ada yang hilang. Boleh lebih kecil dari from buat rentang yang melewati tengah malam, misalnya 22:00 sampai 02:00. Kalau persis sama dengan from, yang keluar sehari penuh.

Bentuk data

statusnumber

Sama dengan HTTP status code-nya.

dataSchedule[]

Berhasil.

{
  "status": 200,
  "data": [
    {
      "id": "KCI-SUD-5198B",
      "stationId": "KCI-SUD",
      "tripNumber": "5198B",
      "estimatedDeparture": "00: 05: 30",
      "estimatedArrival": "01: 04: 00",
      "boundFor": "Cikarang",
      "lineCode": "C",
      "createdAt": "2026-07-17 10: 12: 30",
      "updatedAt": "2026-07-17 10: 12: 30"
    },
    {
      "id": "KCI-SUD-5752B",
      "stationId": "KCI-SUD",
      "tripNumber": "5752B",
      "estimatedDeparture": "00: 15: 30",
      "estimatedArrival": "00: 22: 00",
      "boundFor": "Manggarai",
      "lineCode": "C",
      "createdAt": "2026-07-17 10: 12: 30",
      "updatedAt": "2026-07-17 10: 12: 30"
    },
    "… 258 lainnya"
  ]
}

Format `from` atau `to` salah (`INVALID_TIME_RANGE`). Pakai `HH:MM` 24 jam.

{
  "status": 404,
  "error": "string"
}

Kode operator atau stasiun tidak ditemukan.

{
  "status": 404,
  "error": "string"
}
/stations/{operator}/{stationCode}/timetable/groupedget

Jadwal keberangkatan yang sudah dikelompokkan per lin, arah, dan tujuan, sesuai bentuk yang ditampilkan papan keberangkatan. Arahnya ditentukan dari stasiun terakhir tiap perjalanan. Kalau butuh response yang lebih ringan, pakai compact=1. Tiap keberangkatan jadi tuple [tripNumber, minutesSinceMidnight], bukan object penuh. Menitnya pakai waktu lokal Asia/Jakarta, dari 0 sampai 1439. Bisa dipersempit ke rentang jam pakai from dan to (format HH:MM, dibulatkan ke jam bulat). Pengelompokannya tetap dihitung dari jadwal sehari penuh, jadi arah dan tujuan yang muncul tidak berubah cuma karena rentangnya dipersempit; yang tersaring keberangkatannya.

Parameter path

operatorstringwajibKCI

Kode operator, misalnya KCI, MRTJ, TJ.

stationCodestringwajibSUD

Kode stasiun versi operatornya, bukan station id yang lengkap.

Parameter query

compactstring1

Isi 1 kalau mau keberangkatannya dalam bentuk tuple. Nilai lain akan mengembalikan bentuk penuh.

fromstring12:00

Awal rentang jam keberangkatan, format HH:MM 24 jam, waktu lokal Asia/Jakarta. Dibulatkan ke bawah ke jam bulat, jadi 12:13 sama saja dengan 12:00. Kalau cuma to yang diisi, rentangnya mulai dari 00:00.

tostring15:00

Akhir rentang jam keberangkatan. Dibulatkan ke atas sampai akhir jamnya, jadi 15:18 mencakup semua keberangkatan sampai 15:59 dan yang diminta tidak ada yang hilang. Boleh lebih kecil dari from buat rentang yang melewati tengah malam, misalnya 22:00 sampai 02:00. Kalau persis sama dengan from, yang keluar sehari penuh.

Bentuk data

statusnumber

Sama dengan HTTP status code-nya.

Berhasil.

{
  "status": 200,
  "data": [
    {
      "line": "KCI:C",
      "timetable": [
        {
          "key": "MRI:MRI",
          "label": [
            "Manggarai",
            "Jatinegara",
            "Cikarang"
          ],
          "platformCode": "2",
          "destinations": [
            {
              "boundFor": "Cikarang",
              "via": null,
              "schedules": [
                {
                  "tripNumber": "5198B",
                  "estimatedDeparture": "00: 05: 30",
                  "boundFor": "Cikarang",
                  "lineCode": "C"
                },
                {
                  "tripNumber": "5018B",
                  "estimatedDeparture": "05: 21: 30",
                  "boundFor": "Cikarang",
                  "lineCode": "C"
                },
                "… 52 lainnya"
              ]
            },
            {
              "boundFor": "Tambun",
              "via": null,
              "schedules": [
                {
                  "tripNumber": "5022C",
                  "estimatedDeparture": "05: 43: 30",
                  "boundFor": "Tambun",
                  "lineCode": "C"
                },
                {
                  "tripNumber": "6018C",
                  "estimatedDeparture": "10: 11: 30",
                  "boundFor": "Tambun",
                  "lineCode": "C"
                },
                {
                  "tripNumber": "5146C",
                  "estimatedDeparture": "18: 03: 30",
                  "boundFor": "Tambun",
                  "lineCode": "C"
                }
              ]
            },
            "… 2 lainnya"
          ]
        },
        {
          "key": "SUDB:",
          "label": [
            "BNI City",
            "Tanah Abang",
            "Kampung Bandan"
          ],
          "platformCode": "1",
          "destinations": [
            {
              "boundFor": "Kampung Bandan",
              "via": null,
              "schedules": [
                {
                  "tripNumber": "5701B",
                  "estimatedDeparture": "04: 20: 00",
                  "boundFor": "Kampung Bandan",
                  "lineCode": "C"
                },
                {
                  "tripNumber": "5505B",
                  "estimatedDeparture": "05: 23: 00",
                  "boundFor": "Kampung Bandan",
                  "lineCode": "C"
                },
                "… 60 lainnya"
              ]
            },
            {
              "boundFor": "Angke",
              "via": null,
              "schedules": [
                {
                  "tripNumber": "5703B",
                  "estimatedDeparture": "04: 35: 00",
                  "boundFor": "Angke",
                  "lineCode": "C"
                },
                {
                  "tripNumber": "5021B",
                  "estimatedDeparture": "04: 59: 00",
                  "boundFor": "Angke",
                  "lineCode": "C"
                },
                "… 66 lainnya"
              ]
            }
          ]
        }
      ]
    }
  ]
}

Format `from` atau `to` salah (`INVALID_TIME_RANGE`). Pakai `HH:MM` 24 jam.

{
  "status": 404,
  "error": "string"
}

Kode operator atau stasiun tidak ditemukan.

{
  "status": 404,
  "error": "string"
}
/stations/{operator}/{stationCode}/timetable/{line}get

Jadwal satu lin di satu stasiun. Sama seperti /timetable, bisa dipersempit pakai from dan to.

Parameter path

operatorstringwajibKCI

Kode operator, misalnya KCI, MRTJ, TJ.

stationCodestringwajibSUD

Kode stasiun versi operatornya, bukan station id yang lengkap.

linestringwajibC

Kode lin yang mau difilter.

Parameter query

fromstring12:00

Awal rentang jam keberangkatan, format HH:MM 24 jam, waktu lokal Asia/Jakarta. Dibulatkan ke bawah ke jam bulat, jadi 12:13 sama saja dengan 12:00. Kalau cuma to yang diisi, rentangnya mulai dari 00:00.

tostring15:00

Akhir rentang jam keberangkatan. Dibulatkan ke atas sampai akhir jamnya, jadi 15:18 mencakup semua keberangkatan sampai 15:59 dan yang diminta tidak ada yang hilang. Boleh lebih kecil dari from buat rentang yang melewati tengah malam, misalnya 22:00 sampai 02:00. Kalau persis sama dengan from, yang keluar sehari penuh.

Bentuk data

statusnumber

Sama dengan HTTP status code-nya.

dataSchedule[]

Berhasil.

{
  "status": 200,
  "data": [
    {
      "id": "KCI-SUD-5198B",
      "stationId": "KCI-SUD",
      "tripNumber": "5198B",
      "estimatedDeparture": "00: 05: 30",
      "estimatedArrival": "01: 04: 00",
      "boundFor": "Cikarang",
      "lineCode": "C",
      "createdAt": "2026-07-17 10: 12: 30",
      "updatedAt": "2026-07-17 10: 12: 30"
    },
    {
      "id": "KCI-SUD-5752B",
      "stationId": "KCI-SUD",
      "tripNumber": "5752B",
      "estimatedDeparture": "00: 15: 30",
      "estimatedArrival": "00: 22: 00",
      "boundFor": "Manggarai",
      "lineCode": "C",
      "createdAt": "2026-07-17 10: 12: 30",
      "updatedAt": "2026-07-17 10: 12: 30"
    },
    "… 258 lainnya"
  ]
}

Format `from` atau `to` salah (`INVALID_TIME_RANGE`). Pakai `HH:MM` 24 jam.

{
  "status": 404,
  "error": "string"
}

Kode operator, stasiun, atau lin tidak ditemukan.

{
  "status": 404,
  "error": "string"
}
/stations/{operator}/{stationCode}/transfersget

Sambungan ke stasiun terdekat, termasuk yang beda operator, lengkap dengan jarak jalan kakinya. Transfer INTERNAL masih di dalam area berbayar, sedangkan EXTERNAL berarti kamu harus tap keluar dulu lalu tap masuk lagi.

Parameter path

operatorstringwajibKCI

Kode operator, misalnya KCI, MRTJ, TJ.

stationCodestringwajibSUD

Kode stasiun versi operatornya, bukan station id yang lengkap.

Bentuk data

statusnumber

Sama dengan HTTP status code-nya.

dataTransfer[]

Berhasil.

{
  "status": 200,
  "data": [
    {
      "id": "T-KCI-SUD-MRTJ-DKA",
      "dataType": "INTERNAL",
      "toStation": {
        "id": "MRTJ-DKA",
        "name": "Dukuh Atas BNI",
        "officialName": "Stasiun Dukuh Atas",
        "code": "DKA",
        "operator": "MRTJ",
        "lines": [
          "MRTJ:M"
        ]
      },
      "distanceM": 90,
      "notes": "Keluar lewat pintu B, lalu jalan lewat Terowongan Kendal dan belok kanan"
    },
    {
      "id": "T-KCI-SUD-LRTJBDB-DKA",
      "dataType": "INTERNAL",
      "toStation": {
        "id": "LRTJBDB-DKA",
        "name": "Dukuh Atas Bank Syariah Indonesia",
        "officialName": "Dukuh Atas",
        "code": "DKA",
        "operator": "LRTJBDB",
        "lines": [
          "LRTJBDB:BK",
          "LRTJBDB:CB"
        ]
      },
      "distanceM": 310,
      "notes": "Keluar lewat pintu C, lalu jalan ke arah JPM Dukuh Atas untuk melanjutkan"
    },
    "… 4 lainnya"
  ]
}

Kode operator atau stasiun tidak ditemukan.

{
  "status": 404,
  "error": "string"
}

Lin

Struktur lin, termasuk percabangan dan loop.

/lines/{operator}/{lineCode}get

Struktur lengkap satu lin, urut dari stasiun awal. Lin yang lurus cuma punya satu segmen TRUNK. Lin yang bercabang seperti loop Cikarang atau ramp Nambo punya segmen tambahan yang menunjukkan di mana cabangnya berpisah dan menyatu lagi.

Parameter path

operatorstringwajibKCI

Kode operator, misalnya KCI, MRTJ, TJ.

lineCodestringwajibC

Kode lin, bisa diambil dari /operators.

Bentuk data

statusnumber

Sama dengan HTTP status code-nya.

Berhasil.

{
  "status": 200,
  "data": {
    "operator": {
      "code": "KCI",
      "name": "Commuter Line"
    },
    "line": {
      "name": "Lin Cikarang",
      "colorCode": "#25B8EB",
      "lineCode": "C",
      "mode": "RAIL",
      "searchable": true
    },
    "segments": [
      {
        "kind": "TRUNK",
        "joinsAtCode": null,
        "stations": [
          {
            "id": "KCI-CKR",
            "code": "CKR",
            "name": "Cikarang",
            "stationNumber": "C26",
            "isInterchange": false,
            "otherLines": []
          },
          {
            "id": "KCI-TLM",
            "code": "TLM",
            "name": "Metland Telagamurni",
            "stationNumber": "C25",
            "isInterchange": false,
            "otherLines": []
          },
          "… 10 lainnya"
        ]
      },
      {
        "kind": "LOOP",
        "joinsAtCode": "JNG",
        "stations": [
          {
            "id": "KCI-POK",
            "code": "POK",
            "name": "Pondok Jati",
            "stationNumber": "C01",
            "isInterchange": false,
            "otherLines": []
          },
          {
            "id": "KCI-KMT",
            "code": "KMT",
            "name": "Kramat",
            "stationNumber": "C02",
            "isInterchange": false,
            "otherLines": []
          },
          "… 12 lainnya"
        ]
      }
    ]
  }
}

Operator atau lin-nya tidak ditemukan, atau lin-nya belum punya data topologi (`NO_TOPOLOGY`).

{
  "status": 404,
  "error": "string"
}

Pumpunan Moda

Kompleks interchange yang menggabungkan beberapa stasiun.

/hubsget

Beberapa stasiun yang dianggap satu tempat karena saling terhubung. Dukuh Atas, misalnya, mencakup Sudirman, BNI City, plus stasiun MRT dan LRT-nya. Diurutkan dari yang paling ramai.

Bentuk data

statusnumber

Sama dengan HTTP status code-nya.

dataHub[]

Berhasil.

{
  "status": 200,
  "data": [
    {
      "id": "HUB-DKA",
      "slug": "dukuh-atas",
      "name": "Dukuh Atas",
      "kind": "hub",
      "heroImage": null,
      "lines": [
        "KCI:C",
        "KCI:A",
        "… 9 lainnya"
      ],
      "members": [
        {
          "id": "KCI-SUD",
          "name": "Sudirman",
          "officialName": "SUDIRMAN",
          "code": "SUD",
          "operator": "KCI",
          "lines": [
            "KCI:C"
          ]
        },
        {
          "id": "KCI-SUDB",
          "name": "BNI City",
          "officialName": "SUDIRMAN BARU",
          "code": "SUDB",
          "operator": "KCI",
          "lines": [
            "KCI:A",
            "KCI:C"
          ]
        },
        "… 5 lainnya"
      ]
    },
    {
      "id": "HUB-CW",
      "slug": "cawang",
      "name": "Cawang",
      "kind": "hub",
      "heroImage": null,
      "lines": [
        "KCI:B",
        "LRTJBDB:BK",
        "… 7 lainnya"
      ],
      "members": [
        {
          "id": "KCI-CW",
          "name": "Cawang",
          "officialName": "CAWANG",
          "code": "CW",
          "operator": "KCI",
          "lines": [
            "KCI:B"
          ]
        },
        {
          "id": "LRTJBDB-CKK",
          "name": "Cikoko",
          "officialName": "Cikoko",
          "code": "CKK",
          "operator": "LRTJBDB",
          "lines": [
            "LRTJBDB:BK",
            "LRTJBDB:CB"
          ]
        },
        "… 2 lainnya"
      ]
    },
    "… 4 lainnya"
  ]
}
/hubs/{slug}get

Satu pumpunan moda lengkap dengan stasiun-stasiun di dalamnya.

Parameter path

slugstringwajibdukuh-atas

Kunci URL pumpunan moda, bisa diambil dari /hubs.

Bentuk data

statusnumber

Sama dengan HTTP status code-nya.

dataHub

Berhasil.

{
  "status": 200,
  "data": {
    "id": "HUB-DKA",
    "slug": "dukuh-atas",
    "name": "Dukuh Atas",
    "kind": "hub",
    "heroImage": null,
    "lines": [
      "KCI:C",
      "KCI:A",
      "… 9 lainnya"
    ],
    "members": [
      {
        "id": "KCI-SUD",
        "name": "Sudirman",
        "officialName": "SUDIRMAN",
        "code": "SUD",
        "operator": "KCI",
        "lines": [
          "KCI:C"
        ]
      },
      {
        "id": "KCI-SUDB",
        "name": "BNI City",
        "officialName": "SUDIRMAN BARU",
        "code": "SUDB",
        "operator": "KCI",
        "lines": [
          "KCI:A",
          "KCI:C"
        ]
      },
      "… 5 lainnya"
    ]
  }
}

Tidak ada pumpunan moda dengan slug tersebut.

{
  "status": 404,
  "error": "string"
}

Tarif

Tarif dan rute antara dua stasiun.

/fares/{from}/{to}get

Mencari rute perjalanan sekaligus menghitung tarifnya. legs adalah perjalanan dari sisi penumpang: naik apa saja dan jalan kaki di mana saja. segments adalah cara tarifnya dihitung, yang bisa berbeda karena tiap operator menagih per perjalanan di jaringan mereka sendiri. Tarif integrasi sudah dihitung di totalFare.

Parameter path

fromstringwajibKCI-SUD

Station id asal, {operator}-{code}.

tostringwajibMRTJ-LBB

Station id tujuan.

Parameter query

paymentMethodstring

Menentukan tarif mana yang dipakai. Default-nya tarif kartu uang elektronik biasa.

atstring2026-07-28T08:00:00Z

Timestamp ISO 8601 buat perjalanannya, dipakai buat menentukan tarif peak atau off-peak. Default-nya waktu sekarang.

Bentuk data

statusnumber

Sama dengan HTTP status code-nya.

Berhasil.

{
  "status": 200,
  "data": {
    "from": {
      "id": "KCI-SUD",
      "name": "Sudirman"
    },
    "to": {
      "id": "MRTJ-LBB",
      "name": "Lebak Bulus Bank Syariah Indonesia"
    },
    "legs": [
      {
        "type": "TRANSFER",
        "from": {
          "id": "KCI-SUD",
          "name": "Sudirman"
        },
        "to": {
          "id": "MRTJ-DKA",
          "name": "Dukuh Atas BNI"
        },
        "distanceM": 90
      },
      {
        "type": "RIDE",
        "line": "MRTJ:M",
        "operator": "MRTJ",
        "from": {
          "id": "MRTJ-DKA",
          "name": "Dukuh Atas BNI"
        },
        "to": {
          "id": "MRTJ-LBB",
          "name": "Lebak Bulus Bank Syariah Indonesia"
        },
        "stationCount": 12,
        "stops": [
          {
            "id": "MRTJ-DKA",
            "name": "Dukuh Atas BNI"
          },
          {
            "id": "MRTJ-STB",
            "name": "Setiabudi Astra"
          },
          "… 10 lainnya"
        ],
        "headsign": "Lebak Bulus Bank Syariah Indonesia",
        "distanceM": 13298
      }
    ],
    "segments": [
      {
        "operator": "MRTJ",
        "from": {
          "id": "MRTJ-DKA",
          "name": "Dukuh Atas BNI"
        },
        "to": {
          "id": "MRTJ-LBB",
          "name": "Lebak Bulus Bank Syariah Indonesia"
        },
        "fare": 14000
      }
    ],
    "totalFare": 14000,
    "totalDistanceM": 13388,
    "transferCount": 1
  }
}

Salah satu stasiunnya tidak ditemukan, tidak ada rute di antara keduanya, atau asal dan tujuannya sama (`SAME_STATION`).

{
  "status": 404,
  "error": "string"
}

Perhitungan tarif gagal (`DATABASE_ERROR`).

{
  "status": 404,
  "error": "string"
}

Operator

Operator transit dan lin yang mereka jalankan.

/operatorsget

Semua operator transit beserta lin yang mereka jalankan. Bagus dipanggil duluan, karena kode dari sini dipakai di seluruh API.

Bentuk data

statusnumber

Sama dengan HTTP status code-nya.

Berhasil.

{
  "status": 200,
  "data": [
    {
      "code": "KCI",
      "name": "Commuter Line",
      "url": "https://kci.id/",
      "timezone": "Asia/Jakarta",
      "lang": "id",
      "mode": "RAIL",
      "lines": [
        {
          "name": "Lin Cikarang",
          "colorCode": "#25B8EB",
          "lineCode": "C",
          "mode": "RAIL",
          "searchable": true
        },
        {
          "name": "Lin Bogor",
          "colorCode": "#EE3D43",
          "lineCode": "B",
          "mode": "RAIL",
          "searchable": true
        },
        "… 4 lainnya"
      ]
    },
    {
      "code": "MRTJ",
      "name": "MRT Jakarta",
      "url": "https://jakartamrt.co.id/",
      "timezone": "Asia/Jakarta",
      "lang": "id",
      "mode": "SUBWAY",
      "lines": [
        {
          "name": "Lin Utara Selatan",
          "colorCode": "#ca2a51",
          "lineCode": "M",
          "mode": "SUBWAY",
          "searchable": true
        }
      ]
    },
    "… 4 lainnya"
  ]
}

Skema

Bentuk data yang dipakai berulang di beberapa endpoint. Tipe di atas menautkan ke sini.

Amenity

Satu fasilitas yang ada di stasiun, kadang dengan keterangan lokasinya.

typeTOILET TOILET_ACCESSIBLE PARKING BIKE_PARKING WIFI CHARGING_STATION PRAYING_ROOM ESCALATOR_UNPAID ESCALATOR_PAID ELEVATOR_UNPAID ELEVATOR_PAID LOCKERS NURSING_ROOM

Fasilitas yang ada di stasiun. TOILET: Toilet · TOILET_ACCESSIBLE: Toilet Difabel · PARKING: Parkir · BIKE_PARKING: Parkir Sepeda · WIFI: WiFi · CHARGING_STATION: Charging Station · PRAYING_ROOM: Mushola · ESCALATOR_UNPAID: Eskalator (Area Umum) · ESCALATOR_PAID: Eskalator (Area Berbayar) · ELEVATOR_UNPAID: Lift (Area Umum) · ELEVATOR_PAID: Lift (Area Berbayar) · LOCKERS: Loker · NURSING_ROOM: Ruang Menyusui.

textstringopsional
CompactGroupedTimetable

Sama dengan GroupedTimetable, tapi tiap keberangkatan diringkas jadi tuple [tripNumber, minutesSinceMidnight] biar payload-nya lebih kecil.

linestring

Lin yang punya keberangkatan ini.

timetableobject[]

Satu entri per arah keberangkatan.

keystring

Key yang stabil buat kelompok arah ini.

labelstring[]

Label arahnya, berisi nama stasiun. Gabungkan pakai " / " kalau mau ditampilkan.

platformCodestring

Info peron yang sudah kita kurasi. Null kalau peronnya belum diketahui.

destinationsobject[]

Satu entri per stasiun akhir di arah ini.

boundForstring

Stasiun akhir yang dituju.

viastring

Terisi kalau ada dua perjalanan ke stasiun akhir yang sama tapi lewat jalur berbeda.

schedulesstring | number[][]

Keberangkatan menuju stasiun akhir itu, urut dari yang paling awal.

Error

Isi error waktu request-nya gagal.

codestring

Kode error yang bisa dibaca mesin, misalnya SAME_STATION, NOT_FOUND.

messagestring
ExternalTransfer

Sambungan ke layanan yang belum ada di API ini. Tidak ada station id atau lin, cuma nama.

idstring
distanceMnumber

Jarak jalan kaki dalam meter.

notesstring

Petunjuk tambahan buat jalan kakinya. Null kalau tidak ada yang perlu dijelaskan.

dataTypeEXTERNAL
toStationobject
namestring
operatorNamestring

Nama operatornya dalam teks biasa, karena layanan di luar API ini tidak punya kode operator.

FareLeg

Satu tahap perjalanan. Dibedakan lewat type.

bentuk 1

bentuk 2

FareLineRef

Lin yang dipakai di satu tahap perjalanan.

linestring

OPERATOR:CODE, dicocokkan ke kamus lin dari /operators.

headsignstring

Stasiun akhir yang dituju perjalanan ini.

FareResult

Hasil pencarian rute: perjalanannya seperti apa (legs) dan tarifnya dihitung bagaimana (segments).

legsFareLeg[]

Perjalanan dari sisi penumpang: naik apa saja dan transfer di mana saja.

segmentsFareSegment[]

Perjalanan dari sisi penagihan tarif.

totalFarenumber

Total dalam rupiah, sudah termasuk batas tarif integrasi. Null kalau tarif buat pasangan stasiun ini tidak bisa dihitung.

totalDistanceMnumber

Total jarak seluruh perjalanan dalam meter.

transferCountnumber

Berapa kali harus pindah kendaraan.

FareRideLeg

Tahap perjalanan naik kendaraan, dari stasiun naik sampai stasiun turun.

typeRIDE
linestring

OPERATOR:CODE, dicocokkan ke kamus lin dari /operators.

operatorKCI MRTJ LRTJ LRTJBDB TJ APCGK

Operator transit. KCI: Commuter Line · MRTJ: MRT Jakarta · LRTJ: LRT Jakarta · LRTJBDB: LRT Jabodebek · TJ: TransJakarta · APCGK: Kalayang Bandara. NUL cuma placeholder internal dan tidak pernah muncul di response.

stationCountnumber

Jumlah stasiun yang dilewati, termasuk stasiun awal dan akhir.

Daftar stasiun lengkap dan urut, dari tempat naik sampai tempat turun.

headsignstring

Stasiun akhir yang dituju. Null kalau tidak bisa ditentukan.

distanceMnumber

Jarak tempuh tahap ini dalam meter.

serviceLinesFareLineRef[]opsional

Cuma muncul di jalur yang dipakai bersama beberapa lin, jadi naik yang mana pun tetap sampai. Lin utamanya ditaruh paling depan.

FareSegment

Satu bagian perjalanan yang ditagih. Tiap operator menagih per perjalanan menerus di jaringan mereka sendiri, makanya segment dan leg tidak selalu satu lawan satu.

operatorKCI MRTJ LRTJ LRTJBDB TJ APCGK

Operator transit. KCI: Commuter Line · MRTJ: MRT Jakarta · LRTJ: LRT Jakarta · LRTJBDB: LRT Jabodebek · TJ: TransJakarta · APCGK: Kalayang Bandara. NUL cuma placeholder internal dan tidak pernah muncul di response.

farenumber

Tarif buat segmen ini dalam rupiah. Null kalau tidak bisa dihitung.

FareStation

Stasiun di dalam hasil pencarian tarif.

idstring
namestring
FareTransferLeg

Tahap pindah kendaraan, biasanya jalan kaki antar peron atau antar stasiun.

typeTRANSFER
distanceMnumber

Jarak jalan kaki dalam meter.

farenumberopsional

Cuma ada di koridor berbayar. Transfer jalan kaki biasa gratis, jadi tidak punya ini.

corridorLabelstringopsional

Nama koridor yang dilewati waktu pindah, kalau ada.

GroupedTimetable

Jadwal satu lin, dikelompokkan tiga tingkat: per arah, lalu per stasiun tujuan, lalu daftar keberangkatannya. Ini bentuk yang dipakai papan keberangkatan.

linestring

Lin yang punya keberangkatan ini.

timetableobject[]

Satu entri per arah keberangkatan.

keystring

Key yang stabil buat kelompok arah ini.

labelstring[]

Label arahnya, berisi nama stasiun. Gabungkan pakai " / " kalau mau ditampilkan.

platformCodestring

Info peron yang sudah kita kurasi. Null kalau peronnya belum diketahui.

destinationsobject[]

Satu entri per stasiun akhir di arah ini.

boundForstring

Stasiun akhir yang dituju.

viastring

Terisi kalau ada dua perjalanan ke stasiun akhir yang sama tapi lewat jalur berbeda.

schedulesSchedule[]

Keberangkatan menuju stasiun akhir itu, urut dari yang paling awal.

Hub

Beberapa stasiun yang dianggap satu tempat karena saling terhubung. Pumpunan moda sendiri tidak punya koordinat, yang punya stasiun-stasiun di dalamnya.

idstring
slugstring

Kunci buat URL-nya. Bisa berubah sewaktu-waktu, jadi pakai id kalau butuh yang stabil.

namestring
kindhub integrated

hub: beberapa stasiun yang namanya berbeda tapi ada di satu kompleks, jadi pengelompokannya membawa informasi. integrated: buat penumpang ini satu tempat yang sama, terpisahnya cuma di data antar operator.

heroImagestring

Foto kompleksnya, buat social card dan header halaman.

linesstring[]

Semua lin yang bisa dinaiki dari sini, sudah digabung dari seluruh stasiun anggotanya.

membersStationRef[]

Stasiun-stasiun yang ada di dalamnya, urut sesuai tampilan.

InternalTransfer

Sambungan ke stasiun lain yang ada di API ini. toStation berisi referensi stasiun lengkap.

idstring
distanceMnumber

Jarak jalan kaki dalam meter.

notesstring

Petunjuk tambahan buat jalan kakinya. Null kalau tidak ada yang perlu dijelaskan.

dataTypeINTERNAL
toStationStationRef
Line

Satu lin, dengan kode dan warna yang dipakai di roundel-nya.

namestring
lineCodestring
colorCodestring

Warna hex buat roundel dan branding lin ini.

modeTransitModeopsional
searchablebooleanopsional

False kalau lin ini cuma dipakai buat routing dan sengaja disembunyikan dari pencarian dan sitemap. Lin seperti ini tetap ada di kamus lin, karena stasiun masih merujuk ke sana, tapi halaman detailnya belum tersedia.

LineDetail

Struktur lengkap satu lin: segmen-segmennya, plus stasiun yang dilewati tiap segmen.

operatorOperator
lineLine
segmentsLineSegment[]

Struktur lin secara urut. Lin sederhana cuma punya satu TRUNK; lin bercabang menambah segmen lain.

LineSegment

Satu ruas lin. Lin lurus cuma punya satu ruas TRUNK; lin bercabang punya beberapa.

kindTRUNK CONTINUATION RAMP LOOP

TRUNK: jalur utama. CONTINUATION: cabang yang meneruskan jalur utama dan terbaca sebagai mainline. RAMP: cabang samping yang memisah. LOOP: cabang yang menyatu kembali ke jalur utama.

joinsAtCodestring

Kode stasiun tempat cabang ini berpisah dari jalur utama; null buat TRUNK.

stationsLineStation[]
LineStation

Satu stasiun di sepanjang lin, urut dari stasiun awal.

idstring
codestring
namestring

Nama tampilan.

stationNumberstring

Label posisi di sepanjang lin, misalnya C13.

isInterchangeboolean

True kalau stasiun ini titik pindah ke lin lain.

otherLinesstring[]

Lin lain dari operator yang SAMA yang berhenti di sini, berupa line key. Lin yang sedang dibuka tidak termasuk. Sambungan lintas operator ada di transfer stasiunnya.

Operator

Operator transit yang menjalankan lin dan stasiun.

codeKCI MRTJ LRTJ LRTJBDB TJ APCGK

Operator transit. KCI: Commuter Line · MRTJ: MRT Jakarta · LRTJ: LRT Jakarta · LRTJBDB: LRT Jabodebek · TJ: TransJakarta · APCGK: Kalayang Bandara. NUL cuma placeholder internal dan tidak pernah muncul di response.

namestring
OperatorWithLines

Operator beserta seluruh lin yang dijalankannya. Ini yang dikembalikan /operators.

codeKCI MRTJ LRTJ LRTJBDB TJ APCGK

Operator transit. KCI: Commuter Line · MRTJ: MRT Jakarta · LRTJ: LRT Jakarta · LRTJBDB: LRT Jabodebek · TJ: TransJakarta · APCGK: Kalayang Bandara. NUL cuma placeholder internal dan tidak pernah muncul di response.

namestring
urlstring

Situs resmi operatornya. Sama dengan agency_url di GTFS.

timezonestring

Zona waktu yang dipakai semua jadwal operator ini. Sama dengan agency_timezone di GTFS, dan selalu Asia/Jakarta di sini.

langstring

Bahasa yang dipakai buat nama stasiun dan lin. Sama dengan agency_lang di GTFS.

linesLine[]
Schedule

Satu keberangkatan: kapan berangkat, menuju ke mana, dan dari peron berapa.

tripNumberstring

Nomor perjalanan versi operatornya. Null kalau operatornya tidak menerbitkan nomor.

estimatedDeparturestring

Waktu lokal, HH:MM:SS.

boundForstring

Stasiun akhir yang dituju perjalanan ini.

lineCodestring
Station

Satu stasiun lengkap dengan fasilitas, koordinat, dan lin yang berhenti di sana.

idstring

Identifier yang stabil, formatnya {operatorCode}-{stationCode}. Pakai ini kalau mau cek tarif.

namestring

Nama yang ditampilkan ke penumpang.

officialNamestring

Nama versi operatornya sendiri, yang sering beda jauh dari nama tampilannya. KCI, misalnya, masih menulis "SUDIRMAN BARU" buat stasiun yang kita tampilkan sebagai "BNI City". Berguna buat pencarian, karena banyak penumpang masih menyebut stasiunnya dengan nama ini.

codestring

Kode stasiun versi operatornya. Unik di dalam satu operator, tapi belum tentu unik antar operator.

operatorKCI MRTJ LRTJ LRTJBDB TJ APCGK

Operator transit. KCI: Commuter Line · MRTJ: MRT Jakarta · LRTJ: LRT Jakarta · LRTJBDB: LRT Jabodebek · TJ: TransJakarta · APCGK: Kalayang Bandara. NUL cuma placeholder internal dan tidak pernah muncul di response.

linesstring[]

Lin yang berhenti di stasiun ini, dalam bentuk key ke kamus lin dari /operators. Kosong kalau stasiunnya cuma dipakai buat routing.

regionCodeCGK BDO YIA

Wilayah, dinamai dari kode IATA bandara besar terdekat. CGK: Jabodetabek · BDO: Bandung Raya · YIA: Jogja-Solo.

amenitiesAmenity[]
latitudenumber

Lintang WGS84. Null kalau koordinatnya belum disurvei.

longitudenumber
scorenumber

Seberapa ramai stasiunnya (0-100), dipakai buat mengurutkan hasil pencarian. Makin tinggi makin ramai. Buat stasiun yang datanya dirilis operator, angkanya dihitung dari jumlah penumpang beneran (gate in-out plus penumpang transit). Sisanya perkiraan dari frekuensi kereta dan bentuk jaringan, bukan hasil pengukuran. TransJakarta belum dihitung, jadi masih 0.

searchableboolean

False kalau stasiunnya cuma dipakai buat routing dan sengaja disembunyikan dari pencarian. Di response daftar selalu true, karena yang seperti itu sudah difilter duluan.

StationRef

Rujukan ringkas ke sebuah stasiun. Dipakai di tempat yang cuma butuh nama dan kodenya, tanpa detail lengkap.

idstring

Identifier yang stabil, formatnya {operatorCode}-{stationCode}. Pakai ini kalau mau cek tarif.

namestring

Nama yang ditampilkan ke penumpang.

officialNamestring

Nama versi operatornya sendiri, yang sering beda jauh dari nama tampilannya. KCI, misalnya, masih menulis "SUDIRMAN BARU" buat stasiun yang kita tampilkan sebagai "BNI City". Berguna buat pencarian, karena banyak penumpang masih menyebut stasiunnya dengan nama ini.

codestring

Kode stasiun versi operatornya. Unik di dalam satu operator, tapi belum tentu unik antar operator.

operatorKCI MRTJ LRTJ LRTJBDB TJ APCGK

Operator transit. KCI: Commuter Line · MRTJ: MRT Jakarta · LRTJ: LRT Jakarta · LRTJBDB: LRT Jabodebek · TJ: TransJakarta · APCGK: Kalayang Bandara. NUL cuma placeholder internal dan tidak pernah muncul di response.

linesstring[]

Lin yang berhenti di stasiun ini, dalam bentuk key ke kamus lin dari /operators. Kosong kalau stasiunnya cuma dipakai buat routing.

Transfer

Dibedakan lewat dataType. Kebanyakan INTERNAL, tapi EXTERNAL juga ada, jadi tangani dua-duanya.

bentuk 1

bentuk 2

TransitMode

Moda transportasinya, mengikuti route_type di GTFS: RAIL (2), SUBWAY (1), TRAM (0), BUS (3), MONORAIL (12).

enum

Kamus

Arti kode-kode yang dipakai di seluruh API.

Fasilitas

TOILET
Toilet
TOILET_ACCESSIBLE
Toilet Difabel
PARKING
Parkir
BIKE_PARKING
Parkir Sepeda
WIFI
WiFi
CHARGING_STATION
Charging Station
PRAYING_ROOM
Mushola
ESCALATOR_UNPAID
Eskalator (Area Umum)
ESCALATOR_PAID
Eskalator (Area Berbayar)
ELEVATOR_UNPAID
Lift (Area Umum)
ELEVATOR_PAID
Lift (Area Berbayar)
LOCKERS
Loker
NURSING_ROOM
Ruang Menyusui

Operator

KCI
Commuter Line
MRTJ
MRT Jakarta
LRTJ
LRT Jakarta
LRTJBDB
LRT Jabodebek
TJ
TransJakarta
APCGK
Kalayang Bandara

Wilayah

CGK
Jabodetabek
BDO
Bandung Raya
YIA
Jogja-Solo

© 2026 Commute Data Platform · Dibuat oleh Shiori Labs