تخطَّ إلى المستندات
API

Webhooks

كل عملية في هذه المجموعة: ما تقبله وما تُرجعه والأخطاء التي قد تردّ بها.

العمليات

Where to call when mail arrives or goes out.

GET/webhooks

List webhook endpoints

الصلاحياتwebhooks:readيقرأ

A page of endpoints, newest first. Follow nextCursor while hasMore is true to read them all.

Requires the webhooks:read scope.

معلمات الاستعلام

limitinteger

Rows per page, 1 to 100.

على الأقل 1على الأكثر 100الافتراضي25
cursorstring

The previous page's nextCursor, passed back as it came. It is opaque: it holds where the last row sat in this list's order, so a row deleted or edited between pages never breaks the walk, and the next page starts at the first row that sorts after it. A value this list did not hand out is a 400 invalid_cursor.

يُرجع

200

A page of endpoints. Secrets are never echoed.

الأخطاء

الأخطاء التي يمكن أن تُرجعها أي عملية400401403404422500دليل الأخطاء

متاح أيضًا في

SDK
webhooks.list()webhooks.listAll()webhooks.iterate()
CLI
openemail webhooks list
MCP
getWebhooklistWebhooks

POST/webhooks

Register a webhook endpoint

الصلاحياتwebhooks:writeيغيّر البيانات
يطلب رمز تحقق

Returns the signing secret ONCE. https only, and private or loopback hosts are refused. A webhook is a server-side fetch to an address you supply, which is the shape of an SSRF.

Requires the webhooks:write scope.

متن الطلب

urlstringمطلوب

The https receiver URL. Another scheme or a blocked host is 422 invalid_webhook_url. Stored in normalised form, so the url read back can differ cosmetically.

التنسيقuri
eventTypesstring[]

Empty means the default set: the email events. Events outside it, such as email.replied, domain.*, suppression.*, file.* and form.*, have to be named. A webhook limited to particular addresses or domains never receives form.* events, because sign-ups belong to the whole workspace.

حتى 24 من العناصرأحد"email.received""email.replied""email.sent""email.failed""email.cancelled""email.scheduled""email.queued""email.delivered""email.delivery_delayed""email.bounced""email.complained""email.suppressed""email.opened""email.clicked""email.downloaded""domain.verified""domain.sending_changed""domain.deleted""suppression.added""suppression.removed""file.uploaded""file.deleted""form.submitted""form.confirmed"
descriptionstring

Free text note, at most 200 characters.

حتى 200 من الأحرف
addressAllowliststring[]

Single addresses this endpoint hears about. Empty on both lists means every address this workspace owns.

حتى 50 من العناصر
domainAllowliststring[]

Whole domains this endpoint hears about, including addresses added to them later.

حتى 25 من العناصر

يُرجع

201

Created, with the secret.

الأخطاء

403

The key lacks the scope, or may not send as that address.

step_up_required: the call was made with an OAuth access token that has not been verified in the last 60 minutes. Ask for a code with POST /security/step-up, send it to POST /security/step-up/verify, then repeat the call. The person can also choose Allow changes for 60 minutes on the app in Account settings, Connected apps, on the OpenEmail website. An API key is never asked for a code.

الأخطاء التي يمكن أن تُرجعها أي عملية400401404422500دليل الأخطاء

متاح أيضًا في

SDK
webhooks.create()
CLI
openemail webhooks create
MCP
createWebhook

GET/webhooks/deliveries

List deliveries across endpoints

الصلاحياتwebhooks:readيقرأ

The delivery log of every endpoint in the workspace, or of the ones endpointIds names, newest first and a page at a time: the all-endpoints Deliveries tab of the app. Each row carries endpointId. Nothing is pruned, so following nextCursor while hasMore is true reaches the first delivery. status, since and until narrow it exactly as they narrow one endpoint's log. The body that was sent is not here; read it with GET /webhooks/{id}/deliveries/{deliveryId}.

Requires the webhooks:read scope.

معلمات الاستعلام

endpointIdsstring

Comma-separated endpoint ids, at most 50. Left out, every endpoint in the workspace.

statusstring

failed for the attempts that did not get a 2xx, the "only failed" view of the Deliveries tab, or delivered for the ones that did.

أحد"delivered""failed"
sincestring

Only rows at or after this instant, ISO 8601. One that does not parse is a 400 invalid_parameter.

التنسيقdate-time
untilstring

Only rows before this instant. It has to be later than since.

التنسيقdate-time
limitinteger

Rows per page, 1 to 100.

على الأقل 1على الأكثر 100الافتراضي25
cursorstring

The nextCursor of the previous page, which is a delivery id. Keyset, not offset, and it holds under every filter: send the same filters with each page. A cursor that names no delivery in this list is a 400 invalid_cursor.

يُرجع

A page of deliveries, newest first.

الأخطاء

الأخطاء التي يمكن أن تُرجعها أي عملية400401403404422500دليل الأخطاء

متاح أيضًا في

SDK
webhooks.listWorkspaceDeliveries()webhooks.listAllWorkspaceDeliveries()webhooks.iterateWorkspaceDeliveries()
CLI
openemail webhooks list-workspace-deliveries
MCP
listWebhookDeliveries

GET/webhooks/activity

List webhook activity

الصلاحياتwebhooks:readيقرأ

The audit log of the workspace's webhooks, newest first: created, updated, enabled, disabled, auto_disabled, secret_rotated, tested, replayed and removed, whether the change came from the app, from a key over this API, or from OpenEmail itself. actor says who, as @username for a person or API key <name> for a key. Nothing is pruned, and a removed endpoint keeps its history. endpointIds, since and until narrow it.

Requires the webhooks:read scope.

معلمات الاستعلام

endpointIdsstring

Comma-separated endpoint ids, at most 50. Left out, every endpoint in the workspace.

sincestring

Only rows at or after this instant, ISO 8601. One that does not parse is a 400 invalid_parameter.

التنسيقdate-time
untilstring

Only rows before this instant. It has to be later than since.

التنسيقdate-time
limitinteger

Rows per page, 1 to 100.

على الأقل 1على الأكثر 100الافتراضي25
cursorstring

The previous page's nextCursor, passed back as it came. It is opaque: it holds where the last row sat in this list's order, so a row deleted or edited between pages never breaks the walk, and the next page starts at the first row that sorts after it. A value this list did not hand out is a 400 invalid_cursor.

يُرجع

A page of changes, newest first.

الأخطاء

الأخطاء التي يمكن أن تُرجعها أي عملية400401403404422500دليل الأخطاء

متاح أيضًا في

SDK
webhooks.listWorkspaceActivity()webhooks.listAllWorkspaceActivity()webhooks.iterateWorkspaceActivity()
CLI
openemail webhooks list-workspace-activity
MCP
listWebhookActivity

GET/webhooks/{id}

Retrieve a webhook endpoint

الصلاحياتwebhooks:readيقرأ

Requires the webhooks:read scope.

معلمات المسار

idstringمطلوب

Endpoint id, whe_ followed by 24 hex characters.

يُرجع

200

The endpoint.

الأخطاء

الأخطاء التي يمكن أن تُرجعها أي عملية400401403404422500دليل الأخطاء

متاح أيضًا في

SDK
webhooks.get()
CLI
openemail webhooks get
MCP
getWebhooklistWebhooks

PATCH/webhooks/{id}

Update a webhook endpoint

الصلاحياتwebhooks:writeيغيّر البيانات
يطلب رمز تحقق

Requires the webhooks:write scope.

معلمات المسار

idstringمطلوب

Endpoint id, whe_ followed by 24 hex characters.

متن الطلب

urlstring

Replacement https URL, checked against the same host rules as create.

التنسيقuri
eventTypesstring[]

Complete replacement subscription set. [] means the default email.* set.

حتى 24 من العناصرأحد"email.received""email.replied""email.sent""email.failed""email.cancelled""email.scheduled""email.queued""email.delivered""email.delivery_delayed""email.bounced""email.complained""email.suppressed""email.opened""email.clicked""email.downloaded""domain.verified""domain.sending_changed""domain.deleted""suppression.added""suppression.removed""file.uploaded""file.deleted""form.submitted""form.confirmed"
descriptionstring

Replacement note of at most 200 characters, or null to clear it.

يمكن أن يكون nullحتى 200 من الأحرف
enabledboolean

False stops deliveries. True resumes them and resets consecutiveFailures.

addressAllowliststring[]

Single addresses this endpoint hears about. Empty on both lists means every address this workspace owns.

حتى 50 من العناصر
domainAllowliststring[]

Whole domains this endpoint hears about, including addresses added to them later.

حتى 25 من العناصر

يُرجع

200

Saved.

الأخطاء

403

The key lacks the scope, or may not send as that address.

step_up_required: the call was made with an OAuth access token that has not been verified in the last 60 minutes. Ask for a code with POST /security/step-up, send it to POST /security/step-up/verify, then repeat the call. The person can also choose Allow changes for 60 minutes on the app in Account settings, Connected apps, on the OpenEmail website. An API key is never asked for a code.

الأخطاء التي يمكن أن تُرجعها أي عملية400401404422500دليل الأخطاء

متاح أيضًا في

SDK
webhooks.update()
CLI
openemail webhooks update
MCP
updateWebhook

DELETE/webhooks/{id}

Delete a webhook endpoint

الصلاحياتwebhooks:writeيحذف

Requires the webhooks:write scope.

معلمات المسار

idstringمطلوب

Endpoint id, whe_ followed by 24 hex characters.

يُرجع

200

Deleted.

الأخطاء

الأخطاء التي يمكن أن تُرجعها أي عملية400401403404422500دليل الأخطاء

متاح أيضًا في

SDK
webhooks.delete()
CLI
openemail webhooks delete
MCP
deleteWebhook

POST/webhooks/{id}/rotate-secret

Rotate the signing secret

الصلاحياتwebhooks:writeيحذف

Returns the new secret once. The old one stops working immediately.

Requires the webhooks:write scope.

معلمات المسار

idstringمطلوب

Endpoint id, whe_ followed by 24 hex characters.

يُرجع

200

Rotated.

الأخطاء

الأخطاء التي يمكن أن تُرجعها أي عملية400401403404422500دليل الأخطاء

متاح أيضًا في

SDK
webhooks.rotateSecret()
CLI
openemail webhooks rotate-secret
MCP
rotateWebhookSecret

POST/webhooks/{id}/test

Send a synthetic event

الصلاحياتwebhooks:writeيرسل البريد

Proves an endpoint is reachable and its signature check correct before any real mail depends on it. Returns what came back. A 404 from your server is the useful answer.

Requires the webhooks:write scope.

معلمات المسار

idstringمطلوب

Endpoint id, whe_ followed by 24 hex characters.

يُرجع

200

The delivery result.

الأخطاء

الأخطاء التي يمكن أن تُرجعها أي عملية400401403404422500دليل الأخطاء

متاح أيضًا في

SDK
webhooks.test()
CLI
openemail webhooks test
MCP
testWebhook

GET/webhooks/{id}/deliveries

List deliveries

الصلاحياتwebhooks:readيقرأ

Every attempt, newest first and a page at a time, each with its response code, duration and attempt number. Nothing is dropped from the log, so following nextCursor while hasMore is true reaches the endpoint's first delivery. One event can appear several times: a delivery is tried up to 8 times, as it happens and then after 1 minute, 5 minutes, 30 minutes, 2 hours, 5 hours, 10 hours and 10 hours, about 27 and a half hours in all, and a replay adds another row. eventId is the event, the same on every retry and replay of it, while attempt is the try, so a receiver reading this can tell a repeat from a new event. nextAttemptAt is when the automatic retry that follows an attempt is due, and null once none is waiting. status keeps only failed or only delivered attempts, the "only failed" view of the app, and since and until keep a window; the cursor stays valid under every filter as long as each page sends the same ones. GET /webhooks/deliveries reads every endpoint at once.

Requires the webhooks:read scope.

معلمات المسار

idstringمطلوب

Endpoint id, whe_ followed by 24 hex characters.

معلمات الاستعلام

statusstring

failed for the attempts that did not get a 2xx, the "only failed" view of the Deliveries tab, or delivered for the ones that did.

أحد"delivered""failed"
sincestring

Only rows at or after this instant, ISO 8601. One that does not parse is a 400 invalid_parameter.

التنسيقdate-time
untilstring

Only rows before this instant. It has to be later than since.

التنسيقdate-time
limitinteger

Rows per page, 1 to 100.

على الأقل 1على الأكثر 100الافتراضي25
cursorstring

The nextCursor of the previous page, which is a delivery id. Keyset, not offset, and it holds under every filter: send the same filters with each page. A cursor that names no delivery in this list is a 400 invalid_cursor.

يُرجع

A page of deliveries, newest first.

الأخطاء

الأخطاء التي يمكن أن تُرجعها أي عملية400401403404422500دليل الأخطاء

متاح أيضًا في

SDK
webhooks.listDeliveries()webhooks.listAllDeliveries()webhooks.iterateDeliveries()
CLI
openemail webhooks list-deliveries
MCP
listWebhookDeliveries

GET/webhooks/{id}/deliveries/{deliveryId}

Retrieve a delivery

الصلاحياتwebhooks:readيقرأ

One attempt in full: payload is the exact JSON body that was POSTed, responseBody the first 2,000 characters your server answered, attempts every try of the same event on this endpoint, oldest first, and nextAttemptAt when the next automatic retry of the event is due. replayRefusal is null when a replay would be accepted, and otherwise carries the code and message the replay operation would answer with, one of webhook_disabled, event_not_subscribed, event_out_of_scope, delivery_not_replayable or retry_in_progress, the last while an automatic retry of the same event is being sent. A delivery that belongs to another endpoint is a 404, the same as one that never existed. A key narrowed to particular addresses or domains may read a delivery only on an endpoint whose own allowlists sit inside what the key holds, where holding one address never covers its whole domain, because the body names the addresses the event is about; any other is 422 capability_unsupported on addressAllowlist. Over OAuth only the workspace owner, or a member whose role reaches every address, may read one, and any other member's token is refused with owner_only. That member's token is held to the domains the workspace has now, so it reads only a delivery of an endpoint with allowlists, and one with none is 422 capability_unsupported for it too. In the app that member reads the deliveries of every endpoint, and so does an MCP client they connected with every address.

Requires the webhooks:read scope.

معلمات المسار

idstringمطلوب

Endpoint id, whe_ followed by 24 hex characters.

deliveryIdstringمطلوب

A delivery id, whd_ followed by 24 hex characters.

يُرجع

200

The delivery.

الأخطاء

الأخطاء التي يمكن أن تُرجعها أي عملية400401403404422500دليل الأخطاء

متاح أيضًا في

SDK
webhooks.getDelivery()
CLI
openemail webhooks get-delivery
MCP
getWebhookDelivery

POST/webhooks/{id}/deliveries/{deliveryId}/replay

Replay a delivery

الصلاحياتwebhooks:writeيرسل البريد

Sends the stored event again, once, right now, and answers with how it went. The body carries the same id, type, createdAt and data as the original, so a receiver that drops ids it has already handled treats it as the same event. Only the signature is new, because every POST is signed at the moment it is sent. It works on a delivered attempt as well as a failed one, which is how a receiver that lost its own copy is brought back in step. The replay is recorded as a new delivery, attempt 1 of 1, and is never retried automatically. Before it is sent, the automatic retries of the same event that have not started are paused: when the replay is delivered they stay cancelled, and when it fails they resume on their schedule. It answers 200 whatever your server said, so read delivery.status. Refused with a 409 when the endpoint is switched off (webhook_disabled), no longer listens for the event (event_not_subscribed), no longer covers the address the event is about (event_out_of_scope), the attempt has no stored event to send (delivery_not_replayable), an automatic retry of the same event is being sent at that moment (retry_in_progress), or another replay of the same event is still being sent (replay_in_progress). In the last two cases nothing is sent, so two copies never go out at once, even when two replays arrive at the same instant. Replay is one event at a time; there is no operation that sends every failed delivery again.

Requires the webhooks:write scope.

معلمات المسار

idstringمطلوب

Endpoint id, whe_ followed by 24 hex characters.

deliveryIdstringمطلوب

Any attempt of the event to send again, whd_ followed by 24 hex characters.

يُرجع

200

The replay and what your server answered.

الأخطاء

الأخطاء التي يمكن أن تُرجعها أي عملية400401403404422500دليل الأخطاء

متاح أيضًا في

SDK
webhooks.replayDelivery()
CLI
openemail webhooks replay-delivery
MCP
replayWebhookDelivery

GET/webhooks/{id}/activity

List one webhook's activity

الصلاحياتwebhooks:readيقرأ

The audit log of one endpoint, newest first, the Activity tab of the endpoint in the app. It answers for a removed endpoint too, because its history is kept; an id with neither an endpoint nor any history in this workspace is a 404.

Requires the webhooks:read scope.

معلمات المسار

idstringمطلوب

Endpoint id, whe_ followed by 24 hex characters.

معلمات الاستعلام

sincestring

Only rows at or after this instant, ISO 8601. One that does not parse is a 400 invalid_parameter.

التنسيقdate-time
untilstring

Only rows before this instant. It has to be later than since.

التنسيقdate-time
limitinteger

Rows per page, 1 to 100.

على الأقل 1على الأكثر 100الافتراضي25
cursorstring

The previous page's nextCursor, passed back as it came. It is opaque: it holds where the last row sat in this list's order, so a row deleted or edited between pages never breaks the walk, and the next page starts at the first row that sorts after it. A value this list did not hand out is a 400 invalid_cursor.

يُرجع

A page of changes, newest first.

الأخطاء

الأخطاء التي يمكن أن تُرجعها أي عملية400401403404422500دليل الأخطاء

متاح أيضًا في

SDK
webhooks.listActivity()webhooks.listAllActivity()webhooks.iterateActivity()
CLI
openemail webhooks list-activity
MCP
listWebhookActivity

GET/webhooks/events

List webhook events

الصلاحياتwebhooks:readيقرأ

Every event an endpoint can subscribe to, with a line saying when it fires, and the limits an endpoint is held to: how many endpoints this workspace may have, and how many addresses and domains one allowlist may name. An endpoint that names no events receives every email event except email.replied.

Requires the webhooks:read scope.

يُرجع

The events and the limits.

الأخطاء

الأخطاء التي يمكن أن تُرجعها أي عملية400401403404422500دليل الأخطاء

متاح أيضًا في

SDK
webhooks.listEvents()
CLI
openemail webhooks list-events
MCP
listWebhookEvents

GET/webhooks/stats

Read webhook delivery stats

الصلاحياتwebhooks:readيقرأ

How the deliveries of every endpoint, or of the ones endpointIds names, went inside a window: attempts, delivered and failed, the median time a receiver took to answer, a series of buckets, the events sent and the response codes received. It is the Analytics tab of the Webhooks page. Each try of an event counts as one attempt.

Requires the webhooks:read scope.

معلمات الاستعلام

endpointIdsstring

Comma-separated endpoint ids, at most 50. Left out, every endpoint you can see.

sincestring

The start of the window, an ISO 8601 instant. Left out, 30 days before until.

التنسيقdate-time
untilstring

The end of the window, an ISO 8601 instant, not included. Left out, now.

التنسيقdate-time
grainstring

How wide one bucket of the series is. The bucket keys change shape with it: YYYY-MM-DD for a day, YYYY-MM-DDTHH for an hour, YYYY-MM-DDTHH:MM for a minute.

أحد"minute""hour""day"الافتراضي"day"
offsetMinutesinteger

Minutes to add to UTC before cutting the buckets, so a day starts at midnight where the reader is. 120 for UTC+2.

على الأقل -840على الأكثر 840الافتراضي0

يُرجع

The totals, the series and the breakdowns.

الأخطاء

الأخطاء التي يمكن أن تُرجعها أي عملية400401403404422500دليل الأخطاء

متاح أيضًا في

SDK
webhooks.stats()
CLI
openemail webhooks stats
MCP
getWebhookStats

الكائنات

AuditActorobject

Who made the change: a person, or a key acting over the API. Null when OpenEmail made it on its own, such as switching a webhook off after 100 failed events in a row, and when the person or key has since been deleted.

يمكن أن يكون null
kindstring
أحد"user""apiKey"
idstring

The account id of the person, or the id of the key.

namestring

The name of the person, or API key <name> for a key.

usernamestring
يمكن أن يكون null
labelstring

What the app shows: @username for a person who has a username, otherwise name.

WebhookActivityEntryobject

objectstring
أحد"webhook_event"
idstring
endpointIdstring

The endpoint the change was made to. A removed endpoint keeps its history.

endpointLabelstring

The host the endpoint posts to, or the host it posted to before it was removed.

typestring
أحد"created""updated""enabled""disabled""auto_disabled""secret_rotated""tested""replayed""removed"
createdAtstring
التنسيقdate-time
detailobject

What changed: the URL, and for an update the fields that moved, previousUrl when the URL did. A test or a replay also carries the status and response code it got.

WebhookActivityListobject

objectstring
أحد"list"
hasMoreboolean

True when another page follows. Pass nextCursor back as cursor to read it.

nextCursorstring

An opaque cursor for the next page, or null on the last page. Pass it back unchanged.

يمكن أن يكون null

WebhookCatalogueobject

objectstringمطلوب
أحد"webhook_catalogue"
eventsobject[]مطلوب
idstringمطلوب
أحد"email.received""email.replied""email.sent""email.failed""email.cancelled""email.scheduled""email.queued""email.delivered""email.delivery_delayed""email.bounced""email.complained""email.suppressed""email.opened""email.clicked""email.downloaded""domain.verified""domain.sending_changed""domain.deleted""suppression.added""suppression.removed""file.uploaded""file.deleted""form.submitted""form.confirmed"
labelstringمطلوب

When the event fires, in a sentence.

maxEndpointsintegerمطلوب

How many endpoints this workspace may have, which its plan decides.

maxAddressesintegerمطلوب

How many addresses one allowlist may name, 50.

maxDomainsintegerمطلوب

How many domains one allowlist may name, 25.

WebhookDeliveryobject

objectstring
أحد"webhook_delivery"
idstring

whd_ followed by 24 hex characters.

endpointIdstring

The endpoint this attempt was sent to.

eventTypestring
أحد"email.received""email.replied""email.sent""email.failed""email.cancelled""email.scheduled""email.queued""email.delivered""email.delivery_delayed""email.bounced""email.complained""email.suppressed""email.opened""email.clicked""email.downloaded""domain.verified""domain.sending_changed""domain.deleted""suppression.added""suppression.removed""file.uploaded""file.deleted""form.submitted""form.confirmed"
eventIdstring

The payload id, the same on every retry and replay of one event.

يمكن أن يكون null
statusstring
أحد"delivered""failed"
responseCodeinteger

Null when no response arrived at all, such as a timeout or a DNS failure.

يمكن أن يكون null
durationMsinteger
يمكن أن يكون null
attemptinteger
يمكن أن يكون null
maxAttemptsinteger
يمكن أن يكون null
errorstring
يمكن أن يكون null
createdAtstring
التنسيقdate-time
nextAttemptAtstring

When the automatic retry that follows this attempt is due. Null when none is waiting.

يمكن أن يكون nullالتنسيقdate-time

WebhookDeliveryListobject

objectstring
أحد"list"
hasMoreboolean

True when another page follows. Pass nextCursor back as cursor to read it.

nextCursorstring

The id of the last delivery on this page, or null on the last page.

يمكن أن يكون null

WebhookStatsobject

objectstringمطلوب
أحد"webhook_stats"
sincestringمطلوب
التنسيقdate-time
untilstringمطلوب
التنسيقdate-time
grainstringمطلوب
أحد"minute""hour""day"
endpointIdsstring[]مطلوب

The endpoints asked for. Empty means every endpoint.

totalsobjectمطلوب
attemptsinteger
deliveredinteger
failedinteger
medianDurationMsnumber

Null when nothing was sent in the window.

يمكن أن يكون null
bucketsobject[]مطلوب
bucketstring
deliveredinteger
failedinteger
eventsobject[]مطلوب
idstring
countinteger
codesobject[]مطلوب
idstring

The HTTP status the receiver answered with.

countinteger