Endpoint
Developer API sekarang menggunakan WebSocket-only. Tidak ada public HTTP login โ semua komunikasi dilakukan melalui satu koneksi WebSocket.
wss://developer.mig33.id/developer/ws
Public HTTP login tidak dipakai. Semua autentikasi dan command dilakukan melalui WebSocket connection.
Login Flow
Berikut alur lengkap autentikasi Developer API melalui WebSocket:
Client membuka koneksi WebSocket ke wss://developer.mig33.id/developer/ws.
API mengirim event awal auth.required yang menandakan koneksi siap menerima kredensial.
Client mengirim developer.login berisi username dan password.
API memvalidasi kredensial dan status akun.
Jika valid, API mengirim session.ready dengan data developer dan permissions.
Jika akun yang sama login dari socket lain, socket lama menerima session.replaced lalu ditutup.
Setelah session.ready, client wajib mengirim ping berkala. Jika tidak ada ping selama 60 detik, WebSocket ditutup.
developer.login
Kirim kredensial untuk autentikasi ke Developer API.
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Harus "developer.login" |
username | string | Yes | Username akun mig33 Reborn |
password | string | Yes | Password akun |
{
"type": "developer.login",
"username": "superman",
"password": "password-akun"
}
Login Success Response
Jika kredensial valid, API mengirim session.ready berisi data developer, daftar permissions, dan waktu expired session:
{
"type": "session.ready",
"data": {
"developer": {
"developer_id": "user:usr_xxxxx",
"username": "superman",
"permissions": [
"rooms.read",
"rooms.join",
"rooms.leave",
"rooms.kick",
"messaging.send",
"wallet.read",
"wallet.transfer"
],
"wallet": {
"balance_milli_cr": 13271400,
"balance_cr": "13271.4",
"label": "13271.4 CR"
}
},
"wallet": {
"balance_milli_cr": 13271400,
"balance_cr": "13271.4",
"label": "13271.4 CR"
},
"expires_at": "2026-07-02T18:00:00Z"
}
}
Field wallet juga tersedia di job.status.result.data.wallet setelah action room selesai, sehingga client bisa refresh saldo. Untuk cek saldo terbaru, kirim wallet.balance.
Response Fields
| Field | Type | Description |
|---|---|---|
developer.developer_id | string | Unique developer identifier |
developer.username | string | Username yang login |
developer.permissions | array | Daftar permission yang dimiliki |
expires_at | string (ISO 8601) | Waktu expired session |
Login Failed Response
Jika kredensial tidak valid, API mengirim error response:
{
"type": "error",
"data": {
"error": "developer_login_failed",
"message": "developer credentials are invalid"
}
}
Error Codes
| Error Code | Description |
|---|---|
developer_login_failed | Username atau password salah |
Duplicate Login
Jika ID yang sama login lagi dari koneksi lain, socket lama menerima event session.replaced lalu koneksi ditutup otomatis:
{
"type": "session.replaced",
"data": {
"message": "logged_in_elsewhere"
}
}
Setelah menerima session.replaced, koneksi WebSocket lama akan ditutup oleh server. Client harus menghandle reconnection logic jika diperlukan.
ping
Developer client mengatur ping sendiri. API tidak mengirim ping otomatis. Kirim minimal setiap 30โ50 detik.
Jika client tidak mengirim ping selama 60 detik setelah login sukses, socket ditutup dengan reason ping_timeout.
Ping Request
{
"type": "ping"
}
Pong Response
{
"type": "pong",
"data": {
"time": "2026-07-03T00:00:00Z"
}
}
room.join
Join sebuah chat room. Requires rooms.join permission. Diproses direct โ response suksesnya adalah room.join.result, bukan job queue.
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Harus "room.join" |
room | string | Yes | Nama room yang ingin dijoin |
{
"type": "room.join",
"room": "MIG33"
}
room.leave
Leave sebuah chat room. Requires rooms.leave permission. Diproses direct โ response suksesnya adalah room.leave.result, bukan job queue.
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Harus "room.leave" |
room | string | Yes | Nama room yang ingin ditinggalkan |
{
"type": "room.leave",
"room": "MIG33"
}
room.participants
Dapatkan daftar participant di sebuah room. Requires rooms.read permission.
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Harus "room.participants" |
room | string | Yes | Nama room (harus sudah joined) |
{
"type": "room.participants",
"room": "MIG33"
}
room.kick
Vote-kick user dari sebuah room. Requires rooms.kick permission.
room.kick menggunakan sistem vote-kick. Tidak ada direct kick khusus Developer API.
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Harus "room.kick" |
room | string | Yes | Nama room |
target_username | string | Yes | Username target yang ingin di-kick |
{
"type": "room.kick",
"room": "MIG33",
"target_username": "targetid"
}
room.send_message
Kirim pesan ke chat room. Requires messaging.send permission.
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Harus "room.send_message" |
room | string | Yes | Nama room tujuan |
message | string | Yes | Isi pesan yang ingin dikirim |
{
"type": "room.send_message",
"room": "MIG33",
"message": "hello"
}
wallet.balance
Cek saldo CR akun yang sedang login. Requires wallet.read permission. Diproses direct.
Request
{
"type": "wallet.balance"
}
Response
{
"type": "wallet.balance.result",
"data": {
"wallet": {
"balance_milli_cr": 13271400,
"balance_cr": "13271.4",
"label": "13271.4 CR"
}
}
}
Maksimal 10 request per 1 detik per akun.
wallet.transfer
Transfer CR ke user lain. Requires wallet.transfer permission. Diproses direct.
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Harus "wallet.transfer" |
to_username | string | Yes | Username penerima |
amount_milli_cr | integer | Yes | Jumlah dalam milli CR (1000 = 1 CR) |
pin | string | Yes | PIN akun pengirim |
idempotency_key | string | Yes | Key unik per transfer (cegah dobel potong saat retry) |
Request
{
"type": "wallet.transfer",
"to_username": "targetid",
"amount_milli_cr": 1000,
"pin": "123456",
"idempotency_key": "unique-transfer-001"
}
Response
{
"type": "wallet.transfer.result",
"data": {
"status": "transferred",
"wallet": {
"balance_milli_cr": 9000,
"balance_cr": "9",
"label": "9 CR"
},
"recipient_wallet": {
"balance_milli_cr": 11000,
"balance_cr": "11",
"label": "11 CR"
}
}
}
Maksimal 10 transfer per 1 detik per akun.
Job Status
Hanya room.kick dan room.send_message yang masuk queue dan mengembalikan job_id. Command lainnya (room.join, room.leave, room.participants, wallet.balance, wallet.transfer) diproses direct.
Queued Response
Setelah mengirim room command (contoh: room.kick), API mengembalikan response dengan status queued:
{
"type": "room.kick.queued",
"data": {
"status": "queued",
"job": {
"job_id": "abc123"
}
}
}
Check Job Status
Kirim job.get untuk mengecek apakah job sudah selesai:
{
"type": "job.get",
"job_id": "abc123"
}
Job Fields
| Field | Type | Description |
|---|---|---|
type | string | Harus "job.get" |
job_id | string | Job ID yang diterima dari queued response |
Multi ID
Untuk login beberapa ID sekaligus, buka koneksi WebSocket terpisah untuk setiap akun. Setiap koneksi login dengan username/password akun masing-masing.
// Connection 1
{"type":"developer.login","username":"id1","password":"password1"}
// Connection 2
{"type":"developer.login","username":"id2","password":"password2"}
// Connection 3
{"type":"developer.login","username":"id3","password":"password3"}
Jika username yang sama login ulang dari koneksi baru, session lama otomatis diganti (session.replaced).
Security Notes
Berikut hal-hal penting terkait keamanan Developer API:
| Rule | Detail |
|---|---|
| Password di response | API tidak pernah menampilkan password di response. |
| Audit log | API tidak menulis password ke audit log. |
| Permissions | Password-login diberi permission: rooms.read, rooms.join, rooms.leave, rooms.kick, messaging.send, wallet.read, dan wallet.transfer. |
Available Permissions
| Permission | Type | Description |
|---|---|---|
rooms.read | Read | List rooms dan get participants |
rooms.join | Action | Join chat rooms |
rooms.leave | Action | Leave chat rooms |
rooms.kick | Action | Vote-kick users dari rooms |
messaging.send | Action | Kirim pesan ke room |
wallet.read | Read | Cek saldo CR |
wallet.transfer | Action | Transfer CR ke user lain |
Selalu gunakan koneksi wss:// (WebSocket Secure). Jangan pernah mengirim kredensial melalui koneksi yang tidak terenkripsi.
๐ฌ Developer Support
Butuh bantuan dengan API? Ada pertanyaan atau feature request?