Developer API

Build bots, integrations, and tools with the mig33 Reborn real-time WebSocket API.

WebSocket JSON mig33.developer.ws.v1

Endpoint

Developer API sekarang menggunakan WebSocket-only. Tidak ada public HTTP login โ€” semua komunikasi dilakukan melalui satu koneksi WebSocket.

WebSocket URL
wss://developer.mig33.id/developer/ws
๐Ÿ’ก
WebSocket Only

Public HTTP login tidak dipakai. Semua autentikasi dan command dilakukan melalui WebSocket connection.

Login Flow

Berikut alur lengkap autentikasi Developer API melalui WebSocket:

1
Open Connection

Client membuka koneksi WebSocket ke wss://developer.mig33.id/developer/ws.

2
Auth Required

API mengirim event awal auth.required yang menandakan koneksi siap menerima kredensial.

3
Send Login

Client mengirim developer.login berisi username dan password.

4
Validation

API memvalidasi kredensial dan status akun.

5
Session Ready

Jika valid, API mengirim session.ready dengan data developer dan permissions.

6
Session Replaced

Jika akun yang sama login dari socket lain, socket lama menerima session.replaced lalu ditutup.

7
Ping Keep Alive

Setelah session.ready, client wajib mengirim ping berkala. Jika tidak ada ping selama 60 detik, WebSocket ditutup.

SEND developer.login

Kirim kredensial untuk autentikasi ke Developer API.

Parameters

FieldTypeRequiredDescription
typestringYesHarus "developer.login"
usernamestringYesUsername akun mig33 Reborn
passwordstringYesPassword akun
Send โ€” Login Request
{
  "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:

Response โ€” session.ready
{
  "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"
  }
}
๐Ÿ’ก
Wallet di Response

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

FieldTypeDescription
developer.developer_idstringUnique developer identifier
developer.usernamestringUsername yang login
developer.permissionsarrayDaftar permission yang dimiliki
expires_atstring (ISO 8601)Waktu expired session

Login Failed Response

Jika kredensial tidak valid, API mengirim error response:

Response โ€” error
{
  "type": "error",
  "data": {
    "error": "developer_login_failed",
    "message": "developer credentials are invalid"
  }
}

Error Codes

Error CodeDescription
developer_login_failedUsername atau password salah

Duplicate Login

Jika ID yang sama login lagi dari koneksi lain, socket lama menerima event session.replaced lalu koneksi ditutup otomatis:

Event โ€” session.replaced (ke socket lama)
{
  "type": "session.replaced",
  "data": {
    "message": "logged_in_elsewhere"
  }
}
โš ๏ธ
Socket Lama Ditutup

Setelah menerima session.replaced, koneksi WebSocket lama akan ditutup oleh server. Client harus menghandle reconnection logic jika diperlukan.

SEND ping

Developer client mengatur ping sendiri. API tidak mengirim ping otomatis. Kirim minimal setiap 30โ€“50 detik.

โš ๏ธ
Ping Timeout

Jika client tidak mengirim ping selama 60 detik setelah login sukses, socket ditutup dengan reason ping_timeout.

Ping Request

Send โ€” ping
{
  "type": "ping"
}

Pong Response

Response โ€” pong
{
  "type": "pong",
  "data": {
    "time": "2026-07-03T00:00:00Z"
  }
}
๐Ÿ—‚๏ธ Room Commands
SEND room.join

Join sebuah chat room. Requires rooms.join permission. Diproses direct โ€” response suksesnya adalah room.join.result, bukan job queue.

Parameters

FieldTypeRequiredDescription
typestringYesHarus "room.join"
roomstringYesNama room yang ingin dijoin
Send
{
  "type": "room.join",
  "room": "MIG33"
}
SEND room.leave

Leave sebuah chat room. Requires rooms.leave permission. Diproses direct โ€” response suksesnya adalah room.leave.result, bukan job queue.

Parameters

FieldTypeRequiredDescription
typestringYesHarus "room.leave"
roomstringYesNama room yang ingin ditinggalkan
Send
{
  "type": "room.leave",
  "room": "MIG33"
}
SEND room.participants

Dapatkan daftar participant di sebuah room. Requires rooms.read permission.

Parameters

FieldTypeRequiredDescription
typestringYesHarus "room.participants"
roomstringYesNama room (harus sudah joined)
Send
{
  "type": "room.participants",
  "room": "MIG33"
}
SEND room.kick

Vote-kick user dari sebuah room. Requires rooms.kick permission.

๐Ÿ’ก
Vote-Kick System

room.kick menggunakan sistem vote-kick. Tidak ada direct kick khusus Developer API.

Parameters

FieldTypeRequiredDescription
typestringYesHarus "room.kick"
roomstringYesNama room
target_usernamestringYesUsername target yang ingin di-kick
Send
{
  "type": "room.kick",
  "room": "MIG33",
  "target_username": "targetid"
}
SEND room.send_message

Kirim pesan ke chat room. Requires messaging.send permission.

Parameters

FieldTypeRequiredDescription
typestringYesHarus "room.send_message"
roomstringYesNama room tujuan
messagestringYesIsi pesan yang ingin dikirim
Send
{
  "type": "room.send_message",
  "room": "MIG33",
  "message": "hello"
}
๐Ÿ’ฐ Wallet
SEND wallet.balance

Cek saldo CR akun yang sedang login. Requires wallet.read permission. Diproses direct.

Request

Send โ€” wallet.balance
{
  "type": "wallet.balance"
}

Response

Response โ€” wallet.balance.result
{
  "type": "wallet.balance.result",
  "data": {
    "wallet": {
      "balance_milli_cr": 13271400,
      "balance_cr": "13271.4",
      "label": "13271.4 CR"
    }
  }
}
โš ๏ธ
Rate Limit

Maksimal 10 request per 1 detik per akun.

SEND wallet.transfer

Transfer CR ke user lain. Requires wallet.transfer permission. Diproses direct.

Parameters

FieldTypeRequiredDescription
typestringYesHarus "wallet.transfer"
to_usernamestringYesUsername penerima
amount_milli_crintegerYesJumlah dalam milli CR (1000 = 1 CR)
pinstringYesPIN akun pengirim
idempotency_keystringYesKey unik per transfer (cegah dobel potong saat retry)

Request

Send โ€” wallet.transfer
{
  "type": "wallet.transfer",
  "to_username": "targetid",
  "amount_milli_cr": 1000,
  "pin": "123456",
  "idempotency_key": "unique-transfer-001"
}

Response

Response โ€” wallet.transfer.result
{
  "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"
    }
  }
}
โš ๏ธ
Rate Limit

Maksimal 10 transfer per 1 detik per akun.

โš™๏ธ Job Status

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:

Response โ€” room.kick.queued
{
  "type": "room.kick.queued",
  "data": {
    "status": "queued",
    "job": {
      "job_id": "abc123"
    }
  }
}

Check Job Status

Kirim job.get untuk mengecek apakah job sudah selesai:

Send โ€” job.get
{
  "type": "job.get",
  "job_id": "abc123"
}

Job Fields

FieldTypeDescription
typestringHarus "job.get"
job_idstringJob ID yang diterima dari queued response
๐Ÿ“ฆ Multi ID & Security

Multi ID

Untuk login beberapa ID sekaligus, buka koneksi WebSocket terpisah untuk setiap akun. Setiap koneksi login dengan username/password akun masing-masing.

Contoh โ€” 3 Koneksi Terpisah
// 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"}
โš ๏ธ
Satu Username = Satu Koneksi

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:

RuleDetail
Password di responseAPI tidak pernah menampilkan password di response.
Audit logAPI tidak menulis password ke audit log.
PermissionsPassword-login diberi permission: rooms.read, rooms.join, rooms.leave, rooms.kick, messaging.send, wallet.read, dan wallet.transfer.

Available Permissions

PermissionTypeDescription
rooms.readReadList rooms dan get participants
rooms.joinActionJoin chat rooms
rooms.leaveActionLeave chat rooms
rooms.kickActionVote-kick users dari rooms
messaging.sendActionKirim pesan ke room
wallet.readReadCek saldo CR
wallet.transferActionTransfer CR ke user lain
๐Ÿ”’
Security First

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?

Status:๐ŸŸข All systems operational