The webhook object
The following fields are returned byGET /v1/webhooks and GET /v1/webhooks/{id}.
| Field | Type | Description |
|---|---|---|
webhookId | string | Unique identifier for the webhook |
url | string | The destination URL that receives event payloads |
events | array[string] | List of event types this webhook is subscribed to |
status | string | ACTIVE, DISABLED, or DELETED |
description | string | Optional label for your reference |
createdAt | integer | Unix timestamp when the webhook was created |
lastDeliveryAt | integer | Unix timestamp of the most recent delivery attempt |
successCount | integer | Total number of successful deliveries |
failureCount | integer | Total number of failed deliveries |
Available events
Subscribe to any combination of the events below when you register a webhook.| Event | Triggered when |
|---|---|
donation.created | A new donation is received |
donation.updated | A donation’s status changes |
subscription.created | A new recurring subscription is started |
subscription.updated | A subscription is modified (e.g., amount changed) |
subscription.cancelled | A subscription is cancelled |
subscription.payment_method_updated | A subscription payment method is updated through a hosted update link |
contact.created | A new donor contact is added |
contact.updated | A contact’s information is updated |
form.created | A new form is created |
form.updated | A form’s configuration changes |
When a hosted payment method update link completes, CharityStack emits
subscription.payment_method_updated and also emits subscription.updated for backward compatibility. The dedicated payment method event includes a safe summary and excludes provider identifiers.Registering a webhook
CallPOST /v1/webhooks with a destination URL and the list of events you want to receive.
Verifying webhook signatures
Every webhook delivery includes three headers that you should use to authenticate the request before processing the payload.| Header | Value |
|---|---|
X-Webhook-Signature | sha256=<hex_digest> — HMAC-SHA256 signature of the payload |
X-Webhook-Timestamp | Unix timestamp of when the payload was signed |
X-Webhook-ID | Unique identifier for this delivery attempt |
Extract the headers
Read
X-Webhook-Signature, X-Webhook-Timestamp, and X-Webhook-ID from the incoming request.Compute the expected signature
Compute an HMAC-SHA256 of the signed string using your webhook secret as the key, then hex-encode the result.
Compare signatures
Compare your computed digest to the value in
X-Webhook-Signature (after stripping the sha256= prefix). Use a constant-time comparison to prevent timing attacks. Reject the request if they do not match.API endpoint
Create a webhook
Register a new webhook endpoint and subscribe to one or more event types.