Add retailers, match their URLs to your SKUs, pull observations. Same primitives the dashboard uses; surfaced for your stack.
A Competitor is a retailer you monitor (e.g. amazon.de, mediamarkt.de). Each is enabled per tenant and carries country + category metadata used by the scraper to pick the right extraction strategy.
/api/public/v1/competitorsBearer pk_live_…List competitors with optional country filter. Includes the count of products tracked against each.
curl "https://api.priceroom.com/api/public/v1/competitors?country=de" \
-H "Authorization: Bearer pk_live_XXX"/api/competitorsCookie sessionAdd a competitor to the tenant.
curl -X POST https://app.priceroom.com/api/competitors \
-H "Content-Type: application/json" \
-H "Cookie: pr_session=..." \
-d '{
"domain": "mediamarkt.de",
"displayName": "MediaMarkt",
"country": "de"
}'/api/competitorsCookie sessionList all competitors for the tenant.
/api/competitors/[id]Cookie sessionPartial update of competitor fields.
/api/competitors/[id]Cookie sessionSoft-delete the competitor (and its matched listings).
The bridge entity between your Product and a Competitor URL. A CompetitorProduct is the actual scraped listing — its `currentPrice`, `currentStock`, and `priceHistory` are populated by the scraper or by direct PATCHes.
/api/competitor-productsCookie sessionMatch a product to a competitor URL.
/api/competitor-productsCookie sessionList matches, optionally filtered by productId and / or competitorId.
/api/competitor-products/[id]Cookie sessionUpdate a match. Supplying `currentPrice` (integer cents) auto-appends to priceHistory (kept at the last 200 entries).
/api/competitor-products/[id]Cookie sessionSoft-delete the match.
Every 4xx/5xx returns a stable JSON error. Use code for programmatic branching.
{
"error": {
"code": "invalid_api_key",
"message": "The provided API key is invalid or revoked.",
"requestId": "req_01HTX9..."
}
}