Skip to navigation

A queued review was resolved

Delivered to the webhook URL configured in dashboard Settings when a human resolves a review.

Verify the signature against the raw request bytes. The Portreeve-Signature header carries sha256=<hex>, the HMAC-SHA256 of the exact body we sent, keyed with your webhook secret (whsec_…). If a JSON body parser runs before verification, re-serialised whitespace will make verification fail.

Deliveries retry with backoff until you return 2xx, so your handler must be idempotent — revoking an already-revoked account is a no-op, not an error. Respond 2xx quickly and do slow work (refunds, emails) asynchronously.

Headers

Portreeve-SignaturestringRequiredformat: "^sha256=[0-9a-f]{64}$"

sha256=<hex> — HMAC-SHA256 of the raw request body, keyed with your webhook secret.

Payload

The payload of this webhook request is an object.
type"review.resolved"Required

Always review.resolved. Switch on it rather than assuming — more webhook types will exist.

event_idstringRequired

The id from the original verdict response.

resolutionenumRequired

approved: nothing to do. denied: revoke.

Allowed values:
final_verdictenumRequired

The verdict after resolution. A denial flips the original review to block.

Allowed values:
resolved_atdatetimeRequired
RFC 3339 timestamp of the resolution.
external_user_idstringOptional

The external_user_id from the original event — sent at verdict time or attached later via PATCH /v1/events/{id}. Resolve by this first.

emailstringOptional

The email from the original event, when one was sent. Fallback resolution handle if no external_user_id was ever bound — emails are mutable, so prefer the account id.

Response

200
Acknowledged. Any 2xx stops the retries.