curl https://api.ibubbl.com/v1/webhooks \
-H "Authorization: Bearer $IBUBBL_API_KEY"
const res = await fetch("https://api.ibubbl.com/v1/webhooks", {
headers: { Authorization: `Bearer ${process.env.IBUBBL_API_KEY}` },
signal: AbortSignal.timeout(10_000),
});
const data = await res.json();
if (!res.ok) throw new Error(`${res.status} ${data.detail?.error}`);
for (const sub of data) console.log(sub.id, sub.url, sub.event_types);
import os
import requests
API_KEY = os.environ["IBUBBL_API_KEY"]
res = requests.get(
"https://api.ibubbl.com/v1/webhooks",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=10,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{res.status_code} {data['detail']['error']}")
for sub in data:
print(sub["id"], sub["url"], sub["event_types"])
[
{
"id": "4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d",
"url": "https://api.example.com/ibubbl-webhooks",
"secret_prefix": "whsec_a3f2c8d9",
"event_types": [
"message.sent",
"message.failed",
"message.inbound"
],
"created_at": "2026-11-05T14:23:45.123Z",
"last_delivered_at": "2026-11-05T15:01:12.456Z",
"revoked_at": null
}
]
{
"detail": {
"error": "unauthorized",
"message": "Invalid or revoked API key"
}
}
List webhook subscriptions
Returns all currently active webhook subscriptions for the authenticated customer. Revoked subscriptions are omitted — query them by ID directly (GET /v1/webhooks/{id}) if you need their history.
curl https://api.ibubbl.com/v1/webhooks \
-H "Authorization: Bearer $IBUBBL_API_KEY"
const res = await fetch("https://api.ibubbl.com/v1/webhooks", {
headers: { Authorization: `Bearer ${process.env.IBUBBL_API_KEY}` },
signal: AbortSignal.timeout(10_000),
});
const data = await res.json();
if (!res.ok) throw new Error(`${res.status} ${data.detail?.error}`);
for (const sub of data) console.log(sub.id, sub.url, sub.event_types);
import os
import requests
API_KEY = os.environ["IBUBBL_API_KEY"]
res = requests.get(
"https://api.ibubbl.com/v1/webhooks",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=10,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{res.status_code} {data['detail']['error']}")
for sub in data:
print(sub["id"], sub["url"], sub["event_types"])
[
{
"id": "4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d",
"url": "https://api.example.com/ibubbl-webhooks",
"secret_prefix": "whsec_a3f2c8d9",
"event_types": [
"message.sent",
"message.failed",
"message.inbound"
],
"created_at": "2026-11-05T14:23:45.123Z",
"last_delivered_at": "2026-11-05T15:01:12.456Z",
"revoked_at": null
}
]
{
"detail": {
"error": "unauthorized",
"message": "Invalid or revoked API key"
}
}
List webhook subscriptions
Method:GET | Endpoint: /v1/webhooks
Description: List your account’s active webhook subscriptions. Secrets are never returned, only their prefix.
Authentication: API key in the Authorization header: Authorization: Bearer ib_pk_<64 hex>. Create keys in the dashboard under Settings → API access.
Request Body
None.curl https://api.ibubbl.com/v1/webhooks \
-H "Authorization: Bearer $IBUBBL_API_KEY"
const res = await fetch("https://api.ibubbl.com/v1/webhooks", {
headers: { Authorization: `Bearer ${process.env.IBUBBL_API_KEY}` },
signal: AbortSignal.timeout(10_000),
});
const data = await res.json();
if (!res.ok) throw new Error(`${res.status} ${data.detail?.error}`);
for (const sub of data) console.log(sub.id, sub.url, sub.event_types);
import os
import requests
API_KEY = os.environ["IBUBBL_API_KEY"]
res = requests.get(
"https://api.ibubbl.com/v1/webhooks",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=10,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{res.status_code} {data['detail']['error']}")
for sub in data:
print(sub["id"], sub["url"], sub["event_types"])
[
{
"id": "4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d",
"url": "https://api.example.com/ibubbl-webhooks",
"secret_prefix": "whsec_a3f2c8d9",
"event_types": [
"message.sent",
"message.failed",
"message.inbound"
],
"created_at": "2026-11-05T14:23:45.123Z",
"last_delivered_at": "2026-11-05T15:01:12.456Z",
"revoked_at": null
}
]
{
"detail": {
"error": "unauthorized",
"message": "Invalid or revoked API key"
}
}
Responses
200 OK[
{
"id": "4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d",
"url": "https://api.example.com/ibubbl-webhooks",
"secret_prefix": "whsec_a3f2c8d9",
"event_types": [
"message.sent",
"message.failed",
"message.inbound"
],
"created_at": "2026-11-05T14:23:45.123Z",
"last_delivered_at": "2026-11-05T15:01:12.456Z",
"revoked_at": null
}
]
[].
401 Unauthorized
{
"detail": {
"error": "unauthorized",
"message": "Invalid or revoked API key"
}
}
message values: Authorization Bearer token required, API key required (use Authorization: Bearer ib_pk_…), Invalid API key format, Customer account not found.
403 Forbidden
{
"detail": {
"error": "forbidden",
"message": "Account is suspended"
}
}
message is then Account is cancelled). Every API-key endpoint returns this.Authorizations
Bearer API key. Format: Authorization: Bearer ib_pk_<64 hex> (70 characters). Generate keys from Dashboard → Settings → API Access.
Response
Array of active subscriptions.
Unique subscription identifier (UUID).
The HTTPS URL receiving events.
First 14 characters of the signing secret (whsec_ + 8 hex). Useful for identifying which subscription's secret is in use without revealing the full value. The full secret is returned only once, at creation time.
"whsec_a3f2c8d9"
ISO 8601 UTC timestamp.
Event filter, or null if subscribed to all events.
ISO 8601 UTC timestamp of the most recent successful delivery to this subscription, or null if no event has been delivered yet.
ISO 8601 UTC timestamp the subscription was revoked, or null if active. Revoked subscriptions stop receiving events.

