AccessOwl signs every webhook request using RFC 9421 HTTP Message Signatures. The signing scheme used is Ed25519 (asymmetric). Each request includes three headers you can use for verification:Documentation Index
Fetch the complete documentation index at: https://docs.accessowl.com/llms.txt
Use this file to discover all available pages before exploring further.
| Header | Description |
|---|---|
Content-Digest | SHA-512 hash of the request body, formatted as sha-512=:BASE64: |
Signature-Input | Describes which request components were signed, the creation timestamp, and the key ID. Example: sig=("@target-uri" "content-digest" "content-type" "idempotency-key");created=1718884473;keyid="whsec_abc123" |
Signature | The actual signature over the covered components, formatted as sig=:BASE64: |
Signature-Input matches the whsec_... identifier shown in Settings → Webhooks, where you can also retrieve the public key to verify signatures.
Constructing the signature base
To verify the signature you must reconstruct the same signature base that AccessOwl signed. The procedure follows RFC 9421 §2.5:- For each component listed in
Signature-Input, in order, emit one line formatted as: - Append a final line using the exact string value of the
Signature-Inputheader: - Join all lines with a single newline character (
\n). There is no trailing newline.
@target-uri, content-digest, content-type, idempotency-key.
Example signature base:
@target-uri from the full request URL (including scheme and path) and content-digest directly from the Content-Digest request header. Once assembled, verify the Signature header value against this base using the Ed25519 public key for your webhook endpoint, which is available in Settings → Webhooks.
We recommend using an HTTP Message Signatures library for your language rather than implementing RFC 9421 verification from scratch.
Manual verification
If you prefer not to use a library, the examples below show how to verify signatures manually using standard cryptographic libraries.Setup
The public key from Settings → Webhooks is provided as a JWK. Base64-encode it and set as an environment variable:Verification function
Security considerations
HTTPS required: The examples construct@target-uri with https://. AccessOwl only delivers webhooks to HTTPS endpoints. If you’re behind a reverse proxy, ensure the Host header reflects your public hostname.
Content-Digest verification: The signature covers the Content-Digest header, but you may also want to independently verify that the digest matches the actual request body to detect any tampering between signature generation and delivery.
Replay protection: The Signature-Input header includes a created timestamp. Consider rejecting requests where this timestamp is more than a few minutes old to prevent replay attacks.
Test vectors
Use these values to validate your implementation:true for these inputs.
