81trust / 100
Telemetry Normalize
by HALOWERK Agent Tools in Company & people data
x402 APIPassing, checked 3 h ago
Turns SenML (JSON or CBOR) and LwM2M TLV into one record shape: resolved name, unit, absolute timestamp, typed value. Optionally puts every series on a shared time axis with a chosen interval and fill rule (last value, bucket mean, linear). Works only on the payload you pass: no device is contacted, nothing is stored, the same request returns the same bytes. TLV carries no type on the wire; unmapped resource ids come back as opaque base64 with a warning instead of a guess.
POST https://tools.halowerk.com/v1/telemetry/normalize
Last 30 days
All checks passedSome failedAll failedNot checked
- Uptime
- 100%
- Response time
- 36 ms typical, 36 ms slowest 5%
- Last check
- 3 h ago
- Next check
- any minute now
How to call it
# See the payment challenge (nothing is charged)
curl -i -X POST "https://tools.halowerk.com/v1/telemetry/normalize" \
-H "content-type: application/json" \
-d '{"align":true,"align_method":"last","format":"senml_json","interval_s":60,"payload":[{"bn":"urn:dev:ow:10e2073a:","bt":1786000000,"bu":"Cel","n":"temp","v":21.3},{"n":"temp","t":60,"v":21.9},{"n":"hum","t":60,"u":"%RH","v":48}]}'import { wrapFetchWithPayment } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
const client = new x402Client().register(
"eip155:8453",
new ExactEvmScheme(privateKeyToAccount(process.env.AGENT_KEY)),
);
const pay = wrapFetchWithPayment(fetch, client);
// Not sure it's safe to pay? Preflight it first for $0.005:
// GET https://toolvet.app/api/v1/check?url=https%3A%2F%2Ftools.halowerk.com%2Fv1%2Ftelemetry%2Fnormalize
const res = await pay("https://tools.halowerk.com/v1/telemetry/normalize", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({"align":true,"align_method":"last","format":"senml_json","interval_s":60,"payload":[{"bn":"urn:dev:ow:10e2073a:","bt":1786000000,"bu":"Cel","n":"temp","v":21.3},{"n":"temp","t":60,"v":21.9},{"n":"hum","t":60,"u":"%RH","v":48}]}),
});
console.log(await res.json());Example input
{
"align": true,
"align_method": "last",
"format": "senml_json",
"interval_s": 60,
"payload": [
{
"bn": "urn:dev:ow:10e2073a:",
"bt": 1786000000,
"bu": "Cel",
"n": "temp",
"v": 21.3
},
{
"n": "temp",
"t": 60,
"v": 21.9
},
{
"n": "hum",
"t": 60,
"u": "%RH",
"v": 48
}
]
}Example output
{
"align_note": null,
"aligned": {
"end_unix_s": 1786000060,
"interval_s": 60,
"method": "last",
"point_count": 2,
"points": [
{
"time": "2026-08-06T07:06:40.000Z",
"time_unix_s": 1786000000,
"values": {
"urn:dev:ow:10e2073a:hum": null,
"urn:dev:ow:10e2073a:temp": 21.3
}
},
{
"time": "2026-08-06T07:07:40.000Z",
"time_unix_s": 1786000060,
"values": {
"urn:dev:ow:10e2073a:hum": 48,
"urn:dev:ow:10e2073a:temp": 21.9
}
}
],
"series_names": [
"urn:dev:ow:10e2073a:hum",
"urn:dev:ow:10e2073a:temp"
],
"start_unix_s": 1786000000,
"tolerance_s": 0,
"values_filled": 3,
"values_missing": 1
},
"format": "senml_json",
"record_count": 3,
"records": [
{
"name": "urn:dev:ow:10e2073a:temp",
"time": "2026-08-06T07:06:40.000Z",
"time_unix_s": 1786000000,
"unit": "Cel",
"value": 21.3,
"value_type": "number"
},
{
"name": "urn:dev:ow:10e2073a:temp",
"time": "2026-08-06T07:07:40.000Z",
"time_unix_s": 1786000060,
"unit": "Cel",
"value": 21.9,
"value_type": "number"
},
{
"name": "urn:dev:ow:10e2073a:hum",
"time": "2026-08-06T07:07:40.000Z",
"time_unix_s": 1786000060,
"unit": "%RH",
"value": 48,
"value_type": "number"
}
],
"series": [
{
"count": 1,
"first_time_unix_s": 1786000060,
"last_time_unix_s": 1786000060,
"max": 48,
"mean": 48,
"min": 48,
"name": "urn:dev:ow:10e2073a:hum",
"numeric_count": 1,
"unit": "%RH"
},
{
"count": 2,
"first_time_unix_s": 1786000000,
"last_time_unix_s": 1786000060,
"max": 21.9,
"mean": 21.6,
"min": 21.3,
"name": "urn:dev:ow:10e2073a:temp",
"numeric_count": 2,
"unit": "Cel"
}
],
"stateless": true,
"warnings": []
}Security scan
- No findings. We scan names, descriptions and tool definitions for hidden instructions and other prompt-injection patterns.
Recent checks
| When | Result | HTTP | Time | Price |
|---|---|---|---|---|
| 3 h ago | Passed | 402 | 99 ms | $0.002 |
| 6 h ago | Passed | 402 | 32 ms | $0.002 |
| 11 h ago | Passed | 402 | 36 ms | $0.002 |