Merchant payout destination
Each payment address is created with the merchant's validated address_out.
Merchant-visible safeguards
CryptPays combines confirmation and finality checks, merchant-configured payout destinations, signed callbacks, replay protection, and lifecycle-aware delivery semantics.
Security principles
These properties are part of the merchant-observable payment contract rather than claims about hidden infrastructure.
Each payment address is created with the merchant's validated address_out.
Confirmed processing waits for the effective network-specific threshold.
Every callback carries an RSA-SHA256 signature and Unix timestamp.
Freshness verification and persistent lifecycle idempotency address different risks.
Failed delivery is retried within a finite policy; duplicate delivery remains possible.
Each qualifying deposit reports its own principal, forwarded amount, and deduction.
Forwarding model
CryptPays is designed around forwarding qualifying payments to the payout address configured by the merchant rather than maintaining a merchant balance for later withdrawal.
This does not remove the merchant's responsibility to verify the destination before integration. Normal Merchant API use does not require the merchant to provide the private key or seed phrase for that payout address.
Review supported networks and assetsThe effective processing threshold is the greater of the operator/network default and the merchant's stored requirement. A merchant cannot lower the default, and a new override above the configured maximum is rejected.
Merchant-facing Solana finality is intentionally binary: confirmations=0 means pending or not final, while confirmations=1 means confirmed or final.
Signed callbacks
CryptPays signs the method, hostname, exact path and query, and raw request body together with the Unix timestamp. The signature uses standard base64 encoding and RSA-SHA256.
CryptPays callbacks retain the compatibility headers X-CryptPay-Signature and X-CryptPay-Timestamp.
X-CryptPay-Signature and X-CryptPay-Timestamp.coin after authentication.Delivery semantics
A fresh valid signature authenticates one delivery attempt. Persistent lifecycle state prevents a valid retry or stage transition from producing duplicate business effects.
pending=1pending=0same UUIDresult=done is delivered; done is an internal logs state after acknowledgement.Delivery failures use a bounded six-attempt policy. This is not exactly-once delivery and does not guarantee that an unreachable merchant endpoint will receive a callback.
Public trust boundaries
Public discovery and payment-address creation do not require a merchant bearer token. A creation request supplies the callback URL and merchant payout destination; the signed callback is the authentication boundary merchants verify before fulfillment.
Public endpoints are request-throttled. Creation inputs are validated for supported asset, callback URL safety, chain-aware payout address format, confirmation settings, and supported priority.
Review the Merchant API contracthttps://web-test.cryptpays.comhttps://api-test.cryptpays.comhttps://docs-test.cryptpays.comKey and access boundaries
CryptPays separates public integration data from the signing and operational controls used to process it.
Generated wallet private material is not returned by the Merchant API. Stored wallet private material and the callback private signing key use application encryption; merchants retrieve only the callback public key needed for verification.
Administrative APIs require authentication and explicit permissions. Read, manage, retry, pricing, wallet, stream, and system actions are gated separately rather than inheriting access from a public API route.
Selected sensitive administrative and operational changes record the authenticated actor and before/after or action context in the application activity-log system. These records are operational history, not a claim of immutable external audit.
The current blockchain stream intake verifies the provider's raw-body HMAC, timestamp, and stream-scoped nonce before accepting a delivery. Missing, stale, modified, or replayed deliveries are rejected.
Callback destinations are checked at creation and again before delivery. Production requires HTTPS, and outbound resolution rejects local, private, reserved, or otherwise unsafe destinations.
Persisted transaction identity and unique deduplication keys prevent a repeated blockchain event from creating the same deposit twice while preserving distinct UTXO outputs and indexed deposits.
Responsibility boundary
CryptPays secures and reports the payment lifecycle; merchants remain responsible for securely acting on the result.
These technical controls do not replace a merchant's own security, legal, or compliance obligations.
Independent deposits
CryptPays provides one Merchant API while retaining the identifiers and finality model needed to reconcile each supported network family.
Use txid_in together with the separate integer vout. A transaction hash alone can contain multiple relevant outputs.
Enabled compatible EVM assets can share a generated address family, while each incoming deposit remains an independent payment lifecycle.
SOL and SPL deposits remain independent, and their merchant-facing finality is represented consistently as 0 or 1.
Production checklist
Use this as an integration review, then follow the complete verification examples in the documentation.
Security FAQ
The implementation documentation remains the authority for exact verifier behavior and callback fields.
Read callback documentationNo. Normal Merchant API integration does not require you to provide the private key or seed phrase for the payout address. Protect those wallet credentials and never place them in API requests or support messages.
Verify X-CryptPay-Signature and X-CryptPay-Timestamp against the current public key and the documented canonical request bytes before trusting the payload.
Yes. A failed delivery can be retried, and pending plus confirmed stages can share one UUID. Persist lifecycle state and make confirmed fulfillment idempotent.
No. Pending is informational. Fulfill only after verifying the confirmed merchant event with result=sent and pending=0.
CryptPays waits for the effective blockchain confirmation or finality condition before confirmed processing and forwarding. The exact model depends on the network family.
Use the pair of txid_in and vout for the on-chain deposit identity, while using the callback UUID for its merchant lifecycle.
No. Merchant fulfillment uses result=sent, pending=0. After HTTP 200, done can appear only as an internal delivery state in logs.
Implement the boundary
Use the maintained signature examples, lifecycle contract, retry policy, and troubleshooting guidance in the CryptPays documentation.