Submit a signed permit for gasless deposit relay
Gasless USDC deposit. The user signs an EIP-2612 USDC.permit TypedData with their embedded wallet (spender = multicallExecutor from GET /api/platform/contracts, value = amount, nonce = USDC.nonces(owner)) and posts the split signature (v, r, s) here. The backend ecrecovers the signature (must equal the authenticated wallet), validates deadline / chain / token / nonce + runs compliance + a tier-cap pre-check, persists a deposit_audit row, and enqueues a permit_deposit job. The relayer then broadcasts an atomic MulticallExecutor batch (permit -> transferFrom -> approve -> Vault.depositERC20 -> cleanup) so the user pays no gas. Poll GET /api/deposits/relay/{auditId} for progress. The auditId is returned even on failure so it can be referenced in support. Rate-limited 60/min/IP and 10/min/wallet.
Authorizations
Partner / integrator key — format ps_live_<keyId>_<secret>. Issued by PredictStreet ops via the admin panel; never self-service. Never ship to a browser. multi_wallet partners must additionally send X-User-Wallet: 0x<40-hex> on every authenticated request to declare the acting wallet. See the API keys guide for scope taxonomy, partner kinds, rate limits, and rotation procedure.
Headers
Required for multi_wallet partners on every authenticated request; ignored for single_wallet. Declares the acting end-user wallet for this request — drives KYC checks, balances/positions/orders attribution, rate-limit buckets, and audit. Lower-cased server-side. Missing on a multi_wallet key → 401 api_key_user_wallet_required; malformed → 401 api_key_user_wallet_invalid. The on-chain CTFExchange/Vault contracts still verify EIP-712 signer ↔ vault binding, so loosening API-layer attribution is safe by construction.
^0x[a-fA-F0-9]{40}$"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb3"
Body
USDC amount in raw units (6 decimals — 1 USDC = "1000000"). Must equal the value signed into the permit.
"25000000"
Current USDC.nonces(owner), read on-chain immediately before signing.
"7"
EIP-2612 permit deadline, unix seconds. Must leave the submitter enough buffer or the request is rejected with permit_deadline_too_soon.
1780000000
Recovery id of the permit signature.
27
32-byte r component of the permit signature (0x-hex).
"0x..."
32-byte s component of the permit signature (0x-hex).
"0x..."
Optional. The wallet the permit was built for; if present it must equal the authenticated wallet, else permit_signer_mismatch. Defence-in-depth only — the canonical signer is recovered server-side.
"0x1234567890abcdef1234567890abcdef12345678"