Kernel Browser Processes API
Execute and manage processes on the browser instance.
Execute and manage processes on the browser instance.
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-browser-processes-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
openapi: 3.2.0
info:
title: Kernel API Keys Browser Processes 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 Processes
description: Execute and manage processes on the browser instance.
paths:
/browsers/{id}/process/exec:
post:
summary: Execute a command synchronously
operationId: processExec
tags:
- Browser Processes
security:
- bearerAuth: []
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Browser session ID
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ProcessExecRequest'
responses:
'200':
description: Execution result
content:
application/json:
schema:
$ref: '#/components/schemas/ProcessExecResult'
'400':
$ref: '#/components/responses/BadRequest'
'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.browsers.process.exec('id', { command: 'command' });\n\nconsole.log(response.duration_ms);"
- 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.browsers.process.exec(\n id=\"id\",\n command=\"command\",\n)\nprint(response.duration_ms)"
- 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.Browsers.Process.Exec(\n\t\tcontext.TODO(),\n\t\t\"id\",\n\t\tkernel.BrowserProcessExecParams{\n\t\t\tCommand: \"command\",\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\tfmt.Printf(\"%+v\\n\", response.DurationMs)\n}\n"
/browsers/{id}/process/spawn:
post:
summary: Execute a command asynchronously
operationId: processSpawn
tags:
- Browser Processes
security:
- bearerAuth: []
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Browser session ID
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ProcessSpawnRequest'
responses:
'200':
description: Spawned
content:
application/json:
schema:
$ref: '#/components/schemas/ProcessSpawnResult'
'400':
$ref: '#/components/responses/BadRequest'
'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.browsers.process.spawn('id', { command: 'command' });\n\nconsole.log(response.pid);"
- 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.browsers.process.spawn(\n id=\"id\",\n command=\"command\",\n)\nprint(response.pid)"
- 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.Browsers.Process.Spawn(\n\t\tcontext.TODO(),\n\t\t\"id\",\n\t\tkernel.BrowserProcessSpawnParams{\n\t\t\tCommand: \"command\",\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\tfmt.Printf(\"%+v\\n\", response.Pid)\n}\n"
/browsers/{id}/process/{process_id}/status:
get:
summary: Get process status
operationId: processStatus
tags:
- Browser Processes
security:
- bearerAuth: []
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Browser session ID
- name: process_id
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: Status
content:
application/json:
schema:
$ref: '#/components/schemas/ProcessStatus'
'400':
$ref: '#/components/responses/BadRequest'
'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.browsers.process.status('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', {\n id: 'id',\n});\n\nconsole.log(response.cpu_pct);"
- 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.browsers.process.status(\n process_id=\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\",\n id=\"id\",\n)\nprint(response.cpu_pct)"
- 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.Browsers.Process.Status(\n\t\tcontext.TODO(),\n\t\t\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\",\n\t\tkernel.BrowserProcessStatusParams{\n\t\t\tID: \"id\",\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\tfmt.Printf(\"%+v\\n\", response.CPUPct)\n}\n"
/browsers/{id}/process/{process_id}/stdout/stream:
get:
summary: Stream process stdout via SSE
operationId: processStdoutStream
tags:
- Browser Processes
security:
- bearerAuth: []
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Browser session ID
- name: process_id
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: SSE stream of process output and lifecycle events
headers:
X-SSE-Content-Type:
description: Media type of SSE data events (application/json)
schema:
type: string
const: application/json
content:
text/event-stream:
schema:
$ref: '#/components/schemas/ProcessStreamEvent'
'400':
$ref: '#/components/responses/BadRequest'
'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.browsers.process.stdoutStream(\n '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',\n { id: 'id' },\n);\n\nconsole.log(response.data_b64);"
- 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)\nfor process in client.browsers.process.stdout_stream(\n process_id=\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\",\n id=\"id\",\n):\n print(process)"
- 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\tstream := client.Browsers.Process.StdoutStreamStreaming(\n\t\tcontext.TODO(),\n\t\t\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\",\n\t\tkernel.BrowserProcessStdoutStreamParams{\n\t\t\tID: \"id\",\n\t\t},\n\t)\n\tfor stream.Next() {\n\t\tfmt.Printf(\"%+v\\n\", stream.Current())\n\t}\n\terr := stream.Err()\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n"
/browsers/{id}/process/{process_id}/stdin:
post:
summary: Write to process stdin
operationId: processStdin
tags:
- Browser Processes
security:
- bearerAuth: []
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Browser session ID
- name: process_id
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ProcessStdinRequest'
responses:
'200':
description: Bytes written
content:
application/json:
schema:
$ref: '#/components/schemas/ProcessStdinResult'
'400':
$ref: '#/components/responses/BadRequest'
'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.browsers.process.stdin('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', {\n id: 'id',\n data_b64: 'data_b64',\n});\n\nconsole.log(response.written_bytes);"
- 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.browsers.process.stdin(\n process_id=\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\",\n id=\"id\",\n data_b64=\"data_b64\",\n)\nprint(response.written_bytes)"
- 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.Browsers.Process.Stdin(\n\t\tcontext.TODO(),\n\t\t\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\",\n\t\tkernel.BrowserProcessStdinParams{\n\t\t\tID: \"id\",\n\t\t\tDataB64: \"data_b64\",\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\tfmt.Printf(\"%+v\\n\", response.WrittenBytes)\n}\n"
/browsers/{id}/process/{process_id}/kill:
post:
summary: Send signal to process
operationId: processKill
tags:
- Browser Processes
security:
- bearerAuth: []
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Browser session ID
- name: process_id
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ProcessKillRequest'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/OkResponse'
'400':
$ref: '#/components/responses/BadRequest'
'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.browsers.process.kill('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', {\n id: 'id',\n signal: 'TERM',\n});\n\nconsole.log(response.ok);"
- 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.browsers.process.kill(\n process_id=\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\",\n id=\"id\",\n signal=\"TERM\",\n)\nprint(response.ok)"
- 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.Browsers.Process.Kill(\n\t\tcontext.TODO(),\n\t\t\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\",\n\t\tkernel.BrowserProcessKillParams{\n\t\t\tID: \"id\",\n\t\t\tSignal: kernel.BrowserProcessKillParamsSignalTerm,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\tfmt.Printf(\"%+v\\n\", response.Ok)\n}\n"
/browsers/{id}/process/{process_id}/resize:
post:
summary: Resize a PTY-backed process terminal
operationId: processResize
tags:
- Browser Processes
security:
- bearerAuth: []
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Browser session ID
- name: process_id
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ProcessResizeRequest'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/OkResponse'
'400':
$ref: '#/components/responses/BadRequest'
'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.browsers.process.resize('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', {\n id: 'id',\n cols: 1,\n rows: 1,\n});\n\nconsole.log(response.ok);"
- 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.browsers.process.resize(\n process_id=\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\",\n id=\"id\",\n cols=1,\n rows=1,\n)\nprint(response.ok)"
- 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.Browsers.Process.Resize(\n\t\tcontext.TODO(),\n\t\t\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\",\n\t\tkernel.BrowserProcessResizeParams{\n\t\t\tID: \"id\",\n\t\t\tCols: 1,\n\t\t\tRows: 1,\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\tfmt.Printf(\"%+v\\n\", response.Ok)\n}\n"
components:
responses:
InternalError:
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
BadRequest:
description: Bad Request – invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
OkResponse:
type: object
description: Generic OK response.
required:
- ok
properties:
ok:
type: boolean
description: Indicates success.
default: true
additionalProperties: false
ProcessKillRequest:
type: object
description: Signal to send to the process.
required:
- signal
properties:
signal:
type: string
enum:
- TERM
- KILL
- INT
- HUP
default: TERM
description: Signal to send.
additionalProperties: false
ProcessExecRequest:
type: object
description: Request to execute a command synchronously.
required:
- command
properties:
command:
type: string
description: Executable or shell command to run.
args:
type: array
description: Command arguments.
items:
type: string
default: []
cwd:
type: string
description: Working directory (absolute path) to run the command in.
nullable: true
pattern: ^/.*
env:
type: object
description: Environment variables to set for the process.
additionalProperties:
type: string
default: {}
as_user:
type: string
description: Run the process as this user.
nullable: true
as_root:
type: boolean
description: Run the process with root privileges.
default: false
timeout_sec:
type: integer
description: Maximum execution time in seconds.
nullable: true
additionalProperties: false
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'
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
ProcessResizeRequest:
type: object
description: Resize a PTY-backed process terminal.
required:
- rows
- cols
properties:
rows:
type: integer
minimum: 1
maximum: 65535
description: New terminal rows.
cols:
type: integer
minimum: 1
maximum: 65535
description: New terminal columns.
additionalProperties: false
ProcessStreamEvent:
type: object
description: SSE payload representing process output or lifecycle events.
properties:
stream:
type: string
description: Source stream of the data chunk.
enum:
- stdout
- stderr
data_b64:
type: string
description: Base64-encoded data from the process stream.
event:
type: string
description: Lifecycle event type.
enum:
- exit
exit_code:
type: integer
description: Exit code when the event is "exit".
additionalProperties: false
ProcessExecResult:
type: object
description: Result of a synchronous command execution.
properties:
exit_code:
type: integer
description: Process exit code.
stdout_b64:
type: string
description: Base64-encoded stdout buffer.
stderr_b64:
type: string
description: Base64-encoded stderr buffer.
duration_ms:
type: integer
description: Execution duration in milliseconds.
additionalProperties: false
ProcessSpawnRequest:
allOf:
- $ref: '#/components/schemas/ProcessExecRequest'
- type: object
properties:
allocate_tty:
type: boolean
description: Allocate a pseudo-terminal (PTY) for interactive shells.
default: false
rows:
type: integer
description: Initial terminal rows. Only used when allocate_tty is true.
minimum: 1
maximum: 65535
cols:
type: integer
description: Initial terminal columns. Only used when allocate_tty is true.
minimum: 1
maximum: 65535
ProcessStatus:
type: object
description: Current status of a process.
properties:
state:
type: string
enum:
- running
- exited
description: Process state.
exit_code:
type: integer
nullable: true
description: Exit code if the process has exited.
cpu_pct:
type: number
description: Estimated CPU usage percentage.
mem_bytes:
type: integer
description: Estimated resident memory usage in bytes.
additionalProperties: false
ProcessSpawnResult:
type: object
description: Information about a spawned process.
properties:
process_id:
type: string
format: uuid
description: Server-assigned identifier for the process.
pid:
type: integer
description: OS process ID.
started_at:
type: string
format: date-time
description: Timestamp when the process started.
additionalProperties: false
ProcessStdinResult:
type: object
description: Result of writing to stdin.
properties:
written_bytes:
type: integer
description: Number of bytes written.
additionalProperties: false
ProcessStdinRequest:
type: object
description: Data to write to the process standard input.
required:
- data_b64
properties:
data_b64:
type: string
description: Base64-encoded data to write.
additionalProperties: false
securitySchemes:
bearerAuth:
type: http
scheme: bearer