Skip to main content
v2 delivers events to HTTPS endpoints you register with POST /v2/webhook-endpoints. Deliveries are signed with an HMAC secret so you can verify they came from PickFu.

Managing endpoints

The /v2/webhook-endpoints resource is a standard CRUD collection under the write scope for mutations and read for reads.

Create

POST /v2/webhook-endpoints with { url, enabledEvents } returns the endpoint and the signing secret — this is the only time the secret is returned. Store it before you exit the response.

List and read

GET /v2/webhook-endpoints (cursor-paginated) and GET /v2/webhook-endpoints/{id}. Neither includes the signing secret.

Update

PATCH /v2/webhook-endpoints/{id} changes the URL or the subscribed events.

Delete

DELETE /v2/webhook-endpoints/{id} stops all deliveries to that endpoint.
Endpoint IDs are prefixed whk_…. Each team may register up to 10 endpoints.

Events

Delivery envelope

Every delivery has the same shape:
id is stable across retries of the same occurrence — use it to dedupe. Reply with any 2xx status within your timeout to acknowledge; a non-2xx or timeout is retried.

Verifying the signature

Every delivery carries an X-PickFu-Signature header:
  • t is the unix timestamp (seconds) the delivery was signed.
  • v1 is the hex-encoded HMAC-SHA256 of <t>.<raw-body> using the signing secret returned when you created the endpoint.
Verify every delivery:
  1. Reject requests missing X-PickFu-Signature.
  2. Reject requests whose t is more than a few minutes off the current time (protects against replay).
  3. Recompute HMAC_SHA256(secret, t.{t}.) and compare to v1 with a constant-time comparison.

Node.js example

Verify against the raw request body (bytes on the wire), not the parsed JSON. Re-serialising the parsed body will change whitespace, key order, or number formatting and break the signature.

Retries and ordering

  • Retries. Non-2xx responses and timeouts are retried with backoff. The envelope id stays the same across retries, so idempotent processing keys off id.
  • Ordering. Deliveries are best-effort in-order per endpoint but not strictly ordered — always trust createdAt and the current resource state in data.object over delivery order.
  • Rotating the secret. Delete the endpoint and create a new one. The signing secret is only ever returned at creation time.