API REFERENCE · PRISM PRO

本地 API 文件:用指令碼管理瀏覽器環境。

Prism Pro 的本地自動化 API 只在本機 127.0.0.1 上監聽,使用每次啟動時產生的存取權杖。任何能傳送 HTTP 請求的語言,都可以用它單個或批次建立環境,再查詢、啟動和關閉環境。

更新於 · 依據 Prism 0.3.22 用戶端原始碼整理

概覽

本地 API 是 Prism Pro 功能,適合用自己的指令碼批次管理環境:依業務資料建立環境、依序啟動、檢查狀態,用完後關閉。它只管理環境本身,不讀取 Cookie、密碼、代理認證資訊和網頁內容,也不提供 Puppeteer / Playwright 除錯端點。需要讓 AI 讀取網頁、點選和填寫表單時,請使用 MCP。

本地 API 基本資訊
項目說明
位址http://127.0.0.1:<port>,連接埠在每次啟動時隨機分配,只接受這臺電腦上的請求
驗證請求標頭 Authorization: Bearer <token>;權杖在啟動 API 時顯示一次,停止後即失效
資料格式JSON(UTF-8);成功回應的結果放在 result 欄位中
請求本文只有建立環境的端點接受 JSON 請求本文,上限 96 KiB
速率限制每 60 秒最多 120 個請求,與 MCP 共用
逾時每個請求最多等待 60 秒
適用版本Prism Pro,macOS 與 Windows 用戶端相同;建立環境的端點需要 0.3.22 或更新版本

快速入門

  1. 啟動本地 API

    在 Prism 左側開啟「自動化 API」,點選「啟動本地 API」。此功能需要 Prism Pro。

  2. 複製位址和權杖

    視窗會顯示「API 位址」和「本次存取權杖」。權杖只會在啟動成功時顯示一次,請立即複製;之後如需新權杖,請停止並重新啟動 API。

  3. 傳送第一個請求

    在終端機中設定兩個變數,接著檢查服務狀態並列出環境。若傳回 "state": "running",表示位址和權杖可用。

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"

在 Windows PowerShell 中,curl 是另一個指令的別名,請改為輸入 curl.exe,或使用 PowerShell 內建的 Invoke-RestMethod:

$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

請求規則

API 只接受這臺電腦上由指令碼或程式發出的請求。不符合下列規則的請求不會執行,並會傳回下表中的錯誤:

請求規則與對應錯誤
規則HTTP錯誤
使用 127.0.0.1 存取,不要用 localhost:請求標頭 Host 必須與 API 位址完全一致403invalid_host
每個請求都帶上 Authorization: Bearer <token>401unauthorized
不帶瀏覽器的 Origin 請求標頭,因此網頁和瀏覽器擴充功能中的 JavaScript 無法呼叫403browser_origin_not_allowed
網址不帶查詢參數(?…)400query_not_allowed
只使用下文列出的路徑和方法404not_found
只有建立環境的端點接受請求本文;啟動、關閉等其他請求連 {} 也不能傳送400body_not_allowed
建立環境的請求使用 Content-Type: application/json,請求本文須為 JSON 物件400json_body_required / invalid_json_body
請求本文不超過 96 KiB413request_too_large
每 60 秒最多 120 個請求,失敗的請求和 MCP 請求也會計入429rate_limited

Prism 會依收到的順序逐一處理本地 API 和 MCP 請求。啟動環境需要檢測代理、開啟瀏覽器,通常要花幾秒鐘,這段期間後續的請求會排隊等候。請等上一個請求傳回後,再傳送下一個。

端點一覽

本地 API 端點
方法路徑作用
GET/v1/status檢查服務是否可用
GET/v1/profiles列出全部環境(不含回收筒)
GET/v1/profiles/{id}/status查詢單一環境
POST/v1/profiles/{id}/start啟動環境
POST/v1/profiles/{id}/close關閉環境,保留資料
POST/v1/profiles建立單一環境(0.3.22 起)
POST/v1/profiles/batch一次建立 1–50 個環境(0.3.22 起)

{id} 是環境 ID,可從 GET /v1/profiles 的結果中取得。成功回應的 HTTP 狀態都是 200;除了 GET /v1/status 之外,結果都放在 result 欄位中。API 不提供修改和刪除環境的端點。

環境物件

環境清單、環境狀態、啟動和關閉都會傳回相同的環境物件:

環境物件欄位
欄位類型說明
id字串環境 ID,供其他端點使用
serialNumber整數介面上顯示的環境編號,刪除後不會重複使用
name字串環境名稱
group字串分組,未分組時為空字串
tags字串陣列標籤
status字串closed 已關閉、starting 啟動中、running 執行中、stopping 關閉中、orphaned 有遺留的處理程序、error 發生錯誤
lastOpenedAt字串最近一次開啟的時間(ISO 8601,UTC);從未開啟過的環境沒有此欄位
{
  "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"
  }
}

API 不會傳回代理位址與認證資訊、指紋參數、Cookie、密碼、網站資料或擴充功能資料。

查詢、啟動與關閉

GET /v1/status

傳回服務狀態,用來確認位址和權杖可用。這是唯一不放在 result 中的回應:

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

GET /v1/profiles

傳回環境物件陣列,最近修改的環境排在前面。回收筒中的環境不會列出。

GET /v1/profiles/{id}/status

傳回單一環境的目前狀態。環境不存在或已移入回收筒時,傳回 404 PROFILE_NOT_FOUND。

POST /v1/profiles/{id}/start

  • 與在介面中點選「開啟」相同:檢查核心和 Pro 核心授權,檢測代理與出口變化,然後開啟瀏覽器視窗。成功後傳回狀態為 running 的環境物件。
  • 環境已在執行時,會直接傳回目前狀態,不會重複開啟。
  • 一個啟動請求傳回後,Prism 才會處理下一個請求。批次啟動時逐一呼叫即可;能同時執行多少個環境,取決於電腦的記憶體和 CPU。
  • 沒有對應的核心、代理檢測未通過、代理出口 IP 發生變化(策略為 block)或有遺留的處理程序時,啟動會失敗並傳回 502,由 error.message 說明原因。
  • 凡是在介面中需要你確認才能繼續的情況,透過 API 呼叫時都會直接失敗,例如代理出口的地理位置資料互相矛盾。遇到這類錯誤時,可以在 Prism 介面中開啟該環境,或把網路身份改為 manual。
  • 呼叫過啟動端點的環境(包括呼叫時已在執行的環境)會被記錄下來,在「自動化 API」視窗點選「緊急停止」時會一併關閉。「停止 API」以及 MCP 視窗中的停止和緊急停止只會停止 API,這些環境會保持開啟。

POST /v1/profiles/{id}/close

關閉瀏覽器視窗並保留環境資料,傳回狀態為 closed 的環境物件;環境未在執行時,也會直接傳回 closed。如果瀏覽器在 8 秒內未能結束,仍佔用著資料目錄,傳回的狀態會是 orphaned;此時再呼叫一次關閉,即可結束遺留的處理程序。

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"

建立環境

建立環境的端點會將環境儲存為關閉狀態,不會開啟瀏覽器。所有欄位都可以省略:省略的欄位會使用與介面中「新增環境」相同的預設值,每個環境都會產生新的指紋種子。未知欄位會被拒絕。

建立單一環境

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" }
  }'

成功後傳回新環境:

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

批次建立

POST /v1/profiles/batch 的請求本文是 profiles 陣列,一次 1–50 個;每個元素的寫法與單一建立相同,只是 requestKey 要寫在最上層或請求標頭中。Prism 會先驗證全部設定,只要其中任何一個有誤,就不會建立任何環境,錯誤訊息會指出是哪個環境的哪個欄位(profiles[1] 表示第二個,從 0 開始計數)。結果依輸入順序傳回:

{
  "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
  }
}

環境欄位

建立環境的欄位
欄位說明省略時
name名稱,1–60 個字元「API」加上數字,例如 API 8:數字為目前的環境數量加 1,批次建立時依序遞增,可能與現有名稱重複
group分組,最多 40 個字元不分組
tags標籤陣列,最多 20 個,每個最多 30 個字元無
note備註,最多 500 個字元無
color標記顏色,#RRGGBB依序輪換
startUrls啟動頁面陣列,最多 50 個;僅支援 http / https,不能包含帳號密碼,未寫通訊協定時視為 httpsPrism 官網
proxy代理,見下表直連
fingerprint指紋選項,見下表與介面中新增環境時相同
extensionIds已安裝擴充功能的 Prism 內部 ID,最多 50 個。在「瀏覽器擴充功能」視窗中,擴充功能路徑 …/<ID>/extension 裡的資料夾名稱就是這個 ID,它不是 Chrome 線上應用程式商店的擴充功能 ID不啟用擴充功能
kernelVersion固定使用某個核心版本,格式為四段數字,例如 144.0.7559.132;啟動時必須已安裝該版本跟隨預設核心
requestKey請求識別碼,用於安全重試,見「重試與避免重複建立」無

代理欄位

代理欄位(proxy)
欄位說明
protocol必填:direct、http、https 或 socks5
host主機名稱或 IP,不含通訊協定、連接埠和帳號;不是 direct 時必填
port1–65535 的整數;不是 direct 時必填
username、password選填。密碼會加密儲存在這臺電腦上,任何端點都不會傳回

指紋欄位

指紋欄位(fingerprint)
欄位說明省略時
platformmacos 或 windows跟隨硬體範本;未指定範本時為這臺電腦的系統
hardwareProfileId硬體範本,見下表。系統版本、CPU 核心數和螢幕尺寸由範本決定對應系統的「種子獨立」範本
seed指紋種子,0–4294967295 的整數;種子和其他指紋設定都相同時,會得到相同的指紋隨機產生
brandChrome 或 EdgeChrome
brandVersion瀏覽器版本號。一般留空,以使用核心版本;若填寫,主版本必須與啟動所用的核心一致,否則無法啟動跟隨核心
language介面語言,例如 en-US這臺電腦的系統語言
acceptLanguagesAccept-Language 請求標頭依語言自動產生
timezoneIANA 時區,例如 America/New_York這臺電腦的時區
networkIdentityModeproxy:啟動前檢測代理出口,時區和地理位置跟隨出口,能識別出口國家時語言也會跟隨;manual:固定使用填寫的值proxy
proxyExitPolicy代理出口 IP 與上次檢測不同時:block 會讓這次啟動失敗,再次啟動即視為確認,因此指令碼不應自動重試這個錯誤;warn 僅提示block
webrtcPolicyproxy_only 防洩漏;public_only 僅公用網路介面;default 系統預設proxy_only

硬體範本

硬體範本 ID
ID系統說明
macos-seeded-applemacOS種子獨立的 Apple GPU,適合多環境;macOS 預設
macos-hostmacOS本機硬體,只能在 Mac 上使用
macos-m1macOSApple M1 · 8GB
macos-m3-promacOSApple M3 Pro · 18GB
macos-m4-promacOSApple M4 Pro · 24GB
windows-seeded-nvidiaWindows種子獨立的 NVIDIA GPU,適合多環境;Windows 預設
windows-hostWindows本機硬體,只能在 Windows 電腦上使用
windows-10-rtx3060WindowsWindows 10 · RTX 3060 · 16GB
windows-11-rtx4060WindowsWindows 11 · RTX 4060 · 16GB
windows-11-rtx4070WindowsWindows 11 · RTX 4070 · 32GB

範本與 platform 不一致時,請求會被拒絕。視窗位置與大小、Cookie、擴充功能資料等無法透過 API 設定,建立後可以在 Prism 介面中修改。

重試與避免重複建立

網路中斷或請求逾時後,你可能無法確定環境是否已經建立。為每次建立提供一個請求識別碼,重試時就不會重複建立:

  • 在請求標頭 Idempotency-Key 或請求本文的 requestKey 欄位中提供 8–128 個字元的識別碼,可使用英文字母、數字和 . _ : -。兩處都填寫時必須相同。
  • 24 小時內以相同的識別碼和相同的內容重試,會傳回第一次建立的環境(HTTP 200),即使 Prism 重新啟動過也一樣。
  • 識別碼相同但內容不同時,傳回 409 IDEMPOTENCY_CONFLICT。第一次建立的環境已被刪除(包括移入回收筒)時,傳回 409 IDEMPOTENCY_RESULT_GONE,不會悄悄重新建立;需要重新建立時,請換一個識別碼。
  • 超過 24 小時後,同一個識別碼會視為新請求。
  • 24 小時內最多保留 1,000 個帶識別碼的請求,這個上限與 MCP 建立環境共用(MCP 每次建立都會佔用一個);達到上限時傳回 429 IDEMPOTENCY_CAPACITY,待舊記錄過期後即恢復。
  • 識別碼和請求內容只以加密摘要的形式儲存在這臺電腦上,不會儲存代理密碼的明文。

建議用業務資料產生識別碼,例如試算表的列號或訂單編號:shop-b-001。

錯誤處理

請求在入口就被拒絕時(見「請求規則」),error 是一個字串,例如 {"error":"unauthorized"}。若 Prism 在處理請求時發生錯誤,error 則是一個物件:

{
  "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" }
    ]
  }
}

程式請根據 HTTP 狀態和 code 判斷;message 是給人閱讀的說明,部分為中文,措辭可能隨版本調整。retryable 為 true 時,可稍後以相同的請求重試。details 只會出現在建立參數錯誤中,最多 20 項,不會包含你提交的值。

HTTP 狀態與錯誤碼
HTTP錯誤含義處理建議
400INVALID_PROFILE_INPUT建立參數有誤,details 會列出欄位和原因依 details 修正後重新傳送
400query_not_allowed、body_not_allowed、json_body_required、invalid_json_body請求格式不符合規則對照「請求規則」修正
401unauthorized權杖錯誤或已失效在 Prism 中重新啟動 API,並使用新權杖
403invalid_host、browser_origin_not_allowed位址或請求來源不被接受使用 127.0.0.1,並從指令碼而非網頁中呼叫
403PRO_REQUIREDPro 授權已失效,或固定的核心需要 Pro續期或重新啟用 Pro
404not_found路徑或方法不存在核對「端點一覽」
404PROFILE_NOT_FOUND環境不存在或已移入回收筒重新取得環境清單
409IDEMPOTENCY_CONFLICT、IDEMPOTENCY_RESULT_GONE請求識別碼衝突,或原先建立的環境已刪除換一個請求識別碼
413request_too_large請求本文超過 96 KiB分成多個批次
429rate_limited、IDEMPOTENCY_CAPACITY請求太頻繁,或 24 小時內的請求識別碼已達 1,000 個稍後再試
502MCP_REQUEST_FAILED 等其他執行失敗,例如缺少核心、代理檢測未通過、有遺留的處理程序依 message 處理
504BROKER_TIMEOUTPrism 在 60 秒內沒有回應,操作可能仍在進行先查詢狀態;建立請求則用同一個識別碼重試

MCP_REQUEST_FAILED 是 Prism 內部沿用的通用錯誤名稱,本地 API 也使用它。

程式碼範例

請把範例中的位址和權杖換成 Prism 視窗中顯示的值。範例會建立環境,再啟動並關閉新建立的環境。

Python

需要 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 起內建 fetch,不需安裝任何相依套件:

// 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

與 MCP 的關係

本地 API 供你自己撰寫的指令碼使用;AI 用戶端請透過 MCP 連線 Prism。MCP 使用獨立的權杖和權限,只有在「本地 AI · MCP」中允許的環境才對 AI 可見,AI 也不能呼叫本地 API。兩者共用同一個本地服務,以及每 60 秒 120 個請求的額度;停止 MCP 或對 MCP 執行緊急停止時,本地 API 也會停止。

AI 也可以用 MCP 工具 prism_create_profile 和 prism_create_profiles 建立環境,參數與本頁相同。這需要你在「本地 AI · MCP」中開啟「允許 AI 建立環境」(預設關閉);新環境能否由 AI 控制,取決於你設定的環境授權方式。MCP 與本地 API 的請求識別碼分開計算,但共用 24 小時內 1,000 筆記錄的上限。

安全建議

  • 權杖相當於這臺電腦上管理環境的鑰匙:不要寫進程式碼儲存庫、記錄檔或聊天記錄。懷疑外洩時,請停止並重新啟動 API,舊權杖會立即失效。
  • API 只監聽 127.0.0.1,區域網路和網際網路上的其他裝置都無法直接存取。Host 檢查主要用來擋下瀏覽器發出的請求和意外的誤用,不能取代存取控制;不要用連接埠轉送或反向代理把它暴露出去。
  • 這臺電腦上的其他程式取得權杖後,同樣可以呼叫 API。請只在可信任的電腦上啟用,用完後點選「停止 API」。
  • 「自動化 API」視窗中的「緊急停止」會停止 API,並關閉本次透過 API 啟動且仍在執行的環境。
  • Prism 執行的每個請求都會寫入本機稽核記錄 vault/logs/automation-audit.jsonl(位於 Prism 資料目錄中),記錄時間、動作、結果、請求 ID、環境 ID 和失敗原因,不記錄權杖、請求內容和網頁內容。被請求規則拒絕的請求和 GET /v1/status 不會被記錄。

常見問題

可以在網頁或瀏覽器擴充功能中呼叫嗎?
不可以。瀏覽器發出的請求會帶有 Origin 請求標頭,API 會拒絕這類請求。請在終端機、指令碼或本機程式中呼叫。
為什麼用 localhost 會傳回 403?
API 要求 Host 請求標頭與 API 位址中的 127.0.0.1 和連接埠完全一致,因此 localhost 會被拒絕。請把位址中的主機名稱寫成 127.0.0.1。
「自動化 API」視窗顯示執行中,卻看不到權杖,該怎麼辦?
啟用 MCP 後,Prism 會自動啟動 API 與 MCP 共用的本地服務,此時視窗只會顯示位址。權杖只會在點選「啟動本地 API」並成功啟動時顯示一次:先點選「停止 API」,再點選「啟動本地 API」,即可取得新權杖。停止期間,MCP 連線也會中斷。
重新啟動 Prism 後,還能使用原來的權杖嗎?
不能。每次啟動 API 都會產生新的連接埠和權杖;停止 API 或結束 Prism 後,舊權杖即失效。
能用 API 修改或刪除環境嗎?
不能。API 可以建立、查詢、啟動和關閉環境;修改設定和刪除請在 Prism 介面中操作。
能連接 Puppeteer、Playwright 或 Selenium 嗎?
不能。API 不提供除錯連接埠或 WebDriver 位址。需要頁面層級的操作時,可以透過 MCP 交由 AI 用戶端完成。
可以一次啟動很多環境嗎?
可以,逐一呼叫啟動端點即可。Prism 會依序處理請求,一個環境啟動完成後再處理下一個;能同時執行的數量取決於電腦的記憶體和 CPU。
Windows 也能用嗎?
可以。macOS 與 Windows 版 Prism Pro 都提供本地 API,端點相同。在 Windows PowerShell 中請使用 curl.exe 或 Invoke-RestMethod。