Skip to main content
POST
Execute ERC-20 Permit
Execute a gasless ERC-20 token transfer using a signed EIP-2612 permit. The user signs off-chain; the facilitator pays the gas and settles on-chain.
This endpoint is for ERC-2612 permit() transfers. Permit2 payments use POST /v1/settle with the Permit2 payment payload.

Authentication

Requires an API key passed as Authorization: Bearer <api-key>.

Request Body

Facilitator contract addresses

Response

Success

Error

Error Codes

Authorizations

Authorization
string
header
required

Body

application/json
network
string
required

EVM network identifier. Must be one of the facilitator's configured EVM networks (e.g. base, arbitrum, bsc, bot-chain, base-sepolia, bot-chain-testnet, optimism, optimism-sepolia, polygon, unichain, ink, tempo, monad, robinhood, worldchain, hyperevm, megaeth, fluent-testnet, etc.).

Example:

"base-sepolia"

owner
string
required

Token owner address (the signer of the EIP-2612 permit). Tokens are pulled from this address.

Pattern: ^0x[a-fA-F0-9]{40}$
Example:

"0x742d35Cc6634C0532925a3b8D0c4E5e6C2aE7A3e"

spender
string
required

Spender address authorized by the permit signature. Required by the request schema. The on-chain transferWithPermit call uses the facilitator contract as the spender; this field is forwarded for signing-side compatibility.

Pattern: ^0x[a-fA-F0-9]{40}$
Example:

"0x8e633dBf31adCc7D41BE3e95B7c8DD3526B5235A"

value
string
required

uint256 token amount as a decimal string in the token's smallest unit (e.g. 1000000 = 1 USDC at 6 decimals). Numbers and bigints are accepted and coerced to a decimal string.

Pattern: ^\d+$
Example:

"1000000"

deadline
string
required

uint256 permit deadline as a decimal Unix timestamp string. Numbers and bigints are accepted and coerced to a decimal string.

Pattern: ^\d+$
Example:

"1893456000"

recipient
string
required

Address that receives the transferred tokens after the permit is applied.

Pattern: ^0x[a-fA-F0-9]{40}$
Example:

"0x742d35Cc6634C0532925a3b8D0c4E5e6C2aE7A3e"

tokenAddress
string

ERC-20 token address. Documented as optional with a fallback to the network's USDC, but the actual transferWithPermit call uses this value directly. Provide it explicitly to avoid permit_execution_failed.

Pattern: ^0x[a-fA-F0-9]{40}$
Example:

"0x036CbD53842c5426634e7929541eC2318f3dCF7e"

signature
string

Optional 65-byte EIP-2612 permit signature, hex-encoded. Schema accepts ^0x[a-fA-F0-9]+$. WARNING: this field is broken at runtime in the current handler (viem returns r/s as 0x-prefixed and the assembler re-wraps them, producing malformed bytes); use the split (v, r, s) form instead. Provide this OR (v, r, s), but not both.

Pattern: ^0x[a-fA-F0-9]+$
Example:

"0x..."

v
integer

Optional v byte of the signature. The exclusivity check uses Boolean(data.v), so v = 0 is treated as missing; use 27 or 28.

Required range: 0 <= x <= 255
r
string

Optional r component. The schema accepts any string (no regex). In practice, send a 32-byte hex value (with or without leading 0x); only the first occurrence of 0x is stripped when assembling the final signature.

s
string

Optional s component. The schema accepts any string (no regex). In practice, send a 32-byte hex value (with or without leading 0x); only the first occurrence of 0x is stripped when assembling the final signature.

Response

Permit transaction submitted

success
boolean
required

true only when the on-chain transaction was submitted successfully.

transaction
string
required

Transaction hash on success. Empty string ("") on every error response.

network
string
required

Echoes the network from the request (or "" if the request body could not be parsed).

errorReason
enum<string>

Present on error responses only.

Available options:
invalid_request,
unsupported_network,
network_not_configured,
invalid_signature,
permit_execution_failed