Gnosis Pay
Last reviewed: 2026-04-28
Payment Rail
Open Source
Best for: Agents needing a real Visa debit card linked to a self-custodial smart account; bridge between DeFi and real-world spending
Not ideal for: Non-EVM chains; purely on-chain operations; enterprise with compliance requirements
Key Signals
Card Type
Self-custodial Visa debit
Wallet
Safe smart account
Pricing
Free to use (card fees apply)
Features
💳
Self-Custodial Visa Debit Card
A real Visa debit card whose funds stay in a self-custodial Safe smart account until the moment of payment. Unlike custodial cards, no third party holds your agent's funds — the card settles directly from the on-chain account.
🔐
Linked to Safe Smart Account
The Gnosis Pay card is backed by a Safe (formerly Gnosis Safe) multisig smart account. AI agents with signing authority on the Safe can programmatically approve transactions, enabling multi-party authorization for high-value agent spending.
⛓️
Gnosis Chain (xDAI / USDC)
Operates on Gnosis Chain, an EVM-compatible network with low fees and fast finality. Supports xDAI and USDC as spending currencies, converting to local fiat at point-of-sale via Visa's settlement network.
🏪
Real-world Merchant Acceptance
Works at any merchant that accepts Visa, bridging on-chain DeFi funds with the offline world. Agents can book flights, pay contractors, purchase SaaS subscriptions, and handle any real-world expense from a self-custodial wallet.
Ratings
Ratings based on documentation review, GitHub activity, and public developer reports. Not independently verified in production.
Integration
npm install @safe-global/protocol-kit @safe-global/api-kit
import SafeApiKit from '@safe-global/api-kit';
import Safe from '@safe-global/protocol-kit';
import { parseEther } from 'viem';
const protocolKit = await Safe.init({
provider: 'https://rpc.gnosis.gateway.fm',
signer: process.env.AGENT_PRIVATE_KEY,
safeAddress: '0xYOUR_GNOSIS_PAY_SAFE_ADDRESS',
});
const balances = await protocolKit.getBalances();
const safeTransaction = await protocolKit.createTransaction({
transactions: [{
to: '0xUSDC_CONTRACT_GNOSIS_CHAIN',
value: '0',
data: encodeTransferData('0xYOUR_SAFE', parseEther('100')),
}],
});
const signedTx = await protocolKit.signTransaction(safeTransaction);
const result = await protocolKit.executeTransaction(signedTx);