Choose who pays gas
All three choices usePOST /v1/wallets/{walletId}/transfer. Para estimates fees and fills transaction details for
ordinary wallet-paid transfers too; you do not need to set gas parameters manually.
Only explicit
true requests sponsorship, even for an enrolled partner. Para honors the chosen payer or returns an
error; it never switches who pays. Combining true with autoRetry, even null or empty, returns
400 SPONSORSHIP_UNSUPPORTED_REQUEST. Sponsorship does not guarantee confirmation.
broadcast: false is available only for an ordinary transfer: it signs without submitting or incurring gas at that point.
Add a Guardrail on request.gas.maxExecutionCost to set a policy execution gas limit. Para checks the final sponsored operation’s gas ceiling after refreshing its quote; the cap does not include billing markups or the transferred token amount.
Send a transfer
Use an API-created, unclaimed EVM wallet that is ready for signing and holds the tokens to send. Ask Para to enroll your partner for sponsorship in the environment you use; Beta and production enrollment are separate. Confirm your organization’s billing setup for Beta or production mainnet before sending. Initializepara as shown in REST SDK. Choose chainId and tokenAddress from the
supported token table. The listed tokens use 6 decimals, so "1000000" sends 1 USDC or 1 USDT.
Save the request body and an idempotency key in your payout or job record before calling transfer().
Reuse both if the HTTP request is interrupted. Para selects the nonce, gas limits, and fees, then submits the operation.
sponsored-transfer.ts
202, with sponsoredGas: true, transactionId, and status.
Save the tracking ID. Para also returns it in x-transaction-id and provides the lookup path in Location.
The response contains no signed transaction bytes. userOperationHash identifies the sponsored operation;
txHash in transfer and replay responses and hash in transaction lookup/history identify the on-chain transaction
after inclusion.
202 means the request is recorded. Para checks policy, recipient screening (for API keys that have opted in), and any configured gas cap afterward.
Rejections during preparation appear as tracked failed results; uncertain outcomes remain nonterminal.
Request constraints and errors
value is a positive integer in token base units. Sponsored requests accept only to, value, chainId,
tokenAddress, kind, broadcast, addressScreening, and sponsoredGas. Any other field is rejected,
even as null or an empty value. This includes urgency, autoRetry, nonce, gasLimit, maxFeePerGas,
maxPriorityFeePerGas, gasPrice, type, reviewId, initiatorUserId, and network.
Do not copy fee-estimate fields into a sponsored request.
Omit broadcast or set it to true, and do not set addressScreening: false.
Use sponsoredGas: false when you need supported wallet-paid nonce, fee, or retry controls.
Existing billing readiness, wallet access, permissions, gas-cap, and (for API keys that have opted in) recipient-screening checks still apply.
Use wallet-paid gas
Fund the wallet with native tokens for gas before broadcasting, including for ERC-20 transfers.wallet-paid-transfer.ts
200 with sponsoredGas: false, signed bytes, and broadcast identifiers when
submitted. Wallet-paid automatic retry returns HTTP 202, sponsoredGas: false,
and its tracking record instead. HTTP 202 alone does not identify the payer.
Track and resume
PollgetRestTransaction() using the original tracking ID. See Transaction history.
resume-transfer.ts
POST /v1/wallets/{walletId}/transactions/{transactionId}/resume.
It accepts the applicable review ID, not a replacement recipient or amount. Later steps can require another review.
This supports existing policy reviews. Conditional approval policies are not supported for sponsored transfers.
If the transfer response is lost, repeat the original request with the same key. Sponsored keys recover the same
operation beyond 24 hours and after sponsorship is disabled. Reusing a key for a different wallet or intent returns
409 IDEMPOTENCY_CONFLICT. Replaying transfer() retrieves status; it does not resume a review.
Replaying an existing sponsored key requires sponsoredGas: true and unchanged economic intent. Replaying its key
with sponsoredGas: false or the flag omitted returns 409 IDEMPOTENCY_CONFLICT.
Do not reuse a wallet-paid request’s key to request sponsorship.
Ordinary wallet-paid requests retain their idempotency record for 24 hours; after that record expires,
the same key with sponsoredGas: true can create a new sponsored payment.
actualGasCost is the settled cost of the individual operation in native-token base units, including included reverts.
Read it as a decimal string or bigint. A timeout does not establish failure, and gas cost does not establish token delivery.
If transaction lookup returns status: "failed" with failureCode: "SPONSORSHIP_PAYMASTER_EXPIRED", Para has
proved that the signed gas sponsorship expired without inclusion on-chain. The expired operation has no settled
gas cost and is not billed.
Replaying the original idempotency key returns the same terminal record. To retry the transfer after this result,
submit a new request with a new idempotency key.
Supported networks and eligibility
Existing mainnet sponsorship enrollment covers USDC and USDT on Ethereum and Base. All listed tokens use 6 decimals:
"1000000" transfers 1 USDC or 1 USDT, depending on tokenAddress. Beta supports testnet sponsorship only;
test USDC has no monetary value. Para does not apply a default per-operation gas cap on either Sepolia network;
mainnet sponsorship requires one. Use env: "PROD" for production and env: "BETA" for Beta when initializing the
REST SDK, with the secret key for that environment.
Ethereum USDT sponsorship requires the contract to be non-deprecated with zero transfer-fee settings. Token issuer
restrictions, including pauses or blocked addresses, can prevent a transfer. Para confirms delivery only after
verifying the requested token, recipient, and full amount in the operation’s receipt.
Para manages the sponsorship provider credentials, policy, and gas caps. Your integration uses the Para secret key
for the target environment; no Pimlico key or policy ID is required in your requests.
Eligible wallets must belong to your partner, be API-created and unclaimed, and be ready for signing. Enrollment
covers eligible wallets created before or afterward. Each transfer still requires wallet access, permissions,
billing readiness, and (for API keys that have opted in) recipient screening. Solana sponsorship is not supported by this flow.
Billing
Every Beta sponsored transfer, including testnets, and every production mainnet sponsored transfer requires your organization’s existing Stripe customer and exactly one current subscription. That subscription must be active and not in trial. Use test mode for Beta and live mode for production mainnet. Para automatically attaches sponsored-gas metering when needed before accepting a new transfer; no separate gas-billing opt-in is required. Missing or unready billing returns503 SPONSORSHIP_BILLING_UNAVAILABLE;
the request does not fall back to wallet-funded gas or return a tracked 202.
Production testnet transfers do not require billing setup and are excluded from live gas billing.
The Developer Portal’s Billing page shows sponsored operations and their saved USD estimates. Each estimate uses
the operation’s settled native gas cost, a saved exchange-rate quote, and the configured provider and Para fees.
The estimate is separate from Pimlico’s provider invoice. Reverted operations included on-chain still consume gas;
operations that were never submitted do not incur sponsored execution gas.
Response compatibility
Transfer and transaction-history responses reportsponsoredGas as a Boolean. The deprecated executionMode
response field remains for compatibility; sending it in a transfer request returns 400.
Use the SDK’s isSponsoredTransfer(result) to distinguish sponsored and ordinary transfer responses. It reads
sponsoredGas when present and falls back to executionMode for older responses without the Boolean.
transfer() throws ParaRestSponsorshipError when the
response’s gas payer differs from the requested sponsoredGas value. The transfer may already be submitted, so
reconcile error.response before you retry with the same key.