Checkout product guide
Hosted checkout page, Payment Intent, Refund, Webhook events, and status reference. For endpoint details, see the API reference.
Overview
The Stabo Checkout B2C Payment Intent API provides a hosted checkout page for B2C merchants. After your backend creates a Payment Intent, redirect the customer to checkoutUrl to pay with a wallet. Stabo pushes the payment result to you through Webhooks. You can also call the query endpoints to confirm the final status and for reconciliation.
With this API, you can:
- Manage Payment Intents: Create a Payment Intent, retrieve payment details, and list payments with pagination
- Redirect to the hosted checkout page: Use
checkoutUrlto guide the customer through a wallet payment - Manage refunds: Create a refund, list refunds, and retrieve refund details
- Receive real-time notifications: Receive events such as payment succeeded and canceled through Webhooks
- Reconcile and recover: When Webhooks fail or are delayed, call the query endpoints to confirm the final status
Version: v1.2
Scope: Payment Intent, Refund, Webhook
Notes: Amounts are decimal strings in standard units. Times use ISO 8601 with a time zone offset. Enums use uppercase codes. For data formats, see Conventions.
Standard payment flow
| Step | Merchant action | Result |
|---|---|---|
| 1 | Get an Access Token | Receive access_token |
| 2 | Create a Payment Intent | Receive checkoutUrl / clientSecret |
| 3 | Redirect to the hosted checkout page | The customer completes the wallet payment |
| 4 | Receive the Webhook | Receive the payment result notification |
| 5 | Query to confirm the final status | Retrieve Payment Intent / Refund details |
API overview
| Module | Endpoint | Description |
|---|---|---|
| Payment Intent | POST /openapi/v1/payment-intents | Create a Payment Intent |
| Payment Intent | GET /openapi/v1/payment-intents/{paymentIntentId} | Retrieve a Payment Intent |
| Payment Intent | GET /openapi/v1/payment-intents | List Payment Intents with pagination |
| Refund | POST /openapi/v1/payment-intents/{paymentIntentId}/refunds | Create a Refund |
| Refund | GET /openapi/v1/payment-intents/{paymentIntentId}/refunds | List Refunds with pagination |
| Refund | GET /openapi/v1/payment-intents/{paymentIntentId}/refunds/{refundId} | Retrieve a Refund |
| Webhook | HTTPS URL configured by the merchant | Receive Payment Intent and Refund events |
For the parameters, responses, and interactive testing of each endpoint, see the API reference.
Webhook events
Webhooks are the primary channel for receiving payment results. Use the query endpoints for recovery and reconciliation. Provide a publicly accessible HTTPS URL, and return a 2xx status code after you receive a notification. For the delivery mechanism, request headers, and signature verification, see Webhook.
Event types
| Event type | Trigger | data.object |
|---|---|---|
checkout.payment_intent.processing | An on-chain payment is detected and is waiting for confirmation (status PROCESSING) | Payment Intent object |
checkout.payment_intent.partially_paid | The confirmed received amount is less than the amount due (status PARTIALLY_PAID) | Payment Intent object |
checkout.payment_intent.paid | The full amount is received and is waiting for compliance checks and crediting (status PAID) | Payment Intent object |
checkout.payment_intent.succeeded | Credited to the merchant balance (status COMPLETED) | Payment Intent object |
checkout.payment_intent.canceled | Canceled or expired (status CANCELED) | Payment Intent object |
checkout.refund.created | The refund is created | Refund object |
checkout.refund.succeeded | The refund is complete (status COMPLETED) | Refund object |
checkout.refund.failed | The refund failed (status FAILED) | Refund object |
The event type checkout.payment_intent.succeeded maps to the status COMPLETED. Use data.object.status to determine the order status.
Payload
For Payment Intent events, data.object is the same object that GET /openapi/v1/payment-intents/{paymentIntentId} returns.
For Refund events, data.object is the same object that the Retrieve a Refund endpoint returns.
The payload is generated after the status change is committed and reflects the committed status.
Handling recommendations
- Update your local order by
data.object.paymentIntentIdordata.object.referenceNo. - Your handling logic must be idempotent. The same event can be delivered more than once.
- If you do not receive a Webhook in time, call the query endpoints to confirm the final status.
Notification example
{
"id": "evt_1Mxxx",
"object": "event",
"type": "checkout.payment_intent.succeeded",
"created": 1778480710,
"data": {
"object": {
"paymentIntentId": "pi_MNOL0POUV8IDPXCD",
"status": "COMPLETED",
"amount": "20.00",
"currency": "USD",
"referenceNo": "ORD-20260511-0001",
"payments": [
{
"network": "Polygon",
"currency": "USDT",
"amount": "20.08",
"txHash": "0x5f2c...a91e",
"status": "CONFIRMED",
"confirmedAt": "2026-05-11T14:18:02+08:00"
}
],
"receivedAmount": "20.00",
"feeAmount": "0.30",
"refundedAmount": "0.00",
"hasRefund": false,
"completedAt": "2026-05-11T14:25:10+08:00",
"createdAt": "2026-05-11T14:12:34+08:00",
"metadata": {}
}
}
}Reference
Payment Intent statuses
| Status | Description |
|---|---|
AWAITING_PAYMENT | Waiting for the customer to pay |
PROCESSING | An on-chain payment is detected and is waiting for confirmation |
PARTIALLY_PAID | The confirmed received amount is less than the amount due |
PAID | The full amount is received and is waiting for compliance checks and crediting |
COMPLETED | Credited to the merchant balance |
CANCELED | Canceled, including expired. See cancellationReason for the reason |
Refund statuses
| Status | Description |
|---|---|
PENDING_APPROVAL | Waiting for operations approval |
PROCESSING | Approved. The on-chain refund is in progress |
COMPLETED | The refund is complete |
FAILED | The refund failed, was rejected, or was canceled. See failureReason for the reason |
Refund reasons
| Enum value | Description |
|---|---|
DUPLICATE | Duplicate payment or duplicate order |
FRAUDULENT | Fraud or risk reasons |
REQUESTED_BY_CUSTOMER | The customer requested the refund |
OTHER | Other reasons |
Errors and support
For the error response format, see Errors. For common integration questions, see the FAQ. For help, contact your Stabo account manager or technical support, and provide the traceId.