- Trigger an offboarding automation when an employee’s status changes to “Inactive” in Workday
- Revoke sensitive access when a security tool detects a compromised account
- Start an onboarding workflow when a new hire is created in BambooHR
- Grant temporary access when a deployment pipeline needs elevated permissions
How it works
- You create an automation with an Incoming webhook trigger, choosing either HMAC or JWT authentication.
- ConductorOne generates a unique webhook listener endpoint URL.
- Your external system sends authenticated POST requests to that URL with a JSON payload.
- ConductorOne validates the request’s authentication and runs the automation, passing the webhook payload as context data that can be used in automation steps.
Set up an inbound webhook
Choose an authentication method:
- HMAC (recommended for simplicity): ConductorOne generates a shared secret. You use this secret to sign each request.
- JWT: You provide a JWKS URL where ConductorOne can fetch your public keys. You sign each request with your private key.
Save the trigger configuration. ConductorOne generates a Listener ID, which is part of your webhook URL:
Configure your external system to send POST requests to the webhook URL with the appropriate authentication headers. See Send a webhook request for the required headers and format.
Authentication methods
Every inbound webhook request must be authenticated. ConductorOne supports two methods:HMAC authentication
HMAC (Hash-based Message Authentication Code) uses a shared secret to sign requests. This is the simpler option, suitable for most use cases. How it works:- When you configure the webhook trigger, ConductorOne generates a 256-bit secret and provides it as a base64url-encoded string.
- For each request, you compute an HMAC-SHA256 signature over the timestamp, event ID, and request body.
- ConductorOne verifies the signature against the stored secret.
{timestamp}.{event_id}.{body} (the three values joined with periods). Use the secret string exactly as provided (do not base64-decode it) as the HMAC key. Compute HMAC-SHA256, then base64url-encode the result (without padding).
JWT authentication
JWT (JSON Web Token) authentication uses public key cryptography. You host a JWKS (JSON Web Key Set) endpoint, and ConductorOne fetches your public keys to verify request signatures. Supported algorithms: RS256, ES256, EdDSA How it works:- You generate a key pair and host the public key as a JWKS endpoint.
- When you configure the webhook trigger, you provide the JWKS URL.
- For each request, you create a JWT with specific claims and sign it with your private key.
- ConductorOne fetches your JWKS and verifies the JWT signature and claims.
Create and host a JWKS documentFormat your public key as a JSON Web Key Set:Host this document at a stable HTTPS URL (for example, a GitHub Gist raw URL, an S3 bucket, or your application’s
/.well-known/jwks.json endpoint).Configure the webhook triggerIn the automation’s webhook trigger settings, select JWT authentication and enter your JWKS URL.Required JWT claims:
| Claim | Description |
|---|---|
sub | Your ConductorOne tenant base URL (e.g., https://your-tenant.conductor.one) |
aud | The full webhook endpoint URL (e.g., https://your-tenant.conductor.one/api/v1/webhooks/incoming/{listener_id}) |
exp | Token expiration (must be within 10 minutes of the current time) |
jti | A UUID v4 matching the Webhook-Event-Id header |
htm | The HTTP method (POST) |
htb_s256 | Base64url-encoded (no padding) SHA-256 hash of the request body |
Send a webhook request
All inbound webhook requests are HTTP POST requests to:Required headers
| Header | Description |
|---|---|
Webhook-Timestamp | Current Unix timestamp in seconds. Must be within 5 minutes of ConductorOne’s server time. |
Webhook-Event-Id | A UUID v4 that uniquely identifies this event. Used for idempotency. |
Authorization | (JWT auth only) Bearer {jwt_token} |
Webhook-Signature | (HMAC auth only) Base64url-encoded HMAC-SHA256 signature (no padding). |
Content-Type | application/json |
Request body
The body must be valid JSON and cannot exceed 64 KB. The JSON content is passed to the automation as context data, accessible in automation steps and CEL expressions.Response codes
| Code | Meaning |
|---|---|
200 | Request accepted and automation triggered. |
400 | Invalid request (missing headers, bad timestamp, invalid JSON, etc.). |
401 | Authentication failed (invalid signature, expired JWT, missing auth header). |
403 | Source IP not in the allowed CIDR list (if IP restrictions are enabled). |
409 | Duplicate event ID. The event was already processed. This is not an error; it indicates idempotency protection. |
Curl example
Here’s a minimal example using curl with HMAC authentication:Security features
Inbound webhooks include several layers of protection against replay attacks and unauthorized access.Idempotency
Each request includes aWebhook-Event-Id header with a UUID v4. If ConductorOne receives a second request with the same event ID for the same listener, it returns a 409 response and does not re-run the automation. Event records are retained for 7 days.
Timestamp validation
TheWebhook-Timestamp header must be within 5 minutes of the current server time. This prevents replay attacks where a captured request is resent later.
IP restrictions
You can optionally restrict inbound webhooks to specific source IP ranges by configuring allowed CIDRs on the webhook listener. Requests from IPs outside the allowed ranges are rejected with a403 response.
Body integrity
Both authentication methods verify the integrity of the request body:- HMAC: The body is included in the HMAC signature input, so any modification invalidates the signature.
- JWT: The
htb_s256claim contains a SHA-256 hash of the body, verified by ConductorOne.
Use webhook data in automation steps
The JSON body from the webhook request is available as context data within the automation. You can reference webhook payload fields in CEL expressions used in automation steps. For example, if your webhook sends:ctx.trigger.employee_id and ctx.trigger.department (or if you prefer the map access format, use: ctx.trigger["employee_id"] and ctx.trigger["department"]).
Troubleshooting inbound webhook error codes
| Issue | Possible cause | Solution |
|---|---|---|
401 Unauthenticated | HMAC signature mismatch | Verify the signature format: {timestamp}.{event_id}.{body}. Ensure the secret matches and use base64url encoding without padding. |
401 Unauthenticated | JWT verification failed | Check that your JWKS URL is accessible, the kid in the JWT matches a key in the JWKS, and all required claims are present. |
400 Invalid timestamp | Timestamp out of range | Ensure Webhook-Timestamp is within 5 minutes of the current UTC time. Check for clock skew on your sending system. |
400 Invalid event ID | Event ID format error | The Webhook-Event-Id must be a valid UUID v4. |
409 Already exists | Duplicate event | This event ID was already processed. Generate a new UUID for each webhook request. |
403 IP restricted | Source IP not allowed | Check the CIDR restrictions configured on the webhook listener. |
| Automation doesn’t run | Automation not published | Verify the automation is in a published state and the trigger toggle is enabled. |