For developers

Signing secret generator

Make a whsec_ webhook signing secret shaped exactly like ours, with its .env line, for testing a local receiver before a real endpoint exists.

Free, no accountIn your browser

Names the .env line below. A new secret is made every time you type, so copy it once the label reads right.

Try

Result

Nothing generated yet

Say what this secret is for and one is made as you type.

What this is

This webhook signing secret generator makes a random whsec_ secret in your browser, shaped the way a real one is, so a local receiver can be tested before a live endpoint exists in the dashboard.

A webhook signing secret only exists so your own endpoint can prove a delivery really carries ResellerHQ's HMAC-SHA256 signature. Every endpoint created in the dashboard gets its own, shown once at creation and never again, in exactly this "whsec_" plus base64 shape - this page reproduces that shape locally so a receiver's parsing code can be built and tested before a real endpoint exists at all.

How to read the result

The secret above is random, made in your browser the moment you type a label, and never sent anywhere - paste it into whatever local script is signing a test payload and verifying against it. The .env line below names its variable off your label, so a project exercising more than one receiver keeps several of these straight instead of one shared variable getting overwritten by the next one generated.

"Verifying one of our webhooks" labels a secret made this way as local-testing-only, the same way this page does, then uses one in its own worked examples of recomputing a signature by hand in bash, Python and Node, and of reading the idempotency key generator's matching output.

Common mistakes

What goes wrong most often, and how to tell.

  • Treating a page-made secret as the real oneA secret generated here only ever exists in this browser tab; it was never sent to ResellerHQ and ResellerHQ never signs a delivery with it, so verifying a genuine delivery against it fails every time, however correctly the verification code itself is written.
  • Losing a secret before it is saved anywhereNothing typed or generated on this page is stored once the tab closes - there is no history to come back to. Copy the secret and its .env line into the project the moment the label reads right, the same way you would the one the dashboard shows exactly once.

Questions

What people ask about this tool.

  • Every secret, real or generated here, is the literal prefix "whsec_" followed by 24 random bytes encoded as base64 - the same convention the wider Standard Webhooks ecosystem uses for a signing key, which is why libraries built against that specification already know what to expect.
  • No. ResellerHQ signs a real delivery with the secret shown once in the dashboard at the moment an endpoint is created, which this page has no way to see or reuse - a secret generated here only ever matches a payload signed with that same value, for a local test receiver.
  • Open Developers in the dashboard and create a webhook endpoint; its signing secret is shown exactly once at that moment, and is the only one ResellerHQ will ever use to sign a delivery to that endpoint - copy it immediately, because the dashboard will not show it a second time.
  • Yes - running "openssl rand -base64 24" on the command line produces the same 24 random bytes, base64-encoded, that this page does; add the "whsec_" prefix afterwards and the result is indistinguishable from what this page generates.

Sources

Every fixed value here comes from the provider’s own documentation. These pages change, so each says the day it was last read.

Use it from the API

The same check, as one request.

Request
curl -X POST https://resellerhq.com/api/tools/signing-secret-generator \
  -H "Content-Type: application/json" \
  -d '{"label":"local-webhook-test"}'
Response
{
  "tool": "signing-secret-generator",
  "input": {
    "label": "local-webhook-test"
  },
  "result": {
    "verdict": {
      "tone": "neutral",
      "headline": "New whsec_ secret for \"local-webhook-test\"",
      "summary": "Made in this browser for local testing - it will never verify a real delivery. The secret ResellerHQ signs with is shown exactly once, in the dashboard under Developers, the moment the endpoint is created."
    },
    "findings": [],
    "parts": [
      {
        "kind": "record",
        "title": "Generated secret",
        "value": "whsec_HZaU+24fVcUcnQybrvOzkQFJUmVHV3aW",
        "note": "For local testing against your own receiver only, as the verdict above says.",
        "copyLabel": "Copy secret"
      },
      {
        "kind": "record",
        "title": ".env line",
        "value": "LOCAL_WEBHOOK_TEST_WEBHOOK_SECRET=whsec_HZaU+24fVcUcnQybrvOzkQFJUmVHV3aW",
        "note": "LOCAL_WEBHOOK_TEST_WEBHOOK_SECRET is built from \"local-webhook-test\", so a project testing more than one receiver keeps each secret under its own name.",
        "copyLabel": "Copy .env line"
      },
      {
        "kind": "record",
        "title": "The same shape from a terminal",
        "value": "openssl rand -base64 24",
        "note": "The same 24 random bytes, base64-encoded, with no browser involved - add the \"whsec_\" prefix yourself.",
        "copyLabel": "Copy command"
      }
    ],
    "limits": [
      "This page cannot create a real webhook endpoint or hand back its real secret; only the dashboard, under Developers, can do that."
    ]
  }
}

Build on the same API this tool is part of: numbers, domains and mailboxes, one key.

Read the API

Company names and logos are trademarks of their owners, shown only to identify each service.