Kernel Projects API
Create and manage projects for resource isolation within an organization.
Create and manage projects for resource isolation within an organization.
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-projects-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 Projects API
version: 0.1.0
servers:
- description: API Server
url: https://api.onkernel.com
security:
- bearerAuth: []
tags:
- description: 'Create and manage projects for resource isolation within an organization.
When projects are disabled for the organization, project operations return
`404` with code `projects_disabled`.'
name: Projects
paths:
/org/projects:
get:
description: List projects for the authenticated organization.
operationId: getOrgProjects
parameters:
- description: Maximum number of results to return
in: query
name: limit
required: false
schema:
default: 20
maximum: 100
type: integer
- description: Number of results to skip
in: query
name: offset
required: false
schema:
default: 0
type: integer
- description: Case-insensitive substring match against project name
in: query
name: query
required: false
schema:
type: string
- description: Exact-match filter on project name using the database collation. In production, matching is case- and accent-insensitive.
in: query
name: name
required: false
schema:
type: string
responses:
'200':
content:
application/json:
schema:
items:
$ref: '#/components/schemas/Project'
type: array
description: List of projects
headers:
X-Has-More:
description: Whether there are more results
schema:
type: boolean
X-Next-Offset:
description: The offset where the next page starts. 0 when there are no more results.
schema:
type: integer
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: List projects
tags:
- Projects
post:
description: Create a new project within the authenticated organization.
operationId: postOrgProjects
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateProjectRequest'
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/Project'
description: Project created successfully
'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'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: Create a project
tags:
- Projects
/org/projects/{id_or_name}:
delete:
description: Soft-delete a project. The project must be empty (no active resources).
operationId: deleteOrgProjectsId
parameters:
- description: Project ID or name
in: path
name: id_or_name
required: true
schema:
type: string
responses:
'204':
description: Project deleted
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: 'Project deletion conflict. Returns `project_not_empty` when active
resources remain; remove them and retry. Returns `last_active_project`
when deletion would remove the organization''s final active project.
'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: Delete a project by ID or name
tags:
- Projects
get:
description: Get a project by its ID or by its name. Names are unique within an organization.
operationId: getOrgProjectsId
parameters:
- description: Project ID or name
in: path
name: id_or_name
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Project'
description: Project details
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: Get a project by ID or name
tags:
- Projects
patch:
description: Update a project's name or status.
operationId: patchOrgProjectsId
parameters:
- description: Project ID or name
in: path
name: id_or_name
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateProjectRequest'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Project'
description: Project updated
'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'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: Update a project by ID or name
tags:
- Projects
/org/projects/{id_or_name}/limits:
get:
description: Get the resource limit overrides for a project. Null values mean no project-level cap (org limit applies).
operationId: getOrgProjectLimits
parameters:
- description: Project ID or name
in: path
name: id_or_name
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/ProjectLimits'
description: Project limits
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: Get project limits by ID or name
tags:
- Projects
patch:
description: Update resource limit overrides for a project. Only fields present in the request are modified. Set a field to 0 to remove that limit cap; omit a field to leave it unchanged.
operationId: patchOrgProjectLimits
parameters:
- description: Project ID or name
in: path
name: id_or_name
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateProjectLimitsRequest'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/ProjectLimits'
description: Project limits updated
'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'
security:
- bearerAuth: []
summary: Update project limits by ID or name
tags:
- Projects
/projects:
get:
deprecated: true
description: 'Deprecated: use `GET /org/projects` instead. This route will be removed on 2026-11-24.
List projects for the authenticated organization.'
operationId: getProjects
parameters:
- description: Maximum number of results to return
in: query
name: limit
required: false
schema:
default: 20
maximum: 100
type: integer
- description: Number of results to skip
in: query
name: offset
required: false
schema:
default: 0
type: integer
- description: Case-insensitive substring match against project name
in: query
name: query
required: false
schema:
type: string
- description: Exact-match filter on project name using the database collation. In production, matching is case- and accent-insensitive.
in: query
name: name
required: false
schema:
type: string
responses:
'200':
content:
application/json:
schema:
items:
$ref: '#/components/schemas/Project'
type: array
description: List of projects
headers:
X-Has-More:
description: Whether there are more results
schema:
type: boolean
X-Next-Offset:
description: The offset where the next page starts. 0 when there are no more results.
schema:
type: integer
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: List projects
tags:
- Projects
post:
deprecated: true
description: 'Deprecated: use `POST /org/projects` instead. This route will be removed on 2026-11-24.
Create a new project within the authenticated organization.'
operationId: postProjects
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateProjectRequest'
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/Project'
description: Project created successfully
'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'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: Create a project
tags:
- Projects
/projects/{id_or_name}:
delete:
deprecated: true
description: 'Deprecated: use `DELETE /org/projects/{id_or_name}` instead. This route will be removed on 2026-11-24.
Soft-delete a project. The project must be empty (no active resources).'
operationId: deleteProjectsId
parameters:
- description: Project ID or name
in: path
name: id_or_name
required: true
schema:
type: string
responses:
'204':
description: Project deleted
'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'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: Delete a project by ID or name
tags:
- Projects
get:
deprecated: true
description: 'Deprecated: use `GET /org/projects/{id_or_name}` instead. This route will be removed on 2026-11-24.
Get a project by ID or name.'
operationId: getProjectsId
parameters:
- description: Project ID or name
in: path
name: id_or_name
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Project'
description: Project details
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: Get a project by ID or name
tags:
- Projects
patch:
deprecated: true
description: 'Deprecated: use `PATCH /org/projects/{id_or_name}` instead. This route will be removed on 2026-11-24.
Update a project''s name or status.'
operationId: patchProjectsId
parameters:
- description: Project ID or name
in: path
name: id_or_name
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateProjectRequest'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Project'
description: Project updated
'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'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: Update a project by ID or name
tags:
- Projects
/projects/{id_or_name}/limits:
get:
deprecated: true
description: 'Deprecated: use `GET /org/projects/{id_or_name}/limits` instead. This route will be removed on 2026-11-24.
Get the resource limit overrides for a project. Null values mean no project-level cap (org limit applies).'
operationId: getProjectLimits
parameters:
- description: Project ID or name
in: path
name: id_or_name
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/ProjectLimits'
description: Project limits
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalError'
security:
- bearerAuth: []
summary: Get project limits by ID or name
tags:
- Projects
patch:
deprecated: true
description: 'Deprecated: use `PATCH /org/projects/{id_or_name}/limits` instead. This route will be removed on 2026-11-24.
Update resource limit overrides for a project. Only fields present in the request are modified. Set a field to 0 to remove that limit cap; omit a field to leave it unchanged.'
operationId: patchProjectLimits
parameters:
- description: Project ID or name
in: path
name: id_or_name
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateProjectLimitsRequest'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/ProjectLimits'
description: Project limits updated
'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'
security:
- bearerAuth: []
summary: Update project limits by ID or name
tags:
- Projects
components:
responses:
BadRequest:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Bad Request – invalid input
NotFound:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Resource not found
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:
UpdateProjectLimitsRequest:
properties:
max_concurrent_invocations:
description: Maximum concurrent app invocations for this project. Set to 0 to remove the cap; omit to leave unchanged.
nullable: true
type: integer
max_concurrent_sessions:
description: Maximum concurrent browsers for this project, covering both on-demand sessions and browser pool reservations. Set to 0 to remove the cap; omit to leave unchanged.
nullable: true
type: integer
max_pooled_sessions:
deprecated: true
description: 'Deprecated: pooled browsers now count toward `max_concurrent_sessions`. Requests that set this field are rejected with a 400.'
nullable: true
type: integer
type: object
ProjectLimits:
properties:
max_concurrent_invocations:
description: Maximum concurrent app invocations for this project. Null means no project-level cap.
example: 20
nullable: true
type: integer
max_concurrent_sessions:
description: Maximum concurrent browsers for this project, covering both on-demand sessions (`browsers.create()`) and browser pool reservations. Null means no project-level cap.
example: 10
nullable: true
type: integer
max_pooled_sessions:
deprecated: true
description: 'Deprecated: pooled browsers now count toward `max_concurrent_sessions`. Always null.'
example: 50
nullable: true
type: integer
type: object
CreateProjectRequest:
properties:
name:
description: Project name (1-255 Unicode code points; cannot contain `/` or `%`)
example: staging
maxLength: 255
minLength: 1
type: string
required:
- name
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
Project:
properties:
created_at:
description: When the project was created
format: date-time
type: string
id:
description: Unique project identifier
example: proj_abc123
type: string
name:
description: Project name
example: production
type: string
status:
description: Project status
enum:
- active
- archived
example: active
type: string
updated_at:
description: When the project was last updated
format: date-time
type: string
required:
- id
- name
- status
- created_at
- updated_at
type: object
UpdateProjectRequest:
properties:
name:
description: New project name (1-255 Unicode code points; cannot contain `/` or `%`)
maxLength: 255
minLength: 1
type: string
status:
description: New project status
enum:
- active
- archived
type: string
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)