API reference
Webhook endpoints
Register the URLs that receive delivery receipts, inbound messages and account events.
Download OpenAPICreate a webhook endpoint#
/v1/webhook_endpointsScopewebhooks:writeRegisters a URL to receive events. The endpoint belongs to the mode of the API key: an endpoint created with a test key receives test-mode events only.
The response contains the signing secret. Store it; it is not returned again except when you roll it.
An account can have up to 500 endpoints per mode, so that every Zap, workflow or scenario can own one. An integration that creates endpoints for its users sets source (and may keep its own IDs in metadata); such an endpoint is removed automatically after 30 days of uninterrupted failures. filters narrows the deliveries on our side. verification_token adds a static header for receivers that cannot verify the signature.
The URL must be public HTTPS: localhost, private and link-local addresses are refused with webhook_url_not_public.
Headers
Idempotency-KeystringOptionalUnique string of up to 255 characters, such as a UUID. Repeating a request with the same key and body within 24 hours returns the stored response instead of performing the operation again.
Request body
urlstringRequiredPublic HTTPS URL. Hosts that resolve to private or loopback addresses are rejected.
Up to 2048 characters
eventsarray of stringsRequiredEvent types to subscribe to, or
["*"]for all.Possible values
message.sentmessage.deliveredmessage.readmessage.failedmessage.receivedchannel.connectedchannel.disconnectedbalance.lowpackage.exhaustedpackage.expiringcampaign.startedcampaign.pausedcampaign.completedcampaign.failed*descriptionstringOptionalOptional note.
Up to 255 characters
filtersobjectOptionalServer-side filters. An event is delivered only when it matches every filter that is set; events that do not carry the filtered property (for example
balance.low) always pass.Show child attributesHide child attributes
channel_idstringOptionalOnly events about this channel: messages on it, and its own
channel.*events.directionstringOptionalOnly message events of this direction.
Possible values
outboundinbound
metadataobjectOptionalUp to 20 string values for your own bookkeeping: a Zap ID, a workflow name.
Up to 20 keys
sourcestring or nullOptionalName of the tool that owns the endpoint, as a lower-case slug (
zapier,n8n,make). Set it when an integration creates endpoints on behalf of a user: the console groups by it, and abandoned endpoints are cleaned up.verification_tokenstring or nullOptionalA static token of 16 to 255 printable characters, sent with every delivery in the
OmniMessage-Verification-Tokenheader. For receivers that cannot verify the HMAC signature. Write-only.16 to 255 characters
Responses
- 201
The endpoint was created.
secretis included. Webhook endpoint object. - 400
Invalid body, an unknown event type, a URL that is not reachable from the internet (
webhook_url_not_public), or the limit of endpoints per mode is reached (webhook_endpoint_limit_reached).parameter_missingparameter_invalidinvalid_jsonwebhook_url_not_publicwebhook_endpoint_limit_reached
- 401
The API key is missing, invalid, revoked or expired.
api_key_missingapi_key_invalidapi_key_revokedapi_key_expired
- 403
The API key is not allowed to make this request.
- 404
The channel named in
filters.channel_iddoes not exist in this account and mode. - 409
- 429
Too many requests. Wait for
Retry-Afterseconds. - 500
Unexpected error on our side. Safe to retry with the same
Idempotency-Key.
/v1/webhook_endpointscurl https://api.omnimessage.co/v1/webhook_endpoints \
-H "Authorization: Bearer om_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/hooks/omni",
"events": [
"message.delivered",
"message.failed",
"message.received"
],
"description": "Production delivery receipts"
}'{
"id": "we_3kL9pQ2wE5rT8yU1iO4a",
"object": "webhook_endpoint",
"mode": "live",
"url": "https://example.com/hooks/omni",
"description": "Production delivery receipts",
"events": [
"message.delivered",
"message.failed",
"message.received"
],
"status": "active",
"filters": {},
"metadata": {},
"source": null,
"created_by": {
"type": "api_key",
"id": "key_1qW4eR7tY0uI3oP6aS9d"
},
"has_verification_token": false,
"created_at": "2026-10-02T11:15:00.000Z",
"secret": "whsec_Zk8vQ2mX5cB7nL0pR3tY6wA9dF1gH4jK"
}List webhook endpoints#
/v1/webhook_endpointsScopewebhooks:readReturns the webhook endpoints of the key mode, newest first. The signing secret is not included.
Query parameters
limitintegerOptionalNumber of objects to return, 1 to 100. Default
20.starting_afterstringOptionalCursor for the next page: the
next_cursorof the previous response (the ID of its last object).
Responses
- 200
A page of webhook endpoints.
- 400
Bad request.
- 401
The API key is missing, invalid, revoked or expired.
api_key_missingapi_key_invalidapi_key_revokedapi_key_expired
- 403
The API key is not allowed to make this request.
- 429
Too many requests. Wait for
Retry-Afterseconds. - 500
Unexpected error on our side. Safe to retry with the same
Idempotency-Key.
/v1/webhook_endpointscurl https://api.omnimessage.co/v1/webhook_endpoints \
-H "Authorization: Bearer om_live_xxxxxxxxxxxxxxxxxxxxxxxx"{
"object": "list",
"data": [
{
"id": "we_3kL9pQ2wE5rT8yU1iO4a",
"object": "webhook_endpoint",
"mode": "live",
"url": "https://example.com/hooks/omni",
"description": "Production delivery receipts",
"events": [
"message.delivered",
"message.failed",
"message.received"
],
"status": "active",
"filters": {},
"metadata": {},
"source": null,
"created_by": {
"type": "api_key",
"id": "key_1qW4eR7tY0uI3oP6aS9d"
},
"has_verification_token": false,
"created_at": "2026-10-02T11:15:00.000Z"
}
],
"has_more": false,
"next_cursor": null
}Retrieve a webhook endpoint#
/v1/webhook_endpoints/{id}Scopewebhooks:readReturns one webhook endpoint. The signing secret is not included.
Path parameters
idstringRequiredWebhook endpoint ID.
Responses
- 200
The endpoint. Webhook endpoint object.
- 401
The API key is missing, invalid, revoked or expired.
api_key_missingapi_key_invalidapi_key_revokedapi_key_expired
- 403
The API key is not allowed to make this request.
- 404
The resource does not exist in this account and mode.
- 429
Too many requests. Wait for
Retry-Afterseconds. - 500
Unexpected error on our side. Safe to retry with the same
Idempotency-Key.
/v1/webhook_endpoints/{id}curl https://api.omnimessage.co/v1/webhook_endpoints/we_3kL9pQ2wE5rT8yU1iO4a \
-H "Authorization: Bearer om_live_xxxxxxxxxxxxxxxxxxxxxxxx"{
"id": "we_3kL9pQ2wE5rT8yU1iO4a",
"object": "webhook_endpoint",
"mode": "live",
"url": "https://example.com/hooks/omni",
"description": "Production delivery receipts",
"events": [
"message.delivered",
"message.failed",
"message.received"
],
"status": "active",
"filters": {},
"metadata": {},
"source": null,
"created_by": {
"type": "api_key",
"id": "key_1qW4eR7tY0uI3oP6aS9d"
},
"has_verification_token": false,
"created_at": "2026-10-02T11:15:00.000Z"
}Update a webhook endpoint#
/v1/webhook_endpoints/{id}Scopewebhooks:writeChanges the URL, the note, the subscribed events or the status. Only the fields you send are changed. Setting status to active re-enables an endpoint that was disabled automatically and resets its failure count.
Path parameters
idstringRequiredWebhook endpoint ID.
Request body
urlstringOptionalNew URL.
Up to 2048 characters
descriptionstring or nullOptionalReplaces the note.
nullclears it.Up to 255 characters
eventsarray of stringsOptionalReplaces the subscribed event types.
Possible values
message.sentmessage.deliveredmessage.readmessage.failedmessage.receivedchannel.connectedchannel.disconnectedbalance.lowpackage.exhaustedpackage.expiringcampaign.startedcampaign.pausedcampaign.completedcampaign.failed*statusstringOptionalSet
disabledto pause deliveries,activeto resume or to re-enable an automatically disabled endpoint.Possible values
activedisabledfiltersobjectOptionalServer-side filters. An event is delivered only when it matches every filter that is set; events that do not carry the filtered property (for example
balance.low) always pass.Show child attributesHide child attributes
channel_idstringOptionalOnly events about this channel: messages on it, and its own
channel.*events.directionstringOptionalOnly message events of this direction.
Possible values
outboundinbound
metadataobjectOptionalReplaces the metadata.
Up to 20 keys
verification_tokenstring or nullOptionalReplaces the verification token.
nullremoves it.16 to 255 characters
Responses
- 200
The updated endpoint. Webhook endpoint object.
- 400
- 401
The API key is missing, invalid, revoked or expired.
api_key_missingapi_key_invalidapi_key_revokedapi_key_expired
- 403
The API key is not allowed to make this request.
- 404
The resource does not exist in this account and mode.
- 429
Too many requests. Wait for
Retry-Afterseconds. - 500
Unexpected error on our side. Safe to retry with the same
Idempotency-Key.
/v1/webhook_endpoints/{id}curl -X PATCH https://api.omnimessage.co/v1/webhook_endpoints/we_3kL9pQ2wE5rT8yU1iO4a \
-H "Authorization: Bearer om_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"events": [
"message.failed",
"channel.disconnected"
]
}'{
"id": "we_3kL9pQ2wE5rT8yU1iO4a",
"object": "webhook_endpoint",
"mode": "live",
"url": "https://example.com/hooks/omni",
"description": "Production delivery receipts",
"events": [
"message.failed",
"channel.disconnected"
],
"status": "active",
"filters": {},
"metadata": {},
"source": null,
"created_by": {
"type": "api_key",
"id": "key_1qW4eR7tY0uI3oP6aS9d"
},
"has_verification_token": false,
"created_at": "2026-10-02T11:15:00.000Z"
}Delete a webhook endpoint#
/v1/webhook_endpoints/{id}Scopewebhooks:writeRemoves the endpoint. Pending retries for it are discarded.
Path parameters
idstringRequiredWebhook endpoint ID.
Responses
- 200
The endpoint was deleted.
- 401
The API key is missing, invalid, revoked or expired.
api_key_missingapi_key_invalidapi_key_revokedapi_key_expired
- 403
The API key is not allowed to make this request.
- 404
The resource does not exist in this account and mode.
- 429
Too many requests. Wait for
Retry-Afterseconds. - 500
Unexpected error on our side. Safe to retry with the same
Idempotency-Key.
/v1/webhook_endpoints/{id}curl -X DELETE https://api.omnimessage.co/v1/webhook_endpoints/we_3kL9pQ2wE5rT8yU1iO4a \
-H "Authorization: Bearer om_live_xxxxxxxxxxxxxxxxxxxxxxxx"{
"id": "we_3kL9pQ2wE5rT8yU1iO4a",
"object": "webhook_endpoint",
"deleted": true
}Roll the signing secret#
/v1/webhook_endpoints/{id}/roll_secretScopewebhooks:writeGenerates a new signing secret and returns it. The previous secret stops being used immediately, so deploy the new one right away; deliveries your server rejects in between are retried.
Path parameters
idstringRequiredWebhook endpoint ID.
Headers
Idempotency-KeystringOptionalUnique string of up to 255 characters, such as a UUID. Repeating a request with the same key and body within 24 hours returns the stored response instead of performing the operation again.
Responses
- 200
The endpoint with its new
secret. Webhook endpoint object. - 401
The API key is missing, invalid, revoked or expired.
api_key_missingapi_key_invalidapi_key_revokedapi_key_expired
- 403
The API key is not allowed to make this request.
- 404
The resource does not exist in this account and mode.
- 409
- 429
Too many requests. Wait for
Retry-Afterseconds. - 500
Unexpected error on our side. Safe to retry with the same
Idempotency-Key.
/v1/webhook_endpoints/{id}/roll_secretcurl -X POST https://api.omnimessage.co/v1/webhook_endpoints/we_3kL9pQ2wE5rT8yU1iO4a/roll_secret \
-H "Authorization: Bearer om_live_xxxxxxxxxxxxxxxxxxxxxxxx"{
"id": "we_3kL9pQ2wE5rT8yU1iO4a",
"object": "webhook_endpoint",
"mode": "live",
"url": "https://example.com/hooks/omni",
"description": "Production delivery receipts",
"events": [
"message.delivered",
"message.failed",
"message.received"
],
"status": "active",
"filters": {},
"metadata": {},
"source": null,
"created_by": {
"type": "api_key",
"id": "key_1qW4eR7tY0uI3oP6aS9d"
},
"has_verification_token": false,
"created_at": "2026-10-02T11:15:00.000Z",
"secret": "whsec_N7bT4xK1mQ8wE5rY2uI9oP3aS6dF0gHj"
}Send a test event#
/v1/webhook_endpoints/{id}/testScopewebhooks:writeQueues a webhook.test event for the endpoint, signed like any other delivery, whatever its event subscriptions. Returns the event that will be delivered. Use it to check connectivity and your signature verification.
Path parameters
idstringRequiredWebhook endpoint ID.
Headers
Idempotency-KeystringOptionalUnique string of up to 255 characters, such as a UUID. Repeating a request with the same key and body within 24 hours returns the stored response instead of performing the operation again.
Responses
- 200
The queued test event. Event object.
- 401
The API key is missing, invalid, revoked or expired.
api_key_missingapi_key_invalidapi_key_revokedapi_key_expired
- 403
The API key is not allowed to make this request.
- 404
The resource does not exist in this account and mode.
- 409
- 429
Too many requests. Wait for
Retry-Afterseconds. - 500
Unexpected error on our side. Safe to retry with the same
Idempotency-Key.
/v1/webhook_endpoints/{id}/testcurl -X POST https://api.omnimessage.co/v1/webhook_endpoints/we_3kL9pQ2wE5rT8yU1iO4a/test \
-H "Authorization: Bearer om_live_xxxxxxxxxxxxxxxxxxxxxxxx"{
"id": "evt_6hJ9kL2zX5cV8bN1mQ4w",
"object": "event",
"type": "webhook.test",
"mode": "live",
"created_at": "2026-10-05T09:30:02.900Z",
"data": {
"object": {
"id": "we_3kL9pQ2wE5rT8yU1iO4a",
"object": "webhook_endpoint",
"mode": "live",
"url": "https://example.com/hooks/omni",
"description": "Production delivery receipts",
"events": [
"message.delivered",
"message.failed",
"message.received"
],
"status": "active",
"filters": {},
"metadata": {},
"source": null,
"created_by": {
"type": "api_key",
"id": "key_1qW4eR7tY0uI3oP6aS9d"
},
"has_verification_token": false,
"created_at": "2026-10-02T11:15:00.000Z"
}
}
}