{"record":{"id":"eed29feba4cf38e6","repo":"SeleniumHQ/selenium","slug":"response-status-response-status-text-respons","errorCode":null,"errorMessage":"{response.status} {response.status_text}: {response.url}","messagePattern":"\\{response\\.status\\} \\{response\\.status_text\\}: \\{response\\.url\\}","errorType":"http","errorClass":"APIRequestFailure","httpStatus":null,"severity":"error","filePath":"py/selenium/webdriver/common/api_request_context.py","lineNumber":505,"sourceCode":"\n        body = self._prepare_body(headers, kwargs)\n        url = self._append_params(url, kwargs)\n        resp = self._execute_request(method, url, headers, body, kwargs)\n\n        # After redirects, associate cookies with the final destination's\n        # origin, not the initial request URL.\n        final_url = _resolve_redirect_url(resp, url)\n\n        # Process response cookies\n        set_cookie_headers = _get_set_cookie_headers(resp)\n        if set_cookie_headers:\n            self._handle_response_cookies(set_cookie_headers, final_url)\n\n        response = self._build_response(resp, final_url)\n\n        fail = kwargs.get(\"fail_on_status_code\", self._fail_on_status_code)\n        if fail and not response.ok:\n            raise APIRequestFailure(response)\n\n        return response\n\n\nclass APIRequestContext(_BaseRequestContext):\n    \"\"\"Makes HTTP requests with automatic browser cookie synchronization.\n\n    Cookies from the browser session are sent with API requests, and cookies\n    from API responses are synced back to the browser.\n\n    Args:\n        driver: The WebDriver instance to sync cookies with.\n        base_url: Optional base URL prepended to relative request paths.\n        extra_headers: Optional headers included in every request.\n        timeout: Default request timeout in seconds.\n        max_redirects: Maximum number of redirects to follow.\n        fail_on_status_code: If True, raise APIRequestFailure for non-2xx responses.\n    \"\"\"","sourceCodeStart":487,"sourceCodeEnd":523,"githubUrl":"https://github.com/SeleniumHQ/selenium/blob/aa36b38e696a0909e973bdf5e2f9031ffe842c4b/py/selenium/webdriver/common/api_request_context.py#L487-L523","documentation":"`APIRequestFailure` is raised when an API request (via `APIRequestContext` or `APIRequestContext.new_context`) returns a non-2xx status AND `fail_on_status_code` is True. The message shows the status code, status text, and final URL (after redirects). This mirrors Playwright's API testing failure semantics. When `fail_on_status_code` is False, the response object is returned instead and you inspect `.ok`/`.status` yourself.","triggerScenarios":"`api_context.get(\"https://api.example.com/missing\", fail_on_status_code=True)` hitting a 404; a 500 from the server; auth failure (401/403); or any non-2xx when the context was constructed with `fail_on_status_code=True`.","commonSituations":"Endpoint returns an error during integration tests; expired auth token causing 401; rate limiting (429); a mistyped URL returning 404; server-side 500 during load.","solutions":["Set `fail_on_status_code=False` and inspect `response.ok`/`response.status` yourself for conditional handling.","Wrap the call in try/except APIRequestFailure and read `e.response.status` to branch.","Fix the upstream endpoint/auth so it returns 2xx.","Add retry with backoff for transient 5xx/429."],"exampleFix":"// before\nresp = api_context.get(url)  # raises APIRequestFailure on non-2xx\n// after\nresp = api_context.get(url, fail_on_status_code=False)\nif not resp.ok:\n    print(\"got\", resp.status, resp.url)","handlingStrategy":"try-catch","validationCode":"resp = api_context.get(url, fail_on_status_code=False)\nif not resp.ok:\n    handle_error(resp.status, resp.url, resp.text())","typeGuard":"def is_failing_status(resp) -> bool:\n    return not (200 <= resp.status <= 299)","tryCatchPattern":"from selenium.webdriver.common.api_request_context import APIRequestFailure\ntry:\n    resp = api_context.get(url)\nexcept APIRequestFailure as e:\n    if e.response.status in (401, 403):\n        refresh_auth()\n    elif e.response.status >= 500:\n        retry()\n    else:\n        raise","preventionTips":["Use fail_on_status_code=False for robust branching on status.","Retry transient 5xx/429 with backoff.","Inspect e.response.status to differentiate error classes."],"tags":["api-request","http","status-code","network"],"backgroundTag":null,"analyzedSha":"aa36b38e696a0909e973bdf5e2f9031ffe842c4b","analyzedAt":"2026-08-14T02:32:32.244Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}