Integration
CoindPay provides a simple, universal way to initiate and complete payments. It works across web, mobile, and serE-commerce checkout pages, SaaS dashboards, or web-based payment portals.
Environment
CoindPay provides two environments for integration and testing: Testnet and Mainnet
Testnet
The Testnet environment uses ETH on Ethereum Sepolia or USDT on BSC Testnet assets by default (and exclusively). It operates in Sandbox mode, which is restricted by an IP whitelist for security reasons. For more interface details, refer to Developers
To enable your test access:
Please contact our official team @CoindPay or collaboration group to provide your fixed IP address.
You can check your current IP at https://whatismyipaddress.com
VPN may affect your outbound IP.
For
devandtestnetenvironments, we use a default vault address as the sole deposit wallet0xbBC8f6B710359dbcdF02f9eb50Ade391890A6021In these environments, EVM wallets are required and serve as the primary deposit option > test.coindpay.xyz/account/payouts
Prod
Payments support USDT/USDC on EVM and SVM networks 2. Payout assets Please confirm that your connected wallet matches the correct network in your account settings.
On/Off-ramps support 100+ assets across 30+ networks for large-volume buy and sell crypto transactions. When creating ramp orders, ensure that your selected asset type matches the corresponding wallet address.
In
Mainnetwallet configuration is fully flexible — developers can specify either an EVM or SVM address as the payout primary wallet > coindpay.xyz/account/payouts
1. Create Account
Before using CoindPay, you need to create an account. This account serves as a unified identity for both your developer role and merchant enterprise.
Visit the CoindPay website and choose one of the account creation methods:
Social Account
Supported social login providers (e.g. Google, X, etc.)
Wallet
EVM wallet (Ethereum-compatible chains)
SVM wallet (Solana)
Note: Even if you sign up using a social account, you will still be required to bind a payout wallet to complete and enable payments.

💡 Once your account is created, you will have a unified merchant identity to manage Payments Links, track orders, and manage team members.

2. Create Payments
A Payments Link is a convenient way to collect payments. You can generate a link and share it with customers or embed it into your applications.
Option 1: Few Products(No-code)
If you have a small number of products:
Create a Payments Link and provide the necessary form information at once.
Share the link with your customers or embed it in your website/app.
Designed for no-code integration, for creators or merchants avoiding custom development.
Option 2: Many Products(Dynamic)
If you have many products or need dynamic payment links:
Create a Payments Link
Dynamically append parameters to generate unlimited dynamic Payments Links.
Share or embed these links into your applications or product flows.
All Payments Links support dynamic parameter appending only for the parameters listed in the table below.
All other settings, such as payment methods, subscription type, and additional options, must be selected and configured directly in the payments form.

3. Multiple integrations
URL Parameters
You can extend the embedded checkout link by appending parameters to the URL. This is especially useful when you want to dynamically pass metadata such as product title, description, price, images or others.
merchant_transaction_id
string*
Required. Unique Id for the order transaction generated by the merchant. Can be generated with randomUUID() to ensure uniqueness. The rampId is returned in webhook order payloads. corresponds to rampId
merchant_transaction_id=550e8400-e29b-41d4-a716-446655440000
signature
string?
HMAC-SHA256 hex signature generated with the merchant secret key; Required if a custom price is provided.
signature=b95df8938****9fgk56
title
string?
The product or payment title displayed on the checkout page.
title=Hello
desc
string?
A short description of the product or service.
desc=Text
price
string?
Payment amount in the supported fiat or crypto currency format. Lmimits #Fiat currencies
price=29.99
currency
string?
Effective only if included in the payment link’s supported currency list; otherwise defaults to the first configured currency.
currency=EUR
images
array?
A list of image objects to display in the checkout interface.
images=[{"url":"https://cdn.example.com/item.jpg"}]
name
string?
Pre-filled consumer name (≤120 characters)
name=Elon Musk
payment_method
string?
optional. If not specified, all payment methods supported for the selected currency will be returned. If specified, the method will be automatically preselected at checkout.
Supported values include card, google, apple, revolut_pay, volt_banktransfer_eur, EightBWorld_instapay, interac_gk, unlimint_pix_brl and others. Refer to Payment methods for the full and up-to-date list.
payment_method=apple
fix_payment_method
boolean?
Locks the selected payment_method and prevents changes during checkout. Recommended for channel-specific flows (e.g. iOS) to optimize conversion and payment success.
fix_payment_method=true
embed_widget
boolean?
Automatic checkout launch mode. If enabled, a valid email must also be provided.
embed_widget=true
redirect_url
string?
URL to which the user is redirected after passing the payments or ramps scenes;
We recommend using the default checkout exit flow rather than redirecting via redirect_url. redirect urls are subject to risk and compliance monitoring, and high-risk or non-compliant destinations may affect merchant account health.
redirect_url=https://coindpay.xyz/wallet
more
Please contact our Devs team for dynamic updates.
Tips
? The value is optional, * the value is required.
merchant_transaction_id
The
merchant_transaction_idis required.Orders may transition through multiple statuses, but all remain tied to the same
merchant_transaction_idSeparate or recurring orders generate distinct
merchant_transaction_idvalues.Use
randomUUID()or other encrypted Id libraries to generate a unique Id for each transaction to avoid duplicates.merchant_transaction_idserves as an alias forrampId. TherampIdis returned in webhook order payloads.If not provided, it will not cause an error, but you may lose the ability to reliably track the order or query its status via this Id.
email
Ensure the pre-submitted email matches the one used in the subsequent KYC process.
The email should be a user’s email address obtained in advance.
If the email is in a valid format, it will be automatically pre-filled in the checkout form.
If unsure, request the user to manually enter their email to prevent mismatches.
price
When the
pricerouting parameter is enabled, configure the product’s Amount Type as Fixed Amount.The Random Amount option is intended for tipping or donation scenarios and is not controlled by the
priceparameter.When
priceis not provided, the payment Link will use the amount configured in the merchant dashboard.When
priceis provided in the URL, it is treated as dynamic input and must be protected by a signature.Any modification to the
pricevalue without a valid signature will result in the Payment Link being marked as invalid.
signature
The
signatureparameter is conditionally required.f
priceis present, a validsignaturemust be generated and included.If
priceis absent,signatureis optional.The signature cryptographically binds the request parameters to the merchant and prevents client-side tampering.
currency
The
currencyrouting parameter is optional.Please ensure the provided
currencyis supported in the payment link currency configuration, passing an unconfigured currency will be ignored.
The product link resolves to either the first configured currency or the developer-provided
currencyparameter (must match one of the enabled currencies).Client-side currency switching is disabled; only the resolved currency is used.
The product link resolves to either the first configured currency or the developer-provided
currencyparameter (must exist in the enabled list).End users may freely switch between all enabled currencies.
Amounts remain anchored to USD, with conversions applied automatically using real-time FX rates.
embed_widget
The
embed_widgetflag enables fast checkout mode.It only activates if all provided parameters are valid.
USD-pegged
Default: USD-pegged is disabled. the amount remains uniform and can be controlled via the
priceparameter.When USD-pegged is enabled:
All selected fiat currencies are automatically pegged to USD.
Settlement amounts are calculated in real time based on current FX rates.
Code with Parameters


Example: Use an
embed_widgetlink with automatic mini-widget smart flow.The
https://coindpay.xyz/pay/link/nSPONbtg19ZNBAKKBA_Zu?name=Jason&[email protected]&embed_widget=true

Example: Quick payment methods limited to iOS channels
https://coindpay.xyz/pay/link/nSPONbtg19ZNBAKKBA_Zu?payment_method=apple&fix_payment_method=true

① Web
E-commerce checkouts, SaaS dashboards, or any web-based payment page.
1. Embed via iFrame
Native HTML styles can be customized as needed.
You can freely customize the surrounding HTML, container styles, and transitions using TailwindCSS or your preferred styling approach.
2. Redirect to Payment Page
Customize your content area (Button, image, etc.) style
Highlights:
✅ No SDK required
✅ Instant integration
✅ Dynamic data and ui adaptation
② Mobile App
iOS / Android / React Native / Flutter apps that need to embed or redirect to a payment flow.
WebView Embed
4. Account & Webhooks
Manage your account-related settings, including wallet bindings, event callback URLs, notifications, and developer or merchant information.
Go to More → Account/Payouts or Integration/Hooks to view and manage your developer information, webhook endpoints, and related configurations.
Wallet payouts

Webhooks callback
Once your Webhooks are configured under Developer Settings → Webhooks URLs, CoindPay will automatically send webhook notifications to your specified endpoint whenever a payment event occurs (e.g., completed, failed, or pending).
Your server should handle these events, verify the request signature using your API Secret and update your own order database accordingly.

The following example code how to handle webhook order data in a Next.js API route.
⚠️ Merchants and developers should pay special attention to verifying the x-signature request header and securely managing the private API Secret found in your Developer Hooks settings.
⚠️ The API Secret is used to validate the callback signature. When a transaction status changes, CoindPay sends a webhook request containing the transaction data.
If you’re using callbacks, make sure to enable signature verification to ensure authenticity.
⚠️ To verify the signature, generate an HMAC SHA-256 hash using your API Secret and the entire raw callback body as input. Because the signature is generated based on the full payload, the request body must be used exactly as received, without any modification or parsing before signature verification.
⚠️ To avoid compatibility issues caused by data serialization differences across programming languages, please pay attention to how rawBody is handled in environments such as Node.js, Go, and Java.
⚠️ Before using webhooks and managing the order flow, ensure that your API secret has been generated and that it is correctly applied to the signature headers.
Local Debugging Mode
If you have not yet obtained Testnet sandbox IP access, we also provide a local debugging mode. This allows you to effectively validate your Webhook API integration and end-to-end order flow.

Webhooks Data Example(Selected statuses)Full Order Fields
Payments/On-Ramps Status Reference
Below is a list of possible
rampStatusvalues returnedwhen rampType=
buypaymentMethod=Payment methods
init
User opened the payment window but hasn’t entered the payment stage and the order has not yet entered the processing flow.
new
A new transaction has been created.
Starting from the new status, merchants with configured webhooks will receive event notifications.
pending
Waiting for 3DS verification from the user.
paid
The payer’s card has been authorized and the funds have been deposited into the processing channel. Final settlement and any conversion are subject to the issuing bank’s compliance and eligibility checks. If the bank declines, no funds will be captured.
order_scheduled
Indicates that the order has entered the processing queue. This status only reflects queue placement — it does not trigger KYC for users below the €700 threshold, and no funds are reserved.
order_verified_not_complete
KYC verification (required only when the user's cumulative volume exceeds €700) has succeeded. The order is queued on the exchange but not yet completed.
order_retry
The order was declined or cancelled due to legal, compliance, or banking constraints. The consumer attempts the payment again through an alternative recommended banking provider.
cancelled
The transaction was canceled, usually due to timeout or user action.
failed_exchange
Failed to execute the exchange for various reasons (e.g., liquidity, rate, or technical issues)
failed
The transaction was rejected or declined by the bank.
settling
Funds have been authorized and are in the settlement process. The payout transaction has not yet been finalized on-chain.
settle_failed
Settlement attempt failed due to a transient or recoverable error. The order is eligible for retry(caused by RPC, network, or temporary infrastructure issues, retry may be triggered)
completed
✅ The merchant’s account has received the funds, and a receipt/invoice is sent to the customer’s email. This status also serves as the final indicator that the order has successfully completed.
Off-Ramp Status Reference
Below is a list of possible
rampStatusvalues returnedwhen rampType=
sellpaymentMethod=card
init
User opened the payment window but hasn’t entered the payment stage and the order has not yet entered the processing flow.
new
A new transaction has been created.
Starting from the new status, merchants with configured webhooks will receive event notifications.
pending
The transaction is in progress; payout processing has started.
failed
The transaction failed; the crypto amount will be returned to the user.
completed
✅ The payout has been successfully transferred to the user’s card.
Below is an example based on Node (Next.js)
💡 Tips:
Keeping your secret key safe, don't forget add the
.envfile to.gitignoreThe rampId is required, from your front-end
merchant_transaction_idAn order is successful only when its status is
completed
More config
Testnet Provider A - card list
Payout Asset:ETH on the EVM Sepolia(Prod environment configurations remain unaffected.)

If you encounter risk control or KYC interactions that affect the payment flow in the Testnet sandbox environment, you can use our official verification email: [email protected] In the regular payment environment, please use your own developer or customer email.
Testnet Provider B - card list
Payout Asset:USDT on the EVM BSC Testnet(Prod environment configurations remain unaffected.)

Visa
4000000000000085
3-D secure version 2, challenge flow, full authentication
Payment has CONFIRMED status
4580000000000059
3-D secure version 2, frictionless flow, attempt
Payment has CONFIRMED status
4000000000000093
3-D secure version 2, frictionless flow, success
Payment has CONFIRMED status
4000000000000051
No 3-D Secure
Payment has AUTHORIZED status
4000000000000077
No 3-D Secure
Payment has CONFIRMED status
4444444444444455
3-D secure version 2, challenge flow, full authentication
Payment has DECLINED status
4444444444449777
No 3-D Secure
Payment has DECLINED status
Mastercard
5100000000000065
3-D secure version 2, challenge flow, full authentication
Payment has CONFIRMED status
2400000000000069
3-D secure version 2, frictionless flow, attempt
Payment has CONFIRMED status
5100000000000073
3-D secure version 2, frictionless flow, success
Payment has CONFIRMED status
5100000000000651
No 3-D Secure
Payment has AUTHORIZED status
2400000000000077
No 3-D Secure
Payment has CONFIRMED status
5555555555559955
3-D secure version 2, challenge flow, full authentication
Payment has DECLINED status
5555555555554477
No 3-D Secure
Payment has DECLINED status
Demo video
Last updated
