@@ -48,7 +48,7 @@ <h2 class="section-title" id="header-classes">Classes</h2>
4848< dl >
4949< dt id ="scrapfly.browser_config.BrowserConfig "> < code class ="flex name class ">
5050< span > class < span class ="ident "> BrowserConfig</ span > </ span >
51- < span > (</ span > < span > proxy_pool: str | < a title ="scrapfly.browser_config.ProxyPool " href ="#scrapfly.browser_config.ProxyPool "> ProxyPool</ a > | None = None,< br > os: str | < a title ="scrapfly.browser_config.OperatingSystem " href ="#scrapfly.browser_config.OperatingSystem "> OperatingSystem</ a > | None = None,< br > session: str | None = None,< br > country: str | None = None,< br > auto_close: bool | None = None,< br > timeout: int | None = None,< br > debug: bool | None = None,< br > extensions: List[str] | None = None,< br > block_images: bool | None = None,< br > block_styles: bool | None = None,< br > block_fonts: bool | None = None,< br > block_media: bool | None = None,< br > screenshot: bool | None = None,< br > resolution: str | None = None,< br > target_url: str | None = None,< br > cache: bool | None = None,< br > blacklist: bool | None = None,< br > unblock: bool | None = None,< br > unblock_timeout: int | None = None,< br > browser_brand: str | None = None,< br > byop_proxy: str | None = None,< br > enable_mcp: bool | None = None,< br > solve_captcha: bool | None = None,< br > vault: str | None = None,< br > vault_key: str | None = None)</ span >
51+ < span > (</ span > < span > proxy_pool: str | < a title ="scrapfly.browser_config.ProxyPool " href ="#scrapfly.browser_config.ProxyPool "> ProxyPool</ a > | None = None,< br > os: str | < a title ="scrapfly.browser_config.OperatingSystem " href ="#scrapfly.browser_config.OperatingSystem "> OperatingSystem</ a > | None = None,< br > session: str | None = None,< br > country: str | None = None,< br > auto_close: bool | None = None,< br > timeout: int | None = None,< br > debug: bool | None = None,< br > extensions: List[str] | None = None,< br > block_images: bool | None = None,< br > block_styles: bool | None = None,< br > block_fonts: bool | None = None,< br > block_media: bool | None = None,< br > screenshot: bool | None = None,< br > resolution: str | None = None,< br > target_url: str | None = None,< br > cache: bool | None = None,< br > blacklist: bool | None = None,< br > unblock: bool | None = None,< br > unblock_timeout: int | None = None,< br > browser_brand: str | None = None,< br > byop_proxy: str | None = None,< br > enable_mcp: bool | None = None,< br > solve_captcha: bool | None = None,< br > vault: str | None = None,< br > vault_key: str | None = None,< br > enable_vnc: bool | None = None,< br > vnc_password: str | None = None,< br > enable_rtc: bool | None = None,< br > rtc_username: str | None = None,< br > rtc_password: str | None = None,< br > hitl_allowed_networks: str | List[str] | None = None)</ span >
5252</ code > </ dt >
5353< dd >
5454< details class ="source ">
@@ -86,6 +86,12 @@ <h2 class="section-title" id="header-classes">Classes</h2>
8686 solve_captcha: Optional[bool] = None,
8787 vault: Optional[str] = None,
8888 vault_key: Optional[str] = None,
89+ enable_vnc: Optional[bool] = None,
90+ vnc_password: Optional[str] = None,
91+ enable_rtc: Optional[bool] = None,
92+ rtc_username: Optional[str] = None,
93+ rtc_password: Optional[str] = None,
94+ hitl_allowed_networks: Optional[Union[str, List[str]]] = None,
8995 ):
9096 if timeout is not None and timeout > 1800:
9197 raise ValueError('timeout cannot exceed 1800 seconds (30 minutes)')
@@ -131,15 +137,33 @@ <h2 class="section-title" id="header-classes">Classes</h2>
131137 # automatically. Billed per solve; failures cost nothing.
132138 # https://scrapfly.io/docs/cloud-browser-api/captcha-solver
133139 self.solve_captcha = solve_captcha
134- # Cloud Browser Credential Vault binding. `vault` is the vault id
135- # (UUID) returned by POST /vault; `vault_key` is the base64 32-byte
140+ # Cloud Browser Credential Vault binding. `vault` is the vault NAME
141+ # (the human name you gave it at POST /vault — alphanumeric); the
142+ # server resolves it to the underlying vault scoped to your api-key's
143+ # project and environment. `vault_key` is the base64 32-byte
136144 # customer-held key returned (once) by POST /vault or POST
137145 # /vault/<id>/rotate. Both are forwarded as query params on the
138146 # wss:// URL — the server uses them to decrypt items into the
139147 # session's secret broker. Treat `vault_key` as a credential: never
140148 # log it, never persist it server-side.
141149 self.vault = vault
142150 self.vault_key = vault_key
151+ self.enable_vnc = enable_vnc
152+ self.vnc_password = vnc_password
153+ self.enable_rtc = enable_rtc
154+ self.rtc_username = rtc_username
155+ self.rtc_password = rtc_password
156+ if isinstance(hitl_allowed_networks, list):
157+ hitl_allowed_networks = ','.join(s.strip() for s in hitl_allowed_networks if s and s.strip())
158+ self.hitl_allowed_networks = hitl_allowed_networks or None
159+
160+ @staticmethod
161+ def project_salt(api_key: str) -> str:
162+ """Return the deterministic project salt for an api_key:
163+ sha256(api_key)[:8]. The server exposes the same value via the
164+ X-Browser-Project-Salt response header on a successful WS upgrade.
165+ """
166+ return hashlib.sha256(api_key.encode('utf-8')).hexdigest()[:8]
143167
144168 def websocket_url(self, api_key: str, host: Optional[str] = None) -> str:
145169 params = {'api_key': api_key}
@@ -219,6 +243,24 @@ <h2 class="section-title" id="header-classes">Classes</h2>
219243 if self.vault_key is not None:
220244 params['vault_key'] = self.vault_key
221245
246+ if self.enable_vnc is not None:
247+ params['enable_vnc'] = self._bool_to_http(self.enable_vnc)
248+
249+ if self.vnc_password is not None:
250+ params['vnc_password'] = self.vnc_password
251+
252+ if self.enable_rtc is not None:
253+ params['enable_rtc'] = self._bool_to_http(self.enable_rtc)
254+
255+ if self.rtc_username is not None:
256+ params['rtc_username'] = self.rtc_username
257+
258+ if self.rtc_password is not None:
259+ params['rtc_password'] = self.rtc_password
260+
261+ if self.hitl_allowed_networks is not None:
262+ params['hitl_allowed_networks'] = self.hitl_allowed_networks
263+
222264 base_host = host or self.CLOUD_BROWSER_HOST
223265 return base_host + '?' + urlencode(params)
224266
@@ -249,6 +291,12 @@ <h2 class="section-title" id="header-classes">Classes</h2>
249291 'solve_captcha': self.solve_captcha,
250292 'vault': self.vault,
251293 'vault_key': self.vault_key,
294+ 'enable_vnc': self.enable_vnc,
295+ 'vnc_password': self.vnc_password,
296+ 'enable_rtc': self.enable_rtc,
297+ 'rtc_username': self.rtc_username,
298+ 'rtc_password': self.rtc_password,
299+ 'hitl_allowed_networks': self.hitl_allowed_networks,
252300 }
253301
254302 @staticmethod
@@ -287,6 +335,12 @@ <h2 class="section-title" id="header-classes">Classes</h2>
287335 solve_captcha=browser_config_dict.get('solve_captcha', None),
288336 vault=browser_config_dict.get('vault', None),
289337 vault_key=browser_config_dict.get('vault_key', None),
338+ enable_vnc=browser_config_dict.get('enable_vnc', None),
339+ vnc_password=browser_config_dict.get('vnc_password', None),
340+ enable_rtc=browser_config_dict.get('enable_rtc', None),
341+ rtc_username=browser_config_dict.get('rtc_username', None),
342+ rtc_password=browser_config_dict.get('rtc_password', None),
343+ hitl_allowed_networks=browser_config_dict.get('hitl_allowed_networks', None),
290344 )</ code > </ pre >
291345</ details >
292346< div class ="desc "> </ div >
@@ -347,10 +401,36 @@ <h3>Static methods</h3>
347401 solve_captcha=browser_config_dict.get('solve_captcha', None),
348402 vault=browser_config_dict.get('vault', None),
349403 vault_key=browser_config_dict.get('vault_key', None),
404+ enable_vnc=browser_config_dict.get('enable_vnc', None),
405+ vnc_password=browser_config_dict.get('vnc_password', None),
406+ enable_rtc=browser_config_dict.get('enable_rtc', None),
407+ rtc_username=browser_config_dict.get('rtc_username', None),
408+ rtc_password=browser_config_dict.get('rtc_password', None),
409+ hitl_allowed_networks=browser_config_dict.get('hitl_allowed_networks', None),
350410 )</ code > </ pre >
351411</ details >
352412< div class ="desc "> </ div >
353413</ dd >
414+ < dt id ="scrapfly.browser_config.BrowserConfig.project_salt "> < code class ="name flex ">
415+ < span > def < span class ="ident "> project_salt</ span > </ span > (< span > api_key: str) ‑> str</ span >
416+ </ code > </ dt >
417+ < dd >
418+ < details class ="source ">
419+ < summary >
420+ < span > Expand source code</ span >
421+ </ summary >
422+ < pre > < code class ="python "> @staticmethod
423+ def project_salt(api_key: str) -> str:
424+ """Return the deterministic project salt for an api_key:
425+ sha256(api_key)[:8]. The server exposes the same value via the
426+ X-Browser-Project-Salt response header on a successful WS upgrade.
427+ """
428+ return hashlib.sha256(api_key.encode('utf-8')).hexdigest()[:8]</ code > </ pre >
429+ </ details >
430+ < div class ="desc "> < p > Return the deterministic project salt for an api_key:
431+ sha256(api_key)[:8]. The server exposes the same value via the
432+ X-Browser-Project-Salt response header on a successful WS upgrade.</ p > </ div >
433+ </ dd >
354434</ dl >
355435< h3 > Methods</ h3 >
356436< dl >
@@ -389,6 +469,12 @@ <h3>Methods</h3>
389469 'solve_captcha': self.solve_captcha,
390470 'vault': self.vault,
391471 'vault_key': self.vault_key,
472+ 'enable_vnc': self.enable_vnc,
473+ 'vnc_password': self.vnc_password,
474+ 'enable_rtc': self.enable_rtc,
475+ 'rtc_username': self.rtc_username,
476+ 'rtc_password': self.rtc_password,
477+ 'hitl_allowed_networks': self.hitl_allowed_networks,
392478 }</ code > </ pre >
393479</ details >
394480< div class ="desc "> </ div >
@@ -479,6 +565,24 @@ <h3>Methods</h3>
479565 if self.vault_key is not None:
480566 params['vault_key'] = self.vault_key
481567
568+ if self.enable_vnc is not None:
569+ params['enable_vnc'] = self._bool_to_http(self.enable_vnc)
570+
571+ if self.vnc_password is not None:
572+ params['vnc_password'] = self.vnc_password
573+
574+ if self.enable_rtc is not None:
575+ params['enable_rtc'] = self._bool_to_http(self.enable_rtc)
576+
577+ if self.rtc_username is not None:
578+ params['rtc_username'] = self.rtc_username
579+
580+ if self.rtc_password is not None:
581+ params['rtc_password'] = self.rtc_password
582+
583+ if self.hitl_allowed_networks is not None:
584+ params['hitl_allowed_networks'] = self.hitl_allowed_networks
585+
482586 base_host = host or self.CLOUD_BROWSER_HOST
483587 return base_host + '?' + urlencode(params)</ code > </ pre >
484588</ details >
@@ -571,6 +675,7 @@ <h4><code><a title="scrapfly.browser_config.BrowserConfig" href="#scrapfly.brows
571675< ul class ="">
572676< li > < code > < a title ="scrapfly.browser_config.BrowserConfig.CLOUD_BROWSER_HOST " href ="#scrapfly.browser_config.BrowserConfig.CLOUD_BROWSER_HOST "> CLOUD_BROWSER_HOST</ a > </ code > </ li >
573677< li > < code > < a title ="scrapfly.browser_config.BrowserConfig.from_dict " href ="#scrapfly.browser_config.BrowserConfig.from_dict "> from_dict</ a > </ code > </ li >
678+ < li > < code > < a title ="scrapfly.browser_config.BrowserConfig.project_salt " href ="#scrapfly.browser_config.BrowserConfig.project_salt "> project_salt</ a > </ code > </ li >
574679< li > < code > < a title ="scrapfly.browser_config.BrowserConfig.to_dict " href ="#scrapfly.browser_config.BrowserConfig.to_dict "> to_dict</ a > </ code > </ li >
575680< li > < code > < a title ="scrapfly.browser_config.BrowserConfig.websocket_url " href ="#scrapfly.browser_config.BrowserConfig.websocket_url "> websocket_url</ a > </ code > </ li >
576681</ ul >
0 commit comments