Webhook Notifications to Merchants
Payment Callback
Method: POST
Request Headers
| Field Name | Type | Required | Description |
|---|---|---|---|
| content-type | string | Yes | application/json |
| x-api-key | string | Yes | Provided by Paydify, same as appId |
| x-api-timestamp | string | Yes | Timestamp in milliseconds |
| x-api-signature | string | Yes | Signature, see Signature Algorithm |
Request Body
| Field Name | Type | Description |
|---|---|---|
| appId | string | Provided by Paydify |
| txnId | string | Paydify payment order ID |
| mchTxnId | string | Merchant order ID |
| state | string | Payment status, enum values see Payment Status |
| txnHash | string | Blockchain transaction hash |
| txnAmount | string | Order amount. If currency is USDT, then 1.23 means 1.23 USDT |
| orderCurrency | string | Order currency |
| paidAmount | string | Actual payment amount, if currency is USDT, then 1.23 means 1.23 USDT |
| mchReceivedAmount | string | Amount merchant should receive, if currency is USDT, then 1.23 means 1.23 USDT |
| mchFee | string | Fee charged by Paydify, if currency is USDT, then 0.23 means 0.23 USDT |
| currency | string | Payment currency |
| settlementCurrency | string | Settlement currency for merchant. USDT/USDC for crypto settlement, USD for fiat settlement |
| notifyType | string | Notification type, fixed value: payment |
| fromAddress | string | Payer address |
| paidTime | int | Payment success timestamp in milliseconds, only has value when payment is successful |
| failedTime | int | Payment failure timestamp in milliseconds, only has value when payment fails/times out |
Response
Return HTTP 200 after receiving the callback. Paydify determines success from the response body:
| Response Value | Description |
|---|---|
success | Callback acknowledged, no further retries |
fail | Callback explicitly failed, will be retried per the retry policy |
Recommended:
- Set
Content-Typetotext/plain - Return the bare string
successorfail(case-insensitive)
Also accepted as success (no further retries):
- Leading/trailing whitespace or trailing newline:
success,success\n - JSON string literal:
"success"
Still treated as failure and retried:
- JSON objects:
{"status":"success"}/{"code":0}/{"result":"success"} - HTML error pages or empty body
- Any value other than
success(includingfail)
Any response that cannot be recognized as success triggers retries, up to 7 attempts.
Request Example
curl -X POST '{endpoint}' \ -H 'content-type: application/json' \ -H 'x-api-key: xxx' \ -H 'x-api-timestamp: 121212121' \ -H 'x-api-signature: xxxx' \ -d '{ "appId": "Axxxxxxxx", "txnId": "P4687529510003120897", "mchTxnId": "DCS20250905175704ICVAa11111211", "currency": "USDC", "state": "PAID", "txnHash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "fromAddress": "0x1111111111222222222233333333334444444444", "notifyType": "payment", "paidAmount": "0.22", "mchReceivedAmount": "0.22", "mchFee": "0", "txnAmount": "0.22", "paidTime": 1757328167000, "failedTime": 0 }'
Refund Callback
Method: POST
Request Headers
| Field Name | Type | Required | Description |
|---|---|---|---|
| content-type | string | Yes | application/json |
| x-api-key | string | Yes | Provided by Paydify, same as appId |
| x-api-timestamp | string | Yes | Timestamp in milliseconds |
| x-api-signature | string | Yes | Signature, see Signature Algorithm |
Request Body
| Field Name | Type | Description |
|---|---|---|
| appId | string | Application ID provided by Paydify |
| txnId | string | Paydify refund order ID |
| mchTxnId | string | Merchant refund order ID |
| currency | string | Refund currency (e.g., USDT, USDC) |
| state | string | Refund status, enum values see Refund Status. Terminal: REFUNDED (success) / FAILED (failure) |
| txnHash | string | Blockchain transaction hash |
| notifyType | string | Notification type, fixed value: refund |
| txnAmount | string | Refund amount in crypto currency. If currency is USDT, then "1.23" means 1.23 USDT |
| failedTime | int | Refund failure timestamp in milliseconds. Only has value when refund fails |
| refundedTime | int | Refund success timestamp in milliseconds. Only has value when refund is successful |
| orderCurrency | string | Original order currency (e.g., USD, EUR). Only present in fiat payment scenarios |
| settlementCurrency | string | Settlement currency (e.g., USD). Only present in fiat payment scenarios |
| orderAmount | string | Original order amount in fiat currency. Only present in fiat payment scenarios |
| settlementAmount | string | Settlement amount (negative value indicates refund). Only present in fiat payment scenarios |
Response
Return HTTP 200 after receiving the callback. Paydify determines success from the response body:
| Response Value | Description |
|---|---|
success | Callback acknowledged, no further retries |
fail | Callback explicitly failed, will be retried per the retry policy |
Recommended:
- Set
Content-Typetotext/plain - Return the bare string
successorfail(case-insensitive)
Also accepted as success (no further retries):
- Leading/trailing whitespace or trailing newline:
success,success\n - JSON string literal:
"success"
Still treated as failure and retried:
- JSON objects:
{"status":"success"}/{"code":0}/{"result":"success"} - HTML error pages or empty body
- Any value other than
success(includingfail)
Any response that cannot be recognized as success triggers retries, up to 7 attempts.
Request Example
curl -X POST '{endpoint}' \ -H 'content-type: application/json' \ -H 'x-api-key: xxx' \ -H 'x-api-timestamp: 121212121' \ -H 'x-api-signature: xxxx' \ -d '{ "appId": "Axxxxxxxx", "txnId": "R4687326023007356672", "mchTxnId": "DCS20250905175704ICVAa1111", "currency": "USDC", "state": "REFUNDED", "txnHash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "notifyType": "refund", "txnAmount": "0.11", "failedTime": 0, "refundedTime": 1757315967000 }'
Callback Retry Mechanism
If the callback does not receive the expected response value success, it will retry up to 7 times at intervals of 1m / 5m / 30m / 2h / 6h / 12h / 24h. Deliveries that still fail after all retries raise an alert:
| Request Number | Time Delay | Description |
|---|---|---|
| 0 | 0 | 1st normal callback, executed immediately, no delay |
| 1 | 1 minute | 1st retry |
| 2 | 5 minutes | 2nd retry |
| 3 | 30 minutes | 3rd retry |
| 4 | 2 hours | 4th retry |
| 5 | 6 hours | 5th retry |
| 6 | 12 hours | 6th retry |
| 7 | 24 hours | 7th retry |