HVAC
Set HVAC schedule
Coming soon. Set or replace the schedule on this HVAC device. The route answers 501 Not Implemented until first-class schedules ship.
PUT
/
hvac
/
{deviceId}
/
schedule
curl
curl --request PUT \
--url 'https://api.amps.ai/hvac/device_abc123/schedule' \
--header 'x-api-key: amps_sk_test_xxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'content-type: application/json' \
--data '{
"timezone": "Europe/London",
"recurrence": {
"rule": "daily"
},
"slots": [
{
"time": "00:30",
"duration": "PT5H",
"command": "charge",
"parameters": {
"target": {
"value": 100,
"unit": "percent"
}
}
}
]
}'const response = await fetch('https://api.amps.ai/hvac/device_abc123/schedule', {
method: 'PUT',
headers: {
'x-api-key': 'amps_sk_test_xxxxxxxxxxxxxxxxxxxxxxxx',
'content-type': 'application/json',
},
body: JSON.stringify({
"timezone": "Europe/London",
"recurrence": {
"rule": "daily"
},
"slots": [
{
"time": "00:30",
"duration": "PT5H",
"command": "charge",
"parameters": {
"target": {
"value": 100,
"unit": "percent"
}
}
}
]
}),
});
const data = await response.json();import requests
url = 'https://api.amps.ai/hvac/device_abc123/schedule'
headers = {
'x-api-key': 'amps_sk_test_xxxxxxxxxxxxxxxxxxxxxxxx',
'content-type': 'application/json',
}
payload = {
"timezone": "Europe/London",
"recurrence": {
"rule": "daily",
},
"slots": [
{
"time": "00:30",
"duration": "PT5H",
"command": "charge",
"parameters": {
"target": {
"value": 100,
"unit": "percent",
},
},
},
],
}
response = requests.put(url, headers=headers, json=payload)
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.amps.ai/hvac/{deviceId}/schedule",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'timezone' => 'Europe/London',
'recurrence' => [
'rule' => 'daily'
],
'slots' => [
[
'time' => '00:30',
'duration' => 'PT5H',
'command' => 'charge',
'parameters' => [
'target' => [
'value' => 100,
'unit' => 'percent'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.amps.ai/hvac/{deviceId}/schedule"
payload := strings.NewReader("{\n \"timezone\": \"Europe/London\",\n \"recurrence\": {\n \"rule\": \"daily\"\n },\n \"slots\": [\n {\n \"time\": \"00:30\",\n \"duration\": \"PT5H\",\n \"command\": \"charge\",\n \"parameters\": {\n \"target\": {\n \"value\": 100,\n \"unit\": \"percent\"\n }\n }\n }\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.amps.ai/hvac/{deviceId}/schedule")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"timezone\": \"Europe/London\",\n \"recurrence\": {\n \"rule\": \"daily\"\n },\n \"slots\": [\n {\n \"time\": \"00:30\",\n \"duration\": \"PT5H\",\n \"command\": \"charge\",\n \"parameters\": {\n \"target\": {\n \"value\": 100,\n \"unit\": \"percent\"\n }\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.amps.ai/hvac/{deviceId}/schedule")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"timezone\": \"Europe/London\",\n \"recurrence\": {\n \"rule\": \"daily\"\n },\n \"slots\": [\n {\n \"time\": \"00:30\",\n \"duration\": \"PT5H\",\n \"command\": \"charge\",\n \"parameters\": {\n \"target\": {\n \"value\": 100,\n \"unit\": \"percent\"\n }\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "sched_abc123",
"deviceId": "device_abc123",
"deviceType": "hvac",
"state": "active",
"timezone": "Europe/London",
"recurrence": {
"rule": "daily"
},
"slots": [
{
"time": "00:30",
"duration": "PT5H",
"command": "charge",
"parameters": {
"target": {
"value": 100,
"unit": "percent"
}
}
}
],
"updatedAt": "2026-06-01T12:00:00.000Z",
"nextFireAt": "2026-06-02T00:30:00.000Z"
}{
"success": false,
"error": {
"code": "DEVICE_NOT_FOUND",
"message": "No matching device was found for the supplied details.",
"details": {
"description": "Device not found or access denied"
}
},
"meta": {
"requestId": "req_5pH1cQbY",
"timestamp": "2026-04-29T12:00:00.000Z",
"path": "/hvac/device_unknown_999",
"latencyMs": 5
}
}{
"success": false,
"error": {
"code": "NOT_IMPLEMENTED",
"message": "This API operation is not implemented.",
"details": {
"description": "Setting a device schedule is not yet implemented."
}
},
"meta": {
"requestId": "req_NotImplYet1",
"timestamp": "2026-04-29T12:00:00.000Z",
"path": "/hvac/device_abc123/schedule",
"latencyMs": 1
}
}Coming soon. First-class schedules are on the roadmap. Until they ship, this route answers
501 Not Implemented.Schedule the work one command at a time instead. Send a push with start to run a command later, or with start and end to run it for a window. Send one push for each time you want something to happen.A device that lists auto.schedule in its commands map already runs its own stored program when you send that command.Authorizations
Path Parameters
The unique identifier for the HVAC device.
Example:
"device_abc123"
Body
application/json
The schedule to set on the device: a non-empty slots array, an optional recurrence, and an optional timezone (required for time-variant slots). No deviceId in the body; the device is the URL.
The body is of type string.
Response
Schedule set on the device.
⌘I
curl
curl --request PUT \
--url 'https://api.amps.ai/hvac/device_abc123/schedule' \
--header 'x-api-key: amps_sk_test_xxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'content-type: application/json' \
--data '{
"timezone": "Europe/London",
"recurrence": {
"rule": "daily"
},
"slots": [
{
"time": "00:30",
"duration": "PT5H",
"command": "charge",
"parameters": {
"target": {
"value": 100,
"unit": "percent"
}
}
}
]
}'const response = await fetch('https://api.amps.ai/hvac/device_abc123/schedule', {
method: 'PUT',
headers: {
'x-api-key': 'amps_sk_test_xxxxxxxxxxxxxxxxxxxxxxxx',
'content-type': 'application/json',
},
body: JSON.stringify({
"timezone": "Europe/London",
"recurrence": {
"rule": "daily"
},
"slots": [
{
"time": "00:30",
"duration": "PT5H",
"command": "charge",
"parameters": {
"target": {
"value": 100,
"unit": "percent"
}
}
}
]
}),
});
const data = await response.json();import requests
url = 'https://api.amps.ai/hvac/device_abc123/schedule'
headers = {
'x-api-key': 'amps_sk_test_xxxxxxxxxxxxxxxxxxxxxxxx',
'content-type': 'application/json',
}
payload = {
"timezone": "Europe/London",
"recurrence": {
"rule": "daily",
},
"slots": [
{
"time": "00:30",
"duration": "PT5H",
"command": "charge",
"parameters": {
"target": {
"value": 100,
"unit": "percent",
},
},
},
],
}
response = requests.put(url, headers=headers, json=payload)
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.amps.ai/hvac/{deviceId}/schedule",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'timezone' => 'Europe/London',
'recurrence' => [
'rule' => 'daily'
],
'slots' => [
[
'time' => '00:30',
'duration' => 'PT5H',
'command' => 'charge',
'parameters' => [
'target' => [
'value' => 100,
'unit' => 'percent'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.amps.ai/hvac/{deviceId}/schedule"
payload := strings.NewReader("{\n \"timezone\": \"Europe/London\",\n \"recurrence\": {\n \"rule\": \"daily\"\n },\n \"slots\": [\n {\n \"time\": \"00:30\",\n \"duration\": \"PT5H\",\n \"command\": \"charge\",\n \"parameters\": {\n \"target\": {\n \"value\": 100,\n \"unit\": \"percent\"\n }\n }\n }\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.amps.ai/hvac/{deviceId}/schedule")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"timezone\": \"Europe/London\",\n \"recurrence\": {\n \"rule\": \"daily\"\n },\n \"slots\": [\n {\n \"time\": \"00:30\",\n \"duration\": \"PT5H\",\n \"command\": \"charge\",\n \"parameters\": {\n \"target\": {\n \"value\": 100,\n \"unit\": \"percent\"\n }\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.amps.ai/hvac/{deviceId}/schedule")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"timezone\": \"Europe/London\",\n \"recurrence\": {\n \"rule\": \"daily\"\n },\n \"slots\": [\n {\n \"time\": \"00:30\",\n \"duration\": \"PT5H\",\n \"command\": \"charge\",\n \"parameters\": {\n \"target\": {\n \"value\": 100,\n \"unit\": \"percent\"\n }\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "sched_abc123",
"deviceId": "device_abc123",
"deviceType": "hvac",
"state": "active",
"timezone": "Europe/London",
"recurrence": {
"rule": "daily"
},
"slots": [
{
"time": "00:30",
"duration": "PT5H",
"command": "charge",
"parameters": {
"target": {
"value": 100,
"unit": "percent"
}
}
}
],
"updatedAt": "2026-06-01T12:00:00.000Z",
"nextFireAt": "2026-06-02T00:30:00.000Z"
}{
"success": false,
"error": {
"code": "DEVICE_NOT_FOUND",
"message": "No matching device was found for the supplied details.",
"details": {
"description": "Device not found or access denied"
}
},
"meta": {
"requestId": "req_5pH1cQbY",
"timestamp": "2026-04-29T12:00:00.000Z",
"path": "/hvac/device_unknown_999",
"latencyMs": 5
}
}{
"success": false,
"error": {
"code": "NOT_IMPLEMENTED",
"message": "This API operation is not implemented.",
"details": {
"description": "Setting a device schedule is not yet implemented."
}
},
"meta": {
"requestId": "req_NotImplYet1",
"timestamp": "2026-04-29T12:00:00.000Z",
"path": "/hvac/device_abc123/schedule",
"latencyMs": 1
}
}