Type: tutorial · Last reviewed: 2026-07-18
Applies to: Pulse Historian · edge/on-prem · managed cloud
This is a guided first run. By the end you'll have written a data point, read it back, set an engineering limit, and watched Pulse raise an alarm and notify you — the whole loop, on one unit, in one sitting. We'll use the canonical example unit acme-power / plant-1 / boiler-2 throughout.
You'll need: the Historian base URL (https://<plant-server>:3030), an account (email + password), and curl. On-prem uses a self-signed cert, so every command passes -k.
This is a learning path — one happy line through the system. When you later need the task on its own (all the options, edge cases), each step links to its how-to guide.
Everything is authenticated. Trade your login for a token:
curl -k -X POST https://plant-server:3030/exactapi/login \
-H 'Content-Type: application/json' \
-d '{"email":"you@acme-power.com","password":"•••"}'
// → 200
{ "token": "eyJhbGciOiJI…", "role": "read-write" }
Copy the token into a shell variable so the next steps can use it:
TOKEN="eyJhbGciOiJI…"
Send one reading for steam_pressure and steam_temp on boiler-2. Time is epoch milliseconds (see Time & timezones):
curl -k -X POST https://plant-server:3030/exactapi/write \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"organization":"acme-power","site":"plant-1","unit":"boiler-2","grid":"default_grid",
"data":[{"timestamps":[1720008000000],"tag_values":{"steam_pressure":78.4,"steam_temp":512.0}}]}'
// → 200
{ "status": "success", "written": 2 }
You just stored two points. 🎉
You don't need the full scope to read — a tag name resolves to its collection automatically:
curl -k -X POST https://plant-server:3030/exactapi/fast_query \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"tags":["steam_pressure"],"start":1720008000000,"end":1720008120000}'
// → 200
{ "steam_pressure": { "timestamps": [1720008000000], "values": [78.4] } }
That round-trip — write, then read the same value back — is the core of the historian. Everything else is scale, speed, and convenience on top. Full read/write options → Query your data from the terminal.
Now make the system watch the data. Give steam_temp a high limit; the monitor turns that into an alarm rule automatically:
curl -k -X PUT "https://plant-server:3030/exactapi/tagmeta/$TAGMETA_ID" \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"limHi": 540}'
Write a value that breaches it:
curl -k -X POST https://plant-server:3030/exactapi/write \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"organization":"acme-power","site":"plant-1","unit":"boiler-2","grid":"default_grid",
"data":[{"timestamps":[1720008060000],"tag_values":{"steam_temp":543.2}}]}'
Within a monitor tick, an alarm opens:
curl -k "https://plant-server:3030/exactapi/monitor/alarm/events/active" -H "Authorization: Bearer $TOKEN"
{ "events": [ { "threshold": 540.0, "trigger_value": 543.2, "status": "OPEN" } ], "total_count": 1 }
At the same moment, a notification is raised — a bell-badge tick, a desktop toast, and a live push to any open browser session. That's the alert reaching a person. Details → Create an alarm rule · How you get notified.
You wrote data, read it back, and closed the loop from a raw reading to an operator alert:
write → store (Chronos, on the grid) → read → monitor rule → alarm → notification