transaction.created includes the transaction fields listed on the webhook types page. Other events often include only an id.
Webhook Payloads
This is the exact body of onefirm.updated delivery. The signature below is computed over these bytes.
Payload Fields
object
required
The data field contains the specific data for the webhook type. It is a JSON
object that will vary based on the webhook event type.
string
required
The type of webhook event. This is a string value that defines the specific
event that occurred, such as
transaction.created, firm.updated, etc.string
required
The id of the firm this webhook event is associated with.
string
required
The unique id for this event. This can be used as an idempotent key to ensure
you do not take multiple actions for the same webhook event.
Configure Webhooks
You can register endpoints and configure which webhook types you are interested in through the Partner Portal underSettings > Webhooks.
You will not receive webhooks for types that are not selected.
HMAC Signature
Webhook requests include an HMAC signature in theX-SIGNATURE header. HTTP libraries often expose that header as x-signature. Use it with the webhook secret from the Partner Portal to verify the body was not changed.
X-SIGNATURE is the base64 HMAC-SHA512 of the exact UTF-8 request body, using the webhook secret as the key. Check the signature against those bytes, then parse the JSON. Serializing a parsed object again can change key order or whitespace, and the signature will not match.
The algorithm is HMAC-SHA512. The key is the webhook secret. The digest is base64.
For the sample body above and the sample secret whsec_example_9f3c2a, X-SIGNATURE is:
express.raw() for this route:
Retry Policy
If we do not receive a 200 level response while posting to your endpoint after 5 seconds, the webhook event enters afailed state. All webhook events in the failed state are retried with the following backoff strategy: 5 min, 20 min, 60 min, 1 day, dead letter.
Event history and resend
Partners can inspect recent delivery attempts for a registered webhook URL and manually trigger a resend:- In the Partner Portal, open your webhook configuration and use the event list for that URL (including failed and dead-lettered events) to resend a payload.
- Via the GraphQL API (authenticated as a Partner Admin), use the
webhookEventsListquery (scoped to awebhookUrlId) to list events, and thewebhookEventResendmutation to retry delivery for a specificeventId.
eventId from the webhook body as your idempotency key when processing. Resends reuse that same eventId, so duplicate delivery should be safe if your handler is idempotent.
There is no separate “replay all since timestamp”; for large gaps, combine polling the API with portal resends, or contact support if you need operational help after extended outages.