+```
+
+#### Next Steps Sections
+
+End most guides with actionable next steps:
+
+```markdown
+## Next Steps
+
+- [Related Guide 1](../path/to/guide1.md)
+- [Related Guide 2](../path/to/guide2.md)
+- [API Reference](../../api/endpoint.md)
+```
+
+### 6. Callout Boxes (GitBook Hints)
+
+**Success hints** (tips, alternatives, helpful info):
+
+```markdown
+{% hint style="success" %}
+You can also use the Seam CLI to create access codes quickly during development.
+{% endhint %}
+```
+
+**Warning hints** (important caveats, deprecated features):
+
+```markdown
+{% hint style="warning" %}
+This feature is deprecated. Use the new Access Grants API instead.
+{% endhint %}
+```
+
+**Info hints** (additional context, sandbox notes):
+
+```markdown
+{% hint style="info" %}
+In the sandbox environment, access codes are created instantly without delay.
+{% endhint %}
+```
+
+### 7. Visual Content
+
+#### Images with Dark/Light Mode Support
+
+```markdown
+
+
+
+
+
+ Caption explaining the diagram
+
+```
+
+#### Embedded Videos
+
+```markdown
+{% embed url="https://www.youtube.com/watch?v=..." %}
+Brief description of video content
+{% endembed %}
+```
+
+#### Diagrams
+
+- Timeline diagrams for lifecycle events
+- State machine diagrams for access codes
+- Architecture diagrams for system overviews
+- Flow diagrams for multi-step processes
+
+### 8. Cross-References
+
+**Internal links:** Use relative paths from current file
+
+```markdown
+See the [Access Codes API Reference](../../api/access_codes/create.md) for details.
+```
+
+**External links:**
+
+- Seam Console: Link to specific console pages
+- GitHub: Link to SDK repositories
+- Package managers: Direct install links
+
+**Related content sections:**
+
+```markdown
+## Related Resources
+
+- [Core Concept: Devices](../../core-concepts/devices/)
+- [Capability Guide: Smart Locks](../../capability-guides/smart-locks/)
+- [API: devices.get](../../api/devices/get.md)
+```
+
+### 9. Tables
+
+**Parameter tables:**
+
+```markdown
+| Parameter | Type | Required | Description |
+| ----------- | ------ | -------- | ------------------------------- |
+| `device_id` | string | Yes | ID of the device |
+| `code` | string | No | Custom access code (4-8 digits) |
+```
+
+**Comparison tables:**
+
+```markdown
+| Feature | Basic Plan | Pro Plan |
+| ------------- | ---------- | -------- |
+| Access codes | ✓ | ✓ |
+| Mobile access | - | ✓ |
+```
+
+### 10. Prerequisites Sections
+
+**Standard format:**
+
+```markdown
+## Before You Begin
+
+To follow this guide, you need:
+
+- A Seam account (create one at [console.seam.co](https://console.seam.co))
+- An API key (found in your workspace settings)
+- A connected device (see [Getting Started](../quickstart.md))
+- Seam SDK installed (see [Installation](../api/installation.md))
+```
+
+---
+
+## Key Guidelines
+
+### For Working with This Repository
+
+1. **Auto-generated content:** The `/docs/api/` directory appears to be auto-generated. Avoid manual edits here - changes should be made to the source spec.
+
+2. **Consistency is critical:** With 627 files, maintaining consistent formatting, tone, and structure is essential. Follow existing patterns exactly.
+
+3. **GitBook-specific syntax:** This documentation uses GitBook markdown extensions (tabs, hints, cards, embeds). Standard markdown won't render these correctly.
+
+4. **Multi-language support:** All code examples should be provided in at least Python, JavaScript, and cURL. Additional languages (Ruby, PHP, C#, Java) are preferred.
+
+5. **Progressive disclosure:** Documentation flows from simple (quickstart) to complex (detailed guides). Maintain this hierarchy when adding content.
+
+6. **Capability-driven organization:** Features are organized by what devices CAN do, not just what they ARE. This is a key architectural principle.
+
+7. **Real-world focus:** Include sandbox credentials, troubleshooting guides, and production checklists. Developers need practical, actionable information.
+
+8. **Link maintenance:** When restructuring, always add redirects in `.gitbook.yaml` to maintain backward compatibility.
+
+9. **Visual aids:** Use screenshots, diagrams, and videos generously. IoT integrations benefit from visual guidance.
+
+10. **Accessibility:** Provide alt text for images, use semantic HTML, and ensure code examples are properly formatted.
+
+### Writing Checklist
+
+When creating or updating documentation:
+
+- [ ] Add descriptive frontmatter
+- [ ] Include code examples in multiple languages
+- [ ] Add "Before You Begin" prerequisites section
+- [ ] Check capability flags before actions in code examples
+- [ ] Include "Next Steps" with related links
+- [ ] Add images with dark/light mode support if applicable
+- [ ] Use appropriate hint boxes for tips, warnings, and info
+- [ ] Verify all internal links use relative paths
+- [ ] Follow standard heading hierarchy (H1 → H2 → H3)
+- [ ] Keep paragraphs short (2-3 sentences)
+- [ ] Use active voice and second person
+- [ ] Add entry to SUMMARY.md if creating new page
+- [ ] Update .gitbook.yaml redirects if restructuring
+
+### Common Terminology
+
+**Preferred terms:**
+
+- "Device" (not "smart lock" generically)
+- "Access code" (not "PIN code")
+- "Connected account" (not "integration" or "connection")
+- "Workspace" (not "account" or "organization")
+- "Capability" (not "feature" or "function")
+- "Provider" (not "brand" or "manufacturer" in technical contexts)
+
+### Tone Examples
+
+**Good:**
+
+> "Create an access code by calling the `access_codes.create` endpoint. You'll need to provide the `device_id` and optionally specify a custom code."
+
+**Avoid:**
+
+> "The access code creation functionality can be accessed through the utilization of the access codes creation API endpoint, which requires authentication and accepts various parameters."
+
+**Good:**
+
+> "The device must support online access code programming. Check the `can_program_online_access_codes` capability before proceeding."
+
+**Avoid:**
+
+> "Please note that it is important to verify whether or not the device has the necessary capabilities to support the programming of online access codes prior to attempting to create one."
+
+---
+
+## Summary
+
+The Seam API documentation is a mature, well-structured system designed for a developer audience building IoT integrations. Key characteristics:
+
+- **Developer-first:** Heavy emphasis on code examples and SDKs
+- **Capability-driven:** Organized by what devices can DO
+- **Multi-language:** Comprehensive SDK coverage (7+ languages)
+- **Production-ready:** Includes sandbox environments, troubleshooting, and go-live checklists
+- **Manufacturer-agnostic:** Provides unified API across 40+ device brands
+- **GitBook-optimized:** Extensive use of GitBook-specific markdown features
+
+When contributing to this documentation, prioritize consistency, clarity, and practical examples. The documentation serves developers who need to integrate Seam quickly and reliably into production applications.
diff --git a/codegen/data/paths.yaml b/codegen/data/paths.yaml
index 913e352a4..3cf13328f 100644
--- a/codegen/data/paths.yaml
+++ b/codegen/data/paths.yaml
@@ -101,19 +101,15 @@
/access_grants:
title: Access Grants
- alpha: "**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design."
/access_methods:
title: Access Methods
- alpha: "**Early Access Preview.** The access methods API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design."
/spaces:
title: Spaces
- alpha: "**Early Access Preview.** The spaces API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design."
/customers:
title: Customers
- alpha: "**Early Access Preview.** The customers API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design."
/devices/unmanaged:
title: Unmanaged Devices
diff --git a/docs/.gitbook/assets/ultraloq-logo.png b/docs/.gitbook/assets/ultraloq-logo.png
new file mode 100644
index 000000000..7f994c7e3
Binary files /dev/null and b/docs/.gitbook/assets/ultraloq-logo.png differ
diff --git a/docs/.gitbook/assets/ultraloq-manufacturer-page-cover-dark.png b/docs/.gitbook/assets/ultraloq-manufacturer-page-cover-dark.png
new file mode 100644
index 000000000..e74f097dd
Binary files /dev/null and b/docs/.gitbook/assets/ultraloq-manufacturer-page-cover-dark.png differ
diff --git a/docs/.gitbook/assets/ultraloq-manufacturer-page-cover-light.png b/docs/.gitbook/assets/ultraloq-manufacturer-page-cover-light.png
new file mode 100644
index 000000000..ba36b6f83
Binary files /dev/null and b/docs/.gitbook/assets/ultraloq-manufacturer-page-cover-light.png differ
diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md
index 7a73bef88..b96ee2c91 100644
--- a/docs/SUMMARY.md
+++ b/docs/SUMMARY.md
@@ -602,6 +602,10 @@
* [Get Started with Tedee Locks](device-and-system-integration-guides/tedee-locks/get-started-with-tedee-locks.md)
* [TTLock Locks](device-guides/ttlock-locks.md)
* [Get started with TTLock Locks](device-guides/get-started-with-ttlock-devices.md)
+* [Ultraloq Locks](device-and-system-integration-guides/ultraloq-locks/README.md)
+ * [Ultraloq Setup Guide](device-and-system-integration-guides/ultraloq-locks/ultraloq-setup-guide.md)
+ * [Configuring Ultraloq Device Timezones](device-and-system-integration-guides/ultraloq-locks/configuring-ultraloq-device-timezones.md)
+ * [Creating Ultraloq Access Codes](device-and-system-integration-guides/ultraloq-locks/creating-ultraloq-access-codes.md)
* [Wyze Locks](device-guides/wyze-locks.md)
* [Get started with Wyze Locks](device-guides/get-started-with-wyze-locks.md)
* [Yale Locks](device-guides/yale-locks.md)
diff --git a/docs/api/access_grants/README.md b/docs/api/access_grants/README.md
index 6328f7687..33e6ad853 100644
--- a/docs/api/access_grants/README.md
+++ b/docs/api/access_grants/README.md
@@ -1,7 +1,4 @@
# Access Grants
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
## The access_grant Object
diff --git a/docs/api/access_grants/create.md b/docs/api/access_grants/create.md
index 97074fca3..471e77499 100644
--- a/docs/api/access_grants/create.md
+++ b/docs/api/access_grants/create.md
@@ -1,7 +1,4 @@
# Create an Access Grant
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/access_grants/delete.md b/docs/api/access_grants/delete.md
index cb34e2f85..d7ccc3c36 100644
--- a/docs/api/access_grants/delete.md
+++ b/docs/api/access_grants/delete.md
@@ -1,7 +1,4 @@
# Delete an Access Grant
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/access_grants/get.md b/docs/api/access_grants/get.md
index 5ac84675d..205457cbd 100644
--- a/docs/api/access_grants/get.md
+++ b/docs/api/access_grants/get.md
@@ -1,7 +1,4 @@
# Get an Access Grant
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/access_grants/get_related.md b/docs/api/access_grants/get_related.md
index 058d1edca..b1b07513a 100644
--- a/docs/api/access_grants/get_related.md
+++ b/docs/api/access_grants/get_related.md
@@ -1,7 +1,4 @@
# Get related Access Grant resources
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/access_grants/list.md b/docs/api/access_grants/list.md
index 90acc5f31..9738f528e 100644
--- a/docs/api/access_grants/list.md
+++ b/docs/api/access_grants/list.md
@@ -1,7 +1,4 @@
# List Access Grants
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/access_grants/request_access_methods.md b/docs/api/access_grants/request_access_methods.md
index 067b0700b..290184ec2 100644
--- a/docs/api/access_grants/request_access_methods.md
+++ b/docs/api/access_grants/request_access_methods.md
@@ -1,7 +1,4 @@
# Add Requested Access Methods to Access Grant
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/access_grants/update.md b/docs/api/access_grants/update.md
index 8edfd74bb..9a449f1e5 100644
--- a/docs/api/access_grants/update.md
+++ b/docs/api/access_grants/update.md
@@ -1,7 +1,4 @@
# Update an Access Grant
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/access_methods/README.md b/docs/api/access_methods/README.md
index 29af720a5..9ac867dcf 100644
--- a/docs/api/access_methods/README.md
+++ b/docs/api/access_methods/README.md
@@ -1,7 +1,4 @@
# Access Methods
-{% hint style="info" %}
-**Early Access Preview.** The access methods API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
## The access_method Object
diff --git a/docs/api/access_methods/delete.md b/docs/api/access_methods/delete.md
index b00ddc774..ff8617d20 100644
--- a/docs/api/access_methods/delete.md
+++ b/docs/api/access_methods/delete.md
@@ -1,7 +1,4 @@
# Delete an Access Method
-{% hint style="info" %}
-**Early Access Preview.** The access methods API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/access_methods/encode.md b/docs/api/access_methods/encode.md
index 9afa15c20..93e85e2cf 100644
--- a/docs/api/access_methods/encode.md
+++ b/docs/api/access_methods/encode.md
@@ -1,7 +1,4 @@
# Encode an Access Method
-{% hint style="info" %}
-**Early Access Preview.** The access methods API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/access_methods/get.md b/docs/api/access_methods/get.md
index 25360a53b..2d3770d22 100644
--- a/docs/api/access_methods/get.md
+++ b/docs/api/access_methods/get.md
@@ -1,7 +1,4 @@
# Get an Access Method
-{% hint style="info" %}
-**Early Access Preview.** The access methods API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/access_methods/get_related.md b/docs/api/access_methods/get_related.md
index 1e0b8041b..382aa1dc5 100644
--- a/docs/api/access_methods/get_related.md
+++ b/docs/api/access_methods/get_related.md
@@ -1,7 +1,4 @@
# Get related Access Method resources
-{% hint style="info" %}
-**Early Access Preview.** The access methods API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/access_methods/list.md b/docs/api/access_methods/list.md
index 2b8373ec5..e20d3f2d5 100644
--- a/docs/api/access_methods/list.md
+++ b/docs/api/access_methods/list.md
@@ -1,7 +1,4 @@
# List Access Methods
-{% hint style="info" %}
-**Early Access Preview.** The access methods API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/customers/README.md b/docs/api/customers/README.md
index 3019cf867..662d08903 100644
--- a/docs/api/customers/README.md
+++ b/docs/api/customers/README.md
@@ -1,7 +1,4 @@
# Customers
-{% hint style="info" %}
-**Early Access Preview.** The customers API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
## Endpoints
diff --git a/docs/api/customers/create_portal.md b/docs/api/customers/create_portal.md
index b85abf998..c96021c1c 100644
--- a/docs/api/customers/create_portal.md
+++ b/docs/api/customers/create_portal.md
@@ -1,7 +1,4 @@
# Create Customer Portal
-{% hint style="info" %}
-**Early Access Preview.** The customers API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/customers/delete_data.md b/docs/api/customers/delete_data.md
index 59f6648d8..e6663c43e 100644
--- a/docs/api/customers/delete_data.md
+++ b/docs/api/customers/delete_data.md
@@ -1,7 +1,4 @@
# Delete Customer Data
-{% hint style="info" %}
-**Early Access Preview.** The customers API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/customers/push_data.md b/docs/api/customers/push_data.md
index 953898bd4..f0890ecdb 100644
--- a/docs/api/customers/push_data.md
+++ b/docs/api/customers/push_data.md
@@ -1,7 +1,4 @@
# Push Customer Data
-{% hint style="info" %}
-**Early Access Preview.** The customers API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/spaces/README.md b/docs/api/spaces/README.md
index 495c57701..1bc649799 100644
--- a/docs/api/spaces/README.md
+++ b/docs/api/spaces/README.md
@@ -1,7 +1,4 @@
# Spaces
-{% hint style="info" %}
-**Early Access Preview.** The spaces API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
## The space Object
diff --git a/docs/api/spaces/add_acs_entrances.md b/docs/api/spaces/add_acs_entrances.md
index 171968192..2c08599ca 100644
--- a/docs/api/spaces/add_acs_entrances.md
+++ b/docs/api/spaces/add_acs_entrances.md
@@ -1,7 +1,4 @@
# Add Entrances to a Space
-{% hint style="info" %}
-**Early Access Preview.** The spaces API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/spaces/add_devices.md b/docs/api/spaces/add_devices.md
index dd804f2c8..c7c437500 100644
--- a/docs/api/spaces/add_devices.md
+++ b/docs/api/spaces/add_devices.md
@@ -1,7 +1,4 @@
# Add Devices to a Space
-{% hint style="info" %}
-**Early Access Preview.** The spaces API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/spaces/create.md b/docs/api/spaces/create.md
index 49afc73e5..740ce74ed 100644
--- a/docs/api/spaces/create.md
+++ b/docs/api/spaces/create.md
@@ -1,7 +1,4 @@
# Create a Space
-{% hint style="info" %}
-**Early Access Preview.** The spaces API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/spaces/delete.md b/docs/api/spaces/delete.md
index 959839233..24d68e18c 100644
--- a/docs/api/spaces/delete.md
+++ b/docs/api/spaces/delete.md
@@ -1,7 +1,4 @@
# Delete a Space
-{% hint style="info" %}
-**Early Access Preview.** The spaces API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/spaces/get.md b/docs/api/spaces/get.md
index 2d9ec0061..ad46ebab4 100644
--- a/docs/api/spaces/get.md
+++ b/docs/api/spaces/get.md
@@ -1,7 +1,4 @@
# Get a Space
-{% hint style="info" %}
-**Early Access Preview.** The spaces API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/spaces/get_related.md b/docs/api/spaces/get_related.md
index ecfb36353..f4bc0a7eb 100644
--- a/docs/api/spaces/get_related.md
+++ b/docs/api/spaces/get_related.md
@@ -1,7 +1,4 @@
# Get related Space resources
-{% hint style="info" %}
-**Early Access Preview.** The spaces API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/spaces/list.md b/docs/api/spaces/list.md
index b0d540dbd..11c27e8fb 100644
--- a/docs/api/spaces/list.md
+++ b/docs/api/spaces/list.md
@@ -1,7 +1,4 @@
# List Spaces
-{% hint style="info" %}
-**Early Access Preview.** The spaces API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/spaces/remove_acs_entrances.md b/docs/api/spaces/remove_acs_entrances.md
index 0a07244e4..1ca4a2f57 100644
--- a/docs/api/spaces/remove_acs_entrances.md
+++ b/docs/api/spaces/remove_acs_entrances.md
@@ -1,7 +1,4 @@
# Remove Entrances from a Space
-{% hint style="info" %}
-**Early Access Preview.** The spaces API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/spaces/remove_devices.md b/docs/api/spaces/remove_devices.md
index b04f90b24..c9d8587b5 100644
--- a/docs/api/spaces/remove_devices.md
+++ b/docs/api/spaces/remove_devices.md
@@ -1,7 +1,4 @@
# Remove Devices from a Space
-{% hint style="info" %}
-**Early Access Preview.** The spaces API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/api/spaces/update.md b/docs/api/spaces/update.md
index 3672d4e43..bf057e804 100644
--- a/docs/api/spaces/update.md
+++ b/docs/api/spaces/update.md
@@ -1,7 +1,4 @@
# Update a Space
-{% hint style="info" %}
-**Early Access Preview.** The spaces API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
- [Request Parameters](#request-parameters)
- [Response](#response)
diff --git a/docs/capability-guides/access-grants/README.md b/docs/capability-guides/access-grants/README.md
index f32837fd8..2b9eefa8a 100644
--- a/docs/capability-guides/access-grants/README.md
+++ b/docs/capability-guides/access-grants/README.md
@@ -6,17 +6,13 @@ description: >-
# Access Grants
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Beta. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
-
Seam Access Grants provide a unified, intuitive, and streamlined way to grant and manage user access across multiple access system providers. With a single command you can define the "who, where, when, and how" for assigning a user access to entrances and other access points. Access Grants support plastic cards, PIN codes, and mobile keys, including Instant Keys. You can even create multiple access methods using a single command.
Use Access Grants to specify the characteristics of access.
An Access Grant includes the following characteristics:
-
Characteristic
Creation Parameter
Description
Who
user_identity_id or user_identity
The user to whom to grant access. You can either create a user identity separately and specify the ID to the Access Grant or create a new user identity as part of the Access Grant creation action.
Where
acs_entrance_ids or space_ids
The entrances to which to grant access. You can specify one or more entrances by ID. Alternately, you can define spaces (currently in Alpha and available as an early access preview) that contain groups of related entrances and then specify one or more spaces by ID.
When
starts_at and ends_at
The access schedule.
How
requested_access_methods and mode
The access methods that you want to grant for the user. In each requested_access_method, specify the desired mode of access, such as a PIN code, key card, or mobile key (with an Instant Key).
+
Characteristic
Creation Parameter
Description
Who
user_identity_id or user_identity
The user to whom to grant access. You can either create a user identity separately and specify the ID to the Access Grant or create a new user identity as part of the Access Grant creation action.
Where
acs_entrance_ids or space_ids
The entrances to which to grant access. You can specify one or more entrances by ID. Alternately, you can define spaces that contain groups of related entrances and then specify one or more spaces by ID.
When
starts_at and ends_at
The access schedule.
How
requested_access_methods and mode
The access methods that you want to grant for the user. In each requested_access_method, specify the desired mode of access, such as a PIN code, key card, or mobile key (with an Instant Key).
***
@@ -24,7 +20,7 @@ An Access Grant includes the following characteristics:
The Access Grant process consists of the following steps:
-
Step
Description
Set up your site for Access Grants.
This step includes confirming hardware capabilities and making sure that you have the required licenses. For example, if you plan to use mobile keys or Instant Keys, your lock hardware must support Bluetooth Low Energy (BLE) keys. Also, to use mobile keys with your access system, you may need to purchase licenses or subscriptions to activate certain software features. These requirements vary by access system. For details, see Setting Up Your Site for Instant Keys and the system integration guide for your access system.
Connect your access system to Seam.
To connect your access system to Seam, we recommend embedding a Connect Webview in your application. The Connect Webview flow guides the property manager through each step of the connection process. For on-premises access systems, use Seam Bridge to connect the access system securely to Seam. For details, see Connect an Access System to Seam.
(Optional) Set up spaces to organize entrances into logical groups.
You can use spaces to create groups of entrances for efficiency. For example, a user staying in Room 101 may need access to both the Room 101 door, the main entrance door, and the nearest elevator. You could create a space that includes these three access points and then use this space when creating an Access Grant. For details, see spaces. Note: Spaces are currently in Alpha. We're actively developing this feature and seeking early feedback at support@seam.co. Expect breaking changes as we refine the design.
Create a user identity.
User identities represent your users—the people to whom you want to grant access. You can create a user identity before creating an Access Grant, or you can create a user identity as part of creating the Access Grant. See Managing Mobile App User Accounts with User Identities.
Create an Access Grant.
When you create an Access Grant, you specify the user identity to whom you want to grant access, the access schedule, the set of entrances or spaces, and one or more access methods that you want to request. See Creating an Access Grant Using Entrances and Creating an Access Grant Using Spaces. You can poll for access method status changes or watch for Access Grant and access method lifecycle events that alert you to next steps, such as how and when to deliver each created access method to your user.
Deliver the access method to the user.
Once Seam alerts you that your access methods are ready, deliver them to your user. Delivery steps depend on the mode of access, such as plastic key card, PIN code, or mobile key.
If you have created an access grant that includes a card access method, you may need to encode the card using the Seam encoders API.
If you have created an Access Grant that includes a mobile key, you can use the Seam mobile SDKs to develop your mobile app that delivers these mobile keys to your users.
Each mobile key also includes an Instant Key URL. To share this Instant Key with your user, send it through text or email or embed it in your own app.
This step includes confirming hardware capabilities and making sure that you have the required licenses. For example, if you plan to use mobile keys or Instant Keys, your lock hardware must support Bluetooth Low Energy (BLE) keys. Also, to use mobile keys with your access system, you may need to purchase licenses or subscriptions to activate certain software features. These requirements vary by access system. For details, see Setting Up Your Site for Instant Keys and the system integration guide for your access system.
Connect your access system to Seam.
To connect your access system to Seam, we recommend embedding a Connect Webview in your application. The Connect Webview flow guides the property manager through each step of the connection process. For on-premises access systems, use Seam Bridge to connect the access system securely to Seam. For details, see Connect an Access System to Seam.
(Optional) Set up spaces to organize entrances into logical groups.
You can use spaces to create groups of entrances for efficiency. For example, a user staying in Room 101 may need access to both the Room 101 door, the main entrance door, and the nearest elevator. You could create a space that includes these three access points and then use this space when creating an Access Grant. For details, see spaces.
Create a user identity.
User identities represent your users—the people to whom you want to grant access. You can create a user identity before creating an Access Grant, or you can create a user identity as part of creating the Access Grant. See Managing Mobile App User Accounts with User Identities.
Create an Access Grant.
When you create an Access Grant, you specify the user identity to whom you want to grant access, the access schedule, the set of entrances or spaces, and one or more access methods that you want to request. See Creating an Access Grant Using Entrances and Creating an Access Grant Using Spaces. You can poll for access method status changes or watch for Access Grant and access method lifecycle events that alert you to next steps, such as how and when to deliver each created access method to your user.
Deliver the access method to the user.
Once Seam alerts you that your access methods are ready, deliver them to your user. Delivery steps depend on the mode of access, such as plastic key card, PIN code, or mobile key.
If you have created an access grant that includes a card access method, you may need to encode the card using the Seam encoders API.
If you have created an Access Grant that includes a mobile key, you can use the Seam mobile SDKs to develop your mobile app that delivers these mobile keys to your users.
Each mobile key also includes an Instant Key URL. To share this Instant Key with your user, send it through text or email or embed it in your own app.
***
diff --git a/docs/capability-guides/access-grants/access-grant-quick-start.md b/docs/capability-guides/access-grants/access-grant-quick-start.md
index a3a86bb96..991ccc777 100644
--- a/docs/capability-guides/access-grants/access-grant-quick-start.md
+++ b/docs/capability-guides/access-grants/access-grant-quick-start.md
@@ -6,10 +6,6 @@ description: >-
# Access Grant Quick Start
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
-
In this quick start, create an Access Grant to give a user access to a set of entrances. Access Grants provide a unified, intuitive, and streamlined way to grant and manage user access across multiple access system providers. With a single command you can define the "who, where, when, and how" for assigning a user access to entrances and other access points.
In addition, this quick start shows you that, with Access Grants, it's easy to issue users access through multiple types of access methods, such as key cards, PIN codes, mobile keys, and Instant Keys.
diff --git a/docs/capability-guides/access-grants/creating-an-access-grant-using-entrances.md b/docs/capability-guides/access-grants/creating-an-access-grant-using-entrances.md
index e59a50d03..acb46c5ef 100644
--- a/docs/capability-guides/access-grants/creating-an-access-grant-using-entrances.md
+++ b/docs/capability-guides/access-grants/creating-an-access-grant-using-entrances.md
@@ -6,10 +6,6 @@ description: >-
# Creating an Access Grant Using Entrances
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
-
An Access Grant defines the following characteristics:
* User identity: The user to whom you want to grant access.
diff --git a/docs/capability-guides/access-grants/creating-an-access-grant-using-spaces.md b/docs/capability-guides/access-grants/creating-an-access-grant-using-spaces.md
index 74a42bf80..844255aaa 100644
--- a/docs/capability-guides/access-grants/creating-an-access-grant-using-spaces.md
+++ b/docs/capability-guides/access-grants/creating-an-access-grant-using-spaces.md
@@ -6,10 +6,6 @@ description: >-
# Creating an Access Grant Using Spaces
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
-
An Access Grant defines the following characteristics:
* User identity: The user to whom you want to grant access.
diff --git a/docs/capability-guides/access-grants/deleting-an-access-grant.md b/docs/capability-guides/access-grants/deleting-an-access-grant.md
index eecae8414..68f04a5e5 100644
--- a/docs/capability-guides/access-grants/deleting-an-access-grant.md
+++ b/docs/capability-guides/access-grants/deleting-an-access-grant.md
@@ -4,10 +4,6 @@ description: Learn how to delete an Access Grant.
# Deleting an Access Grant
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
-
To delete an Access Grant:
{% tabs %}
diff --git a/docs/capability-guides/access-grants/delivering-access-methods.md b/docs/capability-guides/access-grants/delivering-access-methods.md
index f47879ad8..cf1117850 100644
--- a/docs/capability-guides/access-grants/delivering-access-methods.md
+++ b/docs/capability-guides/access-grants/delivering-access-methods.md
@@ -6,10 +6,6 @@ description: >-
# Delivering Access Methods
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
-
The `access_method.is_issued` property and event let you know when an access method is ready to deliver to your user. Once an access method is ready to deliver, retrieve the access method by ID. Remember, the returned Access Grant includes the IDs of all the requested access methods. Then, deliver the access method to your user. The delivery mechanism varies for different access method modes.
{% hint style="info" %}
diff --git a/docs/capability-guides/access-grants/retrieving-access-grants-and-access-methods.md b/docs/capability-guides/access-grants/retrieving-access-grants-and-access-methods.md
index 5c8b62543..e89126b48 100644
--- a/docs/capability-guides/access-grants/retrieving-access-grants-and-access-methods.md
+++ b/docs/capability-guides/access-grants/retrieving-access-grants-and-access-methods.md
@@ -4,10 +4,6 @@ description: Learn how to list and get Access Grants and access methods.
# Retrieving Access Grants and Access Methods
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
-
You can list all Access Grants, and you can also filter the list by one or more of the following properties:
* `acs_entrance_id`
diff --git a/docs/capability-guides/access-grants/revoking-an-access-method.md b/docs/capability-guides/access-grants/revoking-an-access-method.md
index 918d076d4..433e2bbbf 100644
--- a/docs/capability-guides/access-grants/revoking-an-access-method.md
+++ b/docs/capability-guides/access-grants/revoking-an-access-method.md
@@ -4,10 +4,6 @@ description: Learn how to revoke an access method so that a user can no longer u
# Revoking an Access Method
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
-
To revoke an access method, delete it.
{% tabs %}
diff --git a/docs/capability-guides/access-grants/updating-an-access-grant.md b/docs/capability-guides/access-grants/updating-an-access-grant.md
index 95f449a89..3688f5994 100644
--- a/docs/capability-guides/access-grants/updating-an-access-grant.md
+++ b/docs/capability-guides/access-grants/updating-an-access-grant.md
@@ -4,10 +4,6 @@ description: Learn how to update the time window for an Access Grant
# Updating an Access Grant
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants API is currently in Alpha. We're actively developing it and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
-
You can update the starting and ending times for an Access Grant.
Note that you cannot update the access methods, entrances, or spaces associated with an Access Grant. To change these access characteristics, delete the Access Grant and recreate it.
diff --git a/docs/capability-guides/access-systems/working-with-card-encoders-and-scanners/creating-and-encoding-card-access-methods.md b/docs/capability-guides/access-systems/working-with-card-encoders-and-scanners/creating-and-encoding-card-access-methods.md
index 155ea19c0..946faefcb 100644
--- a/docs/capability-guides/access-systems/working-with-card-encoders-and-scanners/creating-and-encoding-card-access-methods.md
+++ b/docs/capability-guides/access-systems/working-with-card-encoders-and-scanners/creating-and-encoding-card-access-methods.md
@@ -8,10 +8,6 @@ description: >-
-{% hint style="info" %}
-**Early Access Preview.** The Access Grants and access methods APIs are currently in Alpha. We're actively developing them and seeking early feedback at [support@seam.co](mailto:support@seam.co). Expect breaking changes as we refine the design.
-{% endhint %}
-
Some access control systems require encoding a plastic card with the data necessary to enable access. This process involves creating an access grant that requests a card access method with the required access permissions and then using a card encoder to write the access method onto the card.
This process consists of the following basic steps:
diff --git a/docs/capability-guides/smart-locks/access-codes/creating-access-codes/understanding-code-constraints.md b/docs/capability-guides/smart-locks/access-codes/creating-access-codes/understanding-code-constraints.md
index d024df98b..50473c049 100644
--- a/docs/capability-guides/smart-locks/access-codes/creating-access-codes/understanding-code-constraints.md
+++ b/docs/capability-guides/smart-locks/access-codes/creating-access-codes/understanding-code-constraints.md
@@ -9,3 +9,178 @@ When creating access codes, it is important to be aware of any constraints on th
The `constraint_type` property can be any of the following enum values:
Constraint Type
Description
no_zeros
Cannot use 0s as digits in the PIN code.
cannot_start_with_12
PIN code cannot start with the sequence of digits 12.
no_triple_consecutive_ints
No more than three digits in a row can be consecutive or the same in the PIN code.
cannot_specify_pin_code
Cannot specify a PIN code. You must leave the code empty, and the lock provider generates a PIN code.
pin_code_matches_existing_set
If you specify a PIN code, it must match an existing set of PIN codes used in the account.
For example, the PIN code could match the code assigned to a user in the system.
start_date_in_future
For time-bound codes, the start date must be in the future.
no_ascending_or_descending_sequence
PIN code cannot consist of a sequence of consecutive digits.
at_least_three_unique_digits
PIN code must contain at least three unique digits.
cannot_contain_089
PIN code cannot contain the digits 0, 8, or 9.
For example, this restriction could apply to a cylinder lock that only includes the digits 1 to 7.
cannot_contain_0789
PIN code cannot contain the digits 0, 7, 8, or 9.
For example, this restriction could apply to a cylinder lock that only includes the digits 1 to 6.
name_length
Name of the code has some restrictions on length.
When the constraint_type is name_length, the constraint object has one or two additional properties called min_length and max_length to specify the length constraints.
name_must_be_unique
Name of the code must be unique within the device.
+
+***
+
+## Provider-Specific Requirements
+
+In addition to code constraints, some device providers have additional requirements for creating access codes.
+
+### Timezone Configuration
+
+Some device providers require you to configure the device's timezone before creating time-bound access codes. This is because these devices schedule access codes using device-local time, but their APIs do not report the device's timezone.
+
+**Providers requiring timezone configuration:**
+
+* **Ultraloq** — Must configure timezone using `/devices/report_provider_metadata` before creating time-bound access codes. See [Configuring Ultraloq Device Timezones](../../../../device-and-system-integration-guides/ultraloq-locks/configuring-ultraloq-device-timezones.md).
+
+{% hint style="info" %}
+Permanent access codes (codes without `starts_at` and `ends_at`) do not require timezone configuration, even on providers that require it for time-bound codes.
+{% endhint %}
+
+**Detecting timezone requirement:**
+
+Check for the provider-specific timezone warning in `device.warnings`:
+
+{% tabs %}
+{% tab title="Python" %}
+```python
+from seam import Seam
+
+seam = Seam()
+
+device = seam.devices.get(device_id="your-device-id")
+
+# Check for timezone warnings
+timezone_warnings = [
+ w for w in device.warnings
+ if "time_zone" in w.warning_code.lower()
+]
+
+if timezone_warnings:
+ print("⚠️ Timezone configuration required for time-bound codes")
+ print(f"Warning: {timezone_warnings[0].message}")
+```
+{% endtab %}
+
+{% tab title="JavaScript" %}
+```javascript
+import { Seam } from "seam";
+
+const seam = new Seam();
+
+const device = await seam.devices.get({
+ device_id: "your-device-id"
+});
+
+// Check for timezone warnings
+const timezoneWarnings = device.warnings.filter(
+ w => w.warning_code.toLowerCase().includes("time_zone")
+);
+
+if (timezoneWarnings.length > 0) {
+ console.log("⚠️ Timezone configuration required for time-bound codes");
+ console.log(`Warning: ${timezoneWarnings[0].message}`);
+}
+```
+{% endtab %}
+
+{% tab title="Ruby" %}
+```ruby
+require "seam"
+
+seam = Seam.new()
+
+device = seam.devices.get(device_id: "your-device-id")
+
+# Check for timezone warnings
+timezone_warnings = device.warnings.select do |w|
+ w.warning_code.downcase.include?("time_zone")
+end
+
+if timezone_warnings.any?
+ puts "⚠️ Timezone configuration required for time-bound codes"
+ puts "Warning: #{timezone_warnings[0].message}"
+end
+```
+{% endtab %}
+
+{% tab title="PHP" %}
+```php
+devices->get(device_id: "your-device-id");
+
+// Check for timezone warnings
+$timezoneWarnings = array_filter($device->warnings, function($w) {
+ return stripos($w->warning_code, "time_zone") !== false;
+});
+
+if (count($timezoneWarnings) > 0) {
+ echo "⚠️ Timezone configuration required for time-bound codes\n";
+ echo "Warning: " . array_values($timezoneWarnings)[0]->message . "\n";
+}
+```
+{% endtab %}
+
+{% tab title="C#" %}
+```csharp
+using Seam.Client;
+using System.Linq;
+
+var seam = new SeamClient();
+
+var device = seam.Devices.Get(deviceId: "your-device-id");
+
+// Check for timezone warnings
+var timezoneWarnings = device.Warnings
+ .Where(w => w.WarningCode.ToLower().Contains("time_zone"))
+ .ToList();
+
+if (timezoneWarnings.Any())
+{
+ Console.WriteLine("⚠️ Timezone configuration required for time-bound codes");
+ Console.WriteLine($"Warning: {timezoneWarnings[0].Message}");
+}
+```
+{% endtab %}
+
+{% tab title="Java" %}
+```java
+import com.seam.api.Seam;
+import com.seam.api.types.Device;
+import java.util.stream.Collectors;
+
+Seam seam = Seam.builder().build();
+
+Device device = seam.devices().get(
+ DevicesGetRequest.builder()
+ .deviceId("your-device-id")
+ .build()
+);
+
+// Check for timezone warnings
+var timezoneWarnings = device.getWarnings().stream()
+ .filter(w -> w.getWarningCode().toLowerCase().contains("time_zone"))
+ .collect(Collectors.toList());
+
+if (!timezoneWarnings.isEmpty()) {
+ System.out.println("⚠️ Timezone configuration required for time-bound codes");
+ System.out.println("Warning: " + timezoneWarnings.get(0).getMessage());
+}
+```
+{% endtab %}
+
+{% tab title="cURL (bash)" %}
+```bash
+device=$(curl -X 'POST' \
+ 'https://connect.getseam.com/devices/get' \
+ -H 'accept: application/json' \
+ -H "Authorization: Bearer ${SEAM_API_KEY}" \
+ -H 'Content-Type: application/json' \
+ -d "{
+ \"device_id\": \"your-device-id\"
+ }")
+
+# Check for timezone warnings
+echo $device | jq '.device.warnings[] | select(.warning_code | test("time_zone"; "i"))'
+```
+{% endtab %}
+{% endtabs %}
+
+For devices requiring timezone configuration, attempting to create a time-bound access code without first setting the timezone will result in a validation error.
diff --git a/docs/device-and-system-integration-guides/ultraloq-locks/README.md b/docs/device-and-system-integration-guides/ultraloq-locks/README.md
new file mode 100644
index 000000000..ac0d1fe93
--- /dev/null
+++ b/docs/device-and-system-integration-guides/ultraloq-locks/README.md
@@ -0,0 +1,98 @@
+---
+description: Guide for using Ultraloq smart locks with Seam
+---
+
+# Ultraloq Locks
+
+
Connect and control Ultraloq devices using the Seam API.
+
+## Overview
+
+Seam integrates with Ultraloq smart locks, providing Wi-Fi-enabled access control with online programming capabilities. Ultraloq locks support both permanent and time-bound access codes, remote lock and unlock operations, and device monitoring.
+
+{% hint style="warning" %}
+**Important:** Ultraloq devices require timezone configuration before you can create time-bound access codes. This is a unique requirement for Ultraloq locks. See [Configuring Ultraloq Device Timezones](configuring-ultraloq-device-timezones.md) for details.
+{% endhint %}
+
+***
+
+## Supported Devices
+
+All Ultraloq smart locks with Wi-Fi connectivity are supported through this integration.
+
+For detailed information about the Ultraloq devices that Seam supports, see our [Ultraloq Supported Devices page](https://www.seam.co/manufacturers/ultraloq).
+
+***
+
+## Supported Features
+
+We support the following features:
+
+#### Device control
+
+* Lock and unlock actions (online)
+
+#### Access code management
+
+* Permanent access codes (no timezone required)
+* Time-bound access codes (requires timezone configuration)
+* Custom code lengths between 4 and 8 digits
+* Auto-generated codes
+
+#### Device monitoring
+
+* Lock status
+* Online/offline state
+* Battery level (where supported)
+
+***
+
+## Time Zone Requirement
+
+Unlike most other integrations, Ultraloq devices require timezone configuration to enable time-bound access codes. This is because Ultraloq devices schedule access codes using device-local time, but the Ultraloq API does not report the device's timezone.
+
+### What Works Without Timezone
+
+* ✅ Permanent access codes (codes without start/end times)
+* ✅ Lock and unlock operations
+* ✅ Device monitoring
+
+### What Requires Timezone
+
+* ❌ Time-bound access codes (codes with `starts_at` and `ends_at`)
+
+When you first connect an Ultraloq device, it will have a `ultraloq_time_zone_unknown` warning in `device.warnings`. You must configure the timezone using the `/devices/report_provider_metadata` endpoint before creating time-bound access codes.
+
+For complete instructions, see [Configuring Ultraloq Device Timezones](configuring-ultraloq-device-timezones.md).
+
+***
+
+## Connecting Ultraloq to Seam
+
+To enable your users to [connect Ultraloq devices through Connect Webviews](../../core-concepts/connect-webviews/customizing-connect-webviews.md#customize-the-brands-to-display-in-your-connect-webviews), include the Ultraloq provider:
+
+```json
+{
+ "accepted_providers": ["ultraloq"]
+}
+```
+
+After the user authorizes Seam through the OAuth flow, their Ultraloq devices will be automatically discovered and added to Seam.
+
+[→ See: Ultraloq Setup Guide](ultraloq-setup-guide.md)
+
+***
+
+## Brand-specific notes
+
+* **Access codes:** Ultraloq requires access codes to be 4–8 digit numeric PINs (e.g., "1234", "567890").
+* **Timezone configuration:** Required before creating time-bound access codes. Permanent codes work without timezone configuration.
+* **Code disabling:** Users can disable access codes through the Ultraloq mobile app. Seam detects this and adds a `ultraloq_access_code_disabled` warning to the affected access code.
+
+***
+
+## Next Steps
+
+
Connect Ultraloq to Seam
Follow the setup guide to connect your Ultraloq account and configure device timezones.