Track every SKU, every variant, every geo.
Competitor prices, stock, ratings, promo flags, across thousands of retailers, refreshed nightly, validated against a stable schema. Built so your merch team can ship pricing rules, not babysit scrapers.
The hard parts, already solved.
Retailer anti-bot layers blow up most scrapers. Our 5-tier proxy fallback + headed Chromium quietly steps through them, so you never see a CAPTCHA.
AI Scraper's product schema returns name, price, currency, availability, variants, ratings, the same shape across every site. Your downstream code stays simple.
Same product URL shows different prices in DE / FR / JP. We route via clean residential IPs in each region, so your geo-pricing intel is actually accurate.
When a target redesigns and a field disappears, we alert before your dashboards break. Most fixes ship inside 4 hours, behind the API.
Feed us your product URLs (sitemap, category-page extract, or SERP discovery) and we run AI Scraper across the list as an async batch, returning an array of typed products. One nightly cron, full catalog.
Robots.txt respected, request rates polite, headers honest. Plus full audit logs of every request, which matters for regulated procurement teams.
4 steps. One pipeline.
product schema against each URL. Returns validated JSON; non-product pages are flagged, never half-extracted.// nightly-prices.ts
import { Ujeebu } from "ujeebu";
import { writeRows } from "./bq";
const uj = new Ujeebu(process.env.UJEEBU_KEY);
const SITES = [
"https://shop-a.com/sitemap-products.xml",
"https://shop-b.com/sitemap.xml",
"https://shop-c.de/sitemap.xml",
];
for (const sitemap of SITES) {
const urls = await uj.sitemap(sitemap);
const rows = await Promise.all(
urls.map(url => uj.auto({
url, schema: "product",
geo: "us-ca", premium: true,
}))
);
await writeRows(
rows.filter(r => r.data?.price?.value),
{ dataset: "prices", table: "nightly" }
);
}