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 event2026-092026-042024-10-102026-09.| Capability | 2026-09 | 2026-04 | 2024-10-10 |
|---|---|---|---|
| Delivery Content-Type | application/json | application/json | application/x-www-form-urlencoded |
| Request body | Standard JSON object | Standard JSON object | JSON string in the data form field |
| Single-application webhook | Yes | Yes | Yes |
| Multiple applications in one configuration | Yes | No | No |
| Merchant-level webhook | Yes | No | No |
| Multiple enabled endpoints for one application | Yes | No | No |
| Update the webhook scope | Yes | No | No |
| Recommended for new integrations | Yes | No | No |
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.2xx response as soon as the event is received.| Field | Type | Description |
|---|---|---|
id | string | Unique Event ID beginning with evt_. Use this value as the idempotency key. |
name | string | Event name in object.event_type format. |
data | object | Business object associated with the event. |
{
"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": {}
}
}data depends on the event type. Your integration should ignore unknown fields because additional fields may be added over time.2026-09 uses a standard JSON request body and introduces a flexible webhook configuration model.2026-09 supports three scope types.| Scope | Configuration | Events received |
|---|---|---|
| Single application | One concrete AppId | Events generated by the specified application |
| Multiple applications | Multiple AppIds separated by commas | Events generated by any listed application |
| Merchant | app_id is * | Events generated by any application under the merchant |
{
"app_id": "store-a.example.com"
}{
"app_id": "store-a.example.com,store-b.example.com"
}{
"app_id": "*"
}x-app-id headerx-app-id for a single-application webhook:x-app-id is provided:*; andapp_id must be omitted from the request body.app_id in the request bodyx-app-id and use app_id in the request body for:{
"app_id": "store-a.example.com,store-b.example.com"
}x-app-id and Body app_id in the same create request.app_id rulesapp_id:x-app-id is not provided.* must be used by itself.store-a.example.com
store-a.example.com,store-b.example.com
*store-a.example.com, store-b.example.com
store-a.example.com,store-a.example.com
store-a.example.com,
*,store-a.example.comx-app-id:x-app-id and specify one AppId in the request body:| Limit | Maximum |
|---|---|
| Enabled webhooks matching one application scope | 5 |
| Enabled merchant-level webhooks | 5 |
| Enabled webhook configurations for one merchant | 16 |
| AppIds in one webhook configuration | 50 |
store-a.example.com,store-b.example.comstore-a.example.com and one slot for store-b.example.com.enabled;["*"].| Webhook | Scope | Subscribed event |
|---|---|---|
| Endpoint A | store-a.example.com | payment_intent.succeeded |
| Endpoint B | store-a.example.com,store-b.example.com | payment_intent.succeeded |
| Endpoint C | * | payment_intent.succeeded |
store-a.example.com generates payment_intent.succeeded:store-b.example.com generates the same event: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": {}
}
}app_id delivery header identifies the application that generated the business event.*, even when the event is delivered through a merchant-level webhook.2026-09 webhook, update the scope by sending app_id in the request body:{
"app_id": "store-a.example.com,store-c.example.com"
}{
"app_id": "*"
}app_id is omitted, the existing scope remains unchanged.x-app-id header does not update the scope of an existing 2026-09 webhook. Use Body app_id to change the scope.2026-04 uses a standard JSON request body but retains the legacy single-application configuration model.x-app-id request header.app_id cannot be specified in the request body.2026-04 uses application/json.{
"id": "evt_123",
"name": "payment_intent.succeeded",
"data": {
"id": "pi_123",
"object": "payment_intent",
"status": "succeeded"
}
}url;events;description;metadata; andstatus.2026-04.app_id in the request body.2026-04 cannot be changed directly to 2024-10-10. To upgrade, use version 2026-09.2024-10-10 uses the legacy single-application configuration model.x-app-id request header.app_id cannot be specified in the request body.x-app-id header:api_version is omitted when creating a webhook, UseePay uses 2024-10-10.api_version.2024-10-10 uses application/x-www-form-urlencoded.data form field contains a JSON string.data form field.url;events;description;metadata; andstatus.2024-10-10.app_id in the request body.2024-10-10 cannot be changed directly to 2026-04. To upgrade, use version 2026-09.2024-10-10 or 2026-04 webhook can be upgraded to 2026-09.api_version:{
"api_version": "2026-09"
}app_id is omitted.app_id in the same request:{
"api_version": "2026-09",
"app_id": "store-a.example.com,store-b.example.com"
}{
"api_version": "2026-09",
"app_id": "*"
}api_version does not automatically upgrade a legacy webhook.2024-10-10 and 2026-04.2026-09, it cannot be downgraded.2024-10-10, update the endpoint to accept application/json.events to specify the event types delivered to the endpoint.{
"events": [
"payment_intent.succeeded",
"payment_intent.payment_failed"
]
}["*"] by itself to subscribe to all supported webhook events:{
"events": ["*"]
}* with another event type.sign request header.| API version | Verification input |
|---|---|
2026-09 | Raw JSON request body |
2026-04 | Raw JSON request body |
2024-10-10 | Legacy form-encoded webhook data |
2xx status code as soon as the event is received.2026-09.event.id as the idempotency key.2xx status code or times out, UseePay automatically retries the delivery using the following intervals:2xx quickly;2026-09, verify every configured application-level and merchant-level endpoint.