Receiving CloudEvents¶
This page will help you set up your system to receive events from BankID Antifraud.
Integration steps¶
1. Provide the required information¶
Start by providing BankID with the full webhook URL where you want to receive the events.
Requirements for your webhook URL
- Must be publicly accessible from the internet via HTTPS
- Must accept both
POSTandOPTIONSrequests
2. Validate subscription¶
When we create the subscription, a validation request will be sent to your URL via an HTTP OPTIONS call.
The request will include the header WebHook-Request-Origin containing a DNS expression identifying the sending system. This will be set to eventgrid.azure.net.
To accept the subscription, respond with:
- HTTP Status:
200 - Headers:
| Header | Value |
|---|---|
WebHook-Allowed-Origin |
Same value as WebHook-Request-Origin or * |
WebHook-Allowed-Rate |
* (no rate limit) or a positive integer (requests per minute) |
Code example (Kotlin/Ktor)
3. Receive events¶
Events are delivered as HTTP POST requests. For successful delivery, respond with one of the following status codes:
| Status Code | Result |
|---|---|
200, 201, 202, 203, 204 |
Success - event delivered |
400, 401, 403, 404, 413 |
Failure - no retry |
| Other codes | Failure - retry with exponential backoff |
4. Handle CloudEvents¶
Events are delivered in the CloudEvents format. Here's an example request:
POST /your-subscription HTTP/1.1
Host: webhook.example.com
Content-Type: application/cloudevents+json; charset=utf-8
Content-Length: nnnn
Authorization: Bearer <token>
{
"specversion": "1.0",
"type": "no.bankid.antifraud.alarm.dispatch.v2",
"source": "...",
"id": "...",
"time": "...",
"data": {
... alarm data ...
}
}
Always check the event type
Always verify the type field before processing the event. This ensures your system can handle new event types gracefully when they are introduced.
The domain-specific data (the alarm) will be in the data field.
5. Authenticate requests¶
The service uses JSON Web Tokens (JWT) issued by Microsoft Entra ID to authorize requests. Each POST request includes a JWT in the Authorization header using the Bearer scheme.
Verify the token using:
| Parameter | Value |
|---|---|
| JWT Issuer | https://login.microsoftonline.com/08a02467-3604-46e9-b818-6be676cf015b/v2.0 |
| JWK URL | https://login.microsoftonline.com/08a02467-3604-46e9-b818-6be676cf015b/discovery/v2.0/keys |
Audience claim
Make sure to also verify the aud (audience) claim in the JWT.
Troubleshooting¶
Subscription validation fails¶
If the subscription validation fails, check the following:
- Firewalls are open for incoming requests
- The
OPTIONShandler does not check theAuthorizationheader (it will not be set during validation) - Your endpoint accepts the
Content-Type: application/cloudevents+json; charset=utf-8
Further documentation¶
For more information about the underlying technologies, refer to: