curl --request GET \
--url https://api.ionworks.com/projects/{project_id}/lab/statusimport requests
url = "https://api.ionworks.com/projects/{project_id}/lab/status"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.ionworks.com/projects/{project_id}/lab/status', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ionworks.com/projects/{project_id}/lab/status",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.ionworks.com/projects/{project_id}/lab/status"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.ionworks.com/projects/{project_id}/lab/status")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ionworks.com/projects/{project_id}/lab/status")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"sites": [
{
"id": "<string>",
"name": "<string>",
"cyclers": [
{
"id": "<string>",
"name": "<string>",
"channel_count": 123,
"occupied": 123,
"stale": 123,
"free": 123,
"manufacturer": "<string>",
"model": "<string>",
"serial_number": "<string>",
"last_calibrated_at": "2023-11-07T05:31:56Z",
"calibration_interval_days": 123,
"calibration_due_at": "2023-11-07T05:31:56Z",
"out_of_commission": 0,
"channels": [
{
"id": "<string>",
"name": "<string>",
"state": "free",
"measurement": {
"id": "<string>",
"name": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"cell_instance_id": "<string>",
"start_time": "2023-11-07T05:31:56Z",
"estimated_end_time": "2023-11-07T05:31:56Z",
"cell_instance_name": "<string>",
"cell_specification_name": "<string>",
"protocol_name": "<string>",
"watched": false,
"requested_by_email": "<string>",
"program_name": "<string>"
},
"notes": "<string>",
"out_of_commission": false,
"max_amps": 123,
"min_volts": 123,
"max_volts": 123
}
]
}
]
}
],
"occupied": 0,
"stale": 0,
"free": 0,
"out_of_commission": 0
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Get the lab-view occupancy status for a project
Return the project’s sites, cyclers, and channels with occupancy state.
Each channel carries a derived free / occupied / stale state
(there is no live telemetry; state comes from linked measurements’
end_time and update recency). Includes per-cycler and project-level
occupancy counts. Each occupied/stale channel’s measurement carries a
watched flag for the requesting user, so the “My Channels” filter needs
no extra round-trip.
curl --request GET \
--url https://api.ionworks.com/projects/{project_id}/lab/statusimport requests
url = "https://api.ionworks.com/projects/{project_id}/lab/status"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.ionworks.com/projects/{project_id}/lab/status', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ionworks.com/projects/{project_id}/lab/status",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.ionworks.com/projects/{project_id}/lab/status"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.ionworks.com/projects/{project_id}/lab/status")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ionworks.com/projects/{project_id}/lab/status")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"sites": [
{
"id": "<string>",
"name": "<string>",
"cyclers": [
{
"id": "<string>",
"name": "<string>",
"channel_count": 123,
"occupied": 123,
"stale": 123,
"free": 123,
"manufacturer": "<string>",
"model": "<string>",
"serial_number": "<string>",
"last_calibrated_at": "2023-11-07T05:31:56Z",
"calibration_interval_days": 123,
"calibration_due_at": "2023-11-07T05:31:56Z",
"out_of_commission": 0,
"channels": [
{
"id": "<string>",
"name": "<string>",
"state": "free",
"measurement": {
"id": "<string>",
"name": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"cell_instance_id": "<string>",
"start_time": "2023-11-07T05:31:56Z",
"estimated_end_time": "2023-11-07T05:31:56Z",
"cell_instance_name": "<string>",
"cell_specification_name": "<string>",
"protocol_name": "<string>",
"watched": false,
"requested_by_email": "<string>",
"program_name": "<string>"
},
"notes": "<string>",
"out_of_commission": false,
"max_amps": 123,
"min_volts": 123,
"max_volts": 123
}
]
}
]
}
],
"occupied": 0,
"stale": 0,
"free": 0,
"out_of_commission": 0
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Path Parameters
Response
Successful Response
The full Lab-view tree for a project: sites -> cyclers -> channels.
Returned by GET /projects/{project_id}/lab/status in a single call so
the wall can render without N per-channel round-trips.
Sites with this project's cyclers
Show child attributes
Show child attributes
Total occupied channels across the project
Total stale channels across the project
Total free channels across the project
Total out-of-commission channels across the project
Was this page helpful?