Smart home & ops · Coming

Locks, climate, devices —
tied to the reservation.

The Repull IoT API will let your code react to physical events the same way it reacts to a reservation update. Rotate a door code on check-out. Pre-condition a unit before arrival. Get a webhook when a thermostat's been at 30 degrees for six hours.

What you will build

Three flows that disappear into a few API calls.

Self-rotating door codes

On reservation creation, generate a code. On check-out time, expire it and issue the next guest's. No more "did the cleaner change the code?" — the lock and the reservation are the same object.

Pre-arrival climate

At T-2 hours, set the unit to a comfortable temperature. After check-out, drop it back to a hold setting. Multiply across a portfolio and the energy savings pay the IoT bill themselves.

Anomaly webhooks

Door propped open for an hour during turnover. Thermostat at 30°C with no occupants. Water leak sensor triggered. Webhook fires, ops queue gets the task, somebody's phone buzzes.

What the API will look like

Devices as first-class objects on the listing.

The IoT API treats every connected device — lock, thermostat, sensor — as a child of the listing. Reservations and devices share the same auth, the same webhooks, and the same workspace, so you build cross-cutting flows in one place.

  1. 1

    Pair the device once

    Most vendors use OAuth or an account-level pairing. The Repull Connect picker handles that the same way it handles PMS connections — one consistent flow.

  2. 2

    Subscribe to device events

    Same webhook surface as everything else. door.opened, lock.code.created, climate.target_changed, sensor.alert. Sign verified, retried on 5xx, one event log to grep.

  3. 3

    Tie it to the reservation lifecycle

    Trigger on reservation.confirmed to mint a code. Trigger on reservation.checkout to expire it. Same primitives you already use for messaging and pricing.

rotate-door-code.ts · ts
// Repull IoT API — coming soon. The shape we are converging on:

import { Repull } from '@repull/sdk'

const repull = new Repull({ apiKey: ..., workspaceId: ... })

// On reservation.confirmed
repull.webhooks.on('reservation.confirmed', async (e) => {
  const lock = await repull.devices.get(e.listingId, { kind: 'lock' })

  await repull.devices.lock.codes.create(lock.id, {
    label: e.guestName,
    code: '4271', // or omit for auto-generate
    activeFrom: e.checkIn,
    activeUntil: e.checkOut,
  })
})

// On reservation.checkout, the code self-expires.
// On a sensor alert, route to your ops queue:
repull.webhooks.on('sensor.alert', async (e) => {
  if (e.kind === 'water_leak') await ops.create({
    listingId: e.listingId,
    severity: 'critical',
    title: `Water leak detected · ${e.location}`,
  })
})

The shapes above are how we're thinking about it — final method names will land with the public release. Lock vendors targeted for v1: Yale, Schlage, August. Climate: Nest, ecobee, Honeywell.

Coming

We're building this with the people who'll use it.

If you're running a portfolio with locks and climate already deployed, or if you're building a product that needs to talk to physical devices, drop a line. The earliest design partners shape the API surface.

Locks

Yale Linus / Assure, Schlage Encode, August, igloohome.

Climate

Nest, ecobee, Honeywell Lyric, Sensibo.

Sensors

Noise (Minut, NoiseAware), water leak, occupancy.

No fixed launch date. We're shipping when the first three integrations work end-to-end on production data.

Get on the IoT design list

Tell us which devices you have deployed and what you would build with this. The team reads every email.

Goes straight to the team. No list, no drip.

Send

Build the rest of it today.

IoT is coming. Reservations, channels, pricing, and AI agents are not — they're live now.