Webhooks

Rotate the signing secret

POST
/api/v1/webhooks/{id}/rotate-secret

Mints a new signing secret and returns it once. The previous secret keeps verifying for a grace window, and BOTH sign every delivery until it expires — so you can deploy the new one without an outage. Also the recovery path for a lost secret.

Authorization

bearerAuth admin
headerAuthorizationBearer <token>

An API key from the dashboard under Settings → API keys, sent as Authorization: Bearer aem_….

Authorization has two independent axes.

The scope is ranked — a key satisfies any requirement at or below its own tier:

  • read — see messages, contacts and metrics. Changes nothing, and cannot send.
  • write — everything read does, plus managing templates, contacts, automations, segments and suppressions. This is what editing a template needs.
  • admin — everything write does, plus sending configuration: domains, senders, webhook registration, kill switch, daily cap, brand.

There is no approve scope. It was a rung once; it is not one now, and a key requested with it is rejected.

The approval grant (can_approve) is a separate boolean, not a rung. Delivering mail to a real inbox needs write and the grant. Keeping them on separate axes is what makes the review gate a control rather than a convention: a key that may propose is not automatically a key that may approve its own proposal.

Give your application the lowest tier that works. Most need write and the grant — the dashboard mints that combination as Send + manage; Manage only is the same rung with the grant withheld.

Scope: admin

Path Parameters

id*string

Endpoint id.

Request Body

application/json
  1. body
grace_minutes?integer

How long the OLD secret keeps verifying. Both secrets sign every delivery during the window, so you can deploy the new one on your own schedule. Defaults to 1440 (24h); maximum 10080 (7 days). Pass 0 to cut over immediately.

Range0 <= value <= 10080

Response Body

Rotated.

application/json
  1. response
secret?string

The new secret. Shown once.

previous_secret_expires_at?string

After this, deliveries carry only the new signature.

Formatdate-time
Example Request
curl -X POST 'https://sendandretain.com/api/v1/webhooks/string/rotate-secret' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "secret": "string",  "previous_secret_expires_at": "2019-08-24T14:15:22Z"}