Skip to content

Python Requests

This guide explains how to use Evomi proxies with the Python requests library, the most popular HTTP client for Python. It covers HTTP and SOCKS5 proxies, session-based usage, and error handling.

Prerequisites Permalink to Prerequisites

  • Python 3.8+ installed
  • Your Evomi proxy credentials (username and password)

Installation Permalink to Installation

pip install requests

For SOCKS5 proxy support:

pip install "requests[socks]"

Basic Usage Permalink to Basic Usage

HTTP Proxy Permalink to HTTP Proxy

import requests

proxy_user = "your_username"
proxy_pass = "your_password_session-anychars_mode-speed"
proxy_url = f"http://{proxy_user}:{proxy_pass}@rp.evomi.com:1000"

proxies = {
    "http": proxy_url,
    "https": proxy_url,
}

response = requests.get("https://ip.evomi.com/s", proxies=proxies, timeout=15)
print("Proxy IP:", response.text.strip())

SOCKS5 Proxy Permalink to SOCKS5 Proxy

import requests

proxy_user = "your_username"
proxy_pass = "your_password_session-anychars_mode-speed"
proxy_url = f"socks5h://{proxy_user}:{proxy_pass}@rp.evomi.com:1002"

proxies = {
    "http": proxy_url,
    "https": proxy_url,
}

response = requests.get("https://ip.evomi.com/s", proxies=proxies, timeout=15)
print("Proxy IP:", response.text.strip())

The socks5h:// scheme routes DNS resolution through the proxy server, preventing DNS leaks. Use socks5:// if you want local DNS resolution.

Replace your_username and your_password with your actual Evomi credentials.

Using Sessions (Recommended) Permalink to Using Sessions (Recommended)

For multiple requests, use a Session object. This reuses the underlying TCP connection for better performance and lets you set the proxy once:

import requests

proxy_user = "your_username"
proxy_pass = "your_password_session-anychars_mode-speed"
proxy_url = f"http://{proxy_user}:{proxy_pass}@rp.evomi.com:1000"

session = requests.Session()
session.proxies.update({
    "http": proxy_url,
    "https": proxy_url,
})
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
})

response = session.get("https://ip.evomi.com/s", timeout=15)
print("Proxy IP:", response.text.strip())

response = session.get("https://example.com", timeout=15)
print("Status:", response.status_code)

Error Handling Permalink to Error Handling

import requests

proxy_user = "your_username"
proxy_pass = "your_password_session-anychars_mode-speed"
proxy_url = f"http://{proxy_user}:{proxy_pass}@rp.evomi.com:1000"
proxies = {"http": proxy_url, "https": proxy_url}

try:
    response = requests.get("https://ip.evomi.com/s", proxies=proxies, timeout=15)
    response.raise_for_status()
    print("Proxy IP:", response.text.strip())
except requests.exceptions.ProxyError as e:
    print(f"Proxy connection failed: {e}")
except requests.exceptions.Timeout:
    print("Request timed out")
except requests.exceptions.HTTPError as e:
    print(f"HTTP error: {e}")
except requests.exceptions.RequestException as e:
    print(f"Request failed: {e}")

Retries with Backoff Permalink to Retries with Backoff

For production scripts, add automatic retries:

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

proxy_user = "your_username"
proxy_pass = "your_password_session-anychars_mode-speed"
proxy_url = f"http://{proxy_user}:{proxy_pass}@rp.evomi.com:1000"

session = requests.Session()
session.proxies.update({"http": proxy_url, "https": proxy_url})

retry_strategy = Retry(
    total=3,
    backoff_factor=1,
    status_forcelist=[429, 500, 502, 503, 504],
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)

response = session.get("https://ip.evomi.com/s", timeout=15)
print("Proxy IP:", response.text.strip())

Evomi Proxy Endpoints Permalink to Evomi Proxy Endpoints

Proxy Type HTTP HTTPS SOCKS5
Residential rp.evomi.com:1000 rp.evomi-proxy.com:1001 rp.evomi.com:1002
Mobile mp.evomi.com:3000 mp.evomi-proxy.com:3001 mp.evomi.com:3002
Datacenter dcp.evomi.com:2000 dcp.evomi-proxy.com:2001 dcp.evomi.com:2002

HTTPS endpoints use the evomi-proxy.com domain — that is the hostname our TLS certificate covers, and it reaches the same servers. A client that verifies certificates will reject the evomi.com form on the HTTPS port.

Tips and Troubleshooting Permalink to Tips and Troubleshooting

  • Credentials: Double-check your username and password. The password format is your_password_session-anychars_mode-speed.
  • Special characters: If your password contains @, :, or other special characters, URL-encode them with urllib.parse.quote():
    from urllib.parse import quote
    proxy_url = f"http://{quote(user)}:{quote(password)}@rp.evomi.com:1000"
  • Timeouts: Always set a timeout to avoid hanging indefinitely. Use a tuple for separate connect/read timeouts: timeout=(5, 30).
  • SOCKS5 dependency: If you get MissingSchema or MissingSocksModule errors, make sure you installed requests[socks].
  • Environment variables: You can set proxies globally via environment variables (HTTP_PROXY, HTTPS_PROXY), but use session.trust_env = False if you want your code to ignore them.
  • SSL verification: Avoid verify=False in production. If you see SSL errors, update your system CA certificates.