JSON over HTTPS. Cursor pagination. Tenant-scoped Bearer keys. The same data model that powers the dashboard is the data model your scripts and pipelines get.
Every public endpoint accepts a tenant API key in the Authorization header. Generate one in Settings → API keys; the key inherits the scopes you tick when you create it. There is no separate verify endpoint — call any read endpoint and a 401 with code 'invalid_key' tells you the key is wrong.
/api/public/v1/productsBearer pk_live_…Smoke-test your key by listing one product. A 200 confirms the key, scope, and tenant binding.
curl "https://api.priceroom.com/api/public/v1/products?limit=1" \
-H "Authorization: Bearer pk_live_XXXXXXXX"{
"data": [
{
"id": "6630e1...",
"sku": "WH-1000XM5",
"title": "Sony WH-1000XM5",
"brand": "Sony",
"currency": "EUR",
"ourPrice": 29900
}
],
"nextCursor": "6630e1...",
"count": 1
}Three resource families are exposed publicly. Each has a dedicated reference page with full request and response shapes.
/api-docs/productsYour catalogue — SKU, title, brand, category, our price, target price, images, custom attributes.
/api-docs/competitorsThe retailers you track + their matched listings (CompetitorProduct rows linking SKUs to URLs).
/api-docs/observationsTime-series price history — every observed price + stock state per matched competitor listing.
Predictable mechanics across every endpoint so your client stays simple.
PaginationOpaque cursor: pass nextCursor back as ?cursor=… until null. Default page size 50, max 200 (500 for observations).
MoneyAll amounts are integer cents in the product's currency. Divide by 100 for display.
TimestampsISO 8601 in UTC. createdAt / updatedAt on every row, observedAt on every observation.
ErrorsJSON body { error: { code, message } } with HTTP status 4xx/5xx. See full table below.
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..."
}
}