diff --git a/.stats.yml b/.stats.yml
index 38c95a8..8cc2311 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
 configured_endpoints: 18
 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase%2Fbrowserbase-e2ed1b5267eeff92982918505349017b9155da2c7ab948787ab11cf9068af1b8.yml
 openapi_spec_hash: 6639c21dccb52ca610cae833227a9791
-config_hash: 74882e23a455dece33e43a27e67f0fbb
+config_hash: b3ca4ec5b02e5333af51ebc2e9fdef1b
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 45a7298..5f8bfea 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -17,8 +17,7 @@ $ rye sync --all-features
 You can then run scripts using `rye run python script.py` or by activating the virtual environment:
 
 ```sh
-$ rye shell
-# or manually activate - https://docs.python.org/3/library/venv.html#how-venvs-work
+# Activate the virtual environment - https://docs.python.org/3/library/venv.html#how-venvs-work
 $ source .venv/bin/activate
 
 # now you can omit the `rye run` prefix
diff --git a/README.md b/README.md
index 43a407e..b41772b 100644
--- a/README.md
+++ b/README.md
@@ -101,37 +101,7 @@ client = Browserbase()
 
 session = client.sessions.create(
     project_id="projectId",
-    browser_settings={
-        "advanced_stealth": True,
-        "block_ads": True,
-        "captcha_image_selector": "captchaImageSelector",
-        "captcha_input_selector": "captchaInputSelector",
-        "context": {
-            "id": "id",
-            "persist": True,
-        },
-        "extension_id": "extensionId",
-        "fingerprint": {
-            "browsers": ["chrome"],
-            "devices": ["desktop"],
-            "http_version": "1",
-            "locales": ["string"],
-            "operating_systems": ["android"],
-            "screen": {
-                "max_height": 0,
-                "max_width": 0,
-                "min_height": 0,
-                "min_width": 0,
-            },
-        },
-        "log_session": True,
-        "record_session": True,
-        "solve_captchas": True,
-        "viewport": {
-            "height": 0,
-            "width": 0,
-        },
-    },
+    browser_settings={},
 )
 print(session.browser_settings)
 ```
diff --git a/SECURITY.md b/SECURITY.md
index e10eb19..ad64e4b 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -16,11 +16,11 @@ before making any information public.
 ## Reporting Non-SDK Related Security Issues
 
 If you encounter security issues that are not directly related to SDKs but pertain to the services
-or products provided by Browserbase please follow the respective company's security reporting guidelines.
+or products provided by Browserbase, please follow the respective company's security reporting guidelines.
 
 ### Browserbase Terms and Policies
 
-Please contact support@browserbase.com for any questions or concerns regarding security of our services.
+Please contact support@browserbase.com for any questions or concerns regarding the security of our services.
 
 ---
 
diff --git a/src/browserbase/_base_client.py b/src/browserbase/_base_client.py
index 82e76c9..587ec4d 100644
--- a/src/browserbase/_base_client.py
+++ b/src/browserbase/_base_client.py
@@ -960,6 +960,9 @@ def request(
             if self.custom_auth is not None:
                 kwargs["auth"] = self.custom_auth
 
+            if options.follow_redirects is not None:
+                kwargs["follow_redirects"] = options.follow_redirects
+
             log.debug("Sending HTTP Request: %s %s", request.method, request.url)
 
             response = None
@@ -1460,6 +1463,9 @@ async def request(
             if self.custom_auth is not None:
                 kwargs["auth"] = self.custom_auth
 
+            if options.follow_redirects is not None:
+                kwargs["follow_redirects"] = options.follow_redirects
+
             log.debug("Sending HTTP Request: %s %s", request.method, request.url)
 
             response = None
diff --git a/src/browserbase/_models.py b/src/browserbase/_models.py
index 798956f..4f21498 100644
--- a/src/browserbase/_models.py
+++ b/src/browserbase/_models.py
@@ -737,6 +737,7 @@ class FinalRequestOptionsInput(TypedDict, total=False):
     idempotency_key: str
     json_data: Body
     extra_json: AnyMapping
+    follow_redirects: bool
 
 
 @final
@@ -750,6 +751,7 @@ class FinalRequestOptions(pydantic.BaseModel):
     files: Union[HttpxRequestFiles, None] = None
     idempotency_key: Union[str, None] = None
     post_parser: Union[Callable[[Any], Any], NotGiven] = NotGiven()
+    follow_redirects: Union[bool, None] = None
 
     # It should be noted that we cannot use `json` here as that would override
     # a BaseModel method in an incompatible fashion.
diff --git a/src/browserbase/_types.py b/src/browserbase/_types.py
index a8833dc..b07c0e1 100644
--- a/src/browserbase/_types.py
+++ b/src/browserbase/_types.py
@@ -100,6 +100,7 @@ class RequestOptions(TypedDict, total=False):
     params: Query
     extra_json: AnyMapping
     idempotency_key: str
+    follow_redirects: bool
 
 
 # Sentinel class used until PEP 0661 is accepted
@@ -215,3 +216,4 @@ class _GenericAlias(Protocol):
 
 class HttpxSendArgs(TypedDict, total=False):
     auth: httpx.Auth
+    follow_redirects: bool
diff --git a/tests/test_client.py b/tests/test_client.py
index d03654d..69ff3ba 100644
--- a/tests/test_client.py
+++ b/tests/test_client.py
@@ -832,6 +832,33 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
 
         assert response.http_request.headers.get("x-stainless-retry-count") == "42"
 
+    @pytest.mark.respx(base_url=base_url)
+    def test_follow_redirects(self, respx_mock: MockRouter) -> None:
+        # Test that the default follow_redirects=True allows following redirects
+        respx_mock.post("/redirect").mock(
+            return_value=httpx.Response(302, headers={"Location": f"{base_url}/redirected"})
+        )
+        respx_mock.get("/redirected").mock(return_value=httpx.Response(200, json={"status": "ok"}))
+
+        response = self.client.post("/redirect", body={"key": "value"}, cast_to=httpx.Response)
+        assert response.status_code == 200
+        assert response.json() == {"status": "ok"}
+
+    @pytest.mark.respx(base_url=base_url)
+    def test_follow_redirects_disabled(self, respx_mock: MockRouter) -> None:
+        # Test that follow_redirects=False prevents following redirects
+        respx_mock.post("/redirect").mock(
+            return_value=httpx.Response(302, headers={"Location": f"{base_url}/redirected"})
+        )
+
+        with pytest.raises(APIStatusError) as exc_info:
+            self.client.post(
+                "/redirect", body={"key": "value"}, options={"follow_redirects": False}, cast_to=httpx.Response
+            )
+
+        assert exc_info.value.response.status_code == 302
+        assert exc_info.value.response.headers["Location"] == f"{base_url}/redirected"
+
 
 class TestAsyncBrowserbase:
     client = AsyncBrowserbase(base_url=base_url, api_key=api_key, _strict_response_validation=True)
@@ -1659,3 +1686,30 @@ async def test_main() -> None:
                     raise AssertionError("calling get_platform using asyncify resulted in a hung process")
 
                 time.sleep(0.1)
+
+    @pytest.mark.respx(base_url=base_url)
+    async def test_follow_redirects(self, respx_mock: MockRouter) -> None:
+        # Test that the default follow_redirects=True allows following redirects
+        respx_mock.post("/redirect").mock(
+            return_value=httpx.Response(302, headers={"Location": f"{base_url}/redirected"})
+        )
+        respx_mock.get("/redirected").mock(return_value=httpx.Response(200, json={"status": "ok"}))
+
+        response = await self.client.post("/redirect", body={"key": "value"}, cast_to=httpx.Response)
+        assert response.status_code == 200
+        assert response.json() == {"status": "ok"}
+
+    @pytest.mark.respx(base_url=base_url)
+    async def test_follow_redirects_disabled(self, respx_mock: MockRouter) -> None:
+        # Test that follow_redirects=False prevents following redirects
+        respx_mock.post("/redirect").mock(
+            return_value=httpx.Response(302, headers={"Location": f"{base_url}/redirected"})
+        )
+
+        with pytest.raises(APIStatusError) as exc_info:
+            await self.client.post(
+                "/redirect", body={"key": "value"}, options={"follow_redirects": False}, cast_to=httpx.Response
+            )
+
+        assert exc_info.value.response.status_code == 302
+        assert exc_info.value.response.headers["Location"] == f"{base_url}/redirected"
