Integration
CoindPay Payments Link 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
API https://test-api.coindpay.xyz
The Testnet environment uses Ethereum Sepolia with ETH 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. Configuration > test.coindpay.xyz/account/wallet
Mainnet
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 450+ assets across 30+ networks. 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/wallet
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.
Steps:
Visit the CoindPay website and choose one of the account creation methods:
EVM Wallet
SVM Wallet
Bind your wallet address to CoindPay.
⚠️ Each account can bind one EVM wallet address and one SVM wallet address, but at least one wallet must be added to create an account.
Email registration and team collaboration features are coming soon to offer greater flexibility for merchants and developers.
💡 Tip: 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 Link
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
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.
Option 2: Many Products / Dynamic Links
If you have many products or need dynamic payment links:
Create a Payments Link template.
Dynamically append parameters to generate unlimited dynamic Payments Links.
Share or embed these links into your applications or product flows.

3. Multiple integrations
URL Parameters
You can extend the embedded checkout link by appending query 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 identifier for the transaction generated by the merchant. Can be generated with randomUUID() to ensure uniqueness.
merchant_transaction_id=550e8400-e29b-41d4-a716-446655440000
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
embed_widget
boolean?
When true, renders the payment page in compact “widget” modal.
embed_widget=true
more
Please contact our Devs team for dynamic updates.
Example with Parameters



① Web Integration
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
② Mobile App Integration
1. WebView Embed
③ Server Integration
API
Payments Link get payment product detail
Payments Order get payment order detail
Handle the remaining workflow, using order API status and records to process callbacks automatically.

4. Account & Hooks Settings
Go to More → Account/Wallet or Integration/Hooks to view and manage your developer information, webhook endpoints, and related configurations.
Developer settings

Wallet manage

Callback testing
Once your Webhooks are configured under Developer Settings → Callback 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.
Payments/On-Ramps Status Reference
Below is a list of possible
rampStatusvalues returnedwhen rampType=
buypaymentMethod=card/mobile_pay
init
User opened the payment window but hasn’t entered the payment stage.
new
A new transaction has been created.
pending
Waiting for 3-D Secure verification from the user.
paid
The payment has been successfully deposited from the payment card.
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.
cancelled
The transaction was canceled, usually due to timeout or user action.
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_failed
The transaction was rejected or declined by the bank.
failed_exchange
Failed to execute the exchange for various reasons (e.g., liquidity, rate, or technical issues).
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.
new
A new transaction has been created.
pending
The transaction is in progress; payout processing has started.
succeeded
The payout has been successfully transferred to the user’s card.
failed
The transaction failed; the crypto amount will be returned to the user.
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_id
More tips
Sandbox payment card
Fiat payments demo
Last updated
