API Masa Nyata
API Pengangkutan (GTFS-R)

Endpoint API GTFS Realtime (Masa Sebenar)

GET https://api.data.gov.my/gtfs-realtime/<feed>/<agency>

Apakah fungsi API GTFS Realtime?

GTFS Realtime adalah lanjutan daripada API GTFS Statik yang membolehkan pengendali pengangkutan awam untuk membekalkan masa ketibaan, amaran gangguan perkhidmatan, dan kedudukan kenderaan secara masa sebenar (realtime). Buat masa ini, API GTFS Realtime kami hanya membekalkan kedudukan kenderaan sahaja; amaran gangguan perkhidmatan dan kemaskini masa ketibaan akan disusuli secara berperingkat pada 2026. Untuk maklumat lanjut mengenai GTFS Realtime dan kegunaannya secara am, sila rujuk kepada https://gtfs.org/realtime/ (opens in a new tab).

Nota: Ralat pengesahan bagi setiap endpoint Kedudukan Kenderaan telah dijana dengan Pengesah GTFS Realtime (opens in a new tab).

Sumber Data bagi GTFS Realtime

API GTFS Realtime menggabungkan data dari pelbagai agensi pengangkutan di Malaysia. Data kami kini merangkumi:

  • KTMB (Keretapi Tanah Melayu Berhad) (opens in a new tab): Pengendali keretapi yang menyediakan perkhidmatan keretapi di seluruh negara.
  • Prasarana (opens in a new tab): Pengendali pengangkutan awam yang bertanggungjawab mengurus pelbagai mod pengangkutan termasuk LRT (Transit Aliran Ringan), MRT (Transit Aliran Massa), monorel, dan perkhidmatan bas.
  • BAS.MY (opens in a new tab): Program Transformasi Bas Berhenti-Henti (SBST) di seluruh Malaysia yang dikendalikan oleh pelbagai pengendali perkhidmatan. Endpoint untuk Johor Bahru, Kangar, Alor Setar, Kuala Terengganu, Kota Bharu, dan Kuching sudahpun tersedia. Kami merancang untuk menambah liputan ke Melaka, Seremban, dan Ipoh menjelang 15 November 2025.

Format Permintaan (Query) dan Respon

API GTFS Realtime menepati piawaian format protobuf GTFS Realtime (.proto). Perincian format yang lengkap boleh didapati di rujukan rasmi GTFS Realtime (opens in a new tab), manakala fail protobuf dapat diakses melalui endpoint berikut:

Kedudukan Kenderaan

GET https://api.data.gov.my/gtfs-realtime/vehicle-position/<agency>

Pengguna data harus mengambil maklum bahawa penilaian terhadap data realtime untuk perkhidmatan bas mungkin akan menunjukkan ralat E028 (opens in a new tab) dari semasa ke semasa, bermakna kedudukan kenderaan yang dilaporkan berada di luar kawasan liputan seperti yang ditakrifkan dalam data statik. Untuk perkhidmatan bas khususnya, pengguna tidak perlu risau kerana tiada ralat pada data statik yang digunakan. Punca ralat ini biasanya adalah data GPS dari transponder kenderaan yang mungkin terlari daripada lokasi sebenar, menyebabkan kedudukan bas berada di luar kawasan liputan agensi buat sementara waktu.

Kekerapan Kemaskini Data

  • Semua data kedudukan kenderaan dikemaskini setiap 30 saat.

KTMB

GET https://api.data.gov.my/gtfs-realtime/vehicle-position/ktmb
# .proto file dkembalikan

Prasarana

GET https://api.data.gov.my/gtfs-realtime/vehicle-position/prasarana?category=<category>
# .proto file dkembalikan

BAS.MY Kangar

GET https://api.data.gov.my/gtfs-realtime/vehicle-position/mybas-kangar
# Fail .proto dikembalikan

BAS.MY Alor Setar

GET https://api.data.gov.my/gtfs-realtime/vehicle-position/mybas-alor-setar
# Fail .proto dikembalikan

BAS.MY Kota Bharu

GET https://api.data.gov.my/gtfs-realtime/vehicle-position/mybas-kota-bharu
# Fail .proto dikembalikan

BAS.MY Kuala Terengganu

GET https://api.data.gov.my/gtfs-realtime/vehicle-position/mybas-kuala-terengganu
# Fail .proto dikembalikan

BAS.MY Melaka

GET https://api.data.gov.my/gtfs-realtime/vehicle-position/mybas-melaka
# Fail .proto dikembalikan

BAS.MY Johor Bahru

GET https://api.data.gov.my/gtfs-realtime/vehicle-position/mybas-johor
# Fail .proto dikembalikan

BAS.MY Kuching

GET https://api.data.gov.my/gtfs-realtime/vehicle-position/mybas-kuching
# Fail .proto dikembalikan
  • Senarai nilai sah bagi <category> adalah rapid-bus-kl, rapid-bus-mrtfeeder, rapid-bus-kuantan dan rapid-bus-penang.
    • Endpoint rapid-rail-kl yang terkandung dalam API GTFS Statik belum lagi dibekalkan dalam API realtime kerana data operasi realtime belum dapat dibekalkan secara stabil.
  • Ralat yang sudah dikenalpasti bagi rapid-bus-kuantan dan rapid-bus-penang:
    • E003 (opens in a new tab): GTFS-rt trip_id tidak wujud dalam data GTFS
    • E004 (opens in a new tab): GTFS-rt route_id tidak wujud dalam data GTFS
      • Ralat ini disebabkan oleh beberapa isu dengan sistem operasi legasi (antaranya yang sudah dipakai lebih daripada sepuluh tahun) yang tidak dapat menjejaki perjalanan kenderaan dan menjana data laluan dengan sempurna. Pasukan kami giat berusaha untuk mengatasi kekangan ini untuk memastikan data realtime menepati piawaian maka menjadi lebih berguna.
  • Ralat yang sudah dikenalpasti bagi rapid-bus-penang:
    • Developer perlu memadankan ID perjalanan (trip ID) dalam data realtime dengan ID perjalanan sedia ada dalam jadual statik. Ini dapat dilaksanakan dengan membandingkan segmen ID perjalanan selepas awalan ID perkhidmatan.
      • Sebagai contoh, ID perjalanan 30000001_1000000855_053000_02 dalam GTFS Realtime sepadan dengan ID perjalanan statik seperti:
        • weekend_30000001_1000000855_053000_02
        • weekday_30000001_1000000855_053000_02
        • 23102302_30000001_1000000855_053000_02
      • Kami telah mengambil keputusan untuk bergantung kepada developer untuk melaksanakan proses padanan ini kerana sebarang pemprosesan data masa sebenar mungkin akan menjejaskan keberfungsian API. Pihak kami akan susuli pembetulan yang lebih menyeleruh pada amsa depan untuk memastikan API statik dan realtime adalah sepadan tanpa perlu sebarang pemprosesan.

Memahami data GTFS Realtime

Untuk membaca data protobuf dengan betul, sila rujuk kepada ikatan bahasa (language bindings) GTFS Realtime rasmi (opens in a new tab) untuk panduan dalam menyahkod data. Kami juga telah sediakan kod Python di bawah sebagai contoh penggunaan data kedudukan kenderaan masa sebenar daripada API GTFS Realtime:

# pip install gtfs-realtime-bindings pandas requests
from google.transit import gtfs_realtime_pb2
from google.protobuf.json_format import MessageToDict
import pandas as pd
from requests import get
 
# Sample GTFS-R URL from Malaysia's Open API
URL = 'https://api.data.gov.my/gtfs-realtime/vehicle-position/prasarana?category=rapid-bus-kl'
 
# Parse the GTFS Realtime feed
feed = gtfs_realtime_pb2.FeedMessage()
response = get(URL)
feed.ParseFromString(response.content)
 
# Extract and print vehicle position information
vehicle_positions = [MessageToDict(entity.vehicle) for entity in feed.entity]
print(f'Total vehicles: {len(vehicle_positions)}')
df = pd.json_normalize(vehicle_positions)
print(df)