API REFERENCE · PRISM PRO

Tài liệu API cục bộ: quản lý hồ sơ trình duyệt bằng script.

API tự động hóa cục bộ của Prism Pro chỉ lắng nghe trên 127.0.0.1 của máy bạn và dùng mã thông báo truy cập được tạo mới mỗi lần API khởi động. Bất kỳ ngôn ngữ lập trình nào gửi được yêu cầu HTTP đều có thể dùng API này để tạo hồ sơ đơn lẻ hoặc hàng loạt, rồi truy vấn, khởi chạy và đóng hồ sơ.

Cập nhật ngày · Tổng hợp theo mã nguồn ứng dụng Prism 0.3.22

Tổng quan

API cục bộ là tính năng của Prism Pro, phù hợp để quản lý hồ sơ hàng loạt bằng script của riêng bạn: tạo hồ sơ từ dữ liệu nghiệp vụ, khởi chạy lần lượt, kiểm tra trạng thái và đóng khi dùng xong. API chỉ quản lý bản thân hồ sơ, không đọc cookie, mật khẩu, thông tin đăng nhập proxy hay nội dung trang web, và cũng không cung cấp endpoint gỡ lỗi cho Puppeteer / Playwright. Khi cần để AI đọc trang web, nhấp và điền biểu mẫu, hãy dùng MCP.

Thông tin cơ bản về API cục bộ
Hạng mụcMô tả
Địa chỉhttp://127.0.0.1:<port>; cổng được chọn ngẫu nhiên mỗi lần khởi động API, chỉ chấp nhận yêu cầu từ máy tính này
Xác thựcHeader Authorization: Bearer <token>; mã thông báo chỉ hiển thị một lần khi khởi động API và mất hiệu lực khi dừng API
Định dạng dữ liệuJSON (UTF-8); kết quả của phản hồi thành công nằm trong trường result
Thân yêu cầuChỉ các endpoint tạo hồ sơ nhận thân yêu cầu JSON, tối đa 96 KiB
Giới hạn tốc độTối đa 120 yêu cầu mỗi 60 giây, dùng chung với MCP
Thời gian chờMỗi yêu cầu chờ tối đa 60 giây
Phiên bản áp dụngPrism Pro; như nhau trên macOS và Windows; các endpoint tạo hồ sơ cần bản 0.3.22 trở lên

Bắt đầu nhanh

  1. Khởi động API cục bộ

    Trong Prism, mở “API tự động hóa” ở thanh bên trái rồi nhấp “Khởi động API cục bộ”. Tính năng này yêu cầu Prism Pro.

  2. Sao chép địa chỉ và mã thông báo

    Cửa sổ sẽ hiển thị “Địa chỉ API” và “Mã thông báo truy cập phiên”. Mã thông báo chỉ hiển thị một lần khi khởi động thành công, vì vậy hãy sao chép ngay; nếu sau này cần mã thông báo mới, hãy dừng rồi khởi động lại API.

  3. Gửi yêu cầu đầu tiên

    Đặt hai biến trong terminal, rồi kiểm tra trạng thái dịch vụ và liệt kê hồ sơ. Nếu phản hồi có "state": "running" thì địa chỉ và mã thông báo đã dùng được.

PRISM_API='http://127.0.0.1:43123'   # the API address shown in Prism
PRISM_TOKEN='<token>'                # the token shown in Prism

curl -H "Authorization: Bearer $PRISM_TOKEN" "$PRISM_API/v1/status"
curl -H "Authorization: Bearer $PRISM_TOKEN" "$PRISM_API/v1/profiles"

Trong Windows PowerShell, curl là bí danh của một lệnh khác; hãy gõ curl.exe, hoặc dùng Invoke-RestMethod có sẵn trong PowerShell:

$api = 'http://127.0.0.1:43123'
$headers = @{ Authorization = 'Bearer <token>' }
(Invoke-RestMethod -Uri "$api/v1/profiles" -Headers $headers).result | Format-Table serialNumber, name, status

Quy tắc yêu cầu

API chỉ chấp nhận yêu cầu do script hoặc chương trình trên máy tính này gửi. Yêu cầu vi phạm một trong các quy tắc dưới đây sẽ không được thực thi và trả về lỗi tương ứng trong bảng:

Quy tắc yêu cầu và lỗi tương ứng
Quy tắcHTTPLỗi
Truy cập bằng 127.0.0.1, không dùng localhost: header Host phải khớp chính xác với địa chỉ API403invalid_host
Mọi yêu cầu đều phải kèm Authorization: Bearer <token>401unauthorized
Không có header Origin của trình duyệt, vì vậy JavaScript trong trang web và tiện ích mở rộng trình duyệt không thể gọi API403browser_origin_not_allowed
URL không có tham số truy vấn (?…)400query_not_allowed
Chỉ dùng các đường dẫn và phương thức được liệt kê bên dưới404not_found
Chỉ các endpoint tạo hồ sơ nhận thân yêu cầu; các yêu cầu khác như khởi chạy, đóng thì ngay cả {} cũng không được gửi400body_not_allowed
Các endpoint tạo hồ sơ dùng Content-Type: application/json; thân yêu cầu là một đối tượng JSON400json_body_required / invalid_json_body
Thân yêu cầu không vượt quá 96 KiB413request_too_large
Tối đa 120 yêu cầu mỗi 60 giây; yêu cầu thất bại và yêu cầu MCP cũng được tính429rate_limited

Prism xử lý lần lượt từng yêu cầu của API cục bộ và MCP theo thứ tự nhận được. Khởi chạy hồ sơ cần kiểm tra proxy và mở trình duyệt, thường mất vài giây; trong thời gian đó, các yêu cầu sau phải xếp hàng chờ. Hãy đợi yêu cầu trước trả về rồi mới gửi yêu cầu tiếp theo.

Danh sách endpoint

Các endpoint của API cục bộ
Phương thứcĐường dẫnChức năng
GET/v1/statusKiểm tra dịch vụ có khả dụng không
GET/v1/profilesLiệt kê tất cả hồ sơ (trừ hồ sơ trong thùng rác)
GET/v1/profiles/{id}/statusTruy vấn một hồ sơ
POST/v1/profiles/{id}/startKhởi chạy hồ sơ
POST/v1/profiles/{id}/closeĐóng hồ sơ, giữ nguyên dữ liệu
POST/v1/profilesTạo một hồ sơ (từ bản 0.3.22)
POST/v1/profiles/batchTạo 1–50 hồ sơ mỗi lần (từ bản 0.3.22)

{id} là ID hồ sơ, lấy từ kết quả của GET /v1/profiles. Mọi phản hồi thành công đều có trạng thái HTTP 200; trừ GET /v1/status, kết quả nằm trong trường result. API không có endpoint để sửa hay xóa hồ sơ.

Đối tượng hồ sơ

Các endpoint liệt kê hồ sơ, truy vấn trạng thái, khởi chạy và đóng đều trả về cùng một đối tượng hồ sơ:

Các trường của đối tượng hồ sơ
TrườngLoạiMô tả
idchuỗiID hồ sơ, dùng cho các endpoint khác
serialNumbersố nguyênSố thứ tự hồ sơ hiển thị trong ứng dụng; không được dùng lại sau khi xóa
namechuỗiTên hồ sơ
groupchuỗiNhóm; là chuỗi rỗng nếu hồ sơ không thuộc nhóm nào
tagsmảng chuỗiThẻ
statuschuỗiclosed đã đóng, starting đang khởi chạy, running đang chạy, stopping đang đóng, orphaned có tiến trình sót lại, error lỗi
lastOpenedAtchuỗiThời điểm mở gần nhất (ISO 8601, UTC); hồ sơ chưa từng mở sẽ không có trường này
{
  "result": {
    "id": "8f0c2b9e-4d6a-4f51-9a7e-2f1c3d5b6a70",
    "serialNumber": 12,
    "name": "Shop A",
    "group": "Project A",
    "tags": ["automation"],
    "status": "running",
    "lastOpenedAt": "2026-10-02T08:30:00.000Z"
  }
}

Các endpoint không trả về địa chỉ và thông tin đăng nhập proxy, thông số vân tay, cookie, mật khẩu, dữ liệu trang web hay dữ liệu tiện ích mở rộng.

Truy vấn, khởi chạy và đóng

GET /v1/status

Trả về trạng thái dịch vụ, dùng để xác nhận địa chỉ và mã thông báo hoạt động. Đây là phản hồi duy nhất không nằm trong result:

{
  "state": "running",
  "transport": "loopback",
  "protocolVersion": 1
}

GET /v1/profiles

Trả về mảng các đối tượng hồ sơ, hồ sơ được sửa đổi gần nhất xếp trước. Hồ sơ trong thùng rác không có trong danh sách.

GET /v1/profiles/{id}/status

Trả về trạng thái hiện tại của một hồ sơ. Nếu hồ sơ không tồn tại hoặc đã được chuyển vào thùng rác, API trả về 404 PROFILE_NOT_FOUND.

POST /v1/profiles/{id}/start

  • Tương tự như nhấp “Mở” trong ứng dụng: Prism kiểm tra nhân và giấy phép nhân Pro, kiểm tra proxy và sự thay đổi IP đầu ra, rồi mở cửa sổ trình duyệt. Khi thành công, API trả về đối tượng hồ sơ có trạng thái running.
  • Nếu hồ sơ đang chạy, API trả về ngay trạng thái hiện tại và không mở thêm lần nữa.
  • Prism chỉ xử lý yêu cầu tiếp theo sau khi một yêu cầu khởi chạy đã trả về. Để khởi chạy hàng loạt, chỉ cần gọi lần lượt cho từng hồ sơ; số hồ sơ có thể chạy cùng lúc phụ thuộc vào bộ nhớ và CPU của máy tính.
  • Nếu thiếu nhân tương ứng, kiểm tra proxy không đạt, IP đầu ra của proxy đã thay đổi (khi chính sách là block) hoặc còn tiến trình sót lại, việc khởi chạy sẽ thất bại và trả về 502, trong đó error.message nêu rõ nguyên nhân.
  • Qua API, những trường hợp mà ứng dụng cần bạn xác nhận mới tiếp tục được sẽ thất bại ngay, ví dụ khi dữ liệu vị trí địa lý của đầu ra proxy mâu thuẫn giữa các nguồn. Khi gặp những lỗi này, bạn có thể mở hồ sơ đó trong ứng dụng Prism, hoặc chuyển danh tính mạng của hồ sơ sang manual.
  • Các hồ sơ mà bạn đã gọi endpoint khởi chạy (kể cả hồ sơ đang chạy sẵn lúc gọi) được ghi nhận lại và sẽ cùng bị đóng khi bạn nhấp “Dừng khẩn cấp” trong cửa sổ “API tự động hóa”. “Dừng API” cũng như các nút dừng và dừng khẩn cấp trong cửa sổ MCP chỉ dừng API; các hồ sơ này vẫn mở.

POST /v1/profiles/{id}/close

Đóng cửa sổ trình duyệt, giữ nguyên dữ liệu hồ sơ và trả về đối tượng hồ sơ có trạng thái closed; nếu hồ sơ không chạy, API cũng trả về closed ngay. Nếu trình duyệt chưa thoát sau 8 giây và vẫn chiếm thư mục dữ liệu, trạng thái trả về là orphaned; gọi endpoint đóng thêm một lần nữa sẽ kết thúc tiến trình sót lại.

PROFILE_ID='8f0c2b9e-4d6a-4f51-9a7e-2f1c3d5b6a70'   # an id from GET /v1/profiles
curl -X POST -H "Authorization: Bearer $PRISM_TOKEN" "$PRISM_API/v1/profiles/$PROFILE_ID/start"
curl -X POST -H "Authorization: Bearer $PRISM_TOKEN" "$PRISM_API/v1/profiles/$PROFILE_ID/close"

Tạo hồ sơ

Các endpoint tạo hồ sơ lưu hồ sơ mới ở trạng thái đã đóng và không mở trình duyệt. Mọi trường đều có thể bỏ qua: trường bị bỏ qua sẽ dùng cùng giá trị mặc định như “Hồ sơ mới” trong ứng dụng, và mỗi hồ sơ đều được tạo seed vân tay mới. Yêu cầu có trường không xác định sẽ bị từ chối.

Tạo một hồ sơ

curl -X POST "$PRISM_API/v1/profiles" \
  -H "Authorization: Bearer $PRISM_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: shop-b-001" \
  -d '{
    "name": "Shop B",
    "group": "Project A",
    "tags": ["automation"],
    "startUrls": ["https://example.com/"],
    "proxy": { "protocol": "socks5", "host": "203.0.113.10", "port": 1080, "username": "user", "password": "pass" }
  }'

Khi thành công, API trả về hồ sơ mới:

{
  "result": {
    "id": "3b1f7a52-9c4e-4d2b-8f60-1a2b3c4d5e6f",
    "serialNumber": 13,
    "name": "Shop B",
    "group": "Project A",
    "tags": ["automation"],
    "status": "closed"
  }
}

Tạo hàng loạt

Thân yêu cầu của POST /v1/profiles/batch là mảng profiles, mỗi yêu cầu 1–50 hồ sơ; mỗi phần tử viết giống như khi tạo một hồ sơ, chỉ khác là requestKey phải đặt ở cấp gốc của thân yêu cầu hoặc trong header. Prism kiểm tra toàn bộ cấu hình trước; chỉ cần một hồ sơ có lỗi là không hồ sơ nào được tạo, và thông báo lỗi sẽ chỉ rõ hồ sơ nào, trường nào bị sai (profiles[1] là hồ sơ thứ hai, vì chỉ số bắt đầu từ 0). Kết quả được trả về theo thứ tự đầu vào:

{
  "requestKey": "shops-batch-001",
  "profiles": [
    { "name": "Shop C", "group": "Project A" },
    { "name": "Shop D", "group": "Project A", "fingerprint": { "platform": "windows" } }
  ]
}
{
  "result": {
    "profiles": [
      { "id": "…", "serialNumber": 14, "name": "Shop C", "group": "Project A", "tags": [], "status": "closed" },
      { "id": "…", "serialNumber": 15, "name": "Shop D", "group": "Project A", "tags": [], "status": "closed" }
    ],
    "count": 2
  }
}

Các trường của hồ sơ

Các trường khi tạo hồ sơ
TrườngMô tảKhi bỏ qua
nameTên, 1–60 ký tự“API” kèm một số, ví dụ API 8: số này bằng số hồ sơ hiện có cộng 1, tăng dần khi tạo hàng loạt, và có thể trùng với tên hồ sơ đã có
groupNhóm, tối đa 40 ký tựKhông có nhóm
tagsMảng thẻ, tối đa 20 thẻ, mỗi thẻ tối đa 30 ký tựKhông có
noteGhi chú, tối đa 500 ký tựKhông có
colorMàu đánh dấu, #RRGGBBLần lượt xoay vòng theo bảng màu
startUrlsMảng trang bắt đầu, tối đa 50 trang; chỉ hỗ trợ http / https, không được chứa tên người dùng và mật khẩu; địa chỉ không ghi giao thức sẽ được coi là httpsTrang web chính thức của Prism
proxyProxy, xem bảng bên dướiKết nối trực tiếp
fingerprintTùy chọn vân tay, xem bảng bên dướiGiống như khi tạo hồ sơ mới trong ứng dụng
extensionIdsID nội bộ trong Prism của các tiện ích mở rộng đã cài, tối đa 50 ID. Trong cửa sổ “Tiện ích mở rộng”, tên thư mục trong đường dẫn tiện ích …/<ID>/extension chính là ID này; đây không phải ID tiện ích trên Cửa hàng Chrome trực tuyếnKhông bật tiện ích mở rộng nào
kernelVersionGhim một phiên bản nhân, dạng bốn phần số, ví dụ 144.0.7559.132; phiên bản đó phải được cài sẵn khi khởi chạy hồ sơTheo nhân mặc định
requestKeyMã yêu cầu dùng để thử lại an toàn, xem “Thử lại và chống trùng lặp”Không có

Các trường proxy

Các trường proxy (proxy)
TrườngMô tả
protocolBắt buộc: direct, http, https hoặc socks5
hostTên máy chủ hoặc IP, không kèm giao thức, cổng hay thông tin đăng nhập; bắt buộc nếu không phải direct
portSố nguyên từ 1 đến 65535; bắt buộc nếu không phải direct
username、passwordKhông bắt buộc. Mật khẩu được mã hóa và lưu trên máy tính này, không endpoint nào trả về mật khẩu

Các trường vân tay

Các trường vân tay (fingerprint)
TrườngMô tảKhi bỏ qua
platformmacos hoặc windowsTheo mẫu phần cứng; nếu không chỉ định mẫu thì là hệ điều hành của máy tính này
hardwareProfileIdMẫu phần cứng, xem bảng bên dưới. Phiên bản hệ điều hành, số lõi CPU và kích thước màn hình do mẫu quyết địnhMẫu “riêng theo seed” của hệ điều hành tương ứng
seedSeed vân tay, số nguyên từ 0 đến 4294967295; cùng một seed và cùng các cài đặt vân tay khác sẽ cho ra cùng một vân tayTạo ngẫu nhiên
brandChrome hoặc EdgeChrome
brandVersionSố phiên bản trình duyệt. Thường để trống để dùng phiên bản của nhân; nếu điền, phiên bản chính phải khớp với nhân dùng để khởi chạy, nếu không hồ sơ sẽ không khởi chạy đượcTheo nhân
languageNgôn ngữ giao diện, ví dụ en-USNgôn ngữ hệ thống của máy tính này
acceptLanguagesHeader Accept-LanguageTự động tạo theo ngôn ngữ
timezoneMúi giờ IANA, ví dụ America/New_YorkMúi giờ của máy tính này
networkIdentityModeproxy: kiểm tra đầu ra proxy trước khi khởi chạy, múi giờ và vị trí địa lý theo đầu ra, ngôn ngữ cũng theo đầu ra nếu nhận diện được quốc gia của đầu ra; manual: luôn dùng các giá trị đã điềnproxy
proxyExitPolicyKhi IP đầu ra của proxy khác với lần kiểm tra trước: block khiến lần khởi chạy này thất bại và việc khởi chạy lại được coi là xác nhận, vì vậy script không nên tự động thử lại khi gặp lỗi này; warn chỉ cảnh báoblock
webrtcPolicyproxy_only chống rò rỉ; public_only chỉ giao diện mạng công khai; default mặc định hệ thốngproxy_only

Mẫu phần cứng

ID mẫu phần cứng
IDHệ điều hànhMô tả
macos-seeded-applemacOSGPU Apple riêng theo seed, phù hợp khi dùng nhiều hồ sơ; mặc định trên macOS
macos-hostmacOSPhần cứng gốc của máy này; chỉ dùng được trên Mac
macos-m1macOSApple M1 · 8GB
macos-m3-promacOSApple M3 Pro · 18GB
macos-m4-promacOSApple M4 Pro · 24GB
windows-seeded-nvidiaWindowsGPU NVIDIA riêng theo seed, phù hợp khi dùng nhiều hồ sơ; mặc định trên Windows
windows-hostWindowsPhần cứng gốc của máy này; chỉ dùng được trên máy tính Windows
windows-10-rtx3060WindowsWindows 10 · RTX 3060 · 16GB
windows-11-rtx4060WindowsWindows 11 · RTX 4060 · 16GB
windows-11-rtx4070WindowsWindows 11 · RTX 4070 · 32GB

Nếu mẫu không khớp với platform, yêu cầu sẽ bị từ chối. Vị trí và kích thước cửa sổ, cookie, dữ liệu tiện ích mở rộng và các thiết lập tương tự không thể đặt qua API; bạn có thể thay đổi chúng trong ứng dụng Prism sau khi tạo.

Thử lại và chống trùng lặp

Khi mạng bị gián đoạn hoặc yêu cầu hết thời gian chờ, bạn có thể không biết hồ sơ đã được tạo hay chưa. Hãy gắn một mã yêu cầu cho mỗi lần tạo, khi đó việc thử lại sẽ không tạo trùng hồ sơ:

  • Gửi mã yêu cầu dài 8–128 ký tự trong header Idempotency-Key hoặc trường requestKey của thân yêu cầu; được dùng chữ cái Latinh không dấu, chữ số và . _ : -. Nếu gửi ở cả hai nơi, hai giá trị phải giống nhau.
  • Thử lại với cùng mã và cùng nội dung trong vòng 24 giờ sẽ trả về các hồ sơ đã tạo ở lần đầu (HTTP 200), kể cả sau khi Prism khởi động lại.
  • Cùng mã nhưng khác nội dung sẽ trả về 409 IDEMPOTENCY_CONFLICT. Nếu hồ sơ tạo ở lần đầu đã bị xóa (kể cả khi chuyển vào thùng rác), API trả về 409 IDEMPOTENCY_RESULT_GONE chứ không âm thầm tạo lại; nếu cần tạo lại, hãy dùng mã khác.
  • Sau 24 giờ, cùng một mã sẽ được coi là yêu cầu mới.
  • Trong 24 giờ, Prism lưu tối đa 1.000 yêu cầu có kèm mã; giới hạn này dùng chung với việc tạo hồ sơ qua MCP (mỗi lần MCP tạo hồ sơ đều chiếm một suất). Khi đạt giới hạn, API trả về 429 IDEMPOTENCY_CAPACITY cho đến khi các bản ghi cũ hết hạn.
  • Mã yêu cầu và nội dung yêu cầu chỉ được lưu trên máy tính này dưới dạng giá trị băm có khóa; mật khẩu proxy không bao giờ được lưu ở dạng văn bản thuần.

Nên tạo mã yêu cầu từ dữ liệu nghiệp vụ của bạn, chẳng hạn số dòng trong bảng tính hoặc mã đơn hàng: shop-b-001.

Xử lý lỗi

Khi yêu cầu bị từ chối ngay ở bước tiếp nhận (xem “Quy tắc yêu cầu”), error là một chuỗi, ví dụ {"error":"unauthorized"}. Khi Prism gặp lỗi trong lúc xử lý yêu cầu, error là một đối tượng:

{
  "error": {
    "code": "INVALID_PROFILE_INPUT",
    "message": "Invalid profile creation request; see details",
    "retryable": false,
    "details": [
      { "path": "profiles[1].proxy.port", "message": "Too big: expected number to be <=65535" }
    ]
  }
}

Chương trình nên dựa vào trạng thái HTTP và code để xử lý; message là phần mô tả dành cho người đọc, một phần bằng tiếng Trung và cách diễn đạt có thể thay đổi giữa các phiên bản. Khi retryable là true, có thể thử lại nguyên yêu cầu đó sau. details chỉ xuất hiện trong lỗi tham số tạo hồ sơ, tối đa 20 mục, và không lặp lại các giá trị đã gửi.

Trạng thái HTTP và mã lỗi
HTTPLỗiÝ nghĩaCách xử lý
400INVALID_PROFILE_INPUTTham số tạo hồ sơ không hợp lệ; details liệt kê từng trường và nguyên nhânSửa các trường nêu trong details rồi gửi lại
400query_not_allowed、body_not_allowed、json_body_required、invalid_json_bodyYêu cầu không đúng quy tắcSửa theo “Quy tắc yêu cầu”
401unauthorizedMã thông báo sai hoặc đã hết hiệu lựcKhởi động lại API trong Prism và dùng mã thông báo mới
403invalid_host、browser_origin_not_allowedĐịa chỉ hoặc nguồn gửi yêu cầu không được chấp nhậnDùng 127.0.0.1 và gọi từ script, không gọi từ trang web
403PRO_REQUIREDGiấy phép Pro đã mất hiệu lực, hoặc nhân được ghim cần ProGia hạn hoặc kích hoạt lại Pro
404not_foundĐường dẫn hoặc phương thức không tồn tạiĐối chiếu với “Danh sách endpoint”
404PROFILE_NOT_FOUNDHồ sơ không tồn tại hoặc đã được chuyển vào thùng rácLấy lại danh sách hồ sơ
409IDEMPOTENCY_CONFLICT、IDEMPOTENCY_RESULT_GONEXung đột mã yêu cầu, hoặc hồ sơ đã tạo trước đó đã bị xóaDùng mã yêu cầu khác
413request_too_largeThân yêu cầu vượt quá 96 KiBChia thành nhiều đợt
429rate_limited、IDEMPOTENCY_CAPACITYQuá nhiều yêu cầu, hoặc đã đạt 1.000 mã yêu cầu trong 24 giờThử lại sau
502MCP_REQUEST_FAILED và các lỗi khácCác lỗi thực thi khác, ví dụ thiếu nhân, kiểm tra proxy không đạt, còn tiến trình sót lạiXử lý theo message
504BROKER_TIMEOUTPrism không phản hồi trong 60 giây; thao tác có thể vẫn đang diễn raTruy vấn trạng thái trước; với yêu cầu tạo hồ sơ, hãy thử lại bằng cùng mã

MCP_REQUEST_FAILED là tên lỗi chung được dùng trong nội bộ Prism; API cục bộ cũng dùng tên này.

Ví dụ mã

Thay địa chỉ và mã thông báo trong ví dụ bằng giá trị hiển thị trong cửa sổ Prism. Ví dụ sẽ tạo hồ sơ, rồi khởi chạy và đóng hồ sơ vừa tạo.

Python

Cần có requests (pip install requests):

import requests

API = "http://127.0.0.1:43123"   # the API address shown in Prism
TOKEN = "<token>"                # the token shown in Prism

session = requests.Session()
session.headers["Authorization"] = f"Bearer {TOKEN}"

def call(method, path, **kwargs):
    response = session.request(method, API + path, timeout=70, **kwargs)
    body = response.json()
    if not response.ok:
        raise RuntimeError(f"{response.status_code}: {body['error']}")
    return body.get("result", body)

created = call("POST", "/v1/profiles/batch",
               headers={"Idempotency-Key": "shops-batch-002"},
               json={"profiles": [{"name": "Shop C"}, {"name": "Shop D"}]})
for profile in created["profiles"]:
    print("created", profile["serialNumber"], profile["id"])

profiles = call("GET", "/v1/profiles")
for profile in profiles:
    print(profile["serialNumber"], profile["name"], profile["status"])

first = created["profiles"][0]["id"]
print(call("POST", f"/v1/profiles/{first}/start")["status"])   # running
print(call("POST", f"/v1/profiles/{first}/close")["status"])   # closed

Node.js

Node.js 18 trở lên có sẵn fetch, không cần cài thêm gói phụ thuộc:

// prism.mjs — run with: node prism.mjs (Node.js 18 or later)
const API = 'http://127.0.0.1:43123' // the API address shown in Prism
const TOKEN = '<token>'              // the token shown in Prism

async function call(method, path, body, headers = {}) {
  const response = await fetch(API + path, {
    method,
    headers: { Authorization: `Bearer ${TOKEN}`, ...(body ? { 'Content-Type': 'application/json' } : {}), ...headers },
    body: body ? JSON.stringify(body) : undefined,
    signal: AbortSignal.timeout(70_000),
  })
  const data = await response.json()
  if (!response.ok) throw new Error(`${response.status}: ${JSON.stringify(data.error)}`)
  return data.result ?? data
}

const profile = await call('POST', '/v1/profiles', {
  name: 'Shop E',
  fingerprint: { language: 'en-US', timezone: 'America/New_York', networkIdentityMode: 'manual' },
}, { 'Idempotency-Key': 'shop-e-001' })
console.log('created', profile.serialNumber, profile.id)

console.log((await call('POST', `/v1/profiles/${profile.id}/start`)).status) // running
console.log((await call('POST', `/v1/profiles/${profile.id}/close`)).status) // closed

API cục bộ và MCP

API cục bộ dành cho script do bạn tự viết; ứng dụng AI nên kết nối với Prism qua MCP. MCP dùng mã thông báo và quyền riêng: AI chỉ thấy những hồ sơ được cho phép trong “AI cục bộ · MCP”, và AI không thể gọi API cục bộ. Cả hai dùng chung một dịch vụ cục bộ và hạn mức 120 yêu cầu mỗi 60 giây; khi dừng MCP hoặc dừng khẩn cấp MCP, API cục bộ cũng dừng theo.

AI cũng có thể tạo hồ sơ bằng các công cụ MCP prism_create_profile và prism_create_profiles, với tham số giống như trên trang này. Để làm vậy, bạn cần bật “Cho phép AI tạo hồ sơ” trong “AI cục bộ · MCP” (mặc định tắt); việc AI có điều khiển được hồ sơ mới hay không phụ thuộc vào chế độ cấp quyền hồ sơ bạn đã đặt. Mã yêu cầu của MCP và của API cục bộ được tính riêng, nhưng dùng chung giới hạn 1.000 bản ghi trong 24 giờ.

Khuyến nghị bảo mật

  • Mã thông báo giống như chìa khóa để quản lý hồ sơ trên máy tính này: đừng đưa nó vào kho mã, nhật ký hay lịch sử trò chuyện. Nếu nghi ngờ bị lộ, hãy dừng rồi khởi động lại API; mã thông báo cũ sẽ mất hiệu lực ngay lập tức.
  • API chỉ lắng nghe trên 127.0.0.1, nên các thiết bị khác trong mạng nội bộ hay trên Internet không thể truy cập trực tiếp. Bước kiểm tra Host chủ yếu dùng để chặn trình duyệt và việc vô tình dùng sai, không thay thế được cơ chế kiểm soát truy cập; đừng để lộ API ra ngoài bằng chuyển tiếp cổng hoặc reverse proxy.
  • Chương trình khác trên máy tính này cũng có thể gọi API nếu lấy được mã thông báo. Chỉ bật API trên máy tính đáng tin cậy, và nhấp “Dừng API” khi dùng xong.
  • “Dừng khẩn cấp” trong cửa sổ “API tự động hóa” sẽ dừng API và đóng các hồ sơ do API khởi chạy trong phiên này mà vẫn đang chạy.
  • Mọi yêu cầu mà Prism thực thi đều được ghi vào nhật ký kiểm toán cục bộ vault/logs/automation-audit.jsonl (trong thư mục dữ liệu của Prism); nhật ký ghi thời gian, hành động, kết quả, ID yêu cầu, ID hồ sơ và nguyên nhân thất bại, không ghi mã thông báo, nội dung yêu cầu hay nội dung trang web. Các yêu cầu bị từ chối do vi phạm quy tắc yêu cầu và các lệnh gọi GET /v1/status không được ghi lại.

Câu hỏi thường gặp

Có thể gọi API từ trang web hoặc tiện ích mở rộng trình duyệt không?
Không. Yêu cầu do trình duyệt gửi sẽ kèm header Origin, và API sẽ từ chối. Hãy gọi API từ terminal, script hoặc chương trình trên máy.
Vì sao dùng localhost lại trả về 403?
API yêu cầu header Host khớp chính xác với 127.0.0.1 và cổng trong địa chỉ API, nên localhost sẽ bị từ chối. Hãy dùng 127.0.0.1 làm tên máy chủ trong địa chỉ.
Cửa sổ “API tự động hóa” hiển thị đang chạy nhưng không có mã thông báo thì phải làm gì?
Sau khi bật MCP, Prism tự động khởi động dịch vụ cục bộ dùng chung cho API và MCP, nên lúc này cửa sổ chỉ hiển thị địa chỉ. Mã thông báo chỉ hiển thị một lần, khi bạn nhấp “Khởi động API cục bộ” thành công: hãy nhấp “Dừng API”, rồi nhấp “Khởi động API cục bộ” để nhận mã thông báo mới. Trong thời gian dừng, kết nối MCP cũng bị ngắt.
Sau khi khởi động lại Prism, mã thông báo cũ còn dùng được không?
Không. Mỗi lần khởi động API đều tạo cổng và mã thông báo mới; sau khi dừng API hoặc thoát Prism, mã thông báo cũ sẽ mất hiệu lực.
Có thể dùng API để sửa hoặc xóa hồ sơ không?
Không. API có thể tạo, truy vấn, khởi chạy và đóng hồ sơ; việc sửa cấu hình và xóa hồ sơ cần thực hiện trong ứng dụng Prism.
Có thể kết nối Puppeteer, Playwright hoặc Selenium không?
Không. API không cung cấp cổng gỡ lỗi hay địa chỉ WebDriver. Khi cần thao tác ở cấp trang, bạn có thể để ứng dụng AI thực hiện qua MCP.
Có thể khởi chạy nhiều hồ sơ cùng lúc không?
Có thể, hãy gọi endpoint khởi chạy lần lượt cho từng hồ sơ. Prism xử lý các yêu cầu theo thứ tự, khởi chạy xong một hồ sơ rồi mới xử lý yêu cầu tiếp theo; số hồ sơ chạy cùng lúc phụ thuộc vào bộ nhớ và CPU của máy tính.
Có dùng được trên Windows không?
Có. Prism Pro trên macOS và Windows đều cung cấp API cục bộ với các endpoint giống nhau. Trong Windows PowerShell, hãy dùng curl.exe hoặc Invoke-RestMethod.