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
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.
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.
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
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.
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.
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.
Trigger on reservation.confirmed to mint a code. Trigger on reservation.checkout to expire it. Same primitives you already use for messaging and pricing.
// 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
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.
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.
SendIoT is coming. Reservations, channels, pricing, and AI agents are not — they're live now.