How to save on proxies: 8 working tactics
Realistic ways to cut proxy spend by 30-70% without losing quality: traffic optimisation, volume discounts, switching to the right type, subscription length.
1. Block unneeded resources (60-80% saved)
The biggest win. On the average web page ~70% of bandwidth is images, CSS, fonts and video. If you only scrape text or structured data, block all of that:
// Puppeteer
await page.setRequestInterception(true);
page.on('request', req => {
if (['image', 'stylesheet', 'font', 'media'].includes(req.resourceType())) {
req.abort();
} else {
req.continue();
}
});Saving: 10 GB/day → 2-3 GB/day. On residential at $2/GB that's $240/month saved.
2. Switch to the right proxy type
Plenty of teams overpay for residential where datacenter would do:
- API integrations without anti-bot — datacenter ($0.5/GB), economy ~5×
- Scraping public JSON endpoints — datacenter
- Internal tooling — datacenter
Guide on proxy types: read
3. Volume and annual discounts
Almost every provider discounts by volume:
- SOAX — 15-20% off from 100 GB
- Decodo — annual subscription -25%
- Bright Data — custom plans from $1000/month with 30%+ discount
Planning 6+ months of work? Switch to annual. 25% saving.
4. Local caching
Don't request the same thing twice. A simple Redis cache with a 1-7 day TTL saves 30-50% of requests on typical scraping workloads:
import redis
import hashlib
cache = redis.Redis()
def fetch_cached(url, ttl=86400):
key = 'http:' + hashlib.md5(url.encode()).hexdigest()
cached = cache.get(key)
if cached:
return cached.decode()
data = fetch_via_proxy(url)
cache.setex(key, ttl, data)
return data5. Always enable gzip
One header saves 60-80% bandwidth:
headers = {'Accept-Encoding': 'gzip, deflate, br'}
requests.get(url, headers=headers, ...)Most modern libraries decode gzip automatically. Some providers count traffic after decompression — read the ToS carefully.
6. Self-imposed rate limit instead of retrying on 429
If you know the target has roughly a 5 req/sec ceiling, throttle your client to 4 req/sec instead of catching 429 and retrying. Every retry is a full bandwidth round-trip wasted.
import asyncio
sem = asyncio.Semaphore(4)
async def fetch(url):
async with sem:
await asyncio.sleep(0.25) # max 4 req/sec
return await aiohttp_fetch(url)7. Pay-as-you-go vs subscription
If your usage is irregular (one big research push per month), pay-as-you-go is cheaper:
- Decodo PAYG: $4/GB
- Decodo monthly 50 GB: $200/month = $4/GB if you use it all. Use only 20 GB and the real rate is $10/GB.
Simple rule: if you use less than 80% of the monthly volume, switch to pay-as-you-go.
8. Mixed strategy: different providers for different tasks
Don't use one service for everything. A realistic team has 3-4 accounts:
- Webshare ($0.65/GB datacenter) — for backend integrations
- Decodo ($2.20/GB residential) — for daily scraping
- Bright Data ($5/GB residential) — for anti-bot-protected targets (Datadome)
- iProxy.online ($25/port mobile) — for multi-account
A mixed strategy saves 40-60% over a one-size-fits-all approach.
Saving on proxies isn't picking the cheapest — it's the right tool for each task. Often the premium on quality residential pays back through saved retry logic and shorter time-to-completion.