The webhook surface at a glance
The Raise webhook system has eight endpoints organized into two groups:Subscription management
Delivery logs
The log endpoints are one of Raise’s most useful diagnostic features. When a partner integration sees an event arrive (or fail to arrive), the logs show exactly what was delivered, what the partner’s endpoint responded with, and when. See Inspecting delivery logs below.
Creating a webhook subscription
cURL
The WebhookRequest fields
⚠️ Spec gap: The
format and status enums have two integer values each ([1, 2]) but the spec doesn’t label them. format: 1 likely corresponds to JSON delivery and format: 2 to an alternative format; status: 1 likely means active and status: 2 means inactive — but confirm against the live API before relying on these assumptions.Required fields in practice
The Raise spec doesn’t formally mark any WebhookRequest fields as required. In practice, however, all subscriptions need at least these four:name— for identifying the subscription in the admin UInotificationUrl— without it, events have nowhere to goeventTypesList— without it, no events match the subscriptionsecurityToken— required for signature verification (don’t deploy without it)
format and status fields can be omitted to use defaults, but explicit values are clearer.
Storing the webhook ID
The create response includes the new subscription’sid. Store this — you’ll need it to update or delete the subscription later, and to fetch delivery logs for it.
JavaScript
The delivery model
When an event fires in Raise (a gift is created, a donor is updated, etc.), the platform identifies all webhook subscriptions whoseeventTypesList includes that event type and status is active. For each match, it makes an HTTP POST to the subscription’s notificationUrl with the event payload.
The HTTP request shape
The partner’s webhook endpoint receives a POST with:- A JSON (or alternative format, per the
formatfield) body containing the event payload. - A header carrying a signature derived from the
securityToken— used to verify the request came from Raise. See Signature Verification for the verification pattern.
- The event type identifier (the integer from the EventType enum)
- The resource that triggered the event (a Gift, Donor, RecurringGift, etc.) embedded in the payload
- Timing metadata (when the event occurred)
What the partner endpoint should do
The partner’s webhook endpoint should:1
Verify the signature
Use the
securityToken to verify the request actually came from Raise. Reject any request whose signature doesn’t validate — without this check, anyone who knows the URL can forge events. See Signature Verification.2
Acknowledge quickly
Return
200 OK as soon as the request is received and the signature is verified. Don’t process the event synchronously inside the request handler — queue it for processing and acknowledge.3
Process asynchronously
A background worker drains the queue and processes events. This decouples Raise’s delivery latency from your processing latency.
4
Handle duplicates
Webhook delivery is at-least-once, not exactly-once. Build the processor to handle duplicate deliveries gracefully — see Idempotency and Safe Reprocessing.
Delivery characteristics
A few things to know about Raise’s webhook delivery behavior:The Raise OpenAPI spec doesn’t explicitly document the retry schedule, the exact timeout the partner endpoint must respect, or the maximum number of retry attempts. See Retry Behavior for what’s known and the defensive patterns to use.
Listing subscriptions
cURL
WebhookListModel:
The
statusDisplay and formatDisplay fields are useful for understanding the enum integers — status: 1 paired with statusDisplay: "Active" confirms the mapping. Inspect a few subscription records to learn the labels.
Updating a subscription
cURL
PUT /api/Webhook/{id} accepts the same body shape as create. Send the full record — the spec doesn’t expose a PATCH variant, so partial updates use the GET-then-PUT pattern.
Common update scenarios
Pausing vs. deleting
Usestatus: 2 to pause a subscription temporarily — useful during maintenance windows or partner-side issues. Use DELETE /api/Webhook/{id} to remove the subscription permanently when it’s no longer needed (e.g., during customer offboarding).
Deleting a subscription
cURL
notificationUrl. The subscription’s delivery logs may persist for a retention window — check via the log endpoints if needed.
Delete subscriptions during customer offboarding to stop sending events to a partner that’s no longer integrated. Leaving stale subscriptions in place wastes the customer’s notification budget and produces noise on the partner side if the URL is later reused.
Inspecting delivery logs
The webhook log endpoints are the diagnostic tool for investigating “the partner integration didn’t react to an event” issues. They show what Raise attempted to deliver and how the partner endpoint responded.Listing logs for a specific webhook
cURL
/list pagination parameters with these sort fields documented: createddatetime, id.
The WebhookLogListModel
Each log entry includes:
The
eventTypeDisplay field is the single best source of truth for the event type enum’s integer-to-label mapping. The spec doesn’t document the labels themselves, but inspecting delivery logs reveals them.
Investigating a missed event
A common diagnostic flow:1
Confirm the event fired
Query the webhook logs for the specific gift, donor, or other resource. If no log entry exists, the event wasn’t fired at all — investigate the source data.
2
Check the response status code
If
httpStatusCode is 2xx, Raise considers the delivery successful. The partner endpoint may have a bug in its processing pipeline rather than a delivery issue.3
Inspect the response body
serverResponse shows what the partner endpoint returned. A 200 OK with an error message in the body indicates a partner-side processing issue.4
Check for retries
Multiple log entries for the same
contextId indicate Raise retried delivery. The retry pattern can reveal whether the partner endpoint was intermittently failing.5
Fetch the full payload
Use
GET /api/Webhook/{id}/log/{logId} to get the singular log with payLoad — the full delivered body. Useful for confirming the exact data the partner endpoint received.Getting a single log’s full detail
cURL
WebhookLogModel with webhookName and payLoad — the full body delivered to the partner endpoint. Useful for confirming the exact shape of an event when building or debugging the partner-side handler.
Listing logs across all webhooks
cURL
/api/Webhook/{id}/log/list) is more targeted.
A complete subscription lifecycle
Putting the operations together as the full lifecycle for a customer onboarding:1
Generate a security token
Cryptographically random, at least 32 bytes. Store securely on the partner side; you’ll need it for signature verification on every delivery.
2
Create the subscription
POST /api/Webhook with the partner endpoint URL, the event type integers your integration cares about, and the security token.3
Store the webhook ID
Save the returned
id in your per-customer settings. You’ll need it for updates, deletes, and log queries.4
Deploy the receiver
Stand up the partner endpoint at the
notificationUrl. Implement signature verification before any event processing — see Signature Verification.5
Validate end-to-end
Run a test donation through the customer’s account (in test mode) and confirm the event arrives at the partner endpoint with a valid signature. Inspect the webhook logs to confirm Raise sent it and the partner returned
200 OK.6
Monitor in production
Watch the partner endpoint’s logs and the Raise webhook logs for signs of issues —
5xx responses on the partner side, signature failures, repeated retries.7
Update or pause as needed
During partner maintenance, set
status: 2 to pause delivery. During customer offboarding, DELETE /api/Webhook/{id} to remove permanently.Where to go next
Event Types
The catalog of available webhook events and the discovery pattern for the integer-to-label mapping.
Signature Verification
Verify that incoming requests actually came from Raise.
Retry Behavior
What Raise does when the partner endpoint doesn’t respond successfully.
Idempotency and Safe Reprocessing
Handle duplicate deliveries without producing duplicate side effects.