Webhooks API
Signed webhook endpoints, their deliveries, replays and test events.
10 operations. Guide: Receive events by webhook. Requests and responses are JSON with snake_case fields; authenticate with Authorization: Bearer <api key>. The examples assume a client built as in SDKs and the command line.
Create a webhook endpoint
POST /v1/webhooks
Deliveries are signed svix-style (svix-id, svix-timestamp, svix-signature). Private, loopback and link-local URLs are refused. Test keys create test endpoints, which receive the events test keys simulate.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
url | string | yes | An https URL to a public host. Private, loopback, link-local and metadata addresses are refused, also after DNS resolution and redirects. At most 2048 characters. |
description | string | no | At most 200 characters. |
mode | one of "live", "test" | no | Default "live". |
events | array of one of "email.sent", "email.scheduled", "email.delivered", "email.delivery_delayed", "email.complained", "email.bounced", "email.opened", "email.clicked", "email.received", "email.failed", "email.suppressed", "email.canceled", … | no |
Response
201 Created; `secret` is returned once: Webhook.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "webhook" | yes | |
environment_id | string | yes | A UUID. |
mode | one of "live", "test" | yes | |
url | string | yes | |
description | string or null | yes | |
events | array of one of "email.sent", "email.scheduled", "email.delivered", "email.delivery_delayed", "email.complained", "email.bounced", "email.opened", "email.clicked", "email.received", "email.failed", "email.suppressed", "email.canceled", … or null | yes | |
status | one of "enabled", "disabled", "auto_disabled" | yes | |
secret | string | no | |
stats | object | yes | |
stats. | integer | yes | |
stats. | integer | yes | |
stats. | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
stats. | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
created_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
updated_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X POST https://api.minket.com/v1/webhooks \
-H "Authorization: Bearer $MINKET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://hooks.acme.example/minket"}'const result = await minket.webhooks.create({
url: "https://hooks.acme.example/minket"
});minket api createWebhook --body '{"url":"https://hooks.acme.example/minket"}'from minket.api.webhooks import create_webhook
from minket.models import CreateWebhookBody
result = create_webhook.sync(client=client, body=CreateWebhookBody.from_dict({"url":"https://hooks.acme.example/minket"}))var body minket.CreateWebhookJSONRequestBody
res, err := client.CreateWebhookWithResponse(ctx, body)List webhook endpoints
GET /v1/webhooks
Endpoints of the key's environment; test keys see test endpoints only.
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "list" | yes | |
data | array of Webhook | yes | |
data[]. | string | yes | A UUID. |
data[]. | "webhook" | yes | |
data[]. | string | yes | A UUID. |
data[]. | one of "live", "test" | yes | |
data[]. | string | yes | |
data[]. | string or null | yes | |
data[]. | array of one of "email.sent", "email.scheduled", "email.delivered", "email.delivery_delayed", "email.complained", "email.bounced", "email.opened", "email.clicked", "email.received", "email.failed", "email.suppressed", "email.canceled", … or null | yes | |
data[]. | one of "enabled", "disabled", "auto_disabled" | yes | |
data[]. | string | no | |
data[]. | object | yes | |
data[]. | integer | yes | |
data[]. | integer | yes | |
data[]. | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
data[]. | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
data[]. | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
data[]. | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
has_more | boolean | yes |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl https://api.minket.com/v1/webhooks \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.webhooks.list();minket api listWebhooksfrom minket.api.webhooks import list_webhooks
result = list_webhooks.sync(client=client)res, err := client.ListWebhooksWithResponse(ctx)Get a webhook endpoint
GET /v1/webhooks/{id}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
Response
200 Success: Webhook.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "webhook" | yes | |
environment_id | string | yes | A UUID. |
mode | one of "live", "test" | yes | |
url | string | yes | |
description | string or null | yes | |
events | array of one of "email.sent", "email.scheduled", "email.delivered", "email.delivery_delayed", "email.complained", "email.bounced", "email.opened", "email.clicked", "email.received", "email.failed", "email.suppressed", "email.canceled", … or null | yes | |
status | one of "enabled", "disabled", "auto_disabled" | yes | |
secret | string | no | |
stats | object | yes | |
stats. | integer | yes | |
stats. | integer | yes | |
stats. | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
stats. | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
created_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
updated_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl https://api.minket.com/v1/webhooks/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.webhooks.get("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b");minket api getWebhook 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5bfrom minket.api.webhooks import get_webhook
result = get_webhook.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client)res, err := client.GetWebhookWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b")Update a webhook endpoint
PATCH /v1/webhooks/{id}
events: null subscribes to every event type. Enabling an endpoint that was disabled automatically clears its failure history.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
url | string | no | An https URL to a public host. Private, loopback, link-local and metadata addresses are refused, also after DNS resolution and redirects. At most 2048 characters. |
description | string or null | no | At most 200 characters. |
events | array of one of "email.sent", "email.scheduled", "email.delivered", "email.delivery_delayed", "email.complained", "email.bounced", "email.opened", "email.clicked", "email.received", "email.failed", "email.suppressed", "email.canceled", … or null | no | |
status | one of "enabled", "disabled" | no |
Response
200 Success: Webhook.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "webhook" | yes | |
environment_id | string | yes | A UUID. |
mode | one of "live", "test" | yes | |
url | string | yes | |
description | string or null | yes | |
events | array of one of "email.sent", "email.scheduled", "email.delivered", "email.delivery_delayed", "email.complained", "email.bounced", "email.opened", "email.clicked", "email.received", "email.failed", "email.suppressed", "email.canceled", … or null | yes | |
status | one of "enabled", "disabled", "auto_disabled" | yes | |
secret | string | no | |
stats | object | yes | |
stats. | integer | yes | |
stats. | integer | yes | |
stats. | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
stats. | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
created_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
updated_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X PATCH https://api.minket.com/v1/webhooks/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b \
-H "Authorization: Bearer $MINKET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"events":["email.delivered","email.bounced"]}'const result = await minket.webhooks.update("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", {
events: [
"email.delivered",
"email.bounced"
]
});minket api updateWebhook 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b --body '{"events":["email.delivered","email.bounced"]}'from minket.api.webhooks import update_webhook
from minket.models import UpdateWebhookBody
result = update_webhook.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client, body=UpdateWebhookBody.from_dict({"events":["email.delivered","email.bounced"]}))var body minket.UpdateWebhookJSONRequestBody
res, err := client.UpdateWebhookWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", body)Delete a webhook endpoint
DELETE /v1/webhooks/{id}
Its deliveries are deleted with it.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "webhook" | yes |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X DELETE https://api.minket.com/v1/webhooks/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.webhooks.delete("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b");minket api deleteWebhook 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5bfrom minket.api.webhooks import delete_webhook
result = delete_webhook.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client)res, err := client.DeleteWebhookWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b")Rotate the signing secret
POST /v1/webhooks/{id}/rotate
The previous secret keeps signing for 24 hours so receivers can switch without a gap.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "webhook" | yes | |
id | string | yes | A UUID. |
secret | string | yes | |
previous_secret_expires_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X POST https://api.minket.com/v1/webhooks/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b/rotate \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.webhooks.rotateSecret("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b");minket api rotateWebhookSecret 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5bfrom minket.api.webhooks import rotate_webhook_secret
result = rotate_webhook_secret.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client)res, err := client.RotateWebhookSecretWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b")List deliveries to an endpoint
GET /v1/webhooks/{id}/deliveries
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
limit | query | integer | no | Default 20. |
after | query | string | no | A UUID. |
before | query | string | no | A UUID. |
status | query | one of "pending", "succeeded", "failed", "exhausted" | no | |
event_type | query | one of "email.sent", "email.scheduled", "email.delivered", "email.delivery_delayed", "email.complained", "email.bounced", "email.opened", "email.clicked", "email.received", "email.failed", "email.suppressed", "email.canceled", … | no |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "list" | yes | |
data | array of WebhookDelivery | yes | |
data[]. | string | yes | A UUID. |
data[]. | "delivery" | yes | |
data[]. | string | yes | A UUID. |
data[]. | string or null | yes | A UUID. |
data[]. | one of "email.sent", "email.scheduled", "email.delivered", "email.delivery_delayed", "email.complained", "email.bounced", "email.opened", "email.clicked", "email.received", "email.failed", "email.suppressed", "email.canceled", … | yes | |
data[]. | string | yes | |
data[]. | one of "pending", "succeeded", "failed", "exhausted" | yes | |
data[]. | integer | yes | |
data[]. | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
data[]. | integer or null | yes | |
data[]. | string or null | yes | |
data[]. | array of object | yes | At most 20 items. |
data[]. | integer | yes | |
data[]. | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
data[]. | integer or null | yes | |
data[]. | string or null | yes | |
data[]. | string or null | yes | |
data[]. | integer | yes | |
data[]. | string or null | yes | A UUID. |
data[]. | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
data[]. | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
has_more | boolean | yes |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl https://api.minket.com/v1/webhooks/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b/deliveries \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.webhooks.deliveries("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b");minket api listWebhookDeliveries 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5bfrom minket.api.webhooks import list_webhook_deliveries
result = list_webhook_deliveries.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client)res, err := client.ListWebhookDeliveriesWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", &minket.ListWebhookDeliveriesParams{})Get a delivery with its attempt log
GET /v1/webhooks/{id}/deliveries/{deliveryId}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
deliveryId | path | string | yes | A UUID. |
Response
200 Success: WebhookDelivery.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "delivery" | yes | |
webhook_id | string | yes | A UUID. |
event_id | string or null | yes | A UUID. |
event_type | one of "email.sent", "email.scheduled", "email.delivered", "email.delivery_delayed", "email.complained", "email.bounced", "email.opened", "email.clicked", "email.received", "email.failed", "email.suppressed", "email.canceled", … | yes | |
message_id | string | yes | |
status | one of "pending", "succeeded", "failed", "exhausted" | yes | |
attempts | integer | yes | |
next_attempt_at | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
last_status_code | integer or null | yes | |
last_error | string or null | yes | |
attempt_log | array of object | yes | At most 20 items. |
attempt_log[]. | integer | yes | |
attempt_log[]. | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
attempt_log[]. | integer or null | yes | |
attempt_log[]. | string or null | yes | |
attempt_log[]. | string or null | yes | |
attempt_log[]. | integer | yes | |
replay_of_id | string or null | yes | A UUID. |
created_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
updated_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl https://api.minket.com/v1/webhooks/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b/deliveries/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.webhooks.delivery("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b");minket api getWebhookDelivery 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5bfrom minket.api.webhooks import get_webhook_delivery
result = get_webhook_delivery.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client)res, err := client.GetWebhookDeliveryWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b")Replay deliveries
POST /v1/webhooks/{id}/replay
Sends the deliveries again with their original message_id, so receivers that deduplicate by svix-id see the same message. Give delivery_ids, or since for every failed delivery since then (up to 100 per call).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
delivery_ids | array of string | no | At most 100 items. |
since | string (date-time) | no | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Response
202 Queued: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "replay" | yes | |
queued | integer | yes |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X POST https://api.minket.com/v1/webhooks/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b/replay \
-H "Authorization: Bearer $MINKET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"since":"2026-10-24T00:00:00.000Z"}'const result = await minket.webhooks.replay("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", {
since: "2026-10-24T00:00:00.000Z"
});minket api replayWebhookDeliveries 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b --body '{"since":"2026-10-24T00:00:00.000Z"}'from minket.api.webhooks import replay_webhook_deliveries
from minket.models import ReplayWebhookDeliveriesBody
result = replay_webhook_deliveries.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client, body=ReplayWebhookDeliveriesBody.from_dict({"since":"2026-10-24T00:00:00.000Z"}))var body minket.ReplayWebhookDeliveriesJSONRequestBody
res, err := client.ReplayWebhookDeliveriesWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", body)Send a test event
POST /v1/webhooks/{id}/test
An example event of the type, signed like any other and attempted once. Test events are not part of the event feed.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
type | one of "email.sent", "email.scheduled", "email.delivered", "email.delivery_delayed", "email.complained", "email.bounced", "email.opened", "email.clicked", "email.received", "email.failed", "email.suppressed", "email.canceled", … | yes |
Response
202 Queued: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "delivery" | yes | |
id | string | yes | A UUID. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X POST https://api.minket.com/v1/webhooks/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b/test \
-H "Authorization: Bearer $MINKET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"type":"email.delivered"}'const result = await minket.webhooks.test("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", {
type: "email.delivered"
});minket api testWebhook 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b --body '{"type":"email.delivered"}'from minket.api.webhooks import test_webhook
from minket.models import TestWebhookBody
result = test_webhook.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client, body=TestWebhookBody.from_dict({"type":"email.delivered"}))var body minket.TestWebhookJSONRequestBody
res, err := client.TestWebhookWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", body)