Skip to main content

Listeners

Listener Module Overview

The Listener Module allows users to listen, subscribe to, or watch data from configured Data Sources.

note

Each listener is bound to one datasource (datasourceID NOT NULL) and exposes a unique endpointPath per tenant. Webhook ingress is ALL /webhooks/v1/inbound/:tenantID/:pathSuffix and /webhooks/v1/inbound/:listenerID (open CORS, no tenant auth — the path suffix is the secret). Runtime fan-out is Socket.IO rooms listener:<id> / tenant:<id>.

Data Processing Pipeline

Data received through listeners goes through a data pipeline, where the following steps can be added:

  • Pre-processing transformations (in JS)
  • Post-processing steps, such as:
    • Triggering Data queries
    • Triggering Workflows
    • Pushing live data to any widget

Create a listener

Listener Configuration

  1. Click on the Listeners Tab
  2. Click on Add listener button in the right hand side drawer list

image-20260618-095050.png

Listener Configuration Steps

  1. A listener configuration form will appear.
  2. Select your configured data source.
  3. Listener fields will appear in the form which are supported by the data source.
  4. Once all the details are filled, you can click on test to test your query. If your data source is active and sending data, they will appear in console.

image-20260618-095123.png

Pipeline Configuration Steps

  1. Once the listener is configured, you can configure post-ingestion actions & transformations also in the pipeline tab

image-20260618-095153.png

Sample Configuration to Push Data to App Page

This sample configuration demonstrates how to push data to a app page in real-time

image-20260619-063401.png

Sample Config to Trigger Workflow

This configuration snippet demonstrates how to trigger a workflow.

image-20260619-063505.png

Endpoints

Mounted at /api/v1/tenants/:tenantID/listeners:

MethodPathPermissionNotes
GET/status/connectionslistener.listengine connection health
GET/schemaslistener.listper-datasource listener config schemas
GET/listener.listlist (supports ?folderID=)
POST/listener.createcreate; grants creator access
GET/:listenerID/exportlistener.readexport single listener as bundle item
POST/:listenerID/clonelistener.createdeep copy with fresh ID
POST/:listenerID/activate, /:listenerID/deactivatelistener.updatestart/stop ingestion
GET | PUT | DELETE/:listenerIDlistener.read/update/deleteCRUD on one listener
POST | PUT | DELETE/:listenerID/actions[/:actionID]listener.updatepipeline actions: trigger query/workflow, push to widget

Runtime

  • startAllListeners() runs at boot (config/startup.js); events flow through the in-process fastq queue listener.events (+ .dlq), consumed by pipelineWorker. Pre-processing transforms run in isolated-vm.
  • Live delivery is Socket.IO (join_room/leave_room on listener:<id>); app pages subscribe per listener data source. Test consoles use VITE_WEBHOOK_PORT (default 8095) for the displayed URL — see Configuration Reference.