RSX API / Guides

Getting started.

Everything platform-wide lives on this page — auth, rate limits, errors, idempotency, pagination. Individual service pages document only their own resources.

Base URL

https://api.rsx.group/{project}/{version}/{group}/{action}

Actions come from a fixed vocabulary: get and list are GET; add, update, remove are POST. Versions are major-overhaul-only — v1 stays v1 until the API is rethought, and deprecations get a published sunset date, never a silent removal.

Authentication

Every request carries an API key. Keys are issued by a platform admin, shown once at creation, and prefixed rsx_live_ so they're identifiable in your own config and logs without being guessable.

curl https://api.rsx.group/example/v1/widgets/list \
  -H "Authorization: Bearer rsx_live_..."

Keys hold scopes shaped like the URLs they unlock — example:widgets:add, or with a trailing wildcard, example:widgets:*. A request outside your key's scopes returns 403 invalid-scope naming the scope you're missing. Rotate keys with /platform/v1/keys/rotate — the old key keeps working for a grace window while you swap the new one in.

Rate limits

Limits are per key (token bucket: burst of 60, refilling 10/s by default). Every response reports where you stand:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 41

Exceeding the limit returns 429 rate-limit-exceeded with a Retry-After header in seconds. Honour it.

Errors

Every error, from every service, is RFC 7807 application/problem+json:

{
  "type": "https://docs.rsx.group/errors/invalid-scope",
  "title": "Invalid scope",
  "status": 403,
  "detail": "API key does not have the 'example:widgets:add' scope.",
  "instance": "/example/v1/widgets/add",
  "requestId": "0198f2b1-..."
}

The type URL resolves to a page in the error reference explaining the failure and the fix. Include the requestId when reporting a problem — it pinpoints your exact request in our logs.

Idempotency

Every add action requires an Idempotency-Key header. Reusing the key within 24 hours returns the original response instead of creating a duplicate — which makes retries on timeouts safe by default.

curl -X POST https://api.rsx.group/example/v1/widgets/add \
  -H "Authorization: Bearer rsx_live_..." \
  -H "Idempotency-Key: 5b8f2d1a-..." \
  -H "Content-Type: application/json" \
  -d '{"name": "Acrylic Panel", "quantity": 12}'

Responses & pagination

Success responses wrap payloads in { data }, with { data, meta } on list actions. meta.cursor is an opaque token — pass it back as ?cursor= to fetch the next page; null means you've reached the end.

Request tracing

Every response carries X-Request-Id. Send your own X-Correlation-Id to stitch a multi-call workflow together across our logs — the platform propagates it unchanged.

Machine-readable specs

Every service publishes OpenAPI 3.1 at https://api.rsx.group/{project}/{version}/openapi.json — generated from the same schemas that validate requests, so it cannot drift from behaviour. Point your own tooling at it freely.