VersionedTransaction from either a merchant master wallet or an individual customer’s wallet. Your application builds the transaction; FossaPay verifies ownership, validates and simulates the payload, obtains the managed-wallet signature, and submits it to Solana.
This capability is intended for integrations that need to interact with Solana programs beyond FossaPay’s standard SOL, USDC, and USDT transfer APIs. It does not expose private keys.
Choose the signing endpoint
The authenticated API key determines the merchant boundary. A merchant cannot sign with another merchant’s master wallet or customer wallet.
Transaction requirements
Before submission, build a Solana versioned transaction that satisfies all of the following:- The selected FossaPay wallet is a required signer.
- The selected FossaPay wallet is the transaction fee payer.
- The transaction contains a recent mainnet blockhash.
- Every required signer other than the selected FossaPay wallet has already signed.
- The serialized transaction does not exceed Solana’s 1,232-byte transaction limit.
- The Base64 payload contains the complete serialized
VersionedTransaction. - The fee-payer wallet has enough SOL for network fees and any account rent required by the instructions.
End-to-end flow
1. Retrieve the wallet address
Retrieve the merchant master wallet or the customer’s Solana wallet and use its full address aspayerKey. Never use a truncated display address.
2. Build the transaction
The following example creates a harmless Memo instruction. Replace it with the instructions required by your application.3. Submit with an idempotency key
Use a uniqueX-Idempotency-Key for each logical transaction and retain it with the exact serialized payload.
4. Persist the submission result
A successful request returns HTTP202 with a FossaPay requestId, the wallet identity, provider transaction ID, transaction hash, explorer link, and simulation result. Persist at least:
requestIdX-Idempotency-Key- wallet type, wallet ID, and wallet address
- customer ID when applicable
- transaction hash and explorer link
- submission status and timestamps
HTTP
202 and status submitted mean the transaction was accepted and broadcast. They do not mean it is confirmed or finalized on-chain.Status and finality
FossaPay reconciles submitted signatures through its configured Solana RPC connection. This signing flow does not emit a merchant webhook, so your integration must use the recorded signing status and transaction hash to establish finality.
FossaPay automatically checks non-terminal records approximately every 30 seconds. The merchant dashboard can also request an immediate refresh. Refreshing checks the existing transaction signature; it does not sign or broadcast another transaction.
Idempotency and retries
Idempotency is scoped to the authenticated merchant.- Reusing a key with the identical wallet and serialized transaction returns the existing submitted result.
- Reusing a key with different input returns HTTP
409. - A request still marked
processingreturns HTTP409. - A failed signing request cannot be retried with the same key.
- After failure or blockhash expiry, fetch a fresh blockhash, rebuild the transaction, and use a new idempotency key.
Error handling
Security controls
- Generate and inspect instructions on a trusted server; do not accept opaque client-built transactions without policy checks.
- Allowlist program IDs and validate writable accounts, token mints, recipients, and amounts.
- Keep API keys server-side and rotate exposed keys immediately.
- Bind your own business operation ID to the FossaPay request ID and transaction hash.
- Never infer transaction intent from a memo or UI label alone.
- Use decimal-safe amount conversion and verify token mint addresses.
- Record authorization decisions before requesting a managed-wallet signature.
API reference
Production checklist
- The API key and wallet belong to the intended merchant.
- The selected wallet is both a required signer and fee payer.
- All instructions, accounts, amounts, mints, and program IDs passed application policy checks.
- Other required signers signed before serialization.
- The blockhash is recent and the wallet has enough SOL for execution.
- A unique idempotency key is stored with the exact payload.
-
submittedis displayed as pending until reconciliation reaches a terminal state. - Ambiguous responses are retried only with the same payload and key.

