Kernel Browser Pools API
Create and manage browser pools for acquiring and releasing browsers.
Create and manage browser pools for acquiring and releasing browsers.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/kernel-so-browser-pools-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Kernel API Keys Browser Pools API
description: Developer tools and cloud infrastructure for AI agents to use web browsers
version: 0.1.0
servers:
- url: https://api.onkernel.com
description: API Server
security:
- bearerAuth: []
tags:
- name: Browser Pools
description: Create and manage browser pools for acquiring and releasing browsers.
paths:
/browser_pools:
post:
operationId: postBrowserPools
tags:
- Browser Pools
summary: Create a browser pool
description: Create a new browser pool with the specified configuration and size.
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BrowserPoolRequest'
responses:
'201':
description: Browser pool created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/BrowserPool'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'409':
$ref: '#/components/responses/Conflict'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalError'
x-codeSamples:
- lang: JavaScript
source: "import Kernel from '@onkernel/sdk';\n\nconst client = new Kernel({\n apiKey: process.env['KERNEL_API_KEY'], // This is the default and can be omitted\n});\n\nconst browserPool = await client.browserPools.create({ size: 10 });\n\nconsole.log(browserPool.id);"
- lang: Python
source: "import os\nfrom kernel import Kernel\n\nclient = Kernel(\n api_key=os.environ.get(\"KERNEL_API_KEY\"), # This is the default and can be omitted\n)\nbrowser_pool = client.browser_pools.create(\n size=10,\n)\nprint(browser_pool.id)"
- lang: Go
source: "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/kernel/kernel-go-sdk\"\n\t\"github.com/kernel/kernel-go-sdk/option\"\n)\n\nfunc main() {\n\tclient := kernel.NewClient(\n\t\toption.WithAPIKey(\"My API Key\"),\n\t)\n\tbrowserPool, err := client.BrowserPools.New(context.TODO(), kernel.BrowserPoolNewParams{\n\t\tSize: 10,\n\t})\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\tfmt.Printf(\"%+v\\n\", browserPool.ID)\n}\n"
get:
operationId: getBrowserPools
tags:
- Browser Pools
summary: List browser pools
description: List browser pools owned by the caller's organization.
security:
- bearerAuth: []
responses:
'200':
description: List of browser pools
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/BrowserPool'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'500':
$ref: '#/components/responses/InternalError'
x-codeSamples:
- lang: JavaScript
source: "import Kernel from '@onkernel/sdk';\n\nconst client = new Kernel({\n apiKey: process.env['KERNEL_API_KEY'], // This is the default and can be omitted\n});\n\nconst browserPools = await client.browserPools.list();\n\nconsole.log(browserPools);"
- lang: Python
source: "import os\nfrom kernel import Kernel\n\nclient = Kernel(\n api_key=os.environ.get(\"KERNEL_API_KEY\"), # This is the default and can be omitted\n)\nbrowser_pools = client.browser_pools.list()\nprint(browser_pools)"
- lang: Go
source: "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/kernel/kernel-go-sdk\"\n\t\"github.com/kernel/kernel-go-sdk/option\"\n)\n\nfunc main() {\n\tclient := kernel.NewClient(\n\t\toption.WithAPIKey(\"My API Key\"),\n\t)\n\tbrowserPools, err := client.BrowserPools.List(context.TODO())\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\tfmt.Printf(\"%+v\\n\", browserPools)\n}\n"
/browser_pools/{id_or_name}:
get:
operationId: getBrowserPoolsByIdOrName
tags:
- Browser Pools
summary: Get browser pool details
description: Retrieve details for a single browser pool by its ID or name.
security:
- bearerAuth: []
parameters:
- name: id_or_name
in: path
required: true
schema:
type: string
description: Browser pool ID or name
responses:
'200':
description: Browser pool details
content:
application/json:
schema:
$ref: '#/components/schemas/BrowserPool'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalError'
x-codeSamples:
- lang: JavaScript
source: "import Kernel from '@onkernel/sdk';\n\nconst client = new Kernel({\n apiKey: process.env['KERNEL_API_KEY'], // This is the default and can be omitted\n});\n\nconst browserPool = await client.browserPools.retrieve('id_or_name');\n\nconsole.log(browserPool.id);"
- lang: Python
source: "import os\nfrom kernel import Kernel\n\nclient = Kernel(\n api_key=os.environ.get(\"KERNEL_API_KEY\"), # This is the default and can be omitted\n)\nbrowser_pool = client.browser_pools.retrieve(\n \"id_or_name\",\n)\nprint(browser_pool.id)"
- lang: Go
source: "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/kernel/kernel-go-sdk\"\n\t\"github.com/kernel/kernel-go-sdk/option\"\n)\n\nfunc main() {\n\tclient := kernel.NewClient(\n\t\toption.WithAPIKey(\"My API Key\"),\n\t)\n\tbrowserPool, err := client.BrowserPools.Get(context.TODO(), \"id_or_name\")\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\tfmt.Printf(\"%+v\\n\", browserPool.ID)\n}\n"
patch:
operationId: updateBrowserPoolsByIdOrName
tags:
- Browser Pools
summary: Update a browser pool
description: Updates the configuration used to create browsers in the pool.
security:
- bearerAuth: []
parameters:
- name: id_or_name
in: path
required: true
schema:
type: string
description: Browser pool ID or name
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BrowserPoolUpdateRequest'
responses:
'200':
description: Browser pool details
content:
application/json:
schema:
$ref: '#/components/schemas/BrowserPool'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/Conflict'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalError'
x-codeSamples:
- lang: JavaScript
source: "import Kernel from '@onkernel/sdk';\n\nconst client = new Kernel({\n apiKey: process.env['KERNEL_API_KEY'], // This is the default and can be omitted\n});\n\nconst browserPool = await client.browserPools.update('id_or_name', { size: 10 });\n\nconsole.log(browserPool.id);"
- lang: Python
source: "import os\nfrom kernel import Kernel\n\nclient = Kernel(\n api_key=os.environ.get(\"KERNEL_API_KEY\"), # This is the default and can be omitted\n)\nbrowser_pool = client.browser_pools.update(\n id_or_name=\"id_or_name\",\n size=10,\n)\nprint(browser_pool.id)"
- lang: Go
source: "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/kernel/kernel-go-sdk\"\n\t\"github.com/kernel/kernel-go-sdk/option\"\n)\n\nfunc main() {\n\tclient := kernel.NewClient(\n\t\toption.WithAPIKey(\"My API Key\"),\n\t)\n\tbrowserPool, err := client.BrowserPools.Update(\n\t\tcontext.TODO(),\n\t\t\"id_or_name\",\n\t\tkernel.BrowserPoolUpdateParams{\n\t\t\tSize: 10,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\tfmt.Printf(\"%+v\\n\", browserPool.ID)\n}\n"
delete:
operationId: deleteBrowserPoolsByIdOrName
tags:
- Browser Pools
summary: Delete a browser pool
description: Delete a browser pool and all browsers in it. By default, deletion is blocked if browsers are currently leased. Use force=true to terminate leased browsers.
security:
- bearerAuth: []
parameters:
- name: id_or_name
in: path
required: true
schema:
type: string
description: Browser pool ID or name
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/BrowserPoolDeleteRequest'
responses:
'204':
description: Browser pool deleted successfully
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalError'
x-codeSamples:
- lang: JavaScript
source: "import Kernel from '@onkernel/sdk';\n\nconst client = new Kernel({\n apiKey: process.env['KERNEL_API_KEY'], // This is the default and can be omitted\n});\n\nawait client.browserPools.delete('id_or_name');"
- lang: Python
source: "import os\nfrom kernel import Kernel\n\nclient = Kernel(\n api_key=os.environ.get(\"KERNEL_API_KEY\"), # This is the default and can be omitted\n)\nclient.browser_pools.delete(\n id_or_name=\"id_or_name\",\n)"
- lang: Go
source: "package main\n\nimport (\n\t\"context\"\n\n\t\"github.com/kernel/kernel-go-sdk\"\n\t\"github.com/kernel/kernel-go-sdk/option\"\n)\n\nfunc main() {\n\tclient := kernel.NewClient(\n\t\toption.WithAPIKey(\"My API Key\"),\n\t)\n\terr := client.BrowserPools.Delete(\n\t\tcontext.TODO(),\n\t\t\"id_or_name\",\n\t\tkernel.BrowserPoolDeleteParams{},\n\t)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n"
/browser_pools/{id_or_name}/acquire:
post:
operationId: acquireFromBrowserPoolByIdOrName
tags:
- Browser Pools
summary: Acquire a browser from the pool
description: 'Long-polling endpoint to acquire a browser from the pool. Returns immediately when a browser
is available, or returns 204 No Content when the poll times out. The client should retry
the request to continue waiting for a browser. The acquired browser will use the pool''s
timeout_seconds for its idle timeout.
'
security:
- bearerAuth: []
parameters:
- name: id_or_name
in: path
required: true
schema:
type: string
description: Browser pool ID or name
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BrowserPoolAcquireRequest'
responses:
'200':
description: Browser acquired successfully
content:
application/json:
schema:
$ref: '#/components/schemas/Browser'
'204':
description: Poll timed out, no browser available. Retry the request to continue waiting.
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalError'
x-codeSamples:
- lang: JavaScript
source: "import Kernel from '@onkernel/sdk';\n\nconst client = new Kernel({\n apiKey: process.env['KERNEL_API_KEY'], // This is the default and can be omitted\n});\n\nconst response = await client.browserPools.acquire('id_or_name');\n\nconsole.log(response.session_id);"
- lang: Python
source: "import os\nfrom kernel import Kernel\n\nclient = Kernel(\n api_key=os.environ.get(\"KERNEL_API_KEY\"), # This is the default and can be omitted\n)\nresponse = client.browser_pools.acquire(\n id_or_name=\"id_or_name\",\n)\nprint(response.session_id)"
- lang: Go
source: "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/kernel/kernel-go-sdk\"\n\t\"github.com/kernel/kernel-go-sdk/option\"\n)\n\nfunc main() {\n\tclient := kernel.NewClient(\n\t\toption.WithAPIKey(\"My API Key\"),\n\t)\n\tresponse, err := client.BrowserPools.Acquire(\n\t\tcontext.TODO(),\n\t\t\"id_or_name\",\n\t\tkernel.BrowserPoolAcquireParams{},\n\t)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\tfmt.Printf(\"%+v\\n\", response.SessionID)\n}\n"
/browser_pools/{id_or_name}/release:
post:
operationId: releaseToBrowserPoolByIdOrName
tags:
- Browser Pools
summary: Release a browser back to the pool
description: Release a browser back to the pool, optionally recreating the browser instance.
security:
- bearerAuth: []
parameters:
- name: id_or_name
in: path
required: true
schema:
type: string
description: Browser pool ID or name
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BrowserPoolReleaseRequest'
responses:
'204':
description: Browser released successfully
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalError'
x-codeSamples:
- lang: JavaScript
source: "import Kernel from '@onkernel/sdk';\n\nconst client = new Kernel({\n apiKey: process.env['KERNEL_API_KEY'], // This is the default and can be omitted\n});\n\nawait client.browserPools.release('id_or_name', { session_id: 'ts8iy3sg25ibheguyni2lg9t' });"
- lang: Python
source: "import os\nfrom kernel import Kernel\n\nclient = Kernel(\n api_key=os.environ.get(\"KERNEL_API_KEY\"), # This is the default and can be omitted\n)\nclient.browser_pools.release(\n id_or_name=\"id_or_name\",\n session_id=\"ts8iy3sg25ibheguyni2lg9t\",\n)"
- lang: Go
source: "package main\n\nimport (\n\t\"context\"\n\n\t\"github.com/kernel/kernel-go-sdk\"\n\t\"github.com/kernel/kernel-go-sdk/option\"\n)\n\nfunc main() {\n\tclient := kernel.NewClient(\n\t\toption.WithAPIKey(\"My API Key\"),\n\t)\n\terr := client.BrowserPools.Release(\n\t\tcontext.TODO(),\n\t\t\"id_or_name\",\n\t\tkernel.BrowserPoolReleaseParams{\n\t\t\tSessionID: \"ts8iy3sg25ibheguyni2lg9t\",\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n"
/browser_pools/{id_or_name}/flush:
post:
operationId: flushBrowserPoolByIdOrName
tags:
- Browser Pools
summary: Flush all idle browsers in the pool
description: Destroys all idle browsers in the pool; leased browsers are not affected.
security:
- bearerAuth: []
parameters:
- name: id_or_name
in: path
required: true
schema:
type: string
description: Browser pool ID or name
responses:
'204':
description: Pool flushed successfully
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalError'
x-codeSamples:
- lang: JavaScript
source: "import Kernel from '@onkernel/sdk';\n\nconst client = new Kernel({\n apiKey: process.env['KERNEL_API_KEY'], // This is the default and can be omitted\n});\n\nawait client.browserPools.flush('id_or_name');"
- lang: Python
source: "import os\nfrom kernel import Kernel\n\nclient = Kernel(\n api_key=os.environ.get(\"KERNEL_API_KEY\"), # This is the default and can be omitted\n)\nclient.browser_pools.flush(\n \"id_or_name\",\n)"
- lang: Go
source: "package main\n\nimport (\n\t\"context\"\n\n\t\"github.com/kernel/kernel-go-sdk\"\n\t\"github.com/kernel/kernel-go-sdk/option\"\n)\n\nfunc main() {\n\tclient := kernel.NewClient(\n\t\toption.WithAPIKey(\"My API Key\"),\n\t)\n\terr := client.BrowserPools.Flush(context.TODO(), \"id_or_name\")\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n"
components:
responses:
Conflict:
description: Conflict – resource already exists
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
InternalError:
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Unauthorized:
description: Unauthorized – missing or invalid authorization token
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Forbidden:
description: Forbidden – insufficient permissions or plan
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
BadRequest:
description: Bad Request – invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
TooManyRequests:
description: Too Many Requests – rate limit exceeded
headers:
Retry-After:
description: Seconds to wait before retrying
schema:
type: integer
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
BrowserPoolDeleteRequest:
type: object
description: 'Parameters for deleting a browser pool.
'
properties:
force:
type: boolean
default: false
description: If true, force delete even if browsers are currently leased. Leased browsers will be terminated.
required: []
BrowserProfile:
type: object
description: 'Profile selection for the browser session. Provide either id or name. If specified, the
matching profile will be loaded into the browser session. Profiles must be created beforehand.
'
properties:
id:
type: string
description: Profile ID to load for this browser session
name:
type: string
minLength: 1
maxLength: 255
pattern: ^[a-zA-Z0-9._-]{1,255}$
description: Profile name to load for this browser session (instead of id). Must be 1-255 characters, using letters, numbers, dots, underscores, or hyphens.
save_changes:
type: boolean
description: If true, save changes made during the session back to the profile when the session ends.
default: false
oneOf:
- required:
- id
- required:
- name
BrowserPoolAcquireRequest:
type: object
description: Request body for acquiring a browser from the pool.
properties:
acquire_timeout_seconds:
type: integer
description: Maximum number of seconds to wait for a browser to be available. Defaults to the calculated time it would take to fill the pool at the currently configured fill rate.
required: []
BrowserExtension:
type: object
description: 'Extension selection for the browser session. Provide either id or name of an extension uploaded to Kernel.
'
properties:
id:
type: string
description: Extension ID to load for this browser session
name:
type: string
minLength: 1
maxLength: 255
pattern: ^[a-zA-Z0-9._-]{1,255}$
description: Extension name to load for this browser session (instead of id). Must be 1-255 characters, using letters, numbers, dots, underscores, or hyphens.
oneOf:
- required:
- id
- required:
- name
ErrorDetail:
type: object
properties:
code:
type: string
description: Lower-level error code providing more specific detail
example: invalid_input
message:
type: string
description: Further detail about the error
example: Provided version string is not semver compliant
BrowserTelemetryCategoryConfig:
type: object
description: Per-category telemetry configuration.
properties:
enabled:
type: boolean
description: Whether this category is captured. Defaults to true if omitted.
BrowserPoolReleaseRequest:
type: object
description: Request body for releasing a browser back to the pool.
properties:
session_id:
type: string
description: Browser session ID to release back to the pool
example: ts8iy3sg25ibheguyni2lg9t
reuse:
type: boolean
description: Whether to reuse the browser instance or destroy it and create a new one. Defaults to true.
default: true
example: false
required:
- session_id
BrowserPoolRef:
type: object
description: Browser pool this session was acquired from, if any.
properties:
id:
type: string
description: Browser pool ID
name:
type: string
description: Browser pool name, if set
required:
- id
BrowserPoolUpdateRequest:
type: object
description: 'Parameters for updating a browser pool. All browsers in the pool will be created with the same configuration.
'
allOf:
- $ref: '#/components/schemas/BrowserPoolRequest'
- type: object
properties:
discard_all_idle:
type: boolean
description: Whether to discard all idle browsers and rebuild the pool immediately. Defaults to false.
example: false
default: false
BrowserPool:
type: object
description: A browser pool containing multiple identically configured browsers.
properties:
id:
type: string
description: Unique identifier for the browser pool
example: iv25ujqf37x3j07dwoffegqr
name:
type: string
description: Browser pool name, if set
example: my-pool
available_count:
type: integer
description: Number of browsers currently available in the pool
example: 85
acquired_count:
type: integer
description: Number of browsers currently acquired from the pool
example: 15
created_at:
type: string
format: date-time
description: Timestamp when the browser pool was created
browser_pool_config:
$ref: '#/components/schemas/BrowserPoolRequest'
description: Configuration used to create all browsers in this pool
required:
- id
- available_count
- acquired_count
- created_at
- browser_pool_config
BrowserTelemetryConfig:
type: object
description: Telemetry configuration for a browser session.
properties:
browser:
$ref: '#/components/schemas/BrowserTelemetryCategoriesConfig'
description: Per-category enable/disable flags. If omitted, all categories are captured.
BrowserViewport:
type: object
description: 'Initial browser window size in pixels with optional refresh rate.
If omitted, image defaults apply (1920x1080@25).
For GPU images, the default is 1920x1080@60.
Arbitrary viewport dimensions and refresh rates are accepted.
Known-good presets include:
2560x1440@10, 1920x1080@25, 1920x1200@25, 1440x900@25, 1280x800@60, 1024x768@60, 1200x800@60.
For GPU images, recommended presets use one of these resolutions with refresh rates 60, 30, 25, or 10:
800x600, 960x720, 1024x576, 1024x768, 1152x648, 1200x800, 1280x720, 1368x768, 1440x900, 1600x900, 1920x1080, 1920x1200, 390x844, 360x250, 768x1024, 800x1600.
Viewports outside this list may exhibit unstable live view or recording behavior.
If refresh_rate is not provided, it will be automatically determined based on the resolution
(higher resolutions use lower refresh rates to keep bandwidth reasonable).
'
properties:
width:
type: integer
description: Browser window width in pixels.
minimum: 320
maximum: 7680
example: 1280
height:
type: integer
description: Browser window height in pixels.
minimum: 240
maximum: 4320
example: 800
refresh_rate:
type: integer
description: Display refresh rate in Hz. If omitted, automatically determined from width and height.
example: 60
required:
- width
- height
BrowserTelemetryCategoriesConfig:
type: object
description: Per-category telemetry capture settings.
properties:
console:
$ref: '#/components/schemas/BrowserTelemetryCategoryConfig'
description: Console output (log, warn, error) and uncaught exceptions.
page:
$ref: '#/components/schemas/BrowserTelemetryCategoryConfig'
description: Page lifecycle events including navigation, DOMContentLoaded, load, layout shifts, and LCP.
interaction:
$ref: '#/components/schemas/BrowserTelemetryCategoryConfig'
description: User interaction events including clicks, keydowns, and scroll-settled events.
network:
$ref: '#/components/schemas/BrowserTelemetryCategoryConfig'
description: HTTP request and response metadata including URL, method, status code, and timing. Request post data is forwarded as-is from CDP. Text response bodies are truncated at 8 KB for structured types (JSON, XML, form data) and 4 KB for other text types. Binary responses (images, fonts, media) are excluded.
BrowserUsage:
type: object
description: Session usage metrics.
properties:
uptime_ms:
type: integer
description: Time in milliseconds the session was actively running.
required:
- uptime_ms
Error:
type: object
required:
- code
- message
properties:
code:
type: string
description: Application-specific error code (machine-readable)
example: bad_request
message:
type: string
description: Human-readable error description for debugging
example: 'Missing required field: app_name'
details:
type: array
description: Additional error details (for multiple errors)
items:
$ref: '#/components/schemas/ErrorDetail'
inner_error:
$ref: '#/components/schemas/ErrorDetail'
Browser:
type: object
properties:
created_at:
type: string
format: date-time
description: When the browser session was created.
cdp_ws_url:
type: string
description: Websocket URL for Chrome DevTools Protocol connections to the browser session
example: wss://proxy.yul-upbeat-herschel.onkernel.com:8443/browser/cdp?jwt=eyJ0eXAi...
webdriver_ws_url:
type: string
description: Websocket URL for WebDriver BiDi connections to the browser session
example: wss://proxy.yul-upbeat-herschel.onkernel.com:8443/browser/webdriver/session?jwt=eyJ0eXAi...
browser_live_view_url:
type: string
description: Remote URL for live viewing the browser session. Only available for non-headless browsers.
example: https://proxy.yul-upbeat-herschel.onkernel.com:8443/browser/live?jwt=eyJ0eXAi...
base_url:
type: string
description: Metro-API HTTP base URL for this browser session.
example: https://proxy.yul-upbeat-herschel.onkernel.com:8443/browser/kernel
headless:
type: boolean
description: Whether the browser session is running in headless mode.
example: false
stealth:
type: boolean
description: Whether the browser session is running in stealth mode.
example: false
gpu:
type: boolean
description: Whether GPU acceleration is enabled for the browser session (only supported for headful sessions).
example: false
session_id:
type: string
description: Unique identifier for the browser session
example: htzv5orfit78e1m2biiifpbv
timeout_seconds:
type: integer
description: The number of seconds of inactivity before the browser session is terminated.
profile:
$ref: '#/components/schemas/Profile'
proxy_id:
type: string
description: ID of the proxy associated with this browser session, if any.
pool:
$ref: '#/components/schemas/BrowserPoolRef'
viewport:
$ref: '#/components/schemas/BrowserViewport'
kiosk_mode:
type: boolean
description: Whether the browser session is running in kiosk mode.
example: false
start_url:
type: string
description: URL the session was asked to navigate to on creation, if any. Recorded for debugging. Navigation is fire-and-forget — the URL is dispatched to the browser without waiting for it to load, and any errors (DNS failure, bad status, timeout) are silently dropped. Captures what was requested, not what the browser actually loaded.
example: https://example.com
chrome_policy:
type: object
additionalProperties: true
description: 'Custom Chrome enterprise policy overrides that were applied to this browser session, if any. Echoed back for verification. Keys are Chrome enterprise policy names.
'
deleted_at:
type: string
format: date-time
description: When the browser session was soft-deleted. Only present for deleted sessions.
usage:
$ref: '#/components/schemas/BrowserUsage'
telemetry:
$ref: '#/components/schemas/BrowserTelemetryConfig'
nullable: true
description: Active telemetry configuration for the session, if any.
required:
- created_at
- cdp_ws_url
- webdriver_ws_url
- session_id
- stealth
- headless
- timeout_seconds
Profile:
type: object
description: Browser profile metadata.
properties:
id:
type: string
description: Unique identifier for the profile
name:
type: string
nullable: true
description: Optional, easier-to-reference name for the profile
created_at:
type: string
format: date-time
description: Timestamp when the profile was created
updated_at:
type: string
format: date-time
description: Timestamp when the profile was last updated
last_used_at:
type: string
format: date-time
description: Timestamp when the profile was last used
required:
- id
- created_at
BrowserPoolRequest:
type: object
description: 'Parameters for creating a browser pool. All browsers in the pool will be created with the same configuration.
# --- truncated at 32 KB (34 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/kernel-so/refs/heads/main/openapi/kernel-so-browser-pools-api-openapi.yml