
Early Access
Key Features:
Module-level property storage – Store configuration data at both the cloud and agent levels.
Widget support – Collect client-specific configurations using widgets in both cloud and agent environments.
Task metadata and validation – Define payload structures and validate task input parameters before execution.
This zip file is used while creating a custom module by attach in the Source File field while configuring a new custom module.
Refer to the Types of Custom Module section for the sample Java classes.

Your main class in custom module implementation is expected to extend the interface according to the custom module type (JAR, REST API Sevice, SOAP Service).
If the custom module has to return a response, it should be a JSON Object.
In Qntrl, in the Custom Module page, click New Custom Module.
Fill in the following details:
Service: Select a service from the dropdown.
Module Name: Enter a unique name to identify the module.
Link Name: Provide an identifier for the module. This name is used for reference in Bridge.
Type: Select the application type for your custom module. Options include:
JAR
REST API Service
SOAP Service
Credential Module
Description: Briefly describe the module’s purpose.
Meta Validation: Select this checkbox to validate the JSON payload used for executing the module through Messages.
Main Class Name: Enter the class name with its package path (e.g., packageName.className).
Attachments: Upload the ZIP file containing your JARs created using the SDK interface.
Click Save.
The module page includes three main sections:
Module Overview: View and configure module details and properties.
Settings: Displays configuration widgets linked to the module. You can view or update these as needed.
Task Meta: Available for JAR-type modules. Defines the payload JSON used to validate incoming payloads or generate form builders. Refer to the Task Meta section for more details.
The Task Meta section appears in the Custom Module page only when the module type is set to JAR.Click the Module Overview section of the selected module. The details of the chosen custom module are displayed here, allowing you to configure and manage its properties.
This section displays the details of the created module, including its deployed version, which can be updated as needed.
Upload the JAR file generated from the SDK (if applicable).
The uploaded JAR becomes active automatically.

Limitations:
A maximum of three ZIP files can be attached.
Only one JAR file can be active at a time.
When a new JAR is activated, previously active files become inactive, and the new one is automatically deployed.
Create widgets to collect module-specific properties using custom forms. These widgets appear as configurable menus in either the Bridge Agent or Qntrl Cloud interface.
To create a new menu widget:
Click New Settings Menu.
Provide the following details:
Name: Enter a name for the menu.
Location: Choose where the menu should appear:
Bridge Agent – Listed under the Configuration section in the Bridge Agent.
Bridge Cloud – Listed under Settings tab in the Custom Module.
Click Save to create the widget.
The Publish button turns green when unpublished changes exist.To manage widgets, hover over the widget name, click the action menu (⋮), and choose Disable or Delete.
Displays the bridges linked to this module.
When a new JAR is activated, it is automatically deployed to the associated bridge.
If deployment doesn’t occur automatically, click Deploy to deploy and update the bridge manually.
Open your Custom Module.
Navigate to the Task Meta section.
Click Create Task Meta.
Provide the following details:
Name: A unique name for the Task Meta.
Description: A short explanation of what the task does.
Choose one of the schema creation methods:
Payload (auto-generate): Use this option when you already have a sample payload.
Give your sample payload JSON and click Generate.
The right panel automatically generates a JSON schema based on the structure.
Review the schema and click Create to save it.
This method is ideal when the payload structure is known and consistency is required.
Custom (manual schema creation): Use this when you want full control over the JSON schema or already have a predefined schema.
Directly enter or paste your JSON schema.
Click Create to save.
Click any Task Meta to open its details.
The following actions can be done:
Edit Description : Use the edit icon to modify the description.
Edit Schema : In the editor section, update the JSON schema as needed.
Delete Task Meta : Click the delete icon at the top to remove the entire Task Meta definition.
Version : Each Task Meta maintains version history. Every update creates a new version. Use the Version dropdown to switch between versions.
Download Current Version: Downloads the current version.
Delete Current Version: Delete the version that is currently selected. Latest version cannot be deleted, since it is used for validation.
Sample Payload : Use the Sample Payload dropdown to view the sample payload derived from the schema. This helps users understand the correct format when sending inputs to the Bridge task.
Once changes are done click Save as New Version.

Below is an example schema defining the payload for an SSH task:
{"$schema": "https://json-schema.org/draft/2020-12/schema#","type": "object","properties": {"task_name": {"type": "string","default" : "ssh_task"},"credential": {"type": "object","properties": {"name": {"type": "string"}}},"task_details": {"type": "object","properties": {"host": {"type": "string"},"command": {"type": "string"}}}}}
Before executing a custom module, it must first be associated with the target bridge. Upon association, the custom module's JAR file is automatically uploaded to the target bridge.
To associate the created custom module with the bridge:
In Qntrl, click the settings gear icon at the bottom of the left pane.
Navigate to Advanced >> Bridge, then choose Bridge.
In the Bridge list page, click on the name of the bridge to which the custom module needs to be associated.
The selected bridge details will be displayed. Under the Modules tab, click Associate Modules, and from the displayed list of modules select the name of the custom module you wish to associate with the bridge.
Click Save.
To execute your custom module task:
Refer to the Messages section to learn how to create and run a message in Bridge.
While creating a new message, choose your custom module and select the appropriate task from the task list, then execute it.
Your main class in custom module is expected to extend the JarModule interface and override the request method.
//$Id$ package zylker; import org.json.JSONObject; import com.zoho.qntrl.bridge.sdk.module.jar.JarModule; public class SupplyMonitor extends JarModule { @Override public void request(JSONObject arg0) throws Exception { int byteCount = arg0.getInt("byteCount"); int units = arg0.getInt("units"); JSONObject result = new JSONObject(); result.put("load", byteCount * units); response(result); } }
Support for REST API services in custom modules allows end users to develop their own REST API modules in their preferred format. Upon deployment, these REST API endpoints will be published on the Bridge server.
REST API Service Classes
Classes and their purposes for implementing the REST API Service are detailed below:
Configuration Class:
Contains the module's base path and the authenticator's class instance.
Implements
com.zoho.qntrl.bridge.sdk.module.rest.RestServiceModule
Override Methods
➤ getModuleBasePath()
Should return the module's base path used to construct the REST API Url.
➤ getServiceAuthenticatorClassInstance()
Should return the authenticator's class instance.
Users must implement their authentication methodology.
Implements com.zoho.qntrl.bridge.sdk.module.rest.RestServiceAuthenticator
Override Methods
authenticate (HttpServletRequest, HttpServletResponse)
Request and response instances of the triggered API's are passed as arguments. If the request is authenticated and valid, the respective method implementation will be called; otherwise, it returns the error message as "User is not authorized".
i. RESTContoller: Marks the class as a REST API controller, which can also be mentioned as an entity. In the future, for OAuth 2, scope will be mapped in the controller.
Type - Class Annotation
Fields
basePath - Maps the controller with the base path; it should not have the same base path. It provides provision to retrieve the global metadata of the controller using the URL. No validation is done. If the same base path is used, it will be added to the rest module configuration file, and whichever returns first will be executed.
ii. RequestDetails: Identifies the method to invoke for the URL. The URL's method and path will be retrieved using it.
Type - Method Annotation
Fields
method - The request method name should be provided (mandatory).
path - The path URL should be mentioned. It's not mandatory as the base path will be provided in the controller, and for basic CRUD operations, it's enough.
To generate a ZIP file:
Generate the class files along with the parameter names stored with it. The parameter name will be used to fetch the value from the request's parameter or header.
Create a JAR file using those class files and then ZIP the JAR file.
Global Info
Users can retrieve the global information of the module and controller using the following endpoints.
Support for SOAP services within Custom Modules allows end users to create their own SOAP service custom modules in their desired format. Upon deployment, these SOAP service endpoints will be made available on the Bridge server.
Upon deployment in the Bridge server, SOAP service endpoints are retrieved from the main class getEndpoint() method.
Endpoint URLs must begin with /soap.
SOAP Module Configuration File:
Configuration details of SOAP modules are stored in the soap_modules.xml file, which is loaded during server startup.
If a new version is updated in Qntrl, existing URLs related to the module in the configuration file will be deleted and replaced with the endpoints retrieved from the new version.
Upon module deletion in Qntrl, corresponding module details are removed from the configuration file.
Implementation:
To create a SOAP service module, you need to implement the SoapServiceModule interface in the main class. Below is an example of the main class and a SOAP endpoint.
SampleSoapServiceModule.java
import com.zoho.qntrl.bridge.sdk.module.soap.Endpoint; import com.zoho.qntrl.bridge.sdk.module.soap.SoapServiceModule; import java.util.Arrays; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; public class SampleSoapServiceModule implements SoapServiceModule { private static final Logger LOGGER = Logger.getLogger(SampleSoapServiceModule.class.getName()); @Override public void serviceStarted(Endpoint endpoint) { LOGGER.log( Level.INFO, "service {0} - {1} is started", new Object[]{endpoint.getName(), endpoint.getUrlPattern()} ); } @Override public List<Endpoint> getEndpoints() { return Arrays.asList( new Endpoint( "SampleSoapService", SampleSoapService.class.getName(), "/soap/sample" ) ); } @Override public void serviceStopped(Endpoint endpoint) { LOGGER.log( Level.INFO, "service {0} - {1} is stopped", new Object[]{endpoint.getName(), endpoint.getUrlPattern()} ); } @Override public void moduleUnregistered() { LOGGER.log(Level.INFO, "sample soap service module got removed"); } }
import javax.jws.WebMethod; import javax.jws.WebService; @WebService public class SampleSoapService { @WebMethod(operationName = "SayHello") public String sayHello(String name) { return "Hello " + name + "..!"; } }
To view or update a custom module properties:
Navigate to(settings) >> Advanced >> Bridge, then select Custom Module.
On the module list page, click the name of the module you want to edit.
The module details page opens, where you can view or modify its properties.
After making the necessary changes, click Save to apply them.
If the newly added JAR file is not deployed to the bridge by default, you can forcefully deploy and update by clicking on the Deploy button.To remove a custom module from Bridge,
Navigate to(settings) >> Advanced >> Bridge, then select Custom Module.
Hover over the name of the module you want to delete, click the action menu, and select the Delete.
Confirm the Delete action.
You are currently viewing the help articles of Qntrl 3.0. If you are still using our older version and require guidance with it, Click here.