Stream readings from your own hardware into Jumboshack. No Jumboshack software required — just an account, a device token, and JSON over HTTPS.
Create an account at app.jumboshack.com/register and verify your email.
Add a device on the Account page (a Location, then a Device). You'll be shown a
device token (jsk_…) once — copy it. That token authenticates your data and attributes it to your account.
Send one reading per request as JSON, with the token as a Bearer header:
# POST one reading curl -X POST https://ingest.jumboshack.com/api/ingest/geothermal \ -H "Authorization: Bearer jsk_YOUR_DEVICE_TOKEN" \ -H "Content-Type: application/json" \ -d @reading.json
Success returns {"ok": true, "written": 1, ...}. Rate limits: 120 requests/min per device, 300/min per IP — a reading every 15–60s is ideal.
Add ?validate=1 to check your payload without storing anything. It echoes back exactly which fields were understood, so you can confirm your format before going live:
curl -X POST "https://ingest.jumboshack.com/api/ingest/geothermal?validate=1" \ -H "Authorization: Bearer jsk_YOUR_DEVICE_TOKEN" \ -H "Content-Type: application/json" -d @reading.json # → {"ok":true,"validate":true,"parsed_time_utc":"2026-08-22T17:00:31+00:00", # "field_count":11,"fields":{...},"tags":{...},"note":"dry run — nothing was stored"}
Only the timestamp is required. Everything else is optional — send what your equipment reports; missing fields simply don't render.
{
"metadata": { "unit": "1", "unit_location": "Basement", "time": "2026-08-22T17:00:31Z" },
"heat_pump": {
"total_watts": 1462,
"water": { "entering_f": 78.1, "leaving_f": 86.0 },
"air": { "return_f": 72.0, "supply_f": 58.0 }
}
}
{
"metadata": {
"unit": "1",
"unit_location": "Basement",
"time": "2026-08-22T17:00:31Z",
"software_version": "my-rig-0.1"
},
"thermostat": { "ambient_temperature_f": 71.5, "relative_humidity_pct": 48,
"heat_setpoint_f": 68, "cool_setpoint_f": 74, "mode": "cooling" },
"heat_pump": {
"total_watts": 1462,
"water": { "entering_f": 78.1, "leaving_f": 86.0, "flow_gpm": 9.2,
"heat_rejection_btuh": 21000, "heat_extraction_btuh": 0 },
"air": { "return_f": 72.0, "supply_f": 58.0 },
"blower": { "watts": 190, "speed": 5 },
"loop_pump": { "watts": 80, "flow_gpm": 9.2 },
"compressor": { "watts": 1400, "stage": 1, "superheat_f": 12.5,
"suction_temp_f": 45, "suction_pressure_psi": 130,
"discharge_pressure_psi": 320, "discharge_temp_calculated_f": 180,
"reversing_valve_mode": "Cool" },
"domestic_hot_water": { "setpoint_f": 120, "temp_f": 118 }
},
"humidity_control": { "dehumidify_active": false, "relay_active": false },
"additional_sensors": { "outdoor_temp_f": { "value": 84.0 } }
}
| Path | Type | Unit | Notes |
|---|---|---|---|
| metadata.time *required | string | — | Reading time. ISO-8601 (2026-08-22T17:00:31Z, offset, or naive=UTC). Aliases: query_end, query_start, timestamp. |
| metadata.unit | string | — | Your label for the unit (e.g. "1"). |
| metadata.unit_location | string | — | Where it is (e.g. "Basement"). |
| metadata.software_version | string | — | Your firmware/agent version — shown in your account. |
| thermostat.ambient_temperature_f | number | °F | Indoor/zone temp. |
| thermostat.relative_humidity_pct | number | % | |
| thermostat.heat_setpoint_f / cool_setpoint_f | number | °F | |
| thermostat.mode | string | — | Free text (e.g. heating/cooling/off). |
| heat_pump.total_watts | number | W | Powers energy & cost. |
| heat_pump.water.entering_f / leaving_f | number | °F | Loop temps (EWT/LWT). |
| heat_pump.water.flow_gpm | number | GPM | |
| heat_pump.water.heat_rejection_btuh / heat_extraction_btuh | number | BTU/h | Drives the Cooling/Heating mode indicator. |
| heat_pump.air.return_f / supply_f | number | °F | |
| heat_pump.blower.watts / speed | number | W / step | |
| heat_pump.loop_pump.watts / flow_gpm | number | W / GPM | |
| heat_pump.compressor.watts / stage | number | W / # | stage 0/1/2. |
| heat_pump.compressor.suction_temp_f / suction_pressure_psi | number | °F / psi | |
| heat_pump.compressor.discharge_pressure_psi / discharge_temp_calculated_f | number | psi / °F | |
| heat_pump.compressor.superheat_f | number | °F | |
| heat_pump.compressor.saturated_evaporator_temp_f / saturated_condenser_temp_f | number | °F | |
| heat_pump.compressor.reversing_valve_mode | string | — | "Cool" / "Heat". |
| heat_pump.domestic_hot_water.setpoint_f / temp_f | number | °F | |
| humidity_control.dehumidify_active / relay_active | bool | — | |
| humidity_control.mode | string | — | |
| additional_sensors.<name>.value | number | any | Any extra sensor; stored as x_<name>. |
Numbers may be sent as JSON numbers or numeric strings. Errors: 401 bad/missing token · 422 missing timestamp or invalid JSON · 429 rate limit.