Seam is the API most of the short-term rental lock-automation field is built on, including us. If you're an engineer weighing a Seam API vacation rental integration of your own, the pitch is easy to evaluate and the gap is not: Seam gives you clean primitives for putting a PIN on a lock, and everything that makes a guest arrival work sits on top of them. This post is the list we wish we'd had: what Seam provides, what we had to build anyway, where GuestsKey fits, and when building it yourself is the right call.
What Seam is, in Seam's words
Seam describes itself with "Connect Your App to the Physical World": 1,000+ companies, 1K+ supported device models. Its supported-devices page promises "thousands of smart devices from 30+ manufacturers," and the smart-lock list there includes August, Kwikset, Lockly, Nuki, Salto, Schlage, Tedee, Ultraloq, Yale, and igloohome. Support is per model, not per brand, so check Seam's device pages for the exact lock on your door.
For a rental door, four pieces of the API matter.
Access codes. In Seam's access codes guide, "an access code is a code used for a keypad or pinpad device." Ongoing codes "start right away and remain active on a device until they are removed." Time-bound codes "operate between designated starts_at and ends_at timestamps." Create takes a device_id, an optional code of 4 to 12 digits, a name, the two timestamps, and a few knobs such as preferred_code_length and use_backup_access_code_pool. On locks with native scheduling, Seam preloads the code "by default, a full 72 hours in advance." On locks without it, "Seam will use its own scheduling infrastructure to program the code 60 minutes before the starts_at time."
Connect Webviews. Connect Webviews are "fully-embedded, customizable client-side components" that walk your users through authorizing your app. The user logs in to the manufacturer account and "Seam handles all the authentication steps," including multifactor.
Webhooks. Configured per workspace in the Seam Console, delivered through Svix, verified with the webhook secret. A failed delivery is retried on a fixed schedule: immediately, then 5 seconds, 5 minutes, 30 minutes, 2 hours, 5 hours, and 10 hours twice. The event catalog covers access_code.*, device.*, connected_account.*, and the lock and unlock action attempts.
Action attempts. "When you request for a device to perform an action, the Seam API immediately returns an action attempt object." "Certain actions can take seconds, minutes, or even days to complete."
Read this before you pick an API
Seam's create-access-code endpoint says: "For granting access, we recommend Access Grants instead: they work across both standalone smart locks and access control systems and manage the underlying codes for you." Its access-codes guide is blunter: don't build on the Access Codes API directly "unless you specifically need low-level control over individual PIN codes." Access Grants cover standalone locks and access control systems alike.
GuestsKey is built on the lower-level access codes API today, alongside devices, Connect Webviews, webhooks, and action attempts. If you're starting fresh, take Seam's advice seriously.
What a vacation-rental integration needs on top of Seam
Here is where the weekend project turns into a product. Every item below is something we had to build, and most of them we document for customers.
1. Codes that follow the booking
A code is a projection of a reservation. When dates or the property change, the old code has to be canceled, eligibility re-checked, and a new one scheduled; when the booking is canceled, the code goes with it.
2. The property's timezone, not the server's
Per our code timing help, a check-in of "3:00 PM" means 3:00 PM at the property. Every window is computed in the property's local timezone before it becomes an ISO timestamp for Seam.
3. The activation window
The start is check-in minus a check-in grace; the end is checkout plus a checkout grace. Defaults are 10 minutes before and 0 after, each configurable from 0 to 180 minutes, resolved property first, then account default, then platform default. That window becomes starts_at and ends_at. Note the default: the code stops at checkout, not some minutes after.
4. A PIN that is unique on the physical device
Our default is the last four digits of the guest's phone, documented in how guest codes work. The interesting part is uniqueness. The check runs against every code type already on the device (guest, cleaner, one-time, emergency). On a collision the PIN is extended one phone digit at a time, to 5, 6, or 7 digits, and only to lengths the lock accepts. A repeat guest with the same phone keeps the same PIN. A property with two locks allocates once against the union of both. If nothing is free, GuestsKey falls back to the original code and alerts the host rather than silently assigning a clash.
5. Per-lock code-length rules
Seam reports supported_code_lengths and code_constraints per device, and manufacturer floors differ: Lockly wants at least 6 digits, Tedee at least 5, most others 4. GuestsKey reads the lengths a lock reports and only assigns lengths that lock accepts (lock brands and limits).
6. Proof the code landed
Seam's guide says "it's essential to verify that a code has been successfully programmed on to the lock to prevent unexpected complications later." We took that literally. A code moves from unset through setting to set, and the access_code.set_on_device event is what GuestsKey treats as delivery confirmation. That event, not the booking, triggers the guest and host notifications: the guest portal link goes out when the code is confirmed on the lock. failed_to_set_on_device, delay_in_setting_on_device, and removed_from_device each need their own handler.
7. The lock going offline
An offline lock can't take new codes; the codes already on it keep working. Our lock offline alert is deliberately delayed one hour and canceled if the lock comes back. On device.connected, codes that failed while the lock was unreachable and are still inside their active window are retried automatically (code did not apply). It retries on reconnect, not forever; you can also reapply from the booking's access code card.
8. Stuck states on a lock that says it's online
This is the one that surprised us. A code can sit in setting on a device Seam reports as online, with no error. Seam's delay_in_setting_on_device event exists, but it does not always arrive; you need your own timer. GuestsKey flags a code mid-update for more than 15 minutes or mid-removal for more than 30, alerts once, and then watches for the manufacturer to confirm rather than resubmitting (codes stuck updating).
9. Everyone who isn't the guest
Cleaner PINs are always-on across every lock in the account and fan out when a lock or cleaner is added or removed (cleaner access). One-time keys are 4 to 8 digits, up to 5 active per property, and self-expiring. Opt-in emergency backup codes run a lock health check 15 minutes before check-in and a code check 5 minutes before, emailing the guest a backup code on failure. Each is a separate lifecycle, and each is a code sitting on the same physical device, so they all feed the uniqueness check from item 4.
10. Lock and unlock are asynchronous
Matching Seam's action-attempt model, a remote lock or unlock in GuestsKey polls the attempt until it resolves or a deadline passes. Nothing reports success until then.
Almost none of that list is lock control. It's timers, retries, and the "did it really land" question, and each one shows up as a guest standing at a door.
Where GuestsKey sits
GuestsKey is that list as a product, for operators who don't want to build it. Wi-Fi locks connect through Seam with the manufacturer account and a 2.4 GHz network, no hub. Z-Wave locks connect through a SmartThings hub (v2, v3, or Aeotec). The model decides the path, not the brand, which we explain in choosing a lock connection. Brands we support through Seam include Yale, Schlage, August, Kwikset, Lockly, Nuki, Ultraloq, Wyze, igloohome, Tedee, and TTLock; the per-model list is on supported locks.
Pricing is per connected lock and graduated: from $4 (SmartThings) or $5 (Seam) per lock per month, dropping as you add locks, with every feature on every account and no per-property fees. The pricing page has the tiers.
When building on Seam yourself is the right call
We said it in our platform comparison: if you're a software engineer with a single property and you'd genuinely enjoy building it, you don't need GuestsKey, you need a Seam account. Build it yourself when:
- You're an engineer with one or two properties, you want to own the code, and you accept being the on-call for it.
- You need something we don't do: an access-control system like Salto, Brivo, or Visionline (Seam's Access Grants cover those), mobile keys or cards, a PMS we don't integrate, or behavior specific to your operation.
As of August 2026, Seam's pricing lists a Free tier at $0/month with full API access, webhooks, and all supported brands, and Unit Access at $5/device/month with 5 actions per device per day; higher tiers exist. The page didn't state how many devices the Free tier covers, so check it before planning around it. The price of building is your weekends, not a subscription.
Our opinion, not a measurement: past about three or four doors the math favors a tool. Below that, with the right temperament, the list above is a satisfying build.
If you'd rather not build it
Start a 14-day free trial. A credit card is required up front; billing starts on day 15 unless you cancel, and cancel during the trial and you're never charged.