diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 2afb750..2fbefb9 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.57.0"
+ ".": "0.58.0"
}
\ No newline at end of file
diff --git a/.stats.yml b/.stats.yml
index 6f5d31f..dbf097f 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 112
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-5d96fec7a84722f300bd99db7352d6284141826f3412f6d370ac0926edf03d42.yml
-openapi_spec_hash: d4e1a29ac06f9543e0ef69372eb3ff35
-config_hash: ae3dea7997fb5d36fa41979f9585ed78
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-a0ad160eb0fb11e201e240de8487c12992a474076aeed1c1167ee54ade43edfb.yml
+openapi_spec_hash: 84a7075fddbe17b1446a759e8cc39047
+config_hash: 26beac3050665664d5d74d2bbfe9e808
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9649399..f09863e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## 0.58.0 (2026-05-24)
+
+Full Changelog: [v0.57.0...v0.58.0](https://github.com/kernel/kernel-python-sdk/compare/v0.57.0...v0.58.0)
+
+### Features
+
+* api: dual-route /projects under /org/projects, deprecate /projects ([c5f21ec](https://github.com/kernel/kernel-python-sdk/commit/c5f21ecf3e1081c774ba58ad32b10e8cd5b0a94a))
+
## 0.57.0 (2026-05-22)
Full Changelog: [v0.56.0...v0.57.0](https://github.com/kernel/kernel-python-sdk/compare/v0.56.0...v0.57.0)
diff --git a/api.md b/api.md
index b652f86..4785c2d 100644
--- a/api.md
+++ b/api.md
@@ -395,11 +395,11 @@ from kernel.types import CreateProjectRequest, Project, UpdateProjectRequest
Methods:
-- client.projects.create(\*\*params) -> Project
-- client.projects.retrieve(id) -> Project
-- client.projects.update(id, \*\*params) -> Project
-- client.projects.list(\*\*params) -> SyncOffsetPagination[Project]
-- client.projects.delete(id) -> None
+- client.projects.create(\*\*params) -> Project
+- client.projects.retrieve(id) -> Project
+- client.projects.update(id, \*\*params) -> Project
+- client.projects.list(\*\*params) -> SyncOffsetPagination[Project]
+- client.projects.delete(id) -> None
## Limits
@@ -411,8 +411,8 @@ from kernel.types.projects import ProjectLimits, UpdateProjectLimitsRequest
Methods:
-- client.projects.limits.retrieve(id) -> ProjectLimits
-- client.projects.limits.update(id, \*\*params) -> ProjectLimits
+- client.projects.limits.retrieve(id) -> ProjectLimits
+- client.projects.limits.update(id, \*\*params) -> ProjectLimits
# CredentialProviders
diff --git a/pyproject.toml b/pyproject.toml
index 6956b28..3ff0ba8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "kernel"
-version = "0.57.0"
+version = "0.58.0"
description = "The official Python library for the kernel API"
dynamic = ["readme"]
license = "Apache-2.0"
diff --git a/src/kernel/_version.py b/src/kernel/_version.py
index fb252c5..9422de8 100644
--- a/src/kernel/_version.py
+++ b/src/kernel/_version.py
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
__title__ = "kernel"
-__version__ = "0.57.0" # x-release-please-version
+__version__ = "0.58.0" # x-release-please-version
diff --git a/src/kernel/resources/projects/limits.py b/src/kernel/resources/projects/limits.py
index 04ac314..ade9302 100644
--- a/src/kernel/resources/projects/limits.py
+++ b/src/kernel/resources/projects/limits.py
@@ -73,7 +73,7 @@ def retrieve(
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return self._get(
- path_template("/projects/{id}/limits", id=id),
+ path_template("/org/projects/{id}/limits", id=id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -121,7 +121,7 @@ def update(
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return self._patch(
- path_template("/projects/{id}/limits", id=id),
+ path_template("/org/projects/{id}/limits", id=id),
body=maybe_transform(
{
"max_concurrent_invocations": max_concurrent_invocations,
@@ -187,7 +187,7 @@ async def retrieve(
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return await self._get(
- path_template("/projects/{id}/limits", id=id),
+ path_template("/org/projects/{id}/limits", id=id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -235,7 +235,7 @@ async def update(
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return await self._patch(
- path_template("/projects/{id}/limits", id=id),
+ path_template("/org/projects/{id}/limits", id=id),
body=await async_maybe_transform(
{
"max_concurrent_invocations": max_concurrent_invocations,
diff --git a/src/kernel/resources/projects/projects.py b/src/kernel/resources/projects/projects.py
index 87fae1b..ea97768 100644
--- a/src/kernel/resources/projects/projects.py
+++ b/src/kernel/resources/projects/projects.py
@@ -85,7 +85,7 @@ def create(
timeout: Override the client-level default timeout for this request, in seconds
"""
return self._post(
- "/projects",
+ "/org/projects",
body=maybe_transform({"name": name}, project_create_params.ProjectCreateParams),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
@@ -119,7 +119,7 @@ def retrieve(
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return self._get(
- path_template("/projects/{id}", id=id),
+ path_template("/org/projects/{id}", id=id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -158,7 +158,7 @@ def update(
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return self._patch(
- path_template("/projects/{id}", id=id),
+ path_template("/org/projects/{id}", id=id),
body=maybe_transform(
{
"name": name,
@@ -204,7 +204,7 @@ def list(
timeout: Override the client-level default timeout for this request, in seconds
"""
return self._get_api_list(
- "/projects",
+ "/org/projects",
page=SyncOffsetPagination[Project],
options=make_request_options(
extra_headers=extra_headers,
@@ -251,7 +251,7 @@ def delete(
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
extra_headers = {"Accept": "*/*", **(extra_headers or {})}
return self._delete(
- path_template("/projects/{id}", id=id),
+ path_template("/org/projects/{id}", id=id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -312,7 +312,7 @@ async def create(
timeout: Override the client-level default timeout for this request, in seconds
"""
return await self._post(
- "/projects",
+ "/org/projects",
body=await async_maybe_transform({"name": name}, project_create_params.ProjectCreateParams),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
@@ -346,7 +346,7 @@ async def retrieve(
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return await self._get(
- path_template("/projects/{id}", id=id),
+ path_template("/org/projects/{id}", id=id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -385,7 +385,7 @@ async def update(
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return await self._patch(
- path_template("/projects/{id}", id=id),
+ path_template("/org/projects/{id}", id=id),
body=await async_maybe_transform(
{
"name": name,
@@ -431,7 +431,7 @@ def list(
timeout: Override the client-level default timeout for this request, in seconds
"""
return self._get_api_list(
- "/projects",
+ "/org/projects",
page=AsyncOffsetPagination[Project],
options=make_request_options(
extra_headers=extra_headers,
@@ -478,7 +478,7 @@ async def delete(
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
extra_headers = {"Accept": "*/*", **(extra_headers or {})}
return await self._delete(
- path_template("/projects/{id}", id=id),
+ path_template("/org/projects/{id}", id=id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),