browser-use/browser-use · error · CloudBrowserAuthError

Access forbidden. Please check your browser-use cloud subscr

Error message

Access forbidden. Please check your browser-use cloud subscription status.

What it means

Cloud browser creation returned HTTP 403: authentication succeeded but the account is not entitled to the requested operation — subscription inactive/lapsed, plan limits, or a feature (e.g. cloud profiles, specific proxy regions) not included in the plan. Distinct from 401 (bad credentials); this is an authorization/entitlement failure.

Source

Thrown at browser_use/browser/cloud/cloud.py:73

			)

		headers = {'X-Browser-Use-API-Key': api_token, 'Content-Type': 'application/json', **(extra_headers or {})}

		# Convert request to dictionary and exclude unset fields
		request_body = request.model_dump(exclude_unset=True)

		try:
			logger.info('🌤️ Creating cloud browser instance...')

			response = await self.client.post(url, headers=headers, json=request_body)

			if response.status_code == 401:
				raise CloudBrowserAuthError(
					'BROWSER_USE_API_KEY is invalid. Get a new key at:\n'
					'https://cloud.browser-use.com/new-api-key?utm_source=oss&utm_medium=use_cloud'
				)
			elif response.status_code == 403:
				raise CloudBrowserAuthError('Access forbidden. Please check your browser-use cloud subscription status.')
			elif not response.is_success:
				error_msg = f'Failed to create cloud browser: HTTP {response.status_code}'
				try:
					error_data = response.json()
					if 'detail' in error_data:
						error_msg += f' - {error_data["detail"]}'
				except Exception:
					pass
				raise CloudBrowserError(error_msg)

			browser_data = response.json()
			browser_response = CloudBrowserResponse(**browser_data)

			# Store session ID for cleanup
			self.current_session_id = browser_response.id

			logger.info(f'🌤️ Cloud browser created successfully: {browser_response.id}')
			logger.debug(f'🌤️ CDP URL: {browser_response.cdpUrl}')

View on GitHub (pinned to 6c73fced2f)

Solutions

  1. Check subscription status in the browser-use cloud dashboard and reactivate/upgrade if lapsed.
  2. Lower request scope to plan limits (e.g. `cloud_timeout=15` on free tier, standard proxy regions).
  3. Confirm the key belongs to the account/workspace that owns the profile or feature being requested.

Example fix

# before
browser = Browser(use_cloud=True, cloud_timeout=60)  # free tier max is 15 -> 403

# after
browser = Browser(use_cloud=True, cloud_timeout=15)
Defensive patterns

Strategy: try-catch

Validate before calling

# Stay within plan limits up front
cloud_timeout = 15  # free-tier max; raise only with a paid plan
browser = Browser(use_cloud=True, cloud_timeout=cloud_timeout)

Try / catch

from browser_use.browser.cloud.cloud import CloudBrowserAuthError
try:
    browser = Browser(use_cloud=True)
except CloudBrowserAuthError as e:
    if 'forbidden' in str(e).lower():
        logger.error('403: check subscription/entitlement in the cloud dashboard before retrying')
    raise

Prevention

When it happens

Trigger: `Browser(use_cloud=True)` or `cloud_profile_id=...` while the account has no active cloud subscription; requesting paid features (long `cloud_timeout`, premium proxy country) on a free plan; team key without permission for the target project/profile.

Common situations: Trial expired between runs; billing lapsed; using a colleague's key scoped to a different workspace; free-tier `cloud_timeout` above the 15-minute maximum.

Understand the failure class

Related errors


AI-assisted analysis of browser-use/browser-use@6c73fced2f (2026-08-14). Data as JSON: /api/errors/59a3ac8b195e9731. Report an issue: GitHub.