{"id":41136,"date":"2026-10-02T11:37:40","date_gmt":"2026-10-02T11:37:40","guid":{"rendered":"https:\/\/nodemaven.com\/?p=41136"},"modified":"2026-10-02T11:39:06","modified_gmt":"2026-10-02T11:39:06","slug":"403-client-error-forbidden-for-url","status":"publish","type":"post","link":"https:\/\/nodemaven.com\/ru\/blog\/403-client-error-forbidden-for-url\/","title":{"rendered":"How to Fix 403 Client Error: Forbidden for URL in Python with One Controlled Benchmark"},"content":{"rendered":"<p class=\"wp-block-paragraph\">403 Client Error: Forbidden for URL means <strong>Python reached the server, received a 403 response, and raised an<\/strong> <strong>HTTPError<\/strong> <strong>when the status was checked<\/strong>. The error confirms that the request was refused, but it does not identify which part of the setup caused the refusal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the resource requires access your account does not have, <strong>correct the token, role, session, or permission first<\/strong>. If the page is public or opens in a normal browser, use NodeMaven\u2019s open-source <a href=\"https:\/\/github.com\/nodemaven\/proxy-benchmark\">proxy-benchmark<\/a> \u043a\u044a\u043c <strong>test which part of the request setup changes the result<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The repository is part of <a href=\"https:\/\/github.com\/nodemaven\"><strong>NodeMaven\u2019s GitHub<\/strong><\/a>, which provides open-source tools for proxy, browser, and connection testing. Our <a href=\"https:\/\/nodemaven.com\/ru\/blog\/how-to-bypass-403-forbidden-error\/\">general guide to 403 Forbidden errors<\/a> covers broader fixes for the status code; this guide focuses on <strong>the Python Requests exception and a reproducible benchmark workflow<\/strong>.<\/p>\n\n\n\n<h2 id=\"h-why-does-python-requests-raise-this-403-error\" class=\"wp-block-heading\"><strong>Why does Python Requests raise this 403 error?<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Python Requests can <strong>connect to the server and receive a response successfully<\/strong>, then raise requests.exceptions.HTTPError because raise_for_status() found a 403 status.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this example, requests.get() receives the response. The exception occurs on the following line, when Requests checks its status:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"import%20requests%0A%0Aresponse%20%3D%20requests.get%28%22https%3A%2F%2Fexample.com%2Fresource%22%2C%20timeout%3D30%29%0Aresponse.raise_for_status%28%29\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\"><strong>A 403 confirms that Python received an HTTP response<\/strong>, unlike a connection failure or timeout. The status still does not show why the server refused the request.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0417\u043e\u043d\u0430 <a href=\"https:\/\/requests.readthedocs.io\/en\/latest\/user\/quickstart\/#errors-and-exceptions\">Requests documentation<\/a> explains this behavior: raise_for_status() raises HTTPError after an unsuccessful response. From there, proxy-benchmark can <strong>test whether the refusal follows a specific part of the setup<\/strong>. It also records transport or harness failures that produce no target verdict, while its gateway-health command checks whether the proxy gateway accepts the connection.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We used the same comparison method in our <a href=\"https:\/\/nodemaven.com\/ru\/blog\/browser-automation-benchmark\/\">browser automation benchmark<\/a>. With proxy-benchmark, the study ran <strong>3,816 Amazon product-search attempts across eight automation setups<\/strong>, while keeping the target, host, gateway configuration, session pattern, and test harness fixed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0417\u043e\u043d\u0430 <strong>testing scripts, run rows, and analysis are public<\/strong>, so developers can inspect the method or rerun the comparison with their own proxy. Raw rows are stored under data\/runs\/, generated tables appear in RESULTS.md, and NOTEBOOK.md documents the analysis.<\/p>\n\n\n\n<h2 id=\"h-how-to-run-proxy-benchmark\" class=\"wp-block-heading\"><strong>How to run<\/strong> <strong>proxy-benchmark<\/strong><\/h2>\n\n\n\n<h3 id=\"h-run-the-free-direct-baseline\" class=\"wp-block-heading\"><strong>Run the free direct baseline<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u041d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441 <strong>plain HTTP request to DuckDuckGo without a proxy<\/strong>. This baseline requires no proxy account or browser download and does not consume proxy traffic.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"git%20clone%20https%3A%2F%2Fgithub.com%2Fnodemaven%2Fproxy-benchmark%0Acd%20proxy-benchmark%0Apython%20-m%20venv%20.venv\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">Activate the virtual environment in Windows PowerShell:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"plaintext\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-plaintext\" data-rhino-code=\".venv%5CScripts%5CActivate.ps1\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">\u041d\u0430 macOS \u0438\u043b\u0438 Linux:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\".%20.venv%2Fbin%2Factivate\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">Install the core requirements and run five direct attempts:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"pip%20install%20-r%20requirements-core.txt%0A%0Apython%20scripts%2Fbenchmark.py%20--engines%20http%20--targets%20ddg_serp%20--queries%205%20--direct%20--preset%20none\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">The command <strong>prints the test plan, one line for each attempt, and a final summary<\/strong>. It confirms that the harness runs correctly before you add a proxy or browser engine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check the available commands and preview a benchmark before sending traffic:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"python%20-m%20nmbench%0A%0Apython%20-m%20nmbench%20benchmark%20--dry-run\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">The dry run <strong>reports unavailable engines and their installation requirements<\/strong>. It also estimates traffic before the benchmark starts.<\/p>\n\n\n\n<h3 id=\"h-add-a-proxy-you-already-use\" class=\"wp-block-heading\"><strong>Add a proxy you already use<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The repository includes a custom provider definition for <strong>a proxy with one host, port, login, and password<\/strong>. Add the following values to .env:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"plaintext\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-plaintext\" data-rhino-code=\"CUSTOM_HOST%3D1.2.3.4%0ACUSTOM_PORT%3D8000%0ACUSTOM_LOGIN%3Dyour_login%0ACUSTOM_PASSWORD%3Dyour_password\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">Check the gateway before sending traffic to a scraping target:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"python%20-m%20nmbench%20gateway-health%20--provider%20custom\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">The health check opens <strong>ten CONNECT requests without contacting a scraping target<\/strong>. It can show whether the gateway is reachable and whether it accepts the supplied credentials.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once the gateway responds, run the plain HTTP client through the proxy:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"python%20scripts%2Fbenchmark.py%20--providers%20custom%20--engines%20http%20--targets%20bing_serp%20--queries%2020%20--preset%20none\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">The basic custom definition does not contain country or sticky-session parameters. You can still <strong>compare clients, browser engines, targets, and direct versus proxied connections<\/strong>, but the benchmark cannot test rotation or country selection unless those settings are described in a provider definition.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the credentials or username format are unclear, our <a href=\"https:\/\/nodemaven.com\/ru\/blog\/proxy-authentication-guide\/\">\u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0441\u0438<\/a> covers common authentication patterns. The <a href=\"https:\/\/nodemaven.com\/ru\/blog\/how-to-use-curl-with-proxy\/\">curl proxy guide<\/a> provides standalone HTTP, HTTPS, and SOCKS examples.<\/p>\n\n\n\n<h3 id=\"h-add-a-provider-with-country-or-session-parameters\" class=\"wp-block-heading\"><strong>Add a provider with country or session parameters<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If the provider encodes countries, sessions, or other settings in the proxy username, copy the repository template:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"cp%20data%2Fproviders%2F_template.toml%20data%2Fproviders%2Fyourvendor.toml\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">Describe the provider\u2019s parameter names and separators in that file. Then add its credentials to .env:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"plaintext\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-plaintext\" data-rhino-code=\"YOURVENDOR_LOGIN%3Dyour_login%0A%0AYOURVENDOR_PASSWORD%3Dyour_password\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">To compare it with NodeMaven, you must also add the NodeMaven credentials required by the included nodemaven provider definition. Then run:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"python%20scripts%2Fbenchmark.py%20--providers%20nodemaven%2Cyourvendor%20--engines%20patchright%20--targets%20google_serp%20--queries%2040%20--batch%201\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">This command also requires <strong>Patchright and its browser dependency to be installed<\/strong>. Run &#8211;dry-run first to confirm that the engine and both provider configurations are available.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The repository ships with provider definitions for <strong>NodeMaven, Decodo, Oxylabs, a Bright Data ISP zone, and a generic custom proxy<\/strong>. Each definition states whether its configuration was measured or transcribed from provider documentation. The dry run displays that provenance before the matrix starts.<\/p>\n\n\n\n<h3 id=\"h-compare-the-same-browser-with-and-without-a-proxy\" class=\"wp-block-heading\"><strong>Compare the same browser with and without a proxy<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The :direct suffix runs an engine <strong>without the proxy inside the same benchmark matrix<\/strong>. This provides a direct control during the same test window as the proxied attempts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To compare a custom proxy with a direct connection, run:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">python scripts\/benchmark.py &#8211;providers custom &#8211;engines chromium,chromium:direct,camoufox &#8211;targets amazon_search &#8211;queries 100 &#8211;batch 10<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this matrix:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>chromium runs through the custom proxy.<\/li>\n\n\n\n<li>chromium:direct runs the same engine without the proxy.<\/li>\n\n\n\n<li>camoufox adds a separate browser-engine comparison through the proxy.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If direct Chromium receives the requested page while proxied Chromium receives a block, <strong>the connection path is the variable that changed<\/strong>. The result does not automatically identify the provider or exit IP as the final cause, but it shows where to continue testing.<\/p>\n\n\n\n<h3 id=\"h-compare-http-clients-and-browser-engines\" class=\"wp-block-heading\"><strong>Compare HTTP clients and browser engines<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The repository supports <strong>plain HTTP clients, unmodified browsers, patched browsers, CDP drivers, and browser automation frameworks<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Engine<\/strong><\/td><td><strong>Role in the benchmark<\/strong><\/td><\/tr><tr><td>http<\/td><td>Plain Requests client without a browser or JavaScript<\/td><\/tr><tr><td>curlcffi<\/td><td>Scriptless client using a Chrome-like TLS handshake<\/td><\/tr><tr><td>chromium<\/td><td>Unmodified Playwright Chromium control<\/td><\/tr><tr><td>patchright<\/td><td>Playwright-based Chromium with automation indicators patched<\/td><\/tr><tr><td>rebrowser<\/td><td>Playwright-based Chromium with the Runtime.enable leak patched<\/td><\/tr><tr><td>camoufox<\/td><td>Patched Firefox controlled through Playwright<\/td><\/tr><tr><td>cloak<\/td><td>Patched Chromium exposed through a Playwright browser<\/td><\/tr><tr><td>obscura<\/td><td>Rust browser controlled over CDP<\/td><\/tr><tr><td>seleniumbase<\/td><td>SeleniumBase UC mode using the installed Chrome browser<\/td><\/tr><tr><td>zendriver<\/td><td>Installed Chrome controlled through raw CDP<\/td><\/tr><tr><td>botasaurus<\/td><td>Installed Chrome controlled through a scraping framework and raw CDP<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Run only the <strong>engines available in your environment<\/strong>. The dry run names missing dependencies and provides the corresponding installation command.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The plain HTTP client provides a low-traffic baseline, while stock Chromium acts as the unmodified browser control. The remaining engines let you test whether a different client or browser implementation changes delivery.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u041a\u0430\u043a<\/strong> <strong>proxy-benchmark<\/strong> <strong>judges each response<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">proxy-benchmark evaluates registered targets using <strong>target-specific content markers instead of treating every HTTP 200 response as a success<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>\u0412\u0435\u0440\u0434\u0438\u043a\u0442<\/strong><\/td><td><strong>Meaning in the repository<\/strong><\/td><\/tr><tr><td>ok<\/td><td>The target returned the requested page<\/td><\/tr><tr><td>\u041a\u0410\u041f\u0427\u0410<\/td><td>A challenge appeared before the requested result<\/td><\/tr><tr><td>consent<\/td><td>A consent or cookie wall remained in front of the result<\/td><\/tr><tr><td>block<\/td><td>The target refused the address<\/td><\/tr><tr><td>throttle<\/td><td>Amazon returned its throttle page<\/td><\/tr><tr><td>empty<\/td><td>A body arrived without the requested result<\/td><\/tr><tr><td>\u043e\u0448\u0438\u0431\u043a\u0430<\/td><td>The attempt did not complete, so no target verdict was produced<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">This classification detects <strong>blocked pages that arrive with successful or inconsistent HTTP statuses<\/strong>. In the repository\u2019s completed runs, the same Google reCAPTCHA page appeared with both 429 and 200 statuses. Amazon\u2019s throttle page appeared with both 503 and 200 statuses.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A scraper that counts every 200 response as successful could therefore record <strong>a CAPTCHA, throttle page, or incomplete result as valid content<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Generate a report or inspect individual attempt rows after the benchmark:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"python%20scripts%2Fanalysis%2Freport.py%0A%0Apython%20scripts%2Fanalysis%2Fpeek.py%20data%2Fruns%2Fbenchmark_%3Cstamp%3E.jsonl%0A%0Apython%20scripts%2Fanalysis%2Fcalibrate.py\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">Replace &lt;stamp&gt; with the timestamp from the relevant run filename. The report summarizes the comparison, peek.py displays individual rows, and calibrate.py measures transferred bytes for future traffic estimates.<\/p>\n\n\n\n<h2 id=\"h-can-proxy-benchmark-test-your-own-url\" class=\"wp-block-heading\"><strong>\u041c\u043e\u0447\u044c<\/strong> <strong>proxy-benchmark<\/strong> <strong>test your own URL?<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Yes, but you must register the target first.<\/strong> proxy-benchmark needs target-specific rules in nmbench\/targets.py so it can distinguish the requested page from a CAPTCHA, consent wall, block, throttle page, or empty response. It cannot accurately classify an arbitrary URL from the URL alone.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Four targets carry the repository\u2019s published benchmark results:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>google_serp<\/li>\n\n\n\n<li>amazon_search<\/li>\n\n\n\n<li>bing_serp<\/li>\n\n\n\n<li>ddg_serp<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The registry also contains <strong>Walmart Search, Google Maps, Lazada, and Shopee<\/strong>, although these targets have fewer published runs. The ipinfo entry checks the connection path and exit address rather than page delivery.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To test another website, add it to nmbench\/targets.py and define the content markers for each possible verdict. Build the rules from <strong>response bodies collected during real runs<\/strong>, since a successfully delivered page can still contain hidden challenge-related text.<\/p>\n\n\n\n<h2 id=\"h-what-should-you-test-after-the-benchmark-identifies-a-variable\" class=\"wp-block-heading\"><strong>What should you test after the benchmark identifies a variable?<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>If changing one variable changes the result, investigate that part of the setup next.<\/strong> For example, if the direct request works but the proxied request fails, check the proxy path. After making a change, rerun the same benchmark to confirm that the 403 no longer appears.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>What changed the outcome<\/strong><\/td><td><strong>What to test next<\/strong><\/td><\/tr><tr><td>Direct versus proxied connection<\/td><td>Gateway health, exit type, session behavior, country, or provider<\/td><\/tr><tr><td>Plain HTTP versus browser<\/td><td>Client behavior, JavaScript execution, browser environment, or request flow<\/td><\/tr><tr><td>Browser engine<\/td><td>Run the leading and failing engines again while keeping the proxy, target, host, and time window fixed<\/td><\/tr><tr><td>\u0421\u0442\u0440\u0430\u043d\u0430<\/td><td>Repeat the same client and workload across the required locations<\/td><\/tr><tr><td>Host machine<\/td><td>Compare the runtime, browser build, network path, and machine-level environment<\/td><\/tr><tr><td>\u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a<\/td><td>Repeat the interleaved provider matrix with the same target, engine, settings, and test window<\/td><\/tr><tr><td>Incomplete attempt with no target verdict<\/td><td>Inspect the saved failure reason, run gateway-health, and confirm that the selected engine can start<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A benchmark result identifies <strong>where the outcome changes<\/strong>, not every mechanism behind that change. Keep the other variables fixed while testing the affected part of the stack.<\/p>\n\n\n\n<h3 id=\"h-when-the-proxy-changes-the-response\" class=\"wp-block-heading\"><strong>When the proxy changes the response<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If the same client works directly but fails through the proxy, <strong>rerun the comparison with NodeMaven\u2019s quality-filtered proxies before replacing the browser or rewriting the scraper<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 <a href=\"https:\/\/nodemaven.com\/ru\/proxies\/residential-proxies\/\">\u0440\u0435\u0437\u0438\u0434\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u043a\u0441\u0438<\/a> for location targeting, rotation, and sticky sessions; <a href=\"https:\/\/nodemaven.com\/ru\/proxies\/mobile-proxies\/\">\u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u043a\u0441\u0438.<\/a> for mobile-network IPs; or <a href=\"https:\/\/nodemaven.com\/ru\/proxies\/isp-proxies\/\">ISP \u043f\u0440\u043e\u043a\u0441\u0438<\/a> for static ISP-assigned addresses and longer sessions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When connecting NodeMaven to your application, use the <a href=\"https:\/\/github.com\/nodemaven\/nodemaven-python\">Python SDK<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/github.com\/nodemaven\/nodemaven-rust\">Rust SDK<\/a> \u043a\u044a\u043c <strong>build and validate the proxy configuration before sending a request<\/strong>. The SDKs catch unsupported or misspelled parameters locally, preventing country, session, or filtering settings from being silently ignored.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The benchmark also accepts <strong>proxies from other providers through its custom configuration<\/strong>. To compare provider-specific country or session settings, describe them in a TOML provider definition and check the planned matrix with &#8211;dry-run before sending traffic.<\/p>\n\n\n\n<h2 id=\"h-run-proxy-benchmark-on-your-own-stack\" class=\"wp-block-heading\"><strong>\u0411\u0435\u0433\u0438<\/strong> <strong>proxy-benchmark<\/strong> <strong>on your own stack<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Clone <a href=\"https:\/\/github.com\/nodemaven\/proxy-benchmark\">nodemaven\/proxy-benchmark<\/a> \u0438 <strong>reproduce the failed request under controlled conditions<\/strong>. The repository includes the test harness, setup instructions, committed run data, and analysis commands needed to compare the results.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Start with the free direct baseline, configure the target and proxy path you want to test, and <strong>change one variable at a time<\/strong>. Each attempt is saved as a JSONL row so you can inspect which configuration produced the requested page, a block, a challenge, or an incomplete attempt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For more developer tools, explore our selection of <a href=\"https:\/\/nodemaven.com\/ru\/blog\/14-open-source-github-repos-for-web-scraping-in-2026\/\">open-source GitHub repositories for web scraping<\/a>.<\/p>\n\n\n\n<h2 id=\"h-frequently-asked-questions\" class=\"wp-block-heading translation-block\"><strong>\u0427\u0430\u0441\u0442\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435<\/strong> \u0432\u043e\u043f\u0440\u043e\u0441\u044b<\/h2>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-faq so-widget-rhinocore-addons-faq-default-d75171398898\"\n\t\t\t\n\t\t>    <div class=\"rhino-widget rhino-widget--rhinocore-addons-faq section-faq\" data-nm-label=\"faq\">\n        <div class=\"section-faq__list section-faq__list--columns-1\" role=\"list\" aria-label=\"\u0427\u0430\u0441\u0442\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u0440\u043e\u043a\u0441\u0438 \u0432 Telegram\">\n                            <div class=\"section-faq__column\">\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Why does raise_for_status() produce 403 Client Error: Forbidden for URL?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p><span style=\"font-weight: 400\">raise_for_status()<\/span> <b>checks the received HTTP status and raises <\/b><b>HTTPError<\/b><b> when the response is 403<\/b><span style=\"font-weight: 400\">. The exception shows the status and URL, but it does not explain why the server refused the request. Log the response body, headers, and final URL before calling <\/span><span style=\"font-weight: 400\">raise_for_status()<\/span><span style=\"font-weight: 400\">.<\/span><\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Does a 403 mean my proxy is blocked?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p><span style=\"font-weight: 400\">\u041d\u0435\u0442. <\/span><b>A 403 does not identify the proxy as the cause.<\/b><span style=\"font-weight: 400\"> Compare the same client directly and through the proxy under the same conditions. If only the proxied request fails, investigate the gateway, exit IP, country, and session configuration. If both fail, check permissions, the client, the host machine, and the target itself.<\/span><\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Why does a URL work in Chrome but return 403 in Python Requests?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p><span style=\"font-weight: 400\">Chrome and Requests use <\/span><b>different browser capabilities, connection behavior, and TLS handshakes<\/b><span style=\"font-weight: 400\">. Run the plain HTTP client and stock Chromium through the same proxy in <\/span><span style=\"font-weight: 400\">proxy-benchmark<\/span><span style=\"font-weight: 400\">. If Chromium receives the requested page while the HTTP client receives a block, continue testing the client path rather than replacing the proxy first.<\/span><\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Can proxy-benchmark test any URL?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p><b>Yes, after the target has been registered.<\/b><span style=\"font-weight: 400\"> Add the site to <\/span><span style=\"font-weight: 400\">nmbench\/targets.py<\/span><span style=\"font-weight: 400\"> and define content markers from real response bodies so the benchmark can distinguish the requested page from challenges, blocks, consent walls, and empty responses. You cannot paste an arbitrary URL into the tool and receive an accurate verdict without these rules.<\/span><\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Do I need NodeMaven proxies to use proxy-benchmark?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p><span style=\"font-weight: 400\">\u041d\u0435\u0442. <\/span><b>The direct baseline requires no proxy account<\/b><span style=\"font-weight: 400\">, and the generic <\/span><span style=\"font-weight: 400\">custom<\/span><span style=\"font-weight: 400\"> provider accepts the host, port, login, and password of a proxy you already use. Providers that encode country or session settings in the username can be added through a TOML definition.<\/span><\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Will adding a User-Agent fix every Python 403?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p><span style=\"font-weight: 400\">\u041d\u0435\u0442. <\/span><b>A User-Agent is only one signal in the request.<\/b><span style=\"font-weight: 400\"> Changing it may affect one target without resolving refusals caused by permissions, the connection path, browser behavior, the host machine, or another target-side decision. Test one change at a time and compare the returned content, not only the status code.<\/span><\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                    <\/div>\n                    <\/div>\n    <\/div>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><\/p>","protected":false},"excerpt":{"rendered":"Getting 403 Client Error: Forbidden for URL in Python? Run one controlled benchmark to find whether the proxy, client, browser, country, or host changes the result.","protected":false},"author":68,"featured_media":41139,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-41136","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.1 (Yoast SEO v28.1) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>403 Client Error: Forbidden for URL? Find the Cause With One Test<\/title>\n<meta name=\"description\" content=\"Getting 403 Client Error: Forbidden for URL in Python? Run one controlled benchmark to find whether the proxy, client, browser, country, or host changes the result.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nodemaven.com\/ru\/blog\/403-client-error-forbidden-for-url\/\" \/>\n<meta property=\"og:locale\" content=\"ru_RU\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Fix 403 Client Error: Forbidden for URL in Python with One Controlled Benchmark\" \/>\n<meta property=\"og:description\" content=\"Getting 403 Client Error: Forbidden for URL in Python? Run one controlled benchmark to find whether the proxy, client, browser, country, or host changes the result.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nodemaven.com\/ru\/blog\/403-client-error-forbidden-for-url\/\" \/>\n<meta property=\"og:site_name\" content=\"NodeMaven\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/people\/NodeMaven\/100095402507825\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-02T11:37:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-02T11:39:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/10\/blog-cover-python-403_1x.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1776\" \/>\n\t<meta property=\"og:image:height\" content=\"1000\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Anna\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u043e\u043c\" \/>\n\t<meta name=\"twitter:data1\" content=\"Anna\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 \u043c\u0438\u043d\u0443\u0442\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/403-client-error-forbidden-for-url\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/403-client-error-forbidden-for-url\\\/\"},\"author\":{\"name\":\"Anna\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#\\\/schema\\\/person\\\/f3bc93327b3582e735259d2a98f7a7ff\"},\"headline\":\"How to Fix 403 Client Error: Forbidden for URL in Python with One Controlled Benchmark\",\"datePublished\":\"2026-10-02T11:37:40+00:00\",\"dateModified\":\"2026-10-02T11:39:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/403-client-error-forbidden-for-url\\\/\"},\"wordCount\":1805,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/403-client-error-forbidden-for-url\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/blog-cover-python-403_1x.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"ru-RU\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nodemaven.com\\\/blog\\\/403-client-error-forbidden-for-url\\\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/ru\\\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/403-client-error-forbidden-for-url\\\/\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/403-client-error-forbidden-for-url\\\/\",\"name\":\"403 Client Error: Forbidden for URL? Find the Cause With One Test\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/403-client-error-forbidden-for-url\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/403-client-error-forbidden-for-url\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/blog-cover-python-403_1x.png\",\"datePublished\":\"2026-10-02T11:37:40+00:00\",\"dateModified\":\"2026-10-02T11:39:06+00:00\",\"description\":\"Getting 403 Client Error: Forbidden for URL in Python? Run one controlled benchmark to find whether the proxy, client, browser, country, or host changes the result.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/403-client-error-forbidden-for-url\\\/#breadcrumb\"},\"inLanguage\":\"ru-RU\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nodemaven.com\\\/blog\\\/403-client-error-forbidden-for-url\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/403-client-error-forbidden-for-url\\\/#primaryimage\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/blog-cover-python-403_1x.png\",\"contentUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/blog-cover-python-403_1x.png\",\"width\":1776,\"height\":1000,\"caption\":\"How to Fix 403 Client Error: Forbidden for URL in Python with One Controlled Benchmark\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/403-client-error-forbidden-for-url\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nodemaven.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Fix 403 Client Error: Forbidden for URL in Python with One Controlled Benchmark\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#website\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/\",\"name\":\"NodeMaven\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nodemaven.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ru-RU\"},{\"@type\":[\"Organization\",\"Place\"],\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#organization\",\"name\":\"NodeMaven\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/\",\"logo\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/403-client-error-forbidden-for-url\\\/#local-main-organization-logo\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/403-client-error-forbidden-for-url\\\/#local-main-organization-logo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/people\\\/NodeMaven\\\/100095402507825\\\/\",\"https:\\\/\\\/t.me\\\/NodeMavenTG\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/nodemaven\\\/\"],\"telephone\":[],\"openingHoursSpecification\":[{\"@type\":\"OpeningHoursSpecification\",\"dayOfWeek\":[\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\",\"Sunday\"],\"opens\":\"00:00\",\"closes\":\"23:59\"}],\"legalName\":\"NodeMaven FZ LLC\",\"email\":\"support@nodemaven.com\",\"description\":\"NodeMaven is a proxy infrastructure provider offering residential, mobile, and ISP proxies with IP quality filtering, precise geo-targeting, HTTPS and SOCKS5 support, and developer APIs.\",\"contactPoint\":[{\"@type\":\"ContactPoint\",\"contactType\":\"customer support\",\"email\":\"support@nodemaven.com\"},{\"@type\":\"ContactPoint\",\"contactType\":\"legal\",\"email\":\"legal.public@nodemaven.com\"}],\"award\":[\"People Love Us, awarded by Trustpilot (2025)\",\"Top Rated, awarded by Top Business Software (2025)\",\"Customers Love Us, awarded by Sourceforge (2025)\",\"Users Love Us, awarded by G2 (2025)\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#\\\/schema\\\/person\\\/f3bc93327b3582e735259d2a98f7a7ff\",\"name\":\"Anna\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/anna-radziuk_avatar-96x96.jpg\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/anna-radziuk_avatar-96x96.jpg\",\"contentUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/anna-radziuk_avatar-96x96.jpg\",\"caption\":\"Anna\"},\"description\":\"Anna is a content manager at NodeMaven, and she specialises in turning complex technical topics into clear, practical guides backed by industry research, hands-on testing, and popular use cases.\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/ru\\\/author\\\/anna-radziuk\\\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/403-client-error-forbidden-for-url\\\/#local-main-organization-logo\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/cropped-Untitled-design-8-1.png\",\"contentUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/cropped-Untitled-design-8-1.png\",\"width\":512,\"height\":512,\"caption\":\"NodeMaven\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"403 Client Error: Forbidden for URL? Find the Cause With One Test","description":"Getting 403 Client Error: Forbidden for URL in Python? Run one controlled benchmark to find whether the proxy, client, browser, country, or host changes the result.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nodemaven.com\/ru\/blog\/403-client-error-forbidden-for-url\/","og_locale":"ru_RU","og_type":"article","og_title":"How to Fix 403 Client Error: Forbidden for URL in Python with One Controlled Benchmark","og_description":"Getting 403 Client Error: Forbidden for URL in Python? Run one controlled benchmark to find whether the proxy, client, browser, country, or host changes the result.","og_url":"https:\/\/nodemaven.com\/ru\/blog\/403-client-error-forbidden-for-url\/","og_site_name":"NodeMaven","article_publisher":"https:\/\/www.facebook.com\/people\/NodeMaven\/100095402507825\/","article_published_time":"2026-10-02T11:37:40+00:00","article_modified_time":"2026-10-02T11:39:06+00:00","og_image":[{"width":1776,"height":1000,"url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/10\/blog-cover-python-403_1x.png","type":"image\/png"}],"author":"Anna","twitter_card":"summary_large_image","twitter_misc":{"\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u043e\u043c":"Anna","\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f":"8 \u043c\u0438\u043d\u0443\u0442"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nodemaven.com\/blog\/403-client-error-forbidden-for-url\/#article","isPartOf":{"@id":"https:\/\/nodemaven.com\/blog\/403-client-error-forbidden-for-url\/"},"author":{"name":"Anna","@id":"https:\/\/nodemaven.com\/#\/schema\/person\/f3bc93327b3582e735259d2a98f7a7ff"},"headline":"How to Fix 403 Client Error: Forbidden for URL in Python with One Controlled Benchmark","datePublished":"2026-10-02T11:37:40+00:00","dateModified":"2026-10-02T11:39:06+00:00","mainEntityOfPage":{"@id":"https:\/\/nodemaven.com\/blog\/403-client-error-forbidden-for-url\/"},"wordCount":1805,"commentCount":0,"publisher":{"@id":"https:\/\/nodemaven.com\/#organization"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/403-client-error-forbidden-for-url\/#primaryimage"},"thumbnailUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/10\/blog-cover-python-403_1x.png","articleSection":["Uncategorized"],"inLanguage":"ru-RU","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nodemaven.com\/blog\/403-client-error-forbidden-for-url\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/nodemaven.com\/ru\/#organization"}},{"@type":"WebPage","@id":"https:\/\/nodemaven.com\/blog\/403-client-error-forbidden-for-url\/","url":"https:\/\/nodemaven.com\/blog\/403-client-error-forbidden-for-url\/","name":"403 Client Error: Forbidden for URL? Find the Cause With One Test","isPartOf":{"@id":"https:\/\/nodemaven.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/nodemaven.com\/blog\/403-client-error-forbidden-for-url\/#primaryimage"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/403-client-error-forbidden-for-url\/#primaryimage"},"thumbnailUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/10\/blog-cover-python-403_1x.png","datePublished":"2026-10-02T11:37:40+00:00","dateModified":"2026-10-02T11:39:06+00:00","description":"Getting 403 Client Error: Forbidden for URL in Python? Run one controlled benchmark to find whether the proxy, client, browser, country, or host changes the result.","breadcrumb":{"@id":"https:\/\/nodemaven.com\/blog\/403-client-error-forbidden-for-url\/#breadcrumb"},"inLanguage":"ru-RU","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nodemaven.com\/blog\/403-client-error-forbidden-for-url\/"]}]},{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/nodemaven.com\/blog\/403-client-error-forbidden-for-url\/#primaryimage","url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/10\/blog-cover-python-403_1x.png","contentUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/10\/blog-cover-python-403_1x.png","width":1776,"height":1000,"caption":"How to Fix 403 Client Error: Forbidden for URL in Python with One Controlled Benchmark"},{"@type":"BreadcrumbList","@id":"https:\/\/nodemaven.com\/blog\/403-client-error-forbidden-for-url\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nodemaven.com\/"},{"@type":"ListItem","position":2,"name":"How to Fix 403 Client Error: Forbidden for URL in Python with One Controlled Benchmark"}]},{"@type":"WebSite","@id":"https:\/\/nodemaven.com\/#website","url":"https:\/\/nodemaven.com\/","name":"NodeMaven","description":"","publisher":{"@id":"https:\/\/nodemaven.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nodemaven.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ru-RU"},{"@type":["Organization","Place"],"@id":"https:\/\/nodemaven.com\/#organization","name":"NodeMaven","url":"https:\/\/nodemaven.com\/","logo":{"@id":"https:\/\/nodemaven.com\/blog\/403-client-error-forbidden-for-url\/#local-main-organization-logo"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/403-client-error-forbidden-for-url\/#local-main-organization-logo"},"sameAs":["https:\/\/www.facebook.com\/people\/NodeMaven\/100095402507825\/","https:\/\/t.me\/NodeMavenTG","https:\/\/www.linkedin.com\/company\/nodemaven\/"],"telephone":[],"openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],"opens":"00:00","closes":"23:59"}],"legalName":"NodeMaven FZ LLC","email":"support@nodemaven.com","description":"NodeMaven \u2014 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u043f\u0440\u043e\u043a\u0441\u0438-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0438\u0434\u0435\u043d\u0442\u043d\u044b\u0435, \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0438 ISP-\u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 IP, \u0442\u043e\u0447\u043d\u044b\u043c \u0433\u0435\u043e-\u0442\u0430\u0440\u0433\u0435\u0442\u0438\u043d\u0433\u043e\u043c, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 HTTPS \u0438 SOCKS5, \u0430 \u0442\u0430\u043a\u0436\u0435 API \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.","contactPoint":[{"@type":"ContactPoint","contactType":"customer support","email":"support@nodemaven.com"},{"@type":"ContactPoint","contactType":"legal","email":"legal.public@nodemaven.com"}],"award":["People Love Us, awarded by Trustpilot (2025)","Top Rated, awarded by Top Business Software (2025)","Customers Love Us, awarded by Sourceforge (2025)","Users Love Us, awarded by G2 (2025)"]},{"@type":"Person","@id":"https:\/\/nodemaven.com\/#\/schema\/person\/f3bc93327b3582e735259d2a98f7a7ff","name":"\u0410\u043d\u043d\u0430","image":{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/05\/anna-radziuk_avatar-96x96.jpg","url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/05\/anna-radziuk_avatar-96x96.jpg","contentUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/05\/anna-radziuk_avatar-96x96.jpg","caption":"Anna"},"description":"\u0410\u043d\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c \u0432 NodeMaven \u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0435\u043c\u044b \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044f \u0438\u0445 \u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0442\u0440\u0430\u0441\u043b\u0435\u0432\u044b\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439, \u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f","url":"https:\/\/nodemaven.com\/ru\/author\/anna-radziuk\/"},{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/nodemaven.com\/blog\/403-client-error-forbidden-for-url\/#local-main-organization-logo","url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/03\/cropped-Untitled-design-8-1.png","contentUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/03\/cropped-Untitled-design-8-1.png","width":512,"height":512,"caption":"NodeMaven"}]}},"_links":{"self":[{"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts\/41136","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/users\/68"}],"replies":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/comments?post=41136"}],"version-history":[{"count":4,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts\/41136\/revisions"}],"predecessor-version":[{"id":41144,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts\/41136\/revisions\/41144"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/media\/41139"}],"wp:attachment":[{"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/media?parent=41136"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/categories?post=41136"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/tags?post=41136"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}