Skip to content
Create account or Sign in
The Stripe Docs logo
/
Ask AI
Create accountSign in
Get started
Payments
Revenue
Platforms and marketplaces
Money management
Developer resources
APIs & SDKsHelp
OverviewAccept a paymentUpgrade your integration
Online payments
OverviewFind your use case
Use Payment Links
Use a prebuilt checkout page
Build a custom integration with Elements
Build an in-app integration
Use Managed Payments
Recurring payments
In-person payments
Terminal
Payment methods
Add payment methods
    Overview
    Payment method integration options
    Manage default payment methods in the Dashboard
    Payment method types
    Cards
    Pay with Stripe balance
    Stablecoin payments
      Accept stablecoin payments
        Deposit mode stablecoin payments
    Bank debits
    Bank redirects
    Bank transfers
    Credit transfers (Sources)
    Buy now, pay later
    Real-time payments
    Vouchers
    Wallets
    Enable local payment methods by country
    Custom payment methods
Manage payment methods
Faster checkout with Link
Payment operations
Analytics
Balances and settlement time
Compliance and security
Currencies
Declines
Disputes
Radar fraud protection
Payouts
ReceiptsRefunds and cancellations
Advanced integrations
Custom payment flows
Flexible acquiring
Off-Session Payments
Multiprocessor orchestration
Beyond payments
Incorporate your company
Crypto
Agentic commerce
Machine payments
Financial Connections
Climate
Verify identities
United States
English (United States)
  1. Home/
  2. Payments/
  3. Add payment methods/
  4. Stablecoin payments/
  5. Accept stablecoin payments

Deposit mode stablecoin paymentsPrivate preview

Accept stablecoin payments with API-only deposit addresses.

Deposit mode is an API-only crypto payment flow where we return deposit addresses for each requested network. When your customer sends funds to a deposit address, we automatically capture the PaymentIntent after the funds settle on-chain.

Before you begin

  • A Stripe account.
  • Crypto payins enabled for your account.
  • Access to deposit mode. Contact machine-payments@stripe.com.

Create a PaymentIntent

Create a PaymentIntent with the crypto payment method and mode: "deposit". Specify the networks that you want deposit addresses for by using deposit_options.networks.

API version

This feature requires the 2026-03-04.preview API version. Set the Stripe-Version header to 2026-03-04.preview when initializing your Stripe client.

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/payment_intents \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Version: 2026-03-04.preview" \ -d amount=5000 \ -d currency=usd \ -d "payment_method_types[]"=crypto \ -d "payment_method_data[type]"=crypto \ -d "payment_method_options[crypto][mode]"=deposit \ -d "payment_method_options[crypto][deposit_options][networks][]"=base \ -d "payment_method_options[crypto][deposit_options][networks][]"=tempo \ -d "payment_method_options[crypto][deposit_options][networks][]"=solana \ -d confirm=true

PaymentIntent response

The confirmed PaymentIntent includes crypto_display_details in next_action, which contains deposit addresses and supported_tokens for each network:

{ "id": "pi_123", "amount": 5000, "currency": "usd", "status": "requires_action", "next_action": { "type": "crypto_display_details", "crypto_display_details": { "deposit_addresses": { "base": { "address": "0xbase_address", "supported_tokens": [ { "token_currency": "usdc", "token_contract_address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" } ] }, "tempo": { "address": "0xtempo_address", "supported_tokens": [ { "token_currency": "usdc", "token_contract_address": "0x20c000000000000000000000b9537d11c60e8b50" } ] }, "solana": { "address": "So1ana_deposit_address", "supported_tokens": [ { "token_currency": "usdc", "token_contract_address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" } ] } } } } }

Present the deposit address to your customer along with the expected amount and supported tokens. Your customer sends the correct token to the deposit address on the specified network.

Payment lifecycle

Use the following steps to understand how a deposit-mode PaymentIntent moves from confirmation to completion.

  1. After you confirm the PaymentIntent, it enters the requires_action status with deposit address details. The Stripe Dashboard displays these PaymentIntents as Incomplete while it waits for your customer to send funds.
  2. Your customer sends funds to the deposit address on-chain.
  3. Stripe detects the on-chain transaction and move the PaymentIntent to processing while we validate the transaction details.
  4. After validations complete, the PaymentIntent moves to succeeded.

Transfer detection delay

It can take a few minutes for us to detect the transfer after the network confirms it.

If the transaction fails validation or we can’t match the deposit, the PaymentIntent returns to requires_payment_method. Otherwise, the PaymentIntent remains in requires_action.

Transaction details

After the PaymentIntent succeeds, retrieve on-chain transaction details by expanding latest_charge on the PaymentIntent. The payment_method_details.crypto hash on the charge includes fields such as the transaction hash, buyer wallet address, network, and token currency.

Failure modes

Use the following scenarios to understand when we can’t match a deposit to a PaymentIntent.

  • Wrong network or asset: If your customer sends tokens on a network or with a token contract that doesn’t match the deposit address, we can’t automatically match or return the funds.
  • Funds after expiration: If your customer sends funds after the PaymentIntent expires, we can’t automatically match or return the funds.
  • Overpayment or underpayment: The token amount that your customer transfers must exactly match the amount on the PaymentIntent. If your customer sends more or less than the specified amount, we can’t automatically match or return the funds.
    • The transferred token amount must exactly match the PaymentIntent amount. Because fiat currencies and stablecoins use different decimal precisions, account for this difference when you calculate the transfer. For example, USD uses two decimal places, while USDC uses six. To fulfill a PaymentIntent for 1.01 USD (101 minor units), your customer must transfer exactly 1.010000 USDC (1,010,000 minor units).

Refunds

When you refund a deposit mode payment, we return funds to the sending wallet address from the detected on-chain transaction.

Caution

Make sure that you verify the destination address before you initiate the refund. If your customer paid from an exchange or omnibus wallet, they might not be able to recover refunded funds.

Token and network support

PaymentIntents with the crypto payment method in mode: deposit support USDC on the following networks:

NetworkTokenToken contract address
TempoUSDC0x20c000000000000000000000b9537d11c60e8b50
BaseUSDC0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
SolanaUSDCEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v

Test your integration

Sandboxes don’t monitor crypto testnets, so we can’t automatically detect testnet transactions that you send. Instead, use the test helper endpoint to simulate crypto deposits for sandbox PaymentIntents. This lets you verify your integration immediately without relying on on-chain transactions.

Command Line
cURL
No results
curl https://api.stripe.com/v1/test_helpers/payment_intents/{{PAYMENT_INTENT_ID}}/simulate_crypto_deposit \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Version: 2026-03-04.preview" \ -d transaction_hash=0x00000000000000000000000000000000000000000000000000000testsuccess \ -d network=base \ -d token_currency=usdc \ -d buyer_wallet=0x0000000000000000000000000000000000000000

To simulate different outcomes, set transaction_hash to one of the following:

Transaction hash Outcome
0x00000000000000000000000000000000000000000000000000000testsuccessPaymentIntent succeeds within 15 seconds
0x000000000000000000000000000000000000000000000000000000testfailedThe charge fails, and the PaymentIntent returns to requires_payment_method within 15 seconds
Was this page helpful?
YesNo
  • Need help? Contact Support.
  • Chat with Stripe developers on Discord.
  • Check out our changelog.
  • Questions? Contact Sales.
  • LLM? Read llms.txt.
  • Powered by Markdoc
On this page
Related Guides
Machine Payments