Webhooks Migration
Whatβs Changing
Event types now use the new resource names:
Payload structures also change to match the new API schemas and are documented in the API Reference.
Step-by-Step Migration
This migration pattern allows you to test the new webhook format while keeping your existing integration working, with the ability to rollback at any point.
Step 1: Create a New Webhook Endpoint (Disabled)
In the Extend dashboard, create a new webhook endpoint:
The query parameter lets your code distinguish between events from the old and new endpoints.
State after Step 1:
Step 2: Deploy Code to Ignore New Events
Update your webhook handler to acknowledge but ignore events from the new endpoint:
TypeScript
Python
Java
Then enable the new webhook endpoint in the dashboard.
State after Step 2:
This lets you verify:
- New endpoint is receiving events
- Payload format matches documentation
- No errors in basic parsing
Step 3: Deploy Code to Process New Events
Update your handler to process new events and reject old ones:
TypeScript
Python
Java
Return 400 for old events. This causes Extend to retry delivery. If you need to rollback, those events will be re-delivered when you revert your code.
State after Step 3:
Step 4: Monitor and Validate
Monitor your new webhook processing for:
- Processing errors
- Unexpected payload formats
- Business logic correctness
If issues arise:
- Revert to Step 2 code (ignore new, process old)
- Temporarily disable the new webhook endpoint
- Old endpoint will process the retried events (because you returned 400)
- Investigate and fix issues
- Re-enable new endpoint and resume from Step 3
Step 5: Disable the Old Webhook Endpoint
Once youβre confident in the new endpoint:
- Disable the old webhook endpoint in the dashboard
- Remove the version check from your code
- Clean up old event processing logic
State after Step 5:
SDK Webhook Helpers
The SDK includes utilities for verifying signatures and parsing events with type-safe payloads:
TypeScript
Python
Java
Available Methods
Handling Signed URL Payloads
For large payloads (e.g., workflow runs with many documents), Extend delivers webhooks with a signed URL instead of the full payload. This keeps webhook delivery fast and reliable.
By default, verifyAndParse() throws an error if a signed URL payload is received. To handle these, opt-in with allowSignedUrl:
TypeScript
Python
Java
Signed URLs expire after 1 hour. Fetch the payload promptly.
All Event Types
Use the eventType field for type-safe payload access:
Security Best Practices
- Always verify signatures β Never skip verification in production
- Use environment variables β Store your webhook secret securely
- Use raw body β Parse the body as a string before verification
- Implement idempotency β Use
eventIdto handle duplicate deliveries - Respond quickly β Return 200 before heavy processing
TypeScript
Python
Java
Need Help?
If you encounter any issues while migrating your webhook handlers, please contact our support team at support@extend.app.

