Public API · v1 · Preview

Every PriceRoom primitive, behind a stable API.

JSON over HTTPS. Cursor pagination. Idempotency keys. Webhooks with HMAC signatures. The same data model that powers the dashboard is the data model you get.

Base URL
api.priceroom.com/api/public/v1
Format
application/json
Auth
Bearer token
Rate limit
600 req/min/key

Authentication

Every request to the Public API is authenticated with a tenant API key. Generate keys in Settings → API keys. Pass them in the Authorization: Bearer pk_live_… header.

POST/api/public/v1/auth/verifyBearer pk_live_…

Validate an API key and return its scopes + rate-limit allotment.

curl https://api.priceroom.com/api/public/v1/auth/verify \
  -H "Authorization: Bearer pk_live_XXXXXXXX"
{
  "ok": true,
  "tenant": { "slug": "acme", "name": "Acme" },
  "scopes": ["read:products", "read:observations"],
  "rateLimit": { "rpm": 600, "remaining": 598 }
}

Resources

Three resource families have dedicated reference pages with full request and response shapes:

GET/api-docs/products

Catalogue CRUD + on-demand scrapes + observation queries.

GET/api-docs/competitors

Competitor entities + their matched listings (CompetitorProducts).

GET/api-docs/rules

Pricing automation: triggers, scope, actions, simulate, toggle.

Workflow logs

Audit trail across scrapes, rules, alerts, and price mutations. Tail it from any consumer.

GET/api/public/v1/workflow-logsBearer pk_live_…

Query logs by category, severity, resource, actor and date range. Supports stream=sse for live tail.

Body
Query: category?, severity?, resource?, actor?, from?, to?, limit? (1–500), stream? ('sse')
Returns
{ data: WorkflowLog[], count } — or an event-stream when stream=sse

Errors

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..."
  }
}