diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,34 @@
+# webdriver-precore-0.3.0.2 (2026-07-24)
+
+## HTTP Spec Update
+
+- Spec reference URL updated from 28 October 2025 Working Draft to 02 July 2026 Working Draft.
+- No API changes — all HTTP endpoints, capabilities, and types remain identical between versions.
+
+## BiDi Spec Update
+
+Updated to [W3C WebDriver BiDi Working Draft of 29 June 2026](https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629/).
+
+### New Commands
+
+- **`browsingContext.setBypassCSP`** — Bypass Content Security Policy restrictions for automated testing.
+  - New types: `SetBypassCSP`, `BypassCSPOverride`
+- **`browsingContext.startScreencast`** / **`browsingContext.stopScreencast`** — Record browser sessions as video files.
+  - New types: `StartScreencast`, `StartScreencastResult`, `StopScreencast`, `StopScreencastResult`, `MediaTrackConstraints`, `Screencast`
+- **`emulation.setScrollbarTypeOverride`** — Override scrollbar appearance for consistent cross-platform testing.
+  - New types: `SetScrollbarTypeOverride`, `ScrollbarType`
+
+### Breaking Changes
+#### Type Changes
+
+- **`SetScriptingEnabled`**: `enabled` field changed from `Maybe Bool` to `ScriptingOverride` for improved type safety (encodes `false` or `null`, not `true`).
+  - New type: `ScriptingOverride` with constructors `ForceDisableScripting` and `RestoreDefaultScripting`.
+
+### Other
+
+- Spec reference URLs and dates updated throughout BiDi source files.
+- CPP flag `BiDiSpecURL` updated to point to 29 June 2026 Working Draft.
+
 # webdriver-precore-0.2.0.1 (2026-01-17)
 
 ## Breaking Changes
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@
 
 ## What is This Library?
 
-This library provides typed definitions for the W3C WebDriver Protocol, supporting both the [HTTP](https://www.w3.org/TR/2025/WD-webdriver2-20251028/) and the [BiDi](https://www.w3.org/TR/2025/WD-webdriver-bidi-20251212/) protocols.
+This library provides typed definitions for the W3C WebDriver Protocol, supporting both the [HTTP](https://www.w3.org/TR/2026/WD-webdriver2-20260702/) and the [BiDi](https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629/) protocols.
 
 This library is intended as a foundation for building WebDriver client implementations. **It is type constructors only**, and does not include any executable client code.
 
diff --git a/src/WebDriverPreCore/BiDi/API.hs b/src/WebDriverPreCore/BiDi/API.hs
--- a/src/WebDriverPreCore/BiDi/API.hs
+++ b/src/WebDriverPreCore/BiDi/API.hs
@@ -27,7 +27,10 @@
     browsingContextNavigate,
     browsingContextPrint,
     browsingContextReload,
+    browsingContextSetBypassCSP,
     browsingContextSetViewport,
+    browsingContextStartScreencast,
+    browsingContextStopScreencast,
     browsingContextTraverseHistory,
 
     -- * Browser Commands
@@ -46,6 +49,7 @@
     emulationSetNetworkConditions,
     emulationSetScreenOrientationOverride,
     emulationSetScreenSettingsOverride,
+    emulationSetScrollbarTypeOverride,
     emulationSetScriptingEnabled,
     emulationSetTimezoneOverride,
     emulationSetTouchOverride,
@@ -192,6 +196,11 @@
     ResponseStarted,
     SessionNewResult,
     SessionStatusResult,
+    SetBypassCSP,
+    StartScreencast,
+    StartScreencastResult,
+    StopScreencast,
+    StopScreencastResult,
     SessionSubscibe (..),
     SessionSubscribeResult (..),
     SessionUnsubscribe (..),
@@ -208,6 +217,7 @@
     SetNetworkConditions,
     SetScreenOrientationOverride,
     SetScreenSettingsOverride,
+    SetScrollbarTypeOverride,
     SetScriptingEnabled,
     SetTimezoneOverride,
     SetTouchOverride,
@@ -332,12 +342,30 @@
 browsingContextReload :: Reload -> Command ()
 browsingContextReload = mkCommand BrowsingContextReload
 
+-- | Specification Entry: <BiDiSpecURL#command-browsingContext-setBypassCSP browsingContext.setBypassCSP>
+--
+-- First added to Spec: <https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629/#command-browsingContext-setBypassCSP 29 June 2026 - Working Draft>
+browsingContextSetBypassCSP :: SetBypassCSP -> Command ()
+browsingContextSetBypassCSP = mkCommand BrowsingContextSetBypassCSP
+
 -- | Specification Entry: <BiDiSpecURL#command-browsingContext-setViewport browsingContext.setViewport>
 --
 -- First added to Spec: <https://www.w3.org/TR/2024/WD-webdriver-bidi-20241121/#command-browsingContext-setViewport 21 November 2024 - First Public Working Draft>
 browsingContextSetViewport :: SetViewport -> Command ()
 browsingContextSetViewport = mkCommand BrowsingContextSetViewport
 
+-- | Specification Entry: <BiDiSpecURL#command-browsingContext-startScreencast browsingContext.startScreencast>
+--
+-- First added to Spec: <https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629/#command-browsingContext-startScreencast 29 June 2026 - Working Draft>
+browsingContextStartScreencast :: StartScreencast -> Command StartScreencastResult
+browsingContextStartScreencast = mkCommand BrowsingContextStartScreencast
+
+-- | Specification Entry: <BiDiSpecURL#command-browsingContext-stopScreencast browsingContext.stopScreencast>
+--
+-- First added to Spec: <https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629/#command-browsingContext-stopScreencast 29 June 2026 - Working Draft>
+browsingContextStopScreencast :: StopScreencast -> Command StopScreencastResult
+browsingContextStopScreencast = mkCommand BrowsingContextStopScreencast
+
 -- | Specification Entry: <BiDiSpecURL#command-browsingContext-traverseHistory browsingContext.traverseHistory>
 --
 -- First added to Spec: <https://www.w3.org/TR/2024/WD-webdriver-bidi-20241121/#command-browsingContext-traverseHistory 21 November 2024 - First Public Working Draft>
@@ -429,7 +457,11 @@
 emulationSetScreenSettingsOverride :: SetScreenSettingsOverride -> Command ()
 emulationSetScreenSettingsOverride = mkCommand EmulationSetScreenSettingsOverride
 
--- since 11-08-2025 https://www.w3.org/TR/2025/WD-webdriver-bidi-20250811
+-- since 11-08-2025 https://www.w3.org/TR/2025/WD-webdriver-bidi-20250811-- | Specification Entry: <BiDiSpecURL#command-emulation-setScrollbarTypeOverride emulation.setScrollbarTypeOverride>
+--
+-- First added to Spec: <https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629/#command-emulation-setScrollbarTypeOverride 29 June 2026 - Working Draft>
+emulationSetScrollbarTypeOverride :: SetScrollbarTypeOverride -> Command ()
+emulationSetScrollbarTypeOverride = mkCommand EmulationSetScrollbarTypeOverride
 -- | Specification Entry: <BiDiSpecURL#command-emulation-setScriptingEnabled emulation.setScriptingEnabled>
 --
 -- First added to Spec: <https://www.w3.org/TR/2025/WD-webdriver-bidi-20250811/#command-emulation-setScriptingEnabled 11 August 2025>
@@ -442,10 +474,10 @@
 emulationSetTimezoneOverride :: SetTimezoneOverride -> Command ()
 emulationSetTimezoneOverride = mkCommand EmulationSetTimezoneOverride
 
--- since 09-01-2026 https://www.w3.org/TR/2026/WD-webdriver-bidi-20260109
+-- since 29-06-2026 https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629
 -- | Specification Entry: <BiDiSpecURL#command-emulation-setTouchOverride emulation.setTouchOverride>
 --
--- First added to Spec: <https://www.w3.org/TR/2026/WD-webdriver-bidi-20260109/#command-emulation-setTouchOverride 09 January 2026>
+-- First added to Spec: <https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629/#command-emulation-setTouchOverride 29 June 2026>
 emulationSetTouchOverride :: SetTouchOverride -> Command ()
 emulationSetTouchOverride = mkCommand EmulationSetTouchOverride
 
diff --git a/src/WebDriverPreCore/BiDi/BrowsingContext.hs b/src/WebDriverPreCore/BiDi/BrowsingContext.hs
--- a/src/WebDriverPreCore/BiDi/BrowsingContext.hs
+++ b/src/WebDriverPreCore/BiDi/BrowsingContext.hs
@@ -1,5 +1,6 @@
 module WebDriverPreCore.BiDi.BrowsingContext
   ( Activate (..),
+    BypassCSPOverride (..),
     CaptureScreenshot (..),
     ScreenShotOrigin (..),
     ClipRectangle (..),
@@ -15,7 +16,10 @@
     Orientation (..),
     PageRange (..),
     Reload (..),
+    SetBypassCSP (..),
     SetViewport (..),
+    StartScreencast (..),
+    StopScreencast (..),
     TraverseHistory (..),
     MatchType (..),
     Locator (..),
@@ -24,10 +28,14 @@
     PrintMargin (..),
     PrintPage (..),
     Viewport (..),
+    MediaTrackConstraints (..),
+    Screencast (..),
     GetTreeResult (..),
     LocateNodesResult (..),
     CaptureScreenshotResult (..),
     PrintResult (..),
+    StartScreencastResult (..),
+    StopScreencastResult (..),
     Info (..),
     NavigateResult (..),
     BrowsingContextEvent (..),
@@ -272,6 +280,32 @@
   toJSON :: Reload -> Value
   toJSON = toJSONOmitNothing
 
+-- | Bypass CSP override for setBypassCSP command
+-- Per spec: bypass can be true or null (not false)
+data BypassCSPOverride
+  = EnableBypassCSP -- ^ Encode as true - enable CSP bypass
+  | RestoreDefaultBypassCSP -- ^ Encode as null - restore to default (don't bypass)
+  deriving (Show, Eq, Generic)
+
+instance ToJSON BypassCSPOverride where
+  toJSON :: BypassCSPOverride -> Value
+  toJSON = \case
+    EnableBypassCSP -> Bool True
+    RestoreDefaultBypassCSP -> Null
+
+-- | for setBypassCSP command
+data SetBypassCSP = MkSetBypassCSP
+  { bypass :: BypassCSPOverride,
+    contexts :: Maybe [BrowsingContext],
+    userContexts :: Maybe [UserContext]
+  }
+  deriving (Show, Eq, Generic)
+
+instance ToJSON SetBypassCSP where
+  toJSON :: SetBypassCSP -> Value
+  toJSON MkSetBypassCSP {bypass, contexts, userContexts} =
+    object $ ["bypass" .= bypass] <> catMaybes [opt "contexts" contexts, opt "userContexts" userContexts]
+
 -- |  for setViewport command
 data SetViewport = MkSetViewport
   { context :: Maybe BrowsingContext,
@@ -285,6 +319,45 @@
   toJSON :: SetViewport -> Value
   toJSON = toJSONOmitNothing
 
+-- |  for startScreencast command
+data StartScreencast = MkStartScreencast
+  { context :: BrowsingContext,
+    mimeType :: Maybe Text,
+    video :: Maybe MediaTrackConstraints,
+    audio :: Maybe Bool
+  }
+  deriving (Show, Eq, Generic)
+
+instance ToJSON StartScreencast where
+  toJSON :: StartScreencast -> Value
+  toJSON = toJSONOmitNothing
+
+-- | Media track constraints for screencast
+data MediaTrackConstraints = MkMediaTrackConstraints
+  { width :: Maybe JSUInt,
+    height :: Maybe JSUInt,
+    frameRate :: Maybe JSUInt
+  }
+  deriving (Show, Eq, Generic)
+
+instance ToJSON MediaTrackConstraints where
+  toJSON :: MediaTrackConstraints -> Value
+  toJSON = toJSONOmitNothing
+
+-- | Screencast identifier
+newtype Screencast = MkScreencast
+  { screencastId :: Text
+  }
+  deriving newtype (Show, Eq, FromJSON, ToJSON)
+
+-- |  for stopScreencast command
+newtype StopScreencast = MkStopScreencast
+  { screencast :: Screencast
+  }
+  deriving (Show, Eq, Generic)
+
+instance ToJSON StopScreencast
+
 -- |  for traverseHistory command
 data TraverseHistory = MkTraverseHistory
   { context :: BrowsingContext,
@@ -453,6 +526,26 @@
 instance FromJSON PrintResult where
   parseJSON :: Value -> Parser PrintResult
   parseJSON = fmap MkPrintResult . parseTextData "PrintResult"
+
+data StartScreencastResult = MkStartScreencastResult
+  { screencast :: Screencast,
+    path :: Text
+  }
+  deriving (Show, Eq, Generic)
+
+instance FromJSON StartScreencastResult where
+  parseJSON :: Value -> Parser StartScreencastResult
+  parseJSON = parseJSONOmitNothing
+
+data StopScreencastResult = MkStopScreencastResult
+  { path :: Text,
+    error :: Maybe Text
+  }
+  deriving (Show, Eq, Generic)
+
+instance FromJSON StopScreencastResult where
+  parseJSON :: Value -> Parser StopScreencastResult
+  parseJSON = parseJSONOmitNothing
 
 data Info = MkInfo
   { children :: Maybe [Info],
diff --git a/src/WebDriverPreCore/BiDi/Command.hs b/src/WebDriverPreCore/BiDi/Command.hs
--- a/src/WebDriverPreCore/BiDi/Command.hs
+++ b/src/WebDriverPreCore/BiDi/Command.hs
@@ -72,7 +72,10 @@
   | BrowsingContextNavigate
   | BrowsingContextPrint
   | BrowsingContextReload
+  | BrowsingContextSetBypassCSP
   | BrowsingContextSetViewport
+  | BrowsingContextStartScreencast
+  | BrowsingContextStopScreencast
   | BrowsingContextTraverseHistory
   | EmulationSetForcedColorsModeThemeOverride
   | EmulationSetGeolocationOverride
@@ -80,6 +83,7 @@
   | EmulationSetNetworkConditions
   | EmulationSetScreenOrientationOverride
   | EmulationSetScreenSettingsOverride
+  | EmulationSetScrollbarTypeOverride
   | EmulationSetScriptingEnabled
   | EmulationSetTimezoneOverride
   | EmulationSetTouchOverride
@@ -220,7 +224,10 @@
         "browsingContext.navigate" -> p BrowsingContextNavigate
         "browsingContext.print" -> p BrowsingContextPrint
         "browsingContext.reload" -> p BrowsingContextReload
+        "browsingContext.setBypassCSP" -> p BrowsingContextSetBypassCSP
         "browsingContext.setViewport" -> p BrowsingContextSetViewport
+        "browsingContext.startScreencast" -> p BrowsingContextStartScreencast
+        "browsingContext.stopScreencast" -> p BrowsingContextStopScreencast
         "browsingContext.traverseHistory" -> p BrowsingContextTraverseHistory
         "emulation.setForcedColorsModeThemeOverride" -> p EmulationSetForcedColorsModeThemeOverride
         "emulation.setGeolocationOverride" -> p EmulationSetGeolocationOverride
@@ -228,6 +235,7 @@
         "emulation.setNetworkConditions" -> p EmulationSetNetworkConditions
         "emulation.setScreenOrientationOverride" -> p EmulationSetScreenOrientationOverride
         "emulation.setScreenSettingsOverride" -> p EmulationSetScreenSettingsOverride
+        "emulation.setScrollbarTypeOverride" -> p EmulationSetScrollbarTypeOverride
         "emulation.setScriptingEnabled" -> p EmulationSetScriptingEnabled
         "emulation.setTimezoneOverride" -> p EmulationSetTimezoneOverride
         "emulation.setTouchOverride" -> p EmulationSetTouchOverride
@@ -297,7 +305,10 @@
   BrowsingContextNavigate -> "browsingContext.navigate"
   BrowsingContextPrint -> "browsingContext.print"
   BrowsingContextReload -> "browsingContext.reload"
+  BrowsingContextSetBypassCSP -> "browsingContext.setBypassCSP"
   BrowsingContextSetViewport -> "browsingContext.setViewport"
+  BrowsingContextStartScreencast -> "browsingContext.startScreencast"
+  BrowsingContextStopScreencast -> "browsingContext.stopScreencast"
   BrowsingContextTraverseHistory -> "browsingContext.traverseHistory"
   EmulationSetForcedColorsModeThemeOverride -> "emulation.setForcedColorsModeThemeOverride"
   EmulationSetGeolocationOverride -> "emulation.setGeolocationOverride"
@@ -305,6 +316,7 @@
   EmulationSetNetworkConditions -> "emulation.setNetworkConditions"
   EmulationSetScreenOrientationOverride -> "emulation.setScreenOrientationOverride"
   EmulationSetScreenSettingsOverride -> "emulation.setScreenSettingsOverride"
+  EmulationSetScrollbarTypeOverride -> "emulation.setScrollbarTypeOverride"
   EmulationSetScriptingEnabled -> "emulation.setScriptingEnabled"
   EmulationSetTimezoneOverride -> "emulation.setTimezoneOverride"
   EmulationSetTouchOverride -> "emulation.setTouchOverride"
diff --git a/src/WebDriverPreCore/BiDi/Emulation.hs b/src/WebDriverPreCore/BiDi/Emulation.hs
--- a/src/WebDriverPreCore/BiDi/Emulation.hs
+++ b/src/WebDriverPreCore/BiDi/Emulation.hs
@@ -8,7 +8,10 @@
     SetForcedColorsModeThemeOverride (..),
     SetNetworkConditions (..),
     SetUserAgentOverride (..),
+    ScriptingOverride (..),
     SetScriptingEnabled (..),
+    SetScrollbarTypeOverride (..),
+    ScrollbarType (..),
     GeoProperty (..),
     GeolocationCoordinates (..),
     GeolocationPositionError (..),
@@ -178,8 +181,22 @@
             opt "userContexts" userContexts
           ]
 
+-- | Scripting override for setScriptingEnabled command
+-- Per spec: enabled can be false or null (not true)
+data ScriptingOverride
+  = ForceDisableScripting -- ^ Encode as false - explicitly disable scripting
+  | RestoreDefaultScripting -- ^ Encode as null - restore to initial browser configuration
+  deriving (Show, Eq, Generic)
+
+instance ToJSON ScriptingOverride where
+  toJSON :: ScriptingOverride -> Value
+  toJSON = \case
+    ForceDisableScripting -> Bool False
+    RestoreDefaultScripting -> Null
+
+-- | for setScriptingEnabled command
 data SetScriptingEnabled = MkSetScriptingEnabled
-  { enabled :: Maybe Bool,
+  { enabled :: ScriptingOverride,
     contexts :: Maybe [BrowsingContext],
     userContexts :: Maybe [UserContext]
   }
@@ -307,3 +324,36 @@
 instance ToJSON NetworkConditionsOffline where
   toJSON :: NetworkConditionsOffline -> Value
   toJSON _ = object ["type" .= "offline"]
+
+-- | Scrollbar type for emulation.setScrollbarTypeOverride command
+-- Per spec: scrollbarType can be "classic" / "overlay" / null
+-- Classic and Overlay encode as their string values, PlatformDefault encodes as null
+data ScrollbarType
+  = Classic -- Always-visible scrollbars (typical on Windows/Linux)
+  | Overlay -- Auto-hiding scrollbars (typical on macOS)
+  | PlatformDefault -- Restore platform default (encodes as null)
+  deriving (Show, Eq, Generic)
+
+instance ToJSON ScrollbarType where
+  toJSON :: ScrollbarType -> Value
+  toJSON = \case
+    Classic -> String "classic"
+    Overlay -> String "overlay"
+    PlatformDefault -> Null
+
+data SetScrollbarTypeOverride = MkSetScrollbarTypeOverride
+  { scrollbarType :: ScrollbarType,
+    contexts :: Maybe [BrowsingContext],
+    userContexts :: Maybe [UserContext]
+  }
+  deriving (Show, Eq, Generic)
+
+instance ToJSON SetScrollbarTypeOverride where
+  toJSON :: SetScrollbarTypeOverride -> Value
+  toJSON MkSetScrollbarTypeOverride {scrollbarType, contexts, userContexts} =
+    object $
+      ["scrollbarType" .= scrollbarType]
+        <> catMaybes
+          [ opt "contexts" contexts,
+            opt "userContexts" userContexts
+          ]
diff --git a/src/WebDriverPreCore/Error.hs b/src/WebDriverPreCore/Error.hs
--- a/src/WebDriverPreCore/Error.hs
+++ b/src/WebDriverPreCore/Error.hs
@@ -59,7 +59,7 @@
 
 -- | Known WevDriver Error Types
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#errors)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#errors)
 data ErrorType
   = ElementClickIntercepted
   | ElementNotInteractable
diff --git a/src/WebDriverPreCore/HTTP/Capabilities.hs b/src/WebDriverPreCore/HTTP/Capabilities.hs
--- a/src/WebDriverPreCore/HTTP/Capabilities.hs
+++ b/src/WebDriverPreCore/HTTP/Capabilities.hs
@@ -54,7 +54,7 @@
 import AesonUtils (opt, parseOpt, toJSONOmitNothing, parseJSONOmitNothing)
 
 {- references:
-- https://https://www.w3.org/TR/2025/WD-webdriver2-20251028/#capabilities
+- https://www.w3.org/TR/2026/WD-webdriver2-20260702/#capabilities
 
  - https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities
  - https://mucsi96.gitbook.io/w3c-webdriver/capabilities
@@ -64,7 +64,7 @@
 -- | 'FullCapabilities' is the object that is passed to webdriver to define the properties of the session via the 'Spec.newSession' function.
 --   It is a combination of 'alwaysMatch' and 'firstMatch' properties.
 --
---   [spec](https://https://www.w3.org/TR/2025/WD-webdriver2-20251028/#capabilities)
+--   [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#capabilities)
 --
 --   See also: 'Capabilities' and related constructors such as 'minCapabilities', 'minFullCapabilities', 'minFirefoxCapabilities' and 'minChromeCapabilities'
 data FullCapabilities = MkFullCapabilities
@@ -100,19 +100,19 @@
 --
 -- It is very common for 'alwaysMatch' to be the only field populated and the 'firstMatch' field to be empty.
 --
--- [spec](https://https://www.w3.org/TR/2025/WD-webdriver2-20251028/#capabilities)
+-- [spec](https://https://www.w3.org/TR/2026/WD-webdriver2-20260702/#capabilities)
 alwaysMatchCapabilities :: Capabilities -> FullCapabilities
 alwaysMatchCapabilities = flip MkFullCapabilities [] . Just
 
 -- | Returns the minimal FullCapabilities object for a given browser
 -- The browserName in the 'alwaysMatch' field is the only field populated
--- [spec](https://https://www.w3.org/TR/2025/WD-webdriver2-20251028/#capabilities)
+-- [spec](https://https://www.w3.org/TR/2026/WD-webdriver2-20260702/#capabilities)
 minFullCapabilities :: BrowserName -> FullCapabilities
 minFullCapabilities = alwaysMatchCapabilities . minCapabilities
 
 -- | Returns the minimal Capabilities object for a given browser
 -- The browserName is the only field populated
--- [spec](https://https://www.w3.org/TR/2025/WD-webdriver2-20251028/#capabilities)
+-- [spec](https://https://www.w3.org/TR/2026/WD-webdriver2-20260702/#capabilities)
 minCapabilities :: BrowserName -> Capabilities
 minCapabilities browserName =
   MkCapabilities
@@ -140,7 +140,7 @@
 
 -- Custom Types for Enums
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#capabilities)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#capabilities)
 data UnhandledPromptBehavior
   = Dismiss
   | Accept
@@ -149,7 +149,7 @@
   | Ignore
   deriving (Show, Generic, Enum, Bounded, Eq)
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#capabilities)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#capabilities)
 data PageLoadStrategy
   = None'
   | Eager
@@ -171,7 +171,7 @@
     "normal" -> pure Normal
     _ -> fail "Invalid PageLoadStrategy"
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#capabilities)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#capabilities)
 data BrowserName
   = Chrome
   | Firefox
@@ -180,7 +180,7 @@
   | InternetExplorer
   deriving (Show, Generic, Enum, Bounded, Eq)
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#capabilities)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#capabilities)
 data PlatformName
   = Windows
   | Mac
@@ -192,7 +192,7 @@
 -- | 'Capabilities' define the properties of the session and are passed to the webdriver
 -- via fields of the 'FullCapabilities' object.
 --
--- [spec](https://https://www.w3.org/TR/2025/WD-webdriver2-20251028/#capabilities)
+-- [spec](https://https://www.w3.org/TR/2026/WD-webdriver2-20260702/#capabilities)
 --
 -- See also: 'FullCapabilities' and related constructors such as: 'minCapabilities',
 --   'minFullCapabilities',  'minFirefoxCapabilities' and 'minChromeCapabilities'
@@ -264,7 +264,7 @@
       vendorSpecific <- parseVendorSpecific v
       pure MkCapabilities {..}
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#proxy)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#proxy)
 data SocksProxy = MkSocksProxy
   { socksProxy :: Text,
     socksVersion :: Int
@@ -287,7 +287,7 @@
       socksVersion <- v .: "socksVersion"
       pure MkSocksProxy {..}
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#proxy)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#proxy)
 data Proxy
   = Direct
   | Manual
@@ -351,7 +351,7 @@
 
 -- Vendor Capabilities
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#extensions-0)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#extensions-0)
 data VendorSpecific
   = -- | Chrome capabilities - [spec](https://developer.chrome.com/docs/chromedriver/capabilities)
     --
@@ -699,7 +699,7 @@
         m = parseFieldMaybe o
 
 -- | Timeouts in milliseconds
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#timeouts)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#timeouts)
 data Timeouts = MkTimeouts
   { implicit :: Maybe Int, -- field order needs to be the same as FromJSON below
     pageLoad :: Maybe Int,
diff --git a/src/WebDriverPreCore/HTTP/Protocol.hs b/src/WebDriverPreCore/HTTP/Protocol.hs
--- a/src/WebDriverPreCore/HTTP/Protocol.hs
+++ b/src/WebDriverPreCore/HTTP/Protocol.hs
@@ -113,7 +113,7 @@
 import WebDriverPreCore.Internal.HTTPBidiCommon as Url (URL (..))
 import Prelude hiding (id)
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#dfn-get-window-handle)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#dfn-get-window-handle)
 newtype Handle = MkHandle {handle :: Text}
   deriving (Show, Eq, Generic)
 
@@ -130,7 +130,7 @@
       pure $ MkHandle h
     v -> fail $ unpack $ "Expected Handle as String or Object with handle property, got: " <> txt v
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#new-window)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#new-window)
 data WindowHandleSpec = HandleSpec
   { handle :: Handle,
     handletype :: HandleType
@@ -168,7 +168,7 @@
     "tab" -> pure Tab
     v -> fail $ unpack $ "Unknown HandleType " <> v
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#dfn-find-element)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#dfn-find-element)
 newtype ElementId = MkElement {id :: Text}
   deriving (Show, Eq, Generic)
 
@@ -195,7 +195,7 @@
     withObject "ElementId" $
       fmap MkShadowRootElementId . (.: shadowRootFieldName)
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#dfn-new-sessions)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#dfn-new-sessions)
 newtype Session = MkSession {id :: Text}
   deriving (Show, Eq, Generic)
 
@@ -275,7 +275,7 @@
           KM.insert webSocketKey (Bool True) o -- change to Bool
     _ -> o -- no change if property not present
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#dfn-status)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#dfn-status)
 data Status = MkStatus
   { ready :: Bool,
     message :: Text
@@ -286,7 +286,7 @@
 
 instance FromJSON Status
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#cookies)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#cookies)
 data SameSite
   = Lax
   | Strict
@@ -299,7 +299,7 @@
   toJSON :: SameSite -> Value
   toJSON = String . txt
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#dfn-switch-to-frame)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#dfn-switch-to-frame)
 data FrameReference
   = TopLevelFrame
   | FrameNumber Word16
@@ -326,7 +326,7 @@
 shadowRootFieldName :: Key
 shadowRootFieldName = "shadow-6066-11e4-a52e-4f735466cecf"
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#cookies)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#cookies)
 data Cookie = MkCookie
   { name :: Text,
     value :: Text,
@@ -370,7 +370,7 @@
             opt "expiry" expiry
           ]
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#locator-strategies)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#locator-strategies)
 data Selector
   = CSS Text
   | XPath Text
@@ -390,7 +390,7 @@
     where
       sJSON using value = object ["using" .= using, "value" .= value]
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#dfn-get-element-rect)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#dfn-get-element-rect)
 data WindowRect = Rect
   { x :: Int,
     y :: Int,
@@ -416,7 +416,7 @@
           height = floor height
         }
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#actions)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#actions)
 newtype Actions = MkActions {actions :: [Action]}
   deriving (Show, Eq, Generic)
 
@@ -427,7 +427,7 @@
       [ "actions" .= actions
       ]
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#actions)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#actions)
 data KeyAction
   = PauseKey {duration :: Maybe Int} -- ms
   | KeyDown
@@ -458,7 +458,7 @@
 
 -- Pointer subtypes
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#actions)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#actions)
 data Pointer
   = Mouse
   | Pen
@@ -472,7 +472,7 @@
   toJSON :: Pointer -> Value
   toJSON = mkLwrTxt
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#actions)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#actions)
 data PointerOrigin
   = Viewport
   | OriginPointer
@@ -486,7 +486,7 @@
     OriginPointer -> "pointer"
     OriginElement (MkElement id') -> object ["element" .= id']
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#actions)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#actions)
 data Action
   = NoneAction
       { id :: Text,
@@ -515,7 +515,7 @@
       }
   deriving (Show, Eq)
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#actions)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#actions)
 data WheelAction
   = PauseWheel {duration :: Maybe Int} -- ms
   | Scroll
@@ -550,7 +550,7 @@
               "deltaY" .= deltaY
             ]
 
--- | [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#actions)
+-- | [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#actions)
 data PointerAction
   = PausePointer {duration :: Maybe Int} -- ms
   | Up
diff --git a/src/WebDriverPreCore/HTTP/SpecDefinition.hs b/src/WebDriverPreCore/HTTP/SpecDefinition.hs
--- a/src/WebDriverPreCore/HTTP/SpecDefinition.hs
+++ b/src/WebDriverPreCore/HTTP/SpecDefinition.hs
@@ -217,7 +217,7 @@
 -- ########################### WebDriver API ############################
 -- ######################################################################
 
--- https://www.w3.org/TR/2025/WD-webdriver2-20251028/
+-- https://www.w3.org/TR/2026/WD-webdriver2-20260702/
 -- 61 endpoints
 -- Method 	URI Template 	Command
 
@@ -228,7 +228,7 @@
 --
 -- 'newSession'' can be used if 'FullCapabilities' doesn't meet your requirements.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#new-session)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#new-session)
 --
 --  @POST 	\/session 	New Session@
 newSession :: FullCapabilities -> HttpSpec SessionResponse
@@ -241,9 +241,9 @@
 -- The 'FullCapabilities' type and associated types should work for the vast majority use cases, but if the required capabilities are not covered by the types provided, 'newSession''.
 -- can be used with a custom type instead. 'newSession'' works with any type that implements 'ToJSON', (including an Aeson 'Value').
 --
--- Obviously, any type used must produce a JSON object compatible with [capabilities as defined W3C spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#capabilities).
+-- Obviously, any type used must produce a JSON object compatible with [capabilities as defined W3C spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#capabilities).
 --
---  [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#new-session)
+--  [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#new-session)
 --
 --  @POST 	\/session 	New Session@
 newSession' :: (ToJSON a) => a -> HttpSpec SessionResponse
@@ -253,7 +253,7 @@
 --
 -- Return a spec to get the status of the driver.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#status)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#status)
 --
 -- @GET 	\/status 	Status@
 status :: HttpSpec Status
@@ -265,7 +265,7 @@
 --
 -- Return a spec to delete a session given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#delete-session)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#delete-session)
 --
 -- @DELETE 	\/session\/{session id} 	Delete Session@
 deleteSession :: Session -> HttpSpec ()
@@ -275,7 +275,7 @@
 --
 -- Return a spec to get the timeouts of a session given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-timeouts)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-timeouts)
 --
 -- @GET 	\/session\/{session id}\/timeouts 	Get Timeouts@
 getTimeouts :: Session -> HttpSpec Timeouts
@@ -285,7 +285,7 @@
 --
 -- Return a spec to set the timeouts of a session given a 'Session' and 'Timeouts'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#set-timeouts)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#set-timeouts)
 --
 -- @POST 	\/session\/{session id}\/timeouts 	Set Timeouts@
 setTimeouts :: Session -> Timeouts -> HttpSpec ()
@@ -296,7 +296,7 @@
 --
 -- Return a spec to navigate to a URL given a 'Session' and a 'Text' URL.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#navigate-to)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#navigate-to)
 --
 -- @POST 	\/session\/{session id}\/url 	Navigate To@
 navigateTo :: Session -> URL -> HttpSpec ()
@@ -306,7 +306,7 @@
 --
 -- Return a spec to get the current URL of a session given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-current-url)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-current-url)
 --
 -- @GET 	\/session\/{session id}\/url 	Get Current URL@
 getCurrentUrl :: Session -> HttpSpec URL
@@ -316,7 +316,7 @@
 --
 -- Return a spec to navigate back in the browser history given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#back)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#back)
 --
 -- @POST 	\/session\/{session id}\/back 	Back@
 back :: Session -> HttpSpec ()
@@ -326,7 +326,7 @@
 --
 -- Return a spec to navigate forward in the browser history given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#forward)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#forward)
 --
 -- @POST 	\/session\/{session id}\/forward 	Forward@
 forward :: Session -> HttpSpec ()
@@ -336,7 +336,7 @@
 --
 -- Return a spec to refresh the current page given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#refresh)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#refresh)
 --
 -- @POST 	\/session\/{session id}\/refresh 	Refresh@
 refresh :: Session -> HttpSpec ()
@@ -346,7 +346,7 @@
 --
 -- Return a spec to get the title of the current page given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-title)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-title)
 --
 -- @GET 	\/session\/{session id}\/title 	Get Title@
 getTitle :: Session -> HttpSpec Text
@@ -356,7 +356,7 @@
 --
 -- Return a spec to get the current window handle given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-window-handle)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-window-handle)
 --
 -- @GET 	\/session\/{session id}\/window 	Get Window Handle@
 getWindowHandle :: Session -> HttpSpec Handle
@@ -366,7 +366,7 @@
 --
 -- Return a spec to create a new window given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#new-window)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#new-window)
 --
 -- @POST 	\/session\/{session id}\/window\/new 	New Window@
 newWindow :: Session -> HttpSpec WindowHandleSpec
@@ -376,7 +376,7 @@
 --
 -- Return a spec to close the current window given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#close-window)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#close-window)
 --
 -- @DELETE 	\/session\/{session id}\/window 	Close Window@
 closeWindow :: Session -> HttpSpec [Handle]
@@ -386,7 +386,7 @@
 --
 -- Return a spec to switch to a different window given a 'Session' and 'WindowHandle'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#switch-to-window)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#switch-to-window)
 --
 -- @POST 	\/session\/{session id}\/window 	Switch To Window@
 switchToWindow :: Session -> Handle -> HttpSpec ()
@@ -396,7 +396,7 @@
 --
 -- Return a spec to switch to a different frame given a 'Session' and 'FrameReference'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#switch-to-frame)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#switch-to-frame)
 --
 -- @POST 	\/session\/{session id}\/frame 	Switch To Frame@
 switchToFrame :: Session -> FrameReference -> HttpSpec ()
@@ -406,7 +406,7 @@
 --
 -- Return a spec to get the source of the current page given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-page-source)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-page-source)
 --
 -- @GET 	\/session\/{session id}\/source 	Get Page Source@
 getPageSource :: Session -> HttpSpec Text
@@ -416,7 +416,7 @@
 --
 -- Return a spec to execute a script in the context of the current page given a 'Session', 'Text' script, and a list of 'Value' arguments.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#execute-script)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#execute-script)
 --
 -- @POST 	\/session\/{session id}\/execute\/sync 	Execute Script@
 executeScript :: Session -> Script -> HttpSpec Value
@@ -426,7 +426,7 @@
 --
 -- Return a spec to execute an asynchronous script in the context of the current page given a 'Session', 'Text' script, and a list of 'Value' arguments.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#execute-async-script)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#execute-async-script)
 --
 -- @POST 	\/session\/{session id}\/execute\/async 	Execute Async Script@
 executeScriptAsync :: Session -> Script -> HttpSpec Value
@@ -436,7 +436,7 @@
 --
 -- Return a spec to get all cookies of the current page given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-all-cookies)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-all-cookies)
 --
 -- @GET 	\/session\/{session id}\/cookie 	Get All Cookies@
 getAllCookies :: Session -> HttpSpec [Cookie]
@@ -446,7 +446,7 @@
 --
 -- Return a spec to get a named cookie of the current page given a 'Session' and cookie name.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-named-cookie)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-named-cookie)
 --
 -- @GET 	\/session\/{session id}\/cookie\/{name} 	Get Named Cookie@
 getNamedCookie :: Session -> Text -> HttpSpec Cookie
@@ -456,7 +456,7 @@
 --
 -- Return a spec to add a cookie to the current page given a 'Session' and 'Cookie'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#add-cookie)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#add-cookie)
 --
 -- @POST 	\/session\/{session id}\/cookie 	Add Cookie@
 addCookie :: Session -> Cookie -> HttpSpec ()
@@ -466,7 +466,7 @@
 --
 -- Return a spec to delete a named cookie from the current page given a 'Session' and cookie name.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#delete-cookie)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#delete-cookie)
 --
 -- @DELETE 	\/session\/{session id}\/cookie\/{name} 	Delete Cookie@
 deleteCookie :: Session -> Text -> HttpSpec ()
@@ -476,7 +476,7 @@
 --
 -- Return a spec to delete all cookies from the current page given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#delete-all-cookies)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#delete-all-cookies)
 --
 -- @DELETE 	\/session\/{session id}\/cookie 	Delete All Cookies@
 deleteAllCookies :: Session -> HttpSpec ()
@@ -486,7 +486,7 @@
 --
 -- Return a spec to perform actions on the current page given a 'Session' and 'Actions'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#perform-actions)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#perform-actions)
 --
 -- @POST 	\/session\/{session id}\/actions 	Perform Actions@
 performActions :: Session -> Actions -> HttpSpec ()
@@ -496,7 +496,7 @@
 --
 -- Return a spec to release actions on the current page given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#release-actions)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#release-actions)
 --
 -- @DELETE 	\/session\/{session id}\/actions 	Release Actions@
 releaseActions :: Session -> HttpSpec ()
@@ -506,7 +506,7 @@
 --
 -- Return a spec to dismiss an alert on the current page given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#dismiss-alert)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#dismiss-alert)
 --
 -- @POST 	\/session\/{session id}\/alert\/dismiss 	Dismiss Alert@
 dismissAlert :: Session -> HttpSpec ()
@@ -516,7 +516,7 @@
 --
 -- Return a spec to accept an alert on the current page given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#accept-alert)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#accept-alert)
 --
 -- @POST 	\/session\/{session id}\/alert\/accept 	Accept Alert@
 acceptAlert :: Session -> HttpSpec ()
@@ -526,7 +526,7 @@
 --
 -- Return a spec to get the text of an alert on the current page given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-alert-text)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-alert-text)
 --
 -- @GET 	\/session\/{session id}\/alert\/text 	Get Alert Text@
 getAlertText :: Session -> HttpSpec Text
@@ -536,7 +536,7 @@
 --
 -- Return a spec to send text to an alert on the current page given a 'Session' and 'Text'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#send-alert-text)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#send-alert-text)
 --
 -- @POST 	\/session\/{session id}\/alert\/text 	Send Alert Text@
 sendAlertText :: Session -> Text -> HttpSpec ()
@@ -546,7 +546,7 @@
 --
 -- Return a spec to take a screenshot of the current page given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#take-screenshot)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#take-screenshot)
 --
 -- @GET 	\/session\/{session id}\/screenshot 	Take Screenshot@
 takeScreenshot :: Session -> HttpSpec Text
@@ -556,7 +556,7 @@
 --
 -- Return a spec to print the current page given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#print-page)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#print-page)
 --
 -- @POST 	\/session\/{session id}\/print 	Print Page@
 printPage :: Session -> HttpSpec Text
@@ -568,7 +568,7 @@
 --
 -- Return a spec to get all window handles of the current session given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-window-handles)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-window-handles)
 --
 -- @GET 	\/session\/{session id}\/window\/handles 	Get Window Handles@
 getWindowHandles :: Session -> HttpSpec [Handle]
@@ -578,7 +578,7 @@
 --
 -- Return a spec to get the window rect of the current window given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-window-rect)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-window-rect)
 --
 -- @GET 	\/session\/{session id}\/window\/rect 	Get Window Rect@
 getWindowRect :: Session -> HttpSpec WindowRect
@@ -588,7 +588,7 @@
 --
 -- Return a spec to set the window rect of the current window given a 'Session' and 'WindowRect'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#set-window-rect)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#set-window-rect)
 --
 -- @POST 	\/session\/{session id}\/window\/rect 	Set Window Rect@
 setWindowRect :: Session -> WindowRect -> HttpSpec WindowRect
@@ -598,7 +598,7 @@
 --
 -- Return a spec to maximize the current window given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#maximize-window)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#maximize-window)
 --
 -- @POST 	\/session\/{session id}\/window\/maximize 	Maximize Window@
 maximizeWindow :: Session -> HttpSpec WindowRect
@@ -608,7 +608,7 @@
 --
 -- Return a spec to minimize the current window given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#minimize-window)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#minimize-window)
 --
 -- @POST 	\/session\/{session id}\/window\/minimize 	Minimize Window@
 minimizeWindow :: Session -> HttpSpec WindowRect
@@ -618,7 +618,7 @@
 --
 -- Return a spec to fullscreen the current window given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#fullscreen-window)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#fullscreen-window)
 --
 -- @POST 	\/session\/{session id}\/window\/fullscreen 	Fullscreen Window@
 fullscreenWindow :: Session -> HttpSpec WindowRect
@@ -630,7 +630,7 @@
 --
 -- Return a spec to switch to the parent frame given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#switch-to-parent-frame)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#switch-to-parent-frame)
 --
 -- @POST 	\/session\/{session id}\/frame\/parent 	Switch To Parent Frame@
 switchToParentFrame :: Session -> HttpSpec ()
@@ -642,7 +642,7 @@
 --
 -- Return a spec to get the active element of the current page given a 'Session'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-active-element)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-active-element)
 --
 -- @GET 	\/session\/{session id}\/element\/active 	Get Active Element@
 getActiveElement :: Session -> HttpSpec ElementId
@@ -652,7 +652,7 @@
 --
 -- Return a spec to find an element on the current page given a 'Session' and 'Selector'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#find-element)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#find-element)
 --
 -- @POST 	\/session\/{session id}\/element 	Find Element@
 findElement :: Session -> Selector -> HttpSpec ElementId
@@ -662,7 +662,7 @@
 --
 -- Return a spec to find elements on the current page given a 'Session' and 'Selector'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#find-elements)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#find-elements)
 --
 -- @POST 	\/session\/{session id}\/elements 	Find Elements@
 findElements :: Session -> Selector -> HttpSpec [ElementId]
@@ -674,7 +674,7 @@
 --
 -- Return a spec to get the shadow root of an element given a 'Session' and 'ElementId'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-element-shadow-root)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-element-shadow-root)
 --
 -- @GET 	\/session\/{session id}\/element\/{element id}\/shadow 	Get Element Shadow Root@
 getElementShadowRoot :: Session -> ElementId -> HttpSpec ShadowRootElementId
@@ -684,7 +684,7 @@
 --
 -- Return a spec to find an element from another element given a 'Session', 'ElementId', and 'Selector'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#find-element-from-element)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#find-element-from-element)
 --
 -- @POST 	\/session\/{session id}\/element\/{element id}\/element 	Find Element From Element@
 findElementFromElement :: Session -> ElementId -> Selector -> HttpSpec ElementId
@@ -694,7 +694,7 @@
 --
 -- Return a spec to find elements from another element given a 'Session', 'ElementId', and 'Selector'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#find-elements-from-element)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#find-elements-from-element)
 --
 -- @POST 	\/session\/{session id}\/element\/{element id}\/elements 	Find Elements From Element@
 findElementsFromElement :: Session -> ElementId -> Selector -> HttpSpec [ElementId]
@@ -704,7 +704,7 @@
 --
 -- Return a spec to check if an element is selected given a 'Session' and 'ElementId'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#is-element-selected)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#is-element-selected)
 --
 -- @GET 	\/session\/{session id}\/element\/{element id}\/selected 	Is Element Selected@
 isElementSelected :: Session -> ElementId -> HttpSpec Bool
@@ -714,7 +714,7 @@
 --
 -- Return a spec to get an attribute of an element given a 'Session', 'ElementId', and attribute name.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-element-attribute)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-element-attribute)
 --
 -- @GET 	\/session\/{session id}\/element\/{element id}\/attribute\/{name} 	Get Element Attribute@
 getElementAttribute :: Session -> ElementId -> Text -> HttpSpec Text
@@ -724,7 +724,7 @@
 --
 -- Return a spec to get a property of an element given a 'Session', 'ElementId', and property name.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-element-property)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-element-property)
 --
 -- @GET 	\/session\/{session id}\/element\/{element id}\/property\/{name} 	Get Element Property@
 getElementProperty :: Session -> ElementId -> Text -> HttpSpec Value
@@ -734,7 +734,7 @@
 --
 -- Return a spec to get the CSS value of an element given a 'Session', 'ElementId', and CSS property name.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-element-css-value)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-element-css-value)
 --
 -- @GET 	\/session\/{session id}\/element\/{element id}\/css\/{property name} 	Get Element CSS Value@
 getElementCssValue :: Session -> ElementId -> Text -> HttpSpec Text
@@ -744,7 +744,7 @@
 --
 -- Return a spec to get the text of an element given a 'Session' and 'ElementId'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-element-text)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-element-text)
 --
 -- @GET 	\/session\/{session id}\/element\/{element id}\/text 	Get Element Text@
 getElementText :: Session -> ElementId -> HttpSpec Text
@@ -754,7 +754,7 @@
 --
 -- Return a spec to get the tag name of an element given a 'Session' and 'ElementId'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-element-tag-name)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-element-tag-name)
 --
 -- @GET 	\/session\/{session id}\/element\/{element id}\/name 	Get Element Tag Name@
 getElementTagName :: Session -> ElementId -> HttpSpec Text
@@ -764,7 +764,7 @@
 --
 -- Return a spec to get the rect of an element given a 'Session' and 'ElementId'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-element-rect)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-element-rect)
 --
 -- @GET 	\/session\/{session id}\/element\/{element id}\/rect 	Get Element Rect@
 getElementRect :: Session -> ElementId -> HttpSpec WindowRect
@@ -774,7 +774,7 @@
 --
 -- Return a spec to check if an element is enabled given a 'Session' and 'ElementId'.
 --SAP will foc
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#is-element-enabled)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#is-element-enabled)
 --
 -- @GET 	\/session\/{session id}\/element\/{element id}\/enabled 	Is Element Enabled@
 isElementEnabled :: Session -> ElementId -> HttpSpec Bool
@@ -784,7 +784,7 @@
 --
 -- Return a spec to get the computed role of an element given a 'Session' and 'ElementId'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-computed-role)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-computed-role)
 --
 -- @GET 	\/session\/{session id}\/element\/{element id}\/computedrole 	Get Computed Role@
 getElementComputedRole :: Session -> ElementId -> HttpSpec Text
@@ -794,7 +794,7 @@
 --
 -- Return a spec to get the computed label of an element given a 'Session' and 'ElementId'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#get-computed-label)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#get-computed-label)
 --
 -- @GET 	\/session\/{session id}\/element\/{element id}\/computedlabel 	Get Computed Label@
 getElementComputedLabel :: Session -> ElementId -> HttpSpec Text
@@ -804,7 +804,7 @@
 --
 -- Return a spec to click an element given a 'Session' and 'ElementId'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#element-click)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#element-click)
 --
 -- @POST 	\/session\/{session id}\/element\/{element id}\/click 	Element Click@
 elementClick :: Session -> ElementId -> HttpSpec ()
@@ -814,7 +814,7 @@
 --
 -- Return a spec to clear an element given a 'Session' and 'ElementId'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#element-clear)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#element-clear)
 --
 -- @POST 	\/session\/{session id}\/element\/{element id}\/clear 	Element Clear@
 elementClear :: Session -> ElementId -> HttpSpec ()
@@ -824,7 +824,7 @@
 --
 -- Return a spec to send keys to an element given a 'Session', 'ElementId', and keys to send.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#element-send-keys)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#element-send-keys)
 --
 -- @POST 	\/session\/{session id}\/element\/{element id}\/value 	Element Send Keys@
 elementSendKeys :: Session -> ElementId -> Text -> HttpSpec ()
@@ -834,7 +834,7 @@
 --
 -- Return a spec to take a screenshot of an element given a 'Session' and 'ElementId'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#take-element-screenshot)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#take-element-screenshot)
 --
 -- @GET 	\/session\/{session id}\/element\/{element id}\/screenshot 	Take Element Screenshot@
 takeElementScreenshot :: Session -> ElementId -> HttpSpec Text
@@ -846,7 +846,7 @@
 --
 -- Return a spec to find an element from the shadow root given a 'Session', 'ElementId', and 'Selector'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#find-element-from-shadow-root)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#find-element-from-shadow-root)
 --
 -- @POST 	\/session\/{session id}\/shadow\/{shadow id}\/element 	Find Element From Shadow Root@
 findElementFromShadowRoot :: Session -> ShadowRootElementId -> Selector -> HttpSpec ElementId
@@ -856,7 +856,7 @@
 --
 -- Return a spec to find elements from the shadow root given a 'Session', 'ElementId', and 'Selector'.
 --
--- [spec](https://www.w3.org/TR/2025/WD-webdriver2-20251028/#find-elements-from-shadow-root)
+-- [spec](https://www.w3.org/TR/2026/WD-webdriver2-20260702/#find-elements-from-shadow-root)
 --
 -- @POST 	\/session\/{session id}\/shadow\/{shadow id}\/elements 	Find Elements From Shadow Root@
 findElementsFromShadowRoot :: Session -> ShadowRootElementId -> Selector -> HttpSpec [ElementId]
diff --git a/test/ApiCoverageTest.hs b/test/ApiCoverageTest.hs
--- a/test/ApiCoverageTest.hs
+++ b/test/ApiCoverageTest.hs
@@ -25,7 +25,7 @@
 
 {-
 !! Replace this the endepoints from the spec with every release
-https://www.w3.org/TR/2025/WD-webdriver2-20251028/#endpoints- W3C Working Draft 28 October 2025
+https://www.w3.org/TR/2026/WD-webdriver2-20260702/#endpoints- W3C Working Draft 02 July 2026
 -}
 endPointsCopiedFromSpc :: Text
 endPointsCopiedFromSpc =
diff --git a/test/BiDi/Actions.hs b/test/BiDi/Actions.hs
--- a/test/BiDi/Actions.hs
+++ b/test/BiDi/Actions.hs
@@ -91,6 +91,7 @@
     SessionSubscibe (..),
     SessionSubscribeResult (..),
     SessionUnsubscribe (..),
+    SetBypassCSP,
     SetCacheBehavior,
     SetClientWindowState,
     SetCookie,
@@ -104,10 +105,15 @@
     SetNetworkConditions,
     SetScreenOrientationOverride,
     SetScreenSettingsOverride,
+    SetScrollbarTypeOverride,
     SetScriptingEnabled,
     SetTimezoneOverride,
     SetTouchOverride,
     SetUserAgentOverride,
+    StartScreencast,
+    StartScreencastResult,
+    StopScreencast,
+    StopScreencastResult,
     SetViewport,
     SubscriptionId (..),
     TraverseHistory,
@@ -143,7 +149,10 @@
     browsingContextNavigate :: Navigate -> IO NavigateResult,
     browsingContextPrint :: Print -> IO PrintResult,
     browsingContextReload :: Reload -> IO (),
+    browsingContextSetBypassCSP :: SetBypassCSP -> IO (),
     browsingContextSetViewport :: SetViewport -> IO (),
+    browsingContextStartScreencast :: StartScreencast -> IO StartScreencastResult,
+    browsingContextStopScreencast :: StopScreencast -> IO StopScreencastResult,
     browsingContextTraverseHistory :: TraverseHistory -> IO (),
     -- Browser commandssendCommandNoWait socket
     browserClose :: IO (),
@@ -160,6 +169,7 @@
     emulationSetNetworkConditions :: SetNetworkConditions -> IO (),
     emulationSetScreenOrientationOverride :: SetScreenOrientationOverride -> IO (),
     emulationSetScreenSettingsOverride :: SetScreenSettingsOverride -> IO (),
+    emulationSetScrollbarTypeOverride :: SetScrollbarTypeOverride -> IO (),
     emulationSetScriptingEnabled :: SetScriptingEnabled -> IO (),
     emulationSetTimezoneOverride :: SetTimezoneOverride -> IO (),
     emulationSetTouchOverride :: SetTouchOverride -> IO (),
@@ -297,7 +307,10 @@
       browsingContextNavigate = send . API.browsingContextNavigate,
       browsingContextPrint = send . API.browsingContextPrint,
       browsingContextReload = send . API.browsingContextReload,
+      browsingContextSetBypassCSP = send . API.browsingContextSetBypassCSP,
       browsingContextSetViewport = send . API.browsingContextSetViewport,
+      browsingContextStartScreencast = send . API.browsingContextStartScreencast,
+      browsingContextStopScreencast = send . API.browsingContextStopScreencast,
       browsingContextTraverseHistory = send . API.browsingContextTraverseHistory,
       -- Browser commands
       browserClose = send API.browserClose,
@@ -314,6 +327,7 @@
       emulationSetNetworkConditions = send . API.emulationSetNetworkConditions,
       emulationSetScreenOrientationOverride = send . API.emulationSetScreenOrientationOverride,
       emulationSetScreenSettingsOverride = send . API.emulationSetScreenSettingsOverride,
+      emulationSetScrollbarTypeOverride = send . API.emulationSetScrollbarTypeOverride,
       emulationSetScriptingEnabled = send . API.emulationSetScriptingEnabled,
       emulationSetTimezoneOverride = send . API.emulationSetTimezoneOverride,
       emulationSetTouchOverride = send . API.emulationSetTouchOverride,
diff --git a/test/BiDi/Demos/BrowsingContextDemos.hs b/test/BiDi/Demos/BrowsingContextDemos.hs
--- a/test/BiDi/Demos/BrowsingContextDemos.hs
+++ b/test/BiDi/Demos/BrowsingContextDemos.hs
@@ -9,6 +9,7 @@
 import TestData (contentPageUrl, framesUrl, loginUrl, navigation1Url, navigation2Url, navigation3Url, navigation4Url, navigation5Url, navigation6Url, nestedFramesUrl, scriptRealmUrl)
 import WebDriverPreCore.BiDi.Protocol
   ( Activate (..),
+    BypassCSPOverride (..),
     CaptureScreenshot (..),
     ClipRectangle (..),
     Close (..),
@@ -27,6 +28,7 @@
     LocateNodes (..),
     LocateNodesResult (..),
     Locator (..),
+    MediaTrackConstraints (..),
     Navigate (..),
     NodeRemoteValue (..),
     Orientation (..),
@@ -38,9 +40,14 @@
     ReadinessState (..),
     Reload (..),
     ScreenShotOrigin (..),
+    SetBypassCSP (..),
     SetViewport (..),
     SharedId (..),
     SharedReference (..),
+    StartScreencast (..),
+    StartScreencastResult (..),
+    StopScreencast (..),
+    StopScreencastResult (..),
     Target (..),
     TraverseHistory (..),
     Viewport (..),
@@ -1016,4 +1023,86 @@
               userContexts = Nothing
             }
       logShow "Set viewport result - reset to null" setViewportNull
+      pause
+
+-- >>> runDemo browsingContextSetBypassCSPDemo
+-- *** Exception: BiDIError (ProtocolException {error = UnknownCommand, description = "A command could not be executed because the remote end is not aware of it", message = "Unknown command 'browsingContext.setBypassCSP'.", stacktrace = Nothing, errorData = Nothing, response = Object (fromList [("error",String "unknown command"),("id",Number 2.0),("message",String "Unknown command 'browsingContext.setBypassCSP'."),("type",String "error")])})
+browsingContextSetBypassCSPDemo :: BiDiDemo
+browsingContextSetBypassCSPDemo =
+  demo "Browsing Context - Set Bypass CSP - since https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629" action
+  where
+    action :: DemoActions -> BiDiActions -> IO ()
+    action utils@MkDemoActions {..} bidi@MkBiDiActions {..} = do
+      bc <- rootContext utils bidi
+
+      logTxt "Test 1: Enable CSP bypass for the browsing context"
+      let enableBypass = MkSetBypassCSP
+            { bypass = EnableBypassCSP,
+              contexts = Just [bc],
+              userContexts = Nothing
+            }
+      browsingContextSetBypassCSP enableBypass
+      logTxt "CSP bypass enabled - test infrastructure can now inject scripts"
+      pause
+
+      logTxt "Test 2: Restore default CSP enforcement"
+      let restoreCSP = MkSetBypassCSP
+            { bypass = RestoreDefaultBypassCSP,
+              contexts = Just [bc],
+              userContexts = Nothing
+            }
+      browsingContextSetBypassCSP restoreCSP
+      logTxt "CSP enforcement restored to default"
+      pause
+
+-- >>> runDemo browsingContextScreencastDemo
+-- *** Exception: BiDIError (ProtocolException {error = UnknownCommand, description = "A command could not be executed because the remote end is not aware of it", message = "Unknown command 'browsingContext.startScreencast'.", stacktrace = Nothing, errorData = Nothing, response = Object (fromList [("error",String "unknown command"),("id",Number 3.0),("message",String "Unknown command 'browsingContext.startScreencast'."),("type",String "error")])})
+browsingContextScreencastDemo :: BiDiDemo
+browsingContextScreencastDemo =
+  demo "Browsing Context - Start and Stop Screencast - since https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629" action
+  where
+    action :: DemoActions -> BiDiActions -> IO ()
+    action utils@MkDemoActions {..} bidi@MkBiDiActions {..} = do
+      bc <- rootContext utils bidi
+
+      contentPage <- contentPageUrl
+      logTxt "Navigate to content page for screencast recording"
+      navResult <- browsingContextNavigate $ MkNavigate {context = bc, url = contentPage, wait = Just Complete}
+      logShow "Navigation result" navResult
+      pause
+
+      logTxt "Test 1: Start screencast with default settings"
+      let screencastParams = MkStartScreencast
+            { context = bc,
+              mimeType = Nothing,
+              video = Nothing,
+              audio = Nothing
+            }
+      MkStartScreencastResult {screencast = screencastId1, path = path1} <- browsingContextStartScreencast screencastParams
+      logShow "Screencast started - default settings" (screencastId1, path1)
+      pause
+
+      logTxt "Stop screencast and retrieve recording"
+      MkStopScreencastResult {path = stopPath1, error = stopError1} <- browsingContextStopScreencast $ MkStopScreencast {screencast = screencastId1}
+      logShow "Screencast stopped" (stopPath1, stopError1)
+      pause
+
+      logTxt "Test 2: Start screencast with custom video constraints"
+      let customScreencast = MkStartScreencast
+            { context = bc,
+              mimeType = Just "video/webm",
+              video = Just $ MkMediaTrackConstraints
+                { width = Just $ MkJSUInt 1280,
+                  height = Just $ MkJSUInt 720,
+                  frameRate = Just $ MkJSUInt 30
+                },
+              audio = Just True
+            }
+      MkStartScreencastResult {screencast = screencastId2, path = path2} <- browsingContextStartScreencast customScreencast
+      logShow "Screencast started - 1280x720@30fps with audio" (screencastId2, path2)
+      pause
+
+      logTxt "Stop custom screencast"
+      MkStopScreencastResult {path = stopPath2, error = stopError2} <- browsingContextStopScreencast $ MkStopScreencast {screencast = screencastId2}
+      logShow "Custom screencast stopped" (stopPath2, stopError2)
       pause
diff --git a/test/BiDi/Demos/EmulationDemos.hs b/test/BiDi/Demos/EmulationDemos.hs
--- a/test/BiDi/Demos/EmulationDemos.hs
+++ b/test/BiDi/Demos/EmulationDemos.hs
@@ -11,12 +11,15 @@
     NetworkConditions (..),
     ScreenArea (..),
     ScreenOrientationOverride (..),
+    ScrollbarType (..),
     SetForcedColorsModeThemeOverride (..),
     SetGeolocationOverride (..),
     SetLocaleOverride (..),
     SetNetworkConditions (..),
     SetScreenOrientationOverride (..),
     SetScreenSettingsOverride (..),
+    SetScrollbarTypeOverride (..),
+    ScriptingOverride (..),
     SetScriptingEnabled (..),
     SetTimezoneOverride (..),
     SetTouchOverride (..),
@@ -84,7 +87,7 @@
 
       logTxt "Set geolocation position error"
       let positionError = MkGeolocationPositionError { errorType = "positionUnavailable" }
-      let errorOverride = MkSetGeolocationOverride
+          errorOverride = MkSetGeolocationOverride
             { override = PositionError positionError,
               contexts = Just [bc],
               userContexts = Nothing
@@ -326,7 +329,7 @@
 -- >>> runDemo emulationSetTouchOverrideDemo
 emulationSetTouchOverrideDemo :: BiDiDemo
 emulationSetTouchOverrideDemo =
-  demo "Emulation - Set Touch Override - since https://www.w3.org/TR/2026/WD-webdriver-bidi-20260109" action
+  demo "Emulation - Set Touch Override - since https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629" action
   where
     action :: DemoActions -> BiDiActions -> IO ()
     action utils@MkDemoActions {..} bidi@MkBiDiActions {..} = do
@@ -649,22 +652,62 @@
     action utils@MkDemoActions {..} bidi@MkBiDiActions {..} = do
       bc <- rootContext utils bidi
 
-      logTxt "Test 1: Disable JavaScript"
+      logTxt "Test 1: Force disable JavaScript"
       let disableJS = MkSetScriptingEnabled
-            { enabled = Just False,
+            { enabled = ForceDisableScripting,
               contexts = Just [bc],
               userContexts = Nothing
             }
       result1 <- emulationSetScriptingEnabled disableJS
-      logShow "JavaScript disabled" result1
+      logShow "JavaScript forcibly disabled" result1
       pause
 
-      logTxt "Test 2: Re-enable JavaScript (clear override)"
-      let enableJS = MkSetScriptingEnabled
-            { enabled = Nothing,
+      logTxt "Test 2: Restore default JavaScript state (clear override)"
+      let restoreJS = MkSetScriptingEnabled
+            { enabled = RestoreDefaultScripting,
               contexts = Just [bc],
               userContexts = Nothing
             }
-      result2 <- emulationSetScriptingEnabled enableJS
-      logShow "JavaScript re-enabled" result2
+      result2 <- emulationSetScriptingEnabled restoreJS
+      logShow "JavaScript restored to initial browser configuration" result2
+      pause
+
+-- >>> runDemo emulationSetScrollbarTypeOverrideDemo
+-- *** Exception: BiDIError (ProtocolException {error = UnknownCommand, description = "A command could not be executed because the remote end is not aware of it", message = "Unknown command 'emulation.setScrollbarTypeOverride'.", stacktrace = Nothing, errorData = Nothing, response = Object (fromList [("error",String "unknown command"),("id",Number 2.0),("message",String "Unknown command 'emulation.setScrollbarTypeOverride'."),("type",String "error")])})
+emulationSetScrollbarTypeOverrideDemo :: BiDiDemo
+emulationSetScrollbarTypeOverrideDemo =
+  demo "Emulation - Set Scrollbar Type Override - since https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629" action
+  where
+    action :: DemoActions -> BiDiActions -> IO ()
+    action utils@MkDemoActions {..} bidi@MkBiDiActions {..} = do
+      bc <- rootContext utils bidi
+
+      logTxt "Test 1: Set scrollbar type to classic (always-visible)"
+      let classicScrollbar = MkSetScrollbarTypeOverride
+            { scrollbarType = Classic,
+              contexts = Just [bc],
+              userContexts = Nothing
+            }
+      emulationSetScrollbarTypeOverride classicScrollbar
+      logTxt "Scrollbar type set to classic - always-visible (Windows/Linux style)"
+      pause
+
+      logTxt "Test 2: Set scrollbar type to overlay (auto-hiding)"
+      let overlayScrollbar = MkSetScrollbarTypeOverride
+            { scrollbarType = Overlay,
+              contexts = Just [bc],
+              userContexts = Nothing
+            }
+      emulationSetScrollbarTypeOverride overlayScrollbar
+      logTxt "Scrollbar type set to overlay - auto-hiding (macOS style)"
+      pause
+
+      logTxt "Test 3: Restore platform default scrollbar type"
+      let platformDefault = MkSetScrollbarTypeOverride
+            { scrollbarType = PlatformDefault,
+              contexts = Just [bc],
+              userContexts = Nothing
+            }
+      emulationSetScrollbarTypeOverride platformDefault
+      logTxt "Scrollbar type restored to platform default"
       pause
diff --git a/test/BiDi/Demos/WebExtensionDemos.hs b/test/BiDi/Demos/WebExtensionDemos.hs
--- a/test/BiDi/Demos/WebExtensionDemos.hs
+++ b/test/BiDi/Demos/WebExtensionDemos.hs
@@ -18,7 +18,6 @@
 _stopDemoUnusedWarning = runDemo
 
 -- >>> runDemo webExtensionInstallPathDemo
--- *** Exception: BiDIError (ProtocolException {error = UnknownError, description = "An unknown error occurred in the remote end while processing the command", message = "Method not available.", stacktrace = Just "Error\n    at new UnknownErrorException (<anonymous>:65:5630)\n    at CommandProcessor.processCommand (<anonymous>:485:13324)", errorData = Nothing, response = Object (fromList [("error",String "unknown error"),("id",Number 1.0),("message",String "Method not available."),("stacktrace",String "Error\n    at new UnknownErrorException (<anonymous>:65:5630)\n    at CommandProcessor.processCommand (<anonymous>:485:13324)"),("type",String "error")])})
 webExtensionInstallPathDemo :: BiDiDemo
 webExtensionInstallPathDemo =
   demo "WebExtension - Install from Path" action
diff --git a/test/DebugConfig.hs b/test/DebugConfig.hs
--- a/test/DebugConfig.hs
+++ b/test/DebugConfig.hs
@@ -3,22 +3,29 @@
   )
 where
 
+import Data.Text (Text)
 import Config
   ( Config (..),
     DemoBrowser (..),
   )
-import Data.Text (Text)
+import Const (Timeout, seconds)
 
+_sec :: Timeout
+_sec = seconds
+
 debugConfig :: Config
-debugConfig = 
+debugConfig =
   --
-  -- _firefoxSilent
-  -- _chromeSilent
+
+  -- _chromeDebug
   -- _firefoxHeadlessLogging
+  -- _firefoxDebug
+  -- _firefoxSilent
+  _chromeSilent
   -- _chromeHeadlessLogging
-  _firefoxDebug
-  -- _chromeDebug
+  -- _firefoxDebugNoPause 
 
+
 _firefoxSilent :: Config
 _firefoxSilent =
   MkConfig
@@ -46,9 +53,14 @@
       logging = True,
       httpUrl = "127.0.0.1",
       httpPort = 4444,
-      pauseMS = 0
+      pauseMS = 1_000
     }
 
+_firefoxDebugNoPause :: Config
+_firefoxDebugNoPause =
+  _firefoxDebug {pauseMS = 0}
+
+
 _chromeSilent :: Config
 _chromeSilent =
   MkConfig
@@ -81,4 +93,3 @@
 
 profilePath :: Maybe Text
 profilePath = Just "/home/john-walker/test-firefox-profile"
-
diff --git a/test/ErrorCoverageTest.hs b/test/ErrorCoverageTest.hs
--- a/test/ErrorCoverageTest.hs
+++ b/test/ErrorCoverageTest.hs
@@ -17,7 +17,7 @@
 {-
 !! Replace this the endepoints from the spec with every release
 !! remove full stops and replace tabs with " | "
-https://www.w3.org/TR/2025/WD-webdriver2-20251028 - W3C Editor's Draft 10 February 2025
+https://www.w3.org/TR/2026/WD-webdriver2-20260702 - W3C Working Draft 02 July 2026
 61 endpoints
 Error Code 	HTTP Status 	JSON Error Code 	Description 
 NOTE: This entry is moved out because it is duplicated, with a slightly different description in the BiDi spec
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -202,15 +202,12 @@
                 [ Browser.browserGetClientWindowsDemo,
                   Browser.browserCreateUserContextDemo,
                   Browser.browserGetUserContextsDemo,
-                  unknownCommand [Firefox', Chrome']
-                    Browser.browserSetClientWindowStateDemo,
+                  Browser.browserSetClientWindowStateDemo,
                   Browser.browserRemoveUserContextDemo,
                   Browser.browserCompleteWorkflowDemo,
                   expectFail [Firefox']
                     "Closing the browser in a session started with WebDriver classic is not supported"
                     Browser.browserCloseDemo,
-                  unknownCommand [Firefox']
-                    -- since https://www.w3.org/TR/2025/WD-webdriver-bidi-20250918/#command-browser-seProtocolExceptiontDownloadBehavior
                     Browser.browserSetDownloadBehaviorDemo
                 ],
               run
@@ -225,6 +222,12 @@
                   BrowsingContext.browsingContextContextLocatorDemo,
                   BrowsingContext.browsingContextPrintDemo,
                   BrowsingContext.browsingContextSetViewportDemo,
+                  unknownCommand [Firefox', Chrome']
+                    -- since https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629
+                    BrowsingContext.browsingContextSetBypassCSPDemo,
+                  unknownCommand [Firefox', Chrome']
+                    -- since https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629
+                    BrowsingContext.browsingContextScreencastDemo,
                   BiDiError.errorDemo
                   -- TODO: WHEN NEW DRIVERS ADDED make conditional - hangs in firefox
                   -- , BrowsingContext.browsingContextSetViewportResetDemo
@@ -241,19 +244,17 @@
                     "Expected \\\\\\\"coordinates\\\\\\\" to be an object"
                     Emulation.emulationSetGeolocationOverridePositionErrorDemo,
                   Emulation.emulationSetLocaleOverrideDemo,
-                  unknownCommand [Firefox']
-                    -- since https://www.w3.org/TR/2025/WD-webdriver-bidi-20251007
-                    Emulation.emulationSetNetworkConditionsDemo,
+                  Emulation.emulationSetNetworkConditionsDemo,
                   Emulation.emulationSetScreenOrientationOverrideDemo,
-                  unknownCommand [Chrome']
-                    -- since https://www.w3.org/TR/2025/WD-webdriver-bidi-20251120
-                    Emulation.emulationSetScreenSettingsOverrideDemo,
+                  Emulation.emulationSetScreenSettingsOverrideDemo,
                   unknownCommand [Firefox']
                     -- since https://www.w3.org/TR/2025/WD-webdriver-bidi-20250811
                     Emulation.emulationSetScriptingEnabledDemo,
-                  Emulation.emulationSetTimezoneOverrideDemo,
                   unknownCommand [Firefox', Chrome']
-                    -- since https://www.w3.org/TR/2026/WD-webdriver-bidi-20260109
+                    -- since https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629
+                    Emulation.emulationSetScrollbarTypeOverrideDemo,
+                  Emulation.emulationSetTimezoneOverrideDemo,
+                  unknownCommand [Firefox']
                     Emulation.emulationSetTouchOverrideDemo,
                   Emulation.emulationSetUserAgentOverrideDemo,
                   Emulation.emulationCompleteWorkflowDemo
@@ -356,9 +357,7 @@
               run
                 "WebExtension"
                 [ -- ChromeDriver doesn't support BiDi WebExtension methods
-                  expectFail [Chrome']
-                    "Method not available"
-                    WebExtension.webExtensionInstallPathDemo,
+                  WebExtension.webExtensionInstallPathDemo,
                   expectFail [Chrome']
                     "Archived and Base64 extensions are not supported"
                     WebExtension.webExtensionInstallArchiveDemo,
diff --git a/webdriver-precore.cabal b/webdriver-precore.cabal
--- a/webdriver-precore.cabal
+++ b/webdriver-precore.cabal
@@ -1,7 +1,7 @@
 cabal-version: 2.4
 
 name:           webdriver-precore
-version:        0.2.0.2
+version:        0.3.0.2
 homepage:       https://github.com/pyrethrum/webdriver-precore#readme
 bug-reports:    https://github.com/pyrethrum/webdriver-precore/issues
 author:         John Walker, Adrian Glouftsis
@@ -16,12 +16,12 @@
   README.md
   ChangeLog.md
 
-tested-with: GHC == 9.8.2 || == 9.8.4 || == 9.10.1
+tested-with: GHC == 9.8.2 || == 9.8.4 || == 9.10.1 || == 9.12.4
 
 synopsis:       A typed wrapper for W3C WebDriver (HTTP and BiDi) protocols.
 
 description:
-  This library provides typed definitions for the WebDriver W3C spec, both @<https://www.w3.org/TR/2025/WD-webdriver2-20251028/ HTTP>@ and @<https://www.w3.org/TR/2026/WD-webdriver-bidi-20260109/ BiDi>@.
+  This library provides typed definitions for the WebDriver W3C spec, both @<https://www.w3.org/TR/2026/WD-webdriver2-20260702/ HTTP>@ and @<https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629/ BiDi>@.
 
   It is designed as a foundation for building WebDriver client libraries providing type-safe endpoint definitions and response parsers without any client implementation.
 
@@ -30,6 +30,10 @@
   __For complete documentation, module organisation, and migration guides, see "WebDriverPreCore".__
   
   See also the @<https://github.com/pyrethrum/webdriver project repo>@ and the test directory for @<https://github.com/pyrethrum/webdriver/tree/main/webdriver-precore/test#readme examples>@.
+
+source-repository head
+  type:                git
+  location:            https://github.com/pyrethrum/webdriver-precore.git
   
 common commonExtensions
   default-extensions:
@@ -103,8 +107,8 @@
     -fbyte-code-and-object-code 
     -- -fdefer-type-errors
   cpp-options: 
-    -DHTMLSpecURL=https://www.w3.org/TR/2025/WD-webdriver2-20251028/
-    -DBiDiSpecURL=https://www.w3.org/TR/2026/WD-webdriver-bidi-20260109/
+    -DHTMLSpecURL=https://www.w3.org/TR/2026/WD-webdriver2-20260702/
+    -DBiDiSpecURL=https://www.w3.org/TR/2026/WD-webdriver-bidi-20260629/
 
 library utils-internal
   import: commonExtensions, commonGhcOptions
