Relay is a drop-in SDK for chat, audio/video calling and push notifications β backed by a managed multi-tenant service so you never run your own realtime infrastructure. Native SDKs for Web, iOS and Android, one dashboard to manage every tenant.
One Relay project maps to one of your apps. Each tenant gets isolated data, its own API keys, and independent controls β nothing is ever shared across tenants.
Conversations, typing indicators, read receipts, media messages β synced in real time over a managed WebSocket gateway.
WebRTC signaling plus TURN relay handled for you, with audio and video gated as independent modules.
APNs and FCM wake-ups for offline users β upload your credentials once from the admin panel, Relay handles delivery.
Every tenant is isolated end to end β its own keys, users, usage counters and configuration. No cross-tenant query path exists.
A public key ships inside your client app; a secret key stays server-side to mint short-lived user tokens after you authenticate the user yourself.
Register your iOS bundle ID / Android package name so a public key only ever works from the app it was issued for.
See logins, messages, audio calls and video calls per day, and turn any module on or off per tenant instantly.
CORS origins, TURN credentials, APNs/FCM β every section of your tenant's settings is edited and saved independently.
No infrastructure to provision. Get a project, drop in an SDK, and you're sending messages.
Tell us about your app below. A Relay admin reviews and creates your tenant, usually same day.
You receive a public key (safe in-app) and a secret key (server-side only) plus a login to your tenant dashboard.
Install @relay/react, RelayCore, or relay-core, point it at your project, done.
Set your CORS origins, TURN, APNs/FCM and app allowlist from your tenant dashboard, then ship.
Every SDK speaks the same concepts: a public key identifies your project, a short-lived user token (minted by your own backend) identifies the person using it.
import { RelayProvider, ChatWindow } from '@relay/react';
const relayConfig = {
baseUrl: 'https://relay.yourdomain.com',
publicKey: 'pk_your_project_key',
token: () => fetchTokenFromYourBackend(),
};
export function App() {
return (
<RelayProvider config={relayConfig}>
<ChatWindow />
</RelayProvider>
);
}
RelayCore / RelayUI / RelayCall) and Android (relay-core / relay-ui / relay-call).Every plan includes chat, calling and push β the only thing that changes is scale and support.
Tell us about your app β an admin reviews every request and sets up your tenant with its own keys.
Your request lands directly in the Relay admin dashboard's review queue.
No. Relay runs the multi-tenant chat/call/push service for you. You only integrate the client SDK in your app and, if you mint your own user tokens, a couple of endpoints on your existing backend.
The public key ships inside your client app and identifies your project on a connection β it's not sensitive. The secret key stays on your own server and is used only to mint short-lived user tokens; it's never sent to a client.
You can restrict it: register your iOS bundle ID / Android package name in your dashboard's "Authorized apps" setting, and Relay rejects requests from any app that isn't registered β so a key copied out of your app doesn't work elsewhere.
Yes β audio and video calling are separate, independently toggleable modules, with WebRTC signaling and TURN relay handled by the service.
Requests are reviewed by a Relay admin, typically within one business day. You'll be contacted at the email you provide once your tenant is created.