CRUD over your catalogue, plus on-demand observation kicks. The same shapes the dashboard renders, behind a stable URL.
Cookie-session endpoints used by the in-app product workflows. The same shapes are exposed under /api/public/v1/products for external integrations.
/api/public/v1/productsBearer pk_live_…List products with cursor pagination. Filter by brand, category, or tier.
curl "https://api.priceroom.com/api/public/v1/products?limit=50&brand=Sony" \
-H "Authorization: Bearer pk_live_XXX"{
"data": [
{
"id": "6630e1...",
"sku": "WH-1000XM5",
"title": "Sony WH-1000XM5 Wireless Headphones",
"brand": "Sony",
"category": "Audio",
"tier": "premium",
"ourPrice": 29900,
"costPrice": 18000,
"targetPrice": 30900,
"currency": "EUR",
"createdAt": "2026-04-13T16:05:12Z",
"updatedAt": "2026-05-02T09:11:48Z"
}
],
"nextCursor": "eyJ0IjoxNzE5NjIzMjAwfQ==",
"count": 1
}/api/productsCookie sessionCreate a product in the tenant catalogue.
curl -X POST https://app.priceroom.com/api/products \
-H "Content-Type: application/json" \
-H "Cookie: pr_session=..." \
-d '{
"sku": "WH-1000XM5",
"title": "Sony WH-1000XM5",
"brand": "Sony",
"ourPrice": 29900,
"currency": "EUR"
}'/api/products/[id]Cookie sessionFetch a single product by Mongo ObjectId.
/api/products/[id]Cookie sessionPartial update. Same fields as POST, all optional.
/api/products/[id]Cookie sessionSoft-delete (sets deletedAt). The doc is not removed.
Trigger or query competitor-price observations attached to a product.
/api/products/[id]/scrape-nowCookie sessionKick off an ad-hoc scrape across every enabled CompetitorProduct matched to this product. Returns the new run id; poll /api/scrape-runs/[runId] for status.
curl -X POST https://app.priceroom.com/api/products/6630e1.../scrape-now \
-H "Cookie: pr_session=..."/api/public/v1/observationsBearer pk_live_…Flatten observation history across competitor matches. Filter by productId, competitorId, or ISO date range.
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..."
}
}