Gas Waiver enables gas-free transactions on Stable. With Gas Waiver, applications cover gas fees on behalf of users, so users can interact with contracts without holding USDT0 for gas. This guide covers integrating via the Waiver Server API.Documentation Index
Fetch the complete documentation index at: https://docs.stable.xyz/llms.txt
Use this file to discover all available pages before exploring further.
Concept: For what Gas Waiver is, why it exists, and how governance-authorized waivers work, see Gas waiver. For the full protocol specification (wrapper transaction format, marker address, execution semantics, security model), see Gas waiver protocol.
Prerequisites
- An API key for the Waiver Server, issued by the Stable team
- Target contract address must be registered in the waiver’s
AllowedTargetpolicy
Waiver Server
Base URLs:- Mainnet: TBD
- Testnet:
https://waiver.testnet.stable.xyz
Bearer <your-api-key>
Overview
The integration flow has three steps:- Build an InnerTx: the user signs a transaction with
gasPrice = 0. - Submit to Waiver Server: submit the signed transaction to the Waiver Server API.
- Handle the response: the waiver server wraps and broadcasts the transaction. Process the streamed results and surface the transaction hash to the user.
Step 1: create the user’s InnerTx
The user signs a standard transaction withgasPrice = 0. The to address and method selector must be permitted by the waiver’s AllowedTarget policy.
Step 2: submit to the Waiver Server
Batch submissions
You can submit multiple signed transactions in a single request:index field corresponding to the transaction’s position in the array.
Step 3: handle the response
The response is streamed as NDJSON (newline-delimited JSON). Each line corresponds to one submitted transaction.Error codes
| Code | Description |
|---|---|
PARSE_ERROR | Failed to parse transaction |
INVALID_REQUEST | Malformed request body |
BATCH_SIZE_EXCEEDED | Batch size exceeds allowed maximum |
VALIDATION_FAILED | Transaction validation failed (e.g., invalid signature, disallowed target) |
BROADCAST_FAILED | Failed to broadcast to chain |
RATE_LIMITED | Rate limit exceeded |
QUEUE_FULL | Server queue at capacity |
TIMEOUT | Request timed out |
API reference
GET /v1/health
Health check endpoint. Authentication: none.
POST /v1/submit
Submit a batch of signed inner transactions. Authentication: required (Bearer).
Request body:
GET /v1/submit
WebSocket interface for streaming submissions. Authentication: required (Bearer).
Key takeaways
- Gas Waiver is a server-side integration: your backend submits signed user transactions to the Waiver Server. Users never interact with the Waiver Server directly.
- The user always signs the InnerTx, preserving signature integrity. The waiver cannot modify the user’s transaction.
- The target contract must be on the waiver’s
AllowedTargetlist.
Next recommended
Zero gas transactions
See the demo-focused flow and how to verify zero gas on a receipt.
Self-hosted Gas Waiver
Run your own waiver without the hosted API.
Gas waiver protocol
Full wrapper transaction spec and governance model.
Stable SDK
Use the typed client to sign user transactions you then submit to the Waiver Server.

