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 checkoutUrl to 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

StepMerchant actionResult
1Get an Access TokenReceive access_token
2Create a Payment IntentReceive checkoutUrl / clientSecret
3Redirect to the hosted checkout pageThe customer completes the wallet payment
4Receive the WebhookReceive the payment result notification
5Query to confirm the final statusRetrieve Payment Intent / Refund details

API overview

ModuleEndpointDescription
Payment IntentPOST /openapi/v1/payment-intentsCreate a Payment Intent
Payment IntentGET /openapi/v1/payment-intents/{paymentIntentId}Retrieve a Payment Intent
Payment IntentGET /openapi/v1/payment-intentsList Payment Intents with pagination
RefundPOST /openapi/v1/payment-intents/{paymentIntentId}/refundsCreate a Refund
RefundGET /openapi/v1/payment-intents/{paymentIntentId}/refundsList Refunds with pagination
RefundGET /openapi/v1/payment-intents/{paymentIntentId}/refunds/{refundId}Retrieve a Refund
WebhookHTTPS URL configured by the merchantReceive 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 typeTriggerdata.object
checkout.payment_intent.processingAn on-chain payment is detected and is waiting for confirmation (status PROCESSING)Payment Intent object
checkout.payment_intent.partially_paidThe confirmed received amount is less than the amount due (status PARTIALLY_PAID)Payment Intent object
checkout.payment_intent.paidThe full amount is received and is waiting for compliance checks and crediting (status PAID)Payment Intent object
checkout.payment_intent.succeededCredited to the merchant balance (status COMPLETED)Payment Intent object
checkout.payment_intent.canceledCanceled or expired (status CANCELED)Payment Intent object
checkout.refund.createdThe refund is createdRefund object
checkout.refund.succeededThe refund is complete (status COMPLETED)Refund object
checkout.refund.failedThe 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.paymentIntentId or data.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

StatusDescription
AWAITING_PAYMENTWaiting for the customer to pay
PROCESSINGAn on-chain payment is detected and is waiting for confirmation
PARTIALLY_PAIDThe confirmed received amount is less than the amount due
PAIDThe full amount is received and is waiting for compliance checks and crediting
COMPLETEDCredited to the merchant balance
CANCELEDCanceled, including expired. See cancellationReason for the reason

Refund statuses

StatusDescription
PENDING_APPROVALWaiting for operations approval
PROCESSINGApproved. The on-chain refund is in progress
COMPLETEDThe refund is complete
FAILEDThe refund failed, was rejected, or was canceled. See failureReason for the reason

Refund reasons

Enum valueDescription
DUPLICATEDuplicate payment or duplicate order
FRAUDULENTFraud or risk reasons
REQUESTED_BY_CUSTOMERThe customer requested the refund
OTHEROther 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.

On this page