Quickstart for people
This is the path from "I have USDC and no EGLD" to "my transaction is on chain". You buy the plan from any MultiversX wallet. You send from a key your own program holds, or with the dashboard's test transfer to yourself. It takes four steps: one signed transaction to buy the plan, then one signature for each transaction you send.
Buying works from xPortal, the Web Wallet, the browser extension and a Ledger. Sending through CoRelayer works from a key your own program holds, and from the dashboard's test transfer. If you sign in xPortal, the Web Wallet, the browser extension or a Ledger on another app, CoRelayer can't relay for you yet, so don't buy a plan for that. (FAQ)
CoRelayer runs on devnet only; nothing is deployed on mainnet yet.
Devnet runs the same code as mainnet, with test tokens, so you can try everything before you pay with real money.
- Open the devnet dashboard and connect a devnet wallet.
- Get test EGLD from the faucet of the devnet web wallet, and swap some of it for
USDC-350c4eon the devnet xExchange. - Buy a plan on the Plan screen, paid in
USDC-350c4e. To pay for your users, pick Builder or above. - To pay for your users, create a sponsor key on the API keys screen. A devnet key starts with
crk_test_.
In your code, use https://devnet-api.co-relayer.com as the API origin.
What you need
| A MultiversX wallet, to buy the plan | xPortal, the Web Wallet, the browser extension or a Ledger. |
| A key your own program holds, to send | The program signs each transaction with it (step 4). The dashboard's test transfer needs none. |
| USDC on MultiversX | The token identifier of the network you are on. On mainnet that is USDC-c76f1f; on devnet, USDC-350c4e. The pricing endpoint states which one applies. |
| EGLD | None. That is the point. |
1. Connect
Open app.co-relayer.com and connect your wallet. Connecting asks your wallet to sign one login
message; it costs nothing and is not a transaction. That signature is what lets the dashboard read
what is yours alone — your usage history, your API keys, your notification settings.
Connecting tells the dashboard your address. From it, the dashboard shows which shard you are in, whether you have a plan (from the chain), and how many transactions are left in the current period (from CoRelayer's usage records).
2. Pick a plan
The Plan screen lists every tier that is currently purchasable, with its monthly cap in Relay Units, its price in USDC and its rate class. The numbers come from the contract, not from a price list we keep in a file — see Tiers for the ladder and Tariff for the single value everything is derived from.
Before you buy, know how the price works and that a purchase cannot be refunded. The price is
price_units × tariff, and the tariff is one number on chain. If it ever goes up, the contract
gives 48 hours of notice, and what you have already paid for does not change. USDC that enters the
contract becomes credits, and credits are spent on plans. Credits cannot be withdrawn, so buy the
size you will use.
3. Pay
Checkout builds one transaction: a USDC transfer to the CoRelayer contract that carries the tier id, the number of months and a maximum price you are willing to pay. You sign it once.
You can pay without holding any EGLD. Buying a plan is on the free list, so CoRelayer pays the fee
for that transaction. The transaction also says the most you will pay: if the price moves between
the quote and the block, the contract reverts instead of charging you more, and you see
PRICE_ABOVE_MAX with a fresh quote.
When the transaction executes, the contract converts your USDC, credits your account and writes the plan block that fixes your cap, your period length, your pay-as-you-go price and the number of wallets you can name, for as long as that block lasts.
4. Send your first relayed transaction
From the dashboard, send a test transfer to yourself: the Overview screen offers it while the account has sent nothing yet. It needs no EGLD, and it shows on the Transactions screen once the chain has executed it.
From your own code (a program key), it is one call. This is the relay step of the site's tested example, for a program that holds its own key:
const result = await relayOnce({
client,
sender: wallet.address,
// Every assign call gets a fresh presence proof: the first one, and the renewal when the lease
// expires while the wallet is signing. A proof is accepted only once.
signProof: (message) => wallet.signProofMessage(message),
intentKey: request.intentKey,
...(signal === undefined ? {} : { signal }),
buildTransaction: (assignment) => forAssignment(call, nonce, assignment, chainId),
// The single signature. The relayer is checked on chain first; if it is not an active
// CoRelayer relayer in your shard, nothing is signed.
signOnce: async ({ assignment, transaction }) => {
await relayers.verify(wallet.address, assignment.relayer, assignment.registryVersion, signal);
return wallet.signTransaction(transaction);
},
});
relayOnce has your wallet sign a presence proof (a short message, not a transaction), asks
CoRelayer for a relayer in your shard, builds your transaction with that relayer in it, checks the
relayer against the contract, asks your wallet to sign the transaction once, and submits it. If the
lease expires while you sign, it has your wallet sign one more presence proof to renew the lease,
never a second transaction. The whole file, including the transfer it sends and the check that you are on the
network you meant, is in Sign and relay.
Building an app that pays for its users? Your server relays each transaction with a sponsor key: Pay for your users.
What you should see afterwards
| Where | What |
|---|---|
| The Overview screen | Relay Units used against your cap, and the day the period rolls over. |
| The Transactions screen | One row per relayed transaction: hash, state, how many Relay Units it cost, and how long each stage took — with a CSV export. |
| The Usage screen | The same rows aggregated over the period. |
| The explorer | Your transaction, with your signature and the relayer's, and a fee paid by the relayer. |
When something goes wrong
Every failure is an RFC 9457 problem document whose type is the address of a page on
this site. The three you are most likely to meet first:
| Code | What it means | What to do |
|---|---|---|
NO_ENTITLEMENT | No plan, or the plan has lapsed. | Buy or renew one. |
QUOTA_EXHAUSTED | The cap is used up and pay-as-you-go is off. | Turn on pay-as-you-go or move up a tier. |
RESIGN_REQUIRED | The relayer became unavailable before anything was co-signed. Nothing was sent. | Sign once more, on the same nonce, for the new relayer. The dashboard asks you; it never does this silently. |
Next
- What the dashboard shows you, screen by screen: Dashboard tour
- Questions people ask first: FAQ
- Why a heavy transaction costs more than one unit: Relay Units