Competitor pricing APIs in 2026: a buyer's guide
How competitor pricing APIs work, what to look for in a vendor, and how to build a repricing engine on top of one without getting blocked or rate-limited.
If you sell online, your price is probably wrong right now. It’s either too high (you’re losing conversions to a competitor two clicks away) or too low (you’re leaving margin on the table because a competitor raised last Thursday).
A competitor pricing API fixes that — if you pick the right one.
What a competitor pricing API actually does
At the wire, a competitor pricing API is simple: you POST a product URL (or a SKU plus retailer hint), and you get back a JSON object with the current price, currency, competitor count, and a few derived signals like percentile ranking.
The hard part isn’t the API shape. The hard part is what happens behind it:
- Acquisition. Somebody has to keep crawling the web — politely, at scale, through anti-bot systems — and keep that crawl healthy as pages change. If your vendor is just scraping in a lambda somewhere, the data will rot within weeks.
- Matching. Two retailers rarely use the same SKU, product name, or ID. Matching a Nike shoe on one site to the same shoe on another is a fuzzy problem that requires embeddings, not regex.
- Freshness. Prices change fast — flash sales, A/B pricing, regional variants. Data that’s a day old is often data that’s wrong.
- Normalization. VAT, shipping, bundle deals, coupons. A headline price isn’t a purchase price. Good vendors strip the noise and give you comparable numbers.
What to look for
- Refresh frequency — ask for the SLA on freshness, not just uptime. FreshGeo refreshes tracked products every 15 minutes and surfaces a
last_checked_attimestamp in every response. - Change webhooks — polling 10K products every 15 minutes is a waste. Webhooks that fire on change are dramatically cheaper to operate.
- Coverage map — you want a clear answer to “does this API cover Amazon UK? Shopify headless? Walmart marketplace?” before you pay.
- Rate limits that reflect real usage — a 100 req/s limit sounds great until you hit a batch job. Look for burst allowances.
- Historical pricing — repricing without history is a guess; with history it’s an optimization problem.
A minimal repricing loop
import { FreshGeo } from '@freshgeo/sdk';
const fg = new FreshGeo({ apiKey: process.env.FRESHGEO_API_KEY });
async function reprice(sku, ourCostGBP) {
const { price: competitorMin, competitor_count } = await fg.pricing.product({
url: `https://ourshop.com/p/${sku}`,
});
const floor = ourCostGBP * 1.08; // 8% margin floor
const ceiling = competitorMin * 1.03; // never more than 3% over min
const newPrice = Math.max(floor, Math.min(ceiling, competitorMin - 0.01));
if (competitor_count >= 3) await updatePrice(sku, newPrice);
}
A repricing loop this small sounds naive, but it outperforms human-tuned rules at most merchants we’ve worked with, because the floor and ceiling keep it honest.
The wrong way to build this yourself
We’ve watched teams spend six months building their own crawler before admitting defeat. Unless pricing is your product, don’t. The data-quality tail is longer than you think, and every headless browser you spin up is a liability on someone else’s terms of service.
Where to start
Grab a free API key on FreshGeo’s E-Commerce Pricing API — 100 requests a month, no card, enough to wire up a proof of concept in an afternoon.