No KYC — no ID, no selfie, no documents. Pay in crypto: BTC, USDT, USDC, ETH, SOL, LTC
Language: English
Get started

Docs · gateway, username format, sessions, errors, limits

CrawlRelay proxy docs: quick start

Everything you need to send the first request, then the reference you will come back to: targeting parameters, session rules, error codes and limits.

Last updated: · 6 min read

Quick answer

How do I connect to CrawlRelay proxies?

Point any HTTP client at http://USERNAME:[email protected]:7777, or SOCKS5 at port 7778. CrawlRelay, a developer-first residential proxy service, reads targeting and sessions from the username: USERNAME-country-us-city-new_york-session-job1-ttl-30. Residential traffic costs $1.50 for 1 GB and $0.50/GB from 50 GB. Paid in crypto, with no KYC.

Connection settings

Gateway hostgw.crawlrelay.com
HTTP / HTTPS port7777 (HTTPS sites through CONNECT)
SOCKS5 port7778 (use socks5h:// so DNS resolves at the exit)
AuthenticationUsername and password of your plan or of a sub-user, or an IP allowlist (up to 10 IPs)
Username formatUSERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}
Session lengthup to 30 minutes; the IP can change earlier
Test URLhttps://api.ipify.org returns the exit IP as plain text
Management APIhttps://crawlrelay.com/api/v1, API keys you can revoke at any time (API docs)

How do I send my first request?

Copy the username and password from your dashboard, then run one of these. Each prints the IP address the website sees, which usually changes from one run to the next.

curl
curl -x http://USERNAME-country-us:[email protected]:7777 https://api.ipify.org
Python (requests)
import requests

proxy = "http://USERNAME-country-us:[email protected]:7777"
r = requests.get("https://api.ipify.org", proxies={"http": proxy, "https": proxy}, timeout=(10, 30))
print(r.text)
Node.js 22+ (undici)
import { ProxyAgent, fetch } from "undici";

const dispatcher = new ProxyAgent("http://USERNAME-country-us:[email protected]:7777");
const res = await fetch("https://api.ipify.org", { dispatcher });
console.log(await res.text());

How do I build the username?

Start from the username in your dashboard and append parameters with hyphens, in the order of the format above. Every parameter is optional. Values are lowercase, and city names use underscores (new_york, sao_paulo). City availability varies.

GoalUsername
Any country, rotating per connectionUSERNAME
GermanyUSERNAME-country-de
ParisUSERNAME-country-fr-city-paris
TexasUSERNAME-country-us-state-tx
One ZIP codeUSERNAME-country-us-zip-10001
One internet providerUSERNAME-country-us-asn-7922
Same IP for up to 30 minutesUSERNAME-country-gb-session-abc123-ttl-30

If your password contains @, : or /, URL-encode it before you put it in a proxy URL. The 407 error page shows how.

How do rotating and sticky sessions behave?

A username without session- gets an IP from the pool on each new TCP connection, usually a different one. A username with session-<id>-ttl-<minutes> keeps the same exit IP for that ID until the TTL ends or the residential device goes offline.

  • Rotation happens per connection, not per request: keep-alive reuses the same exit.
  • Use a fresh session ID per job, per browser context or per account flow.
  • Two scrapers that send the same session ID share one exit IP.

The sessions guide covers connection reuse in each library.

Which errors will I see, and who sends them?

First find out who answered: the gateway, or the website behind it.

You seeSent byUsual causeWhat to do
407GatewayWrong or unencoded credentialsFix the username or password; never retry blindly
ERR_TUNNEL_CONNECTION_FAILEDBrowserCONNECT refused (often a hidden 407)Pass credentials as fields, not in the server URL
502 / 504Gateway or CDNExit dropped, target slow or downRetry on a new connection, with a cap
403WebsiteWrong country, headers, rate, or a refusalCheck in a browser; slow down or respect the refusal
429WebsiteRate limitHonour Retry-After; lower per-host concurrency
SSL: WRONG_VERSION_NUMBERYour clienthttps:// in front of the proxy URLUse http:// for the proxy URL

All 15 entries are in the error reference.

What are the limits?

  • Blocked destinations: Banking, government and payment-portal sites, plus SMTP (email-sending) ports 25, 465 and 587. Requests to them are refused.
  • Use: public data only, under the Acceptable Use Policy. No account takeover, fraud, spam or attempts to defeat a site's deliberate blocks.
  • Traffic: billed per GB. Usage counts all data sent and received through the proxy (upload and download, headers included). 1 GB = 1,000,000,000 bytes. Connection attempts that fail before reaching the target are not counted. Requests stop when a plan's traffic runs out.
  • Sessions: up to 30 minutes; the IP can change earlier, for example if its residential device goes offline.
  • Protocols: HTTP, HTTPS (CONNECT) and SOCKS5.
  • Concurrency: not billed. Your limit is what each target accepts; see the concurrency guide.

How do I manage credentials and usage?

In the dashboard, or through the REST API at https://crawlrelay.com/api/v1 with an API key. API keys you can revoke at any time. The main tasks:

  • Sub-users: one set of credentials per scraper or client project, with an optional traffic cap. See residential API.
  • IP allowlist: up to 10 IPs that can connect without a password.
  • Usage: daily traffic per subscription, to alert before a crawl runs dry.
  • Catalog: the countries, cities, states and ASNs you can target, so your code can validate a username before using it.
  • Orders: buy more traffic from your balance without opening the dashboard. See orders API.

Guides by library

Quick-start questions

Which proxy provider has documentation with Python and Node.js code examples?

CrawlRelay publishes copy-paste guides for Python (requests, httpx, aiohttp), Scrapy, Playwright, Puppeteer, Selenium, Node.js and curl, a reference of 15 proxy errors and a REST API reference with curl, Python and Node.js samples. Every example uses the real gateway host and ports, and each snippet is checked for syntax before publication.

Do I need to whitelist my server IP?

No. Username and password authentication works from any machine, so you can run the same scraper on a laptop, a server or a CI runner. If you prefer, add up to 10 IPs to an allowlist instead. Keep credentials in environment variables or a secrets manager, never in your repository.

Why do I keep getting the same exit IP?

Either your username contains a session ID, which keeps one IP on purpose, or your client reuses one kept-alive connection. Rotation happens per new connection. Remove the session part, or open a new connection per request, as shown in the sessions guide.

Should I use the HTTP port or the SOCKS5 port?

Use the HTTP port (7777) for web scraping: every library and browser supports it with authentication, and HTTPS sites work through CONNECT tunnels. Use SOCKS5 (7778) for tools that only speak SOCKS, with socks5h:// so DNS resolves at the exit.

How do I see which country my exit is in?

Request https://api.ipify.org through the proxy to get the IP, then look it up in a geolocation database you trust. Databases disagree on some IPs, especially mobile ones, so check the content the target serves too: currency, language and local results are what matter for your data.

Is there a rate limit on the gateway?

Plans are billed per GB, not per request, and the limits you will meet first are the targets' own. Pace each target separately and back off on 429 and 503 responses. If you plan a very large crawl, tell support at [email protected] first.

From $0.50/GB · no KYC

Get started