#Webhooks
GET /webhooks
List the organization's webhook endpoints, newest first by default.
Requires the webhooks:read permission.
Query parameters
limitnumberThe number of records to return.
cursorstringA pagination cursor. Fetch the next page by passing the nextCursor value from the previous response.
sorturl | -url | createdAt | -createdAtThe sort order. Prefix a field with - to sort descending. Defaults to -createdAt.
filterstringA JSON-encoded filter document, for example {"createdAt":{"$gte":"2025-01-01T00:00:00Z"}}. Filterable fields: id, url, isActive, createdAt. See Filtering for the syntax.
curl \
"https://your-store.meisei.app/api/webhooks" \
-H "Authorization: Bearer sk_YOUR_SECRET_KEY"import { client } from "@meisei/api/admin/client"
import { getWebhooks } from "@meisei/api/admin"
client.setConfig({
baseUrl: "https://your-store.meisei.app/api",
headers: { Authorization: "Bearer sk_YOUR_SECRET_KEY" },
})
const { data, error } = await getWebhooks()require "meisei"
meisei = Meisei::Client.new(
secret_key: "sk_YOUR_SECRET_KEY",
base_url: "https://your-store.meisei.app/api",
)
page = meisei.webhooks.listfrom meisei import Client
meisei = Client(
secret_key="sk_YOUR_SECRET_KEY",
base_url="https://your-store.meisei.app/api",
)
page = meisei.webhooks.list(){
"data": [
{
"id": "A4Ws1igz",
"url": "https://example.com",
"isActive": true,
"events": ["..."],
"hasHmacSecret": true,
"createdAt": "2025-01-15T09:30:00Z",
"updatedAt": "2025-01-15T09:30:00Z"
}
],
"nextCursor": "string"
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the webhook.",
"idCodec": "sqid"
},
"url": {
"type": "string",
"format": "uri",
"description": "The URL deliveries are POSTed to."
},
"isActive": {
"type": "boolean",
"description": "Whether the webhook receives deliveries."
},
"events": {
"type": "array",
"items": {
"type": "string",
"enum": [
"customer.created",
"customer.updated",
"customer.deleted",
"order.created",
"order.updated",
"order.deleted",
"product.created",
"product.updated",
"product.deleted",
"productVariant.updated",
"review.created",
"review.updated",
"review.deleted",
"review.published",
"reviewQuestion.created",
"reviewQuestion.updated",
"reviewQuestion.deleted",
"site.created",
"site.updated",
"site.deleted",
"emailTemplate.created",
"emailTemplate.updated",
"emailTemplate.deleted",
"survey.deleted",
"reviewRequest.eligible",
"reviewRequest.canceled",
"loyaltyProgram.created",
"loyaltyProgram.updated",
"loyaltyProgram.deleted",
"loyaltyRule.created",
"loyaltyRule.updated",
"loyaltyRule.deleted",
"loyaltyTier.created",
"loyaltyTier.updated",
"loyaltyTier.deleted",
"loyaltyMembership.created",
"loyaltyMembership.updated",
"loyaltyMembership.deleted",
"loyaltyMembership.tierChanged",
"loyaltyMembership.pointsEarned",
"loyaltyTransaction.created",
"loyaltyReward.issued",
"loyaltyReward.claimed",
"loyaltyReward.redeemed",
"loyaltyReward.revoked",
"loyaltyReward.expired",
"loyaltyReward.expiringSoon",
"loyaltyPoints.expiringSoon",
"wishlist.created",
"wishlist.updated",
"wishlist.deleted",
"webhook.created",
"webhook.updated",
"webhook.deleted",
"metadataDefinition.created",
"metadataDefinition.updated",
"metadataDefinition.deleted",
"schedule.hourly",
"schedule.daily"
],
"description": "A webhook event name, in `resource.action` form."
},
"description": "The events this webhook subscribes to."
},
"hasHmacSecret": {
"type": "boolean",
"description": "Whether a signing secret is set. The secret itself is never returned. When set, deliveries carry an HMAC signature you can verify."
},
"createdAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the webhook was created."
},
"updatedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the webhook was last changed."
}
},
"required": ["id", "url", "isActive", "events", "hasHmacSecret", "createdAt", "updatedAt"],
"additionalProperties": false
},
"description": "The page of records, in the requested sort order."
},
"nextCursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Pass this back as `cursor` to fetch the next page. Null once the last page has been returned."
}
},
"required": ["data", "nextCursor"],
"additionalProperties": false
}POST /webhooks
Register a webhook endpoint. It starts receiving deliveries for the events you subscribe to as soon as it is active. Triggers the webhook.created webhook.
Requires the webhooks:write permission.
Body parameters
urlstring (uri)requiredThe URL deliveries should be POSTed to. It has to be a public https address: private networks, IP addresses and redirects are not supported.
eventscustomer.created | customer.updated | customer.deleted | order.created | order.updated | order.deleted | product.created | product.updated | product.deleted | productVariant.updated | review.created | review.updated | review.deleted | review.published | reviewQuestion.created | reviewQuestion.updated | reviewQuestion.deleted | site.created | site.updated | site.deleted | emailTemplate.created | emailTemplate.updated | emailTemplate.deleted | survey.deleted | reviewRequest.eligible | reviewRequest.canceled | loyaltyProgram.created | loyaltyProgram.updated | loyaltyProgram.deleted | loyaltyRule.created | loyaltyRule.updated | loyaltyRule.deleted | loyaltyTier.created | loyaltyTier.updated | loyaltyTier.deleted | loyaltyMembership.created | loyaltyMembership.updated | loyaltyMembership.deleted | loyaltyMembership.tierChanged | loyaltyMembership.pointsEarned | loyaltyTransaction.created | loyaltyReward.issued | loyaltyReward.claimed | loyaltyReward.redeemed | loyaltyReward.revoked | loyaltyReward.expired | loyaltyReward.expiringSoon | loyaltyPoints.expiringSoon | wishlist.created | wishlist.updated | wishlist.deleted | webhook.created | webhook.updated | webhook.deleted | metadataDefinition.created | metadataDefinition.updated | metadataDefinition.deleted | schedule.hourly | schedule.daily[]requiredThe events to subscribe to. Call GET /webhook-events for the full list of names. There are no wishlist item events: item additions, removals, and edits fire wishlist.updated for the affected list.
isActivebooleanWhether the webhook is live. Defaults to true.
hmacSecretstring | nullA shared secret used to sign deliveries so you can verify they came from Meisei. Never returned once set.
curl \
-X POST \
"https://your-store.meisei.app/api/webhooks" \
-H "Authorization: Bearer sk_YOUR_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"events": [
"customer.created"
],
"isActive": true,
"hmacSecret": "string"
}'import { client } from "@meisei/api/admin/client"
import { postWebhooks } from "@meisei/api/admin"
client.setConfig({
baseUrl: "https://your-store.meisei.app/api",
headers: { Authorization: "Bearer sk_YOUR_SECRET_KEY" },
})
const { data, error } = await postWebhooks({
body: {
url: "https://example.com",
events: ["customer.created"],
isActive: true,
hmacSecret: "string",
},
})require "meisei"
meisei = Meisei::Client.new(
secret_key: "sk_YOUR_SECRET_KEY",
base_url: "https://your-store.meisei.app/api",
)
result = meisei.webhooks.create(
url: "https://example.com",
events: ["customer.created"],
is_active: true,
hmac_secret: "string",
)from meisei import Client
meisei = Client(
secret_key="sk_YOUR_SECRET_KEY",
base_url="https://your-store.meisei.app/api",
)
result = meisei.webhooks.create(
url="https://example.com",
events=["customer.created"],
is_active=True,
hmac_secret="string",
){
"id": "A4Ws1igz",
"url": "https://example.com",
"isActive": true,
"events": ["customer.created"],
"hasHmacSecret": true,
"createdAt": "2025-01-15T09:30:00Z",
"updatedAt": "2025-01-15T09:30:00Z"
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the webhook.",
"idCodec": "sqid"
},
"url": {
"type": "string",
"format": "uri",
"description": "The URL deliveries are POSTed to."
},
"isActive": {
"type": "boolean",
"description": "Whether the webhook receives deliveries."
},
"events": {
"type": "array",
"items": {
"type": "string",
"enum": [
"customer.created",
"customer.updated",
"customer.deleted",
"order.created",
"order.updated",
"order.deleted",
"product.created",
"product.updated",
"product.deleted",
"productVariant.updated",
"review.created",
"review.updated",
"review.deleted",
"review.published",
"reviewQuestion.created",
"reviewQuestion.updated",
"reviewQuestion.deleted",
"site.created",
"site.updated",
"site.deleted",
"emailTemplate.created",
"emailTemplate.updated",
"emailTemplate.deleted",
"survey.deleted",
"reviewRequest.eligible",
"reviewRequest.canceled",
"loyaltyProgram.created",
"loyaltyProgram.updated",
"loyaltyProgram.deleted",
"loyaltyRule.created",
"loyaltyRule.updated",
"loyaltyRule.deleted",
"loyaltyTier.created",
"loyaltyTier.updated",
"loyaltyTier.deleted",
"loyaltyMembership.created",
"loyaltyMembership.updated",
"loyaltyMembership.deleted",
"loyaltyMembership.tierChanged",
"loyaltyMembership.pointsEarned",
"loyaltyTransaction.created",
"loyaltyReward.issued",
"loyaltyReward.claimed",
"loyaltyReward.redeemed",
"loyaltyReward.revoked",
"loyaltyReward.expired",
"loyaltyReward.expiringSoon",
"loyaltyPoints.expiringSoon",
"wishlist.created",
"wishlist.updated",
"wishlist.deleted",
"webhook.created",
"webhook.updated",
"webhook.deleted",
"metadataDefinition.created",
"metadataDefinition.updated",
"metadataDefinition.deleted",
"schedule.hourly",
"schedule.daily"
],
"description": "A webhook event name, in `resource.action` form."
},
"description": "The events this webhook subscribes to."
},
"hasHmacSecret": {
"type": "boolean",
"description": "Whether a signing secret is set. The secret itself is never returned. When set, deliveries carry an HMAC signature you can verify."
},
"createdAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the webhook was created."
},
"updatedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the webhook was last changed."
}
},
"required": ["id", "url", "isActive", "events", "hasHmacSecret", "createdAt", "updatedAt"],
"additionalProperties": false,
"description": "The new webhook."
}GET /webhooks/{id}
Get a single webhook by ID.
Requires the webhooks:read permission.
Path parameters
idstringrequiredThe ID of the webhook.
curl \
"https://your-store.meisei.app/api/webhooks/A4Ws1igz" \
-H "Authorization: Bearer sk_YOUR_SECRET_KEY"import { client } from "@meisei/api/admin/client"
import { getWebhooksById } from "@meisei/api/admin"
client.setConfig({
baseUrl: "https://your-store.meisei.app/api",
headers: { Authorization: "Bearer sk_YOUR_SECRET_KEY" },
})
const { data, error } = await getWebhooksById({
path: { id: "A4Ws1igz" },
})require "meisei"
meisei = Meisei::Client.new(
secret_key: "sk_YOUR_SECRET_KEY",
base_url: "https://your-store.meisei.app/api",
)
result = meisei.webhooks.retrieve("A4Ws1igz")from meisei import Client
meisei = Client(
secret_key="sk_YOUR_SECRET_KEY",
base_url="https://your-store.meisei.app/api",
)
result = meisei.webhooks.retrieve("A4Ws1igz"){
"id": "A4Ws1igz",
"url": "https://example.com",
"isActive": true,
"events": ["customer.created"],
"hasHmacSecret": true,
"createdAt": "2025-01-15T09:30:00Z",
"updatedAt": "2025-01-15T09:30:00Z"
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the webhook.",
"idCodec": "sqid"
},
"url": {
"type": "string",
"format": "uri",
"description": "The URL deliveries are POSTed to."
},
"isActive": {
"type": "boolean",
"description": "Whether the webhook receives deliveries."
},
"events": {
"type": "array",
"items": {
"type": "string",
"enum": [
"customer.created",
"customer.updated",
"customer.deleted",
"order.created",
"order.updated",
"order.deleted",
"product.created",
"product.updated",
"product.deleted",
"productVariant.updated",
"review.created",
"review.updated",
"review.deleted",
"review.published",
"reviewQuestion.created",
"reviewQuestion.updated",
"reviewQuestion.deleted",
"site.created",
"site.updated",
"site.deleted",
"emailTemplate.created",
"emailTemplate.updated",
"emailTemplate.deleted",
"survey.deleted",
"reviewRequest.eligible",
"reviewRequest.canceled",
"loyaltyProgram.created",
"loyaltyProgram.updated",
"loyaltyProgram.deleted",
"loyaltyRule.created",
"loyaltyRule.updated",
"loyaltyRule.deleted",
"loyaltyTier.created",
"loyaltyTier.updated",
"loyaltyTier.deleted",
"loyaltyMembership.created",
"loyaltyMembership.updated",
"loyaltyMembership.deleted",
"loyaltyMembership.tierChanged",
"loyaltyMembership.pointsEarned",
"loyaltyTransaction.created",
"loyaltyReward.issued",
"loyaltyReward.claimed",
"loyaltyReward.redeemed",
"loyaltyReward.revoked",
"loyaltyReward.expired",
"loyaltyReward.expiringSoon",
"loyaltyPoints.expiringSoon",
"wishlist.created",
"wishlist.updated",
"wishlist.deleted",
"webhook.created",
"webhook.updated",
"webhook.deleted",
"metadataDefinition.created",
"metadataDefinition.updated",
"metadataDefinition.deleted",
"schedule.hourly",
"schedule.daily"
],
"description": "A webhook event name, in `resource.action` form."
},
"description": "The events this webhook subscribes to."
},
"hasHmacSecret": {
"type": "boolean",
"description": "Whether a signing secret is set. The secret itself is never returned. When set, deliveries carry an HMAC signature you can verify."
},
"createdAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the webhook was created."
},
"updatedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the webhook was last changed."
}
},
"required": ["id", "url", "isActive", "events", "hasHmacSecret", "createdAt", "updatedAt"],
"additionalProperties": false,
"description": "The requested webhook."
}PUT /webhooks/{id}
Update a webhook's URL, subscriptions, signing secret or active flag. Triggers the webhook.updated webhook.
Requires the webhooks:write permission.
Path parameters
idstringrequiredThe ID of the webhook to update.
Body parameters
urlstring (uri)The URL deliveries should be POSTed to. It has to be a public https address: private networks, IP addresses and redirects are not supported.
eventscustomer.created | customer.updated | customer.deleted | order.created | order.updated | order.deleted | product.created | product.updated | product.deleted | productVariant.updated | review.created | review.updated | review.deleted | review.published | reviewQuestion.created | reviewQuestion.updated | reviewQuestion.deleted | site.created | site.updated | site.deleted | emailTemplate.created | emailTemplate.updated | emailTemplate.deleted | survey.deleted | reviewRequest.eligible | reviewRequest.canceled | loyaltyProgram.created | loyaltyProgram.updated | loyaltyProgram.deleted | loyaltyRule.created | loyaltyRule.updated | loyaltyRule.deleted | loyaltyTier.created | loyaltyTier.updated | loyaltyTier.deleted | loyaltyMembership.created | loyaltyMembership.updated | loyaltyMembership.deleted | loyaltyMembership.tierChanged | loyaltyMembership.pointsEarned | loyaltyTransaction.created | loyaltyReward.issued | loyaltyReward.claimed | loyaltyReward.redeemed | loyaltyReward.revoked | loyaltyReward.expired | loyaltyReward.expiringSoon | loyaltyPoints.expiringSoon | wishlist.created | wishlist.updated | wishlist.deleted | webhook.created | webhook.updated | webhook.deleted | metadataDefinition.created | metadataDefinition.updated | metadataDefinition.deleted | schedule.hourly | schedule.daily[]Replaces the subscription list wholesale. Omit to leave it alone.
isActivebooleanWhether the webhook is live.
hmacSecretstring | nullA new signing secret, or null to stop signing deliveries.
curl \
-X PUT \
"https://your-store.meisei.app/api/webhooks/A4Ws1igz" \
-H "Authorization: Bearer sk_YOUR_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"events": [
"customer.created"
],
"isActive": true,
"hmacSecret": "string"
}'import { client } from "@meisei/api/admin/client"
import { putWebhooksById } from "@meisei/api/admin"
client.setConfig({
baseUrl: "https://your-store.meisei.app/api",
headers: { Authorization: "Bearer sk_YOUR_SECRET_KEY" },
})
const { data, error } = await putWebhooksById({
path: { id: "A4Ws1igz" },
body: {
url: "https://example.com",
events: ["customer.created"],
isActive: true,
hmacSecret: "string",
},
})require "meisei"
meisei = Meisei::Client.new(
secret_key: "sk_YOUR_SECRET_KEY",
base_url: "https://your-store.meisei.app/api",
)
result = meisei.webhooks.update(
"A4Ws1igz",
url: "https://example.com",
events: ["customer.created"],
is_active: true,
hmac_secret: "string",
)from meisei import Client
meisei = Client(
secret_key="sk_YOUR_SECRET_KEY",
base_url="https://your-store.meisei.app/api",
)
result = meisei.webhooks.update(
"A4Ws1igz",
url="https://example.com",
events=["customer.created"],
is_active=True,
hmac_secret="string",
){
"id": "A4Ws1igz",
"url": "https://example.com",
"isActive": true,
"events": ["customer.created"],
"hasHmacSecret": true,
"createdAt": "2025-01-15T09:30:00Z",
"updatedAt": "2025-01-15T09:30:00Z"
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the webhook.",
"idCodec": "sqid"
},
"url": {
"type": "string",
"format": "uri",
"description": "The URL deliveries are POSTed to."
},
"isActive": {
"type": "boolean",
"description": "Whether the webhook receives deliveries."
},
"events": {
"type": "array",
"items": {
"type": "string",
"enum": [
"customer.created",
"customer.updated",
"customer.deleted",
"order.created",
"order.updated",
"order.deleted",
"product.created",
"product.updated",
"product.deleted",
"productVariant.updated",
"review.created",
"review.updated",
"review.deleted",
"review.published",
"reviewQuestion.created",
"reviewQuestion.updated",
"reviewQuestion.deleted",
"site.created",
"site.updated",
"site.deleted",
"emailTemplate.created",
"emailTemplate.updated",
"emailTemplate.deleted",
"survey.deleted",
"reviewRequest.eligible",
"reviewRequest.canceled",
"loyaltyProgram.created",
"loyaltyProgram.updated",
"loyaltyProgram.deleted",
"loyaltyRule.created",
"loyaltyRule.updated",
"loyaltyRule.deleted",
"loyaltyTier.created",
"loyaltyTier.updated",
"loyaltyTier.deleted",
"loyaltyMembership.created",
"loyaltyMembership.updated",
"loyaltyMembership.deleted",
"loyaltyMembership.tierChanged",
"loyaltyMembership.pointsEarned",
"loyaltyTransaction.created",
"loyaltyReward.issued",
"loyaltyReward.claimed",
"loyaltyReward.redeemed",
"loyaltyReward.revoked",
"loyaltyReward.expired",
"loyaltyReward.expiringSoon",
"loyaltyPoints.expiringSoon",
"wishlist.created",
"wishlist.updated",
"wishlist.deleted",
"webhook.created",
"webhook.updated",
"webhook.deleted",
"metadataDefinition.created",
"metadataDefinition.updated",
"metadataDefinition.deleted",
"schedule.hourly",
"schedule.daily"
],
"description": "A webhook event name, in `resource.action` form."
},
"description": "The events this webhook subscribes to."
},
"hasHmacSecret": {
"type": "boolean",
"description": "Whether a signing secret is set. The secret itself is never returned. When set, deliveries carry an HMAC signature you can verify."
},
"createdAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the webhook was created."
},
"updatedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the webhook was last changed."
}
},
"required": ["id", "url", "isActive", "events", "hasHmacSecret", "createdAt", "updatedAt"],
"additionalProperties": false,
"description": "The updated webhook."
}DELETE /webhooks/{id}
Delete a webhook endpoint, stopping all deliveries to it. To pause it instead, set isActive to false. Triggers the webhook.deleted webhook.
Requires the webhooks:write permission.
Path parameters
idstringrequiredThe ID of the webhook to delete.
curl \
-X DELETE \
"https://your-store.meisei.app/api/webhooks/A4Ws1igz" \
-H "Authorization: Bearer sk_YOUR_SECRET_KEY"import { client } from "@meisei/api/admin/client"
import { deleteWebhooksById } from "@meisei/api/admin"
client.setConfig({
baseUrl: "https://your-store.meisei.app/api",
headers: { Authorization: "Bearer sk_YOUR_SECRET_KEY" },
})
const { data, error } = await deleteWebhooksById({
path: { id: "A4Ws1igz" },
})require "meisei"
meisei = Meisei::Client.new(
secret_key: "sk_YOUR_SECRET_KEY",
base_url: "https://your-store.meisei.app/api",
)
result = meisei.webhooks.delete("A4Ws1igz")from meisei import Client
meisei = Client(
secret_key="sk_YOUR_SECRET_KEY",
base_url="https://your-store.meisei.app/api",
)
result = meisei.webhooks.delete("A4Ws1igz"){
"id": "A4Ws1igz",
"url": "https://example.com",
"isActive": true,
"events": ["customer.created"],
"hasHmacSecret": true,
"createdAt": "2025-01-15T09:30:00Z",
"updatedAt": "2025-01-15T09:30:00Z"
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the webhook.",
"idCodec": "sqid"
},
"url": {
"type": "string",
"format": "uri",
"description": "The URL deliveries are POSTed to."
},
"isActive": {
"type": "boolean",
"description": "Whether the webhook receives deliveries."
},
"events": {
"type": "array",
"items": {
"type": "string",
"enum": [
"customer.created",
"customer.updated",
"customer.deleted",
"order.created",
"order.updated",
"order.deleted",
"product.created",
"product.updated",
"product.deleted",
"productVariant.updated",
"review.created",
"review.updated",
"review.deleted",
"review.published",
"reviewQuestion.created",
"reviewQuestion.updated",
"reviewQuestion.deleted",
"site.created",
"site.updated",
"site.deleted",
"emailTemplate.created",
"emailTemplate.updated",
"emailTemplate.deleted",
"survey.deleted",
"reviewRequest.eligible",
"reviewRequest.canceled",
"loyaltyProgram.created",
"loyaltyProgram.updated",
"loyaltyProgram.deleted",
"loyaltyRule.created",
"loyaltyRule.updated",
"loyaltyRule.deleted",
"loyaltyTier.created",
"loyaltyTier.updated",
"loyaltyTier.deleted",
"loyaltyMembership.created",
"loyaltyMembership.updated",
"loyaltyMembership.deleted",
"loyaltyMembership.tierChanged",
"loyaltyMembership.pointsEarned",
"loyaltyTransaction.created",
"loyaltyReward.issued",
"loyaltyReward.claimed",
"loyaltyReward.redeemed",
"loyaltyReward.revoked",
"loyaltyReward.expired",
"loyaltyReward.expiringSoon",
"loyaltyPoints.expiringSoon",
"wishlist.created",
"wishlist.updated",
"wishlist.deleted",
"webhook.created",
"webhook.updated",
"webhook.deleted",
"metadataDefinition.created",
"metadataDefinition.updated",
"metadataDefinition.deleted",
"schedule.hourly",
"schedule.daily"
],
"description": "A webhook event name, in `resource.action` form."
},
"description": "The events this webhook subscribes to."
},
"hasHmacSecret": {
"type": "boolean",
"description": "Whether a signing secret is set. The secret itself is never returned. When set, deliveries carry an HMAC signature you can verify."
},
"createdAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the webhook was created."
},
"updatedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the webhook was last changed."
}
},
"required": ["id", "url", "isActive", "events", "hasHmacSecret", "createdAt", "updatedAt"],
"additionalProperties": false,
"description": "The deleted webhook."
}GET /webhooks/{id}/events
List a webhook's recent deliveries, newest first, with their payloads, attempts and any errors. Use this to debug an endpoint that is not receiving what you expect, or pass status=failed to find the deliveries that ran out of retries.
Requires the webhooks:read permission.
Path parameters
idstringrequiredThe ID of the webhook.
Query parameters
limitnumberThe number of deliveries to return.
statuspending | retrying | succeeded | failedOnly return deliveries in this state.
curl \
"https://your-store.meisei.app/api/webhooks/A4Ws1igz/events" \
-H "Authorization: Bearer sk_YOUR_SECRET_KEY"import { client } from "@meisei/api/admin/client"
import { getWebhooksByIdEvents } from "@meisei/api/admin"
client.setConfig({
baseUrl: "https://your-store.meisei.app/api",
headers: { Authorization: "Bearer sk_YOUR_SECRET_KEY" },
})
const { data, error } = await getWebhooksByIdEvents({
path: { id: "A4Ws1igz" },
})require "meisei"
meisei = Meisei::Client.new(
secret_key: "sk_YOUR_SECRET_KEY",
base_url: "https://your-store.meisei.app/api",
)
page = meisei.webhooks.events.list("A4Ws1igz")from meisei import Client
meisei = Client(
secret_key="sk_YOUR_SECRET_KEY",
base_url="https://your-store.meisei.app/api",
)
page = meisei.webhooks.events.list("A4Ws1igz"){
"data": [
{
"id": "A4Ws1igz",
"webhookId": "A4Ws1igz",
"eventId": "A4Ws1igz",
"eventName": "customer.created",
"idempotencyKey": "string",
"url": "https://example.com",
"payload": "...",
"status": "pending",
"error": "string",
"attempts": 0,
"nextAttemptAt": "2025-01-15T09:30:00Z",
"responseStatus": 0,
"durationMs": 0,
"createdAt": "2025-01-15T09:30:00Z",
"updatedAt": "2025-01-15T09:30:00Z"
}
],
"nextCursor": "string"
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the delivery.",
"idCodec": "sqid"
},
"webhookId": {
"type": "string",
"description": "The webhook the delivery belongs to.",
"idCodec": "sqid"
},
"eventId": {
"type": "string",
"description": "The event that was delivered, as `GET /events` lists it. The delivered body carries it as `id`.",
"idCodec": "sqid"
},
"eventName": {
"type": "string",
"enum": [
"customer.created",
"customer.updated",
"customer.deleted",
"order.created",
"order.updated",
"order.deleted",
"product.created",
"product.updated",
"product.deleted",
"productVariant.updated",
"review.created",
"review.updated",
"review.deleted",
"review.published",
"reviewQuestion.created",
"reviewQuestion.updated",
"reviewQuestion.deleted",
"site.created",
"site.updated",
"site.deleted",
"emailTemplate.created",
"emailTemplate.updated",
"emailTemplate.deleted",
"survey.deleted",
"reviewRequest.eligible",
"reviewRequest.canceled",
"loyaltyProgram.created",
"loyaltyProgram.updated",
"loyaltyProgram.deleted",
"loyaltyRule.created",
"loyaltyRule.updated",
"loyaltyRule.deleted",
"loyaltyTier.created",
"loyaltyTier.updated",
"loyaltyTier.deleted",
"loyaltyMembership.created",
"loyaltyMembership.updated",
"loyaltyMembership.deleted",
"loyaltyMembership.tierChanged",
"loyaltyMembership.pointsEarned",
"loyaltyTransaction.created",
"loyaltyReward.issued",
"loyaltyReward.claimed",
"loyaltyReward.redeemed",
"loyaltyReward.revoked",
"loyaltyReward.expired",
"loyaltyReward.expiringSoon",
"loyaltyPoints.expiringSoon",
"wishlist.created",
"wishlist.updated",
"wishlist.deleted",
"webhook.created",
"webhook.updated",
"webhook.deleted",
"metadataDefinition.created",
"metadataDefinition.updated",
"metadataDefinition.deleted",
"schedule.hourly",
"schedule.daily"
],
"description": "A webhook event name, in `resource.action` form."
},
"idempotencyKey": {
"type": "string",
"description": "Stable key for the event. Use it to ignore duplicates on your end."
},
"url": {
"type": "string",
"format": "uri",
"description": "The URL the delivery was sent to."
},
"payload": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "The JSON body that was sent."
},
"status": {
"type": "string",
"enum": ["pending", "retrying", "succeeded", "failed"],
"description": "How the delivery stands: `pending` while an attempt is under way, `retrying` after a failed attempt with another one scheduled, `succeeded` once your endpoint answered with a 2xx status, and `failed` once every attempt was used up."
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Why the latest attempt failed, if it did."
},
"attempts": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "How many times the delivery has been attempted. A failed attempt is retried after 1 minute, 5 minutes, 30 minutes, 2 hours and 8 hours, so there are at most 6."
},
"nextAttemptAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
{
"type": "null"
}
],
"description": "When the next attempt is scheduled, while the delivery is `retrying`."
},
"responseStatus": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "The HTTP status your endpoint answered the latest attempt with, if it answered."
},
"durationMs": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "How long the latest attempt took, in milliseconds."
},
"createdAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the delivery was queued."
},
"updatedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the delivery was last attempted."
}
},
"required": [
"id",
"webhookId",
"eventId",
"eventName",
"idempotencyKey",
"url",
"payload",
"status",
"error",
"attempts",
"nextAttemptAt",
"responseStatus",
"durationMs",
"createdAt",
"updatedAt"
],
"additionalProperties": false
},
"description": "The page of records, in the requested sort order."
},
"nextCursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Pass this back as `cursor` to fetch the next page. Null once the last page has been returned."
}
},
"required": ["data", "nextCursor"],
"additionalProperties": false
}POST /webhooks/{id}/events/{eventId}/redeliver
Send a delivery again, now. It is one attempt with the original payload, sent to the webhook's current URL, and it is not retried on its own if it fails. Use it after fixing an endpoint that missed deliveries.
Requires the webhooks:write permission.
Path parameters
idstringrequiredThe ID of the webhook.
eventIdstringrequiredThe ID of the delivery to send again.
curl \
-X POST \
"https://your-store.meisei.app/api/webhooks/A4Ws1igz/events/A4Ws1igz/redeliver" \
-H "Authorization: Bearer sk_YOUR_SECRET_KEY"import { client } from "@meisei/api/admin/client"
import { postWebhooksByIdEventsByEventIdRedeliver } from "@meisei/api/admin"
client.setConfig({
baseUrl: "https://your-store.meisei.app/api",
headers: { Authorization: "Bearer sk_YOUR_SECRET_KEY" },
})
const { data, error } = await postWebhooksByIdEventsByEventIdRedeliver({
path: { id: "A4Ws1igz", eventId: "A4Ws1igz" },
})require "meisei"
meisei = Meisei::Client.new(
secret_key: "sk_YOUR_SECRET_KEY",
base_url: "https://your-store.meisei.app/api",
)
result = meisei.webhooks.events.redeliver("A4Ws1igz", "A4Ws1igz")from meisei import Client
meisei = Client(
secret_key="sk_YOUR_SECRET_KEY",
base_url="https://your-store.meisei.app/api",
)
result = meisei.webhooks.events.redeliver("A4Ws1igz", "A4Ws1igz"){
"id": "A4Ws1igz",
"webhookId": "A4Ws1igz",
"eventId": "A4Ws1igz",
"eventName": "customer.created",
"idempotencyKey": "string",
"url": "https://example.com",
"payload": "...",
"status": "pending",
"error": "string",
"attempts": 0,
"nextAttemptAt": "2025-01-15T09:30:00Z",
"responseStatus": 0,
"durationMs": 0,
"createdAt": "2025-01-15T09:30:00Z",
"updatedAt": "2025-01-15T09:30:00Z"
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the delivery.",
"idCodec": "sqid"
},
"webhookId": {
"type": "string",
"description": "The webhook the delivery belongs to.",
"idCodec": "sqid"
},
"eventId": {
"type": "string",
"description": "The event that was delivered, as `GET /events` lists it. The delivered body carries it as `id`.",
"idCodec": "sqid"
},
"eventName": {
"type": "string",
"enum": [
"customer.created",
"customer.updated",
"customer.deleted",
"order.created",
"order.updated",
"order.deleted",
"product.created",
"product.updated",
"product.deleted",
"productVariant.updated",
"review.created",
"review.updated",
"review.deleted",
"review.published",
"reviewQuestion.created",
"reviewQuestion.updated",
"reviewQuestion.deleted",
"site.created",
"site.updated",
"site.deleted",
"emailTemplate.created",
"emailTemplate.updated",
"emailTemplate.deleted",
"survey.deleted",
"reviewRequest.eligible",
"reviewRequest.canceled",
"loyaltyProgram.created",
"loyaltyProgram.updated",
"loyaltyProgram.deleted",
"loyaltyRule.created",
"loyaltyRule.updated",
"loyaltyRule.deleted",
"loyaltyTier.created",
"loyaltyTier.updated",
"loyaltyTier.deleted",
"loyaltyMembership.created",
"loyaltyMembership.updated",
"loyaltyMembership.deleted",
"loyaltyMembership.tierChanged",
"loyaltyMembership.pointsEarned",
"loyaltyTransaction.created",
"loyaltyReward.issued",
"loyaltyReward.claimed",
"loyaltyReward.redeemed",
"loyaltyReward.revoked",
"loyaltyReward.expired",
"loyaltyReward.expiringSoon",
"loyaltyPoints.expiringSoon",
"wishlist.created",
"wishlist.updated",
"wishlist.deleted",
"webhook.created",
"webhook.updated",
"webhook.deleted",
"metadataDefinition.created",
"metadataDefinition.updated",
"metadataDefinition.deleted",
"schedule.hourly",
"schedule.daily"
],
"description": "A webhook event name, in `resource.action` form."
},
"idempotencyKey": {
"type": "string",
"description": "Stable key for the event. Use it to ignore duplicates on your end."
},
"url": {
"type": "string",
"format": "uri",
"description": "The URL the delivery was sent to."
},
"payload": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "The JSON body that was sent."
},
"status": {
"type": "string",
"enum": ["pending", "retrying", "succeeded", "failed"],
"description": "How the delivery stands: `pending` while an attempt is under way, `retrying` after a failed attempt with another one scheduled, `succeeded` once your endpoint answered with a 2xx status, and `failed` once every attempt was used up."
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Why the latest attempt failed, if it did."
},
"attempts": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "How many times the delivery has been attempted. A failed attempt is retried after 1 minute, 5 minutes, 30 minutes, 2 hours and 8 hours, so there are at most 6."
},
"nextAttemptAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
{
"type": "null"
}
],
"description": "When the next attempt is scheduled, while the delivery is `retrying`."
},
"responseStatus": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "The HTTP status your endpoint answered the latest attempt with, if it answered."
},
"durationMs": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "How long the latest attempt took, in milliseconds."
},
"createdAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the delivery was queued."
},
"updatedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the delivery was last attempted."
}
},
"required": [
"id",
"webhookId",
"eventId",
"eventName",
"idempotencyKey",
"url",
"payload",
"status",
"error",
"attempts",
"nextAttemptAt",
"responseStatus",
"durationMs",
"createdAt",
"updatedAt"
],
"additionalProperties": false,
"description": "The delivery, marked `pending` until it is sent."
}