curl -X DELETE 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}`, {
method: "DELETE",
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.status); // "revoked" or "already_revoked"
import os
import requests
API_KEY = os.environ["IBUBBL_API_KEY"]
subscription_id = "4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d"
res = requests.delete(
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["status"]) # "revoked" or "already_revoked"
{
"status": "revoked"
}
{
"detail": {
"error": "not_found",
"message": "Webhook subscription not found"
}
}
Webhooks
Revoke a webhook subscription
Soft-revoke a subscription. After revocation, no further events are delivered to its URL. The row is retained for audit purposes; you can still fetch it with GET /v1/webhooks/{id} and see its revoked_at timestamp.
Revoking an already-revoked subscription is a no-op that returns {"status": "already_revoked"}.
DELETE
/
v1
/
webhooks
/
{subscription_id}
curl -X DELETE 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}`, {
method: "DELETE",
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.status); // "revoked" or "already_revoked"
import os
import requests
API_KEY = os.environ["IBUBBL_API_KEY"]
subscription_id = "4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d"
res = requests.delete(
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["status"]) # "revoked" or "already_revoked"
{
"status": "revoked"
}
{
"detail": {
"error": "not_found",
"message": "Webhook subscription not found"
}
}
Revoke a webhook subscription
Method:DELETE | Endpoint: /v1/webhooks/{subscription_id}
Description: Stop sending events to a subscription. Revoking twice is safe.
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).
curl -X DELETE 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}`, {
method: "DELETE",
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.status); // "revoked" or "already_revoked"
import os
import requests
API_KEY = os.environ["IBUBBL_API_KEY"]
subscription_id = "4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d"
res = requests.delete(
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["status"]) # "revoked" or "already_revoked"
{
"status": "revoked"
}
{
"detail": {
"error": "not_found",
"message": "Webhook subscription not found"
}
}
Responses
200 OK{
"status": "revoked"
}
{"status": "already_revoked"}.
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
Revocation result.
revoked if this call performed the revocation; already_revoked if the subscription was already revoked.
Available options:
revoked, already_revoked 
