Set Up Webhooks to Receive Real-time Updates
This topic explains how to set up webhooks to receive real-time updates for specific events. Refer View Webhook Events List to view the list of events for which notifications can be sent. Setting up a webhook to start receiving notifications in your application involves the following steps:
- Identify the events you want to monitor and the event payloads you want to parse.
 - Create a webhook endpoint as an HTTP endpoint (URL) on your backend application. Creating a webhook endpoint is no different from creating any other API route on your backend. It's an HTTP or HTTPS endpoint on your server with a URL. You can use a single endpoint to handle multiple event types at once, or you can set up individual endpoints for specific events.
 - Handle requests from Dyte by parsing each event object and returning 2xx response status codes.
 - Deploy your webhook endpoint so it's a publicly accessible HTTPS URL.
 - Register your publicly accessible HTTPS URL using the Dyte developer portal or Webhook APIs.
 
Step 1: Identify the events to monitor​
Use the events overview guide to identify the events your webhook endpoint needs to parse.
Step 2: Create a webhook endpoint​
Set up an HTTP endpoint that can accept webhook requests with a POST method. For example, this route in express is a map to a Node.js webhook function.
const express = require('express');
const app = express();
app.post('/webhook', express.json({ type: 'application/json' }), (req, res) => {
  const event = request.body;
  // ... do further processing
});
Step 3: Handle requests from Dyte​
Your endpoint must be configured to receive events for the type of event notifications you want to receive. Dyte sends events to your webhook endpoint as part of a POST request with a JSON payload.
Register your Endpoint​
You can register your endpoint as a webhook and listen for specific events using our dev portal or by making an API request. For example, to receive all events, you can make a request like:
curl --location --request POST 'https://api.dyte.io/v2/webhooks' \
--header 'Authorization: Basic WRiOmQyNzBmYjJmOGNiNGUzZWY1MGI1' \
--header 'Content-Type: application/json' \
--data-raw '{
    "name": "All events webhook",
    "url": "<your endpoint here>",
    "events": [
        "meeting.started",
        "meeting.ended",
        "meeting.participantJoined",
        "meeting.participantLeft",
        "recording.statusUpdate",
        "livestreaming.statusUpdate"
    ]
}'
For more information, check out the webhooks API reference.
Check for dyte-uuid Header​
Each webhook will have a unique value for the dyte-uuid header. You can use
these to ensure you don't process any retries.
Return a 2xx Response​
Your endpoint must quickly (within 3 seconds) return a successful status code (2xx) prior to any
complex logic that could cause a timeout.
app.post('/webhook', express.json({ type: 'application/json' }), (req, res) => {
  const event = request.body;
  // ... do further processing
  res.status(200).send();
  // ... perform heavy tasks
  return;
});
Built-in Retries​
Dyte webhooks have built-in retry methods for 3xx, 4xx or 5xx response
status codes. If Dyte doesn't receive a 2xx response status code for an event within 3 seconds,
we mark the event as failed and retry up to 5 times.
Step 4: Secure your webhooks (recommended)​
Use webhook signatures to verify that Dyte generated a webhook request and that it didn't come from a malicious server pretending to be Dyte.
Sample code​
- Node.js
 
const express = require('express');
const app = express();
app.post('/webhook', express.json({ type: 'application/json' }), (req, res) => {
  // verify signature
  // ...
  // parse event body
  switch (req.body.event) {
    case 'meeting.participantJoined':
      const { meeting, participant } = req.body;
      // Then define and call a method to handle the joined participant
      // handleParticipantJoined(meeting, participant);
      break;
    case 'recording.statusUpdate':
      const { meeting, recording } = req.body;
      // Then define and call a method to handle the recording status update
      // handleRecordingUpdate(meeting, recording);
      break;
    // ... handle other event types
    default:
      console.log(`Unhandled event type ${event.type}`);
  }
});
app.listen(8000, () => console.log('Running on port 8000'));
Step 5: Register your HTTPS URL​
Register your publicly accessible HTTPS URL using the Dyte developer portal or Webhook APIs.