Skip to main content

Documentation Index

Fetch the complete documentation index at: https://apidocs.bridge.xyz/llms.txt

Use this file to discover all available pages before exploring further.

The Bridge + Stripe Issuing integration connects together two separate sandbox environments: the Stripe Sandbox for card creation and transaction simulation, and the Bridge sandbox for customer and KYC testing. You can use the sandbox integration to test cards against Bridge-custodied wallets using simulated Bridge Wallets, or noncustodial wallets on Base Sepolia and Solana Devnet. We are continually adding support for more chains. With the Bridge Stripe Issuing integration, Bridge handles the customer KYC/KYB and onchain operations, and Stripe handles interactions with the card network. You’ll start by creating customers on Bridge in the Bridge API to perform KYC/KYB. Once they pass the card endorsement requirements, Bridge will automatically create the corresponding entities within your Stripe account. Subsequently, you’ll be using your Stripe Sandbox to issue cards and perform all card management, simulate authorizations, and test other Stripe Issuing features.

Step 1: Connect Bridge and Stripe Sandbox

Bridge only supports testing cards against the Stripe Sandbox. Stripe’s Test Mode is not supported for this integration.
If you have not done so already, generate a Bridge Sandbox in the Bridge Dashboard in the API keys page. This will generate a Bridge sandbox environment for your Bridge user, and an API key to interact with it. Separately, if you have not done so, create a Stripe Sandbox. If you don’t already have a Stripe Account, you can create a new one here. Install the Bridge Cards Stripe App on the sandbox account to give Bridge access to your sandbox Stripe account. Additionally, for testing commercial cards, you will need to enable Stripe Connect on your sandbox account. Next, you can connect your Stripe Sandbox to your Bridge Sandbox by passing in the Stripe account ID and program type, like so:
curl -X POST 'https://api.sandbox.bridge.xyz/v0/cards/enable' \
 --header 'Content-Type: application/json' \
 --header 'Api-Key: <ApiKey>' \
 --header 'Idempotency-Key: <IdempotencyKey>' \
 -d '{"stripe_account_id": "acct_abc123", "program_type": "consumer"}'
For program_type, you may pass in consumer for consumer card issuing, or commercial for commercial card issuing.
Note that Bridge sandbox environments are created per-user (not developer). One Stripe sandbox account may be connected to one Bridge sandbox account. For now, this step is necessary for Bridge to know which Stripe sandbox to associate your Bridge account to.
Once the connection is complete, your Stripe Account will automatically be onboarded to Stripe Issuing for stablecoins.

Step 2: Create a customer

Next, you’ll create a customer to represent the individual or business entity that you’re creating cards for, and obtain the cards endorsement. Depending on your program type, the type of customer you’ll be creating will be different:
  • For consumer cards, you’ll be creating an individual-typed customer. When the cards endorsement is granted, Bridge will automatically create a Cardholder in Stripe that you can use directly to create a card.
  • For commercial cards, you’ll be creating a business-typed customer. When the cards endorsement is granted, Bridge will automatically create an Account in Stripe to represent the business. You can then further create Cardholders to model authorized users for that business and create cards for those cardholders.
Here are some examples of requests you can use to create test customers in Bridge sandbox:
{
  "type": "individual",
  "first_name": "John",
  "last_name": "Doe",
  "endorsements": ["base", "sepa", "cards"],
  "email": "elvin@bridge.xyz",
  "phone": "+12223334444",
  "residential_address": {
    "street_line_1": "123 Washington St",
    "street_line_2": "Apt 2F",
    "city": "Chicago",
    "state": "IL",
    "postal_code": "10001",
    "country": "USA"
  },
  "signed_agreement_id": "foobar",
  "birth_date": "1989-09-09",
  "identifying_information": [
    {
      "type": "ssn",
      "issuing_country": "usa",
      "number": "111-11-1111"
    },
    {
      "type": "drivers_license",
      "issuing_country": "usa",
      "number": "12345",
      "image_front": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAADMElEQVR4nOzVwQnAIBQFQYXff81RUkQCOyDj1YOPnbXWPmeTRef+/3O/OyBjzh3CD95BfqICMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMO0TAAD//2Anhf4QtqobAAAAAElFTkSuQmCC",
      "image_back": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAADMElEQVR4nOzVwQnAIBQFQYXff81RUkQCOyDj1YOPnbXWPmeTRef+/3O/OyBjzh3CD95BfqICMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMO0TAAD//2Anhf4QtqobAAAAAElFTkSuQmCC"
    }
  ]
}

Obtain Cards Endorsement

Within the customer object, you can track the customer’s eligibility for cards by looking at the cards endorsement. Here’s an example cards endorsement with some missing requirements:
{
  "name": "cards",
  "status": "incomplete",
  "requirements": {
    "complete": [
      "first_name",
      "last_name",
      "tax_identification_number",
      "email_address",
      "address_of_residence",
      "date_of_birth",
      "proof_of_address",
      "min_age_18",
      "valid_date_of_birth",
      "selfie_verification",
      "government_id_rejection_checks_passed",
      "government_id_review_checks_passed",
      "fresh_first_name",
      "fresh_last_name",
      "fresh_date_of_birth",
      "fresh_address_of_residence",
      "fresh_tax_identification_number",
      "customer_region_supports_cards",
      "customer_address_is_valid_for_cards"
    ],
    "pending": [],
    "missing": {
      "all_of": [
        "terms_of_service_v1",
        "sanctions_screen",
        "pep_screen",
        "blocklist_lookup",
        {
          "any_of": [
            "has_base",
            "database_lookup",
            "government_id_verification"
          ]
        }
      ]
    },
    "issues": []
  },
  "additional_requirements": []
}
Most requirements such as government_id_verification, database_lookup, blocklist_lookup, and pep_screen should be processed automatically within seconds, but the customer will need to accept the terms of service, which you can fetch using the tos_link field from the customer object. You may also complete KYC or confirm KYC details using a Bridge hosted link, like so:
curl 'https://api.sandbox.bridge.xyz/v0/customers/fc7c8079-1c66-4b42-b470-fb49ee502f19/kyc_link' \
 --header 'Content-Type: application/json' \
 --header 'Api-Key: <ApiKey>'
Once the cards endorsement is approved, the customer object will look like the following:
{
    "id": "fc9e3ad8-186a-4b09-9400-fabfc6709f63",
    "first_name": "John",
    "last_name": "Doe",
    "email": "elvin+testindividual@bridge.xyz",
    "status": "active",
    "type": "individual",
    "persona_inquiry_type": "gov_id_db",
    "created_at": "2026-05-01T22:58:19.647Z",
    "updated_at": "2026-05-01T22:58:44.031Z",
    "rejection_reasons": [],
    "has_accepted_terms_of_service": true,
    "endorsements": [
        {
            "name": "base",
            "status": "approved",
            "requirements": {
                "complete": [
                    "terms_of_service_v1",
                    "first_name",
                    "last_name",
                    "tax_identification_number",
                    "email_address",
                    "address_of_residence",
                    "date_of_birth",
                    "proof_of_address",
                    "sanctions_screen",
                    "pep_screen",
                    "blocklist_lookup",
                    "min_age_18",
                    "valid_date_of_birth",
                    "selfie_verification",
                    "government_id_rejection_checks",
                    "government_id_review_checks",
                    "database_lookup",
                    "government_id_verification",
                    "post_processing"
                ],
                "pending": [],
                "missing": null,
                "issues": []
            }
        },
        {
            "name": "cards",
            "status": "approved",
            "requirements": {
                "complete": [
                    "terms_of_service_v1",
                    "first_name",
                    "last_name",
                    "tax_identification_number",
                    "email_address",
                    "address_of_residence",
                    "date_of_birth",
                    "proof_of_address",
                    "sanctions_screen",
                    "pep_screen",
                    "blocklist_lookup",
                    "min_age_18",
                    "valid_date_of_birth",
                    "selfie_verification",
                    "government_id_rejection_checks",
                    "government_id_review_checks",
                    "database_lookup",
                    "government_id_verification",
                    "fresh_first_name",
                    "fresh_last_name",
                    "fresh_date_of_birth",
                    "fresh_address_of_residence",
                    "fresh_tax_identification_number",
                    "customer_region_supports_cards",
                    "customer_address_is_valid_for_cards"
                ],
                "pending": [],
                "missing": null,
                "issues": []
            }
        },
        {
            "name": "sepa",
            "status": "approved",
            "requirements": {
                "complete": [
                    "terms_of_service_v2",
                    "first_name",
                    "last_name",
                    "tax_identification_number",
                    "email_address",
                    "address_of_residence",
                    "date_of_birth",
                    "proof_of_address",
                    "sanctions_screen",
                    "pep_screen",
                    "blocklist_lookup",
                    "min_age_18",
                    "valid_date_of_birth",
                    "selfie_verification",
                    "government_id_rejection_checks",
                    "government_id_review_checks",
                    "database_lookup",
                    "government_id_verification"
                ],
                "pending": [],
                "missing": null,
                "issues": []
            }
        }
    ],
    "future_requirements_due": [],
    "requirements_due": [
        "external_account"
    ],
    "capabilities": {
        "payin_crypto": "active",
        "payout_crypto": "active",
        "payin_fiat": "pending",
        "payout_fiat": "pending"
    },
    "residential_address": {
        "subdivision": "IL",
        "country": "USA"
    },
    "state": "IL",
    "country": "USA",
    "stripe_cardholder_id": "ich_1TSQ16DfQGJXhssyqZSyeiDw",
    "stripe_account_id": "acct_1TSQ0zDfQG95NzMA"
}

Individual customers

For individual customers, the stripe_cardholder_id from the Customer object represents the ID of a Cardholder in Stripe. You can confirm that it now exists within the Issuing > Cardholders section of your Stripe dashboard:
Screenshot 2026 05 01 At 6 59 36 PM
Note that for individual customers, the cards endorsement has a 24 hour validity period, after which it will expire, and the corresponding cardholder will be transitioned to an inactive state. The customer only has to reconfirm their information to be regranted the endorsement. More details about the cards eligibility requirements are available here.

Business customers

For business customers, the stripe_account_id from the Customer object represents the ID of a new Stripe Account created under your main Stripe Account. You can think of this new account as a subaccount representing the business onboarding onto your platform. (Learn more about how Accounts are modeled within Stripe Connect here.) You can verify that the created account now shows up in your Stripe Dashboard in the Connected accounts section:
Image
Note that the account status may say “restricted”; this is entirely expected. This means that the account has card issuing capabilities but not general Stripe payments capabilities. You can proceed to creating Cardholders for the business using the created stripe_account_id. You should use your main Stripe API key to make the request, but populate the Stripe-Account header with the Stripe account ID of the business.
Note: even if you created associated persons for the business-typed Customer in Bridge, you’ll have to create Cardholders in Stripe to specifically represent their cardholder state.
The request should look like the following:
curl -X POST https://api.stripe.com/v1/issuing/cardholders \
  -u sk_live_…: \
  -H "Stripe-Account: acct_1TON9bRnOOLRFZyT" \
  -d "name=Jenny Rosen" \
  -d "email=jenny.rosen@example.com" \
  -d "phone_number=+18008675309" \
  -d "status=active" \
  -d "type=individual" \
  -d "individual[first_name]=Jenny" \
  -d "individual[last_name]=Rosen" \
  -d "individual[dob][day]=1" \
  -d "individual[dob][month]=11" \
  -d "individual[dob][year]=1981" \
  -d "individual[user_terms_acceptance][lead][ip]=..." \
  -d "individual[user_terms_acceptance][lead][date]=..." \
  -d "billing[address][line1]=510 Townsend Street" \
  -d "billing[address][city]=San Francisco" \
  -d "billing[address][state]=CA" \
  -d "billing[address][postal_code]=94111" \
  -d "billing[address][country]=US"
In production, you’ll have to surface the Lead Bank terms to the cardholder as well, and record the IP and date of acceptance. In sandbox, you can test with an IP of 0.0.0.0 and any valid date.
You can check the connected account page to verify that the cardholder now shows up.
Image
Image

Step 3: Create a test card

Create test cards for the cardholder. Bridge has full support for testing cards issued against custodial wallets using simulated Bridge Wallets, and noncustodial wallets on Solana devnet and Base Sepolia. See more information about the crypto_wallet parameter here. Here are some example card creation requests:
curl -X POST https://api.stripe.com/v1/issuing/cards \
	-u sk_sandbox_…: \
	-d cardholder=ich_test_1234 \
	-d currency=usd \
	-d type=virtual \
	-d status=active \
	-d "crypto_wallet[chain]=solana" \
	-d "crypto_wallet[currency]=usdc" \
	-d "crypto_wallet[type]=standard" \
	-d "crypto_wallet[address]=6rXzF4UzvU9qxkRxUP3sTrPJ3YudA8eutFHVz7zcmV6q"
For AML purposes, there are some limitations on how many cards can use the same wallet:
  • For consumer cards, multiple cards may share the same wallet, as long as they belong to the same Stripe Cardholder tied to the same customer on Bridge.
  • For commercial cards, multiple cards and cardholders may share the same wallet, as long as they belong to the same Stripe Account tied to same business customer on Bridge.
Once the card is created, you can also view it in the Card issuing section in the dashboard:
Image4
You’ll need to activate the card before testing card transactions against it. You may click the “Activate” button in the card’s page in the Stripe dashboard, or update the card status to active via the API
Image5
For cards issued from noncustodial wallets, you’ll also need to submit the onchain approval for Bridge’s smart contract to debit from the wallet linked to the card. See this guide for more details about the onchain approval process for noncustodial wallets. Some pertinent chain-specific information for devnet testing:
  • Base Sepolia: Bridge has a standard spender contract deployed at 0x8CC0D9e8a157b73d1172a22f5066048Bda46c0e3. You should submit a standard ERC-20 approval for this spender to debit funds from your wallet.
  • Solana devnet: Use the MERCHANT_ID of 1 and devnet USDC 4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU) as mint.
Below are some snippets you can use as reference for constructing your approval transaction:
cast send \
  0x036CbD53842c5426634e7929541eC2318f3dCF7e \
  "approve(address,uint256)" \
  0x8cc0d9e8a157b73d1172a22f5066048bda46c0e3 \
  100000000 \
  --rpc-url https://sepolia.base.org \
  --private-key <YOUR_PRIVATE_KEY>
Note: for EVM, we also support deploying custom issuer implementations for different approvals flows and transaction flows; contact Bridge for further details.

Step 4: Simulate card transactions

You can use Stripe’s test infrastructure to simulate card authorizations and transactions. Refer to the Stripe Issuing testing documentation for:
  • Simulating approvals and declines
  • Testing incremental authorizations
  • Triggering specific decline codes
  • Simulating disputes
As authorizations are simulated in the Stripe sandbox, Bridge will receive them and process them against the linked wallet. For cards issued against noncustodial wallets, Bridge will actually submit the onchain transaction against Solana devnet and Base sepolia, so that you can test your wallet logic end-to-end and reconcile it against onchain data. Information about crypto transactions associated to card payments are exposed directly on Stripe Issuing objects. To tie crypto transactions initiated by Bridge back to Stripe Issuing related objects, you can use the crypto_transactions field. Here’s an example card authorization in which $1.17 USDC was charged from the linked noncustodial wallet on Base Sepolia, with a corresponding onchain transaction 0x939f97ee0019eba5db5b3cf8466ec01e6c2f62deef3af1bab83a885a1f58e2db submitted by Bridge. Below is how the crypto transaction is represented on the Issuing Authorization object.
{
    "id": "iauth_1TSQSrDfQGJXhssyttChRU6d",
    "object": "issuing.authorization",
    "amount": 117,
    "amount_details": {
        "atm_fee": null,
        "cashback_amount": 0
    },
    "approved": true,
    "authorization_method": "online",
    "balance_transactions": [],
    "card": {
        "id": "ic_1TP6LYDfQGJXhssyHOaU74OW",
        "object": "issuing.card",
        "brand": "Visa",
        "cancellation_reason": null,
        "cardholder": ...,
        "created": 1776885725,
        "crypto_wallet": {
            "address": "0x203fcbfe68df45a940b6f7844d61dfb4ae54b9fe",
            "chain": "base",
            "currency": "usdc",
            "type": "standard"
        },
        "currency": "usd",
        "exp_month": 12,
        "exp_year": 2028,
        "last4": "0021",
        "latest_fraud_warning": null,
        "lifecycle_controls": null,
        "livemode": false,
        "metadata": {},
        "migrate_tokens_from": null,
        "personalization_design": null,
        "pin": null,
        "replaced_by": null,
        "replacement_for": null,
        "replacement_reason": null,
        "second_line": null,
        "shipping": null,
        "spending_controls": {
            "allowed_card_presences": null,
            "allowed_categories": null,
            "allowed_merchant_countries": null,
            "blocked_card_presences": null,
            "blocked_categories": null,
            "blocked_merchant_countries": null,
            "spending_limits": [
                {
                    "amount": 50000,
                    "categories": [],
                    "interval": "daily"
                },
                {
                    "amount": 30000,
                    "categories": [
                        "automated_cash_disburse"
                    ],
                    "interval": "daily"
                }
            ],
            "spending_limits_currency": "usd"
        },
        "status": "active",
        "type": "virtual",
        "wallets": {
            "apple_pay": {
                "eligible": true,
                "ineligible_reason": null
            },
            "google_pay": {
                "eligible": true,
                "ineligible_reason": null
            },
            "primary_account_identifier": null
        }
    },
    "card_presence": "not_present",
    "cardholder": "ich_1TP61ODfQGJXhssyEOFZ3Bbv",
    "created": 1777678041,
    "crypto_transactions": [
        {
            "crypto_transaction_confirmed": {
                "amount": "1.17",
                "amount_mcc_upcharged": null,
                "chain": "base",
                "confirmed_at": 1777678072,
                "currency": "usdc",
                "fees": [],
                "from_address": "0x203fcbfe68df45a940b6f7844d61dfb4ae54b9fe",
                "memo": null,
                "to_address": "0xbace2822cb34f0b83216546257d62db23d79cb0f",
                "transaction_hash": "0x939f97ee0019eba5db5b3cf8466ec01e6c2f62deef3af1bab83a885a1f58e2db"
            },
            "crypto_transaction_failed": null,
            "type": "crypto_transaction_confirmed"
        }
    ],
    "currency": "usd",
    "fleet": null,
    "fuel": null,
    "livemode": false,
    "merchant_amount": 117,
    "merchant_currency": "usd",
    "merchant_data": {
        "category": "transportation_services",
        "category_code": "4789",
        "city": "San Francisco",
        "country": "US",
        "name": "Rocket Rides",
        "network_id": "1234567890",
        "postal_code": "94103",
        "state": "CA",
        "tax_id": null,
        "terminal_id": "99999999",
        "url": "https://rocketrides.io"
    },
    "metadata": {},
    "network_data": {
        "acquiring_institution_id": "123456",
        "system_trace_audit_number": "1234567890",
        "transaction_id": "test_947212103168115"
    },
    "pending_request": null,
    "request_history": [
        {
            "amount": 117,
            "amount_details": {
                "atm_fee": null,
                "cashback_amount": null
            },
            "approved": true,
            "authorization_code": "S34081",
            "created": 1777678044,
            "currency": "usd",
            "merchant_amount": 117,
            "merchant_currency": "usd",
            "network_risk_score": 10,
            "reason": "webhook_approved",
            "reason_message": null,
            "requested_at": 1768262400
        }
    ],
    "status": "pending",
    "token": null,
    "transactions": [],
    "verification_data": {
        "address_line1_check": "not_provided",
        "address_postal_code_check": "not_provided",
        "authentication_exemption": null,
        "cvc_check": "not_provided",
        "expiry_check": "match",
        "postal_code": "94103",
        "three_d_secure": null
    },
    "verified_by_fraud_challenge": false,
    "wallet": null
}

Test webhooks

Use the Stripe CLI to forward Stripe Sandbox webhooks to your local server:
stripe listen --forward-to localhost:3000/webhooks/stripe
This lets you test your issuing_authorization.created, issuing_authorization.updated, and issuing_transaction.created webhook handlers locally.
Make sure that the issuing_authorization.request webhook event is disabled from your Stripe CLI webhook, as it could intercept the authorization request and automatically deny it.