Webhook message schema
Every field of a SellerSheet Webhooks HTTPS delivery, schemaVersion 1 — the headers, the delivery, each message, its store, Amazon's notification and the typed summary of every notification delivered today.
What an HTTPS webhook receives, field by field. The same is published as a JSON Schema (draft 2020-12) at sellersheetai.com/schemas/webhooks-v1.json, with one sample delivery per notification at sellersheetai.com/schemas/webhooks-v1-samples.json. Every value on this page is made up.
Rules that hold everywhere:
- Keys are camelCase, except inside
amazon, which keeps Amazon's own spelling. - Every key is always sent. "Required" below is what the schema requires; a key that is not required is sent as
null(or[],{}) when it has no value. - Objects are not closed: a key you do not know may appear later within
schemaVersion1 — ignore it. - Times are ISO 8601 date-times in UTC (
2026-10-27T09:28:33Z), except insideamazon, which keeps Amazon's text.
Headers
| Header | Example | What it is |
|---|---|---|
Content-Type | application/json | Always JSON. |
X-SellerSheet-Webhook-Id | 0c6f2a8e-4d1b-4e7a-9b35-6e8d2f1a4c90 | The webhook — equal to webhookId. |
X-SellerSheet-Delivery-Id | dlv_8f3a1c9e2b7d4e6fa0b1c2d3e4f5a6b7 | The delivery — equal to deliveryId, the same on every try. |
X-SellerSheet-Timestamp | 1793092113 | Unix seconds when this try was sent. |
X-SellerSheet-Signature | sha256=2225d8c4… | sha256= and the hex HMAC-SHA256, keyed with your signing secret, of the timestamp, a . and the raw body. How to verify. |
X-SellerSheet-Test | false | true on a Send test: the messages are samples for the made-up store SampleStore. |
The delivery
The body of one request: up to 100 messages, at most 1 MB.
| Field | Type | Required | What it is | Example |
|---|---|---|---|---|
deliveryId | string | yes | This delivery. The same on every try of it. | dlv_8f3a1c9e2b7d4e6fa0b1c2d3e4f5a6b7 |
webhookId | string | yes | The webhook it was sent to. | 0c6f2a8e-4d1b-4e7a-9b35-6e8d2f1a4c90 |
organizationId | string | yes | Your workspace. | 7b2e9c41-0d3a-4f6b-8e15-9c2a4d6f8b30 |
sentAt | date-time | yes | When this try was sent. | 2026-10-27T09:28:33Z |
attempt | integer ≥ 1 | yes | Which try this is: 1, 2 or 3. | 1 |
schemaVersion | integer, 1 | no | This format's version — always 1. | 1 |
messages | array of message | yes | The messages, in the order SellerSheet received them. |
A message
One Amazon notification.
| Field | Type | Required | What it is | Example |
|---|---|---|---|---|
messageId | string | yes | Amazon's NotificationId. Drop one you already handled. | 5c0e8f4a-2b7d-4e91-a3c6-000000000001 |
messageType | string | yes | Amazon's notification type; it decides the shape of summary. More types may be added within schemaVersion 1. | LISTINGS_ITEM_ISSUES_CHANGE |
fingerprint | string or null | no | sha256: and 64 hex characters, the same for the same change published again by Amazon under a new messageId. | sha256:af6e358a… |
store | store or null | no | Your store and the marketplace the message is about. A delivered message always names one of your stores. | |
eventTime | date-time or null | no | When the change happened (Amazon's EventTime). | 2026-10-27T09:14:03Z |
publishTime | date-time or null | no | When Amazon sent it. | 2026-10-27T09:28:30Z |
receivedAt | date-time | yes | When SellerSheet received it. | 2026-10-27T09:28:32Z |
summary | summary | yes | SellerSheet's reading of the message, typed by messageType. | |
amazon | amazon | yes | Amazon's notification, every value as Amazon sent it. |
store
| Field | Type | Required | What it is | Example |
|---|---|---|---|---|
storeId | string | yes | SellerSheet's ID of the store. | 3f6c2a9e-5b1d-4c8e-9a7f-2d4e6b8c0a11 |
ref | string | yes | The store ref <store>-<CC>: the store name and the message's marketplace. | myStore-US |
sellerId | string or null | no | Amazon's seller ID. | A1EXAMPLESELLER |
marketplaceId | string or null | no | Amazon's marketplace ID — null when Amazon names none (account health, reports, feeds and other account-wide messages). | ATVPDKIKX0DER |
countryCode | string or null | no | The marketplace's country code. | US |
connected | boolean | yes | false when the store has not connected this marketplace in SellerSheet. | true |
amazon
Amazon's notification — the source of truth. The top-level names are fixed; every value is exactly what Amazon sent, in Amazon's own casing (PascalCase for some notifications, camelCase for others): read a key in either casing.
| Field | Type | Required | What it is | Example |
|---|---|---|---|---|
notificationType | string | yes | Amazon's NotificationType. | LISTINGS_ITEM_ISSUES_CHANGE |
notificationVersion | string or null | no | Amazon's NotificationVersion. | 1.0 |
payloadVersion | string or null | no | Amazon's PayloadVersion — the shape of payload. | 2023-12-13 |
eventTime | string or null | no | Amazon's EventTime, as Amazon wrote it. | 2026-10-27T09:14:03.000Z |
notificationMetadata | object | no | Amazon's NotificationMetadata: ApplicationId, SubscriptionId, PublishTime, NotificationId. | |
payload | object | no | Amazon's Payload, unchanged. |
The payload of each notification is documented by Amazon in the Selling Partner API's notification type reference.
summary
Every summary has these four fields:
| Field | Type | Required | What it is | Example |
|---|---|---|---|---|
text | string | yes | One readable line: the item and marketplace, plain words, then Amazon's field names and values. | SKU SKU-EXAMPLE-01 (B0EXAMPLE01) on US: Listing not buyable (suppressed) · Severities=ERROR · EnforcementActions=LISTING_SUPPRESSED |
severity | critical · warning · info · recovery | yes | How bad it is — red, orange, blue, green on a chat card. When each applies. | critical |
sku | string or null | no | The SKU, when Amazon sent one. | SKU-EXAMPLE-01 |
asin | string or null | no | The ASIN, when Amazon sent one. | B0EXAMPLE01 |
Then the fields of its messageType, below, in the order of the Webhooks page. A type this page does not list carries the four fields only. A full sample delivery of each type, valid against the schema: webhooks-v1-samples.json.
messageType | Notification |
|---|---|
LISTINGS_ITEM_ISSUES_CHANGE | Listing issues |
LISTINGS_ITEM_STATUS_CHANGE | Listing status |
BRANDED_ITEM_CONTENT_CHANGE | Brand content |
ITEM_PRODUCT_TYPE_CHANGE | Product type change |
LISTINGS_ITEM_MFN_QUANTITY_CHANGE | Self-fulfilled quantity |
PRODUCT_TYPE_DEFINITIONS_CHANGE | Product type definitions |
PRICING_HEALTH | Pricing health |
ANY_OFFER_CHANGED | Competing offers |
B2B_ANY_OFFER_CHANGED | Business offers (B2B) |
FEE_PROMOTION | Fee promotions |
ORDER_CHANGE | Order changes |
FULFILLMENT_ORDER_STATUS | Multi-Channel Fulfillment orders |
FBA_OUTBOUND_SHIPMENT_STATUS | FBA Onsite shipments (Brazil) |
EXTERNAL_FULFILLMENT_SHIPMENT_STATUS_CHANGE | External fulfillment shipments |
FBA_INVENTORY_AVAILABILITY_CHANGES | FBA inventory |
ITEM_INVENTORY_EVENT_CHANGE | Hourly inventory |
ITEM_SALES_EVENT_CHANGE | Hourly sales |
DETAIL_PAGE_TRAFFIC_EVENT | Hourly page views |
TRANSACTION_UPDATE | Transactions |
ACCOUNT_STATUS_CHANGED | Account health |
REPORT_PROCESSING_FINISHED | Report finished |
FEED_PROCESSING_FINISHED | Feed finished |
DATA_KIOSK_QUERY_PROCESSING_FINISHED | Data Kiosk query finished |
Listing issues
LISTINGS_ITEM_ISSUES_CHANGE — the issues now in force on a listing. Amazon never sends the issue text: open the SKU in Seller Central to read it.
| Field | Type | What it is |
|---|---|---|
severities | array of string | Amazon's Severities: ERROR, WARNING (NONE is left out). |
enforcementActions | array of string | Amazon's EnforcementActions: LISTING_SUPPRESSED (not buyable), ATTRIBUTE_SUPPRESSED (an attribute value rejected), CATALOG_ITEM_REMOVED (the catalog item is inactive, every offer non-buyable), SEARCH_SUPPRESSED (hidden from search). |
cleared | boolean or null | true when no issue remains. |
{
"text": "SKU SKU-EXAMPLE-01 (B0EXAMPLE01) on US: Listing not buyable (suppressed) · Severities=ERROR · EnforcementActions=LISTING_SUPPRESSED",
"severity": "critical",
"sku": "SKU-EXAMPLE-01",
"asin": "B0EXAMPLE01",
"severities": ["ERROR"],
"enforcementActions": ["LISTING_SUPPRESSED"],
"cleared": false
}Listing status
LISTINGS_ITEM_STATUS_CHANGE — the listing's current status set. A status that is missing is its opposite: no BUYABLE means not buyable, no DISCOVERABLE means not in search results.
| Field | Type | What it is |
|---|---|---|
status | array of string | Amazon's Status: BUYABLE, DISCOVERABLE, DELETED. |
buyable | boolean or null | BUYABLE is in the set. |
discoverable | boolean or null | DISCOVERABLE is in the set. |
deleted | boolean or null | DELETED is in the set. |
{
"text": "SKU SKU-EXAMPLE-02 (B0EXAMPLE02) on US: Buyable · Status=BUYABLE,DISCOVERABLE",
"severity": "recovery",
"sku": "SKU-EXAMPLE-02",
"asin": "B0EXAMPLE02",
"status": ["BUYABLE", "DISCOVERABLE"],
"buyable": true,
"discoverable": true,
"deleted": false
}Brand content
BRANDED_ITEM_CONTENT_CHANGE — which attributes of a catalog item of your brand changed. No SKU. Amazon sends one copy per brand-owner store the webhook takes.
| Field | Type | What it is |
|---|---|---|
brandName | string or null | Amazon's BrandName. |
attributesChanged | array of string | Amazon's AttributesChanged — attribute names as Amazon spells them. |
{
"text": "ASIN B0EXAMPLE04 on US: Changed: item_name, bullet_point · AttributesChanged=item_name,bullet_point · BrandName=MyBrand",
"severity": "info",
"sku": null,
"asin": "B0EXAMPLE04",
"brandName": "MyBrand",
"attributesChanged": ["item_name", "bullet_point"]
}Product type change
ITEM_PRODUCT_TYPE_CHANGE — an ASIN's product type, before and now. What its listings must say may have changed with it. No SKU.
| Field | Type | What it is |
|---|---|---|
previousProductType | string or null | The product type before, as Amazon names it. |
currentProductType | string or null | The product type now. |
Self-fulfilled quantity
LISTINGS_ITEM_MFN_QUANTITY_CHANGE — a SKU's self-fulfilled quantity now. No ASIN, and no marketplace: the quantity is the seller account's.
| Field | Type | What it is |
|---|---|---|
quantity | integer or null | The quantity now; 0 is out of stock. |
fulfillmentChannelCode | string or null | Amazon's FulfillmentChannelCode: DEFAULT is your own fulfillment; another code names a supply source. |
Product type definitions
PRODUCT_TYPE_DEFINITIONS_CHANGE — a new version of a marketplace's product type definitions. No SKU or ASIN. Amazon sends one copy per store the webhook takes.
| Field | Type | What it is |
|---|---|---|
productTypeVersion | string or null | Amazon's ProductTypeVersion. |
newProductTypes | array of string | The product types this version adds. |
Pricing health
PRICING_HEALTH — why your offer cannot be the featured offer, against Amazon's reference prices. No SKU: Amazon sends the ASIN only.
| Field | Type | What it is |
|---|---|---|
issueType | string or null | Amazon's issueType, for example BuyBoxDisqualification. |
yourPrice | money or null | Your landed price: listing plus shipping. |
fulfillmentType | string or null | AFN (FBA) or MFN (FBM). |
competitivePriceThreshold | money or null | Amazon's competitive price threshold. |
referencePrices | object of money | Every reference price Amazon sent, under Amazon's name: competitivePriceThreshold, averageSellingPrice, retailOfferPrice, msrpPrice, … |
{
"text": "ASIN B0EXAMPLE03 on US: Not eligible for the featured offer · issueType=BuyBoxDisqualification · yours 29.99 USD, FBA (fulfillmentType=AFN) · competitivePriceThreshold=24.99 USD · averageSellingPrice=26.50 USD",
"severity": "warning",
"sku": null,
"asin": "B0EXAMPLE03",
"issueType": "BuyBoxDisqualification",
"yourPrice": { "amount": 29.99, "currencyCode": "USD" },
"fulfillmentType": "AFN",
"competitivePriceThreshold": { "amount": 24.99, "currencyCode": "USD" },
"referencePrices": {
"competitivePriceThreshold": { "amount": 24.99, "currencyCode": "USD" },
"averageSellingPrice": { "amount": 26.5, "currencyCode": "USD" }
}
}Competing offers
ANY_OFFER_CHANGED — the Buy Box, your offer and up to five other sellers' offers on an ASIN another seller is on. Amazon gives seller IDs, never names, and no SKU.
| Field | Type | What it is |
|---|---|---|
changeType | string or null | Amazon's OfferChangeType, for example External. |
buyBox | buy box or null | The Buy Box price and who holds it. |
yourOffer | offer or null | Your own offer, when it is among Amazon's offers. |
competitors | array of offer, at most 5 | The other sellers' offers, in Amazon's order. |
numberOfOffers | integer or null | Every offer on the ASIN, all conditions and channels. |
sellersChanged | boolean or null | The sellers on the ASIN differ from the previous message about it. true on the first message. |
buyBoxWinnerChanged | boolean or null | The Buy Box winner differs from the previous message about it. true on the first message. |
{
"text": "ASIN B0EXAMPLE05 on US: 1 other seller: A2EXAMPLEOTHER 19.99 USD FBM, Buy Box, 95% of 120 · you 21.49 USD FBA, 99% of 812 · OfferChangeType=External · BuyBoxPrice=19.99 USD · NumberOfOffers=new Merchant 1,new Amazon 1",
"severity": "warning",
"sku": null,
"asin": "B0EXAMPLE05",
"changeType": "External",
"buyBox": {
"price": { "amount": 19.99, "currencyCode": "USD" },
"sellerId": "A2EXAMPLEOTHER",
"isYours": false
},
"yourOffer": {
"sellerId": "A1EXAMPLESELLER",
"price": { "amount": 21.49, "currencyCode": "USD" },
"shipping": { "amount": 0.0, "currencyCode": "USD" },
"fulfillment": "FBA",
"isBuyBoxWinner": false,
"feedbackRating": 99,
"feedbackCount": 812
},
"competitors": [
{
"sellerId": "A2EXAMPLEOTHER",
"price": { "amount": 19.99, "currencyCode": "USD" },
"shipping": { "amount": 0.0, "currencyCode": "USD" },
"fulfillment": "FBM",
"isBuyBoxWinner": true,
"feedbackRating": 95,
"feedbackCount": 120
}
],
"numberOfOffers": 2,
"sellersChanged": true,
"buyBoxWinnerChanged": true
}Business offers (B2B)
B2B_ANY_OFFER_CHANGED — as Competing offers, over the business (B2B) offers on the ASIN. No changeType, sellersChanged or buyBoxWinnerChanged.
| Field | Type | What it is |
|---|---|---|
buyBox | buy box or null | The B2B Buy Box price and who holds it. |
yourOffer | offer or null | Your own B2B offer, when it is among Amazon's offers. |
competitors | array of offer, at most 5 | The other sellers' B2B offers, in Amazon's order. |
numberOfOffers | integer or null | Every B2B offer on the ASIN. |
Fee promotions
FEE_PROMOTION — a fee promotion Amazon offers you: what it is, when it runs, and its first discount. sku or asin is set when it names exactly one item.
| Field | Type | What it is |
|---|---|---|
promotionType | string or null | Amazon's FeePromotionType. |
description | string or null | Amazon's description of the promotion (FeePromotionTypeDescription). |
effectiveFrom | date-time or null | When it starts. |
effectiveThrough | date-time or null | When it ends. |
feeType | string or null | The fee it discounts, for example ReferralFee. |
discountType | string or null | Amazon's FeeDiscountType, for example PERCENTAGE. |
discountValue | number or null | Amazon's FeeDiscountValue. |
discountAmount | money or null | The discount as an amount, when Amazon gives one. |
Order changes
ORDER_CHANGE — the order's status now and what changed. sku is set when the order holds one SKU.
| Field | Type | What it is |
|---|---|---|
amazonOrderId | string or null | The order. |
changeType | string or null | Amazon's OrderChangeType: BuyerRequestedChange, OrderStatusChange, DeliveryTipChange. |
changeReason | string or null | Amazon's ChangeReason, for example Buyer Requested Cancel. |
orderStatus | string or null | The order's status now, for example Unshipped. |
fulfillmentType | string or null | AFN (FBA) or MFN (FBM). |
buyerRequestedCancel | boolean or null | An item of the order says the buyer asked to cancel. |
sellerSkus | array of string | The order's SKUs. |
Multi-Channel Fulfillment orders
FULFILLMENT_ORDER_STATUS — a Multi-Channel Fulfillment order, its packages and tracking. Amazon names no marketplace. sku is set when the order holds one SKU.
| Field | Type | What it is |
|---|---|---|
orderId | string or null | The fulfillment order. |
eventType | string or null | Amazon's eventType, for example ORDER_STATUS_CHANGED. |
status | string or null | PROCESSING, COMPLETE, COMPLETE_PARTIAL, CANCELLED, UNFULFILLABLE, INVALID. |
sellerSkus | array of string | The order's SKUs. |
packages | array of package, at most 20 | The packages of its shipments, with the carrier's tracking. |
FBA Onsite shipments (Brazil)
FBA_OUTBOUND_SHIPMENT_STATUS — a shipment Amazon created or cancelled for an order. Brazil only.
| Field | Type | What it is |
|---|---|---|
amazonOrderId | string or null | The order. |
amazonShipmentId | string or null | The shipment. |
shipmentStatus | string or null | Amazon's ShipmentStatus: Created or Cancelled. |
External fulfillment shipments
EXTERNAL_FULFILLMENT_SHIPMENT_STATUS_CHANGE — a shipment of your own fulfillment location changed status. Amazon names no marketplace.
| Field | Type | What it is |
|---|---|---|
shipmentId | string or null | The shipment. |
shipmentStatus | string or null | Its status now, for example CREATED or CANCELLED. |
channelName | string or null | Amazon's channelName. |
locationId | string or null | Your fulfillment location. |
FBA inventory
FBA_INVENTORY_AVAILABILITY_CHANGES — a SKU's FBA quantities, summed over every marketplace Amazon lists, and per marketplace. The message's marketplace is the first one listed.
| Field | Type | What it is |
|---|---|---|
fnsku | string or null | Amazon's FNSKU. |
fulfillable | integer or null | Fulfillable units; 0 is out of stock at FBA. |
inbound | integer or null | Working + shipped + receiving. |
reserved | integer or null | Every reserved quantity. |
unfulfillable | integer or null | Unfulfillable units. |
marketplaces | array of marketplace inventory | The same counts per marketplace. |
Hourly inventory
ITEM_INVENTORY_EVENT_CHANGE — one hour's highly available inventory, summed over every ASIN Amazon lists. asin is set when it lists one.
| Field | Type | What it is |
|---|---|---|
startTime | date-time or null | The start of the hour. |
endTime | date-time or null | The end of the hour. |
asinCount | integer or null | How many ASINs Amazon listed. |
highlyAvailableInventory | integer or null | Highly available inventory, in units. |
Hourly sales
ITEM_SALES_EVENT_CHANGE — one hour's ordered units and revenue, summed over every ASIN Amazon lists. asin is set when it lists one.
| Field | Type | What it is |
|---|---|---|
startTime | date-time or null | The start of the hour. |
endTime | date-time or null | The end of the hour. |
asinCount | integer or null | How many ASINs Amazon listed. |
orderedUnits | integer or null | Units ordered. |
orderedRevenue | array of money | Revenue ordered, one entry per currency. |
Hourly page views
DETAIL_PAGE_TRAFFIC_EVENT — one hour's detail page views, summed over every ASIN Amazon lists. asin is set when it lists one.
| Field | Type | What it is |
|---|---|---|
startTime | date-time or null | The start of the hour. |
endTime | date-time or null | The end of the hour. |
asinCount | integer or null | How many ASINs Amazon listed. |
glanceViews | integer or null | Detail page views (Amazon's GlanceViews). |
Transactions
TRANSACTION_UPDATE — a transaction posted to your account.
| Field | Type | What it is |
|---|---|---|
transactionType | string or null | Amazon's TransactionType, for example Shipment. |
postedDate | date-time or null | When it was posted. |
totalAmount | money or null | Its total. |
accountType | string or null | Amazon's AccountType, for example PAYABLE. |
relatedIdentifiers | object of string | Amazon's RelatedIdentifiers, name → value (OrderId, …). |
Account health
ACCOUNT_STATUS_CHANGED — the seller account's status. No item; the message's store is your store in its first marketplace.
| Field | Type | What it is |
|---|---|---|
previousStatus | string or null | NORMAL, AT_RISK or DEACTIVATED. |
currentStatus | string or null | NORMAL, AT_RISK or DEACTIVATED. |
{
"text": "Account at risk · PreviousAccountStatus=NORMAL · CurrentAccountStatus=AT_RISK",
"severity": "warning",
"sku": null,
"asin": null,
"previousStatus": "NORMAL",
"currentStatus": "AT_RISK"
}Report finished
REPORT_PROCESSING_FINISHED — a report request finished. It includes the reports SellerSheet requests to keep your store's data in sync. Amazon names no marketplace.
| Field | Type | What it is |
|---|---|---|
reportId | string or null | The report. |
reportType | string or null | Amazon's reportType. |
processingStatus | string or null | DONE, CANCELLED (Amazon had no data, or the request was cancelled) or FATAL. |
reportDocumentId | string or null | The document to download, on DONE. |
Feed finished
FEED_PROCESSING_FINISHED — a feed finished. Amazon names no marketplace.
| Field | Type | What it is |
|---|---|---|
feedId | string or null | The feed. |
feedType | string or null | Amazon's feedType, for example JSON_LISTINGS_FEED. |
processingStatus | string or null | DONE, CANCELLED or FATAL. |
resultFeedDocumentId | string or null | The processing report's document, on DONE. |
Data Kiosk query finished
DATA_KIOSK_QUERY_PROCESSING_FINISHED — a Data Kiosk query finished. Amazon names no marketplace.
| Field | Type | What it is |
|---|---|---|
queryId | string or null | The query. |
processingStatus | string or null | DONE, CANCELLED or FATAL. |
dataDocumentId | string or null | The data document; null when the query matched no data. |
errorDocumentId | string or null | The error document, on FATAL. |
nextToken | string or null | Set when the result has more pages. |
Objects
money
| Field | Type | Required | What it is |
|---|---|---|---|
amount | number | yes | The amount. |
currencyCode | string or null | no | The currency, for example USD. |
offer
| Field | Type | Required | What it is |
|---|---|---|---|
sellerId | string | yes | Amazon's seller ID. |
price | money or null | no | The listing price. |
shipping | money or null | no | The shipping price. |
fulfillment | FBA · FBM or null | no | Who ships it. |
isBuyBoxWinner | boolean | no (default false) | This offer holds the Buy Box. |
feedbackRating | integer or null | no | Positive feedback, percent. |
feedbackCount | integer or null | no | Number of ratings. |
buy box
| Field | Type | Required | What it is |
|---|---|---|---|
price | money or null | no | The Buy Box landed price. |
sellerId | string or null | no | The seller holding it, when one of the offers Amazon listed does. |
isYours | boolean or null | no | You hold the Buy Box. |
package
| Field | Type | Required | What it is |
|---|---|---|---|
packageId | string or null | no | The package. |
status | string or null | no | Its status, for example DELIVERED. |
carrierCode | string or null | no | The carrier, for example FEDEX. |
trackingNumber | string or null | no | The carrier's tracking number. |
marketplace inventory
| Field | Type | Required | What it is |
|---|---|---|---|
marketplaceId | string or null | no | Amazon's marketplace ID. |
countryCode | string or null | no | The marketplace's country code. |
fulfillable | integer | no (default 0) | Fulfillable units. |
inbound | integer | no (default 0) | Working + shipped + receiving. |
reserved | integer | no (default 0) | Every reserved quantity. |
unfulfillable | integer | no (default 0) | Unfulfillable units. |
Validating
Any JSON Schema draft 2020-12 validator can check a body against webhooks-v1.json. The schema types summary by messageType (one "if messageType is this type, then summary is this shape" rule per notification), so a validator checks each message's summary against its own type.