A Listener serves as Moveworks’ receiver for incoming webhook requests from external systems. It validates these requests, transforms them into events, and triggers associated plugins to execute automations. Each listener generates a unique Webhook URL, which you configure in the provider system (e.g., GitHub, Workday, or DocuSign) to send events.
For an end-to-end setup, including creating a listener, refer to the Webhook Triggers Quickstart Guide.
The maximum payload size for a request received by a listener is 1 MB. If a request exceeds this limit, the payload body will not be available for processing — filters, debounce keys, and publish mappings that reference the body will not have access to it.
Secure your listener to ensure only authorized providers can send requests, preventing unauthorized access and enabling higher rate limits for production use.
Rate limits are organization-wide, not per listener. The 50 req/s limit for secured listeners is shared across all listeners in your org. If you have multiple listeners receiving events simultaneously, plan your throughput accordingly to stay within this combined limit.
Moveworks supports multiple methods to verify incoming requests:
If verification fails, Moveworks rejects the request with a 401 Unauthorized response and logs an ErrorSignatureVerificationFailed error.
When Enable Credential Verification is selected, every webhook request to a Moveworks listener must include authentication. You can authenticate using either an API Key or an OAuth2 Client Credentials token generated in Moveworks Setup → Credentials → Create.

API Key Credentials
Include your Moveworks API key as a Bearer token in the Authorization header of your webhook request:
Example (curl):
OAuth2 Client Credentials
Obtain an access token by making a request to the Token URL with your Client ID and Client Secret:
client_credentialsRequest (curl):
Response:
Use the returned access_token as a Bearer token in the Authorization header when calling your listener:
Use Rule-based checks to assert properties about the incoming request. These are great as additional guardrails (e.g., anti-replay, header presence, content-type) and as a fallback for providers that don’t sign payloads. Rule-based checks do not replace signature verification.
In the Moveworks Listener UI: Verification section → Add New → Validation Type: Rule-based → paste one of the expressions below. Add multiple rules with Add New; all rules must pass.
$TIME() - $INTEGER(headers["x-slack-request-timestamp"]) <= 60 * 5
$LOWERCASE(headers["content-type"]) == "application/json"Learn more about org-level settings regarding whether unsecured listeners can be used in Security and Privacy Settings > Webhook Listener Security.
Apply listener-level filters to drop irrelevant events (e.g., process only issues.opened events). Filters evaluate headers, query parameters, or payload fields to accept or reject requests before event creation.
To understand how to use the DSL filters here let’s start with an example payload. Suppose we’re listening to a Jira webhook for newly created issues. The log might look like this for an incoming request:
Moveworks represents the entire incoming HTTP request as a structured object. Given that, that the DSL paths you’ll reference:
parsed_body → the parsed JSON payload (most typical)headers → all HTTP headersquery_params → any query string valuesraw_body → the unparsed body string (you likely will not use this)Below are some specific event filter examples but see our full DSL Reference for more details on the syntax for MW DSL and other common examples.
parsed_bodyOnly process newly created issues
Only open issues
High-priority tickets only
Tickets assigned to a specific user
Only tickets from the Engineering project
Filter by creation date (last 7 days)
headersWhy use headers?
Require a Jira delivery ID for traceability
Block specific sender agent
High-priority, open issues in ENG project only
Env = prod AND summary contains “security”
Why filter at the Moveworks listener-level at all? Some webhook providers can’t pre-filter events. If that is the case, listener event filters in Moveworks eliminate noise and keep downstream config simple.
Redact secrets and PII from webhook logs. Use this to hide auth headers or sensitive fields while retaining enough context to debug
Prevent retries or duplicate sends from triggering the same workflows.
How it works You choose one or more Key Paths. For each request, Moveworks reads those fields from the incoming payload (in order), concatenates the values, and hashes them to form a dedup key. If the same key is seen again within the configured window, the request is dropped as a duplicate.
Use deduplication with Verification (HMAC + optional timestamp rule). HMAC proves origin/integrity; dedup protects against provider retries and benign replays.
parsed_body). Choose fields that uniquely and stably identify the event across retries.
Tip: Prefer a single provider-supplied event ID (or delivery ID) if available. If the provider does not supply one, combine a small set of fields that together make the event unique (e.g.,
action+issue.id+repository.full_name).
Below, enter the Key Paths exactly as shown (one per row). Then pick a sensible Window.
Slack (Events API)
event_id at the top level of the Events API payload.ServiceNow (example: Incident updates)
sys_id with the event type you’re subscribing to.Zoom (Event Notifications)
Do
Don’t