Open app
ELYSIUMreceipts anchored every 10 minutes

Private inference your agent can prove.

Elyra is an OpenAI-compatible inference API that runs inside hardware-attested enclaves. Every response comes with a signed receipt, and every receipt is anchored on Elysium. Your agent can prove what ran, where, and what it paid, and anyone can check the proof without trusting Elyra.

01Overview

02Quickstart

With the elyra command from @elyra/sdk (Node 20 or later), from an empty wallet to a verified receipt:

npm install -g @elyra/sdk             # or run each command as npx @elyra/sdk …
export ELYRA_PRIVATE_KEY=0x…           # a wallet funded on Elysium

elyra signin --save                    # sign a message, get an API key
elyra deposit 10                       # credited, net of the deposit fee, within seconds
elyra chat "Reply with the single word: sealed"
elyra verify --last                    # run again once the 10-minute slot has closed

verify reads the saved receipt back and prints what it proves:

✓ receipt signature by the attested key
✓ receipt names the attested keyset
✓ request commitment matches the bytes sent
✓ response commitment matches the bytes received
✓ provider enclave verified before forwarding
✓ cited provider session checks out
✓ keyset bound into the TDX quote
✓ workload measured and linked to public source
✓ production OS image
· TDX quote chains to Intel (checked live by verify-gateway)
✓ billing                     0.00001135 USD for 19+17 tokens, billed $0.000012
✓ charged to this key         yes
✓ anchor                      batch 2, leaf 0 of 2, 2026-11-09T21:40:01.000Z, tx 0x2c8a…41d0

verdict: VERIFIED

elyra verify-gateway checks the live gateway: the TDX quote to Intel's root, the measured compose and source commit, the production OS, and that your TLS connection ends at the attested key.

03In code

// npm install @elyra/sdk
import { Elyra, privateKeySigner, signIn, depositUsdc, MAINNET, toMicros } from '@elyra/sdk';

const wallet = privateKeySigner(process.env.KEY, { rpcUrl: MAINNET.rpcUrl, chainId: MAINNET.chainId });
const { apiKey } = await signIn(wallet);                      // shown once: store it
await depositUsdc({ signer: wallet, amountMicros: toMicros('10') });

const elyra = new Elyra({ apiKey, receiptDir: './receipts' });
const { response, saved } = await elyra.chat({
  model: 'qwen/qwen3.8-27b',
  messages: [{ role: 'user', content: 'Summarize the position risk.' }],
});
// later, once the slot has closed:
const proof = await elyra.verify(saved.dir);                  // signature, billing, payer, anchor

Any wallet works: implement Signer (address, signMessage, and sendTransaction for deposits) around viem, ethers or a hardware wallet. The client saves each receipt with the exact request and response bytes, the provider session it cites, and the attestation report of the keyset that signed it, so it can be verified later, offline.

04With the OpenAI SDK

import OpenAI from 'openai';
const client = new OpenAI({ baseURL: 'https://api.elyra.technology/v1', apiKey: process.env.ELYRA_API_KEY });
const res = await client.chat.completions.create({ model: 'qwen/qwen3.8-27b', messages: [...] }).withResponse();
const receiptId = res.response.headers.get('x-receipt-id');   // fetch it within the hour

To have every request go over a verified channel, run the local verifying proxy and point the client at it. It verifies the gateway before it starts, pins the attested TLS key, and checks every receipt:

npx @elyra/proxy serve https://api.elyra.technology --require-production-os
# base URL: http://127.0.0.1:4180/v1

05Account and funding

In a browser, the account app does all of this with your wallet: deposit, create and revoke API keys, and see usage and deposits. Agents use the endpoints below, or the SDK.

Sign in

GET https://auth.elyra.technology/auth/nonce?wallet=0x… returns a message; sign it with EIP-191 personal_sign and send {wallet, nonce, issuedAt, signature} to POST /auth/key. The API key is shown once. Each sign-in issues a new key; earlier keys keep working until you revoke them.

Manage keys

A management session lists, labels and revokes keys and shows usage and deposits. GET /auth/session/nonce?wallet=0x… returns a message to sign; POST /auth/session with {wallet, nonce, issuedAt, signature} returns a session token, valid for 12 hours. It manages the account and cannot call models, and an API key cannot manage the account.

Deposit USDC

Approve the credit vault for USDC, then call deposit(amount) from your wallet, or depositFor(account, amount) to fund another wallet. The balance is credited within seconds of the deposit being mined, net of the deposit fee. Deposit from a wallet you control, and use the vault's functions: a plain USDC transfer to the vault is not credited.

Automatic top-up

With the SDK, an agent can keep itself funded: when its balance falls below a threshold, the client deposits a set amount from a wallet you choose, waits until it is credited, and retries a request refused for insufficient credit once. A daily cap limits the deposits.

new Elyra({ apiKey, autoTopUp: { signer: wallet, below: '5', amount: '20', maxPerDay: '100' } })

Or fund an agent from another wallet without running anything: in the account app, save a top-up rule on the credit vault (the account, the threshold, the amount and a daily maximum) and approve the vault for USDC. Elyra's keeper, a key only the attested control plane holds, tops the account up when it runs low. The vault contract enforces the amount, the account and the daily maximum, and you turn it off at any time.

Balance

GET https://auth.elyra.technology/account with Authorization: Bearer <API key> returns your balance, in micro-USD.

Prepaid credit

Your balance is prepaid credit: it never expires, works with every key on the account, and is spent request by request at the providers' list prices. Deposit what your agents will use and let automatic top-up keep it there. Credit is not refundable.

06Models and providers

GET https://api.elyra.technology/v1/models lists every model with its per-token prices and routes. At launch:

ModelProviderInput / output per 1M tokens
z-ai/glm-5.3Phala (RedPill)$1.40 / $4.40
z-ai/glm-5.3-flashNEAR AI, enclave-signed$0.15 / $0.50
qwen/qwen3.8-27bChutes, end-to-end encrypted; Phala (RedPill) on request$0.24 / $2.20 (RedPill: $0.24 / $2.50)
deepseek/deepseek-v4-flashChutes, end-to-end encrypted$0.44 / $1.32
deepseek/deepseek-v3.2Chutes, end-to-end encrypted$1.00 / $1.00
moonshotai/kimi-k2.6Chutes, end-to-end encrypted$0.50 / $2.85
qwen/qwen3.5-397b-a17bChutes, end-to-end encrypted; reasons before answering$0.45 / $3.00
google/gemma-4-31b-turboChutes, end-to-end encrypted$0.12 / $0.37
nvidia/nemotron-3.5-lightningPhala (RedPill); reasons before answering$0.07 / $0.20
phala/qwen3.8-27b-uncensoredPhala (RedPill); uncensored, reasons before answering$0.30 / $1.50
phala/gemma-4-26b-a4b-uncensoredPhala (RedPill); uncensored$0.15 / $0.70

Choose providers per request with an OpenRouter-style block: "provider": {"only": ["near-ai"]}, or {"order": ["redpill", "near-ai"], "allow_fallbacks": true}. Provider names are redpill, near-ai and chutes. A route marked opt-in in /v1/models is used only when you name it.

Chutes runs on Bittensor's open GPU network, where independent operators run the machines. Elyra verifies each machine on its own (Intel TDX quote, NVIDIA GPU attestation) and encrypts every request end to end to that machine's attested key, so neither Chutes nor the operator sees your prompt. Hardware limits are set out in the protocol spec.

07API reference

EndpointWhat
POST api/v1/chat/completionsOpenAI chat completions, streaming or not. Header x-receipt-id names the receipt; usage.cost is the cost in USD.
GET api/v1/modelsModels, prices, routes.
GET api/v1/aci/receipts/{id}The signed receipt, with the same API key. Kept for an hour.
GET api/v1/aci/sessions/{id}The attested provider session a receipt cites.
GET api/v1/aci/attestation?nonce=The gateway's attestation report for a fresh 64-hex nonce.
GET auth/auth/nonce, POST auth/auth/keyWallet sign-in.
GET auth/accountBalance (API key or session).
GET auth/auth/session/nonce, POST auth/auth/session, POST auth/auth/session/endA wallet-signed management session.
GET/POST auth/account/keys, POST auth/account/keys/revokeList, create and revoke API keys (session).
GET auth/account/usage, GET auth/account/depositsRequests with their cost, and deposits with their fee (session).
GET auth/pricingThe current deposit fee.
GET auth/receipts/{digest}/proofA receipt's inclusion proof on Elysium (public).

api is https://api.elyra.technology, auth is https://auth.elyra.technology. Both terminate TLS inside the attested VM.

08Receipts

A receipt is a JSON document signed with an Ed25519 key that lives only inside the gateway's enclave and is listed in its attested keyset. Its event log records, in order:

EventRecords
request.receivedSHA-256 of the exact request bytes: a commitment you can later open to an auditor.
route.selectedThe provider route that served it.
upstream.verifiedThe attested provider session: TEE, GPU and OS claims, checked before forwarding.
upstream.response_attestedNEAR routes, non-streamed: the model enclave's own signature over this request and response.
billing.chargedToken counts, per-token rates, the exact cost, the amount billed, and a payer commitment.
response.returnedSHA-256 of the exact response bytes you received.

The payer commitment is sha256("billing.payer.v1:" + hex(sha256(api_key)) + ":" + receipt_id). It names no account and links no two receipts; you prove a receipt was charged to you by disclosing your key's hash, never the key.

Fetch receipts within the hour: the gateway keeps them for an hour. The SDK and the verifying proxy do it for you.

09Verify

The gateway

npx @elyra/proxy verify https://api.elyra.technology --require-production-os

Checks the TDX quote to Intel's root, that the keyset and your nonce are bound into it, that the measured compose links to the public source commit, the production OS image, and that your TLS connection ends at the attested key. Pin a compose hash with --accept-compose.

A receipt

npx @elyra/proxy audit --report attestation.json --receipt receipt.json \
  --request-body request.json --response-body response.json --session session.json --require-production-os

Checks the signature against the attested keyset and the request and response bytes against the receipt's commitments. elyra verify runs this for you on a saved receipt.

The anchor

The digest is SHA-256 of the receipt's JCS (RFC 8785) bytes. Get its proof from https://auth.elyra.technology/receipts/{digest}/proof and ask the contract directly:

cast call <ReceiptAnchor> \
  'verifyReceipt(bytes32,uint256,bytes32,bytes32[])(bool)' \
  <batchRoot> <batchIndex> <digest> '[<proof>]' \
  --rpc-url <Elysium RPC>

Receipts are anchored in fixed 10-minute slots (UTC): a slot's receipts become one Merkle root, anchored seconds after the slot ends by a key that only the attested gateway VM can derive. The chain sees the slot, never when in it your request ran.

10Pricing

11Network and contracts

Elysium
RPC · Explorer · Chain idhttps://rpc.elysium.kinetiq.xyz · https://elysium.kinetiq.xyz · 99901
USDC0xb47c4C8F73F009CC0C0d3f92B388d13E293F0B65
CreditVaultPublished at launch
ELYRPublished at launch
ReceiptAnchorPublished at launch

Anchor and vault addresses are published here and in the app at launch, and stay identical to the SDK's MAINNET constants.

12Good to know