
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.
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.
The module will be listed under the Associated Modules section of the Bridge page only if both the Main Class Name and the JAR ZIP file are provided during creation.The module page includes three main sections:
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 activates 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 there are unpublished changes. 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.
Click any Task Meta to open its details.
The following actions can be done:

The following is a sample Task Meta 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 execute your custom module task:
//$Id$
package zylker;
import org.json.JSONObject;
import com.zoho.qntrl.bridge.sdk.taskprocessors.TaskInterface;
import com.zoho.qntrl.bridge.service_sdk.util.ModuleInfo;
import com.zoho.qntrl.bridge.service_sdk.util.TaskInfo;
public class SupplyMonitor implements TaskInterface {
@Override
public void executeTask(ModuleInfo moduleInfo, TaskInfo taskInfo) throws Exception {
JSONObject payload = taskInfo.getPayLoad();
int units = payload.getInt("units"), byteCount = payload.getInt("byteCount");
JSONObject result = new JSONObject();
result.put("load", byteCount * units);
taskInfo.setResponse(result);
}
@Override
public void clear() {
}
}
REST API Service support in Custom Modules allows you to develop your own REST API modules in your preferred format. Upon deployment, REST API endpoints are published on the Bridge server.
To generate a ZIP file:
Global Info
Users can retrieve the global information of the module and controller using the following endpoints.
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.
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 + "..!";
}
}
During task execution, Bridge invokes the Credential Module and passes the following information:
Credential ID – Identifier of the secret/record to fetch from the external system
Credential Type – Type of credential expected (API Key, SSH, JDBC, etc.)
The module connects to the external vault, retrieves the secret, and returns the credential details back to Bridge. Bridge then uses the retrieved credential at runtime to execute the task.
Override Method:
To generate a ZIP file for deployment:
Build the module JAR file from the compiled class files.
Include the required configuration details such as:
Service name
Module name
Link name
Main class
Create a ZIP package similar to JAR custom module packaging.

Credential values retrieved from the external vault are used only during execution and are not stored in Qntrl.
Multiple credentials can point to the same credential module (example: multiple vault secrets under the same vault connector).
Avoid logging sensitive values (passwords/tokens) inside the module code, as they may get exposed through logs.
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.