Product webhook
One or more products, batched at 50. Upsert on productNumber.
Request
Your endpointBody
Every text field is a Norwegian string. There is no locale object. The catalog is the WebIldstedet assortment sold in Norway, so the payload has no market list and no channel field.
Envelope
webhookVersionstringeventstringqueue.batchSizenumberqueue.batchIndexnumberqueue.batchCountnumberqueue.isFirstBatchbooleanqueue.isLastBatchbooleanqueue.totalProductCountnumberqueue.currentBatchProductCountnumbersummary.datetimestringsummary.productCountnumberproductsarrayProduct
productNumberstringslugstringupdatedAtstringtitlestringdescriptionstring | nullsubtitlestring | nullbulletsstring | nullproductType.codestringproductType.labelstringimageobject | nulltransparentProductImageobject | nulltechnicalSpecificationsarraybrandstring | nullvariantsarraydocumentsarrayecoLabelstring | nullVariants
A variant is omitted only when its status is Discontinued. Other statuses are included, including Published, ReadyToPublish, UnderEnrichment, and Unpublished. There is no separate active flag. A variant you can sell is typically Published.
productNumberstringstatusstring | nullcolorstringcolorHexstringdescriptionstring | nullsubtitlestring | nullpriceobjectimagesarraytransparentProductImageobject | nullPrices
currency is always NOK. amount is the Norwegian list price. vatIncluded says whether that amount includes VAT. updatedAt is when the price was last written.
When a campaign applies, the same object also includes campaignAmount, campaignFrom, campaignTo, and campaignSlug. They are always sent together, and omitted together when there is no campaign. campaignAmount is greater than 0. A zero amount is not a free campaign and is not sent. Show the campaign price only when today is on or after campaignFrom and on or before campaignTo. Either date may be null. campaignSlug may be null.
If several campaigns cover the same variant, one is chosen: the latest start date wins.
Documents
Only files with a Norwegian display name are included. The array is ordered for display: lower sortOrder first. Documents with no known type sort last, then by filename. Render them in array order.
filenamestringdisplayNamestringsortOrdernumber | nullmediaCodestringchecksumstringurlstringExample
{
"webhookVersion": "1",
"event": "product_changed",
"queue": {
"batchSize": 50,
"batchIndex": 1,
"batchCount": 1,
"isFirstBatch": true,
"isLastBatch": true,
"totalProductCount": 1,
"currentBatchProductCount": 1
},
"summary": {
"datetime": "2026-10-20T08:00:00.000Z",
"productCount": 1
},
"products": [
{
"productNumber": "F500",
"slug": "peisovn-modell-f500",
"updatedAt": "2026-10-20T08:00:00.000Z",
"productType": {
"code": "wood_stoves",
"label": "Vedovner"
},
"title": "Peisovn modell F500",
"description": "En peisovn med rentbrennende forbrenning.",
"subtitle": "Skandinavisk design",
"bullets": "<ul><li>Rentbrennende</li></ul>",
"image": {
"url": "https://cdn.example.com/f500.jpg",
"mediaCode": "1234",
"checksum": "567890"
},
"transparentProductImage": {
"url": "https://cdn.example.com/f500.png",
"mediaCode": "4108",
"checksum": "1595322388"
},
"technicalSpecifications": [
{ "code": "AtrPower", "label": "Effekt", "value": "8 kW" }
],
"brand": "Jøtul",
"variants": [
{
"productNumber": "F500-B",
"status": "Published",
"color": "B",
"colorHex": "#000000",
"description": "Svart utførelse",
"subtitle": "Tidløs svart",
"price": {
"currency": "NOK",
"amount": 44990,
"vatIncluded": true,
"updatedAt": "2026-04-08T12:32:07.551Z",
"campaignAmount": 39990,
"campaignFrom": "2026-10-01",
"campaignTo": "2026-10-31",
"campaignSlug": "hostkampanje"
},
"images": [
{
"url": "https://cdn.example.com/f500-b.jpg",
"mediaCode": "5678",
"checksum": "123456"
}
],
"transparentProductImage": {
"url": "https://cdn.example.com/f500-b.png",
"mediaCode": "4109",
"checksum": "1595322399"
}
}
],
"documents": [
{
"filename": "F500-manual-no.pdf",
"displayName": "Monterings- og brukerveiledning",
"sortOrder": 2,
"mediaCode": "12108",
"checksum": "1595322388",
"url": "https://cdn.example.com/files/f500-manual-no.pdf"
}
],
"ecoLabel": "A+"
}
]
}Response
Return any 2xx before slow work, so the delivery does not time out. The JSON above is the body you receive.
Additional
When it is sent
product_changed— products that changed during the day, delivered together once per day. The same product can appear again later if it changes again.structure_changed— every product in the catalog. Sent at 00:00 Europe/Oslo, and when the catalog is sent on request. Batches use the same envelope.
Handling
- Treat missing fields, nulls, and empty arrays as normal.
- The same product can be delivered again. Upsert on
productNumber. Do not insert a second copy. - On
structure_changed, wait untilqueue.isLastBatchis true. Then delete any product you store whoseproductNumberwas not in this delivery. That product has left the catalog.