Webhook Security
Secure your webhook integrations and protect against unauthorized requests.
Overview
Runframe webhooks use unique URLs to authenticate requests. Each webhook has a unique ID that acts as a shared secret between your system and Runframe.
Webhook URLs
URL format
https://api.runframe.io/webhooks/custom/{WEBHOOK_ID}
The WEBHOOK_ID is a cryptographically secure random string that:
- Uniquely identifies your webhook
- Acts as an authentication token
- Cannot be guessed or brute-forced
Getting your webhook URL
- Navigate to Settings → Webhooks
- Click New Webhook
- Runframe generates a unique webhook URL
- Copy the URL – it won’t be shown again in full
Protect webhook URLs like passwords
Anyone with the webhook URL can create incidents in your organization. If a URL is exposed, revoke and regenerate it immediately.
Best practices
1. Store securely
Do:
- Store in environment variables
- Use secret management tools (AWS Secrets Manager, HashiCorp Vault)
- Encrypt in configuration files
- Restrict file permissions (chmod 600)
Don’t:
- Don’t commit to git
- Don’t hardcode in scripts
- Don’t share in chat or email
- Don’t include in client-side code
Example: Environment variable
# .env file
RUNFRAME_WEBHOOK_URL=https://api.runframe.io/webhooks/custom/wh_abc123...
import os
webhook_url = os.environ['RUNFRAME_WEBHOOK_URL']
2. Use HTTPS only
Webhook URLs only work over HTTPS. Plain HTTP requests are rejected.
3. Rotate periodically
Regularly regenerate webhook URLs:
- Navigate to Settings → Webhooks
- Click Regenerate URL on your webhook
- Update your tools with the new URL
- Test the new URL
- Old URL is immediately invalidated
Recommended rotation:
- Every 90 days for production integrations
- After any suspected exposure
- When team members with access leave
4. Monitor usage
Regularly review webhook delivery logs:
- Navigate to Settings → Webhooks
- Click on your webhook
- View delivery history and error logs
Look for:
- Unexpected spikes in requests
- Failed deliveries
- Requests from unknown IPs
IP whitelisting
Restrict webhook requests to specific IP ranges.
Enabling IP whitelist
- Navigate to Settings → Webhooks
- Edit your webhook
- Add allowed IP ranges in CIDR notation:
- Single IP:
192.168.1.100 - IP range:
192.168.1.0/24 - Multiple ranges:
192.168.1.0/24, 10.0.0.0/16
- Single IP:
- Save changes
Common use cases
| Scenario | Example IPs |
|---|---|
| Datadog webhooks | Check Datadog documentation for their IP ranges |
| AWS services | Use AWS IP ranges via AWS IP ranges API |
| Office network | Your office’s public IP address |
| VPN/proxy | Your VPN exit node IPs |
IP whitelisting is optional but recommended
IP whitelisting adds a layer of security but requires updating IP ranges if they change. Use it for high-security environments.
Testing security
Verify IP restrictions
Test from an allowed IP:
curl https://api.runframe.io/webhooks/custom/wh_abc123... \
-X POST \
-H "Content-Type: application/json" \
-d '{"title": "Test from allowed IP"}'
Test from a disallowed IP (should fail):
# From a different IP
curl https://api.runframe.io/webhooks/custom/wh_abc123... \
-X POST \
-H "Content-Type: application/json" \
-d '{"title": "Test from blocked IP"}'
Verify URL uniqueness
Each webhook URL is unique. Test that one webhook’s URL doesn’t work for another:
# Use Webhook A's URL
curl https://api.runframe.io/webhooks/custom/wh_abc123... \
-X POST \
-H "Content-Type: application/json" \
-d '{"title": "Test"}'
# Try using Webhook B's URL with same payload
curl https://api.runframe.io/webhooks/custom/wh_def456... \
-X POST \
-H "Content-Type: application/json" \
-d '{"title": "Test"}'
Both should succeed, creating separate incidents.
Revoking webhooks
Immediate revocation
If a webhook URL is exposed:
- Navigate to Settings → Webhooks
- Click Revoke on the compromised webhook
- Confirm revocation
- The webhook URL is immediately invalidated
All requests to the revoked URL will fail with:
{
"success": false,
"error": {
"code": "WEBHOOK_REVOKED",
"message": "Webhook has been revoked"
}
}
After revocation
- Create a new webhook with a fresh URL
- Update your monitoring tools with the new URL
- Test the new integration
- Monitor for continued suspicious activity
Audit logging
Runframe logs all webhook deliveries for security auditing:
| Field | Description |
|---|---|
| Timestamp | When the request was received |
| Source IP | IP address of the requester |
| User agent | Client making the request |
| Payload | Incident data sent (optional logging) |
| Response | Success or error |
View logs in Settings → Webhooks → View Logs.
Need more?
- Webhooks – Creating and configuring webhooks
- Integrations – Pre-built Datadog, Sentry, and Prometheus guides
- Web Dashboard – Webhook management UI