Kernel Extensions API
Create, list, retrieve, and delete browser extensions.
Create, list, retrieve, and delete browser extensions.
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:kernel-extensions-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:
description: Developer tools and cloud infrastructure for AI agents to use web browsers
title: Kernel Extensions API
version: 0.1.0
servers:
- description: API Server
url: https://api.onkernel.com
security:
- bearerAuth: []
tags:
- description: Create, list, retrieve, and delete browser extensions.
name: Extensions
paths:
/extensions:
get:
description: List extensions in the resolved project.
operationId: getExtensions
parameters:
- description: Limit the number of extensions to return.
in: query
name: limit
required: false
schema:
default: 20
maximum: 100
minimum: 1
type: integer
- description: Offset the number of extensions to return.
in: query
name: offset
required: false
schema:
default: 0
minimum: 0
type: integer
- description: Case-insensitive substring match against extension name. IDs match by exact value.
in: query
name: query
required: false
schema:
type: string
- description: Exact-match filter on extension name using the database collation. In production, matching is case- and accent-insensitive. During the default-project migration, unscoped requests prefer a concrete default-project extension over a legacy unscoped extension with the same name.
in: query
name: name
required: false
schema:
type: string
responses:
'200':
content:
application/json:
schema:
items:
$ref: '#/components/schemas/Extension'
type: array
description: List of extensions
headers:
X-Has-More:
description: Whether there are more extensions to fetch.
schema:
default: false
type: boolean
X-Limit:
description: Limit the number of extensions to return.
schema:
default: 20
maximum: 100
minimum: 1
type: integer
X-Next-Offset:
description: The offset where the next page starts. 0 when there are no more results.
schema:
nullable: true
type: integer
X-Offset:
description: The offset of extensions to return.
schema:
default: 0
minimum: 0
type: integer
'401':
$ref: '#/components/responses/Unauthorized'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: List browser extensions
tags:
- Extensions
post:
description: Upload a zip file containing an unpacked browser extension. Optionally provide a unique name for later reference.
operationId: postExtensions
requestBody:
content:
multipart/form-data:
schema:
properties:
file:
description: ZIP file containing the browser extension.
example: '@path/to/extension.zip'
format: binary
type: string
name:
description: Optional unique name within the project to reference this extension.
pattern: ^[A-Za-z0-9._-]{1,255}$
type: string
required:
- file
type: object
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/Extension'
description: Extension uploaded successfully
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'409':
$ref: '#/components/responses/Conflict'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: Upload a browser extension
tags:
- Extensions
/extensions/from_chrome_store:
get:
description: Returns a ZIP archive containing the unpacked extension fetched from the Chrome Web Store.
operationId: getExtensionsFromChromeStore
parameters:
- description: Chrome Web Store URL for the extension.
in: query
name: url
required: true
schema:
type: string
- description: Target operating system for the extension package. Defaults to linux.
in: query
name: os
required: false
schema:
default: linux
enum:
- win
- mac
- linux
type: string
responses:
'200':
content:
application/octet-stream:
schema:
format: binary
type: string
description: Extension ZIP archive
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: Download unpacked extension from Chrome Web Store
tags:
- Extensions
/extensions/{id_or_name}:
delete:
description: Delete an extension by its ID or by its name.
operationId: deleteExtensionByIdOrName
parameters:
- description: Extension ID or extension name
in: path
name: id_or_name
required: true
schema:
type: string
responses:
'204':
description: Extension deleted successfully
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: Delete extension by ID or name
tags:
- Extensions
get:
description: Download the extension as a ZIP archive by ID or name.
operationId: getExtensionByIdOrName
parameters:
- description: Extension ID or name
in: path
name: id_or_name
required: true
schema:
type: string
responses:
'200':
content:
application/octet-stream:
schema:
format: binary
type: string
description: Extension ZIP archive
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: Download extension archive
tags:
- Extensions
/extensions/{id_or_name}/metadata:
get:
description: Get an extension's metadata (name, size, timestamps) by ID or name, without downloading the archive.
operationId: getExtensionByIdOrNameMetadata
parameters:
- description: Extension ID or name
in: path
name: id_or_name
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Extension'
description: Extension metadata
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: Get extension metadata
tags:
- Extensions
components:
responses:
NotFound:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Resource not found
BadRequest:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Bad Request – invalid input
Conflict:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Conflict – resource already exists
InternalError:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Internal Server Error
Forbidden:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Forbidden – insufficient permissions or plan
Unauthorized:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Unauthorized – missing or invalid authorization token
schemas:
Extension:
description: A browser extension uploaded to Kernel.
properties:
checksum:
description: SHA-256 checksum, encoded as lowercase hexadecimal, of the exact uploaded extension archive bytes. This is not a normalized checksum of the extension contents; archive metadata, file ordering, and compression can change the checksum for otherwise identical contents. Omitted for legacy rows and server-repackaged Chrome Web Store extensions.
maxLength: 64
minLength: 64
nullable: true
type: string
created_at:
description: Timestamp when the extension was created
format: date-time
type: string
id:
description: Unique identifier for the extension
type: string
last_used_at:
description: Timestamp when the extension was last used
format: date-time
nullable: true
type: string
name:
description: Optional, easier-to-reference name for the extension. Must be unique within the project.
nullable: true
type: string
size_bytes:
description: Size of the extension archive in bytes
type: integer
required:
- id
- created_at
- size_bytes
type: object
ErrorDetail:
properties:
code:
description: Lower-level error code providing more specific detail
example: invalid_input
type: string
message:
description: Further detail about the error
example: Provided version string is not semver compliant
type: string
type: object
Error:
properties:
code:
description: Application-specific error code (machine-readable)
example: bad_request
type: string
details:
description: Additional error details (for multiple errors)
items:
$ref: '#/components/schemas/ErrorDetail'
type: array
inner_error:
$ref: '#/components/schemas/ErrorDetail'
message:
description: Human-readable error description for debugging
example: 'Missing required field: app_name'
type: string
required:
- code
- message
type: object
securitySchemes:
bearerAuth:
scheme: bearer
type: http
x-service-info:
categories:
- browsers
docs:
apiReference: https://www.kernel.sh/docs
homepage: https://www.kernel.sh
llms: https://api.onkernel.com/llms.txt
x-provenance:
method: harvested
publisher: Kernel
source: https://api.onkernel.com/openapi.json
note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
stamped by stamp-openapi-provenance.py (roadmap#793)