Loading...
Loading...
Integrate Seam Reservation Automations into a property management system (PMS) or vacation rental platform. Push reservation data (check-in, check-out, guest info) and Seam automatically creates and revokes access codes on smart locks. Supports August, Yale, Schlage, Kwikset, and other smart locks. Use this skill when someone wants to automate access codes from reservations, let Seam handle credential management, or integrate a PMS with smart locks without building device management UI. Not for hotel ACS systems (Salto, Visionline, Brivo) — those need a different approach.
npx skill4agent add seamapi/seam-plugin seam-reservation-automationspush_datadelete_datanpm install seam # Node.js
pip install seam # Python
bundle add seam # Rubynew Seam()next buildimport { Seam } from "seam";
let _seam: Seam;
function getSeam() {
if (!_seam) _seam = new Seam({ apiKey: process.env.SEAM_API_KEY! });
return _seam;
}import { Seam } from "seam";
const seam = new Seam({ apiKey: process.env.SEAM_API_KEY });from seam import Seam
seam = Seam(api_key=os.environ["SEAM_API_KEY"])await seam.customers.pushData({
customer_key: property.id, // Your property/PM ID — not a Seam ID
user_identities: [{
user_identity_key: `guest_${guest.id}`,
name: guest.name,
email_address: guest.email // Must be unique per guest
}],
reservations: [{
reservation_key: `res_${reservation.id}`,
user_identity_key: `guest_${guest.id}`,
starts_at: reservation.checkIn,
ends_at: reservation.checkOut,
space_keys: [unit.id] // Unit ID = space key
}]
});seam.customers.push_data(
customer_key=property.id,
user_identities=[{
"user_identity_key": f"guest_{guest.id}",
"name": guest.name,
"email_address": guest.email
}],
reservations=[{
"reservation_key": f"res_{reservation.id}",
"user_identity_key": f"guest_{guest.id}",
"starts_at": reservation.check_in,
"ends_at": reservation.check_out,
"space_keys": [unit.id]
}]
)customer_keyspace_keysemail_addressok: truedelete_datacustomer_keyscustomer_keypush_datareservation_keyawait seam.customers.pushData({
customer_key: property.id,
reservations: [{
reservation_key: `res_${reservation.id}`,
user_identity_key: `guest_${reservation.guestId}`,
starts_at: reservation.checkIn,
ends_at: reservation.checkOut,
space_keys: [reservation.unitId]
}]
});await seam.customers.deleteData({
customer_keys: [property.id],
reservation_keys: [`res_${reservation.id}`],
user_identity_keys: [`guest_${reservation.guestId}`]
});seam.customers.delete_data(
customer_keys=[property.id],
reservation_keys=[f"res_{reservation.id}"],
user_identity_keys=[f"guest_{reservation.guest_id}"]
)router.post("/seam", (req, res) => {
const { event_type, ...data } = req.body;
switch (event_type) {
case "access_code.set_on_device":
console.log("Access code set:", data.access_code_id);
break;
case "access_code.failed_to_set_on_device":
console.log("Access code failed:", data.access_code_id);
break;
case "device.disconnected":
console.log("Device disconnected:", data.device_id);
break;
}
res.json({ received: true });
});references/troubleshooting.mdreferences/production-checklist.md