{ "openapi": "3.1.0", "info": { "version": "1.0.0", "title": "Navixy IoT Logic API", "summary": "API calls for Flow and Node management", "description": "This is an API reference for calls for Flow and Node management\n\n> **BETA Version!** \n> Now the early access of IoT Logic's API is implemented, which means possible changes in the near future. Feel free to try the functionality, however, you may need to introduce changes in your applications reflecting the API functionality updates. Stay tuned!", "contact": { "name": "Navixy support", "email": "support@navixy.com", "url": "https://www.navixy.com/contact/" }, "license": { "name": "Apache 2.0", "identifier": "Apache-2.0" } }, "servers": [ { "url": "https://api.eu.navixy.com/v2", "description": "Navixy production server on European platform" }, { "url": "https://api.us.navixy.com/v2", "description": "Navixy production server on American platform" } ], "tags": [ { "name": "Flow", "description": "Operations for managing data flows" }, { "name": "Node", "description": "Operations for managing flow nodes (endpoints)" } ], "paths": { "/iot/logic/flow/create": { "post": { "tags": ["Flow"], "summary": "flowCreate", "description": "Create a new data processing flow with nodes and connections. Flows define how data moves from devices through transformation stages to output destinations. Each flow requires at least one Data Source node and one Output Endpoint node. You can create flows with nodes and edges in a single request or add nodes later using the endpoint management API.", "operationId": "flowCreate", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "flow": { "$ref": "#/components/schemas/FlowDraft" } } } } } }, "responses": { "200": { "$ref": "#/components/responses/EntityCreatedResponse" }, "default": { "$ref": "#/components/responses/ResponseError" } }, "security": [ { "api_key": [] } ] } }, "/iot/logic/flow/read": { "get": { "tags": ["Flow"], "summary": "flowRead", "description": "Retrieve complete flow configuration including all nodes, edges, and metadata. Returns the flow structure with node positions, connections, and enabled status. Use this endpoint to inspect flow architecture or retrieve configuration for duplication.", "operationId": "flowRead", "parameters": [ { "name": "flow_id", "in": "query", "required": true, "schema": { "type": "integer", "description": "Flow ID", "example": 12 } } ], "responses": { "200": { "description": "Successful response to read a flow", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean", "description": "`true` if request finished successfully.", "readOnly": true, "example": true }, "value": { "$ref": "#/components/schemas/Flow" } } } } } }, "default": { "$ref": "#/components/responses/ResponseError" } }, "security": [ { "api_key": [] } ] } }, "/iot/logic/flow/update": { "post": { "tags": ["Flow"], "summary": "flowUpdate", "description": "Update an existing flow's configuration. Requires the complete flow object including all nodes and edges. To modify individual nodes without affecting the entire flow, use the endpoint management API. Changes take effect immediately for enabled flows.", "operationId": "flowUpdate", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "flow": { "$ref": "#/components/schemas/Flow" } }, "required": [ "flow" ] } } } }, "responses": { "200": { "$ref": "#/components/responses/OK" }, "default": { "$ref": "#/components/responses/ResponseError" } }, "security": [ { "api_key": [] } ] } }, "/iot/logic/flow/delete": { "post": { "tags": ["Flow"], "summary": "flowDelete", "description": "Permanently delete a flow and stop its data processing pipeline. Devices assigned to this flow will automatically revert to the default flow in your account. This action cannot be undone. To temporarily stop processing without reassigning devices, disable the flow using the update endpoint instead.", "operationId": "flowDelete", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "flow_id": { "type": "integer", "description": "Flow ID", "example": 12 } }, "required": [ "flow_id" ] } } } }, "responses": { "200": { "description": "Successful response to delete a flow", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Success" } } } }, "default": { "$ref": "#/components/responses/ResponseError" } }, "security": [ { "api_key": [] } ] } }, "/iot/logic/flow/list": { "get": { "tags": ["Flow"], "summary": "flowList", "description": "List all flows in the user account. Returns flow IDs and titles only. Use the read endpoint to retrieve complete flow details including nodes and configuration.", "operationId": "flowList", "responses": { "200": { "description": "Successful response to read a list of flows", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean", "description": "`true` if request finished successfully", "readOnly": true, "example": true }, "list": { "type": "array", "description": "List of user's flows", "readOnly": true, "items": { "type": "object", "properties": { "id": { "type": "integer", "description": "Flow ID", "readOnly": true, "example": 1234 }, "title": { "type": "string", "description": "Flow name", "readOnly": true, "example": "Super flow" } }, "readOnly": true } } } } } } }, "default": { "$ref": "#/components/responses/ResponseError" } }, "security": [ { "api_key": [] } ] } }, "/iot/logic/flow/export": { "get": { "tags": ["Flow"], "summary": "flowExport", "description": "Export a flow as a reusable template without instance-specific metadata. Unlike the read endpoint which retrieves the complete operational state of a flow, export returns only the flow structure (nodes, edges, title, description) suitable for creating duplicate flows or transferring configurations between accounts. The exported template excludes flow ID, enabled status, and default flow designation, making it ready for use with the create endpoint.", "operationId": "flowExport", "parameters": [ { "name": "flow_id", "in": "query", "required": true, "schema": { "type": "integer", "description": "Flow ID to export", "example": 678 } } ], "responses": { "200": { "description": "Successful response with flow template", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean", "description": "`true` if request finished successfully.", "readOnly": true, "example": true }, "value": { "$ref": "#/components/schemas/FlowDraft" } } } } } }, "default": { "$ref": "#/components/responses/ResponseError" } }, "security": [ { "api_key": [] } ] } }, "/iot/logic/flow/sources/mapping/list": { "get": { "tags": ["Flow"], "summary": "sourceMappingList", "description": "List all device-to-flow assignments in the user account. Shows which devices are currently assigned to which flows and their corresponding Data Source nodes. Returns device information including title, model, and the flow configuration processing its data. Use this endpoint to audit device assignments, identify unassigned devices, or verify flow coverage across your device fleet. Supports pagination for accounts with large device inventories.", "operationId": "sourceMappingList", "parameters": [ { "name": "offset", "in": "query", "schema": { "type": "integer", "minimum": 0, "default": 0 } }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 100000, "default": 10000 } } ], "responses": { "200": { "description": "success", "content": { "application/json": { "schema": { "example": { "list": [ { "device_title": "Emulator", "model_code": "navixy_ngp", "device_id": "123456789", "flow_id": 1, "flow_title": "Default flow", "node_id": 1, "node_title": "Source node" } ], "count": 1, "success": true } } } } }, "default": { "$ref": "#/components/responses/ResponseError" } }, "security": [ { "api_key": [] } ] } }, "/iot/logic/flow/endpoint/create": { "post": { "tags": ["Node"], "summary": "endpointCreate", "description": "Create a new node within a flow. Supports all node types existing in IoT Logic. The node type is specified in the request body's type field. ", "operationId": "endpointCreate", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "endpoint": { "$ref": "#/components/schemas/IotEndpointDraft" } }, "required": [ "endpoint" ] } } } }, "responses": { "200": { "$ref": "#/components/responses/EntityCreatedResponse" }, "default": { "$ref": "#/components/responses/ResponseError" } }, "security": [ { "api_key": [] } ] } }, "/iot/logic/flow/endpoint/read": { "post": { "tags": ["Node"], "summary": "endpointRead", "description": "Retrieve detailed configuration for a specific node. Returns complete node data including type-specific configuration, position, and enabled status. Use this endpoint to inspect individual node configuration without retrieving the entire flow.", "operationId": "endpointRead", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "endpoint_id": { "type": "integer", "description": "Endpoint ID in database", "example": 1723 } }, "required": [ "endpoint_id" ] } } } }, "responses": { "200": { "description": "Successful response to read endpoint", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean", "description": "`true` if request finished successfully", "readOnly": true, "example": true }, "value": { "$ref": "#/components/schemas/IotEndpoint" } } } } } }, "default": { "$ref": "#/components/responses/ResponseError" } }, "security": [ { "api_key": [] } ] } }, "/iot/logic/flow/endpoint/update": { "post": { "tags": ["Node"], "summary": "endpointUpdate", "description": "Update an existing node configuration. Requires the complete node object including all required fields for the node type. Changes to nodes in enabled flows take effect immediately and may impact active data processing. ", "operationId": "endpointUpdate", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "endpoint": { "$ref": "#/components/schemas/IotEndpoint" } }, "required": [ "endpoint" ] } } } }, "responses": { "200": { "$ref": "#/components/responses/OK" }, "default": { "$ref": "#/components/responses/ResponseError" } }, "security": [ { "api_key": [] } ] } }, "/iot/logic/flow/endpoint/delete": { "post": { "tags": ["Node"], "summary": "endpointDelete", "description": "Permanently delete a node from accoun. Automatically removes all edges connected to this node. Deleting critical nodes (Data Source or Output Endpoint) from enabled flows will interrupt data processing. Verify flow integrity after deletion.", "operationId": "endpointDelete", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "endpoint_id": { "type": "integer", "description": "Endpoint ID in database", "example": 1723 } }, "required": [ "endpoint_id" ] } } } }, "responses": { "200": { "$ref": "#/components/responses/OK" }, "default": { "$ref": "#/components/responses/ResponseError" } }, "security": [ { "api_key": [] } ] } }, "/iot/logic/flow/endpoint/list": { "post": { "tags": ["Node"], "summary": "endpointList", "description": "List all nodes across all flows in the user account. Returns complete node configurations including type, data, and position for each node. To retrieve nodes for a specific flow, use the flow read endpoint instead.", "operationId": "endpointList", "requestBody": { "content": { "application/json": { "schema": { "type": "object" } } } }, "responses": { "200": { "description": "Successful response to read a list of endpoints", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean", "description": "`true` if request finished successfully", "readOnly": true, "example": true }, "list": { "type": "array", "description": "List of user's endpoints", "readOnly": true, "items": { "$ref": "#/components/schemas/IotEndpoint" } } } } } } }, "default": { "$ref": "#/components/responses/ResponseError" } }, "security": [ { "api_key": [] } ] } } }, "externalDocs": { "url": "https://www.navixy.com/docs/iot-logic-api", "description": "Find more info here" }, "components": { "securitySchemes": { "api_key": { "type": "apiKey", "description": "Enter an API key with the \"NVX: \" prefix, e.g. \"NVX 123456abcdefg\"", "name": "Authorization", "in": "header" } }, "responses": { "OK": { "description": "Successful response", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean", "description": "`true` if request finished successfully.", "readOnly": true, "example": true } } } } } }, "EntityCreatedResponse": { "description": "Successful creation response", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean", "description": "`true` if request finished successfully", "readOnly": true, "example": true }, "id": { "type": "integer", "description": "ID of the created entity", "readOnly": true, "example": 1723 } } } } } }, "ResponseError": { "description": "Error response object", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean", "description": "Always false.", "example": false }, "status": { "type": "object", "description": "Error status. It only presence when an error occurred.", "properties": { "code": { "type": "integer", "description": "An error code in this API (not a HTTP code)", "example": 1 }, "description": { "type": "string", "description": "An error description", "example": "Database error" } } } } } } } } }, "schemas": { "Success": { "type": "object", "properties": { "success": { "type": "boolean", "description": "`true` if request finished successfully, otherwise `false`", "readOnly": true, "example": true } } }, "FlowId": { "type": "object", "required": [ "id" ], "properties": { "id": { "type": "integer", "description": "Flow ID", "example": 543, "readOnly": true } } }, "FlowDraft": { "type": "object", "description": "Flowchart object without ID", "properties": { "title": { "type": "string", "description": "Flow name", "example": "Super flow" }, "description": { "type": ["string", "null"], "description": "Flow description (optional)", "readOnly": true, "example": null }, "enabled": { "type": "boolean", "description": "Enable/disable flag", "example": true }, "default_flow": { "type": "boolean", "description": "Whether this is the default flow", "readOnly": true, "example": false }, "nodes": { "type": "array", "items": { "$ref": "#/components/schemas/Node" } }, "edges": { "type": "array", "items": { "$ref": "#/components/schemas/Edge" } } }, "required": [ "title" ] }, "Flow": { "type": "object", "description": "Flowchart object", "allOf": [ { "$ref": "#/components/schemas/FlowId" }, { "$ref": "#/components/schemas/FlowDraft" } ] }, "Edge": { "type": "object", "description": "Edge between two Nodes", "properties": { "from": { "type": "integer", "example": 1 }, "to": { "type": "integer", "example": 2 }, "type": { "description": "Edge type, optional, if not specified it is `simple_edge`", "$ref": "#/components/schemas/EdgeType" } }, "required": [ "from", "to" ] }, "EdgeType": { "type": "string", "enum": ["simple_edge", "then_edge", "else_edge"], "example": "simple_edge" }, "Node": { "type": "object", "description": "Flowchart Node", "oneOf": [ { "$ref": "#/components/schemas/NodeDataSource" }, { "$ref": "#/components/schemas/NodeInitiateAttributes" }, { "$ref": "#/components/schemas/NodeLogic" }, { "$ref": "#/components/schemas/NodeAction" }, { "$ref": "#/components/schemas/NodeWebhook" }, { "$ref": "#/components/schemas/NodeOutputEndpoint" } ] }, "NodeID": { "type": "integer", "description": "Node ID inside current flow", "example": 1 }, "NodeView": { "type": "object", "description": "Flowchart Node view properties", "properties": { "position": { "type": "object", "description": "Position of the left top corner", "properties": { "x": { "type": "integer", "example": 25 }, "y": { "type": "integer", "example": 25 } } } } }, "NodeDataSource": { "type": "object", "description": "Node: Data Source", "properties": { "id": { "$ref": "#/components/schemas/NodeID" }, "type": { "type": "string", "description": "Node type. Always \"data_source\".", "example": "data_source" }, "data": { "type": "object", "properties": { "title": { "type": "string", "example": "Standard Data Source" }, "source_ids": { "type": ["array", "null"], "items": { "type": "integer", "description": "Source ID", "example": 123458 }, "description": "Array of device/source IDs. Use null or empty array [] for all sources. Note: API normalizes null to empty array [] in responses.", "example": [123458, 123459] } } }, "view": { "$ref": "#/components/schemas/NodeView" } }, "required": [ "type", "data" ] }, "NodeInitiateAttributes": { "type": "object", "description": "Node: Initiate Attributes. Transforms device data by creating new calculated attributes based on incoming telemetry. Enables data enrichment through mathematical operations, unit conversions, bit-level manipulations, and time-based calculations using Navixy IoT Logic Expression Language (based on JEXL). Developers can consult the official JEXL specification for expression syntax and operators. Calculated attributes become available to all downstream nodes and can be displayed in Data Stream Analyzer or configured as custom sensors in Navixy tracking interface when connected to default output endpoint.", "properties": { "id": { "$ref": "#/components/schemas/NodeID" }, "type": { "type": "string", "description": "Node type. Always \"initiate_attributes\".", "example": "initiate_attributes" }, "data": { "type": "object", "properties": { "title": { "type": "string", "description": "Node title identifying the transformation purpose.", "example": "Temperature and Speed Conversion" }, "items": { "type": "array", "description": "List of attributes to calculate. Attributes are processed sequentially in the order defined. Each attribute can reference original device parameters and previously calculated attributes within the same node.", "items": { "type": "object", "properties": { "name": { "type": "string", "description": "Unique attribute identifier. This name appears in Data Stream Analyzer and can be used to create custom sensors in Navixy tracking interface. If attribute name matches existing device parameter, the calculated value replaces the original in output data packets.", "example": "temperature_fahrenheit" }, "value": { "type": "string", "description": "JEXL-based expression to calculate attribute value. Can reference device parameters using direct syntax (e.g., 'temperature') or value() function (e.g., value('temperature', 0, 'valid')). Supports standard JEXL operators and mathematical operations, historical value access (via index parameter), and Navixy-specific bit-level operations through util: namespace functions. Consult JEXL specification for expression syntax details. Expression errors result in null values.", "example": "temperature * 1.8 + 32" }, "generation_time": { "type": ["string", "null"], "description": "JEXL-based expression for device-side generation timestamp (when data was created on device). Defaults to now() if null or not specified. Use genTime() function to reference original parameter timestamps.", "example": "genTime(\"temperature\", 0, \"valid\")" }, "server_time": { "type": ["string", "null"], "description": "JEXL-based expression for server-side reception timestamp (when data was received by IoT Logic). Defaults to now() if null or not specified. Use srvTime() function to reference original parameter timestamps.", "example": "now()" } }, "required": ["name", "value"] } } } }, "view": { "$ref": "#/components/schemas/NodeView" } }, "required": [ "type", "data" ] }, "NodeLogic": { "type": "object", "description": "Node: Logic. Creates conditional branching points that route data based on boolean expressions. Logic nodes evaluate incoming data against user-defined conditions and direct data flow through THEN (true) or ELSE (false) output paths. The node creates a boolean attribute that stores evaluation results and can be used in subsequent nodes or Navixy monitoring systems. Logic nodes support multiple outgoing connections on both THEN and ELSE branches, enabling parallel processing and complex decision trees.", "properties": { "id": { "$ref": "#/components/schemas/NodeID" }, "type": { "type": "string", "description": "Node type. Always \"logic\".", "example": "logic" }, "data": { "type": "object", "properties": { "title": { "type": "string", "example": "New logic node" }, "name": { "type": "string", "description": "Internal identifier for the logic node", "example": "logic_1" }, "condition": { "type": "string", "description": "Boolean expression evaluated for each incoming message. Must return true or false. Expression can reference attributes from connected upstream nodes using direct attribute syntax or value() function. Supports logical operators (&&, ||, !), comparison operators (<, >, <=, >=, ==, !=), and complex conditions. If expression cannot be evaluated (null values, syntax errors, missing attributes), result is treated as false and data flows through ELSE path.", "example": "!driver_identified && (vibration_active || speed > 3)" } }, "required": [ "title", "name", "condition" ] }, "view": { "$ref": "#/components/schemas/NodeView" } }, "required": [ "type", "data" ] }, "NodeAction": { "description": "Node: Action. Executes automated device commands when triggered by incoming data. Action nodes enable direct device control through output switching and GPRS command transmission. Functions as a terminal node that cannot have outgoing connections.", "type": "object", "required": [ "type", "data" ], "properties": { "id": { "$ref": "#/components/schemas/NodeID" }, "type": { "type": "string", "description": "Node type. Always \"action\".", "example": "action" }, "data": { "type": "object", "properties": { "title": { "type": "string", "example": "Actions" }, "actions": { "type": ["array", "null"], "description": "List of actions to execute sequentially when node is triggered. Actions execute in order from first to last. Maximum 10 actions per node. Commands are sent only to devices that provided data in the current trigger event.", "items": { "oneOf": [ { "$ref": "#/components/schemas/SetOutput" }, { "$ref": "#/components/schemas/SendCommand" } ] }, "maxItems": 10, "uniqueItems": true } } }, "view": { "$ref": "#/components/schemas/NodeView" } } }, "SetOutput": { "type": "object", "required": ["type", "number", "value"], "properties": { "type": { "type": "string", "enum": ["set_output"], "description": "Action type. Must be 'set_output'." }, "number": { "type": "integer", "minimum": 1, "maximum": 8, "description": "Output number as seen in UI." }, "value": { "type": "boolean", "description": "The state to set to." } } }, "SendCommand": { "type": "object", "required": ["type", "command"], "properties": { "type": { "type": "string", "enum": ["send_gprs_command"], "description": "Action type. Must be 'send_gprs_command'." }, "command": { "type": "string", "minLength": 1, "maxLength": 512, "description": "A custom command to send to the device. Consult its documentation for details." }, "reliable": { "type": ["boolean", "null"], "default": true, "description": "Reliable commands will be retried in case if a tracker is not online at the moment." } } }, "NodeWebhook": { "type": "object", "description": "Node: Webhook. Sends HTTP POST requests with IoT data to external endpoints, enabling real-time integration with third-party systems and APIs. Webhook nodes function as terminal nodes that cannot have outgoing connections to other nodes in the flow.", "properties": { "id": { "$ref": "#/components/schemas/NodeID" }, "type": { "type": "string", "description": "Node type. Always \"webhook\".", "example": "webhook" }, "data": { "type": "object", "properties": { "title": { "type": "string", "description": "Webhook node title.", "maxLength": 255, "example": "External API Integration" }, "url": { "type": "string", "description": "Target URL for HTTP POST requests. Must use http:// or https:// protocol (HTTPS recommended). Executes fire-and-forget POST request on each incoming message without waiting for response or retrying on failure.", "maxLength": 255, "pattern": "^https?:\\/\\/\\S+$", "example": "https://api.example.com/iot/data" }, "headers": { "type": ["array", "null"], "description": "Optional HTTP headers for POST requests. All headers including Content-Type must be explicitly specified. Maximum 10 headers.", "maxItems": 10, "items": { "type": "object", "required": ["key", "value"], "properties": { "key": { "type": "string", "description": "Header name.", "maxLength": 255, "example": "Authorization" }, "value": { "type": "string", "description": "Header value (static only).", "maxLength": 255, "example": "Bearer token123" } } }, "example": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer token123" } ] }, "body": { "type": ["string", "null"], "description": "Optional request body template. Use $\"attribute_name\" syntax to reference attributes from upstream nodes. Supports nested paths (e.g., $\"location.latitude\"). Direct attribute references only; expressions not supported. Null attributes send null values.", "maxLength": 4000, "example": "{\"device_id\": $\"device_id\", \"temperature\": $\"temperature\", \"location\": {\"lat\": $\"latitude\", \"lng\": $\"longitude\"}, \"timestamp\": $\"message_time\"}" } }, "required": ["title", "url"] }, "view": { "$ref": "#/components/schemas/NodeView" } }, "required": [ "type", "data" ] }, "NodeOutputEndpoint": { "type": "object", "description": "Node: output endpoint. This is the terminating node for any flow. It determines where the messages will be sent.", "properties": { "id": { "$ref": "#/components/schemas/NodeID" }, "type": { "type": "string", "description": "Node type. Always \"output_endpoint\".", "example": "output_endpoint" }, "data": { "type": "object", "oneOf": [ { "$ref": "#/components/schemas/NodeOutputEndpointDataDefault" }, { "$ref": "#/components/schemas/NodeOutputEndpointDataStoredEndpoint" } ] }, "view": { "$ref": "#/components/schemas/NodeView" } }, "required": [ "type", "data" ] }, "NodeOutputEndpointDataDefault": { "type": "object", "description": "Data of default output endpoint (Navixy platform)", "properties": { "title": { "type": "string", "example": "Navixy output endpoint" }, "output_endpoint_type": { "type": "string", "description": "Type of endpoint. Always 'output_default' for Navixy platform.", "example": "output_default" } }, "required": [ "title", "output_endpoint_type" ] }, "NodeOutputEndpointDataStoredEndpoint": { "type": "object", "description": "Data of MQTT output endpoint", "properties": { "title": { "type": "string", "example": "MQTT output endpoint" }, "output_endpoint_type": { "type": "string", "description": "Type of endpoint. Always 'output_mqtt_client'.", "example": "output_mqtt_client" }, "output_endpoint_id": { "type": "integer", "description": "Output Endpoint identifier within the user account. It is required for only some types of node (e.g. output_mqtt_client) which has specific properties.", "example": 44551 } }, "required": [ "title", "output_endpoint_type", "output_endpoint_id" ] }, "IotEndpoint": { "type": "object", "description": "Input or output endpoint", "allOf": [ { "type": "object", "properties": { "id": { "type": "integer", "description": "Endpoint ID inside user account", "example": 12345, "readOnly": true } }, "required": [ "id" ] }, { "$ref": "#/components/schemas/IotEndpointDraft" } ] }, "IotEndpointDraft": { "type": "object", "description": "Input or output endpoint draft (for creation)", "properties": { "user_id": { "type": "integer", "description": "Master user ID", "example": 8 }, "type": { "type": "string", "description": "Endpoint type. One of: 'input_default', 'output_default', 'output_mqtt_client'.", "example": "output_mqtt_client" }, "title": { "type": "string", "example": "MQTT Endpoint Client Properties" }, "status": { "type": "string", "description": "Endpoint status. One of: 'active', 'suspend', 'disabled'." }, "properties": { "type": "object", "oneOf": [ { "$ref": "#/components/schemas/IotEndpointMqttClientProperties" }, { "type": "object", "description": "Navixy endpoint - empty object (no properties)", "properties": {} } ] } }, "required": [ "type", "title", "status" ] }, "IotEndpointMqttClientProperties": { "type": "object", "description": "MQTT client endpoint", "properties": { "protocol": { "type": "string", "description": "Protocol of messages: \"NGP\" (Navixy Generic Protocol)", "example": "NGP" }, "domain": { "type": "string", "description": "MQTT domain or IP address", "example": "127.0.0.1" }, "port": { "type": "integer", "description": "MQTT port", "example": 1883 }, "client_id": { "type": "string", "description": "MQTT client ID", "example": "Navixy (panel #123)" }, "qos": { "type": "integer", "description": "MQTT QoS: 0 or 1 (2 is unsupported at the moment)", "example": 1 }, "topics": { "type": "array", "items": { "type": "string", "description": "MQTT topic name", "example": "iot/navixy" } }, "version": { "type": "string", "description": "MQTT version: \"3.1.1\" or \"5.0\"", "example": "5.0" }, "use_ssl": { "type": "boolean", "description": "Use or not SSL encryption for MQTT connection", "example": false }, "mqtt_auth": { "type": "boolean", "description": "Use or not MQTT authentication", "example": true }, "user_name": { "type": "string", "description": "MQTT user name", "example": "navixy" }, "user_password": { "type": "string", "description": "MQTT password", "example": "your_super_strong_password" } }, "required": [ "protocol", "domain", "port", "client_id", "qos", "topics", "version", "use_ssl", "mqtt_auth" ] } } }, "security": [ { "api_key": [] } ] }