diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 2e38a297..febc17a4 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.49.0"
+ ".": "0.50.0"
}
diff --git a/.stats.yml b/.stats.yml
index ad1b0f25..bed10345 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 111
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-49a1a92e00d1eb87e91e8527275cb0705fce2edea30e70fea745f134dd451fbd.yml
-openapi_spec_hash: 0ffef6a95f9d9b1096180fc5e4c5b39c
-config_hash: 9818dd634f87b677410eefd013d7a179
+configured_endpoints: 112
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-686a9addd4f9356ca26ff3ff04e1a11466d77a412859829075566394922b715d.yml
+openapi_spec_hash: 7a9e9c2023400d44bcbfb87b7ec07708
+config_hash: 08d55086449943a8fec212b870061a3f
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fd3c6a8d..46dd9b84 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,24 @@
# Changelog
+## 0.50.0 (2026-04-20)
+
+Full Changelog: [v0.49.0...v0.50.0](https://github.com/kernel/kernel-node-sdk/compare/v0.49.0...v0.50.0)
+
+### Features
+
+* add POST /browsers/{id}/curl and /curl/raw endpoints ([e60b999](https://github.com/kernel/kernel-node-sdk/commit/e60b999ed881b76a29ba949e691af35793b0e694))
+* remove paid plan gating from project endpoints ([deee93a](https://github.com/kernel/kernel-node-sdk/commit/deee93a6df11b6c0849a24dd888781678bb8379c))
+
+
+### Bug Fixes
+
+* include MFA and sign-in options in CUA SSO-only step response ([516f87b](https://github.com/kernel/kernel-node-sdk/commit/516f87b537e0b84fb5559bfea1c40221003694ec))
+
+
+### Chores
+
+* **internal:** codegen related update ([591019f](https://github.com/kernel/kernel-node-sdk/commit/591019fd1f305d69dd5641fe6c1de39a796e3d94))
+
## 0.49.0 (2026-04-10)
Full Changelog: [v0.48.0...v0.49.0](https://github.com/kernel/kernel-node-sdk/compare/v0.48.0...v0.49.0)
diff --git a/api.md b/api.md
index 4f2faea0..ba877c96 100644
--- a/api.md
+++ b/api.md
@@ -74,6 +74,7 @@ Types:
- BrowserRetrieveResponse
- BrowserUpdateResponse
- BrowserListResponse
+- BrowserCurlResponse
Methods:
@@ -82,6 +83,7 @@ Methods:
- client.browsers.update(id, { ...params }) -> BrowserUpdateResponse
- client.browsers.list({ ...params }) -> BrowserListResponsesOffsetPagination
- client.browsers.delete({ ...params }) -> void
+- client.browsers.curl(id, { ...params }) -> BrowserCurlResponse
- client.browsers.deleteByID(id) -> void
- client.browsers.loadExtensions(id, { ...params }) -> void
diff --git a/package-lock.json b/package-lock.json
index 0b03c70e..a012986d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@onkernel/sdk",
- "version": "0.49.0",
+ "version": "0.50.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@onkernel/sdk",
- "version": "0.49.0",
+ "version": "0.50.0",
"license": "Apache-2.0",
"devDependencies": {
"@arethetypeswrong/cli": "^0.17.0",
diff --git a/package.json b/package.json
index 08d49845..7eabcc83 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@onkernel/sdk",
- "version": "0.49.0",
+ "version": "0.50.0",
"description": "The official TypeScript library for the Kernel API",
"author": "Kernel <>",
"types": "dist/index.d.ts",
diff --git a/src/client.ts b/src/client.ts
index dc9e5ced..7a00e5e5 100644
--- a/src/client.ts
+++ b/src/client.ts
@@ -103,6 +103,8 @@ import { Auth } from './resources/auth/auth';
import {
BrowserCreateParams,
BrowserCreateResponse,
+ BrowserCurlParams,
+ BrowserCurlResponse,
BrowserDeleteParams,
BrowserListParams,
BrowserListResponse,
@@ -1013,12 +1015,14 @@ export declare namespace Kernel {
type BrowserRetrieveResponse as BrowserRetrieveResponse,
type BrowserUpdateResponse as BrowserUpdateResponse,
type BrowserListResponse as BrowserListResponse,
+ type BrowserCurlResponse as BrowserCurlResponse,
type BrowserListResponsesOffsetPagination as BrowserListResponsesOffsetPagination,
type BrowserCreateParams as BrowserCreateParams,
type BrowserRetrieveParams as BrowserRetrieveParams,
type BrowserUpdateParams as BrowserUpdateParams,
type BrowserListParams as BrowserListParams,
type BrowserDeleteParams as BrowserDeleteParams,
+ type BrowserCurlParams as BrowserCurlParams,
type BrowserLoadExtensionsParams as BrowserLoadExtensionsParams,
};
diff --git a/src/resources/auth/connections.ts b/src/resources/auth/connections.ts
index 09ffe71e..852cd6b4 100644
--- a/src/resources/auth/connections.ts
+++ b/src/resources/auth/connections.ts
@@ -433,6 +433,12 @@ export namespace ManagedAuth {
*/
type: 'text' | 'email' | 'password' | 'tel' | 'number' | 'url' | 'code' | 'totp';
+ /**
+ * Contextual help text near the field that tells the user what to enter (e.g.,
+ * "Enter the phone ending in (**_) _**-\*\*92")
+ */
+ hint?: string;
+
/**
* If this field is associated with an MFA option, the type of that option (e.g.,
* password field linked to "Enter password" option)
@@ -890,6 +896,12 @@ export namespace ConnectionFollowResponse {
*/
type: 'text' | 'email' | 'password' | 'tel' | 'number' | 'url' | 'code' | 'totp';
+ /**
+ * Contextual help text near the field that tells the user what to enter (e.g.,
+ * "Enter the phone ending in (**_) _**-\*\*92")
+ */
+ hint?: string;
+
/**
* If this field is associated with an MFA option, the type of that option (e.g.,
* password field linked to "Enter password" option)
diff --git a/src/resources/browsers/browsers.ts b/src/resources/browsers/browsers.ts
index c4a910eb..61873f31 100644
--- a/src/resources/browsers/browsers.ts
+++ b/src/resources/browsers/browsers.ts
@@ -168,6 +168,22 @@ export class Browsers extends APIResource {
});
}
+ /**
+ * Sends an HTTP request through Chrome's HTTP request stack, inheriting the
+ * browser's TLS fingerprint, cookies, proxy configuration, and headers. Returns a
+ * structured JSON response with status, headers, body, and timing.
+ *
+ * @example
+ * ```ts
+ * const response = await client.browsers.curl('id', {
+ * url: 'url',
+ * });
+ * ```
+ */
+ curl(id: string, body: BrowserCurlParams, options?: RequestOptions): APIPromise {
+ return this._client.post(path`/browsers/${id}/curl`, { body, ...options });
+ }
+
/**
* Delete a browser session by ID
*
@@ -706,6 +722,31 @@ export interface BrowserListResponse {
viewport?: Shared.BrowserViewport;
}
+/**
+ * Structured response from the browser curl request.
+ */
+export interface BrowserCurlResponse {
+ /**
+ * Response body (UTF-8 string or base64 depending on request).
+ */
+ body: string;
+
+ /**
+ * Total request duration in milliseconds.
+ */
+ duration_ms: number;
+
+ /**
+ * Response headers (multi-value).
+ */
+ headers: { [key: string]: Array };
+
+ /**
+ * HTTP status code from target.
+ */
+ status: number;
+}
+
export interface BrowserCreateParams {
/**
* List of browser extensions to load into the session. Provide each by id or name.
@@ -859,6 +900,38 @@ export interface BrowserDeleteParams {
persistent_id: string;
}
+export interface BrowserCurlParams {
+ /**
+ * Target URL (must be http or https).
+ */
+ url: string;
+
+ /**
+ * Request body (for POST/PUT/PATCH).
+ */
+ body?: string;
+
+ /**
+ * Custom headers merged with browser defaults.
+ */
+ headers?: { [key: string]: string };
+
+ /**
+ * HTTP method.
+ */
+ method?: 'GET' | 'HEAD' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS';
+
+ /**
+ * Encoding for the response body. Use base64 for binary content.
+ */
+ response_encoding?: 'utf8' | 'base64';
+
+ /**
+ * Request timeout in milliseconds.
+ */
+ timeout_ms?: number;
+}
+
export interface BrowserLoadExtensionsParams {
/**
* List of extensions to upload and activate
@@ -898,12 +971,14 @@ export declare namespace Browsers {
type BrowserRetrieveResponse as BrowserRetrieveResponse,
type BrowserUpdateResponse as BrowserUpdateResponse,
type BrowserListResponse as BrowserListResponse,
+ type BrowserCurlResponse as BrowserCurlResponse,
type BrowserListResponsesOffsetPagination as BrowserListResponsesOffsetPagination,
type BrowserCreateParams as BrowserCreateParams,
type BrowserRetrieveParams as BrowserRetrieveParams,
type BrowserUpdateParams as BrowserUpdateParams,
type BrowserListParams as BrowserListParams,
type BrowserDeleteParams as BrowserDeleteParams,
+ type BrowserCurlParams as BrowserCurlParams,
type BrowserLoadExtensionsParams as BrowserLoadExtensionsParams,
};
diff --git a/src/resources/browsers/index.ts b/src/resources/browsers/index.ts
index 4af2fb19..e38f0732 100644
--- a/src/resources/browsers/index.ts
+++ b/src/resources/browsers/index.ts
@@ -10,11 +10,13 @@ export {
type BrowserRetrieveResponse,
type BrowserUpdateResponse,
type BrowserListResponse,
+ type BrowserCurlResponse,
type BrowserCreateParams,
type BrowserRetrieveParams,
type BrowserUpdateParams,
type BrowserListParams,
type BrowserDeleteParams,
+ type BrowserCurlParams,
type BrowserLoadExtensionsParams,
type ProfilesOffsetPagination,
type BrowserListResponsesOffsetPagination,
diff --git a/src/resources/index.ts b/src/resources/index.ts
index 312dbe0f..789de808 100644
--- a/src/resources/index.ts
+++ b/src/resources/index.ts
@@ -29,11 +29,13 @@ export {
type BrowserRetrieveResponse,
type BrowserUpdateResponse,
type BrowserListResponse,
+ type BrowserCurlResponse,
type BrowserCreateParams,
type BrowserRetrieveParams,
type BrowserUpdateParams,
type BrowserListParams,
type BrowserDeleteParams,
+ type BrowserCurlParams,
type BrowserLoadExtensionsParams,
type ProfilesOffsetPagination,
type BrowserListResponsesOffsetPagination,
diff --git a/src/resources/projects/projects.ts b/src/resources/projects/projects.ts
index 142531fa..b2d1219c 100644
--- a/src/resources/projects/projects.ts
+++ b/src/resources/projects/projects.ts
@@ -16,8 +16,8 @@ export class Projects extends APIResource {
limits: LimitsAPI.Limits = new LimitsAPI.Limits(this._client);
/**
- * Create a new project within the authenticated organization. Requires a paid plan
- * and the projects feature flag.
+ * Create a new project within the authenticated organization. Requires the
+ * projects feature flag.
*
* @example
* ```ts
diff --git a/src/version.ts b/src/version.ts
index b3df7b0e..049e29ec 100644
--- a/src/version.ts
+++ b/src/version.ts
@@ -1 +1 @@
-export const VERSION = '0.49.0'; // x-release-please-version
+export const VERSION = '0.50.0'; // x-release-please-version
diff --git a/tests/api-resources/browsers/browsers.test.ts b/tests/api-resources/browsers/browsers.test.ts
index e4f99975..0c2f5740 100644
--- a/tests/api-resources/browsers/browsers.test.ts
+++ b/tests/api-resources/browsers/browsers.test.ts
@@ -133,6 +133,30 @@ describe('resource browsers', () => {
const response = await client.browsers.delete({ persistent_id: 'persistent_id' });
});
+ // Mock server tests are disabled
+ test.skip('curl: only required params', async () => {
+ const responsePromise = client.browsers.curl('id', { url: 'url' });
+ const rawResponse = await responsePromise.asResponse();
+ expect(rawResponse).toBeInstanceOf(Response);
+ const response = await responsePromise;
+ expect(response).not.toBeInstanceOf(Response);
+ const dataAndResponse = await responsePromise.withResponse();
+ expect(dataAndResponse.data).toBe(response);
+ expect(dataAndResponse.response).toBe(rawResponse);
+ });
+
+ // Mock server tests are disabled
+ test.skip('curl: required and optional params', async () => {
+ const response = await client.browsers.curl('id', {
+ url: 'url',
+ body: 'body',
+ headers: { foo: 'string' },
+ method: 'GET',
+ response_encoding: 'utf8',
+ timeout_ms: 1000,
+ });
+ });
+
// Mock server tests are disabled
test.skip('deleteByID', async () => {
const responsePromise = client.browsers.deleteByID('htzv5orfit78e1m2biiifpbv');
diff --git a/yarn.lock b/yarn.lock
index e5e2a93b..f6eae3cd 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1220,9 +1220,9 @@ baseline-browser-mapping@^2.9.0:
integrity sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==
brace-expansion@^2.0.2:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.3.tgz#0493338bdd58e319b1039c67cf7ee439892c01d9"
- integrity sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.0.tgz#4f41a41190216ee36067ec381526fe9539c4f0ae"
+ integrity sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==
dependencies:
balanced-match "^1.0.0"