What a notification contains
A notification names the Client, the resource, the kind of change and the accepted revision. It carries no Customer, contact or financial detail.eventId is the same identity the change feed reports for the change. To see the detail, read the resource with its own GET and your API key. That read is authorized when you make it, so a revoked grant or missing scope cannot recover data through a notification.
Configure the endpoint
All four operations need thewebhooks:manage scope. Each Integration has at most one endpoint per Client.
PUT /v1/clients/{clientCode}/webhook-endpointwith{ "url": "https://hooks.example.com/paypathiq" }creates or replaces the endpoint and re-enables a disabled one. The first call returns201withsigningSecret, shown once. Later calls return200without it.GET /v1/clients/{clientCode}/webhook-endpointreturnsurl,status,disabledReasonandsecretVersion.POST /v1/clients/{clientCode}/webhook-endpoint/rotate-secretissues a new signing secret, shown once.POST /v1/clients/{clientCode}/webhook-endpoint/disablestops delivery.
https on port 443 with a public DNS name, no credentials and no fragment. Other URLs return 422 webhook_destination_unsafe. Notifications cover changes that commit after you configure the endpoint. Use the change feed for anything earlier.
Verify the signature
Each request carries two headers:PayPathIQ-Event-Id and PayPathIQ-Signature.
- Read the raw request body before parsing it.
- Compute the hex HMAC-SHA256 of
<t>.<raw body>, keyed with your signing secret (the wholewhsec_...string). - Compare it with every
v1value using a constant-time comparison. Accept if any matches. - Reject the request when
tis more than five minutes from your clock.
Rotate the secret
Rotation returns a new secret. For 24 hours afterwards every notification is signed with both the new and the previous secret, so you can deploy the new one before the old one stops being accepted. Because av1 value is present for each, verification by “any match” works throughout.
PayPathIQ never writes signing secrets, signatures or destination URLs to logs or audit events. Audit events record a digest of the change only.
Delivery, retries and recovery
Respond with any2xx status within 5 seconds. Redirects are not followed. Any other outcome is retried after 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours, 12 hours and 24 hours, for 8 attempts in all over about two days. After that the delivery is abandoned.
Delivery is at least once and unordered. Retries mean a later change can arrive before an earlier one, and a retry can repeat a notification you already handled.
- Discard an
eventIdyou have already handled. - Compare
revisionwith the revision you hold and ignore anything not newer. - When you suspect a gap, for example after an outage or an abandoned delivery, resume the change feed from your stored cursor. Missed, duplicate and out-of-order notifications all converge on the same state.
Revocation and unsafe destinations
PayPathIQ re-checks the destination and your current grant before every attempt, including retries:- The grant must still be active and approved for the Client, and must still hold the read scope for the resource type. Without that scope the notification is not sent.
- The destination must still pass the checks above, including DNS resolution to public addresses, and the connection itself refuses non-public addresses.
disabledReason grant_revoked. If the destination stops being safe it is disabled with destination_unsafe. Configure the endpoint again once the cause is fixed.