Every PRESS delivery follows the CloudEvents v1.0 specification. The data field is always an array of event type groups — each group contains a type and a records array.
POST /webhooks/press HTTP/1.1
Host: api.yourdomain.ae
Content-Type: "application/cloudevents+json"
X-Webhook-Id: "01JW4KR9TBMZ38EYN8N9THKKBC" // idempotency key — deduplicate on this
X-Webhook-Timestamp: 1743342300 // unix epoch seconds — used for signature & replay check
X-Webhook-Subscription-Id: sub_a1b2c3d4e5 // your subscription, issued during onboarding
X-Webhook-Delivery-Attempt: 1 // 1 = first try, 2+ = retry (max 6)
X-Webhook-Signature: sha256=4d8f2a91c0e7b3.. // HMAC-SHA256(secret, timestamp + "." + body)
{
"specversion": "1.0", // CloudEvents version — always "1.0"
"id": "01JW4KR9TBMZ38EYN8N9THKKBC", // same as X-Webhook-Id — idempotency key
"source": "icp/press-event-pipeline", // event producer — always this value
"time": "2026-03-30T12:45:00.000Z", // when the delivery was produced (UTC)
"total_records": 1, // total records across all groups
"data": [ // array of event type groups
{
"type": "ae.uaekyc.icp.immigration_entry.v1", // see Event Type Mapping below
"records": [
{
"event_id": "evt-imm-entry-999", // unique per record
"uaekyc_id": 34890890, // uaekyc Id of the affected individual
"event_ts": "2026-03-30T12:40:00.000Z" // when the change occurred at ICP
}
]
}
]
}
POST /webhooks/press HTTP/1.1
Host: api.yourdomain.ae
Content-Type: application/cloudevents+json
X-Webhook-Id: 01JW4KS7XDQP52FRM3K8VHJJ9A // idempotency key
X-Webhook-Timestamp: 1743341400 // unix epoch seconds
X-Webhook-Subscription-Id: sub_a1b2c3d4e5
X-Webhook-Delivery-Attempt: 1
X-Webhook-Signature: sha256=9a3b7e1d05f4c2...
{
"specversion": "1.0",
"id": "01JW4KS7XDQP52FRM3K8VHJJ9A", // idempotency key
"source": "icp/press-event-pipeline",
"time": "2026-03-30T12:30:00.000Z",
"total_records": 9, // 3 + 2 + 4 = 9 records total
"data": [
{
"type": "ae.uaekyc.icp.immigration_entry.v1", // 3 people entered the UAE
"records": [
{ "event_id": "evt-imm-entry-001", "uaekyc_id": 34890901, "event_ts": "2026-03-30T11:10:00.000Z" },
{ "event_id": "evt-imm-entry-002", "uaekyc_id": 34890902, "event_ts": "2026-03-30T11:12:00.000Z" },
{ "event_id": "evt-imm-entry-003", "uaekyc_id": 34890903, "event_ts": "2026-03-30T11:15:00.000Z" }
]
},
{
"type": "ae.uaekyc.icp.status_change.v1", // 2 visa/status changes
"records": [
{ "event_id": "evt-status-001", "uaekyc_id": 34890911, "event_ts": "2026-03-30T11:20:00.000Z" },
{ "event_id": "evt-status-002", "uaekyc_id": 34890912, "event_ts": "2026-03-30T11:25:00.000Z" }
]
},
{
"type": "ae.uaekyc.icp.visa_cancellation.v1", // 4 visa cancellations
"records": [
{ "event_id": "evt-visa-cancel-001", "uaekyc_id": 34890921, "event_ts": "2026-03-30T11:30:00.000Z" },
{ "event_id": "evt-visa-cancel-002", "uaekyc_id": 34890922, "event_ts": "2026-03-30T11:32:00.000Z" },
{ "event_id": "evt-visa-cancel-003", "uaekyc_id": 34890923, "event_ts": "2026-03-30T11:35:00.000Z" },
{ "event_id": "evt-visa-cancel-004", "uaekyc_id": 34890924, "event_ts": "2026-03-30T11:40:00.000Z" }
]
}
]
}
Expected Response
HTTP/1.1 200 OK
Content-Type: application/json
{"status": "accepted"}
Return 2xx only after the event is durably stored. Do not return 2xx before that.
Always application/cloudevents+json.
Unique delivery identifier (32-character string). Use as your idempotency key. Stable across retries.
X-Webhook-Subscription-Id
Your webhook subscription identifier. Issued during onboarding.
X-Webhook-Delivery-Attempt
Attempt number. 1 = first delivery, 2+ = retry. Range: 1–6.
HMAC-SHA256 signature for payload verification. Format: sha256=<hex_digest>.
Payload Fields
Envelope
| Field | Type | Required | Size / Format | Fixed Value | Description |
|---|
specversion | String | Yes | 3 chars | "1.0" | CloudEvents specification version. |
id | String | Yes | 32 chars | — | Unique delivery identifier. Same as X-Webhook-Id header. Use as idempotency key. |
source | String | Yes | — | "icp/press-event-pipeline" | The system that produced the event. |
time | String | Yes | ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) | — | When the delivery was produced (UTC). |
total_records | Integer | Yes | Min: 1 | — | Total number of individual event records across all groups. |
data | Array | Yes | — | — | Array of event type groups. |
Event Type Group
Each object in the data array groups records by event type.
| Field | Type | Required | Size / Format | Possible Values | Description |
|---|
type | String | Yes | Reverse-domain notation | See Event Type Mapping — one of 7 values (e.g., ae.uaekyc.icp.immigration_entry.v1) | The lifecycle event type for this group. |
records | Array | Yes | Min: 1 element | — | Array of event records of this type. |
Event Record
Each object in the records array represents a single lifecycle event.
| Field | Type | Required | Size / Format | Description |
|---|
event_id | String | Yes | Max: 64 chars | Unique identifier for this individual event record. |
uaekyc_id | Integer | Yes | LONG INT (e.g., 34890890) | uaekyc id of the affected individual. |
event_ts | String | Yes | ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) | When the change occurred at ICP (UTC). |
Event Type Mapping
The type field in each event group uses reverse-domain notation.
| Event Type Code | type Value | Description |
|---|
IMMIGRATION_ENTRY | ae.uaekyc.icp.immigration_entry.v1 | Person entered the UAE through immigration |
VISA_EXTENSION | ae.uaekyc.icp.visa_extension.v1 | Visa validity was extended |
STATUS_CHANGE | ae.uaekyc.icp.status_change.v1 | Visa type or person class changed |
VISA_CANCELLATION | ae.uaekyc.icp.visa_cancellation.v1 | Visa was cancelled |
NEW_ID | ae.uaekyc.icp.new_id.v1 | New Emirates ID was issued |
FILE_CANCEL | ae.uaekyc.icp.file_cancel.v1 | Immigration file was cancelled |