Python Requests Proxy Authentication: HTTP, SOCKS5 and Errors
Python Requests accepts proxy credentials in the proxy URL. Pass that URL through the proxies argument, keep destination authentication separate, and test the connection from the process that will run the job. The example below rejects missing proxy settings and reports failures without printing credentials.
Before running the code
- The https dictionary key selects HTTPS destinations; the proxy URL scheme describes the connection to the proxy itself.
- Use a maintained Requests release and an explicit timeout. Never disable TLS verification to make a connection test pass.
- Environment variables, session settings and other Python HTTP libraries can use different routing configurations.
Check the Python and Requests versions first
The official release history lists Requests 2.34.2, released May 14, 2026, as the latest release at this review. Requests dropped Python 3.9 support in 2.33.0. Use a supported Python interpreter and record the installed version when reporting a problem.
Create an isolated environment with your chosen Python 3.10-or-newer interpreter, then install the package. The optional SOCKS extra includes the dependency needed for SOCKS proxy URLs:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install 'requests[socks]==2.34.2'
python -c 'import requests; print(requests.__version__)'
The activation command above is for a POSIX shell. On Windows, activate the environment using its Scripts directory or run its Python executable directly. Check python3 --version before creating the environment; the command name alone does not establish a supported version.
The version pin makes the example reproducible. Review maintenance releases before using it in a long-lived service.
Separate proxy credentials from destination credentials
| Setting | Meaning | Common mistake |
|---|---|---|
| proxies["https"] | Proxy selection for HTTPS destinations | Assuming the value must begin with https:// |
| http:// proxy URL | HTTP connection to the proxy | Assuming proxy-hop credentials gain destination TLS protection |
| https:// proxy URL | TLS connection to a compatible proxy | Using it against a plain HTTP listener |
| auth= on a request | Destination authentication | Sending proxy credentials to the target service |
| socks5h:// proxy URL | SOCKS5 with proxy-side hostname resolution | Forgetting the SOCKS dependency |
Requestsโ proxy documentation accepts a URL such as http://USER:PASSWORD@HOST:PORT in the proxy mapping. Use the endpoint and authentication method supplied for your service. The requestโs auth= argument authenticates to the destination; it is not the place to put these proxy credentials.
The mapping keys describe destination schemes. urllib3โs proxy reference explains the HTTP, HTTPS and CONNECT paths used underneath Requests. An HTTPS destination can use an HTTP proxy URL because the client establishes a CONNECT tunnel through that proxy. An https:// proxy URL instead requests TLS to the proxy endpoint itself. Use it only when that endpoint supports it.
Check the client-to-proxy connection separately from the destination tunnel. An HTTPS destination does not automatically encrypt the earlier exchange with a plain HTTP proxy. Our SOCKS5 and HTTP guide covers the protocol boundaries.
A small connection check with explicit settings
Supply CORONIUM_PROXY_URL through the process environment or your secret manager. Its value should be the complete configured proxy URL. Do not commit it to the script or print it in a job log.
import ipaddress
import os
from urllib.parse import urlsplit
import requests
def check_exit(proxy_url, target_url="https://api.ipify.org?format=json"):
parsed = urlsplit(proxy_url)
if parsed.scheme not in {"http", "https", "socks5", "socks5h"}:
raise ValueError("Unsupported proxy scheme")
if not parsed.hostname or parsed.port is None:
raise ValueError("Proxy host and port are required")
with requests.Session() as session:
session.trust_env = False
response = session.get(
target_url,
proxies={"http": proxy_url, "https": proxy_url},
timeout=(5, 20),
allow_redirects=False,
)
response.raise_for_status()
if response.status_code != 200:
raise RuntimeError("Expected an HTTP 200 response")
return str(ipaddress.ip_address(response.json().get("ip")))
if __name__ == "__main__":
try:
print("Observed exit:", check_exit(os.environ["CORONIUM_PROXY_URL"]))
except (KeyError, ValueError, RuntimeError, requests.RequestException) as error:
raise SystemExit(f"Connection check failed ({type(error).__name__})") from None
The default target is ipifyโs public IP endpoint. It receives the test request and returns the address it observes. This result validates that request only; it does not prove that every API, browser or worker uses the same route.
The example intentionally disables environment-derived settings for this session, supplies a proxy on the request and rejects a redirect or non-IP response. It reports the exception class instead of a full exception string that could include sensitive connection details. The diagnostic output is not a proxy-quality score.
A local fixture check with Python 3.12 and Requests 2.34.2 verified proxy authentication, escaped credentials, environment isolation, 407 handling and authentication on an HTTPS CONNECT request. The fixture deliberately refused that CONNECT tunnel; it did not benchmark an external proxy or complete a production HTTPS transaction.
Encode reserved characters in credentials
If a username or password contains URL delimiters such as @, :, / or #, construct the user-information part with urllib.parse.quote. Encode each credential separately. Do not encode the entire URL, because the scheme and host separators still need their normal meaning.
import os
from urllib.parse import quote
username = quote(os.environ["PROXY_USERNAME"], safe="")
password = quote(os.environ["PROXY_PASSWORD"], safe="")
proxy_url = f"http://{username}:{password}@proxy.example:8080"
Replace the example host and port with the real endpoint, and keep the resulting URL private. A percent-encoded password is still a credential, not a redacted value. If the endpoint uses IP allowlisting instead, configure that method and confirm the source address seen by the proxy operator.
Decide whether this process should inherit environment settings
The advanced guide warns that environment proxies can override session.proxies; it recommends passing proxies on each request when an explicit selection is required. Standard proxy environment variables remain useful when your deployment intentionally manages them centrally.
The example sets session.trust_env = False to isolate its diagnostic session. The Session implementation shows that this also changes environment-derived authentication and certificate-bundle handling. If your organization relies on .netrc, REQUESTS_CA_BUNDLE or CURL_CA_BUNDLE, account for those requirements explicitly instead of copying the setting without review.
For a trusted private CA, pass the required bundle path through verify= or configure the sessionโs verification setting. Keep verification enabled. Do not replace a certificate error with verify=False in production.
Check the environment of the actual worker, not only your terminal. Containers, service managers and notebook kernels can inherit different settings. The Linux proxy guide explains those process boundaries.
Handle timeouts and authentication failures separately
Requestsโ quickstart explains that a timeout is not a total deadline for downloading the entire response. The (5, 20) tuple in the example provides connect and read limits. Use a separate job-level deadline when you need an end-to-end bound.
Read the error at the layer where it occurred. HTTP 407 points to proxy authentication. A CONNECT failure can surface as requests.exceptions.ProxyError before you receive a destination response. A 401 from the target service concerns its authentication; changing proxy credentials will not supply a valid destination token.
The Requests API reference documents its exception types and request parameters. Catch the specific classes your application can act on. Do not retry a bad password indefinitely, and do not rotate addresses to mask a broken credential deployment. For a destination 429, use its documented retry guidance and cap the jobโs attempts.
Preserve status, timestamp and a redacted endpoint identifier. If the target returns HTML where JSON was expected, report that mismatch rather than storing an empty successful record. The IP-ban guide helps distinguish network and account-level failures.
Choose SOCKS hostname resolution deliberately
Requests supports SOCKS through its optional dependency. Its proxy documentation distinguishes socks5://, which resolves the hostname on the client, from socks5h://, which asks the proxy to resolve it. Choose the behavior your workflow requires and verify it in that environment.
Use the same explicit mapping pattern from the example with the appropriate SOCKS URL. Do not change a proxyโs protocol merely by relabeling its URL: a SOCKS listener and an HTTP listener need compatible client settings. A browser supporting SOCKS routing may still have different authentication limits from Requests; see the browser proxy guide.
Keep AI tools and sessions within their real configuration scope
A Python agent can call several HTTP clients in the same process. Configuring one Requests Session does not configure an SDK that uses HTTPX, a Playwright browser or a hosted browsing service. Locate the component making the failed request and set its supported proxy option.
Reuse a Session when you need that sessionโs cookies and connection pool. Keep account boundaries explicit; do not share one authenticated Session across unrelated users. Address rotation is a separate provider operation and should follow your authorized workflowโs session requirements.
Give an AI tool a limited diagnostic interface: return the observed address or a redacted failure category, then stop when credentials, permissions or account review need an operator. Avoid placing the complete proxy URL in the model prompt. A successful echo request confirms connectivity to that endpoint, not authorization to collect data from another service.
Sources and review scope
Sources reviewed October 11, 2026. This guide reviews primary documentation. Code examples illustrate configuration and error handling. Any local fixture checks are described in the article; they are not live-provider performance benchmarks or guarantees of destination access.
- Requests: Advanced usage and proxies
- Requests: Quickstart and timeout behavior
- Requests: Developer API and exceptions
- Requests: Session source and environment handling
- Requests: Release history
2.34.2 released May 14, 2026; reviewed October 11, 2026.
- Python: URL quoting
- ipify: Public IP API
- urllib3: HTTP/HTTPS proxies and CONNECT tunnels
Frequently asked questions
Configure another runtime
Use the settings supported by the process making the request, then verify routing and authentication.
Related workflows
Choose a compatible protocol and authentication method.
Inspect the environment of the actual worker.
Classify the response before choosing a remedy.
Measure a request from the specific runtime you are checking.
Verify client configuration before selecting a new plan.
Separate seller access tokens from proxy authentication.
Apply bounded requests and preserve data-retention limits.