Send Your Data — Ingest API

Stream readings from your own hardware into Jumboshack. No Jumboshack software required — just an account, a device token, and JSON over HTTPS.

1 · Get a token

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.

2 · Post a reading

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.

3 · Test first with a dry run recommended

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"}

Minimal payload

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 }
  }
}

Full payload

{
  "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 } }
}

Field reference

PathTypeUnitNotes
metadata.time *requiredstringReading time. ISO-8601 (2026-08-22T17:00:31Z, offset, or naive=UTC). Aliases: query_end, query_start, timestamp.
metadata.unitstringYour label for the unit (e.g. "1").
metadata.unit_locationstringWhere it is (e.g. "Basement").
metadata.software_versionstringYour firmware/agent version — shown in your account.
thermostat.ambient_temperature_fnumber°FIndoor/zone temp.
thermostat.relative_humidity_pctnumber%
thermostat.heat_setpoint_f / cool_setpoint_fnumber°F
thermostat.modestringFree text (e.g. heating/cooling/off).
heat_pump.total_wattsnumberWPowers energy & cost.
heat_pump.water.entering_f / leaving_fnumber°FLoop temps (EWT/LWT).
heat_pump.water.flow_gpmnumberGPM
heat_pump.water.heat_rejection_btuh / heat_extraction_btuhnumberBTU/hDrives the Cooling/Heating mode indicator.
heat_pump.air.return_f / supply_fnumber°F
heat_pump.blower.watts / speednumberW / step
heat_pump.loop_pump.watts / flow_gpmnumberW / GPM
heat_pump.compressor.watts / stagenumberW / #stage 0/1/2.
heat_pump.compressor.suction_temp_f / suction_pressure_psinumber°F / psi
heat_pump.compressor.discharge_pressure_psi / discharge_temp_calculated_fnumberpsi / °F
heat_pump.compressor.superheat_fnumber°F
heat_pump.compressor.saturated_evaporator_temp_f / saturated_condenser_temp_fnumber°F
heat_pump.compressor.reversing_valve_modestring"Cool" / "Heat".
heat_pump.domestic_hot_water.setpoint_f / temp_fnumber°F
humidity_control.dehumidify_active / relay_activebool
humidity_control.modestring
additional_sensors.<name>.valuenumberanyAny 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.

← Back to your account