One script tag. Nothing else required.
The widget renders inside Shadow DOM, so your styles cannot reach it and it cannot reach yours. Only the publishable key ever touches the browser.
Paste it, then watch Relia find itself.
The install screen polls until the widget reports in from your domain, so you never have to guess whether it worked.
1<script src="https://www.relia.gg/widget.js"></script>2<script>3 Relia.init({4 publishableKey: "pk_live_...",5 apiBase: "https://www.relia.gg"6 });7</script><script src="https://www.relia.gg/widget.js"></script>
<script>
Relia.init({ publishableKey: "pk_live_…" });
</script>1// Sign the token on your server with your SECRET key,2// then hand only the token to the browser.3Relia.identify(identityToken);4 5// Open the widget from your own UI6Relia.open();7Relia.openTicket();Publishable
Safe in the browser. Identifies the workspace, boots the widget, reads knowledge and resolves a transaction. It cannot read another customer's conversation or change configuration.
Secret
Server side only. Signs identity tokens and receipts. Relia never sends it to a browser, and no client endpoint accepts it. If one is ever pasted somewhere public, rotate it.
The endpoints behind the widget.
Everything the widget does is a public endpoint you can call yourself, which is how Relia reaches Telegram, WhatsApp and email as well as the web.
POST /api/v1/widget/boot
Workspace config, ticket types, chain availability, active incidents
POST /api/v1/widget/conversations
Start a conversation for a customer
GET /api/v1/widget/conversations
That customer's conversations and tickets, with unread state
POST /api/v1/widget/conversations/:id/messages
Send a message, receive the assistant or chain reply
POST /api/v1/widget/chain
Resolve a transaction hash to a verdict
POST /api/v1/widget/tickets/attempt
Try to settle a typed request before a ticket exists
POST /api/v1/widget/tickets
Create a typed ticket, returns a quotable reference
GET /api/v1/widget/search
Knowledge search and instant answers
GET /api/v1/receipts/:id
Public verification of a signed answer
GET /api/health
Storage mode, durability, database, email and AI provider
1POST /api/v1/widget/chain2{3 "publishableKey": "pk_live_...",4 "hash": "0xac8846ff2aad4ea1f92c503a179b017dd62b0d2a579c00428911382a2924042d"5}6 7// 2008{9 "verdict": "credited",10 "summary": "Your 250 USDT arrived on Ethereum and is fully confirmed...",11 "needsHuman": false,12 "receiptId": "rcp_7975246e08b7",13 "facts": {14 "chainName": "Ethereum",15 "amount": "250",16 "symbol": "USDT",17 "confirmations": 101,18 "confirmationsRequired": 12,19 "explorerUrl": "https://etherscan.io/tx/0xac88..."20 }21}1POST https://your-app.example/relia2X-Relia-Delivery: dlv_9f1c2b7e3X-Relia-Signature: sha256=...4 5{6 "type": "conversation.resolved",7 "payload": { "conversation": "cnv_5f8dab74504e" }8}9 10// Retries: 10s, 1m, 5m, 30m, 2h. Six attempts.11// The delivery id is stable across retries, so dedupe on it.Shadow DOM
The widget's styles and markup are sealed off from the host page in both directions.
No dependencies
Vanilla JavaScript. No framework, no wallet library, nothing that ships a keypair.
Tenant scoped
Every query carries a workspace. One inbox can never read another.
No-store
Every API response is live state, so none of it is cacheable.