Skip to content

Paymaster API

The Paymaster API signs paymasterAndData for your ERC-4337 UserOperations. It exposes both an ERC-7677-compliant JSON-RPC surface and a thin REST surface.

Authorization: Bearer sk_live_...

All endpoints accept either a sk_live_* server key or a publishable pmc_* key (REST only, with origin allowlisting).

EnvURL
Productionhttps://api.stablecoinx.com
Sandboxhttps://api.sandbox.stablecoinx.com

Sign paymasterAndData for a UserOperation.

Body

FieldTypeRequiredDescription
userOpUserOperationyesThe unsigned UserOp
mode"sponsor" | "user_pays"noOverride project default
chainstringyese.g. base, arbitrum
policyKeystringnoNamed per-sender policy

Response

{
"paymasterAndData": "0x...",
"preVerificationGas": "0x...",
"verificationGasLimit": "0x...",
"callGasLimit": "0x..."
}

Returns paymaster metadata for the calling project.

{
"contracts": {
"base": "0xPaymaster...",
"arbitrum": "0xPaymaster...",
"optimism": "0xPaymaster...",
"ethereum": "0xPaymaster..."
},
"supportedAssets": ["USDe", "USDC"],
"modesEnabled": ["sponsor", "user_pays"],
"limits": {
"sponsorBudgetRemaining": "100.00",
"perSenderDailyCap": "10.00"
}
}

Create or update a per-sender policy.

{
"name": "vip-users",
"senders": ["0xabc...", "0xdef..."],
"mode": "sponsor",
"dailyCap": "5.00",
"monthlyCap": "100.00"
}

Endpoint: POST https://api.stablecoinx.com/v1/paymaster/rpc

Returns dummy paymaster data for gas estimation.

{
"jsonrpc": "2.0",
"id": 1,
"method": "pm_getPaymasterStubData",
"params": [
{ /* UserOperation */ },
"0xEntryPoint",
"0x2105",
{ "mode": "sponsor" }
]
}

Returns signed paymaster data ready to submit.

{
"jsonrpc": "2.0",
"id": 2,
"method": "pm_getPaymasterData",
"params": [ /* same shape */ ]
}
HTTPCodeMeaning
400invalid_useropUserOp failed schema validation
401unauthorizedMissing or invalid key
402sponsor_budget_exhaustedDaily or monthly sponsor cap hit
403sender_not_allowedSender outside the active policy
422unsupported_chainchain not enabled for this project
429rate_limitedRetry after Retry-After
import { Paymaster } from "@stablecoinx/sdk";
const pm = new Paymaster({ apiKey: process.env.STABLECOINX_KEY! });
const { paymasterAndData } = await pm.sign({
userOp,
mode: "user_pays",
chain: "base",
});