/api/v1/framesList#
Query parameters
protocolstring · nullable
profilestring · nullable
sincestring · date-time · nullable
untilstring · date-time · nullable
limitinteger
Responses
200OKapplication/json
granularityrequiredstring
What ONE entry is. "dma_block" today: the producer pushes one entry
per DMA block, so an entry is 4096 useful bytes cut at a boundary that
has no relation to any protocol frame. Calling that a frame is the
defect STE-989 is about; naming it is the honest half of the fix.
For packet granularity use /ws/frames?framing=slot&slot_len=N.
clockrequiredstring
How to read timestamp. "boot_relative": the board has no RTC and no
NTP, so times start at the epoch on every boot. A control centre would
otherwise take them for wall-clock.
empty_reason string · nullable
null when the page is non-empty. Otherwise WHY it is empty.
framesrequiredarray of FrameDRO
FrameDRO · 7 fields
idrequiredstring · uuid
timestamprequiredstring · date-time
profilestring · nullable
protocolrequiredstring
fec_status requiredstring
crc_ok boolean · nullable
payload_hex requiredstring
Request
curl "http://192.168.2.1:8080/api/v1/frames"import requests
BASE_URL = "http://192.168.2.1:8080"
response = requests.get(f"{BASE_URL}/api/v1/frames")
response.raise_for_status()
print(response.json())let base_url = "http://192.168.2.1:8080";
let response = reqwest::Client::new()
.get(format!("{base_url}/api/v1/frames"))
.send()
.await?
.error_for_status()?;
let body: serde_json::Value = response.json().await?;
println!("{body:#}");Response
{
"granularity": "string",
"clock": "string",
"empty_reason": "string",
"frames": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"timestamp": "2026-09-29T08:30:00Z",
"profile": "string",
"protocol": "string",
"fec_status": "string",
"crc_ok": true,
"payload_hex": "string"
}
]
}Request
curl -X DELETE "http://192.168.2.1:8080/api/v1/frames"import requests
BASE_URL = "http://192.168.2.1:8080"
response = requests.delete(f"{BASE_URL}/api/v1/frames")
response.raise_for_status()
print(response.json())let base_url = "http://192.168.2.1:8080";
let response = reqwest::Client::new()
.delete(format!("{base_url}/api/v1/frames"))
.send()
.await?
.error_for_status()?;
let body: serde_json::Value = response.json().await?;
println!("{body:#}");Response
{
"purged": 0
}/api/v1/frames/{id}Get one#
Path parameters
idrequiredstring · uuid
Frame id
Responses
200OKapplication/json
idrequiredstring · uuid
timestamprequiredstring · date-time
profilestring · nullable
protocolrequiredstring
fec_status requiredstring
crc_ok boolean · nullable
payload_hex requiredstring
404not foundapplication/json
Request
curl "http://192.168.2.1:8080/api/v1/frames/3fa85f64-5717-4562-b3fc-2c963f66afa6"import requests
BASE_URL = "http://192.168.2.1:8080"
id = "3fa85f64-5717-4562-b3fc-2c963f66afa6" # Frame id
response = requests.get(f"{BASE_URL}/api/v1/frames/{id}")
response.raise_for_status()
print(response.json())let base_url = "http://192.168.2.1:8080";
let id = "3fa85f64-5717-4562-b3fc-2c963f66afa6"; // Frame id
let response = reqwest::Client::new()
.get(format!("{base_url}/api/v1/frames/{id}"))
.send()
.await?
.error_for_status()?;
let body: serde_json::Value = response.json().await?;
println!("{body:#}");Response
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"timestamp": "2026-09-29T08:30:00Z",
"profile": "string",
"protocol": "string",
"fec_status": "string",
"crc_ok": true,
"payload_hex": "string"
}{}