Pay with Crypto
Pay with Crypto allows you to accept cryptocurrency payments at checkout using a secure, fully managed payment flow. The service is powered by MoonPay, which handles customer verification, crypto processing, conversion, and settlement.
Consumers are redirected to a hosted payment page, where they select their preferred cryptocurrency and complete the transaction using their crypto wallet. Once the payment is completed, you receive real-time status updates and immediate notifications of the transaction outcome.
Pay with Crypto at a glance
| Payment type | Crypto payment |
|---|---|
| Consumer markets | North America |
| Consumer debit currency | Supported cryptocurrencies and stablecoins |
| Processing currency | Supported cryptocurrencies and stablecoins |
| Transaction types |
|
| Reporting | Transactions will be visible in the Paysafe Business Experience and in the MoonPay platform. |
| Supported languages | EN |
Prerequisites
-
Existing iGaming merchants interested in this product should contact their assigned Account Manager.
-
New merchants must first complete card processing onboarding via the Payments API before they can onboard to Pay with Crypto.
Payments API: YES
Paysafe Checkout: YES
Paysafe JS: NO
Use case 1: Pay with Crypto
This use case enables a consumer to select Pay with Crypto at checkout and complete the payment via a MoonPay-hosted payment experience.
Implementation
Call the following endpoints in sequence:
- /paymenthub/v1/paymenthandles
- Endpoint: https://api.test.paysafe.com/paymenthub/v1/paymenthandles
- Initializes the payment process and provides you with a URL to redirect the consumer.
- Redirect the consumer to the provided URL so that they can complete the payment on the MoonPay-hosted payment page.
- /paymenthub/v1/payments
- Endpoint: https://api.test.paysafe.com/paymenthub/v1/payments
- Call the payments endpoint to capture the payment within 15 minutes, after this, the payment handle expires.
STEP 1: Call payment handle
- Call the endpoint /paymenthub/v1/paymenthandles
- transactionType: PAYMENT
- paymentType: PAY_BY_CRYPTO
- amount
- currencyCode = USD
- merchantRefNum
- returnLinks (success, failure, cancel URLs)
- Paysafe creates a payment handle and returns our standard gateway response, indicating either a positive or negative outcome.
- The payment handle status depends on the outcome of the request:
- For positive scenarios, the payment handle is created with status INITIATED.
- For negative scenarios, the payment handle is created with status FAILED.
STEP 2: Redirect consumer
- Redirect the consumer to the URL provided in the payment handle response.
- The payment handle status changes to PROCESSING.
- The consumer completes the transaction on the MoonPay-hosted URL.
- On the MoonPay hosted page, the consumer:
- Selects a supported cryptocurrency.
- Connects or uses a supported crypto wallet.
- Authorizes and submits the blockchain transaction.
- MoonPay performs:
- Blockchain transaction monitoring
- Confirmation detection
- Required KYC/AML screening (where applicable)
- Crypto-to-fiat or crypto-to-stablecoin conversion (if configured)
- Settlement directly to the merchant
- Paysafe returns our standard gateway response, indicating either a positive or negative outcome. Paysafe is not involved in crypto processing, wallet interaction, or settlement.
- The payment handle status depends on the outcome:
- For positive scenarios, the status changes to PAYABLE.
- For negative scenarios, the status changes to FAILED.
- Once MoonPay determines the transaction outcome, the consumer is redirected to the merchant’s configured return URL.
Response scenarios
Happy Path
| Scenario | HTTP Status | Action | Payment Handle Status | Next Step |
|---|---|---|---|---|
Payment Handle created successfully, consumer completes crypto payment on MoonPay | 201 | Redirect consumer to payment_redirect | PAYABLE | Use paymentHandleToken to complete payment processing. |
Negative Path
| Scenario | HTTP Status | Error Code | Action | Payment Handle Status | Notes |
|---|---|---|---|---|---|
Invalid request (e.g. missing required parameters such as amount, currencyCode, or returnLinks) | 400 | INVALID_REQUEST | Correct request and retry | FAILED | Merchant notified via webhook |
Consumer abandons payment on MoonPay-hosted page | 200 | N/A | N/A | EXPIRED | Merchant notified via webhook |
Payment expired before completion | 200 | N/A | Payment cannot be completed | FAILED | Merchant notified via webhook |
Notes
- The HTTP 201 response indicates successful creation of the Payment Handle only, not payment completion.
- Final transaction outcome is determined asynchronously via MoonPay processing and reflected through webhook updates.
- Merchants should rely on webhook notifications rather than browser redirects to confirm final payment status.
STEP 3: Call payments
- Call the endpoint /paymenthub/v1/payments using the paymentHandleToken.
- Paysafe returns our standard gateway response, indicating either a positive or negative outcome:
The payment handle status depends on the outcome of the request:
- For positive scenarios, the status changes to COMPLETED.
- For negative scenarios, the status changes to FAILED.
- For negative scenarios where the token expires after 15 minutes, the status changes to EXPIRED.
Response includes:
- paymentId (store this on the merchant side for reconciliation and transaction tracking)
The refunds and returns process is handled directly by MoonPay on the MoonPay platform.
Happy Path
| Scenario | HTTP Status | Error | Payment Status | Next Step |
|---|---|---|---|---|
Payment processed successfully | 201 | None | COMPLETED | Deliver goods/services once confirmation is received (recommended: via webhook). |
Negative Path
| Scenario | HTTP Status | Error Code | Action | Payment Status | Notes |
|---|---|---|---|---|---|
Invalid or expired paymentHandleToken | 400 / 422 | INVALID_HANDLE | Create a new Payment Handle and retry | FAILED | Merchant notified via webhook |
Notes
- The Payment Handle creation and redirect do not guarantee payment success; final outcome depends on completion of the MoonPay hosted flow.
- Merchants should rely on webhook notifications for final confirmation before fulfilment.
- paymentId should be stored for reporting and support queries.
Webhooks 
| Payment Handle | Payments | Description |
|---|---|---|
PROCESSING |
| The consumer has been redirected to the payment link. |
PAYABLE |
| The consumer successfully completed the transaction on MoonPay URL. |
COMPLETED | COMPLETED | You initiated the payments call and the transaction was successful. |
COMPLETED | FAILED | You initiated the payments call and the transaction failed. NOTE: Regardless of the payments call response status, the payment handle status always changes to COMPLETED when a payments call is made. |
FAILED |
| The payment handle was created, and the consumer was redirected to MoonPay. However, the consumer failed to authorize it. |
EXPIRED |
| The payment handle has expired because it was not used in the payments call within 15 minutes (TTL). |
Payment handle request
{
"merchantRefNum": "c5c7da73-2b9e-4f39-9288-bc1993c4f7b1",
"paymentType": "PAY_BY_CRYPTO",
"amount": 1,
"currencyCode": "USD",
"merchantAccountCurrency": "USDC",
"merchantAccountId": "698dba8e22300b0148fee1b1",
"merchantAccountScheme": "SOL",
"transactionType": "PAYMENT",
"returnLinks": [
{
"rel": "default",
"href": "https://www.paysafe.com/"
},
{
"rel": "on_failed",
"href": "https://developer.paysafe.com/en/support/"
},
{
"rel": "on_processing",
"href": "http://www.google.com"
}
]
}
Payment handle response
{
"id": "eeab04a9-07bd-49e3-b1e5-91ccfad6d52f",
"paymentType": "PAY_BY_CRYPTO",
"paymentHandleToken": "PHkzFThgM6OCiAMm",
"merchantRefNum": "c5c7da73-2b9e-4f39-9288-bc1993c4f7b1",
"currencyCode": "USD",
"txnTime": "2026-02-26T14:07:17Z",
"customerIp": "115.114.129.142",
"status": "INITIATED",
"links": [
{
"rel": "redirect_payment",
"href": "https://api.test.paysafe.com/alternatepayments/v1/redirect?accountId=1003067060&paymentHandleId=eeab04a9-07bd-49e3-b1e5-91ccfad6d52f&token=eyJhbGciOiJIUzI1NiJ9.eyJhY2QiOiIxMDAzMDY3MDYwIiwicHlkIjoiZWVhYjA0YTktMDdiZC00OWUzLWIxZTUtOTFjY2ZhZDZkNTJmIiwiZXhwIjoxNzcyMTE2NjM3fQ.oFwcrxRui-D_dj_dYhByaOmlkKhbYvLqd9L07pi-tBI"
}
],
"liveMode": false,
"usage": "SINGLE_USE",
"action": "REDIRECT",
"executionMode": "SYNCHRONOUS",
"amount": 1,
"timeToLiveSeconds": 899,
"gatewayResponse": {
"id": "f89482b0-f45c-401a-acd5-c59e46aa1457",
"processor": "MOONPAY",
"chargeToken": "f89482b0-f45c-401a-acd5-c59e46aa1457"
},
"returnLinks": [
{
"rel": "on_processing",
"href": "http://www.google.com"
},
{
"rel": "on_failed",
"href": "https://developer.paysafe.com/en/support/"
},
{
"rel": "default",
"href": "https://www.paysafe.com/"
}
],
"transactionType": "PAYMENT",
"gatewayReconciliationId": "6c885a24-4e85-4138-9855-b376ad97f7b4",
"updatedTime": "2026-02-26T14:07:17Z",
"statusTime": "2026-02-26T14:07:17Z",
"merchantAccountCurrency": "USDC",
"merchantAccountId": "698dba8e22300b0148fee1b1",
"merchantAccountScheme": "SOL"
}
Payment request
{
"amount": 1,
"merchantRefNum": "c5c7da73-2b9e-4f39-9288-bc1993c4f7b1",
"settleWithAuth": true,
"paymentType": "PAY_BY_CRYPTO",
"currencyCode": "USD",
"paymentHandleToken": "PHkzFThgM6OCiAMm"
}
Payment response
{
"id": "4c13e47b-92eb-4eeb-843e-13c5a154827e",
"paymentType": "PAY_BY_CRYPTO",
"paymentHandleToken": "PHkzFThgM6OCiAMm",
"merchantRefNum": "c5c7da73-2b9e-4f39-9288-bc1993c4f7b1",
"currencyCode": "USD",
"settleWithAuth": true,
"dupCheck": true,
"txnTime": "2026-02-26T14:07:17Z",
"customerIp": "115.114.129.142",
"status": "COMPLETED",
"gatewayReconciliationId": "6c885a24-4e85-4138-9855-b376ad97f7b4",
"amount": 1,
"consumerIp": "115.114.129.142",
"liveMode": false,
"updatedTime": "2026-02-26T14:12:18Z",
"statusTime": "2026-02-26T14:12:18Z",
"gatewayResponse": {
"symbol": "USDC",
"id": "f89482b0-f45c-401a-acd5-c59e46aa1457",
"processor": "MOONPAY",
"chargeToken": "f89482b0-f45c-401a-acd5-c59e46aa1457",
"network": "SOL",
"blockchainTransactionId": "4ssHg6mwZrdoefo4eh2ArQ4UH6RZYZ93roridyqi7uesyAnAJ3WsgHesqujow5eyRk2ok3SFQenx48u8grmYnwUY"
},
"availableToSettle": 0,
"settlements": {
"amount": 1,
"txnTime": "2026-02-26T14:07:17.000+00:00",
"availableToRefund": 1,
"merchantRefNum": "c5c7da73-2b9e-4f39-9288-bc1993c4f7b1",
"id": "4c13e47b-92eb-4eeb-843e-13c5a154827e",
"status": "COMPLETED"
}
}