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.
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.
/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 }
}Three resource families have dedicated reference pages with full request and response shapes:
/api-docs/productsCatalogue CRUD + on-demand scrapes + observation queries.
/api-docs/competitorsCompetitor entities + their matched listings (CompetitorProducts).
/api-docs/rulesPricing automation: triggers, scope, actions, simulate, toggle.
Audit trail across scrapes, rules, alerts, and price mutations. Tail it from any consumer.
/api/public/v1/workflow-logsBearer pk_live_…Query logs by category, severity, resource, actor and date range. Supports stream=sse for live tail.
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..."
}
}