requestId.paymentId, paymentLink, requestId, recipient wallet, amount, and link type.processing as pending. Confirm collection only when the order reaches completed.POST /v1/stable/collect/create-payment-link.requestId for new integrations.userOrderNo is deprecated. When requestId is blank, the platform falls back to userOrderNo; when both are nonblank, requestId takes precedence.ODR00000040; the original result is not replayed.requestId. Do not change the ID merely to bypass a duplicate error.requestId. Use the child paymentId as the payment identity and referencePaymentId as the parent relationship.init. It becomes active when activated, and its validity window starts from activation.| Mode | Required amount fields |
|---|---|
| Fiat-priced | fiatCurrency and fiatAmount |
| Crypto-priced | cryptoAmount and one concrete supportCurrency |
paymentValidTime is required for One-Time links and is expressed in minutes.active. Each actual payment creates a separate child order. Keep the parent link and child payments as different records.POST /v1/stable/collect/payment-links.paymentId to recover one known link or payment record. When paymentId and referencePaymentId are both supplied, they are combined with AND.requestId to recover an uncertain create result.primaryOrderOnly defaults to true and returns primary Payment Links only. Set it to false to include primary links and actual payment child records.referencePaymentId to page actual payment child records for a Permanent parent link. When supplied, primaryOrderOnly is ignored.startTime and endTime filter record creation time, not payment or fund-transfer completion time.| Status | Terminal? | Meaning | Merchant action |
|---|---|---|---|
init | No | Created but not activated | Present the link and wait |
active | No | Activated and payable | Track the payment |
processing | No | Payment matched; fund transfer is incomplete | Wait and query again; do not credit as final |
completed | Yes | Every required merchant fund transfer succeeded | Confirm collection idempotently |
expired | Not always | Payment window ended without a matched payment | Stop directing new payment and keep boundary cases under review |
processing for manual handling. Do not infer a terminal outcome from elapsed time.active. Each actual payment creates a child order:referencePaymentId points to the Permanent parent link. Use the child paymentId for per-payment booking and deduplication.| Field | Meaning |
|---|---|
createTime | Link or payment-record creation time |
effectiveTime | One-Time link activation time |
expiresTime | Activation time plus paymentValidTime |
PAYMENT_LINK_UPDATED.processing does not by itself emit a Payment Link status webhook.active state; each payment child emits completed only after all required fund transfers succeed.eventId, then apply business idempotency by the actual payment paymentId.completed result.paymentId.init, active, and processing records until a terminal business decision is available.completed.paymentId and referencePaymentId from the webhook.paymentId.paymentId as the identity of every payment.| Situation | Action |
|---|---|
| Create timeout or unknown result | Query with the original requestId, then retry recovery with backoff |
| Duplicate request ID | Query the original request; do not generate a new ID just to bypass the error |
Long-running processing | Query again and contact the platform if it remains unresolved |
| Expired order with a detected payment | Follow query and webhook results; do not assume automatic credit or refund |
| Duplicate or late webhook | Deduplicate events and prevent status regression |