Update a webhook
/api/v1/webhooks/{webhook}Changes only the fields you send; everything you leave out stays as it is.
filters (or targeting) replaces all of the webhook's filters: a list you leave out
of it is cleared. Send domain on its own to change just the domain and keep the rest.
"filters": null clears every filter, the domain included.
The same rules as create apply: an unknown field, filter key or event name is a 422 that
names it, and in an account with more than one domain an update that would leave an
email.inbound webhook without a domain is refused. The response's targeting is what is
now applied.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
webhookrequired | path | string | The webhook identifier. |
Request body
namestringA name for your team, like
Production events.eventsarray<string>The events to receive. Each one's payload is in the Receiving webhooks guide.
filtersobjectOptional. Send only some events, by what is in the email. A list matches if any of its words appears (case does not matter); leave a list out to match everything. Other keys are refused with a 422. On update this replaces all the filters; leave it out to keep them.
domainstringThe same as the top-level
domain.senderIncludesarray<string>Only mail whose sender contains one of these.
subjectContainsarray<string>Only mail whose subject contains one of these.
bodyContainsarray<string>Only mail whose body contains one of these.
targetingobjectThe same filters, spelt as the response returns them, so you can send back what you read. Send
filtersortargeting, not both.domainstringThe same as the top-level
domain.sender_includesarray<string>As
filters.senderIncludes.subject_containsarray<string>As
filters.subjectContains.body_containsarray<string>As
filters.bodyContains.
domainstringOnly events for this domain, such as
yourdomain.com: one of your domains, exact match. Required withemail.inboundwhen your account has more than one domain. Can also be sent asfilters.domainortargeting.domain; this field wins.urlstringThe full HTTPS address we send to. It must be reachable from the internet.
Request
/api/v1/webhooks/{webhook}curl -X PUT 'https://app.mailyte.com/api/v1/webhooks/01JBT8XQ2M9WYC3K4F6R7S8T9V' \
-H 'Authorization: Bearer mk_live_YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"name": "Production events",
"events": [
"email.delivered",
"email.bounced"
]
}'const response = await fetch('https://app.mailyte.com/api/v1/webhooks/01JBT8XQ2M9WYC3K4F6R7S8T9V', {
method: 'PUT',
headers: {
Authorization: 'Bearer mk_live_YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Production events",
"events": [
"email.delivered",
"email.bounced"
]
}),
});
const { data } = await response.json();import requests
response = requests.put(
"https://app.mailyte.com/api/v1/webhooks/01JBT8XQ2M9WYC3K4F6R7S8T9V",
headers={"Authorization": "Bearer mk_live_YOUR_API_KEY"},
json={
"name": "Production events",
"events": [
"email.delivered",
"email.bounced"
]
},
)
data = response.json()["data"]<?php
$response = Http::withToken('mk_live_YOUR_API_KEY')
->put('https://app.mailyte.com/api/v1/webhooks/01JBT8XQ2M9WYC3K4F6R7S8T9V', [
'name' => 'Production events',
'events' => [
'email.delivered',
'email.bounced',
],
]);
$data = $response->json('data');require "net/http"
require "json"
uri = URI("https://app.mailyte.com/api/v1/webhooks/01JBT8XQ2M9WYC3K4F6R7S8T9V")
request = Net::HTTP::Put.new(uri)
request["Authorization"] = "Bearer mk_live_YOUR_API_KEY"
request["Content-Type"] = "application/json"
request.body = {
"name": "Production events",
"events": [
"email.delivered",
"email.bounced"
]
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(request) }Response
Success.
dataobjectobjectstringwebhookidstringUnique identifier for the webhook.
namestringYour name for the webhook.
urlstringWhere we send events. It must be a public HTTPS address.
statusstringactive | inactiveAn
inactivewebhook is skipped by the dispatcher. It is not deleted and keeps its delivery history and its secret.eventsarray<string>The events this webhook receives. A name not on this list is refused with a 422.
quota.warningis an older name forstorage.quota.warningand still works, but do not use it for new webhooks.contact.checked,checks.running_lowandchecks.ran_outare about your account, not one email, so filters never hold them back; they are sent only while Bounce protection is on.targetingobjectWhich events reach this webhook. A field that is null does not narrow anything.
domainstringOnly events for this domain, exact match (
acme.comdoes not matchnotacme.com). Null means every domain. Always set on anemail.inboundwebhook in an account with more than one domain.sender_includesarray<string>Any-of substring match on the sender. null = not narrowed.
subject_containsarray<string>Any-of substring match on the subject. null = not narrowed.
body_containsarray<string>Any-of substring match on the body. null = not narrowed.
deliveriesobjectThe delivery history, grouped so the numbers cannot disagree.
succeededintegerLifetime tally of accepted deliveries.
failedintegerLifetime tally of failed deliveries.
consecutive_failuresintegerResets to zero on any success. This is what drives auto-disable, so it answers a different question from
failed.success_ratenumberThe percentage of deliveries that succeeded, 0 to 100. Null when no delivery has been tried yet; show it as "no deliveries yet", not as 0.
last_delivered_atstringWhen a delivery to this webhook last succeeded, in ISO 8601 UTC. Null when none has succeeded yet; check
deliveriesto see whether any were tried.created_atstringISO 8601 UTC.
Returned inside the standard envelope.
Errors
| Status | When |
|---|---|
401 | The API key is missing, unknown, revoked or expired. All four answer identically, on purpose: distinguishing them would confirm which keys exist. |
403 | The key is valid but may not do this: it lacks the required scope, its IP allowlist does not include you, or this endpoint does not accept API keys. |
404 | No such resource in this organization. |
422 | The request was understood but the values were not acceptable. |
429 | Too many requests, or the organization has spent its sending allowance. `Retry-After` says how long to wait. |
Every status, with what causes it and what to do, is on the error reference.