Skip to content

Developers

Device API

Building a scale, a sensor board or your own hive software? Send its readings to HiveControl and they get the same charts, alerts and records as any other hive. All you need is a free account and a device token.

HiveControl accepts sensor data over a small HTTP API, the same one the open-source HiveDevice software uses. Any scale, sensor board or gateway that can make an HTTPS POST can send hive readings, weather and air quality to a HiveControl account with it.

  • Base URL: https://hivecontrol.org (https://www.hivecontrol.org is served too). Use HTTPS: plain HTTP requests are answered with a 301 redirect.
  • Method: every endpoint is POST.
  • Auth: a device token from the HiveControl web app (see Authentication).
Endpoint Purpose
/api/v1/hive/check Look up a hive by name and get its numeric hive id
/api/v1/hive/new Create a hive
/api/v1/hive/data Send one reading (hive sensors, optional weather and air)
/api/v1/hive/data/sync Send a batch of readings (history backfill)
/api/v1/wx/data Send a weather observation not tied to a hive
/api/v1/hive/log Send a device log line
/api/v1/hive/config/version Get the hive's device-configuration version
/api/v1/hive/config Download the hive's device configuration
/api/v1/hive/config/update Upload device configuration
/api/v1/hive/equipment Upload the hive's equipment (boxes and their weights) once

Quick start

Create a device token first: sign in at hivecontrol.org, open Settings → Device API tokens, and choose Create token. Copy it; it is shown only once. Below it is YOUR_DEVICE_TOKEN.

1. Look up the hive by name.

curl -s -X POST https://hivecontrol.org/api/v1/hive/check \
  -F "api_token=YOUR_DEVICE_TOKEN" \
  -F "hivename=Back Yard 1"
  • {"error":"UPDATE_HIVEID","value":"100001"}: the hive exists. Save 100001 as the hive id and skip to step 3.
  • {"error":"NOT_REGISTERED"}: no hive has that name yet. Create it (step 2).

2. Create the hive, then repeat step 1 to get its id.

curl -s -X POST https://hivecontrol.org/api/v1/hive/new \
  -F "api_token=YOUR_DEVICE_TOKEN" \
  -F "name=Back Yard 1" \
  -F "hc_version=1.0" \
  -F "timezone=America/New_York" \
  -F "power=solar" \
  -F "internet=wifi" \
  -F "status=active" \
  -F "computer=esp32" \
  -F "start_date=2026-10-28"

Reply: {"result":"SUCCESS"}. This reply has no id; call hive/check again.

3. Send a reading. Form fields and JSON both work; this one is JSON.

curl -s -X POST https://hivecontrol.org/api/v1/hive/data \
  -H "Authorization: Bearer YOUR_DEVICE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "hive_id": 100001,
    "hivename": "Back Yard 1",
    "hive_observation_time_local": "2026-10-28T12:00:00Z",
    "hive_temp_f": 93.4,
    "hive_humidity": 55.2,
    "hive_weight_lbs": 112.75,
    "hive_battery_voltage": 3.92
  }'

Reply: {"success":"1"}.

4. Send a batch of past readings.

curl -s -w "HTTP %{http_code}\n" -X POST https://hivecontrol.org/api/v1/hive/data/sync \
  -H "Authorization: Bearer YOUR_DEVICE_TOKEN" \
  -H "Content-Type: application/json" \
  --data-binary '[
    {"hive_id": 100001, "hive_name": "Back Yard 1", "hive_observation_time_local": "2026-10-28T10:00:00Z", "hive_temp_f": 91.8, "hive_weight_lbs": 112.1},
    {"hive_id": 100001, "hive_name": "Back Yard 1", "hive_observation_time_local": "2026-10-28T10:15:00Z", "hive_temp_f": 92.0, "hive_weight_lbs": 112.2}
  ]'

Reply: an empty body with HTTP 200 when every record was accepted.

5. Send weather from your own station.

curl -s -X POST https://hivecontrol.org/api/v1/wx/data \
  -H "Authorization: Bearer YOUR_DEVICE_TOKEN" \
  -F "wx_station_id=B4:E6:2D:07:87:49" \
  -F "wx_observation_time_rfc822=2026-10-28T12:00:00Z" \
  -F "wx_temp_f=52.3" \
  -F "wx_relative_humidity=71" \
  -F "wx_pressure_mb=1016.2"

Reply: {"success":"1"}.


Authentication

Every request needs a device token. Users create tokens in the web app under Settings → Device API tokens (the add-hive wizard can also create one). A token:

  • is 60 letters and digits;
  • is shown once, when it's created, and can be revoked at any time from the same page;
  • does not expire;
  • belongs to the account, not to one hive: it can send data for any hive in the account.

An account can hold up to 50 tokens. Use one per device so a lost device can be revoked alone.

Send the token in one of these places (checked in this order):

Where Example
Field api_token in the body (form or JSON object) -F "api_token=YOUR_DEVICE_TOKEN"
Query string api_token .../hive/check?api_token=YOUR_DEVICE_TOKEN
Authorization header Authorization: Bearer YOUR_DEVICE_TOKEN

Prefer the header or a body field: URLs, query strings included, can end up in proxy and server logs.

A missing, wrong or revoked token, or a token of a disabled account, gets 401 {"error":"Unauthenticated."} from every endpoint.


Request format

Requests may be sent as:

Content-Type Used by Notes
multipart/form-data all endpoints except sync What HiveDevice sends (curl -F)
application/x-www-form-urlencoded all endpoints except sync curl -d "a=1&b=2"
application/json, body is an object all endpoints except sync Numbers, strings, true/false and null all work
application/json, body is an array hive/data/sync only The token goes in the header or query string

With form and JSON-object requests, a field missing from the body is also looked up in the query string.

Values. Leading and trailing spaces and double quotes are trimmed from every value. An empty value, or the text null in any letter case, means "not sent". Numbers are plain decimals (93.4, -2, 1e3). Field names are case-sensitive, except configuration and equipment keys (noted where they apply). Fields the API doesn't know are ignored.

Size. Request bodies are limited to 1 MiB (1,048,576 bytes); a 500-record sync batch is about 350 KB.

Times

Timestamps are accepted in these forms:

Form Example Meaning
RFC 3339 with Z or an offset 2026-10-28T12:00:00Z, 2026-10-28T08:00:00-04:00 That exact instant
YYYY-MM-DD HH:MM:SS 2026-10-28 08:00:00 Wall-clock time (see below)
YYYY-MM-DD HH:MM 2026-10-28 08:00 Wall-clock time
YYYY-MM-DDTHH:MM:SS 2026-10-28T08:00:00 Wall-clock time
YYYY-MM-DD 2026-10-28 Midnight, wall-clock time

A date starting 0000-00-00 counts as missing. Other formats, including RFC 822 dates, are not accepted.

Wall-clock times are read in the hive's time zone: the zone given at registration or by a later configuration update, or the hive's location zone if the hive has none, or UTC if neither is a valid IANA zone name. Fields whose name ends in _utc are read as UTC. A time that occurs twice when daylight saving time ends is taken as the first occurrence.

Allowed range. A reading's time must be after 1 January 2010 and no more than 24 hours ahead of the server's clock, or the reading is rejected (INVALID_DATA; in a sync, the record is skipped). Weather and air times must be after 1 January 2010 and no more than 1 hour ahead, or those values are dropped and the hive values kept.

Recommendation: send RFC 3339 with Z or an offset. It's unambiguous and doesn't depend on any time-zone setting.

Units

There are no unit fields. Every field has a fixed unit, given in its name and in the tables below: temperatures in °F (some fields have a _c alternative in °C), weight in pounds, wind in mph, pressure in millibars (or inches of mercury in wx_pressure_in), rain in inches. There is no kilogram weight field: convert before sending (1 kg = 2.20462 lb).


Hive names and hive ids

A device identifies its hive by name (hivename) and a numeric hive id (hive_id) that HiveControl assigns. Every endpoint except hive/new and hive/log checks the pair:

  1. If hive_id is a hive in the token's account and that hive's name matches hivename: the request goes ahead.
  2. Otherwise, if a hive in the account has the name hivename: the API answers with that hive's id (UPDATE_HIVEID) and stores nothing. Save the id and resend.
  3. Otherwise: NOT_REGISTERED. Create the hive with hive/new.

Name matching ignores letter case and leading/trailing spaces: "back yard 1 " matches Back Yard 1. Everything else (inner spaces, punctuation) must match exactly. Only hives in the token's own account are ever matched.

What this means for a device:

  • A new name is NOT_REGISTERED until you call hive/new.
  • A name that matches an existing hive, including a hive the user created in the web app, is found by hive/check, which returns its id. Don't call hive/new for it: that returns DUPLICATE. The add-hive wizard tells the user to give the device the hive's name exactly, for this reason.
  • If the user renames the hive in HiveControl, the device's old name no longer matches and the API answers NOT_REGISTERED. Update the device's name; don't register a new hive.
  • If several hives in one account share a name, the one with the lowest hive id is used.

Weight: net of equipment

Send hive_weight_lbs as the net weight: what the scale reads minus the weight of the hive's equipment (bottom board, boxes, covers, feeder, and anything else on the scale, such as the electronics or a brick). That leaves bees, brood, comb and honey. This is what HiveDevice sends, and HiveControl shows and alerts on the value as sent.

HiveControl does not subtract anything from the uploaded weight. If your scale has no equipment settings, either subtract your own tare before sending, or use the hive's equipment from HiveControl:

  • Once the user has saved the hive's equipment in the web app, hive/config returns its box counts (NUM_HIVE_*) and the weight of each kind of part (HIVE_*_WEIGHT, lbs). The tare is the sum of each count times the matching weight (NUM_HIVE_FEEDER × HIVE_FEEDER_WEIGHT, and so on), plus HIVE_TOP_WEIGHT, HIVE_COMPUTER_WEIGHT and HIVE_MISC_WEIGHT. Until then the weight keys are null.
  • When the user changes the equipment, the hive's config version goes up, so poll it and reload the tare when it changes.

If you send gross weight instead, the charts still work but show the equipment as part of the hive.

Plausibility: a weight of exactly 0, below −10 lbs or above 500 lbs is treated as a sensor fault and dropped from the reading (see Validation). Small negative values are kept: they're expected calibration drift.


Validation

Each numeric field has an upper limit. A value that is not a number or is over the limit rejects the whole reading (INVALID_DATA, nothing stored). There are no lower limits unless stated.

Some hive values are dropped instead: the rest of the reading is stored and the reply is still a success. Old devices send 0 when a sensor is missing, and a disconnected load cell reads a fixed, impossible weight.

Field Rejects the reading Dropped (rest stored)
hive_temp_f > 200 < −60
hive_humidity > 101 ≤ 0
hive_weight_lbs > 1000 exactly 0, < −10, or > 500

Weather and air values with a time more than 1 hour in the future (server clock) are dropped; the hive values of the same reading are still stored.

Duplicates

Sending a reading again is safe. HiveControl keeps one reading per hive per timestamp, one weather observation per station per minute, and one air reading per location per timestamp. The first one stored wins; later duplicates are ignored, and the reply is still a success.


Responses and errors

Most outcomes, including errors, are answered with HTTP 200 and a short JSON body. Always check the body, not just the status. Bodies are compact JSON with no spaces, as shown.

These can come from any endpoint:

Status Body Meaning
401 {"error":"Unauthenticated."} Token missing, wrong or revoked
400 {"error":"INVALID_DATA"} Body couldn't be parsed, or is over 1 MiB
429 {"error":"rate limit exceeded"} Too many requests (see Rate limit)
500 {"error":"SERVER_ERROR"} Server problem; retry later
405 (plain text) Not a POST (reported only when the token is valid)

The hive identity replies (from every endpoint that takes hive_id and hivename):

Body Meaning What to do
{"error":"NOT_REGISTERED"} No hive in the account has that name hive/new, then hive/check
{"action":"UPDATE_HIVEID,100001"} The name belongs to hive 100001, not to the id you sent Save the new id and resend

hive/check reports a stale id in its own format: {"error":"UPDATE_HIVEID","value":"100001"}.

Rate limit

Requests to all device endpoints together are limited per client IP address: a burst of up to 60 requests, refilled at 1 request per second. Over the limit, requests get 429. Devices behind one public IP (one home network, for example) share the budget. For history, use hive/data/sync with up to a few hundred readings per request rather than many hive/data calls, and pause about a second between batches.


Endpoints

POST /api/v1/hive/check

Looks up a hive by name and reports its id. Call it on first start, after the user changes the device's hive name, and when another endpoint answers NOT_REGISTERED. If a hive with this name was created in the web app, this is the call that connects the device to it.

Field Type Required Notes
hivename string, ≤ 100 bytes yes
hiveid integer no The id the device has stored, if any. Note the spelling: hiveid, not hive_id
Status Body Meaning
200 {"error":"REG_VALID"} hiveid and hivename match the same hive. (Despite the key, a success.)
200 {"error":"UPDATE_HIVEID","value":"100001"} A hive has this name; its id is value. Returned when hiveid is missing or different
200 {"error":"NOT_REGISTERED"} No hive with this name
422 {"error":"INVALID_DATA"} hivename missing or longer than 100 bytes

POST /api/v1/hive/new

Creates a hive in the account. Call it only after hive/check answered NOT_REGISTERED. The hive is added to the user's first apiary; if the user has none, a location named "Home" and an apiary named "Home Apiary" are created. The reply does not include the new hive's id: call hive/check next to get it.

All fields are required, non-empty, and at most 255 bytes.

Field Type Notes
name string The hive's name. Must not match another hive in the account (case and outer spaces ignored)
hc_version number Your firmware version as a number, e.g. 1.0 or 2.46. Text such as v2 or 1.2.3 is rejected
timezone string IANA zone name, e.g. America/New_York. Used to read the hive's wall-clock times; an unknown name means UTC
power string Free text, e.g. solar, AC
internet string Free text, e.g. wifi, cellular
status string Free text, kept in the device configuration. The hive itself is always created active
computer string Free text: your hardware, e.g. esp32, pi4
start_date timestamp Any form from Times
Status Body Meaning
200 {"result":"SUCCESS"} Created
200 {"result":"DUPLICATE"} The account already has a hive with this name. Use hive/check to get its id
200 {"result":"INVALID_DATA"} A field is missing, too long, or not in the right format

POST /api/v1/hive/data

Stores one reading: hive sensors, plus optional weather and air quality from the same moment. Call it each time the device takes a reading.

Fields: the identity fields, the reading fields, and optionally the weather and air fields. Only hive_id, hivename and hive_observation_time_local are required; send whichever sensor values you have.

Status Body Meaning
200 {"success":"1"} Stored (possibly with some values dropped, see Validation)
200 {"error":"INVALID_DATA"} Identity fields missing or malformed, the time can't be read, or a value is not a number or over its limit. Nothing stored
200 {"error":"NOT_REGISTERED"} / {"action":"UPDATE_HIVEID,<id>"} See identity replies

POST /api/v1/hive/data/sync

Stores many readings in one request: for uploading history, or catching up after the device was offline. Send Content-Type: application/json with a JSON array of records, oldest first. Put the token in the Authorization header or the api_token query parameter (there is no body field for it).

Each record is an object with the same fields as hive/data, except that the hive name may be sent as hive_name (preferred) or hivename. Records may be for different hives in the account. Send at most 1,000 records per request (and within the 1 MiB body limit); HiveDevice sends 500 at a time. A few syncs are processed at once; others wait their turn.

Records are processed in order:

  • a record that fails validation, or has no hive name, is skipped and counted;
  • a record whose hive_id/name pair doesn't match stops the batch: records before it are stored, it and everything after it are not, and the reply is the identity error. Fix the id and resend from the start: readings already stored are ignored as duplicates.
Status Body Meaning
200 (empty) Every record stored
200 {"error":"INVALID_DATA","rejected":"3"} All others stored; 3 records were skipped
200 {"error":"NOT_REGISTERED"} A record's hive name isn't in the account. Earlier records stored
200 {"action":"UPDATE_HIVEID,<id>"} A record's name belongs to hive <id>. Earlier records stored
400 {"error":"INVALID_DATA"} The body isn't a JSON array of objects, has more than 1,000 records, or Content-Type isn't application/json

POST /api/v1/wx/data

Stores a weather observation that isn't attached to a hive reading: for a stand-alone weather station. (To send weather with a hive reading, add the weather fields to hive/data instead.)

Field Type Required Notes
wx_station_id string yes See Weather stations
wx_observation_time_rfc822 timestamp yes Any form from Times. Wall-clock times are read in the time zone of the user's first location (UTC if none)
weather fields at least one
Status Body Meaning
200 {"success":"1"} Stored
200 {"error":"INVALID_DATA"} Station id or time missing, the time can't be read or is more than 1 hour in the future, no weather value was sent, or a value is not a number or over its limit

POST /api/v1/hive/log

Stores one line of the device's log. The user sees recent lines in the web app (they're kept for 30 days), and the add-hive wizard takes the first one as a sign the device has connected. Only the id is checked, not the name.

Field Type Required Notes
hive_id integer yes
program string yes What wrote the line, e.g. CURRCONDITIONS
type string yes Severity, e.g. INFO, ERROR
message string yes Cut to 2,000 bytes
Status Body Meaning
200 {"success":"1"} Stored
200 {"error":"unknown"} No hive with this id in the account
200 {"error":"INVALID_DATA"} A field is missing, or hive_id isn't an integer

POST /api/v1/hive/config/version

Returns the version number of the hive's device configuration. The number goes up when the user changes settings or equipment in the web app. Poll it and download hive/config when it's higher than the version you have.

Fields: the identity fields.

Status Body Meaning
200 {"version":"23"} The version, as a string
200 {"error":"INVALID_DATA"} Identity fields missing or malformed
200 identity replies See Responses and errors

POST /api/v1/hive/config

Returns the hive's device configuration: the HiveDevice settings the user can edit in the web app (sensors, calibration, weather source, equipment counts and weights, and so on). A third-party device can ignore the settings it has no use for; the equipment keys are useful for weight.

Fields: the identity fields.

Reply 200: one JSON object. Every configuration key is present, as a string or null when unset, plus:

Key Type Notes
id integer The hive id
name string The hive's name
version integer The configuration version
timezone string The hive's time zone
user_id integer or null
created_at, updated_at string YYYY-MM-DD HH:MM:SS, UTC
hiveid, yard_id, hiveapi, api_status, ipaddress, deleted_at null Always null; kept for old devices
{"id":100001,"name":"Back Yard 1","version":23,"timezone":"America/New_York",
 "NUM_HIVE_BODY_DEEP_FOUNDATION":"2","HIVE_BODY_DEEP_FOUNDATION_WEIGHT":"10.5",
 "gdd_base_temp":"50","enable_lux":null, "...": "..."}

Errors: {"error":"INVALID_DATA"} (identity fields missing or malformed) and the identity replies, all with status 200.

The configuration includes third-party weather API keys the user entered for the device (key_*, hive_air_api). Treat the reply as a secret.

POST /api/v1/hive/config/update

Uploads configuration values the device changed locally. Only the keys you send change.

Field Type Required Notes
identity fields yes
version integer yes Becomes the hive's configuration version
any configuration key string no Key names in any letter case

How values are applied:

  • An empty value or null clears that key. Keys you don't send are left alone.
  • Unknown keys, and values over 1,000 bytes, are ignored.
  • timezone must be a valid IANA zone name, or it's ignored. It also becomes the hive's time zone for reading wall-clock times.
  • Once the user manages the hive's equipment in the web app, uploaded box counts and part weights (NUM_HIVE_*, HIVE_*_WEIGHT) are ignored: the web app's values win.
  • If the user set the hive up in the web app before the device connected, the device's first upload doesn't overwrite the settings made there. The version is then set above the one you sent, so your next config/version check tells you to download the merged configuration.
Status Body Meaning
200 {"success":"1"} Saved
422 {"error":"INVALID_DATA"} version missing or not an integer, or identity fields missing or malformed
200 identity replies See Responses and errors

POST /api/v1/hive/equipment

Uploads what the hive is built from, so HiveControl can manage it. Accepted once per hive: when the hive has no equipment saved yet. After that, equipment is edited in the web app and read back from hive/config. Field names may be in any letter case; values over 255 bytes are ignored.

Field Type Notes
identity fields Required
HIVE_STACK_ORDER string Part types, bottom first, comma-separated: solid_bottom, screened_bottom, deep, medium, shallow, feeder, inner_cover, migratory_cover, tele_cover. Unknown names are skipped; at most 30 parts
NUM_HIVE_* integer Box counts, e.g. NUM_HIVE_BODY_DEEP_FOUNDATION=2 (full list under Configuration keys). Used to build the stack when HIVE_STACK_ORDER is absent
HIVE_*_WEIGHT number, lbs Empty weight of one part of each kind, e.g. HIVE_BODY_DEEP_FOUNDATION_WEIGHT=10.5. 0 means not set; over 200 rejects the upload
HIVE_TOP_WEIGHT, HIVE_COMPUTER_WEIGHT, HIVE_MISC_WEIGHT number, lbs Other weight on the scale. 0–500 lbs
SENSOR_TEMP_POSITION integer 0-based stack position of the part the temperature sensor sits on top of (not the top part)
SENSOR_TEMP_LABEL string Cut to 50 characters. Default "Hive temp"
FRAME_FEEDER_POSITION integer 0-based stack position of the box (deep, medium, shallow) holding a frame feeder; -1 for none
FRAME_FEEDER_LABEL string Default "Frame feeder"
FEEDER_HAS_SYRUP 1 or 0 Whether the top feeder has syrup

The stack must have at least one part (from HIVE_STACK_ORDER or the counts). When the upload is stored, the configuration version goes up if the hive's counts or weights changed.

Status Body Meaning
200 {"result":"SUCCESS"} Stored
200 {"result":"EXISTS"} The hive already has equipment in HiveControl; nothing changed
200 {"result":"INVALID_DATA"} No stack, or a part weight over 200 lbs
200 {"error":"INVALID_DATA"} and identity replies Identity fields missing or wrong

Field reference

Identity

Sent with hive/data, hive/data/sync records, and all hive/config* and hive/equipment requests.

Field Type Required Notes
hive_id integer yes The id from hive/check. Must be a whole number (a JSON number or a numeric string)
hivename string, ≤ 255 bytes yes In sync records, hive_name is also accepted

Reading fields

Field Type / unit Limit Notes
hive_observation_time_local timestamp required When the reading was taken. Wall-clock time in the hive's time zone, or RFC 3339
hive_observation_time_utc timestamp optional Same moment in UTC. When present and readable, it's used instead of the local time
hive_temp_f number, °F ≤ 200 Hive temperature. Below −60 is dropped
hive_temp_c number, °C ≤ 200 Used only when hive_temp_f is absent (but checked against its limit even then); converted to °F, then dropped if outside −60…200 °F
hive_humidity number, % RH ≤ 101 0 or below is dropped
hive_weight_lbs number, lbs ≤ 1000 Net weight (see Weight). 0, below −10 or above 500 is dropped
hive_battery_voltage number, volts ≤ 50000
hive_flight_in integer, bees ≤ 1,000,000 Bee counter: bees in
hive_flight_out integer, bees ≤ 1,000,000 Bee counter: bees out

Bee counts must be whole numbers (120 or 120.0).

Weather fields

Optional, with hive/data and sync records; at least one is required with wx/data. A weather observation is stored only if at least one of the measured values below is sent.

Field Type / unit Limit Notes
wx_station_id string Which station measured it; see Weather stations
wx_observation_time_rfc822 timestamp When it was measured. With hive/data, read in the hive's time zone; defaults to the reading's time. Rounded down to the minute
wx_temp_f number, °F ≤ 200 Air temperature
wx_temp_c number, °C ≤ 200 Used only when wx_temp_f is absent
wx_relative_humidity number, % ≤ 255
wx_wind_mph number, mph ≤ 500
wx_wind_gust_mph number, mph ≤ 500 wx_wind_gust_mpg (HiveDevice's spelling) is also accepted
wx_wind_degrees number, degrees ≤ 360 Wind direction
wx_pressure_mb number, millibars (hPa) ≤ 10000
wx_pressure_in number, inches of mercury ≤ 10000 Used only when wx_pressure_mb is absent; converted to millibars
wx_dewpoint_f number, °F ≤ 255
wx_dewpoint_c number, °C ≤ 255 Used only when wx_dewpoint_f is absent
wx_precip_1hr_in number, inches ≤ 255 Rain in the last hour
wx_solar_radiation number, W/m² ≤ 50000

Air fields

Optional, with hive/data and sync records. Air readings belong to the hive's location: all hives at one location share them.

Field Type / unit Limit Notes
air_date timestamp When it was measured, in the hive's time zone. Defaults to the reading's time
air_pm1 number, µg/m³ ≤ 200000
air_pm2_5 number, µg/m³ ≤ 200000
air_pm10 number, µg/m³ ≤ 200000
air_pm2_5_aqi integer, AQI ≤ 200000 air_aqi is also accepted
air_temp number, °F ≤ 200
air_humidity number, % ≤ 101

HiveDevice also sends these, which are accepted and ignored: record_id, wx_wind_dir, wx_precip_1hr_metric, wx_precip_today_in, wx_precip_today_metric, air_pm10_aqi, air_pm1_raw, air_pm2_5_raw, air_pm10_raw, air_pressure, air_source.

Weather stations

Weather is stored per station, chosen by wx_station_id. IDs of public weather networks are shared by every HiveControl user; anything else is private to your account.

wx_station_id Example Treated as Shared?
ST- and digits ST-00003478 WeatherFlow Tempest station Yes
4 or more letters, then digits KCTFAIRF23 Weather Underground personal station Yes
Exactly 4 letters KTTN Airport (ICAO) station Yes
LOCALSENSOR Your local sensor No
A MAC address B4:E6:2D:07:87:49 Your local station No
Other short text (letters, digits, spaces, . , ' ( ) -; up to 64 characters) Back porch Your station with that name No
Empty, 0, null, or anything else "Unknown local weather" No

Shared station IDs are upper-cased; private text IDs match without regard to case.

If you built the weather sensor, send its MAC address or a name, not a public station ID. Readings for a public station ID are shared with everyone who uses that station, and only the first observation for each minute is kept.

Configuration keys

Returned by hive/config and accepted by hive/config/update (any letter case). Most are HiveDevice settings.

hc_version timezone power internet status computer start_date run homedir public_html_dir
check_for_upgrades bee_race bee_source hive_type hive_status queen_start queen_color
enable_hive_temp_chk temptype hive_temp_gpio hive_temp_measure hivedevice hive_temp_slope
hive_temp_intercept hive_humidity_slope hive_humidity_intercept enable_hive_weight_chk
scaletype hive_weight_gpio hive_weight_slope hive_weight_intercept enable_lux lux_source
hive_lux_gpio hive_lux_slope hive_lux_intercept enable_hive_camera enable_beecounter
cameratype cameramode countertype gdd_base_temp gdd_start_date latitude longitude
local_wx_type local_wx_url weather_detail weather_level wx_humidity_intercept
wx_humidity_slope wx_temp_gpio wx_temp_intercept wx_temp_slope wx_temper_device wx_station
wx_temp_type enable_hive_air_chk hive_air_type hive_air_id hive_air_api weather_fallback
weather_fallback_2 wx_max_stale_minutes key_openweathermap key_weatherapi key_visualcrossing
key_pirateweather key_tomorrow key_ambee key_airnow enable_airnow airnow_distance

Equipment: box counts and the weight (lbs) of one part of each kind.

Count Weight
NUM_HIVE_BASE_SOLID_BOTTOM_BOARD HIVE_BASE_SOLID_BOTTOM_BOARD_WEIGHT
NUM_HIVE_BASE_SCREENED_BOTTOM_BOARD HIVE_BASE_SCREENED_BOTTOM_BOARD_WEIGHT
NUM_HIVE_BODY_DEEP_FOUNDATION HIVE_BODY_DEEP_FOUNDATION_WEIGHT
NUM_HIVE_BODY_DEEP_FOUNDATION_LESS HIVE_BODY_DEEP_FOUNDATION_LESS_WEIGHT
NUM_HIVE_BODY_MEDIUM_FOUNDATION HIVE_BODY_MEDIUM_FOUNDATION_WEIGHT
NUM_HIVE_BODY_MEDIUM_FOUNDATION_LESS HIVE_BODY_MEDIUM_FOUNDATION_LESS_WEIGHT
NUM_HIVE_BODY_SHAL_FOUNDATION HIVE_BODY_SHAL_FOUNDATION_WEIGHT
NUM_HIVE_BODY_SHAL_FOUNDATION_LESS HIVE_BODY_SHAL_FOUNDATION_LESS_WEIGHT
NUM_HIVE_FEEDER HIVE_FEEDER_WEIGHT
NUM_HIVE_TOP_INNER_COVER HIVE_TOP_INNER_COVER_WEIGHT
NUM_HIVE_TOP_TELE_COVER HIVE_TOP_TELE_COVER_WEIGHT
NUM_HIVE_TOP_MIGRATORY_COVER HIVE_TOP_MIGRATORY_COVER_WEIGHT
HIVE_TOP_WEIGHT, HIVE_COMPUTER_WEIGHT, HIVE_MISC_WEIGHT (count 1)

Once the web app manages the hive's equipment, the _LESS (foundationless) counts are 0 and those boxes are counted with their size.

Get a device token

Create a free account, then make a token under Settings → Device API tokens.