# Code chạy ở đâu

> Lệnh quản lý gọi được từ mọi nơi; điều khiển trình duyệt chỉ chạy được trên máy đang mở phiên.

Browlix có hai loại lệnh gọi, và chúng chạy ở hai nơi khác nhau.

## Lệnh quản lý: ở đâu cũng được

Mọi thứ trong [tham chiếu API](https://browlix.com/en/docs/reference) — tạo hồ sơ, mở và dừng phiên, đọc lượt chạy, quản lý webhook — là lệnh gọi HTTPS tới `browlix.com`. Gọi từ máy chủ, laptop, CI hay một AI agent trên cloud đều được.

## Điều khiển trình duyệt: trên máy đang mở phiên

Điều khiển chính trang web (Playwright, Puppeteer hay Chrome DevTools Protocol) đi qua một broker do Browlix worker chạy **trên cùng máy với trình duyệt**:

1. `sessions.attach` trả về vé và `endpoint: ws://127.0.0.1:<port>/cdp`.
2. Broker chỉ nghe trên địa chỉ loopback. Không gì bên ngoài máy đó với tới được.
3. Broker chỉ nhận kết nối có vé hợp lệ, còn hạn, đúng phiên, và từ chối khi phiên đã chuyển sang trạng thái khác.

Vì vậy đoạn code gọi `connectOverCDP` phải chạy trên máy đó — ví dụ một script đặt cạnh worker, hoặc một app của bạn chạy ở đó. Agent trên cloud nhận được vé cũng không dùng được từ nơi khác: địa chỉ trỏ về chính máy của agent, và broker cũng sẽ từ chối.

```text
máy chủ / agent ──HTTPS──▶ browlix.com ──lệnh──▶ worker trên máy A
                                                  │
                  script trên máy A ──ws://127.0.0.1──▶ broker ──▶ trình duyệt
```

## Xem và điều khiển từ máy khác

Muốn xem hay thao tác trình duyệt từ máy khác, dùng **Xem từ xa** trên web: trang được truyền hình ảnh và chuyển thao tác theo quy tắc giành quyền của workspace. Tính năng này dành cho người, không dành cho code tự động.

## Chọn máy

`devices.list` trả về hệ điều hành của từng máy, máy có trực tuyến không và còn mở được bao nhiêu phiên. `sessions.start` cần `device_id` rõ ràng; qua API, Browlix không tự chọn máy thay bạn.
