Price monitoring and market intelligence
Track public prices, currency, availability and delivery terms on storefronts in each country you sell or compete in, on a schedule your analysis needs.
Proxy URL, exit IP in Germany
http://USERNAME-cc-DE:PASSWORD@scale-eu.netdash.io:2000Residential exit IPs in Germany
Illustrative routes, not live traffic. Exits are available in most countries; the countries shown are examples.
- Country-level targeting by ISO code
- Rotating or sticky sessions
- Purchased GB never expire
Price monitoring proxies for multi-country catalogs
The same product URL can show a different price, currency, tax display and availability depending on the visitor’s country. A monitor that runs from one location reports one market and treats it as the whole picture.
Price monitoring proxies give each check an exit IP in the market you are measuring. With netdash you set the country in the username, -cc-DE for Germany or -cc-GB for the United Kingdom, and keep your existing collector, parser and alerts.
What changes when the storefront country changes
Five signals that differ by market, and how to capture each one so markets stay comparable.
| Attribute | What varies | How to capture it |
|---|---|---|
| Price and currency | The amount, and the currency it is shown in | Exit country via -cc-; store the raw value with its currency code |
| Tax display | Prices shown with or without VAT or sales tax | Record a tax-inclusive flag per market |
| Shipping and delivery | Delivery options, costs and estimates | Set Accept-Language to the market’s language; use the site’s public country selector where it has one |
| Assortment and stock status | Which products are listed and in stock | Check the same product list in every market |
| Promotions and bundles | Market-specific offers | Store the offer text with the price, not only the number |
Targeting is country-level. A delivery postcode or region is a setting on the site, not on the proxy.
From watchlist to price alert
Step 1: Build the watchlist
Product URLs per market storefront, with the fields you need: price, currency, tax display, availability and delivery estimate.
Step 2: Set a cadence
As often as your analysis needs, for example daily, and within each site’s limits. Spread checks across the day instead of sending them in one burst.
Step 3: Fetch per market
Exit country = market, rotating for product pages. If a storefront needs its public country or currency selector set first, do it once in a sticky session (
Sticky sessions-ttl-15) and reuse the cookies.Step 4: Extract
Read the JSON-LD
Offerfirst and fall back to CSS selectors.Step 5: Normalize and store
Raw price, currency, tax flag,
fetched_atin UTC, market and URL for every record.Step 6: Alert
On price moves beyond a threshold, availability changes across a category, and advertised prices from your authorized resellers below your published minimum.
Market-by-market configuration
The examples use the Scale plan. Every residential plan uses the same syntax; you switch plans by changing the host and port.
- United States
scale-us.netdash.io:2000withUSERNAME-cc-USRotating. The Americas gateway.
- Germany
scale-eu.netdash.io:2000withUSERNAME-cc-DERotating. The Europe gateway.
- United Kingdom
scale-eu.netdash.io:2000withUSERNAME-cc-GBRotating. Use
GB, notUK.- Locale setup (any market)
USERNAME-cc-DE-session-SID-ttl-15on the market’s gatewaySticky for 15 minutes: set the site’s public country or currency selector once, then reuse the cookies.
- More markets
Any ISO 3166-1 alpha-2 code
Pair exits in the Americas with
-usand exits in Europe, Africa and Asia with-eu.- Connections
Rotating for product pages; sticky only for locale setup
Requests sent through one HTTPS tunnel share that tunnel’s exit IP.
Build the connection for a market
Pick the market’s country and gateway, then copy the proxy string into your spider or monitor.
Your route
Through the gateway to an exit IP in , , on the plan.
Proxy URL
http://USERNAME-cc-DE:PASSWORD@scale-eu.netdash.io:2000Replace USERNAME and PASSWORD with the credentials from your dashboard.
Scale, Europe gateway, exit IP in Germany, rotating.
curl --max-time 30 -x "http://USERNAME-cc-DE:PASSWORD@scale-eu.netdash.io:2000" \
"https://api.ipify.org?format=json"import requests
proxy = "http://USERNAME-cc-DE:PASSWORD@scale-eu.netdash.io:2000"
proxies = {"http": proxy, "https": proxy} # set both, or HTTPS requests bypass the proxy
response = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=30)
response.raise_for_status()
print(response.text)import { ProxyAgent, fetch } from "undici";
const dispatcher = new ProxyAgent({
uri: "http://scale-eu.netdash.io:2000",
token: "Basic " + Buffer.from("USERNAME-cc-DE:PASSWORD").toString("base64"),
});
const res = await fetch("https://api.ipify.org?format=json", { dispatcher, signal: AbortSignal.timeout(30_000) });
console.log(await res.text());import { chromium } from "playwright";
const browser = await chromium.launch({
proxy: {
server: "http://scale-eu.netdash.io:2000",
username: "USERNAME-cc-DE",
password: "PASSWORD",
},
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org?format=json");
console.log(await page.textContent("body"));
await browser.close();Example output
{"ip":"203.0.113.10"}Your output shows a different address in the country you chose.
A Scrapy spider that collects by market
Each request carries its market’s proxy in meta["proxy"], with the credentials in the URL, which Scrapy’s HttpProxyMiddleware accepts. cb_kwargs passes the market to the callback, and parse() reads the price from the page’s JSON-LD.
ROBOTSTXT_OBEY checks robots.txt before fetching from a site, AutoThrottle lengthens the delay when a site responds slowly, and the per-domain limits keep the load low. Scrapy fetches robots.txt itself, without the request’s meta["proxy"], so that request leaves from your machine or through your http_proxy and https_proxy environment variables. The Scrapy guide covers proxy middleware in more depth.
- Scrapy 2.13 and later call
start();start_requests()keeps older versions working - Scrapy downloads only the HTML you request, without images or scripts, which keeps GB per check low
- For storefronts that render prices with JavaScript, use a browser; see the Playwright guide
- Connection details for every client are in the proxy string format docs
import json
import os
from datetime import datetime, timezone
from urllib.parse import quote
import scrapy
USER = quote(os.environ["NETDASH_USERNAME"], safe="")
PASSWORD = quote(os.environ["NETDASH_PASSWORD"], safe="")
GATEWAY = {"US": "us", "DE": "eu", "GB": "eu"} # Americas or Europe gateway
LANGUAGE = {"US": "en-US", "DE": "de-DE", "GB": "en-GB"}
WATCHLIST = {
"US": ["https://shop.example.com/us/p/1001"],
"DE": ["https://shop.example.com/de/p/1001"],
"GB": ["https://shop.example.com/uk/p/1001"],
}
def proxy_for(cc):
# Rotating: no session parameters, so the gateway assigns the exit IPs.
return f"http://{USER}-cc-{cc}:{PASSWORD}@scale-{GATEWAY[cc]}.netdash.io:2000"
class PriceSpider(scrapy.Spider):
name = "prices"
custom_settings = {
"ROBOTSTXT_OBEY": True,
"AUTOTHROTTLE_ENABLED": True,
"CONCURRENT_REQUESTS_PER_DOMAIN": 2,
"DOWNLOAD_DELAY": 1,
"DOWNLOAD_TIMEOUT": 30,
"USER_AGENT": "example-price-monitor/1.0 (+https://example.com/contact)",
}
async def start(self): # Scrapy 2.13+
for request in self.start_requests():
yield request
def start_requests(self): # also used by Scrapy versions before 2.13
for cc, urls in WATCHLIST.items():
for url in urls:
yield scrapy.Request(
url,
meta={"proxy": proxy_for(cc)},
headers={"Accept-Language": LANGUAGE[cc]},
cb_kwargs={"market": cc},
)
def parse(self, response, market):
for raw in response.css('script[type="application/ld+json"]::text').getall():
try:
data = json.loads(raw)
except ValueError:
continue
nodes = data.get("@graph", [data]) if isinstance(data, dict) else data
for node in nodes:
if not isinstance(node, dict) or node.get("@type") != "Product":
continue
offer = node.get("offers") or {}
offer = offer[0] if isinstance(offer, list) else offer
yield {
"market": market,
"url": response.url,
"price": offer.get("price"),
"currency": offer.get("priceCurrency"),
"availability": offer.get("availability"),
"fetched_at": datetime.now(timezone.utc).isoformat(),
}Read prices from structured data first
Many product pages embed schema.org Product data with an Offer that holds price, priceCurrency and availability. It changes less often than the page layout, so parse it first and fall back to CSS selectors only when it is missing.
Store the raw value, the currency and a tax-inclusive flag, and convert currencies when you analyze, not when you collect. That way an exchange-rate change never rewrites your history.
- The raw price exactly as published
- The currency code from
priceCurrency - Tax-inclusive or tax-exclusive
- Availability as published, such as
InStockorOutOfStock fetched_atin UTC, the market and the URL
Which product to use for storefront checks
Both use the same credentials and the same username syntax, so you can run them side by side.
Residential proxies
Self-serveStorefront prices as visitors in each country see them: rotating for product pages, sticky for locale setup.
From $1.20/GB, graduated per order
Mobile proxies
Self-serveWhen you need the prices and offers a storefront returns to visitors on mobile exit IPs. Same credentials and syntax as residential.
From $3.50/GB, graduated per order
What monitoring costs
Products × markets × checks per day × 30 × average page transfer ≈ GB per month. For example, 500 products in three markets checked once a day is 45,000 checks a month; if a product page averages 0.5 MB of HTML, that is about 22.5 GB. Measure the page size on your own storefronts before you rely on the estimate.
Price the estimate in the calculator. Pricing is graduated per order and purchased GB never expire, so you can buy a quarter’s volume at once. Billing explains how the bands apply.
Monitor responsibly
Monitor public product pages only and keep monitoring read-only: no logins and no account actions. Don’t collect personal data, such as reviewer names, without a lawful basis. Follow each site’s robots.txt and terms, keep request rates modest and back off when a site slows you down. If a site challenges your requests, slow down or stop; netdash doesn’t solve challenges. See how we expect netdash to be used.
Guides and related use cases
- Scrapy
Per-request proxies, middleware and settings for Scrapy spiders.
- Python
requests and httpx with country targeting and sessions.
- Playwright
A browser for storefronts that render prices with JavaScript.
- Country targeting
ISO country codes, gateways and the
-cc-parameter. - Rotating and sticky sessions
When to rotate and when to keep one exit IP.
- Billing
Graduated pricing per order and GB balances.
- Proxy string format
Hosts, ports and the username syntax for every plan.
- Web scraping proxies
Scheduled collection of public pages, with a polite Python fetcher.
- Brand protection
Find counterfeit listings and unauthorized sellers by country.
- Travel fare aggregation
Public flight fares and hotel rates by point of sale.
- All proxy use cases
Every workflow, with its default product and session settings.
Price monitoring questions
No. Targeting is country-level. If a storefront asks for a delivery postcode, that is a setting on the site, not on the proxy.
As often as your analysis needs and the site’s limits allow. Start with a daily run and adjust per category.
Only with authorization from the site. Keep monitoring to public pages.
Multiply products, markets, checks and average page size to estimate GB, then price it in the calculator. Purchased GB never expire.
Residential for most storefront checks; mobile when you need what a site returns to visitors on mobile exit IPs. Both use the same credentials and syntax.
Monitor your first market
Start with one market and a short watchlist, check the stored prices against the storefront, then add markets by adding country codes.