Wandelbots NOVA API
Learn how to create a cell with one or multiple robots, how to interact and program them with Wandelbots NOVA API.
Open the Wandelbots NOVA API from the home screen of your instance or type <instance's IP address>/api/v1/ui
into your browser's URL.
To authenticate your API requests, use the access token provided with your instance in the Developer Portal.
API request limits
Please note that our current upload limit for API requests is 100MB. If you need to send larger files, e.g. point cloud files when using cameras, please contact Wandelbots Customer Support.
Configure a robot cell
The first cell on a Wandelbots NOVA instance gets created automatically.
Add a robot to the cell
- Open the settings app.
- Open the "Cell" tab.
This is the cell on your instance to which the desired robots and communication with other devices or extensions can be established.
Add a robot via Controller
>
POST /api/v1/cells/{cell}/controllers
.
Use the Examples
menu to add the desired robot. Start with a virtual robot named ur5e-bob
.

The robot controller
is required to execute robot motions for each connected motion group, and used to interact with I/Os and communicate with periphery that does not represent an individual motion group.
Gather information from the controller
You can also use the Wandelbots NOVA API to obtain information on the connected robot controllers, e.g. TCP or current state.
The following section requires available motion groups to interact with. To get a list of available motion groups in your cell the Motion Group > List active GET /api/v1/cells/{cell}/controllers
. Each robot controller has one or more motion groups. For further requests to the motion group, use x@controller_id
, e.g. 0@ur5e-bob
.
Read TCP information
For further requests concerning the robot, the tool center point (TCP) is required.
Read the currently active TCP via GET /api/v1/cells/{cell}/motion-groups/{motion-group}/tcps
.
If the currently active TCP is not the TCP you want to plan the motion with, use Motion Group Infos > List TCPs GET /api/v1/cells/{cell}/motion-groups/{motion-group}/tcps
endpoint to get the TCP names available on the robot controller.
Read the current state of the motion group
To get the joint configuration, the cartesian position of a specific TCP or other information concerning the robot state call GET /api/v1/cells/{cell}/motion-groups/{motion-group}/state?tcp={tcp}
and replace {motion-group}
with the desired motion group and {tcp}
with the desired TCP.
You can also receive a stream of state updates via a WebSocket connection. Instead of requesting state
connect a websocket to ws://<instance-address>/api/v1/cells/{cell}/motion-groups/{motion-group}/state-stream
.
Move the robot
You have two options to move the robot: You can either plan and execute a motion via the Wandelbots NOVA API, or you can create a program using Wandelscript.
Let's plan and execute a motion via the Wandelbots NOVA API first that we'll move to a Wandelscript program later on.
To move the robot with Wandelbots NOVA API, you need to plan a motion. The following request plans a movement consisting of two parts: First, the robot will move from its initial joint position to a new joint position. Secondly, it will perform a line motion to a defined cartesian pose.
The TCP is required for planning a motion with the motion group type robot. If the TCP is not set, the motion planning will throw an error.
Plan a motion
The first step is to plan a motion from the robot's current position via the endpoint POST /api/v1/cells/{cell}/motions
with start_joint_position
representing the current state of the motion group. You can plan one or more motions in a row.
{
"motion_group": "0@ur5e-bob",
"start_joint_position": {
"joints": [1.17, -1.57, 1.36, 1.03, 1.29, 1.28]
},
"commands": [
{
"joint_ptp": {
"target_joint_position": {
"joints": [2.74, -1.57, 1.36, 1.03, 1.29, 1.28]
}
}
},
{
"line": {
"target_pose": {
"position": {
"x": 400,
"y": 0,
"z": 400
},
"orientation": {
"x": 1.57,
"y": 0,
"z": 0
}
}
}
}
],
"tcp": "Flange"
}
The response contains the motion id
required for executing the motion.
Execute the motion
To execute the planned motion, the robot needs to be moved to the motion's start position via stream to trajectory GET /api/v1/cells/{cell}/motions/{motion}/executetotrajectory
.
The parameter location_on_trajectory
specifies the position on the motion trajectory where the robot should be moved to. In this case, a value of 0
moves the robot to the start of the trajectory.
Replicate motion with Wandelscript
To program the robot using Wandelscript, you first need to write a program that specifies the movements. The following program results in the same motion as the one planned via Wandelbots NOVA API above:
bob = get_controller("ur5e_bob")
do with bob[0]:
# Move to the initial joint position
move via joint_p2p() to [1.17, -1.57, 1.36, 1.03, 1.29, 1.28]
# Move to the second joint position
move via joint_p2p() to [2.74, -1.57, 1.36, 1.03, 1.29, 1.28]
# Move in a line to the specified cartesian pose
move via line() to (400, 0, 400, 1.57, 0, 0)
Once the Wandelscript is written you can send it via the asynchronous endpoint POST /api/v1/cells/{cell}/runners
or the synchronous endpoint POST /api/v1/cells/{cell}/execute
.
Make yourself familiar with Wandelscript by browsing its basic syntax!
Congrats, you've written your first robot program! Time to put on a space suit and start exploring more complex robotic programs!
Start program with physical button
You've successfully moved a robot and have also created several programs that you're streaming onto the robot. What about storing programs and starting a specific program with a button in your physical cell?
In order to physically start a program out of the program library, you'll need to establish a connection to an OPC UA server.
Once you have OPC UA connected to Wandelbots NOVA, you can setup a physical trigger by combining multiple Wandelbots NOVA endpoints:
Store program
Create a program in the Robot Pad. All programs created via Robot Pad are automatically stored in the program library.
Open the program library to get a visual overview on all programs stored in the cell.

As the Robot Pad uses the Wandelbots NOVA API, you can also create and store a program using
Library Program > Create Program POST /api/v1/cells/{cell}/store/programs
.
move via p2p() to [0, 0, 0, 0, 0, 0]
move frame("flange") to [1, 2, 0]
move via line() to [1, 1, 0]
a := planned_pose()
All program features available with Wandelscript can be used, e.g. reading additional opcua nodes directly from Wandelscript, allowing you to further customize the program to your specific needs. More information about working with OPC UA can be found here.
To get an overview of all programs including their identifiers, use Library Program > List Program Metadata GET /api/v1/cells/{cell}/store/programs
.
{
"programs": [
{
"id": "5517ecd8-728a-4958-9d86-65a5b38721b6",
"name": "New Program",
"created_date": "2024-11-10 11:49:03",
"last_updated_date": "2024-11-15 24:23:41",
"is_hidden": false
}
]
}
Keep the program identifier id
at hand for the next steps.
Confirm with Library Program > Get Program GET /api/v1/cells/{cell}/store/programs/{program}
that the program id's content matches the desired program.
Create trigger
Switch over to the Program Operator endpoints and use Create Trigger POST /api/v1/cells/{cell}/operator/triggers
to set an OPC UA node as trigger for the program.
Replace the program_id
with the desired program identifier and the config
children with the OPC UA host, node id and node value that has to be reached in order to trigger the program start.
{
"program_id": "string",
"enabled": true,
"type": "opcua_node_value",
"config": {
"host": "string",
"node_id": "string",
"node_value": "string"
}
}
Run program
Run the program to ensure that it works as expected. Open Program Operator > Run Program POST /api/v1/cells/{cell}/operator/programs/runs
, enter the program identifier and send the API request.
This is the endpoint that will be triggered by the physical button.
{
"program_id": "string"
}
Now push the button in your cell to start the program!
Analytics and trigger updates
The program operator offers two endpoints that can be used for analytical purposes; Get All Program Runs and Get Program Run.
They provide information on the summary of programs that were executed (including incomplete program runs)
with GET /api/v1/cells/{cell}/operator/programs/runs
, and detailed information on a
specific program run GET /api/v1/cells/{cell}/operator/programs/runs/{run}
.
Update a trigger via the Update Trigger PUT /api/v1/cells/{cell}/operator/triggers/{trigger}
endpoint, and if no longer needed, delete it with the Delete Trigger DELETE /api/v1/cells/{cell}/operator/triggers/{trigger}
endpoint.