Dokumentasi OTA Bus Partner API
OTA adalah singkatan dari Online Travel Agent. Dokumentasi ini menjelaskan integrasi partner ke layanan OTA Bus Gateway Bisku: mulai dari pencarian titik keberangkatan dan tujuan, pencarian jadwal, pemilihan kursi, pembuatan booking, sampai konfirmasi pembayaran. Swagger tetap tersedia sebagai referensi teknis endpoint.
Gambaran Umum
Gateway Bisku OTA menyediakan API untuk partner Online Travel Agent yang membutuhkan pencarian rute, jadwal, ketersediaan kursi, booking tiket, dan konfirmasi pembayaran layanan perjalanan bus.
Mulai Integrasi
- Siapkan
X-API-Keyyang tersedia di dashboard. - Ambil origin melalui
GET /v1/ota/points/origins. - Ambil destination berdasarkan origin melalui
GET /v1/ota/points/destinations. - Cari jadwal melalui
POST /v1/ota/schedule/search. - Lanjutkan proses ke pemilihan kursi, booking tiket, dan konfirmasi pembayaran sesuai kebutuhan transaksi.
Authentication
Semua endpoint di bawah /v1/ota wajib memakai API key pada header request.
Headers:
X-API-Key: <partner-api-key>
Content-Type: application/jsonPoints
| Method | Endpoint | Fungsi |
|---|---|---|
| GET | /v1/ota/points/origins | Menampilkan titik keberangkatan yang tersedia untuk akun API partner. |
| GET | /v1/ota/points/destinations | Menampilkan titik tujuan yang tersedia berdasarkan titik keberangkatan yang dipilih. |
Query yang didukung: page, per_page, query, order_by, dan order_mode. Jika pagination tidak dikirim, gateway mengembalikan seluruh data matching.
GET /v1/ota/points/origins?query=senayan&order_by=point_name&order_mode=ASC
GET /v1/ota/points/destinations?origin_point_id=<origin_point_id>Contoh response points
{
"data": [
{
"point_id": "04daa442-4fe4-45ba-a63f-7eeff417aee7",
"point_code": "OTA-456A6910",
"point_name": "MRT Senayan",
"point_detail": "Jakarta Pusat, DKI Jakarta, Indonesia",
"point_address": "Senayan Jakarta Selatan",
"point_lat": "-6.2229",
"point_lng": "106.8006"
}
],
"meta": {
"pagination": false,
"total": 1
}
}Schedule Search
Endpoint schedule mengembalikan daftar jadwal perjalanan dalam format standar Gateway Bisku. Gunakan schedule_id untuk proses seat, booking, dan payment. Field offer_id hanya tersedia untuk kompatibilitas versi lama.
| Method | Endpoint | Fungsi |
|---|---|---|
| POST | /v1/ota/schedule/search | Mencari jadwal perjalanan berdasarkan titik keberangkatan, tujuan, dan tanggal perjalanan. |
POST /v1/ota/schedule/search
{
"origin_point_id": "04daa442-4fe4-45ba-a63f-7eeff417aee7",
"destination_point_id": "ff2cca0f-fb56-4aae-94c5-bc2a6e0ab485",
"departure_date": "2026-10-15",
"passenger_count": 1
}Contoh response schedule
{
"offers": [
{
"schedule_id": "ofr_82ec263ab6dc24263f42df2e",
"departure_service_date": "2026-10-15",
"departure_at": "2026-10-15T09:00:00+07:00",
"origin": { "id": "04daa442-4fe4-45ba-a63f-7eeff417aee7", "name": "MRT Senayan" },
"destination": { "id": "ff2cca0f-fb56-4aae-94c5-bc2a6e0ab485", "name": "Poris" },
"price": { "amount": "255000", "currency": "IDR" },
"attributes": { "traject_id": 818, "bus_id": 5091 }
}
]
}Seats
| Method | Endpoint | Fungsi |
|---|---|---|
| POST | /v1/ota/seats/search | Mengambil peta kursi atau ketersediaan kursi untuk jadwal yang dipilih. |
POST /v1/ota/seats/search
{
"origin_point_id": "04daa442-4fe4-45ba-a63f-7eeff417aee7",
"destination_point_id": "ff2cca0f-fb56-4aae-94c5-bc2a6e0ab485",
"schedule_id": "ofr_82ec263ab6dc24263f42df2e",
"departure_date": "2026-10-15",
"departure_time": "09:00:00",
"passenger_count": 1,
"attributes": { "traject_id": 818, "bus_id": 5091 }
}Contoh response seats/search
{
"seats": [
{
"seat_number": "1A",
"seat_label": "1A",
"available": true,
"row": 1,
"column": 1
},
{
"seat_number": "1B",
"seat_label": "1B",
"available": true,
"row": 1,
"column": 2
}
],
"meta": {
"schedule_id": "ofr_82ec263ab6dc24263f42df2e",
"currency": "IDR"
}
}Booking Tiket & Payment
Booking tiket dan payment memakai endpoint terpisah. Booking dipakai untuk membuat pesanan tiket, sedangkan payment dipakai untuk mengirim konfirmasi pembayaran atas pesanan tersebut.
| Method | Endpoint | Fungsi |
|---|---|---|
| POST | /v1/ota/bookings | Membuat booking tiket untuk jadwal dan kursi yang dipilih. |
| POST | /v1/ota/payments | Mengirim konfirmasi pembayaran untuk booking yang sudah dibuat. |
POST /v1/ota/bookings
{
"schedule_id": "ofr_82ec263ab6dc24263f42df2e",
"origin_point_id": "04daa442-4fe4-45ba-a63f-7eeff417aee7",
"destination_point_id": "ff2cca0f-fb56-4aae-94c5-bc2a6e0ab485",
"departure_date": "2026-10-15",
"departure_time": "09:00:00",
"seat_numbers": ["1A", "1B"],
"passengers": [{ "name": "Budi Santoso", "gender": "male", "age": 30, "phone_number": "08123456789", "email": "budi@example.com" }],
"attributes": { "traject_id": 818 }
}POST /v1/ota/payments
{
"booking_reference": "BKG-20261015-0001",
"payment_reference": "PAY-20261015-0001",
"amount": 510000,
"currency": "IDR",
"paid_at": "2026-10-15T10:15:00+07:00",
"payment_method": "bank_transfer",
"attributes": {
"traject_id": 818
}
}Contoh response booking
{
"booking_reference": "BKG-20261015-0001",
"status": "booked",
"expired_at": "2026-10-15T10:30:00+07:00",
"total_amount": 510000,
"currency": "IDR",
"passengers": [
{
"name": "Budi Santoso",
"seat_number": "1A"
}
]
}Contoh response payment
{
"payment_reference": "PAY-20261015-0001",
"booking_reference": "BKG-20261015-0001",
"status": "paid",
"paid_at": "2026-10-15T10:15:00+07:00"
}Attributes Mapping
attributes digunakan untuk membawa data tambahan dari response sebelumnya ketika diperlukan pada request berikutnya, misalnya traject_id, bus_id, atau detail harga. Kirim field ini sesuai kebutuhan endpoint yang digunakan.
schedule_id, departure_date, seat_numbers, dan passengers sesuai contoh request.attributes hanya untuk data tambahan yang diterima dari response sebelumnya dan diperlukan pada request berikutnya.Contoh penggunaan attributes:
{
"schedule_id": "ofr_82ec263ab6dc24263f42df2e",
"departure_date": "2026-10-15",
"attributes": {
"traject_id": 818,
"bus_id": 5091
}
}Error Handling
| Status | Code | Arti |
|---|---|---|
| 400 | VALIDATION_ERROR | Request body, UUID, atau field wajib tidak valid. |
| 401 | UNAUTHORIZED | X-API-Key kosong, salah, atau expired. |
| 503 | SERVICE_UNAVAILABLE | Layanan sedang tidak tersedia sementara. Silakan coba kembali beberapa saat lagi. |
| 500 | INTERNAL_ERROR | Terjadi kesalahan pada layanan. Silakan coba kembali atau hubungi tim support jika masalah berlanjut. |
Contoh response error
{
"code": "VALIDATION_ERROR",
"message": "request tidak valid"
}