Skip to main content

Overview

POST /nest/transport/put is how the thermostat sends local state changes to the server — temperature dial turns, mode changes, sensor readings, HVAC status updates.
This endpoint is part of the Device Protocol API on port 8000. It is called directly by thermostat firmware — not by you.

Endpoint

POST http://your-server:8000/nest/transport/put

Request

Headers

POST /nest/transport/put HTTP/1.1
Host: your-server:8000
Content-Type: application/json
Authorization: Basic <base64(d.SERIAL.SUFFIX:password)>
X-nl-protocol-version: 1

Body (Bucket-Keyed Format)

{
  "session": "18b430SERIAL",
  "shared.09AB1234": {
    "object_key": "shared.09AB1234",
    "base_object_revision": 15,
    "target_temperature": 22.0,
    "target_temperature_type": "heat"
  }
}

Body (Objects Array Format)

{
  "session": "18b430SERIAL",
  "objects": [
    {
      "object_key": "shared.09AB1234",
      "base_object_revision": 15,
      "value": {
        "target_temperature": 22.0
      }
    }
  ]
}

Revision Fields

FieldUsed byDescription
base_object_revisionMost bucketsInformational — no server validation required
if_object_revisionshared bucketConditional write guard — server should check current revision
The shared bucket uses conditional writes (if_object_revision) because both the device and the server may update it concurrently (device dials the temperature, server sends a command at the same time).

Response

HTTP/1.1 200 OK
Content-Type: application/json
{
  "objects": [
    {
      "object_revision": 16,
      "object_timestamp": 1707149000000,
      "object_key": "shared.09AB1234"
    }
  ]
}
The response contains the updated revision and timestamp for each bucket that was processed. It does not include a value field.
Never include a value field in the PUT response. The device treats any value in a PUT response as authoritative cloud data and applies every field as an overwrite — including fields the device just updated locally. This can cause the device to silently lose local state changes.

Server Merge Behavior

For each incoming PUT object, the server:
  1. Merges the incoming fields into the stored bucket (shallow merge)
  2. Only bumps revision and timestamp if values actually changed
  3. Does not notify subscribers (the PUT response is the only data path back to the device; server pushes go through subscribe)

Examples

A thermostat dial turn triggers a PUT:
POST /nest/transport/put

{
  "session": "18b430ABCDEF",
  "shared.09AB01AB12345678": {
    "object_key": "shared.09AB01AB12345678",
    "base_object_revision": 15,
    "if_object_revision": 15,
    "target_temperature": 22.0,
    "target_temperature_type": "heat",
    "target_change_pending": false
  }
}
Response:
{
  "objects": [
    {
      "object_revision": 16,
      "object_timestamp": 1707149000000,
      "object_key": "shared.09AB01AB12345678"
    }
  ]
}

POST /nest/transport

Subscribe endpoint (server → device)

Nest Protocol: Transport

Full protocol documentation