heruAPI
Webhooks

Rotate the signing secret

BuildingIn development for the v1 API. The contract is set; the route is not served yet.

POST
/webhooks/{id}/secret

Mints a new secret and answers it once. The previous secret keeps signing for expires_previous_in (24 hours by default, 7 days at most), so every delivery carries two v1 signatures meanwhile and you can switch without missing an event; 0s retires it at once. Never more than two secrets sign: a second rotation inside the overlap retires the oldest. At most 5 rotations per hour per subscription. No Idempotency-Key: every call rotates.

Needs the webhooks:write scope.

Authorization

oauth2 webhooks:write
headerAuthorizationBearer <token>

OAuth 2.0 client credentials. Exchange your client_id and client_secret at /oauth/token of the environment for a bearer token valid for one hour. The playground of every operation asks for your own client and keeps it in your browser tab only.

Scope: webhooks:write

Path parameters

id*string

The subscription id.

Match^whk_[0-7][0-9a-hjkmnp-tv-z]{25}$

Request body

application/json
  1. body
expires_previous_in?string

How long the previous secret keeps signing. Both signatures are sent meanwhile; 0s retires it at once. A duration such as 24h, 0s or 168h; at most 168h.

Default"24h"

Response body

The subscription with its new secret. Store it: it is never shown again.

application/json
  1. response
id*string
Match^whk_[0-7][0-9a-hjkmnp-tv-z]{25}$
url*string
Formaturi
description*string
event_types*array<string>
merchant_ids*array<>
status*string

active delivers; paused you set it and deliveries wait; disabled heru set it (see disabled_reason) and deliveries wait until you send status: active.

Value in"active""paused""disabled"
disabled_reason*|null
disabled_at*|null
headers*array<>
secret?string

Only in the answer of POST /webhooks and POST /webhooks/{id}/secret. Store it: it is never shown again.

Match^whsec_[A-Za-z0-9_-]{43}$
secret_last4*string
secret_rotating_until*|null
consecutive_failures*integer

Failed deliveries in a row. A 2xx resets it to zero.

failing_since*|null
environment*string
Value in"sandbox""production"
created_at*string
Formatdate-time
updated_at*string
Formatdate-time
deliveries*

Where the delivery log of this subscription is.

curl -X POST 'https://api.dev.b2b.heru.app/v1/webhooks/whk_01m53g5zw414zt6vg08fqbacgm/secret' \  -H 'Content-Type: application/json' \  -d '{  "expires_previous_in": "24h"}'
{  "id": "whk_01m53g5zw414zt6vg08fqbacgm",  "url": "https://partner.example.com/heru/webhooks",  "description": "POS production",  "event_types": [    "invoice.stamped",    "charge.invoiced"  ],  "merchant_ids": [    "mer_01m4ra8wsyfh3s0tr4nrq3y96j"  ],  "status": "active",  "disabled_reason": null,  "disabled_at": null,  "headers": [    {      "name": "X-Partner-Token",      "value": "****abcd"    }  ],  "secret": "whsec_9vPq2zL0rXk4T8nWbYc1mAe6HdJfSg3uKoRiQtVxZ7w",  "secret_last4": "xZ7w",  "secret_rotating_until": "2026-10-27T15:04:41.000Z",  "consecutive_failures": 0,  "failing_since": null,  "environment": "production",  "created_at": "2026-10-25T12:00:00.000Z",  "updated_at": "2026-10-26T15:04:41.000Z",  "deliveries": {    "path": "/v1/webhooks/whk_01m53g5zw414zt6vg08fqbacgm/deliveries"  }}
© 2026 Kuarto Inc. (heru)heru.appQuestions about your integration? Contact your heru account team.