概覽
本地 API 是 Prism Pro 功能,適合用自己的指令碼批次管理環境:依業務資料建立環境、依序啟動、檢查狀態,用完後關閉。它只管理環境本身,不讀取 Cookie、密碼、代理認證資訊和網頁內容,也不提供 Puppeteer / Playwright 除錯端點。需要讓 AI 讀取網頁、點選和填寫表單時,請使用 MCP。
| 項目 | 說明 |
|---|---|
| 位址 | 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 或更新版本 |
快速入門
啟動本地 API
在 Prism 左側開啟「自動化 API」,點選「啟動本地 API」。此功能需要 Prism Pro。
複製位址和權杖
視窗會顯示「API 位址」和「本次存取權杖」。權杖只會在啟動成功時顯示一次,請立即複製;之後如需新權杖,請停止並重新啟動 API。
傳送第一個請求
在終端機中設定兩個變數,接著檢查服務狀態並列出環境。若傳回
"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 位址完全一致 | 403 | invalid_host |
每個請求都帶上 Authorization: Bearer <token> | 401 | unauthorized |
| 不帶瀏覽器的 Origin 請求標頭,因此網頁和瀏覽器擴充功能中的 JavaScript 無法呼叫 | 403 | browser_origin_not_allowed |
網址不帶查詢參數(?…) | 400 | query_not_allowed |
| 只使用下文列出的路徑和方法 | 404 | not_found |
只有建立環境的端點接受請求本文;啟動、關閉等其他請求連 {} 也不能傳送 | 400 | body_not_allowed |
建立環境的請求使用 Content-Type: application/json,請求本文須為 JSON 物件 | 400 | json_body_required / invalid_json_body |
| 請求本文不超過 96 KiB | 413 | request_too_large |
| 每 60 秒最多 120 個請求,失敗的請求和 MCP 請求也會計入 | 429 | rate_limited |
Prism 會依收到的順序逐一處理本地 API 和 MCP 請求。啟動環境需要檢測代理、開啟瀏覽器,通常要花幾秒鐘,這段期間後續的請求會排隊等候。請等上一個請求傳回後,再傳送下一個。
端點一覽
| 方法 | 路徑 | 作用 |
|---|---|---|
| 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,不能包含帳號密碼,未寫通訊協定時視為 https | Prism 官網 |
proxy | 代理,見下表 | 直連 |
fingerprint | 指紋選項,見下表 | 與介面中新增環境時相同 |
extensionIds | 已安裝擴充功能的 Prism 內部 ID,最多 50 個。在「瀏覽器擴充功能」視窗中,擴充功能路徑 …/<ID>/extension 裡的資料夾名稱就是這個 ID,它不是 Chrome 線上應用程式商店的擴充功能 ID | 不啟用擴充功能 |
kernelVersion | 固定使用某個核心版本,格式為四段數字,例如 144.0.7559.132;啟動時必須已安裝該版本 | 跟隨預設核心 |
requestKey | 請求識別碼,用於安全重試,見「重試與避免重複建立」 | 無 |
代理欄位
| 欄位 | 說明 |
|---|---|
protocol | 必填:direct、http、https 或 socks5 |
host | 主機名稱或 IP,不含通訊協定、連接埠和帳號;不是 direct 時必填 |
port | 1–65535 的整數;不是 direct 時必填 |
username、password | 選填。密碼會加密儲存在這臺電腦上,任何端點都不會傳回 |
指紋欄位
| 欄位 | 說明 | 省略時 |
|---|---|---|
platform | macos 或 windows | 跟隨硬體範本;未指定範本時為這臺電腦的系統 |
hardwareProfileId | 硬體範本,見下表。系統版本、CPU 核心數和螢幕尺寸由範本決定 | 對應系統的「種子獨立」範本 |
seed | 指紋種子,0–4294967295 的整數;種子和其他指紋設定都相同時,會得到相同的指紋 | 隨機產生 |
brand | Chrome 或 Edge | Chrome |
brandVersion | 瀏覽器版本號。一般留空,以使用核心版本;若填寫,主版本必須與啟動所用的核心一致,否則無法啟動 | 跟隨核心 |
language | 介面語言,例如 en-US | 這臺電腦的系統語言 |
acceptLanguages | Accept-Language 請求標頭 | 依語言自動產生 |
timezone | IANA 時區,例如 America/New_York | 這臺電腦的時區 |
networkIdentityMode | proxy:啟動前檢測代理出口,時區和地理位置跟隨出口,能識別出口國家時語言也會跟隨;manual:固定使用填寫的值 | proxy |
proxyExitPolicy | 代理出口 IP 與上次檢測不同時:block 會讓這次啟動失敗,再次啟動即視為確認,因此指令碼不應自動重試這個錯誤;warn 僅提示 | block |
webrtcPolicy | proxy_only 防洩漏;public_only 僅公用網路介面;default 系統預設 | proxy_only |
硬體範本
| ID | 系統 | 說明 |
|---|---|---|
macos-seeded-apple | macOS | 種子獨立的 Apple GPU,適合多環境;macOS 預設 |
macos-host | macOS | 本機硬體,只能在 Mac 上使用 |
macos-m1 | macOS | Apple M1 · 8GB |
macos-m3-pro | macOS | Apple M3 Pro · 18GB |
macos-m4-pro | macOS | Apple M4 Pro · 24GB |
windows-seeded-nvidia | Windows | 種子獨立的 NVIDIA GPU,適合多環境;Windows 預設 |
windows-host | Windows | 本機硬體,只能在 Windows 電腦上使用 |
windows-10-rtx3060 | Windows | Windows 10 · RTX 3060 · 16GB |
windows-11-rtx4060 | Windows | Windows 11 · RTX 4060 · 16GB |
windows-11-rtx4070 | Windows | Windows 11 · RTX 4070 · 32GB |
範本與 platform 不一致時,請求會被拒絕。視窗位置與大小、Cookie、擴充功能資料等無法透過 API 設定,建立後可以在 Prism 介面中修改。
重試與避免重複建立
網路中斷或請求逾時後,你可能無法確定環境是否已經建立。為每次建立提供一個請求識別碼,重試時就不會重複建立:
- 在請求標頭
Idempotency-Key或請求本文的requestKey欄位中提供 8–128 個字元的識別碼,可使用英文字母、數字和. _ : -。兩處都填寫時必須相同。 - 24 小時內以相同的識別碼和相同的內容重試,會傳回第一次建立的環境(HTTP 200),即使 Prism 重新啟動過也一樣。
- 識別碼相同但內容不同時,傳回 409
IDEMPOTENCY_CONFLICT。第一次建立的環境已被刪除(包括移入回收筒)時,傳回 409IDEMPOTENCY_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 | 錯誤 | 含義 | 處理建議 |
|---|---|---|---|
| 400 | INVALID_PROFILE_INPUT | 建立參數有誤,details 會列出欄位和原因 | 依 details 修正後重新傳送 |
| 400 | query_not_allowed、body_not_allowed、json_body_required、invalid_json_body | 請求格式不符合規則 | 對照「請求規則」修正 |
| 401 | unauthorized | 權杖錯誤或已失效 | 在 Prism 中重新啟動 API,並使用新權杖 |
| 403 | invalid_host、browser_origin_not_allowed | 位址或請求來源不被接受 | 使用 127.0.0.1,並從指令碼而非網頁中呼叫 |
| 403 | PRO_REQUIRED | Pro 授權已失效,或固定的核心需要 Pro | 續期或重新啟用 Pro |
| 404 | not_found | 路徑或方法不存在 | 核對「端點一覽」 |
| 404 | PROFILE_NOT_FOUND | 環境不存在或已移入回收筒 | 重新取得環境清單 |
| 409 | IDEMPOTENCY_CONFLICT、IDEMPOTENCY_RESULT_GONE | 請求識別碼衝突,或原先建立的環境已刪除 | 換一個請求識別碼 |
| 413 | request_too_large | 請求本文超過 96 KiB | 分成多個批次 |
| 429 | rate_limited、IDEMPOTENCY_CAPACITY | 請求太頻繁,或 24 小時內的請求識別碼已達 1,000 個 | 稍後再試 |
| 502 | MCP_REQUEST_FAILED 等 | 其他執行失敗,例如缺少核心、代理檢測未通過、有遺留的處理程序 | 依 message 處理 |
| 504 | BROKER_TIMEOUT | Prism 在 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"]) # closedNode.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。