#
Webhooks
Webhooks allow you to receive updates about vignette sales by automatically sending data to a specified URL whenever an event occurs.
During onboarding, please provide us with the webhook URL you would like to use to receive sale reports.
#
Authorization
To ensure that webhook requests are secure and verifiably from us, each request includes an X-Signature header.
You can verify this signature using your Webhook Secret and the raw request payload.
import crypto from "crypto"
export function verifyWebhookSignature(receivedSignature, secret, payload) {
const expectedSignature = crypto
.createHmac("sha256", secret)
.update(payload)
.digest("hex")
const receivedBuffer = Buffer.from(receivedSignature)
const expectedBuffer = Buffer.from(expectedSignature)
// Ensure both Buffers have the same length
if (receivedBuffer.length !== expectedBuffer.length) {
return false
}
// Perform constant-time comparison
return crypto.timingSafeEqual(receivedBuffer, expectedBuffer)
}
#
Request
A webhook request is sent as a JSON object with the following structure:
#
Sample webhook request payload
#
If the sale was successful
{
"saleId": "string",
"vignetteId": "string",
"vignetteSale": {
"success": true,
"data": {
"id": "string",
"total": 0,
"currency": "BGN",
"totalCurrencyAmount": {
"amountBGN": 0,
"amountEUR": 0
},
"createdOn": "string",
"active": true,
"saleRows": [
{
"active": true,
"productsResponse": {
"id": 0,
"vehicleType": "car",
"validityType": "year",
"vehicleTypeText": "Light vehicle <= 3.5t, camping vehicle M1",
"validityTypeText": "Yearly",
"categoryDescriptionText": "Category 3"
},
"id": "string",
"email": "string",
"addEmailUrl": "string",
"createdOn": "string",
"kapschProperties": {
"id": "string",
"product": {
"id": 0,
"vehicleType": "car",
"validityType": "year"
},
"status": 0,
"vehicle": {
"lpn": "string",
"countryCode": "string"
},
"validity": {
"requestedValidityStartDate": "string",
"validityStartDateTimeUTC": "string",
"validityEndDateTimeUTC": "string",
"validityEndDateTimeEET": "string",
"validityStartDateTimeEET": "string"
},
"price": {
"currency": "BGN",
"amount": 0
},
"purchase": {
"purchaseDateTimeUTC": "string"
}
},
"currencyAmount": {
"amountBGN": 0,
"amountEUR": 0
}
}
]
}
}
}
#
If the sale failed
{
"saleId": "string",
"vignetteId": "string",
"vignetteSale": {
"success": false,
"error": {
"code": "string",
"message": "string"
}
}
}