From f8e124e14c4c41983b5305d2ad1cbbece9984d67 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 8 Jul 2026 20:45:25 +0000
Subject: [PATCH 1/5] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index b4d46dd..2337b13 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 36
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/browserbase-e82c289d3d3aabd936a476cf81630587ffe46ab9e9bdebced4b31b8c2f9bc08f.yml
-openapi_spec_hash: 473121b283812a3dfd866afe9b61dc7d
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/browserbase-a4908a77d1ee379f0f3e36f2d2941f074e7ecbce0392d6f9c0c4f089cbb96244.yml
+openapi_spec_hash: d010b0015cd09212d7440a8ad90d04e1
config_hash: 1b24ea9fa13645b16b74aa794dbc8190
From 518d4d6b04dfe3e25540fd8fed4857e84bac8d12 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 14 Jul 2026 00:00:25 +0000
Subject: [PATCH 2/5] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 2337b13..fd010ad 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 36
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/browserbase-a4908a77d1ee379f0f3e36f2d2941f074e7ecbce0392d6f9c0c4f089cbb96244.yml
-openapi_spec_hash: d010b0015cd09212d7440a8ad90d04e1
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/browserbase-e80dfc4671603a503dc62812916b0d467e344106a1c4412ee1442914504fc94d.yml
+openapi_spec_hash: 71dfbc1021a33dd7fc9d82844965b1b3
config_hash: 1b24ea9fa13645b16b74aa794dbc8190
From 036d917c294fb56c387abcb05ea1dc66db1c83f2 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 14 Jul 2026 00:02:09 +0000
Subject: [PATCH 3/5] feat(api): manual updates
---
.stats.yml | 6 +-
api.md | 19 +++++-
src/resources/sessions/index.ts | 2 +-
src/resources/sessions/recording.ts | 38 +----------
src/resources/sessions/recording/downloads.ts | 66 +++++++++++++++++++
src/resources/sessions/recording/index.ts | 9 +++
src/resources/sessions/recording/recording.ts | 52 +++++++++++++++
src/resources/sessions/sessions.ts | 4 +-
.../sessions/recording/downloads.test.ts | 53 +++++++++++++++
.../{ => recording}/recording.test.ts | 0
10 files changed, 203 insertions(+), 46 deletions(-)
create mode 100644 src/resources/sessions/recording/downloads.ts
create mode 100644 src/resources/sessions/recording/index.ts
create mode 100644 src/resources/sessions/recording/recording.ts
create mode 100644 tests/api-resources/sessions/recording/downloads.test.ts
rename tests/api-resources/sessions/{ => recording}/recording.test.ts (100%)
diff --git a/.stats.yml b/.stats.yml
index fd010ad..1ac83c1 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 36
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/browserbase-e80dfc4671603a503dc62812916b0d467e344106a1c4412ee1442914504fc94d.yml
+configured_endpoints: 38
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/browserbase-98cc68ad9afa71355baf2b31f305a5e2f3a315fd311c96659405eff96b8f2b1e.yml
openapi_spec_hash: 71dfbc1021a33dd7fc9d82844965b1b3
-config_hash: 1b24ea9fa13645b16b74aa794dbc8190
+config_hash: 6209a285dd5980f5c418fe6575723aef
diff --git a/api.md b/api.md
index bd75c9d..0d7919e 100644
--- a/api.md
+++ b/api.md
@@ -112,12 +112,25 @@ Methods:
Types:
-- SessionRecording
-- RecordingRetrieveResponse
+- SessionRecording
+- RecordingRetrieveResponse
Methods:
-- client.sessions.recording.retrieve(id) -> RecordingRetrieveResponse
+- client.sessions.recording.retrieve(id) -> RecordingRetrieveResponse
+
+### Downloads
+
+Types:
+
+- RecordingDownload
+- DownloadCreateResponse
+- DownloadListResponse
+
+Methods:
+
+- client.sessions.recording.downloads.create(id) -> DownloadCreateResponse
+- client.sessions.recording.downloads.list(id) -> DownloadListResponse
## Uploads
diff --git a/src/resources/sessions/index.ts b/src/resources/sessions/index.ts
index b3c2a80..83b9c59 100644
--- a/src/resources/sessions/index.ts
+++ b/src/resources/sessions/index.ts
@@ -2,7 +2,7 @@
export { Downloads } from './downloads';
export { Logs, type SessionLog, type LogListResponse } from './logs';
-export { Recording, type SessionRecording, type RecordingRetrieveResponse } from './recording';
+export { Recording, type SessionRecording, type RecordingRetrieveResponse } from './recording/index';
export { Replays, type ReplayRetrieveResponse } from './replays';
export {
Sessions,
diff --git a/src/resources/sessions/recording.ts b/src/resources/sessions/recording.ts
index 62f91ca..5943a71 100644
--- a/src/resources/sessions/recording.ts
+++ b/src/resources/sessions/recording.ts
@@ -1,39 +1,3 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-import { APIResource } from '../../resource';
-import * as Core from '../../core';
-
-export class Recording extends APIResource {
- /**
- * Session Recording
- */
- retrieve(id: string, options?: Core.RequestOptions): Core.APIPromise {
- return this._client.get(`/v1/sessions/${id}/recording`, options);
- }
-}
-
-export interface SessionRecording {
- /**
- * See
- * [rrweb documentation](https://github.com/rrweb-io/rrweb/blob/master/docs/recipes/dive-into-event.md).
- */
- data: { [key: string]: unknown };
-
- sessionId: string;
-
- /**
- * milliseconds that have elapsed since the UNIX epoch
- */
- timestamp: number;
-
- type: number;
-}
-
-export type RecordingRetrieveResponse = Array;
-
-export declare namespace Recording {
- export {
- type SessionRecording as SessionRecording,
- type RecordingRetrieveResponse as RecordingRetrieveResponse,
- };
-}
+export * from './recording/index';
diff --git a/src/resources/sessions/recording/downloads.ts b/src/resources/sessions/recording/downloads.ts
new file mode 100644
index 0000000..b4dd834
--- /dev/null
+++ b/src/resources/sessions/recording/downloads.ts
@@ -0,0 +1,66 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+import { APIResource } from '../../../resource';
+import * as Core from '../../../core';
+
+export class Downloads extends APIResource {
+ /**
+ * Requests one downloadable MP4 per recorded page of a session. Assembly runs
+ * asynchronously and every page returns as `PENDING`. Re-posting re-enqueues all
+ * pages and retries any that failed. Poll the GET endpoint for per-page status
+ * and, on standard (non-BYOS) projects, download URLs.
+ */
+ create(id: string, options?: Core.RequestOptions): Core.APIPromise {
+ return this._client.post(`/v1/sessions/${id}/recording/downloads`, options);
+ }
+
+ /**
+ * Returns the per-page download status for a session, with a short-lived signed
+ * URL for each completed page on standard (non-BYOS) projects.
+ */
+ list(id: string, options?: Core.RequestOptions): Core.APIPromise {
+ return this._client.get(`/v1/sessions/${id}/recording/downloads`, options);
+ }
+}
+
+export interface RecordingDownload {
+ /**
+ * Recorded page (tab) within the session, e.g. "0", "1".
+ */
+ pageId: string;
+
+ /**
+ * Per-page MP4 assembly state. `NOT_REQUESTED`: no download has been requested for
+ * the session yet. `PENDING`: assembly is enqueued or in progress. `COMPLETED`:
+ * the MP4 is ready. `FAILED`: assembly failed; POST again to retry.
+ */
+ status: 'NOT_REQUESTED' | 'PENDING' | 'COMPLETED' | 'FAILED';
+
+ /**
+ * When the MP4 was created. Present only when COMPLETED on a standard (non-BYOS)
+ * project.
+ */
+ completedAt?: string;
+
+ /**
+ * Short-lived signed CDN URL, re-minted each GET. Present only when COMPLETED on a
+ * standard (non-BYOS) project.
+ */
+ downloadUrl?: string;
+}
+
+export interface DownloadCreateResponse {
+ downloads: Array;
+}
+
+export interface DownloadListResponse {
+ downloads: Array;
+}
+
+export declare namespace Downloads {
+ export {
+ type RecordingDownload as RecordingDownload,
+ type DownloadCreateResponse as DownloadCreateResponse,
+ type DownloadListResponse as DownloadListResponse,
+ };
+}
diff --git a/src/resources/sessions/recording/index.ts b/src/resources/sessions/recording/index.ts
new file mode 100644
index 0000000..cfb53d4
--- /dev/null
+++ b/src/resources/sessions/recording/index.ts
@@ -0,0 +1,9 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+export {
+ Downloads,
+ type RecordingDownload,
+ type DownloadCreateResponse,
+ type DownloadListResponse,
+} from './downloads';
+export { Recording, type SessionRecording, type RecordingRetrieveResponse } from './recording';
diff --git a/src/resources/sessions/recording/recording.ts b/src/resources/sessions/recording/recording.ts
new file mode 100644
index 0000000..cb5dde2
--- /dev/null
+++ b/src/resources/sessions/recording/recording.ts
@@ -0,0 +1,52 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+import { APIResource } from '../../../resource';
+import * as Core from '../../../core';
+import * as DownloadsAPI from './downloads';
+import { DownloadCreateResponse, DownloadListResponse, Downloads, RecordingDownload } from './downloads';
+
+export class Recording extends APIResource {
+ downloads: DownloadsAPI.Downloads = new DownloadsAPI.Downloads(this._client);
+
+ /**
+ * Session Recording
+ */
+ retrieve(id: string, options?: Core.RequestOptions): Core.APIPromise {
+ return this._client.get(`/v1/sessions/${id}/recording`, options);
+ }
+}
+
+export interface SessionRecording {
+ /**
+ * See
+ * [rrweb documentation](https://github.com/rrweb-io/rrweb/blob/master/docs/recipes/dive-into-event.md).
+ */
+ data: { [key: string]: unknown };
+
+ sessionId: string;
+
+ /**
+ * milliseconds that have elapsed since the UNIX epoch
+ */
+ timestamp: number;
+
+ type: number;
+}
+
+export type RecordingRetrieveResponse = Array;
+
+Recording.Downloads = Downloads;
+
+export declare namespace Recording {
+ export {
+ type SessionRecording as SessionRecording,
+ type RecordingRetrieveResponse as RecordingRetrieveResponse,
+ };
+
+ export {
+ Downloads as Downloads,
+ type RecordingDownload as RecordingDownload,
+ type DownloadCreateResponse as DownloadCreateResponse,
+ type DownloadListResponse as DownloadListResponse,
+ };
+}
diff --git a/src/resources/sessions/sessions.ts b/src/resources/sessions/sessions.ts
index 64aec7b..3a9e979 100644
--- a/src/resources/sessions/sessions.ts
+++ b/src/resources/sessions/sessions.ts
@@ -7,12 +7,12 @@ import * as DownloadsAPI from './downloads';
import { Downloads } from './downloads';
import * as LogsAPI from './logs';
import { LogListResponse, Logs, SessionLog } from './logs';
-import * as RecordingAPI from './recording';
-import { Recording, RecordingRetrieveResponse, SessionRecording } from './recording';
import * as ReplaysAPI from './replays';
import { ReplayRetrieveResponse, Replays } from './replays';
import * as UploadsAPI from './uploads';
import { UploadCreateParams, UploadCreateResponse, Uploads } from './uploads';
+import * as RecordingAPI from './recording/recording';
+import { Recording, RecordingRetrieveResponse, SessionRecording } from './recording/recording';
export class Sessions extends APIResource {
downloads: DownloadsAPI.Downloads = new DownloadsAPI.Downloads(this._client);
diff --git a/tests/api-resources/sessions/recording/downloads.test.ts b/tests/api-resources/sessions/recording/downloads.test.ts
new file mode 100644
index 0000000..e2120e3
--- /dev/null
+++ b/tests/api-resources/sessions/recording/downloads.test.ts
@@ -0,0 +1,53 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+import Browserbase from '@browserbasehq/sdk';
+import { Response } from 'node-fetch';
+
+const client = new Browserbase({
+ apiKey: 'My API Key',
+ baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010',
+});
+
+describe('resource downloads', () => {
+ test('create', async () => {
+ const responsePromise = client.sessions.recording.downloads.create(
+ '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
+ );
+ 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);
+ });
+
+ test('create: request options instead of params are passed correctly', async () => {
+ // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
+ await expect(
+ client.sessions.recording.downloads.create('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', {
+ path: '/_stainless_unknown_path',
+ }),
+ ).rejects.toThrow(Browserbase.NotFoundError);
+ });
+
+ test('list', async () => {
+ const responsePromise = client.sessions.recording.downloads.list('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e');
+ 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);
+ });
+
+ test('list: request options instead of params are passed correctly', async () => {
+ // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
+ await expect(
+ client.sessions.recording.downloads.list('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e', {
+ path: '/_stainless_unknown_path',
+ }),
+ ).rejects.toThrow(Browserbase.NotFoundError);
+ });
+});
diff --git a/tests/api-resources/sessions/recording.test.ts b/tests/api-resources/sessions/recording/recording.test.ts
similarity index 100%
rename from tests/api-resources/sessions/recording.test.ts
rename to tests/api-resources/sessions/recording/recording.test.ts
From b7e29f535e29912594b30e7b64dc532113919a96 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 14 Jul 2026 00:02:27 +0000
Subject: [PATCH 4/5] release: 2.16.0
---
.release-please-manifest.json | 2 +-
CHANGELOG.md | 8 ++++++++
package-lock.json | 4 ++--
package.json | 2 +-
src/version.ts | 2 +-
5 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 96a8c91..7731f20 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "2.15.0"
+ ".": "2.16.0"
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a8d8d44..90b28d0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## 2.16.0 (2026-07-14)
+
+Full Changelog: [v2.15.0...v2.16.0](https://github.com/browserbase/sdk-node/compare/v2.15.0...v2.16.0)
+
+### Features
+
+* **api:** manual updates ([036d917](https://github.com/browserbase/sdk-node/commit/036d917c294fb56c387abcb05ea1dc66db1c83f2))
+
## 2.15.0 (2026-07-02)
Full Changelog: [v2.14.1...v2.15.0](https://github.com/browserbase/sdk-node/compare/v2.14.1...v2.15.0)
diff --git a/package-lock.json b/package-lock.json
index d5d0060..494fec1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@browserbasehq/sdk",
- "version": "2.15.0",
+ "version": "2.16.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@browserbasehq/sdk",
- "version": "2.15.0",
+ "version": "2.16.0",
"dependencies": {
"@types/node": "^18.11.18",
"@types/node-fetch": "^2.6.4",
diff --git a/package.json b/package.json
index b3d0ff2..7733df7 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@browserbasehq/sdk",
- "version": "2.15.0",
+ "version": "2.16.0",
"description": "The official Node.js library for the Browserbase API",
"author": "Browserbase ",
"license": "Apache-2.0",
diff --git a/src/version.ts b/src/version.ts
index ba989f0..f9cc5c1 100644
--- a/src/version.ts
+++ b/src/version.ts
@@ -1 +1 @@
-export const VERSION = '2.15.0'; // x-release-please-version
+export const VERSION = '2.16.0'; // x-release-please-version
From dca345b82298c7c2450aef454371741fdd929fa4 Mon Sep 17 00:00:00 2001
From: dom
Date: Mon, 13 Jul 2026 17:35:01 -0700
Subject: [PATCH 5/5] fix shim test
---
tests/api-resources/sessions/recording/downloads.test.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/api-resources/sessions/recording/downloads.test.ts b/tests/api-resources/sessions/recording/downloads.test.ts
index e2120e3..988f4c7 100644
--- a/tests/api-resources/sessions/recording/downloads.test.ts
+++ b/tests/api-resources/sessions/recording/downloads.test.ts
@@ -1,7 +1,7 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
import Browserbase from '@browserbasehq/sdk';
-import { Response } from 'node-fetch';
+import { Response } from '@browserbasehq/sdk/_shims/index';
const client = new Browserbase({
apiKey: 'My API Key',