UseePay Open API
UseePay PortalMechant Dashboard
Product Docs
Product Docs
  • V2.0
  • V1.0
UseePay PortalMechant Dashboard
Product Docs
Product Docs
  • V2.0
  • V1.0
  1. Webhooks
  • Integration
    • Welcome to the UseePay Demo Page
    • Payment Product Overview
      • Hosted Checkout Integration Guide
      • Embedded Checkout Integration Guide
      • Express Checkout Integration Guide
      • Server to Server Integration Guide
    • Supported Payment Methods
      • Affirm
      • AfterPay_ClearPay
      • Bancontact
      • Bank Transfer
      • Blik
      • Boost
      • Card
      • Cashapp
      • Dana
      • GCash
      • iDEAL
      • Kakao Pay
      • Klarna
      • Konbini
      • Korean Card
      • Maya
      • MB_WAY
      • Mobilepay
      • Naver pay
      • P24
      • Payco
      • Pay with Link
      • Pix
      • Pse
      • Rabbit LINE Pay
      • Samsung Pay
      • Servipag
      • SPEI
      • Tmoney
      • Toss Pay
      • Trustly
      • TrueMoney
      • Webpay
      • RSA-Encrypted Card Payments
      • Zip
      • ApplePay
        • Apple Pay
        • Apple Pay Web Integration (API Integration)
      • GooglePay
        • Google Pay
        • Google Pay Web Integration (API Integration)
      • common
        • _shared-client-os-type
      • alipay
        • Alipay CN
        • Alipay HK
        • Alipay+
    • Subscription
      • Get started with Subscription
    • Online payment
      • Get started with online payments
    • Checkout session
      • Checkout Session Guide
    • Payment Capabilities
      • Currency Amount Unit Specification
      • Adaptive Price
  • Developer
    • Introduction
    • Authentication
    • Integrate Local Payment Methods
    • Error code
      • last_payment_error documentation
      • Errors
    • Best Integration
      • Quickly create a paymentIntent for a subscription
      • Auto-Charge Subscription Guide
    • Payment Intents
      • Payment Intent Overview
      • Quickly create a paymentIntent
      • Create a PaymentIntent
      • Retrieve a PaymentIntent
      • Update a PaymentIntent
      • Confirm a PaymentIntent
      • Cancel a PaymentIntent
      • Capture a PaymentIntent
      • List all payment intents
    • Customers
      • Create a customer
      • Retrieves a customer
      • Update a customer
      • List all customers
    • Subscriptions
      • Create a subscription
      • Retrieves a subscription
      • Update a subscription
      • List all subscriptions
      • Cancel a subscription
    • Invoices
      • Create a invoice
      • Retrieves a invoice
      • List all invoices
      • Pay a invoice
    • Payment Methods
      • Retieve Payment Method Session
    • Mandates
      • Create a mandate
      • Retrieves a mandate
      • List all mandates
    • Refunds
      • Create a refund
      • Retrieves a refund
      • List all refunds
    • Webhooks
      • Webhook Integration Guide(version 2026-04)
      • Webhook Integration Guide
      • Integration details
        • Supported Webhook Events
        • Webhook Activation/Signature Verification Steps
        • Webhook events for example
        • Dispute Webhook Integration Document
        • Difference between version 2026-04 and 2024-10-10
      • archive
        • 2024-10-10
          • Webhook Integration Guide(version 2024-10-10)
      • Create a webhook
        POST
      • Retrieves a webhook
        GET
      • Update a webhook
        POST
      • List all webhooks
        GET
    • Embedded Checkout
      • UseePay Elements Appearance
      • Payment Element
      • Payment Element (Deferred Intent)
      • Express Checkout Element
      • Checkout Session Element
    • Payment Method Configuration
      • Retieve Payment Method Configuration
    • Checkout Session
      • Create Checkout Session
      • Retrieve Checkout Session
    • Trackers
      • upload trackers
      • Retrieve a tracker
    • Capture
      • Capture Overview
      • List captures by intent id
    • Payement Attempt
      • ECI Indicator (3-D Secure) Reference
      • Retrieve PaymentAttempt
    • Schemas
      • CheckoutSessionCreateRequest
      • PaymentMethod
      • CreatePaymentIntentRequest
      • LineItem
      • Customer
      • Address
      • ProductData
      • Shipping
      • SubscriptionData
      • Error
      • DiscountPeriodConfig
      • DeviceData
      • CheckoutSessionResponse
      • ErrorResponse
      • Order
      • Product
      • PaymentMethodOptions
      • RiskControlOptions
      • Mandate
      • PaymentIntent
      • Billing
      • Card
      • AliPay
      • Wallet
      • Klarna
      • WechatPay
      • Refund
      • Subscription
      • Recurring
      • PriceData
      • SubscriptionItem
      • Invoice
      • NextAction
      • Webhook
      • CollectableOptions
      • PaymentLink
      • last_payment_error
      • discount_period_config
      • Capture
      • three_ds
      • PaymentAttempt
      • konbini
      • client_pm_options
      • pse
      • trial_period_config
      • Seller
      • RabbitLinePay
  • Message
    • Messaging Element
  • About Testing
    • Test Cards
    • ApplePay&GooglePay
  • Reconciliation
    • SFTP Access for Reconciliation
  • FAQ
    • Unable to receive Webhook notifications
    • FAQ
    • Introduction
  1. Webhooks

Webhook Integration Guide

Overview#

UseePay uses webhooks to send real-time event notifications to your HTTPS endpoints.
When a business event occurs, UseePay generates a webhook event, finds the matching webhook configurations, and sends an HTTP POST request to each matching endpoint.
Business event occurs
    ↓
UseePay generates a webhook event
    ↓
UseePay matches the merchant, application, and event type
    ↓
UseePay sends the event to the matching endpoint or endpoints
    ↓
Your endpoint verifies and processes the event
UseePay currently supports the following webhook API versions:
2026-09
2026-04
2024-10-10
For new integrations, use API version 2026-09.

Choose an API version#

The API version determines the delivery request format and the available webhook configuration capabilities.
Capability2026-092026-042024-10-10
Delivery Content-Typeapplication/jsonapplication/jsonapplication/x-www-form-urlencoded
Request bodyStandard JSON objectStandard JSON objectJSON string in the data form field
Single-application webhookYesYesYes
Multiple applications in one configurationYesNoNo
Merchant-level webhookYesNoNo
Multiple enabled endpoints for one applicationYesNoNo
Update the webhook scopeYesNoNo
Recommended for new integrationsYesNoNo
Use:
2026-09 for all new integrations and multiple-endpoint configurations;
2026-04 when maintaining an existing JSON-based, single-application integration;
2024-10-10 only when maintaining an existing form-encoded integration.

Common integration process#

Regardless of the selected API version:
1.
Configure a public HTTPS endpoint.
2.
Create a webhook and subscribe to the required event types.
3.
Verify the signature of each webhook request.
4.
Return an HTTP 2xx response as soon as the event is received.
5.
Process time-consuming business logic asynchronously.
6.
Implement idempotency using the Event ID.
7.
Tolerate duplicate and out-of-order delivery.
8.
Test the integration in the UseePay test environment.

Webhook event structure#

A webhook event contains the following fields:
FieldTypeDescription
idstringUnique Event ID beginning with evt_. Use this value as the idempotency key.
namestringEvent name in object.event_type format.
dataobjectBusiness object associated with the event.
Example:
{
  "id": "evt_79bdd43e4d0f464694fa433a5d467980",
  "name": "payment_intent.succeeded",
  "data": {
    "id": "pi_1234567890",
    "object": "payment_intent",
    "merchant_no": "50000000000xxxx",
    "app_id": "store-a.example.com",
    "amount": 10000,
    "currency": "USD",
    "status": "succeeded",
    "metadata": {}
  }
}
The structure of data depends on the event type. Your integration should ignore unknown fields because additional fields may be added over time.
For the complete event list, see Supported Webhook Events.

API version 2026-09#

Configuration model#

Version 2026-09 uses a standard JSON request body and introduces a flexible webhook configuration model.
It supports:
multiple enabled webhook endpoints for the same application;
one webhook configuration covering multiple applications;
merchant-level webhooks covering all applications under the merchant;
simultaneous matching of application-level and merchant-level webhooks;
delivery to every matching endpoint; and
updating the webhook scope.

Webhook scopes#

Version 2026-09 supports three scope types.
ScopeConfigurationEvents received
Single applicationOne concrete AppIdEvents generated by the specified application
Multiple applicationsMultiple AppIds separated by commasEvents generated by any listed application
Merchantapp_id is *Events generated by any application under the merchant

Single-application scope#

{
  "app_id": "store-a.example.com"
}

Multiple-application scope#

{
  "app_id": "store-a.example.com,store-b.example.com"
}

Merchant-level scope#

{
  "app_id": "*"
}

Specify the scope when creating a webhook#

Specify the scope in exactly one of the following ways.

Use the x-app-id header#

Use x-app-id for a single-application webhook:
When x-app-id is provided:
it must contain one concrete AppId;
it cannot contain commas;
it cannot be *; and
app_id must be omitted from the request body.

Use app_id in the request body#

Omit x-app-id and use app_id in the request body for:
one application;
multiple applications; or
merchant-level scope.
{
  "app_id": "store-a.example.com,store-b.example.com"
}
Do not send x-app-id and Body app_id in the same create request.

app_id rules#

The following rules apply to Body app_id:
The value is required when x-app-id is not provided.
Use an ASCII comma to separate multiple AppIds.
Do not include spaces or other whitespace.
Empty AppIds are not allowed.
Duplicate AppIds are not allowed.
* must be used by itself.
Every concrete AppId must belong to the authenticated merchant.
One webhook configuration can contain up to 50 AppIds.
Valid examples:
store-a.example.com
store-a.example.com,store-b.example.com
*
Invalid examples:
store-a.example.com, store-b.example.com
store-a.example.com,store-a.example.com
store-a.example.com,
*,store-a.example.com

Create a single-application webhook#

You can specify a single application using x-app-id:
Alternatively, omit x-app-id and specify one AppId in the request body:

Create a multiple-application webhook#

Create a merchant-level webhook#

A merchant-level webhook receives matching events from every application under the merchant.

Endpoint limits#

The following limits apply to enabled webhook configurations:
LimitMaximum
Enabled webhooks matching one application scope5
Enabled merchant-level webhooks5
Enabled webhook configurations for one merchant16
AppIds in one webhook configuration50
A multiple-application webhook:
counts as one webhook configuration toward the merchant total; and
occupies one endpoint slot for every application included in its scope.
For example, a webhook configured for:
store-a.example.com,store-b.example.com
occupies one slot for store-a.example.com and one slot for store-b.example.com.
Disabled webhooks do not receive events and are not counted toward the enabled webhook limits.
The limits are validated when:
a webhook is created with status enabled;
a disabled webhook is enabled; or
the scope of an enabled webhook is changed.

Event matching and delivery#

When an event occurs for an application, UseePay finds every enabled webhook that:
belongs to the same merchant;
contains the event's AppId in its application scope, or has merchant-level scope; and
subscribes to the event type, or subscribes to ["*"].
UseePay sends a separate HTTP POST request to every matching endpoint.
Example configuration:
WebhookScopeSubscribed event
Endpoint Astore-a.example.compayment_intent.succeeded
Endpoint Bstore-a.example.com,store-b.example.compayment_intent.succeeded
Endpoint C*payment_intent.succeeded
If store-a.example.com generates payment_intent.succeeded:
Endpoint A receives the event.
Endpoint B receives the event.
Endpoint C receives the event.
If store-b.example.com generates the same event:
Endpoint B receives the event.
Endpoint C receives the event.

Event ID across multiple endpoints#

All deliveries generated from the same business event use the same Event ID, even when the event is sent to multiple matching endpoints.
Delivery retries also use the same Event ID.
If multiple webhook configurations point to the same URL, that URL may receive the same Event ID more than once.
Always implement idempotency using the Event ID.

Delivery request format#

Version 2026-09 uses application/json.
{
  "id": "evt_79bdd43e4d0f464694fa433a5d467980",
  "name": "payment_intent.succeeded",
  "data": {
    "id": "pi_1234567890",
    "object": "payment_intent",
    "merchant_no": "50000000000xxxx",
    "app_id": "store-a.example.com",
    "amount": 10000,
    "currency": "USD",
    "status": "succeeded",
    "metadata": {}
  }
}
The app_id delivery header identifies the application that generated the business event.
It does not contain the comma-separated scope saved in the webhook configuration. For an application event, it is not *, even when the event is delivered through a merchant-level webhook.
Verify the signature against the raw JSON request body before parsing or modifying it.

Update the webhook scope#

For a 2026-09 webhook, update the scope by sending app_id in the request body:
{
  "app_id": "store-a.example.com,store-c.example.com"
}
To change the webhook to merchant-level scope:
{
  "app_id": "*"
}
When app_id is omitted, the existing scope remains unchanged.
The x-app-id header does not update the scope of an existing 2026-09 webhook. Use Body app_id to change the scope.
All scope and endpoint limits are revalidated when the scope or enabled status changes.

API version 2026-04#

Configuration model#

Version 2026-04 uses a standard JSON request body but retains the legacy single-application configuration model.
The following rules apply:
Each webhook applies to one application.
The application must be specified using the x-app-id request header.
app_id cannot be specified in the request body.
The application scope cannot be changed after creation.
Only one enabled webhook can be configured for the same merchant and application.

Create a webhook#

Delivery request format#

Version 2026-04 uses application/json.
{
  "id": "evt_123",
  "name": "payment_intent.succeeded",
  "data": {
    "id": "pi_123",
    "object": "payment_intent",
    "status": "succeeded"
  }
}
Read the request body directly as a JSON object.
When verifying the signature, use the raw HTTP request body before parsing, formatting, or modifying the JSON.

Update rules#

You can update fields such as:
url;
events;
description;
metadata; and
status.
The application scope cannot be changed while the webhook remains on version 2026-04.
Do not include app_id in the request body.
Version 2026-04 cannot be changed directly to 2024-10-10. To upgrade, use version 2026-09.

API version 2024-10-10#

Configuration model#

Version 2024-10-10 uses the legacy single-application configuration model.
The following rules apply:
Each webhook applies to one application.
The application must be specified using the x-app-id request header.
app_id cannot be specified in the request body.
The application scope cannot be changed after creation.
Only one enabled webhook can be configured for the same merchant and application.

Create a webhook#

Provide the application ID in the x-app-id header:
If api_version is omitted when creating a webhook, UseePay uses 2024-10-10.
To avoid relying on the default version, explicitly provide api_version.

Delivery request format#

Version 2024-10-10 uses application/x-www-form-urlencoded.
The data form field contains a JSON string.
Your endpoint must:
1.
Read the data form field.
2.
URL-decode the field value.
3.
Parse the decoded value as JSON.

Update rules#

You can update fields such as:
url;
events;
description;
metadata; and
status.
The application scope cannot be changed while the webhook remains on version 2024-10-10.
Do not include app_id in the request body.
Version 2024-10-10 cannot be changed directly to 2026-04. To upgrade, use version 2026-09.

Upgrade to API version 2026-09#

An existing 2024-10-10 or 2026-04 webhook can be upgraded to 2026-09.

Retain the existing application scope#

Explicitly set api_version:
{
  "api_version": "2026-09"
}
The existing application scope is retained when app_id is omitted.

Change the scope during the upgrade#

Include app_id in the same request:
{
  "api_version": "2026-09",
  "app_id": "store-a.example.com,store-b.example.com"
}
To upgrade directly to merchant-level scope:
{
  "api_version": "2026-09",
  "app_id": "*"
}

Upgrade restrictions#

The following rules apply:
Updating other fields without api_version does not automatically upgrade a legacy webhook.
A legacy webhook cannot switch directly between 2024-10-10 and 2026-04.
After a webhook is upgraded to 2026-09, it cannot be downgraded.
Before upgrading from 2024-10-10, update the endpoint to accept application/json.
All scope and endpoint limits are validated during the upgrade.

Subscribe to events#

Use events to specify the event types delivered to the endpoint.
{
  "events": [
    "payment_intent.succeeded",
    "payment_intent.payment_failed"
  ]
}
Use ["*"] by itself to subscribe to all supported webhook events:
{
  "events": ["*"]
}
Do not combine * with another event type.
For the complete event list, see Supported Webhook Events.

Signature verification#

UseePay includes an RSA signature in the sign request header.
The verification input depends on the API version:
API versionVerification input
2026-09Raw JSON request body
2026-04Raw JSON request body
2024-10-10Legacy form-encoded webhook data
For JSON webhook versions, verify the signature against the raw HTTP request body before:
parsing the JSON;
formatting or serializing the JSON again;
changing whitespace;
extracting individual fields; or
modifying character encoding.
For detailed instructions, see Webhook Activation/Signature Verification Steps.

Respond quickly#

Return an HTTP 2xx status code as soon as the event is received.
Process time-consuming business logic asynchronously to avoid delivery timeouts.
Example for JSON webhook versions:

Idempotency#

The same event may be delivered more than once because of:
delivery retries;
network timeouts;
multiple webhook configurations pointing to the same URL; or
multiple matching scopes in version 2026-09.
Use event.id as the idempotency key.
Do not use only the business object ID as the idempotency key. The same business object may generate different event types at different times.

Event ordering#

Do not rely on webhook events being delivered in the same order in which business changes occurred.
When strict ordering or state reconciliation is required, retrieve the latest state of the business object from the corresponding UseePay API.

Retry mechanism#

If your webhook endpoint returns a non-2xx status code or times out, UseePay automatically retries the delivery using the following intervals:
1st retry: after 1 second
2nd retry: after 5 seconds
3rd retry: after 10 seconds
4th retry: after 30 seconds
5th retry: after 1 minute
Subsequent retries: 2 minutes, 3 minutes, 4 minutes, up to 2 hours
A delivery can be retried up to 18 times.
The same Event ID is used for retry deliveries.
Your endpoint should:
return 2xx quickly;
implement idempotency;
tolerate duplicate delivery;
tolerate out-of-order delivery; and
log the Event ID for troubleshooting.

Test your integration#

To test webhooks:
1.
Use UseePay Test Cards to create test payments.
2.
View webhook delivery records in the Merchant Dashboard.
3.
Confirm that the expected event types are delivered.
4.
Confirm that signature verification succeeds.
5.
Confirm that duplicate events are processed only once.
6.
For version 2026-09, verify every configured application-level and merchant-level endpoint.

Related documentation#

Supported Webhook Events
Webhook Activation/Signature Verification Steps
Unable to Receive Webhook Notifications
Create a Webhook
Retrieve a Webhook
Update a Webhook
List All Webhooks

Technical support#

For questions, contact support@useepay.com.
Previous
Webhook Integration Guide(version 2026-04)
Next
Supported Webhook Events
Built with