Attach a sensor, publish signed observations, and read verified evidence back — from every station on the network, not just your own.
Senlay is reciprocal. Contribute an instrument and you receive verified reasoning across the entire network — not just your own readings. A single station buys access to everything around it.
Your station's accepted observations appear in later verification responses as explicitly labelled direct station evidence, alongside the sources already covering that coordinate.
Volunteer sensor networks normally drown in noise. Instruments end up beside air-conditioning units, in direct sun, or uncalibrated, and the platforms hosting them spend years fighting the resulting quality problem.
Senlay measures that problem instead of fighting it. Distance, freshness, calibration state and disagreement with both forecast models and neighbouring instruments are already computed on every request. A poor sensor is not rejected — it is weighted low, and the response says so.
Create a Senlay account, register a provider, register a station under it, then publish signed observations. This is the live sequence from the senlay-platform repository README.
curl -sS -X POST https://senlay.cloud/api/v1/providers/register \
-H "Authorization: Bearer $API_KEY" -H 'content-type: application/json' \
--data '{"name":"My community network","slug":"my-community-network"}'
curl -sS -X POST https://senlay.cloud/api/v1/stations/register \
-H "Authorization: Bearer $API_KEY" -H 'content-type: application/json' \
--data '{"providerId":"prv_REPLACE_ME","name":"Beach wind station","sensorType":"weather_station","location":{"lat":15.8801,"lng":108.3380}}'
Save the station secret when it is returned. The server retains only a non-recoverable hash and cannot show it again. A lost secret means re-provisioning the hardware in person.
Before publishing live data, use the dashboard's Send signed test action to verify the station secret and payload shape without storing a fake observation. Then publish signed observations:
curl -sS -X POST https://senlay.cloud/api/v1/observations \
-H "X-Senlay-Station-Id: stn_REPLACE_ME" \
-H "X-Senlay-Timestamp: $TIMESTAMP" \
-H "X-Senlay-Signature: $SIGNATURE" \
-H 'content-type: application/json' \
--data '{"id":"obs_2026...","stationId":"stn_REPLACE_ME","observedAt":"2026-09-05T12:00:00Z","location":{"lat":15.8801,"lng":108.3380},"measurements":[{"phenomenon":"wind.speed","value":7.4,"unit":"m/s"}]}'
The senlay-platform JavaScript SDK computes the X-Senlay-* signature headers for you. Header formats, signing rules, and the full observation schema are documented in the network protocol document.
State the boundary plainly, because a clear line is easier to trust than a vague one.
The observation envelope and JSON Schema, deterministic validation and normalization, HMAC request signing, the JavaScript SDK, the MQTT bridge, and the edge gateway.
The aggregation engine, divergence scoring, the global registry, authentication, billing, provider credentials, the accumulated place-memory corpus, and risk models.