# Beestat API

**URL:** https://community.beestat.io/t/beestat-api/1371
**Category:** Uncategorized
**Created:** [January 17, 2025, 11:49am UTC](https://community.beestat.io/t/beestat-api/1371 "2025-01-17T11:49:31Z")
**Posts on this page:** 19
**Page:** 1

<div class="post-metadata">

### Author: ![fordguy64](https://community.beestat.io/letter_avatar_proxy/v4/letter/f/9e8a1a/32.png) [@fordguy64](https://community.beestat.io/u/fordguy64)
#### Post date: [January 17, 2025, 11:49am UTC](https://community.beestat.io/t/beestat-api/1371/1 "2025-01-17T11:49:31Z")

</div>

Im new to API’s. I was looking at the Beestat API’s and i didnt see one for the IAQ feature on the ecobee thermostat. Is that an option? id like to control my fresh air damper off of that.

Rob

---

<div class="post-metadata">

### Author: ![ziebelje](https://community.beestat.io/user_avatar/community.beestat.io/ziebelje/32/633_2.png) [@ziebelje](https://community.beestat.io/u/ziebelje)
#### Post date: [January 17, 2025, 9:13pm UTC](https://community.beestat.io/t/beestat-api/1371/2 "2025-01-17T21:13:14Z")

</div>

The air quality information is part of the sensors API. You’ll use runtime\_sensor.read to access the data.

---

<div class="post-metadata">

### Author: ![fordguy64](https://community.beestat.io/letter_avatar_proxy/v4/letter/f/9e8a1a/32.png) [@fordguy64](https://community.beestat.io/u/fordguy64)
#### Post date: [January 18, 2025, 7:03pm UTC](https://community.beestat.io/t/beestat-api/1371/3 "2025-01-18T19:03:14Z")

</div>

ok I think I have it working. although the sensor details for the IAQ all say unknown? Im using node red to send and receive the response if thats needed.

{“id”:“4”,“type”:“airQualityAccuracy”,“value”:“unknown”},{“id”:“5”,“type”:“airQuality”,“value”:“unknown”},{“id”:“6”,“type”:“vocPPM”,“value”:“unknown”},

---

<div class="post-metadata">

### Author: ![ziebelje](https://community.beestat.io/user_avatar/community.beestat.io/ziebelje/32/633_2.png) [@ziebelje](https://community.beestat.io/u/ziebelje)
#### Post date: [January 23, 2025, 11:50am UTC](https://community.beestat.io/t/beestat-api/1371/4 "2025-01-23T11:50:15Z")

</div>

What API call did you run to get that output? If you do something like this:

[https://api.beestat.io/?api\_key=](https://api.beestat.io/?api_key=){YOUR API KEY}&resource=runtime\_sensor&method=read&arguments={“attributes”:{“sensor\_id”:{YOUR SENSOR ID},“timestamp”:{“value”:“2025-01-01 00:00:00”,“operator”:“\>”}}}

You should get an array of rows that looks like this:

 ![image](https://community.beestat.io/uploads/default/original/1X/4ce9cdd4f9a1a88b1cc3acb210d82ae152769879.png)

---

<div class="post-metadata">

### Author: ![fordguy64](https://community.beestat.io/letter_avatar_proxy/v4/letter/f/9e8a1a/32.png) [@fordguy64](https://community.beestat.io/u/fordguy64)
#### Post date: [January 28, 2025, 12:08am UTC](https://community.beestat.io/t/beestat-api/1371/5 "2025-01-28T00:08:33Z")

</div>

i used this one.

[https://api.beestat.io/?api\_key=](https://api.beestat.io/?api_key=){YOUR API KEY}&resource=thermostat&method=read\_id

obviously id put in my api key. some of the other info that comes back is strange as well

---

<div class="post-metadata">

### Author: ![fordguy64](https://community.beestat.io/letter_avatar_proxy/v4/letter/f/9e8a1a/32.png) [@fordguy64](https://community.beestat.io/u/fordguy64)
#### Post date: [January 28, 2025, 12:46am UTC](https://community.beestat.io/t/beestat-api/1371/6 "2025-01-28T00:46:16Z")

</div>

ok I’ve got it working now. how often can send an API request?

---

<div class="post-metadata">

### Author: ![ziebelje](https://community.beestat.io/user_avatar/community.beestat.io/ziebelje/32/633_2.png) [@ziebelje](https://community.beestat.io/u/ziebelje)
#### Post date: [January 28, 2025, 11:39am UTC](https://community.beestat.io/t/beestat-api/1371/7 "2025-01-28T11:39:08Z")

</div>

I think the limit is 30 requests per minute or something absurd. If you break it the API will tell you.

---

<div class="post-metadata">

### Author: ![fordguy64](https://community.beestat.io/letter_avatar_proxy/v4/letter/f/9e8a1a/32.png) [@fordguy64](https://community.beestat.io/u/fordguy64)
#### Post date: [January 28, 2025, 12:31pm UTC](https://community.beestat.io/t/beestat-api/1371/8 "2025-01-28T12:31:31Z")

</div>

ok thats way more than i want to do lol also another question. is there a way in the api to show if the system is in stage one or two and actively running? i was looking at the response and i didnt see anything

---

<div class="post-metadata">

### Author: ![ziebelje](https://community.beestat.io/user_avatar/community.beestat.io/ziebelje/32/633_2.png) [@ziebelje](https://community.beestat.io/u/ziebelje)
#### Post date: [January 30, 2025, 11:48am UTC](https://community.beestat.io/t/beestat-api/1371/9 "2025-01-30T11:48:33Z")

</div>

The easiest way is to do a thermostat.read API call (not ecobee\_thermostat.read) and use the running\_equipment column.

You can also get it from ecobee\_thermostat.equipment\_status although that is less normalized as it’s the raw data from ecobee.

---

<div class="post-metadata">

### Author: ![fordguy64](https://community.beestat.io/letter_avatar_proxy/v4/letter/f/9e8a1a/32.png) [@fordguy64](https://community.beestat.io/u/fordguy64)
#### Post date: [February 8, 2025, 1:31am UTC](https://community.beestat.io/t/beestat-api/1371/10 "2025-02-08T01:31:59Z")

</div>

thanks for your help. ive run into another interesting thing. ive been using the api to request some data like the outdoor temp and humidity along with the equipment status. ive found that if i dont have the beestat open in my browser the api info wont update. is that normal?

---

<div class="post-metadata">

### Author: ![ziebelje](https://community.beestat.io/user_avatar/community.beestat.io/ziebelje/32/633_2.png) [@ziebelje](https://community.beestat.io/u/ziebelje)
#### Post date: [February 8, 2025, 12:23pm UTC](https://community.beestat.io/t/beestat-api/1371/11 "2025-02-08T12:23:28Z")

</div>

Look at the thermostat.sync and sensor.sync API calls. Beestat updates when you use it in the browser and also occasionally when you’re not actively using it. You can use those calls to trigger a sync before reading data.

---

<div class="post-metadata">

### Author: ![fordguy64](https://community.beestat.io/letter_avatar_proxy/v4/letter/f/9e8a1a/32.png) [@fordguy64](https://community.beestat.io/u/fordguy64)
#### Post date: [February 11, 2025, 11:51am UTC](https://community.beestat.io/t/beestat-api/1371/12 "2025-02-11T11:51:45Z")

</div>

thanks! that fixed it

---

<div class="post-metadata">

### Author: ![ycolasan](https://community.beestat.io/user_avatar/community.beestat.io/ycolasan/32/739_2.png) [@ycolasan](https://community.beestat.io/u/ycolasan)
#### Post date: [April 25, 2026, 6:37am UTC](https://community.beestat.io/t/beestat-api/1371/13 "2026-04-25T06:37:23Z")

</div>

Jon, I have 18 thermostats and trying to get an email if one of them is offline for a few hours. I don’t run the Beestat app for each thermostat everyday. I tried running a sync php first and then another php to collect the ‘data\_end’ but the sync file is not bringing the ‘data\_end’ to now using resource=thermostat&method=sync and resource=sensor&method=sync calls.

Any suggestions on this?

---

<div class="post-metadata">

### Author: ![ziebelje](https://community.beestat.io/user_avatar/community.beestat.io/ziebelje/32/633_2.png) [@ziebelje](https://community.beestat.io/u/ziebelje)
#### Post date: [April 25, 2026, 12:46pm UTC](https://community.beestat.io/t/beestat-api/1371/14 "2026-04-25T12:46:43Z")

</div>

Could you share the exact request and response from one of your sync calls that isn’t working? Also, make sure you are waiting for that sync call to complete before sending a request to get data. It can take a minute.

---

<div class="post-metadata">

### Author: ![ycolasan](https://community.beestat.io/user_avatar/community.beestat.io/ycolasan/32/739_2.png) [@ycolasan](https://community.beestat.io/u/ycolasan)
#### Post date: [April 25, 2026, 2:07pm UTC](https://community.beestat.io/t/beestat-api/1371/15 "2026-04-25T14:07:57Z")

</div>

I tried manual URL after the PHP code at the bottom didn’t update. I waited overnight:

[https://api.beestat.io/?api\_key=myAPIKey&resource=thermostat&method=sync](https://api.beestat.io/?api_key=myAPIKey&resource=thermostat&method=sync)  
{“success”:true,“data”:true}  
[https://api.beestat.io/?api\_key=myAPIKey&resource=sensor&method=sync](https://api.beestat.io/?api_key=myAPIKey&resource=sensor&method=sync)  
{“success”:true,“data”:null}

And this is the PHP

function beestat\_sync(string $resource, string $method, array $arguments = ): void  
{  
$args\_json = empty($arguments) ? ‘{}’ : json\_encode($arguments);  
$url = BEESTAT\_API\_BASE . ‘?’ . http\_build\_query([  
‘api\_key’ =\> BEESTAT\_API\_KEY,  
‘resource’ =\> $resource,  
‘method’ =\> $method,  
]) . ‘&arguments=’ . urlencode($args\_json);

```
$ctx = stream_context_create(['http' => ['timeout' => 10, 'ignore_errors' => true]]);
@file_get_contents($url, false, $ctx);

```

}

echo “=== Beestat Sync — " . date(‘Y-m-d H:i:s’) . " ===\n”;

// Get active thermostat IDs first  
$url = BEESTAT\_API\_BASE . ‘?api\_key=’ . BEESTAT\_API\_KEY . ‘&resource=thermostat&method=read\_id&arguments={}’;  
$ctx = stream\_context\_create([‘http’ =\> [‘timeout’ =\> 15, ‘ignore\_errors’ =\> true]]);  
$raw = @file\_get\_contents($url, false, $ctx);  
$json = json\_decode($raw, true);

echo “[Sync] Triggering thermostat sync…\n”;  
beestat\_sync(‘thermostat’, ‘sync’);

echo “[Sync] Triggering sensor sync…\n”;  
beestat\_sync(‘sensor’, ‘sync’);

// Sync each active thermostat individually  
if (!empty($json[‘data’]) && is\_array($json[‘data’])) {  
foreach ($json[‘data’] as $id =\> $thermostat) {  
if (empty($thermostat[‘inactive’]) && empty($thermostat[‘deleted’])) {  
$ecobee\_id = $thermostat[‘ecobee\_thermostat\_id’] ?? null;  
if ($ecobee\_id) {  
beestat\_sync(‘thermostat’, ‘sync’, [‘ecobee\_thermostat\_id’ =\> $ecobee\_id]);  
}  
}  
}  
echo “[Sync] Synced " . count($json[‘data’]) . " thermostats.\n”;  
}

echo “[Sync] Done. Run check\_thermostats.php in 60 seconds.\n”;

---

<div class="post-metadata">

### Author: ![ycolasan](https://community.beestat.io/user_avatar/community.beestat.io/ycolasan/32/739_2.png) [@ycolasan](https://community.beestat.io/u/ycolasan)
#### Post date: [April 26, 2026, 12:34am UTC](https://community.beestat.io/t/beestat-api/1371/16 "2026-04-26T00:34:32Z")

</div>

Jon, this one worked though to update ‘data\_end’, and solves our problem. Thanks a lot

[https://api.beestat.io/?api\_key=](https://api.beestat.io/?api_key=){YOUR API KEY}&resource=runtime&method=sync

---

<div class="post-metadata">

### Author: ![ziebelje](https://community.beestat.io/user_avatar/community.beestat.io/ziebelje/32/633_2.png) [@ziebelje](https://community.beestat.io/u/ziebelje)
#### Post date: [April 26, 2026, 10:44am UTC](https://community.beestat.io/t/beestat-api/1371/17 "2026-04-26T10:44:16Z")

</div>

Yes, depending on what you want, you may need to call thermostat-\>sync, sensor-\>sync, and runtime-\>sync. Each does a different thing. The runtime-\>sync call specifically syncs your historical data. The other two only sync current status.

---

<div class="post-metadata">

### Author: ![ycolasan](https://community.beestat.io/user_avatar/community.beestat.io/ycolasan/32/739_2.png) [@ycolasan](https://community.beestat.io/u/ycolasan)
#### Post date: [April 26, 2026, 10:53pm UTC](https://community.beestat.io/t/beestat-api/1371/18 "2026-04-26T22:53:26Z")

</div>

For future reference to other users, we wanted to get a notification if any of the thermostats is offline (mostly because the drain is clogged and safety switch cuts the power to Ecobee). Ecobee doesn’t have a native notification.

So we run 2 cron jobs. First is runtime sync, and after 15 minutes we read ‘data\_end’. If ‘data\_end’ is not within 1 hour, we notify ourselves by email.

---

<div class="post-metadata">

### Author: ![ziebelje](https://community.beestat.io/user_avatar/community.beestat.io/ziebelje/32/633_2.png) [@ziebelje](https://community.beestat.io/u/ziebelje)
#### Post date: [April 28, 2026, 10:40am UTC](https://community.beestat.io/t/beestat-api/1371/19 "2026-04-28T10:40:56Z")

</div>

If you really just care if it’s online, it would be faster to call thermostat-\>sync(), then use ecobee\_thermostat-\>read\_id(). That will just give you a singular thermostat row with some recent data and timestamps on it. Then you don’t have to wait on the longer more intensive runtime-\>sync().

> **[Notion | Where teams and agents work together](https://beestat.notion.site/ecobee_thermostat-read_id-json-3827cb5fe1814406b6a979e753ac3ac2)**
>
> A collaborative AI workspace, built on your company context. Build and orchestrate agents right alongside your team's projects, meetings, and connected apps.
