Webhooks are a powerful mechanism for real-time event-driven integrations, allowing external systems to push updates directly to your endpoints via HTTP POST requests. However, this openness introduces risks: malicious actors could forge requests to inject false data, trigger unauthorized actions, or disrupt your AI workflows.
Signature verification addresses these risks by cryptographically signing each webhook payload with a shared secret, ensuring that incoming requests are authentic, unmodified, and from the trusted source. External systems commonly implement this for high-stakes integrations where data integrity is critical, such as financial transactions (e.g., Stripe), code deployments (e.g., GitHub), or issue tracking (e.g., Jira). By verifying signatures, you prevent spoofing, tampering, and replay attacks, building a secure foundation for any webhook-based integration.
In our platform, signature verification is configured declaratively through a user-friendly UI, abstracting away the underlying cryptography. This allows you to set up robust checks without writing custom code, while supporting a wide range of external systems through flexible data access and configuration options.
At its core, webhook signature verification relies on symmetric cryptography using a shared secret, a private string exchanged between the external system and Agent Studio during webhook registration. This secret acts as a key, ensuring only authorized parties can generate or validate signatures.
X-Signature) or body field.Signatures are generated using HMAC (Hash-based Message Authentication Code), a standard that combines a hash function with the shared secret for keyed authentication. Here’s the theoretical flow:
Sender Side (External System)
Receiver Side (Agent Studio Listener)
HMAC provides integrity (detects alterations) and authenticity (proves the sender knows the secret), but not confidentiality (the payload remains readable). It’s not encryption, it’s a one-way tag that can’t be reversed.
Our UI simplifies setup for webhook listeners, providing a dedicated Verification panel when configuring your Listener. To begin, create or edit a listener for incoming events:
Click on the Verification collapsible and click on ADD NEW to add a verification rule.
Choose Signature Verification in the Validation Type dropdown.

Secret Shared by External System When Registering the Webhook: Enter the shared secret provided by the external system (e.g., during webhook creation in their dashboard). This is masked for security (displayed as asterisks).

Signature Verification Hash Mode: Choose the HMAC variant matching the external system’s documentation. Options include:
Inferred (from header): Automatically detects the algorithm from the signature header.
HMAC-SHA1: For legacy systems (discouraged due to vulnerabilities).
HMAC-SHA256: Recommended default for most modern services, balances security and performance.
HMAC-SHA384 or HMAC-SHA512: For high-security needs, producing longer digests.

Verification Payloads: Specify the data to sign using Moveworks Data Mappers. This field has access to request elements such as:
b'{{"event":"update"{}'). Use this for most cases, as it matches external systems’ raw signing.Verification Received Signature: Point to the field where signature is stored, again via Moveworks Data Mappers. This field also has access to the same request elements Verification Payloads does, some examples on how access the signature verification field:
parsed_body.signature_field | parsed_body["Signature-field"]: For body-embedded signatures.
headers["X-Signature"]

The following diagram visually represents the request verification flow. Color coding:
raw_body and the inferred mode to minimize config.