Voicegram

List webhook subscriptions

Lists webhook subscriptions for the PAT's account.

On this page

Lists webhook subscriptions for the PAT's account. Includes both active (is_active=true) and soft-deleted (is_active=false) rows unless filtered.

Sort order is created_at DESC (newest first).

pagination.total counts rows matching the request's filters (account_id + source + is_active), ignoring limit/offset. Use it to determine whether further pages exist.

Never returns the plaintext secret. The plaintext was returned once in the POST 201 response and is unrecoverable from the API afterwards.

Endpoint

http
GET /api/v1/webhook-subscriptions

Authentication

Bearer Personal Access Token. See Authentication.

Query parameters

NameTypeRequiredDescription
limitintegernoPage size (1–100, default 25).
offsetintegernoPage start (zero-based, default 0).
sourceenum ("zapier", "dashboard")noFilter by source class.
is_activebooleannoFilter to active or soft-deleted rows.

Example request

bash
curl https://www.voicegram.io/api/v1/webhook-subscriptions \
  -H "Authorization: Bearer vg_pat_<your-token>"

Responses

200OK

Subscription list with filter-aware pagination total

FieldTypeRequiredDescription
subscriptionsarray of objectyes
subscriptions[].idstring (uuid)yes
subscriptions[].urlstring (uri)yes
subscriptions[].secret_prefixstringyesFirst 12 characters of the HMAC secret (e.g. vg_whsec_012). Lets customers identify which subscription a logged signature came from without exposing the secret itself.
subscriptions[].channel_idstring | nullyesNull when the subscription fires for all channels.
subscriptions[].channel_typestring | nullyesDerived from channel_id at creation. Null when channel_id is null. Read-only; cannot be changed after creation.
subscriptions[].sourceenum ("zapier", "dashboard")yes
subscriptions[].zapier_subscription_idstring | nullyesPopulated for source=zapier, null for source=dashboard.
subscriptions[].is_activebooleanyesFalse once soft-deleted (via DELETE /api/v1/webhook-subscriptions/{id}) or auto-disabled after 5 consecutive failed events.
subscriptions[].consecutive_failuresintegeryesNumber of consecutive events (full retry cycles) that have failed for this subscription. Resets to 0 on any 2xx delivery. Triggers auto-disable at 5.
subscriptions[].last_delivery_atstring | nullyes
subscriptions[].last_success_atstring | nullyes
subscriptions[].last_errorstring | nullyesMost recent error excerpt for ops/support correlation. For URL-redirect failures this carries the literal redirect_blocked: <status> string surfaced by the manual-redirect SSRF guard.
subscriptions[].created_atstring (date-time)yes
subscriptions[].created_by_user_idstring | nullyesPopulated for source=dashboard rows (the dashboard user who created the row). Null for source=zapier rows because Zapier does not bind to a single human user. The OAuth-style token is account-scoped.
paginationobjectyes
pagination.limitintegeryes
pagination.offsetintegeryes
pagination.totalintegeryesTotal row count matching the request's filters (account + source + is_active), ignoring limit/offset. Use to decide whether further pages exist.
400Bad Request

Query parameters failed validation

FieldTypeRequiredDescription
errorenum ("invalid_token", "plan_required", "validation_error", "invalid_url", "invalid_channel_id", "not_found", "rate_limited", "limit_reached", "conflict", "internal_error")yesStable error code.
messagestringnoHuman-readable error message.
reasonstringnoStable diagnostic enum string. Only set on invalid_url responses (e.g. url_must_be_https, url_resolves_to_private_host, url_must_not_contain_credentials).
issuesarray of objectnoSchema-validation issues. Only set on validation_error responses. Each entry has a path array and a message.
json
{
  "error": "validation_error",
  "issues": [
    {
      "path": [
        "limit"
      ],
      "message": "Number must be less than or equal to 100"
    }
  ]
}
401Unauthorized

The PAT is missing, malformed, expired, or revoked.

See Errors for the shared error response shape.

403Forbidden

PAT is valid but the account is on the free plan.

See Errors for the shared error response shape.

429Too Many Requests

Per-account rate limit exceeded.

See Errors for the shared error response shape.

500Internal Server Error

Unexpected server error.

See Errors for the shared error response shape.

Need help? Email support@voicegram.io.