API 参考 v2
本地 API 文档
GekkoLogin 客户端通过原生浏览器控制平面提供带鉴权的本地 HTTP 接口,可读取结构化页面状态并执行确定性操作,无需开启远程调试端口。
基础 URL 和端口
启动 GekkoLogin 客户端后,本地 API 服务默认监听以下地址。端口可在桌面端设置里查看。
http://127.0.0.1:47891鉴权
所有请求需在 Header 中携带 API Key。可在桌面端本地 API 设置中生成或重置密钥,请妥善保管。
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json接口状态
在发起业务请求前,建议先探测 API 服务是否就绪。该接口适合脚本启动时的健康检查与重试等待。
/health{ "ok": true, "status": { "running": true, "host": "127.0.0.1", "port": 47891 } }MCP
标准 MCP 接入
Desktop Agent 在 /mcp 提供有状态 Streamable HTTP,会话、权限、审计与 18 个工具均由同一自动化合同驱动。REST 接口统一使用 /v2。
{
"mcpServers": {
"gekkologin-local": {
"url": "http://127.0.0.1:47891/mcp",
"headers": {
"Authorization": "Bearer YOUR_LOCAL_TOKEN"
}
}
}
}{
"mcpServers": {
"gekkologin-local": {
"command": "<path-to-gekkologin-executable>",
"args": ["--mcp-stdio"]
}
}
}/v2/profilesList profiles
List local browser profile summaries and runtime status.
Path parameters
{
"ok": true,
"operationId": "profiles.list",
"requestId": "<request-id>",
"data": {
"profiles": []
}
}/v2/profilesCreate profile
Create a new local browser environment; the server allocates its hardware template and fingerprint seed. Each environment gets its own seed, so its canvas/text-render fingerprint differs from every other environment on the same hardware. Returns the new profile id, which profiles_launch then opens.
Request fields
name*stringRequired.accountPlatformstringOptional.notesstringOptional.tagsarrayOptional.osstringOptional.templateIdstringOptional.proxyobjectOptional.{
"name": "<name>"
}{
"ok": true,
"operationId": "profiles.create",
"requestId": "<request-id>",
"data": {
"profileId": "<profileId>",
"name": "<name>"
}
}/v2/profiles/{profileId}/launchLaunch profile
Launch a browser profile and optionally navigate its active tab.
Request fields
profileId*stringRequired.startUrlstringOptional.{
"startUrl": "<startUrl>"
}{
"ok": true,
"operationId": "profiles.launch",
"requestId": "<request-id>",
"data": {
"ok": false,
"pid": 1,
"error": "<error>"
}
}/v2/profiles/{profileId}/stopStop profile
Stop a running browser profile and release its local control session.
Request fields
profileId*stringRequired.{
"ok": true,
"operationId": "profiles.stop",
"requestId": "<request-id>",
"data": {
"ok": false,
"error": "<error>"
}
}/v2/profiles/{profileId}/environment-state/deviceGet environment-state device status
Registers this device public key if needed and returns its non-secret pairing status for an environment.
Path parameters
profileId*stringRequired.{
"ok": true,
"operationId": "environmentState.device.status",
"requestId": "<request-id>",
"data": {
"deviceId": "<deviceId>",
"keyRegistered": true,
"approved": false,
"revision": 1,
"checkpointAvailable": false
}
}/v2/profiles/{profileId}/environment-state/checkpoint/retryRetry environment state upload
Retry a durable encrypted environment checkpoint after a previous upload failure without rebuilding browser state.
Request fields
profileId*stringRequired.{
"ok": true,
"operationId": "environmentState.checkpoint.retry",
"requestId": "<request-id>",
"data": {
"ok": true,
"profileId": "<profileId>",
"revision": 1
}
}/v2/automation/agentsList automation agents
List saved RPA automation agent definitions.
Path parameters
{
"ok": true,
"operationId": "automation.agents.list",
"requestId": "<request-id>",
"data": {
"agents": []
}
}/v2/automation/runRun automation agent
Run a saved RPA agent against a local browser profile.
Request fields
agentId*stringRequired.profileId*stringRequired.{
"agentId": "<agentId>",
"profileId": "<profileId>"
}{
"ok": true,
"operationId": "automation.run",
"requestId": "<request-id>",
"data": {
"ok": false,
"runId": "<runId>",
"steps": [],
"error": "<error>"
}
}/v2/profiles/{profileId}/tabsList browser tabs
Return browser windows and tabs from the native control plane.
Path parameters
profileId*stringRequired.{
"ok": true,
"operationId": "browser.tabs.list",
"requestId": "<request-id>",
"data": {
"browsers": []
}
}/v2/profiles/{profileId}/page/snapshotGet semantic page snapshot
Return structured semantic page state with opaque node references and sensitive values redacted.
Request fields
profileId*stringRequired.tabIdstringOptional.maxNodesintegerOptional.{
"maxNodes": 1
}{
"ok": true,
"operationId": "page.snapshot",
"requestId": "<request-id>",
"data": {
"snapshotId": "<snapshotId>",
"url": "<url>",
"title": "<title>",
"nodes": [],
"nodeCount": 1,
"truncated": false
}
}/v2/profiles/{profileId}/page/screenshotCapture page screenshot
Capture the selected or active tab as a PNG without enabling remote debugging.
Request fields
profileId*stringRequired.tabIdstringOptional.maxDimensionintegerOptional.{
"maxDimension": 1
}{
"ok": true,
"operationId": "page.screenshot",
"requestId": "<request-id>",
"data": {
"mimeType": "image/png",
"width": 1,
"height": 1,
"data": "<data>"
}
}/v2/profiles/{profileId}/page/queryQuery page element
Resolve a CSS selector and return element interaction state without executing page script.
Request fields
profileId*stringRequired.tabIdstringOptional.selector*stringRequired.{
"selector": "<selector>"
}{
"ok": true,
"operationId": "page.query",
"requestId": "<request-id>",
"data": {
"found": false,
"visible": false,
"editable": false,
"tagName": "<tagName>"
}
}/v2/profiles/{profileId}/page/clickClick page element
Click an element by CSS selector or semantic snapshot node reference.
Request fields
profileId*stringRequired.tabIdstringOptional.selectorstringOptional.snapshotIdstringOptional.nodeRefstringOptional.{
"selector": "<selector>"
}{
"ok": true,
"operationId": "page.click",
"requestId": "<request-id>",
"data": {
"ok": false,
"message": "<message>"
}
}/v2/profiles/{profileId}/page/typeType into page element
Type text into an editable element using native actor actions.
Request fields
profileId*stringRequired.tabIdstringOptional.selectorstringOptional.snapshotIdstringOptional.nodeRefstringOptional.text*stringRequired.modereplace | prepend | appendOptional.pressEnterbooleanOptional.{
"selector": "<selector>",
"text": "<text>"
}{
"ok": true,
"operationId": "page.type",
"requestId": "<request-id>",
"data": {
"ok": false,
"message": "<message>"
}
}/v2/profiles/{profileId}/page/selectSelect page option
Select an option from a page control by selector or semantic node reference.
Request fields
profileId*stringRequired.tabIdstringOptional.selectorstringOptional.snapshotIdstringOptional.nodeRefstringOptional.value*stringRequired.{
"selector": "<selector>",
"value": "<value>"
}{
"ok": true,
"operationId": "page.select",
"requestId": "<request-id>",
"data": {
"ok": false,
"message": "<message>"
}
}/v2/profiles/{profileId}/page/scrollScroll page
Scroll the page or an element by a deterministic distance.
Request fields
profileId*stringRequired.tabIdstringOptional.selectorstringOptional.direction*up | down | left | rightRequired.distance*numberRequired.{
"selector": "<selector>",
"direction": "up",
"distance": 1
}{
"ok": true,
"operationId": "page.scroll",
"requestId": "<request-id>",
"data": {
"ok": false,
"message": "<message>"
}
}/v2/profiles/{profileId}/page/scroll-toScroll element into view
Scroll a selected semantic node or CSS selector into view.
Request fields
profileId*stringRequired.tabIdstringOptional.selectorstringOptional.snapshotIdstringOptional.nodeRefstringOptional.{
"selector": "<selector>"
}{
"ok": true,
"operationId": "page.scrollTo",
"requestId": "<request-id>",
"data": {
"ok": false,
"message": "<message>"
}
}附录
脚本样例
通过带鉴权的本地 API 查询环境并读取结构化页面状态。
import requests
base = "http://127.0.0.1:47891"
headers = {"Authorization": "Bearer YOUR_LOCAL_TOKEN"}
profiles = requests.get(f"{base}/v2/profiles", headers=headers).json()
profile_id = profiles["data"]["profiles"][0]["id"]
snapshot = requests.post(
f"{base}/v2/profiles/{profile_id}/page/snapshot",
headers=headers,
json={"maxNodes": 1000},
).json()
print(snapshot["data"]["url"], snapshot["data"]["nodeCount"])错误码
Errors use a stable machine-readable code and include requestId for audit correlation.
400 / invalid_requestThe input does not match the operation contract.Fix the fields reported in error.message.401 / unauthorizedThe bearer token is missing or invalid.Use the current local token from the desktop client.403 / forbiddenThe token lacks the operation permission.Grant the permission or use an authorized token.404 / operation_not_foundThe route or operation is not available.Check the generated OpenAPI contract and Desktop Agent version.500 / operation_failedThe native operation failed.Use requestId to correlate the desktop audit log.