RELIA
Developers

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.

/01Quickstart

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.

index.html
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>
Waiting for Relia
identify.js
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();
/02Keys
pk_live_

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.

sk_live_

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.

/03API

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

chain lookup
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}
webhook delivery
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.
/04Isolation

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.