Accordion
Five production-ready FAQ sections. Same component underneath — five entirely different design languages, ready to lift into a landing page.
Questions, answered.
Everything about trials, billing and data — written plainly, without the small print.
Still not sure? We answer every message ourselves.
What does a typical engagement look like?
How do you price your work?
Who will I actually be working with?
Can you work alongside our in-house team?
How soon can we start?
Quietly, everything
you might want to know.
What is included in a membership?
How do I request an invitation?
May I bring a guest?
Can I pause or cancel?
What your security team will ask us first.
Which certifications do you hold?Security
Can we choose our data region?Security
Do you support SSO and SCIM?Access
How long are audit logs retained?Access
What does procurement usually involve?Legal
What uptime do you commit to?Legal
Can we be invoiced annually?Billing
Is migration support included?Billing
Before you open a ticket
The four things developers ask us most, with the exact snippet you need for each one.
Installing the SDKNode 18+, Deno and Bun are supported
Install the SDK and it will read your key from the environment automatically.
# npm, pnpm or bun
npm install @relay/sdk
# then, in your app
import { Relay } from "@relay/sdk";Node 18 or newer is required for the built-in fetch client.
Authenticating requestsSecret keys, scoped tokens and rotation
Use a scoped token in anything that runs outside your own infrastructure. Secret keys should never reach the browser.
const relay = new Relay({
token: process.env.RELAY_SCOPED_TOKEN,
scopes: ["events:read"]
});Handling errors and retriesIdempotency keys and backoff defaults
Every write accepts an idempotency key. Retries with the same key return the original response instead of creating a duplicate.
await relay.events.send(payload, {
idempotencyKey: order.id,
retries: 4 // exponential backoff
});Verifying webhook signaturesTimestamp tolerance and replay protection
Verify the signature before trusting a payload. The helper below also rejects anything older than five minutes.
const event = relay.webhooks.verify(
rawBody,
request.headers["relay-signature"],
process.env.RELAY_WEBHOOK_SECRET
);Always verify against the raw request body — parsed JSON will not match the signature.