Developers
RiskAlign Public API v1
A small, tenant-scoped read API plus an inbound webhook slot. Designed for SIEM exports, GRC integrations, and audit-trail mirroring. JSON, Bearer auth, 60 requests per minute per key.
1. Getting a key
An admin on your tenant creates a key in the platform under Admin → API Keys. The full key (format rak_...) is shown once on creation; only its prefix is stored after that.
2. Authentication
curl https://riskalignplatform.com/api/public/v1/risks \ -H "Authorization: Bearer rak_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Bad or missing key returns 401. Missing scope returns 403. Rate limit (60/min/key) returns 429.
3. Scopes
read:risksread:controlsread:evidenceread:audit-trail
4. Endpoints
| Method | Path | Scope | Notes |
|---|---|---|---|
GET | /api/public/v1/risks | read:risks | List risks. `?limit=` (max 500), `?updated_since=ISO8601`. |
GET | /api/public/v1/risks/{id} | read:risks | Single risk with linked control IDs and open-issue count. |
GET | /api/public/v1/controls | read:controls | List controls. |
GET | /api/public/v1/evidence | read:evidence | List evidence items with linked risks/controls. |
GET | /api/public/v1/audit-trail | read:audit-trail | Append-only audit log for SIEM export. `?since=` and `?limit=` (max 1000). |
POST | /api/public/v1/webhooks/control-test-result | n/a (HMAC) | Inbound webhook. Headers: X-RiskAlign-Tenant, X-RiskAlign-Signature: sha256=<hex>, Idempotency-Key. |
5. Errors
All error responses use the shape:
{ "error": { "code": "rate_limited", "message": "Too many requests — limit 60/min." } }6. Outbound webhooks
Configure subscriptions at /app/admin/webhooks. Every delivery is signed:
X-RiskAlign-Signature: sha256=<hex>— HMAC-SHA256 of the raw body using your subscription's signing secret.X-RiskAlign-Event— e.g.review_cycle.closed,evidence.upserted,risk.updated.X-RiskAlign-Delivery-Attempt—1for the first try,2+ for retries.
Retry policy: 1 min, 5 min, 30 min (4 attempts total) on 5xx, 408, 429, or network error. 4xx (other than 408/429) are treated as caller-config errors and not retried. After 20 consecutive failures a subscription is auto-disabled — admins can re-enable from the Webhooks page.
Node verification snippet:
import crypto from "node:crypto";
export function verifyRiskAlign(req, secret) {
const sig = (req.headers["x-riskalign-signature"] ?? "").replace(/^sha256=/, "");
const expected = crypto.createHmac("sha256", secret).update(req.rawBody).digest("hex");
// timing-safe compare
const a = Buffer.from(sig, "hex");
const b = Buffer.from(expected, "hex");
return a.length === b.length && crypto.timingSafeEqual(a, b);
}7. Limits & roadmap
- 60 requests/min per key (token bucket, best-effort across edge isolates).
- Read-only in v1. Write endpoints will land when a pilot prospect names one.
- Per-IP allow-lists and mTLS available on enterprise plans only.