curl https://api.ibubbl.com/v1/webhooks/4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d \
-H "Authorization: Bearer $IBUBBL_API_KEY"
const subscriptionId = "4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d";
const res = await fetch(`https://api.ibubbl.com/v1/webhooks/${subscriptionId}`, {
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}`);
console.log(data.url, data.revoked_at);
import os
import requests
API_KEY = os.environ["IBUBBL_API_KEY"]
subscription_id = "4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d"
res = requests.get(
f"https://api.ibubbl.com/v1/webhooks/{subscription_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=10,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{res.status_code} {data['detail']['error']}")
print(data["url"], data["revoked_at"])
{
"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": "not_found",
"message": "Webhook subscription not found"
}
}
Retrieve a webhook subscription
Fetch a single subscription by ID. Returns the subscription regardless of revoked status (so you can inspect history). 404 not_found is returned for both missing subscriptions and those owned by a different customer.
curl https://api.ibubbl.com/v1/webhooks/4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d \
-H "Authorization: Bearer $IBUBBL_API_KEY"
const subscriptionId = "4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d";
const res = await fetch(`https://api.ibubbl.com/v1/webhooks/${subscriptionId}`, {
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}`);
console.log(data.url, data.revoked_at);
import os
import requests
API_KEY = os.environ["IBUBBL_API_KEY"]
subscription_id = "4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d"
res = requests.get(
f"https://api.ibubbl.com/v1/webhooks/{subscription_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=10,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{res.status_code} {data['detail']['error']}")
print(data["url"], data["revoked_at"])
{
"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": "not_found",
"message": "Webhook subscription not found"
}
}
Retrieve a webhook subscription
Method:GET | Endpoint: /v1/webhooks/{subscription_id}
Description: Fetch one webhook subscription by its ID.
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. The path parametersubscription_id is the subscription’s ID (a UUID), from Create a webhook subscription.
curl https://api.ibubbl.com/v1/webhooks/4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d \
-H "Authorization: Bearer $IBUBBL_API_KEY"
const subscriptionId = "4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d";
const res = await fetch(`https://api.ibubbl.com/v1/webhooks/${subscriptionId}`, {
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}`);
console.log(data.url, data.revoked_at);
import os
import requests
API_KEY = os.environ["IBUBBL_API_KEY"]
subscription_id = "4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d"
res = requests.get(
f"https://api.ibubbl.com/v1/webhooks/{subscription_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=10,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{res.status_code} {data['detail']['error']}")
print(data["url"], data["revoked_at"])
{
"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": "not_found",
"message": "Webhook subscription not found"
}
}
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
}
revoked_at set.
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.
404 Not Found
{
"detail": {
"error": "not_found",
"message": "Webhook subscription not found"
}
}
Authorizations
Bearer API key. Format: Authorization: Bearer ib_pk_<64 hex> (70 characters). Generate keys from Dashboard → Settings → API Access.
Path Parameters
Response
The subscription.
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.

