1MSG

Get webhook URL

GET
/webhook

Return the webhook URL(s) currently configured for this channel, plus delivery status for each URL.

webhookUrl is a string when a single URL is set, an array of strings when multiple URLs are configured, or null if none is set.

Prefer webhookStatuses. The circuit breaker is per URL, not per channel. If 1 of 4 URLs is sticky-disabled, that URL is skipped; the other three still receive events. Send/receive are not affected.

Channel-level haveDisabledWebhooks, circuitState, reason, fails, trips, and timestamps are a compatibility summary of one URL (the first sticky-disabled URL, else the first configured URL). They are not "the channel is dead".

  • haveDisabledWebhooks — true when at least one URL in webhookUrl is sticky auto-disabled. Live URLs still get events.
  • circuitState — compressed scalar for that same primary URL: ok | degraded | open | half_open | disabled.
  • disabledWebhooks — currently configured URLs that are sticky-disabled (subset of webhookUrl).
  • webhookStatuses — one row per currently configured URL. Use this array to see which endpoints are live vs skipped.
  • fails / trips / firstFailAt — diagnostics for support, not product UI. fails = failures in a rolling ~10 minute window (not lifetime). trips = failed recovery probes on the 15 min → 1 h → 6 h schedule (sticky disable after 3). Clients can ignore these and use webhookStatuses + disabledWebhooks only.

Sticky disable skips delivery; it does not unconfigure the URL (it stays in webhookUrl). Re-enable with POST /webhook or POST /settings. Those endpoints replace the whole list — with multiple URLs, send the full array.

Authorization

JWT token
querytoken<token>

Response Body

Current webhook URL and per-URL circuit status

application/json
  1. response

Configured webhook URL(s) plus per-URL circuit / auto-disable status.

webhookUrl?|array<>|

Configured webhook URL, array of URLs, or null when none is set

haveDisabledWebhooks?boolean

true when at least one URL in webhookUrl is sticky auto-disabled. Not "the channel is dead": other configured URLs still receive events. Send/receive are unaffected.

circuitState?string

Compatibility scalar for one URL (first sticky-disabled, else first configured). Not the channel as a whole. Prefer webhookStatuses[].circuitState.

Value in"ok""degraded""open""half_open""disabled"
reason?string

Last qualifying fail reason of the summary URL (same URL as circuitState)

fails?integer

Diagnostic only (summary URL). Qualifying failures in the rolling ~10 minute breaker window — not lifetime and not customer retries. Prefer webhookStatuses / disabledWebhooks.

trips?integer

Diagnostic only (summary URL). Failed recovery probes (≈15 min → 1 h → 6 h). Sticky disable after 3. Not a blind unblock timer.

disabledAt?integer

Epoch milliseconds when the summary URL became sticky-disabled

firstFailAt?integer

Diagnostic only (summary URL). Epoch ms of the first fail in the current ~10 minute window (pairs with fails).

lastStatus?integer

Last HTTP status from the summary URL, when known

nextProbeAt?integer

Epoch milliseconds of the next half-open probe for the summary URL, if any

disabledWebhooks?array<>

Currently configured URLs that are sticky auto-disabled (subset of webhookUrl). Does not include leftover URLs that are no longer configured.

webhookStatuses?array<>

One entry per currently configured URL. Prefer this over top-level haveDisabledWebhooks / circuitState when more than one webhook is set.

[key: string]?any
curl -X GET 'https://api.1msg.io/123/webhook'

{  "webhookUrl": "https://example.com/webhook",  "haveDisabledWebhooks": false,  "circuitState": "ok",  "disabledWebhooks": [],  "webhookStatuses": [    {      "url": "https://example.com/webhook",      "circuitState": "ok"    }  ]}