The webhook surface at a glance
The Raise webhook system has eight endpoints organized into two groups:Subscription management
| Endpoint | Method | Use |
|---|---|---|
POST /api/Webhook | POST | Create a new webhook subscription |
GET /api/Webhook/list | GET | Paginated list of all webhook subscriptions |
GET /api/Webhook/{id} | GET | Get a specific subscription |
PUT /api/Webhook/{id} | PUT | Update a specific subscription |
DELETE /api/Webhook/{id} | DELETE | Delete a specific subscription |
Delivery logs
| Endpoint | Method | Use |
|---|---|---|
GET /api/Webhook/log/list | GET | Paginated list of delivery logs across all webhooks |
GET /api/Webhook/{id}/log/list | GET | Paginated logs for a specific webhook |
GET /api/Webhook/{id}/log/{logId} | GET | A single log entry with full payload detail |
Creating a webhook subscription
cURL
The WebhookRequest fields
| Field | Type | Description |
|---|---|---|
name | string | Display name for the subscription. Appears in admin UI and delivery logs. |
notificationUrl | string | The HTTPS URL on the partner side that receives event deliveries. |
eventTypesList | array of integers | The event type integers to subscribe to. See Event Types. |
format | integer enum (1, 2) | The delivery payload format. Two values exist; confirm against live API for the specific format mapping. |
status | integer enum (1, 2) | The subscription’s active/inactive state. Two values exist; 1 is typically active. |
securityToken | string | The shared secret used for signature verification. See Signature Verification. |
⚠️ 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: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.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.Process asynchronously
A background worker drains the queue and processes events. This decouples Raise’s delivery latency from your processing latency.
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:| Characteristic | Description |
|---|---|
| Delivery model | At-least-once. Events may be delivered more than once. |
| Retries on failure | Raise retries failed deliveries — see Retry Behavior. |
| Order guarantees | Events for the same resource are typically delivered in order, but ordering across resources is not guaranteed. |
| Timing | Most events deliver within seconds of the underlying change. Occasional delays of minutes are normal under high load. |
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:
| Field | Type | Description |
|---|---|---|
id | integer | The subscription’s primary key |
name | string | Display name |
eventTypes | string | Comma-separated string of subscribed event types |
notificationUrl | string | The partner’s endpoint URL |
status | integer | Active/inactive state |
format | integer | Payload format |
statusDisplay | string | Human-readable status ("Active" or similar) |
formatDisplay | string | Human-readable format ("JSON" or similar) |
securityToken | string | The shared secret (stored verbatim) |
createdDate | string | When the subscription was created |
modifiedDate | string | When the subscription was last changed |
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
| Change | Fields to update |
|---|---|
| Subscribe to additional event types | eventTypesList with the expanded set |
| Move the receiver to a new URL | notificationUrl |
| Rotate the security token | securityToken — see Signature Verification: rotating the secret |
| Pause the subscription | status: 2 (inactive) — events stop being delivered but the subscription persists |
| Resume a paused subscription | status: 1 (active) |
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:| Field | Description |
|---|---|
id | The log entry’s ID |
webhookId | The subscription this delivery belongs to |
contextId | The ID of the entity that triggered the event (e.g., the Gift ID) |
eventType | Integer event type |
eventTypeDisplay | Human-readable label for the event — this is the canonical place to learn the integer-to-label mapping |
serverResponse | The response body returned by the partner’s endpoint |
success | Whether the delivery succeeded (string field — likely "Yes"/"No" or "True"/"False") |
httpStatusCode | The HTTP status the partner returned |
createdDate | When the delivery was attempted |
modifiedDate | When the log entry was last updated |
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: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.
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.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.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.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: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.
Create the subscription
POST /api/Webhook with the partner endpoint URL, the event type integers your integration cares about, and the security token.Store the webhook ID
Save the returned
id in your per-customer settings. You’ll need it for updates, deletes, and log queries.Deploy the receiver
Stand up the partner endpoint at the
notificationUrl. Implement signature verification before any event processing — see Signature Verification.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.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.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.