<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Imou-OpenPlatform</title>
    <description>The latest articles on DEV Community by Imou-OpenPlatform (@imouopenplatform).</description>
    <link>https://dev.to/imouopenplatform</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4081128%2F686c2108-507d-40e2-8d18-8a5151fa588e.png</url>
      <title>DEV Community: Imou-OpenPlatform</title>
      <link>https://dev.to/imouopenplatform</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/imouopenplatform"/>
    <language>en</language>
    <item>
      <title>Imou Open Platform Production Checklist: Devices, Events, Permissions and Storage</title>
      <dc:creator>Imou-OpenPlatform</dc:creator>
      <pubDate>Tue, 01 Sep 2026 07:11:07 +0000</pubDate>
      <link>https://dev.to/imouopenplatform/imou-open-platform-production-checklist-devices-events-permissions-and-storage-1aoh</link>
      <guid>https://dev.to/imouopenplatform/imou-open-platform-production-checklist-devices-events-permissions-and-storage-1aoh</guid>
      <description>&lt;p&gt;Before production, prove one complete lifecycle with the actual account region, devices, firmware, services, and client: signed backend access, supported onboarding and binding, device/channel inventory, least-privilege authorization, callback HTTP 200 and downstream processing, optional media behavior, storage queries, live-address controls, credential protection, observability, offboarding, and recovery. Documentation establishes interfaces; your pilot must establish that the selected combination works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;Most integration demos prove only a happy-path frame or successful API response. Production failures happen between those moments: a device generation needs an SDK-assisted binding path, a callback route returns a redirect, an event has no image, a sub-account lacks channel permission, or a live address is paused. A production gate should test transitions and boundaries, not simply count completed endpoints.&lt;/p&gt;

&lt;p&gt;The Imou homepage groups the platform into device access, video security, value-added services, app development, Home Assistant, and SaaS-oriented management. Use that map to identify dependencies, then use live method documentation and deployment evidence for approval.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach / architecture
&lt;/h2&gt;

&lt;p&gt;Assign an owner and proof artifact to each plane:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plane&lt;/th&gt;
&lt;th&gt;Production proof&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Credentials and region&lt;/td&gt;
&lt;td&gt;Console assignment, signed test, secret controls&lt;/td&gt;
&lt;td&gt;Platform/backend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Device onboarding&lt;/td&gt;
&lt;td&gt;Supported state transitions on target versions&lt;/td&gt;
&lt;td&gt;Mobile/device/backend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inventory&lt;/td&gt;
&lt;td&gt;Device/channel/capability reconciliation&lt;/td&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authorization&lt;/td&gt;
&lt;td&gt;Allowed and denied user/resource tests&lt;/td&gt;
&lt;td&gt;Security/backend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Events&lt;/td&gt;
&lt;td&gt;Public callback, exact 200, durable processing&lt;/td&gt;
&lt;td&gt;Backend/operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence and storage&lt;/td&gt;
&lt;td&gt;Snapshot/video query and missing-media UX&lt;/td&gt;
&lt;td&gt;Product/backend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live operations&lt;/td&gt;
&lt;td&gt;Address, plan, and status runbook&lt;/td&gt;
&lt;td&gt;Operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;Verified mobile, PC, browser, or HA workflow&lt;/td&gt;
&lt;td&gt;Client team&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lifecycle&lt;/td&gt;
&lt;td&gt;Credential rotation, device removal, user offboarding&lt;/td&gt;
&lt;td&gt;Security/operations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Keep &lt;code&gt;AppSecret&lt;/code&gt;, administrator tokens, signing, and administrative OpenAPI calls in a trusted backend. Place only documented client responsibilities in OpenSDK or web components. Your product owns tenant authorization even when Imou sub-account permissions are also used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seven production gates
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prove application identity and regional routing.&lt;/strong&gt; Record the data center assigned in Control Board and map the credential set to the documented SG, FK, or OR endpoint. Run the official signing test and a real signed request. Reject unknown region config at startup.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prove onboarding for supported combinations.&lt;/strong&gt; Test network configuration, initialization, binding, resume after interruption, existing binding, and device removal with the device and software versions you will support. Follow current OpenSDK demos where SDK-assisted binding is required.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prove inventory and capability decisions.&lt;/strong&gt; Reconcile every bound device and channel into your product model. Drive controls from returned capabilities and services, not a universal model promise. Test offline and unsupported states.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prove least privilege.&lt;/strong&gt; Classify every method by administrator versus sub-account token. Test the minimum documented resource and permission, wrong tenant, wrong channel, removed policy, and attempts to invoke administrator work through user routes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prove callback recovery.&lt;/strong&gt; Verify the public URL, TLS, exact HTTP 200, durable enqueue, family-specific parsing, duplicate handling, and downstream failure isolation. Test saved callback configuration and a re-subscription runbook without inventing retry counts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prove evidence, storage, and live behavior.&lt;/strong&gt; Render events without images, process images only where present, test &lt;code&gt;snapshot&lt;/code&gt; and &lt;code&gt;video&lt;/code&gt; queries where subscribed, and operate live addresses using exact address-, stream-, and plan-state fields. Do not assume entitlement or media completeness.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prove operations and offboarding.&lt;/strong&gt; Build redacted diagnostics, alert ownership, controlled config changes, user removal, device unbinding, live-address cleanup, credential rotation, and rollback. Run an incident exercise before scaling.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  APIs / SDKs
&lt;/h2&gt;

&lt;p&gt;Start at the &lt;a href="https://open.imoulife.com/" rel="noopener noreferrer"&gt;Imou Open Platform homepage&lt;/a&gt; for the product map. Use the following current sources as implementation boundaries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/develop.html" rel="noopener noreferrer"&gt;HTTP development specification&lt;/a&gt; for regional endpoints, request envelope, and signatures;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/mobile/summary.html" rel="noopener noreferrer"&gt;mobile application guide&lt;/a&gt; for SDK/backend responsibility and version-dependent binding;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/account/summary.html" rel="noopener noreferrer"&gt;account docking&lt;/a&gt; for sub-accounts and policies;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/push/push.html" rel="noopener noreferrer"&gt;event push process&lt;/a&gt; and &lt;a href="https://open.imoulife.com/book/en/push/event.html" rel="noopener noreferrer"&gt;event formats&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/device/record/cloud/getCloudRecords.html" rel="noopener noreferrer"&gt;&lt;code&gt;getCloudRecords&lt;/code&gt;&lt;/a&gt; for snapshot/video record queries;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/device/live/summary.html" rel="noopener noreferrer"&gt;live module&lt;/a&gt; for address and plan lifecycle; and&lt;/li&gt;
&lt;li&gt;the verified &lt;a href="https://open.imoulife.com/book/pc/summary.html" rel="noopener noreferrer"&gt;PC guide&lt;/a&gt; and &lt;a href="https://open.imoulife.com/book/en/readme/model.html" rel="noopener noreferrer"&gt;docking-mode comparison&lt;/a&gt; when evaluating desktop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Method pages win over summaries. Save the source and review date in each production control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Required test evidence
&lt;/h2&gt;

&lt;p&gt;For each gate, retain environment, application reference, account region, device and software version, SDK/client version, method, sanitized request ID and result, expected outcome, observed outcome, and reviewer. Never include &lt;code&gt;AppSecret&lt;/code&gt;, full access tokens, device passwords, verification codes, signed media URLs, reusable live addresses, or unredacted customer payloads.&lt;/p&gt;

&lt;p&gt;Evidence should distinguish documented fact from application policy. For example, HTTP 200 is a documented callback requirement; your queue, timeout, retry, deduplication, and alert thresholds are internal design. &lt;code&gt;liveStatus&lt;/code&gt; values are documented; your incident severity and remediation are internal policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Release and rollback
&lt;/h2&gt;

&lt;p&gt;Release first to a small, known inventory. Confirm onboarding, one permitted user flow, one denied flow, one callback event, one media-absent event, one storage query where applicable, and one controlled live-state observation. Expand only after logs and support tools can explain each stage.&lt;/p&gt;

&lt;p&gt;Rollback must preserve authorization and evidence. Define how to disable a client feature without exposing broader credentials, restore callback routing, revert endpoint config, and reconcile any device, policy, or live-address writes made during deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits &amp;amp; pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Do not approve production from one successful live frame.&lt;/li&gt;
&lt;li&gt;Do not promise all models, firmware, events, images, storage, playback, talk, PTZ, or client features.&lt;/li&gt;
&lt;li&gt;Do not expose &lt;code&gt;AppSecret&lt;/code&gt;, administrator tokens, sub-account tokens, signed images, or live addresses.&lt;/li&gt;
&lt;li&gt;Do not select regional endpoints from end-user geography or infer data residency from hostname labels.&lt;/li&gt;
&lt;li&gt;Do not invent callback retry counts, platform latency, implementation duration, or SLA.&lt;/li&gt;
&lt;li&gt;Do not publish prices, storage unit costs, entitlement quantities, or universal retention from technical pages.&lt;/li&gt;
&lt;li&gt;Do not invent AI endpoints or promise AI results.&lt;/li&gt;
&lt;li&gt;Do not use administrator authority as a fallback for failed user-scoped calls.&lt;/li&gt;
&lt;li&gt;Do not use guessed &lt;code&gt;/book/en/pc/&lt;/code&gt; paths; the verified PC guide is &lt;code&gt;/book/pc/summary.html&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Recheck live documentation on release and publication day.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Go/no-go record
&lt;/h2&gt;

&lt;p&gt;The final record should name unresolved risks. “Not tested” is a no-go for a required journey, but it can be an explicit non-feature for out-of-scope capabilities. Document supported combinations narrowly, give users honest unavailable states, and create a revalidation trigger for SDK, device software, account region, service, endpoint, or callback changes.&lt;/p&gt;

&lt;p&gt;Use &lt;a href="https://open.imoulife.com/" rel="noopener noreferrer"&gt;Imou Open Platform&lt;/a&gt; to assemble a one-device production rehearsal, and promote only after every required lifecycle gate has current, sanitized evidence.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>camera</category>
    </item>
    <item>
      <title>Operate Imou Live Addresses Using Status, Plans and Insufficient-Traffic Signals</title>
      <dc:creator>Imou-OpenPlatform</dc:creator>
      <pubDate>Tue, 01 Sep 2026 07:09:46 +0000</pubDate>
      <link>https://dev.to/imouopenplatform/operate-imou-live-addresses-using-status-plans-and-insufficient-traffic-signals-46ml</link>
      <guid>https://dev.to/imouopenplatform/operate-imou-live-addresses-using-status-plans-and-insufficient-traffic-signals-46ml</guid>
      <description>&lt;p&gt;Operate live addresses with two separate status vocabularies. Current &lt;code&gt;liveList&lt;/code&gt; documentation defines address-level &lt;code&gt;liveStatus&lt;/code&gt; as &lt;code&gt;1&lt;/code&gt; open, &lt;code&gt;2&lt;/code&gt; pause, and &lt;code&gt;3&lt;/code&gt; insufficient traffic. Current &lt;code&gt;queryLiveStatus&lt;/code&gt; returns stream-level &lt;code&gt;status&lt;/code&gt;: &lt;code&gt;0&lt;/code&gt; live, &lt;code&gt;1&lt;/code&gt; live with abnormal cover, &lt;code&gt;2&lt;/code&gt; abnormal video source, &lt;code&gt;3&lt;/code&gt; abnormal stream conversion, &lt;code&gt;4&lt;/code&gt; abnormal cloud-storage access, and &lt;code&gt;10&lt;/code&gt; paused. Preserve these exact values and inspect plan state separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;A live URL existing in a database does not mean it is usable. The address can be paused, a schedule can be disabled, or an individual stream can report a source or conversion problem. If an operations system collapses all those states into &lt;code&gt;healthy: true/false&lt;/code&gt;, it cannot route incidents or explain why viewers see no video.&lt;/p&gt;

&lt;p&gt;There is a second trap: &lt;code&gt;3&lt;/code&gt; means different things in different fields. Address-level &lt;code&gt;liveStatus: 3&lt;/code&gt; in &lt;code&gt;liveList&lt;/code&gt; is documented as insufficient traffic. Stream-level &lt;code&gt;status: "3"&lt;/code&gt; in &lt;code&gt;queryLiveStatus&lt;/code&gt; is documented as abnormal stream conversion. Field name and source method are part of the meaning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach / architecture
&lt;/h2&gt;

&lt;p&gt;Maintain a live-address ledger keyed by &lt;code&gt;liveToken&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ledger field&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Address identity&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;liveList&lt;/code&gt; / creation response&lt;/td&gt;
&lt;td&gt;Stable lookup for lifecycle operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Device and channel&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;liveList&lt;/code&gt; or &lt;code&gt;getLiveStreamInfo&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Asset relationship&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;liveStatus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;liveList&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Address-level state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stream &lt;code&gt;status&lt;/code&gt; by &lt;code&gt;streamId&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;queryLiveStatus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Per-stream technical state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;job.status&lt;/code&gt;, period, begin/end&lt;/td&gt;
&lt;td&gt;&lt;code&gt;liveList&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Plan snapshot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last observed time and method&lt;/td&gt;
&lt;td&gt;Your backend&lt;/td&gt;
&lt;td&gt;Freshness and diagnostics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redacted address reference&lt;/td&gt;
&lt;td&gt;Returned stream data&lt;/td&gt;
&lt;td&gt;Controlled playback handoff&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This schema is recommended operator design, not an Imou-prescribed database. Restrict full HLS/RTMP addresses as secrets or sensitive operational data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exact current status vocabularies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Address-level &lt;code&gt;liveStatus&lt;/code&gt; from &lt;code&gt;liveList&lt;/code&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Current documentation label&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pause&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Insufficient traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Stream-level &lt;code&gt;status&lt;/code&gt; from &lt;code&gt;queryLiveStatus&lt;/code&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Current documentation label&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live broadcast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live broadcast, but the video cover is abnormal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Video source is abnormal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stream conversion abnormal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cloud storage access abnormal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live broadcast is paused&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These labels reflect the current live pages reviewed for this draft. They must be checked again on publication day. Do not transform nonzero values into one generic failure before storing the raw field and method.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seven operational steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inventory created addresses.&lt;/strong&gt; Call &lt;a href="https://open.imoulife.com/book/en/http/device/live/liveList.html" rel="noopener noreferrer"&gt;&lt;code&gt;liveList&lt;/code&gt;&lt;/a&gt; with its documented range and paginate through the intended account scope. Record &lt;code&gt;liveToken&lt;/code&gt;, device/channel where present, type, streams, &lt;code&gt;liveStatus&lt;/code&gt;, and &lt;code&gt;job&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reconcile with your asset ledger.&lt;/strong&gt; Identify addresses with no owning product record, assets expecting an address that is absent, and duplicate assumptions. Do not delete or recreate automatically before confirming ownership.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read plan state independently.&lt;/strong&gt; The returned &lt;code&gt;job&lt;/code&gt; includes status and schedule information. A paused or out-of-plan experience is not automatically a stream-source incident. Preserve the values exactly and check the applicable plan method before writing changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Drill into stream state.&lt;/strong&gt; For active or important addresses, call &lt;a href="https://open.imoulife.com/book/en/http/device/live/queryLiveStatus.html" rel="noopener noreferrer"&gt;&lt;code&gt;queryLiveStatus&lt;/code&gt;&lt;/a&gt; by &lt;code&gt;liveToken&lt;/code&gt;. Save status per &lt;code&gt;streamId&lt;/code&gt;; do not overwrite address-level state.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Route by documented category.&lt;/strong&gt; Open, paused, insufficient-traffic, cover, source, conversion, storage-access, and stream-paused observations need different operator queues. The action and alert threshold are your policy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Protect playback data.&lt;/strong&gt; Return live addresses only after product authorization, avoid persistent client exposure where possible, and redact them from normal logs, dashboards, tickets, and screenshots.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recheck after controlled change.&lt;/strong&gt; Use documented methods such as &lt;code&gt;modifyLivePlanStatus&lt;/code&gt;, &lt;code&gt;modifyLivePlan&lt;/code&gt;, or &lt;code&gt;batchModifyLivePlan&lt;/code&gt; only through an approved backend workflow. Read state again and record the result.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  APIs / SDKs
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://open.imoulife.com/book/en/http/device/live/summary.html" rel="noopener noreferrer"&gt;live module summary&lt;/a&gt; lists the live-address lifecycle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;bindDeviceLive&lt;/code&gt; creates a device-source live address;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;unbindLive&lt;/code&gt; deletes a live address;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;liveList&lt;/code&gt; inventories addresses and address-level state;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;queryLiveStatus&lt;/code&gt; inspects stream-level state;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;modifyLivePlanStatus&lt;/code&gt;, &lt;code&gt;modifyLivePlan&lt;/code&gt;, and &lt;code&gt;batchModifyLivePlan&lt;/code&gt; manage plans;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;getLiveStreamInfo&lt;/code&gt; resolves live information by device and channel; and&lt;/li&gt;
&lt;li&gt;RTMP methods create, delete, and query RTMP live addresses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The current &lt;code&gt;liveList&lt;/code&gt; and &lt;code&gt;queryLiveStatus&lt;/code&gt; pages require administrator &lt;code&gt;accessToken&lt;/code&gt;. Keep it in the trusted backend. Method existence does not guarantee a live result for every device, channel, codec, account, region, or service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observability and incident records
&lt;/h2&gt;

&lt;p&gt;Every sample should retain method name, request &lt;code&gt;id&lt;/code&gt;, account region, redacted &lt;code&gt;liveToken&lt;/code&gt;, device/channel reference, raw documented status, stream ID where applicable, plan snapshot, and observation time. Separate API-call failure from a successful response that reports a non-healthy state.&lt;/p&gt;

&lt;p&gt;Do not label &lt;code&gt;liveStatus: 3&lt;/code&gt; with a price or billing conclusion. The verified statement is only the current page’s “insufficient traffic” label. Commercial interpretation, entitlement, replenishment, and account action require approved current sources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits &amp;amp; pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Never merge &lt;code&gt;liveStatus&lt;/code&gt; and stream &lt;code&gt;status&lt;/code&gt;; their value &lt;code&gt;3&lt;/code&gt; has different meanings.&lt;/li&gt;
&lt;li&gt;Do not invent status values or rename them into unsupported diagnoses.&lt;/li&gt;
&lt;li&gt;Do not treat &lt;code&gt;liveStatus: 1&lt;/code&gt; as proof that every stream variant is healthy.&lt;/li&gt;
&lt;li&gt;Do not treat &lt;code&gt;job.status&lt;/code&gt; as the same field as live or stream status.&lt;/li&gt;
&lt;li&gt;Do not infer timezone or recurrence semantics without reading the live plan-method page.&lt;/li&gt;
&lt;li&gt;Do not expose reusable live URLs, live tokens, administrator tokens, or AppSecret.&lt;/li&gt;
&lt;li&gt;Do not automatically recreate an address when status is abnormal; first preserve evidence and ownership.&lt;/li&gt;
&lt;li&gt;Do not invent pricing, quota quantities, SLA, recovery timing, or universal account actions for insufficient traffic.&lt;/li&gt;
&lt;li&gt;Do not promise every device supports every live protocol or stream.&lt;/li&gt;
&lt;li&gt;Revalidate all values and method permissions immediately before publication.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use the current &lt;a href="https://open.imoulife.com/book/en/http/device/live/summary.html" rel="noopener noreferrer"&gt;Imou live module documentation&lt;/a&gt; to build a status-aware ledger, then test each operator branch with a controlled live address.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>camera</category>
    </item>
    <item>
      <title>Desktop Private Protocol vs Browser Integration on Imou Open Platform</title>
      <dc:creator>Imou-OpenPlatform</dc:creator>
      <pubDate>Tue, 01 Sep 2026 07:09:15 +0000</pubDate>
      <link>https://dev.to/imouopenplatform/desktop-private-protocol-vs-browser-integration-on-imou-open-platform-1bni</link>
      <guid>https://dev.to/imouopenplatform/desktop-private-protocol-vs-browser-integration-on-imou-open-platform-1bni</guid>
      <description>&lt;p&gt;Choose PC OpenSDK when a managed desktop application needs the documented desktop private-protocol capabilities: real-time preview, recorded-video playback, voice intercom, and device control. Choose cloud live in a browser when the job is primarily HLS preview and sharing. The desktop guide still assigns accounts, devices, storage, alarms, and token work to a backend. Verify current capabilities and use only the confirmed PC documentation path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;“Desktop versus web” sounds like a packaging decision, but it is really a workflow and responsibility decision. An installed operator console can justify native integration when talk, playback, and operational interaction matter. A browser page can be easier to distribute when users only need to view a live feed. Choosing PC OpenSDK solely because it appears more capable can add deployment and maintenance work without solving a real user need.&lt;/p&gt;

&lt;p&gt;The comparison must also avoid an inaccurate shortcut: browser integration is not necessarily one feature set. The official docking-mode page compares desktop application docking with cloud live broadcast docking. This article limits its detailed comparison to that verified table and does not invent capabilities for undocumented paths.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach / architecture
&lt;/h2&gt;

&lt;p&gt;Evaluate three layers independently:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;PC OpenSDK path&lt;/th&gt;
&lt;th&gt;Browser cloud-live path&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Client deployment&lt;/td&gt;
&lt;td&gt;Installed, managed desktop application&lt;/td&gt;
&lt;td&gt;Web or H5 delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Media protocol in docking table&lt;/td&gt;
&lt;td&gt;Private protocol&lt;/td&gt;
&lt;td&gt;HLS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table capabilities&lt;/td&gt;
&lt;td&gt;Preview, playback, voice intercom, device control&lt;/td&gt;
&lt;td&gt;Preview; playback and intercom not supported in that row&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend requirement&lt;/td&gt;
&lt;td&gt;Required for token, inventory, account/device/storage/alarm work&lt;/td&gt;
&lt;td&gt;Required for credentials, authorization, and live-address lifecycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product fit&lt;/td&gt;
&lt;td&gt;Operator workstation&lt;/td&gt;
&lt;td&gt;Viewing, sharing, lightweight access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The current docking-mode table marks device configuration as not supported for desktop application docking. Do not equate “native client” with every platform function. The &lt;a href="https://open.imoulife.com/book/pc/summary.html" rel="noopener noreferrer"&gt;PC application guide&lt;/a&gt; recommends backend HTTP calls for account binding, device binding/unbinding, device management and operation, cloud storage, and alarm messages; audio/video playback uses the client SDK.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six decision and implementation steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write the operator task.&lt;/strong&gt; Specify whether users only watch, or must also review recordings, talk, and control devices. Identify managed workstations, browser-only users, and support constraints.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Match required capability to verified documentation.&lt;/strong&gt; Use the live docking-mode table for private-protocol desktop versus HLS cloud live. Do not infer additional controls because a client is native or because another SDK exposes them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Design the backend first.&lt;/strong&gt; Keep &lt;code&gt;AppSecret&lt;/code&gt;, administrator tokens, signed OpenAPI calls, product authorization, account/device operations, storage, and event handling in trusted services. Both client choices depend on this boundary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prototype with the current PC package or live path.&lt;/strong&gt; For PC, follow the current OpenSDK demo and confirmed guide at &lt;code&gt;https://open.imoulife.com/book/pc/summary.html&lt;/code&gt;. For browser cloud live, create and protect the documented live address through the backend.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test the whole operator workflow.&lt;/strong&gt; Include sign-in, device selection, preview, applicable playback/talk/control, offline devices, revoked access, workstation updates, and user offboarding. Measure your own environment without publishing an Imou SLA.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Record the decision and fallback.&lt;/strong&gt; State which verified capability justified native installation, how the backend authorizes it, and what browser users can do. Reassess if the requirement or current documentation changes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  APIs / SDKs
&lt;/h2&gt;

&lt;p&gt;Use only these verified PC-related sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/readme/model.html" rel="noopener noreferrer"&gt;Select docking mode&lt;/a&gt;, the canonical comparison of mobile, cloud live, and desktop docking; and&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/pc/summary.html" rel="noopener noreferrer"&gt;PC application development&lt;/a&gt;, the confirmed desktop guide path.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not invent or publish a &lt;code&gt;/book/en/pc/&lt;/code&gt; route. It was not verified. The PC guide describes three core stages—getting a token, getting a device list, and video preview—and assigns audio/video playback to embedded OpenSDK while recommending backend HTTP interfaces for the remaining management functions.&lt;/p&gt;

&lt;p&gt;For cloud live operations, consult the &lt;a href="https://open.imoulife.com/book/en/http/device/live/summary.html" rel="noopener noreferrer"&gt;live module summary&lt;/a&gt; for documented address creation, listing, status, plan, and removal methods. Treat live addresses as sensitive operational data and authorize their distribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  A client-boundary blueprint
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Operator
  -&amp;gt; PC OpenSDK client OR browser
       -&amp;gt; your authenticated backend
            -&amp;gt; tenant/role/device authorization
            -&amp;gt; regional Imou OpenAPI
            -&amp;gt; device inventory and live lifecycle
       -&amp;gt; documented media path

Callback ingress
  -&amp;gt; durable event pipeline
  -&amp;gt; authorized operator workflow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This blueprint keeps client choice from controlling account security. A PC app must not ship &lt;code&gt;AppSecret&lt;/code&gt;; a browser must not receive administrator tokens. Local caches, logs, crash reports, screenshots, and support bundles should redact tokens, device credentials, and reusable live URLs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operational questions before choosing PC
&lt;/h2&gt;

&lt;p&gt;Can the organization deploy and update a native application? Are operators on managed machines? Does the workflow truly require playback or intercom in the same console? How will permissions be revoked when an operator changes roles? What happens when a device is offline? Can support reproduce the issue without collecting secrets? Is the target device capability confirmed?&lt;/p&gt;

&lt;p&gt;If those questions have weak answers, the richer client may create an operations problem. If the workflow requires documented desktop capabilities and native deployment is normal, PC OpenSDK can be the appropriate surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits &amp;amp; pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Do not use or guess &lt;code&gt;/book/en/pc/&lt;/code&gt; links. Use the confirmed &lt;code&gt;/book/pc/summary.html&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Do not quote docking-time figures. The English table renders wording that should not be reused.&lt;/li&gt;
&lt;li&gt;Do not quote performance or latency numbers in this draft; publication would require opening and revalidating the live page on that date.&lt;/li&gt;
&lt;li&gt;Do not claim cloud live represents every possible browser component or capability.&lt;/li&gt;
&lt;li&gt;Do not claim desktop supports device configuration; the current comparison marks it unsupported.&lt;/li&gt;
&lt;li&gt;Do not move account, token, storage, alarm, or authorization control into the client.&lt;/li&gt;
&lt;li&gt;Do not promise playback, talk, control, codecs, or model coverage for every device.&lt;/li&gt;
&lt;li&gt;Do not infer price, SLA, data residency, or universal compatibility from the comparison.&lt;/li&gt;
&lt;li&gt;Do not publish full live addresses or credentials in logs and examples.&lt;/li&gt;
&lt;li&gt;Recheck both verified pages and the current SDK package before release.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compare the live docking modes at &lt;a href="https://open.imoulife.com/book/en/readme/model.html" rel="noopener noreferrer"&gt;Imou Open Platform&lt;/a&gt;, then prototype the smallest client that satisfies the verified operator workflow.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>camera</category>
    </item>
    <item>
      <title>Configure Imou Regional Endpoints: Singapore, Frankfurt and Oregon</title>
      <dc:creator>Imou-OpenPlatform</dc:creator>
      <pubDate>Tue, 01 Sep 2026 07:08:43 +0000</pubDate>
      <link>https://dev.to/imouopenplatform/configure-imou-regional-endpoints-singapore-frankfurt-and-oregon-719</link>
      <guid>https://dev.to/imouopenplatform/configure-imou-regional-endpoints-singapore-frankfurt-and-oregon-719</guid>
      <description>&lt;p&gt;Configure the OpenAPI base URL from the data center assigned to the developer account in Control Board → Basic Information → My Information. Current documentation maps East Asia to &lt;code&gt;openapi-sg.easy4ip.com&lt;/code&gt;, Central Europe to &lt;code&gt;openapi-fk.easy4ip.com&lt;/code&gt;, and Western America to &lt;code&gt;openapi-or.easy4ip.com&lt;/code&gt;, using HTTPS POST under &lt;code&gt;/openapi/[method]&lt;/code&gt;. Do not choose by end-user location or infer data residency from these labels.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;Regional routing is part of credential identity, not a frontend performance setting. A correctly signed request sent to the wrong regional host can fail or address the wrong platform context. Teams often hide this mismatch by rotating secrets, changing signature code, or adding fallback hosts, which makes diagnosis harder and can mix operational records.&lt;/p&gt;

&lt;p&gt;The console assignment wins. Geographic proximity, browser locale, customer country, and deployment cloud region are not documented selectors. Endpoint labels also do not establish where all data is stored, replicated, backed up, or processed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach / architecture
&lt;/h2&gt;

&lt;p&gt;Bind each application credential set to one immutable regional configuration:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Config key&lt;/th&gt;
&lt;th&gt;Example value&lt;/th&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;IMOU_REGION&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;east_asia&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Controlled enum matching console assignment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;IMOU_BASE_URL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://openapi-sg.easy4ip.com:443/openapi&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Derived from reviewed mapping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;IMOU_APP_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Secret-backed reference&lt;/td&gt;
&lt;td&gt;Paired with one region&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;IMOU_APP_SECRET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Secret manager reference&lt;/td&gt;
&lt;td&gt;Backend only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SOURCE_REVIEWED_AT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Release metadata&lt;/td&gt;
&lt;td&gt;Triggers documentation review&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The application should reject unknown or incomplete region configuration at startup. It should never accept a base URL from a browser, customer request, device payload, or general-purpose redirect. If multiple Imou applications are legitimate, partition credentials, region, logs, quotas, and reconciliation jobs by application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current documented mapping
&lt;/h2&gt;

&lt;p&gt;The live &lt;a href="https://open.imoulife.com/book/en/http/develop.html" rel="noopener noreferrer"&gt;development specification&lt;/a&gt; lists:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data center label&lt;/th&gt;
&lt;th&gt;HTTPS POST pattern&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;East Asia Data Center&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://openapi-sg.easy4ip.com:443/openapi/[method]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Central Europe Data Center&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://openapi-fk.easy4ip.com:443/openapi/[method]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Western America Data Center&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://openapi-or.easy4ip.com:443/openapi/[method]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use the method name from the applicable interface documentation. Preserve HTTPS and the &lt;code&gt;/openapi/&lt;/code&gt; path. These are international Open Platform mappings; do not silently mix them with a different portal or China-region configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six configuration steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Identify the owning developer application.&lt;/strong&gt; Confirm the &lt;code&gt;appId&lt;/code&gt; used by this deployment and which team controls it. Avoid selecting region from a device or end-user profile.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read the console assignment.&lt;/strong&gt; Sign in to the corresponding account and open Control Board → Basic Information → My Information. Record the displayed data center as controlled deployment evidence.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Map assignment to the live documented host.&lt;/strong&gt; Use the current development specification, not a hostname copied from an old project or search result. Add an explicit enum rather than a free-form URL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pair region and credentials in secret-backed configuration.&lt;/strong&gt; Deploy them as one reviewed unit. Prevent one environment from loading an &lt;code&gt;appId&lt;/code&gt; from one region and a base URL from another.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Run a signed backend test.&lt;/strong&gt; Use the documented request envelope and signing procedure. Record request &lt;code&gt;id&lt;/code&gt;, selected region, method, and sanitized result; never log &lt;code&gt;appSecret&lt;/code&gt;, full tokens, or signing source strings containing secrets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Promote with drift checks.&lt;/strong&gt; Compare the deployed region enum, derived host, and credential reference across environments. Recheck the live mapping before publication and when onboarding another developer application.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  APIs / SDKs
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://open.imoulife.com/book/en/http/develop.html" rel="noopener noreferrer"&gt;HTTP development specification&lt;/a&gt; is canonical for regional hosts, request structure, response structure, and signature calculation. Each HTTPS request contains a &lt;code&gt;system&lt;/code&gt; block with protocol version, &lt;code&gt;appId&lt;/code&gt;, signature, time, and nonce, plus a unique non-empty request &lt;code&gt;id&lt;/code&gt; and method parameters.&lt;/p&gt;

&lt;p&gt;Regional configuration and signing should remain separate modules. The signer accepts a credential reference and request metadata; the transport accepts the region-derived base URL. This makes logs and tests show whether a failure arose before signing, during host selection, or in the method response.&lt;/p&gt;

&lt;p&gt;Use the official fixed signature test case from the live specification to verify the signing implementation. Do not place its example secret into production. Do not convert documentation time or nonce constraints into unrelated service latency or SLA claims.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting endpoint mismatches
&lt;/h2&gt;

&lt;p&gt;Check in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;international portal and owning account;&lt;/li&gt;
&lt;li&gt;console-assigned data center;&lt;/li&gt;
&lt;li&gt;deployed region enum and derived host;&lt;/li&gt;
&lt;li&gt;paired &lt;code&gt;appId&lt;/code&gt; and secret reference;&lt;/li&gt;
&lt;li&gt;exact &lt;code&gt;/openapi/[method]&lt;/code&gt; path;&lt;/li&gt;
&lt;li&gt;UTC request time, nonce, request ID, and signature implementation;&lt;/li&gt;
&lt;li&gt;method parameters and token authority.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keep the original sanitized result and request ID. Do not automatically retry against all regional hosts. A “first host that succeeds” strategy turns configuration mistakes into cross-region ambiguity and may conceal an incorrect credential inventory.&lt;/p&gt;

&lt;p&gt;When support receives a region-related incident, include environment, application reference, console assignment evidence, configured enum, hostname, method, UTC time, and redacted result. Exclude the secret, complete signature input, and reusable token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits &amp;amp; pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Do not select a regional endpoint from customer IP, browser locale, DNS latency, or device location.&lt;/li&gt;
&lt;li&gt;Do not implement automatic cross-region failover unless an official, approved architecture explicitly defines it.&lt;/li&gt;
&lt;li&gt;Do not mix international and China portal credentials or hosts.&lt;/li&gt;
&lt;li&gt;Do not infer data residency, replication, disaster recovery, compliance coverage, or SLA from &lt;code&gt;sg&lt;/code&gt;, &lt;code&gt;fk&lt;/code&gt;, or &lt;code&gt;or&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Do not expose base-URL choice as an end-user setting.&lt;/li&gt;
&lt;li&gt;Do not keep region independent from its credential set.&lt;/li&gt;
&lt;li&gt;Do not rotate credentials before ruling out a host mismatch.&lt;/li&gt;
&lt;li&gt;Do not log &lt;code&gt;AppSecret&lt;/code&gt;, administrator tokens, full signatures, or sensitive params.&lt;/li&gt;
&lt;li&gt;Do not claim that one successful API test proves all device and service capabilities.&lt;/li&gt;
&lt;li&gt;Recheck the console path and documented mapping before publication and every new rollout.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Treat endpoint configuration as reviewed infrastructure code. Changes should state old and new assignment, credential owner, source reviewed, validation method, and rollback. An endpoint edit is not a harmless URL change; it affects every signed API call made with that application identity.&lt;/p&gt;

&lt;p&gt;Inspect your application’s assigned data center at &lt;a href="https://open.imoulife.com/" rel="noopener noreferrer"&gt;Imou Open Platform&lt;/a&gt; and validate one signed backend call against the matching documented endpoint before enabling device workflows.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>camera</category>
    </item>
    <item>
      <title>Retention Design for Imou Cloud Snapshot vs Cloud Video Storage</title>
      <dc:creator>Imou-OpenPlatform</dc:creator>
      <pubDate>Tue, 01 Sep 2026 07:08:07 +0000</pubDate>
      <link>https://dev.to/imouopenplatform/retention-design-for-imou-cloud-snapshot-vs-cloud-video-storage-4kem</link>
      <guid>https://dev.to/imouopenplatform/retention-design-for-imou-cloud-snapshot-vs-cloud-video-storage-4kem</guid>
      <description>&lt;p&gt;Choose snapshots when one still image is sufficient for triage or event verification; choose video when the workflow must reconstruct sequence, motion, duration, or surrounding context. Imou’s cloud-record query distinguishes &lt;code&gt;cloudType: "snapshot"&lt;/code&gt; from &lt;code&gt;"video"&lt;/code&gt;. Make the decision per workflow and validate device and service availability. The API page does not establish public unit pricing, universal retention, or support for every channel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;Retention is a product decision disguised as a storage toggle. A snapshot may show that something was present but not how it arrived or what happened next. Video can provide context, but it also changes review, access, privacy, and deletion requirements. Defaulting every event to the richest medium can retain unnecessary material; defaulting to still images can leave investigators unable to answer the incident question.&lt;/p&gt;

&lt;p&gt;The correct comparison starts with evidence and users, not speculative cost. The cited technical page defines query behavior, not commercial terms. Pricing, package availability, and contractual retention must be confirmed through the applicable account and approved source.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach / architecture
&lt;/h2&gt;

&lt;p&gt;Separate four decisions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Decision&lt;/th&gt;
&lt;th&gt;Snapshot-oriented answer&lt;/th&gt;
&lt;th&gt;Video-oriented answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Evidence question&lt;/td&gt;
&lt;td&gt;“Was a visible condition present?”&lt;/td&gt;
&lt;td&gt;“What happened across time?”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review experience&lt;/td&gt;
&lt;td&gt;Fast visual triage&lt;/td&gt;
&lt;td&gt;Timeline or clip review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access surface&lt;/td&gt;
&lt;td&gt;Event card or verification queue&lt;/td&gt;
&lt;td&gt;Incident player and controlled export&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data governance&lt;/td&gt;
&lt;td&gt;Still-image policy&lt;/td&gt;
&lt;td&gt;Video policy with broader contextual content&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then keep the media path behind the same authorization boundary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;event or incident request
  -&amp;gt; product tenant/role check
  -&amp;gt; device and channel scope
  -&amp;gt; choose evidence type for workflow
  -&amp;gt; getCloudRecords(cloudType = snapshot | video)
  -&amp;gt; authorized review experience
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is architecture guidance. It does not imply that one event has both formats, that one service includes another, or that all devices support both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six design and implementation steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write the decision the user must make.&lt;/strong&gt; “Confirm a person appeared” may fit a still; “understand entry, action, and exit” generally needs a temporal record. Avoid vague requirements such as “keep evidence.”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Map the reviewer journey.&lt;/strong&gt; Identify who can view media, which device/channel they may access, whether they need only triage or deeper investigation, and what action follows. Define a deliberate missing-media state.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Confirm actual service and device support.&lt;/strong&gt; Test the target account, region, device, channel, and subscribed service. A method in the documentation is not proof that records exist for every deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Query through a trusted authorization layer.&lt;/strong&gt; Validate the product user and resource before calling the API. If a sub-account token is used, confirm the current method’s minimum permission and resource form. Keep administrator credentials off clients.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Select the documented media type.&lt;/strong&gt; Call &lt;a href="https://open.imoulife.com/book/en/http/device/record/cloud/getCloudRecords.html" rel="noopener noreferrer"&gt;&lt;code&gt;getCloudRecords&lt;/code&gt;&lt;/a&gt; with the required device, channel, time window, count, and applicable token. Use &lt;code&gt;cloudType&lt;/code&gt; value &lt;code&gt;snapshot&lt;/code&gt; or &lt;code&gt;video&lt;/code&gt;; current documentation identifies video as the default.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Validate evidence and governance together.&lt;/strong&gt; Run realistic review scenarios, permission denial, missing records, device offline conditions, user offboarding, and deletion/retention procedures. Record observed behavior without turning it into a universal platform guarantee.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  APIs / SDKs
&lt;/h2&gt;

&lt;p&gt;The canonical &lt;a href="https://open.imoulife.com/book/en/http/device/record/cloud/getCloudRecords.html" rel="noopener noreferrer"&gt;&lt;code&gt;getCloudRecords&lt;/code&gt;&lt;/a&gt; page defines cloud-record retrieval and the &lt;code&gt;cloudType&lt;/code&gt; selector. Use its live parameter and return-field tables rather than copying a stale sample into production.&lt;/p&gt;

&lt;p&gt;Related official pages include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/device/record/cloud/queryCloudRecords.html" rel="noopener noreferrer"&gt;&lt;code&gt;queryCloudRecords&lt;/code&gt;&lt;/a&gt;, an additional cloud-record query path with its documented ordering;&lt;/li&gt;
&lt;li&gt;the &lt;a href="https://open.imoulife.com/book/en/http/cloud/summary.html" rel="noopener noreferrer"&gt;cloud storage interface summary&lt;/a&gt;, which maps service-management methods;&lt;/li&gt;
&lt;li&gt;the &lt;a href="https://open.imoulife.com/book/en/http/account/summary.html" rel="noopener noreferrer"&gt;account docking summary&lt;/a&gt; for administrator and sub-account design; and&lt;/li&gt;
&lt;li&gt;the &lt;a href="https://open.imoulife.com/" rel="noopener noreferrer"&gt;Imou Open Platform homepage&lt;/a&gt; for the distinction between Cloud Video Storage and Cloud Snapshot Storage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not confuse &lt;code&gt;cloudType&lt;/code&gt; with a returned recording &lt;code&gt;type&lt;/code&gt;. The former selects snapshot or video media for the query; recording-type fields classify records according to that interface’s documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mixed retention can be intentional
&lt;/h2&gt;

&lt;p&gt;A single product can use different evidence depth by workflow. A high-volume operations queue may show available snapshots for rapid triage. A confirmed incident can open available video for authorized reviewers. Another site may disable retained media for policy reasons. These are product choices conditioned on actual service availability.&lt;/p&gt;

&lt;p&gt;Keep the event record independent from media. The event should retain its useful type, device/channel, time, and workflow state even when no snapshot or video is returned. This avoids turning temporary media unavailability into a lost event.&lt;/p&gt;

&lt;p&gt;Use separate access logs for sensitive media. Record who requested which channel and time window, the product authorization decision, and the redacted platform result. Do not log reusable media addresses or credentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retention review questions
&lt;/h2&gt;

&lt;p&gt;Before rollout, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the selected format answer the documented operational question?&lt;/li&gt;
&lt;li&gt;Can the interface render a useful event when media is absent?&lt;/li&gt;
&lt;li&gt;Are viewers limited by tenant, role, site, device, and channel?&lt;/li&gt;
&lt;li&gt;Are exports more restricted than ordinary viewing where appropriate?&lt;/li&gt;
&lt;li&gt;Are storage availability and service state checked rather than assumed?&lt;/li&gt;
&lt;li&gt;Is deletion or expiration behavior understood from approved commercial and legal sources?&lt;/li&gt;
&lt;li&gt;Does the support process avoid copying media into tickets and chat?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are governance prompts, not statements about Imou service terms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits &amp;amp; pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Do not publish unit prices, savings percentages, “free” entitlements, or package comparisons from the API page.&lt;/li&gt;
&lt;li&gt;Do not claim a universal retention duration, unlimited availability, SLA, or data residency.&lt;/li&gt;
&lt;li&gt;Do not assume every alarm has a snapshot or a corresponding video clip.&lt;/li&gt;
&lt;li&gt;Do not treat one still as complete temporal context.&lt;/li&gt;
&lt;li&gt;Do not treat a returned clip as proof that the entire incident window is covered.&lt;/li&gt;
&lt;li&gt;Do not infer support from another model, account, region, or channel.&lt;/li&gt;
&lt;li&gt;Do not mix &lt;code&gt;cloudType&lt;/code&gt; with recording classification fields.&lt;/li&gt;
&lt;li&gt;Do not send administrator tokens, signed media URLs, or sensitive record details to unauthorized clients.&lt;/li&gt;
&lt;li&gt;Do not let storage selection replace consent, privacy, legal, and access review.&lt;/li&gt;
&lt;li&gt;Recheck current parameter limits, ordering, permissions, and service documentation before publication.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A good decision record names the workflow, evidence question, chosen format, tested device/channel, required service, authorized roles, missing-media behavior, and the official source reviewed. It clearly labels pricing and contractual retention as unresolved until confirmed outside the technical API page.&lt;/p&gt;

&lt;p&gt;Review the live &lt;a href="https://open.imoulife.com/book/en/http/device/record/cloud/getCloudRecords.html" rel="noopener noreferrer"&gt;&lt;code&gt;getCloudRecords&lt;/code&gt;&lt;/a&gt; contract and test both evidence workflows with your authorized target devices before setting a retention policy.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>camera</category>
    </item>
    <item>
      <title>Classify Imou HTTP Interfaces by Administrator vs Sub-Account Token</title>
      <dc:creator>Imou-OpenPlatform</dc:creator>
      <pubDate>Tue, 01 Sep 2026 07:07:30 +0000</pubDate>
      <link>https://dev.to/imouopenplatform/classify-imou-http-interfaces-by-administrator-vs-sub-account-token-l2f</link>
      <guid>https://dev.to/imouopenplatform/classify-imou-http-interfaces-by-administrator-vs-sub-account-token-l2f</guid>
      <description>&lt;p&gt;Classify token authority per interface, not by the shared parameter name &lt;code&gt;token&lt;/code&gt;. Current Imou pages require an administrator &lt;code&gt;accessToken&lt;/code&gt; for control-plane work such as issuing sub-account tokens, changing policies, binding devices, configuring callbacks, and managing live addresses. Some device-facing queries accept administrator or sub-account tokens when the sub-account has the documented permission. The target interface page is always the final authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;Using an administrator token for every request makes development look easy but collapses isolation. A user-facing defect or leaked credential can then reach account-wide controls. The reverse shortcut also fails: a sub-account token cannot be assumed to call administrative interfaces simply because they accept a field named &lt;code&gt;token&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Imou account permissions are one layer. Your product must still authenticate the user, establish tenant and role membership, map the requested device or channel to that tenant, and decide whether the action is allowed. Only then should it select the narrowest platform credential accepted by the method.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach / architecture
&lt;/h2&gt;

&lt;p&gt;Separate two backend paths:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Typical caller&lt;/th&gt;
&lt;th&gt;Credential&lt;/th&gt;
&lt;th&gt;Responsibilities&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Control plane&lt;/td&gt;
&lt;td&gt;Restricted service or approved operator&lt;/td&gt;
&lt;td&gt;Administrator &lt;code&gt;accessToken&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Sub-accounts, policies, binding, callbacks, service/live administration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User operation plane&lt;/td&gt;
&lt;td&gt;Authenticated product workflow&lt;/td&gt;
&lt;td&gt;Sub-account token where accepted&lt;/td&gt;
&lt;td&gt;Permitted device/channel action&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Keep both credentials server-side unless a documented client flow specifically requires otherwise. A sub-account token is still sensitive. Its reduced impact depends on correct policies and resource scope, not on its prefix or storage location.&lt;/p&gt;

&lt;p&gt;Create a machine-readable interface register with: method, source URL, accepted token types, minimum sub-account permission, resource form, owner service, and last review date. Reject calls for which authority is unknown rather than falling back to administrator.&lt;/p&gt;

&lt;h2&gt;
  
  
  A documentation-bounded classification
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Interface or family&lt;/th&gt;
&lt;th&gt;Current documented token rule&lt;/th&gt;
&lt;th&gt;Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;accessToken&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Application credentials obtain administrator token&lt;/td&gt;
&lt;td&gt;Bootstrap backend authority&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;subAccountToken&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Administrator token plus &lt;code&gt;openid&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Issue a sub-account token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Account administration (&lt;code&gt;createSubAccount&lt;/code&gt;, &lt;code&gt;deleteSubAccount&lt;/code&gt;, &lt;code&gt;addPolicy&lt;/code&gt;, &lt;code&gt;clearPolicy&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Administrator control-plane flow; verify each page&lt;/td&gt;
&lt;td&gt;Identity and permission lifecycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bindDevice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Administrator token&lt;/td&gt;
&lt;td&gt;Bind device to account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;setMessageCallback&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Administrator token&lt;/td&gt;
&lt;td&gt;Configure callback subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;liveList&lt;/code&gt;, &lt;code&gt;queryLiveStatus&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Administrator token on current pages&lt;/td&gt;
&lt;td&gt;Inventory and inspect live addresses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;getAlarmMessage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Administrator or sub-account token; current page documents minimum sub-account permission&lt;/td&gt;
&lt;td&gt;User-scoped alarm query when authorized&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;listDeviceDetailsByIds&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Administrator or sub-account token on current page&lt;/td&gt;
&lt;td&gt;Device detail query within allowed scope&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is an implementation starting point, not a complete permanent matrix. Review every method you use. Similar-looking methods can have different authority requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seven implementation steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inventory actual calls.&lt;/strong&gt; Extract every OpenAPI method used by backend routes, workers, scheduled jobs, and support tools. Do not classify a broad module while missing one write method.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open each live method page.&lt;/strong&gt; Record whether the parameter accepts administrator only or administrator/sub-account. Where documented, capture minimum permission and whether the resource is device- or channel-scoped.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Map product identities.&lt;/strong&gt; Associate each application user or service role with the intended Imou sub-account &lt;code&gt;openid&lt;/code&gt; where that model applies. Never share one user’s cached token with another.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Grant least privilege.&lt;/strong&gt; Use only documented policy names and exact &lt;code&gt;dev:&lt;/code&gt; or &lt;code&gt;cam:&lt;/code&gt; resource forms applicable to the operation. Keep policy creation and removal in the administrator control plane.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build an explicit credential selector.&lt;/strong&gt; The caller supplies an operation identifier and authorized application identity; the selector looks up the reviewed rule. It must not choose administrator merely because a sub-account call failed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enforce product authorization first.&lt;/strong&gt; Validate tenant, site, role, device/channel mapping, and action. A platform permission should be a second gate rather than the only gate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test denial and offboarding.&lt;/strong&gt; Verify allowed calls, missing permission, wrong resource, deleted or cleared policy, user removal, and attempts to invoke administrator-only methods through a user route.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  APIs / SDKs
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://open.imoulife.com/book/en/http/account/summary.html" rel="noopener noreferrer"&gt;account docking summary&lt;/a&gt; lists sub-account creation, deletion, listing, token, policy, permission, and device-list interfaces. It is the canonical source for the account module’s scope.&lt;/p&gt;

&lt;p&gt;Important method pages include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/accessToken.html" rel="noopener noreferrer"&gt;&lt;code&gt;accessToken&lt;/code&gt;&lt;/a&gt;, which obtains the administrator token using application credentials;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/account/subAccountToken.html" rel="noopener noreferrer"&gt;&lt;code&gt;subAccountToken&lt;/code&gt;&lt;/a&gt;, which requires an administrator token and &lt;code&gt;openid&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/account/addPolicy.html" rel="noopener noreferrer"&gt;&lt;code&gt;addPolicy&lt;/code&gt;&lt;/a&gt;, an administrator-authorized policy write;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/device/manage/bind/bindDevice.html" rel="noopener noreferrer"&gt;&lt;code&gt;bindDevice&lt;/code&gt;&lt;/a&gt;, which requires administrator authority;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/push/setMessageCallback.html" rel="noopener noreferrer"&gt;&lt;code&gt;setMessageCallback&lt;/code&gt;&lt;/a&gt;, which requires administrator authority;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/device/live/queryLiveStatus.html" rel="noopener noreferrer"&gt;&lt;code&gt;queryLiveStatus&lt;/code&gt;&lt;/a&gt;, whose current page identifies administrator &lt;code&gt;accessToken&lt;/code&gt;; and&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/device/manage/query/listDeviceDetailsByIds.html" rel="noopener noreferrer"&gt;&lt;code&gt;listDeviceDetailsByIds&lt;/code&gt;&lt;/a&gt;, whose current page accepts administrator or sub-account token.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Method documentation can change. Store the source beside the rule and recheck it during release QA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Credential-selection pattern
&lt;/h2&gt;

&lt;p&gt;Avoid code such as “try sub-account; on authorization error retry as admin.” That converts a denied user operation into an elevated operation. Prefer a closed registry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rule = reviewedInterfaceRegistry[method]
authorizeProductUser(user, resource, action)
credential = credentialStore.get(rule.requiredAuthority, user)
callOpenApi(method, credential, validatedParams)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is architecture pseudocode, not an Imou SDK. Logs should contain method, request ID, region, rule version, and redacted resource—not the credential.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits &amp;amp; pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The parameter name &lt;code&gt;token&lt;/code&gt; does not identify token authority.&lt;/li&gt;
&lt;li&gt;Do not infer rules for an entire module from one method.&lt;/li&gt;
&lt;li&gt;Do not use administrator authority as an automatic fallback after a denied sub-account call.&lt;/li&gt;
&lt;li&gt;Do not assume every device query accepts a sub-account token; verify the specific page.&lt;/li&gt;
&lt;li&gt;Do not invent permission names or resource syntax.&lt;/li&gt;
&lt;li&gt;Do not treat a sub-account token as safe to log, embed, or reuse across identities.&lt;/li&gt;
&lt;li&gt;Do not place &lt;code&gt;AppSecret&lt;/code&gt; or administrator tokens in browsers, mobile apps, desktop logs, or public repositories.&lt;/li&gt;
&lt;li&gt;Do not treat Imou policies as a replacement for SaaS tenant authorization.&lt;/li&gt;
&lt;li&gt;Do not claim universal token lifetime, revocation timing, or propagation behavior without live documentation.&lt;/li&gt;
&lt;li&gt;Recheck all write methods and minimum permissions before publication and production release.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Review the register whenever a new endpoint is introduced. Security review should ask not only “is the token valid?” but “why is this authority required, which product identity requested it, and what resource has already been authorized?”&lt;/p&gt;

&lt;p&gt;Start with the live &lt;a href="https://open.imoulife.com/book/en/http/account/summary.html" rel="noopener noreferrer"&gt;Imou account docking documentation&lt;/a&gt;, then build a reviewed per-interface authority register before connecting user workflows.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>camera</category>
    </item>
    <item>
      <title>Recovering a Silent Imou Callback: HTTP 200, Reachability and Re-subscription</title>
      <dc:creator>Imou-OpenPlatform</dc:creator>
      <pubDate>Tue, 01 Sep 2026 07:06:51 +0000</pubDate>
      <link>https://dev.to/imouopenplatform/recovering-a-silent-imou-callback-http-200-reachability-and-re-subscription-3a3e</link>
      <guid>https://dev.to/imouopenplatform/recovering-a-silent-imou-callback-http-200-reachability-and-re-subscription-3a3e</guid>
      <description>&lt;p&gt;Start recovery at the callback ingress, not at the device. Imou’s push guide requires the receiver to return HTTP 200 and warns that pushes can stop after the service fails to return the response multiple times. Verify public reachability and exact response codes, read the saved callback configuration, correct and re-enable it if needed, then generate a supported test event. The documentation publishes no retry count.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;A silent callback can look like a device problem while every backend query remains healthy. It can also look like an Imou delivery problem when the request reached your edge but failed in parsing, a queue, or customer notification. Recovery becomes much faster when “delivery to ingress,” “acknowledgement,” “durable acceptance,” and “business processing” are separate observability stages.&lt;/p&gt;

&lt;p&gt;The documented platform behavior is narrow but important: use an internet-accessible callback address, and return HTTP 200. The number, spacing, and backoff of failed attempts are not specified. A runbook that invents them creates false confidence and can delay escalation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach / architecture
&lt;/h2&gt;

&lt;p&gt;Use a thin callback path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Imou Open Platform
  -&amp;gt; public HTTPS edge
  -&amp;gt; callback route
       -&amp;gt; bounded request checks
       -&amp;gt; durable enqueue
       -&amp;gt; HTTP 200
  -&amp;gt; asynchronous workers
       -&amp;gt; classify payload
       -&amp;gt; deduplicate
       -&amp;gt; retrieve optional media
       -&amp;gt; notify application users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This queue-first shape is application guidance, not a delivery guarantee from Imou. Its purpose is to remove slow or unreliable business work from the documented acknowledgement path.&lt;/p&gt;

&lt;p&gt;Maintain four signals:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Question answered&lt;/th&gt;
&lt;th&gt;Typical evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Edge requests&lt;/td&gt;
&lt;td&gt;Did any request reach public infrastructure?&lt;/td&gt;
&lt;td&gt;Load-balancer request record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP 200&lt;/td&gt;
&lt;td&gt;Did the callback satisfy the documented response?&lt;/td&gt;
&lt;td&gt;Route status and response completion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Durable acceptance&lt;/td&gt;
&lt;td&gt;Can the event survive worker failure?&lt;/td&gt;
&lt;td&gt;Queue/store acknowledgement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business completion&lt;/td&gt;
&lt;td&gt;Did the user-facing action finish?&lt;/td&gt;
&lt;td&gt;Worker and notification state&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Seven recovery steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Establish the last known good point.&lt;/strong&gt; Compare the last ingress request, last returned 200, last persisted event, and last delivered notification. This prevents a downstream outage from being mislabeled as stopped pushes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Probe from outside the private network.&lt;/strong&gt; Verify DNS, TLS certificate chain, firewall, load balancer, route, and application process through the same public hostname configured with Imou. A browser test can hide redirects or authentication middleware, so inspect the actual status.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Check exact callback responses.&lt;/strong&gt; The official guide says HTTP 200. Do not assume a redirect, 201, 202, 204, authentication challenge, gateway error, or timeout is equivalent. Review deployment changes that could add CSRF checks, login redirects, body limits, or synchronous processing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read platform configuration.&lt;/strong&gt; Call &lt;a href="https://open.imoulife.com/book/en/http/push/getMessageCallback.html" rel="noopener noreferrer"&gt;&lt;code&gt;getMessageCallback&lt;/code&gt;&lt;/a&gt; from a trusted backend. Compare returned &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;callbackUrl&lt;/code&gt;, and &lt;code&gt;callbackFlag&lt;/code&gt; with controlled configuration. Avoid relying on a screenshot or an old deployment variable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Correct or re-subscribe deliberately.&lt;/strong&gt; If configuration is wrong or delivery remains stopped after ingress health is restored, use &lt;a href="https://open.imoulife.com/book/en/http/push/setMessageCallback.html" rel="noopener noreferrer"&gt;&lt;code&gt;setMessageCallback&lt;/code&gt;&lt;/a&gt; with an administrator &lt;code&gt;accessToken&lt;/code&gt;, documented &lt;code&gt;status&lt;/code&gt;, callback URL, flags, and applicable &lt;code&gt;basePush&lt;/code&gt;. Record the authorized change; do not repeatedly toggle settings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Generate a supported test event.&lt;/strong&gt; Use a target device known to support an enabled event category. A quiet device, disabled detection, or unsupported event family does not test the transport.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verify end to end.&lt;/strong&gt; Confirm public receipt, HTTP 200, persistence, parsing, and final application action as separate checkpoints. Preserve UTC times, request identifiers, sanitized result codes, and the tested category for escalation.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  APIs / SDKs
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://open.imoulife.com/book/en/push/push.html" rel="noopener noreferrer"&gt;event message push process&lt;/a&gt; is the canonical behavior source. It says events can be pushed to the developer’s backend callback, requires the callback service to return 200, and warns that the platform can stop pushing after multiple missing responses.&lt;/p&gt;

&lt;p&gt;Use these documented interfaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/push/getMessageCallback.html" rel="noopener noreferrer"&gt;&lt;code&gt;getMessageCallback&lt;/code&gt;&lt;/a&gt; to inspect callback state, URL, and selected categories;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/push/setMessageCallback.html" rel="noopener noreferrer"&gt;&lt;code&gt;setMessageCallback&lt;/code&gt;&lt;/a&gt; to enable or disable subscription and set the internet-accessible callback;&lt;/li&gt;
&lt;li&gt;the &lt;a href="https://open.imoulife.com/book/en/push/event.html" rel="noopener noreferrer"&gt;event format definition&lt;/a&gt; to validate the payload family used for testing; and&lt;/li&gt;
&lt;li&gt;the &lt;a href="https://open.imoulife.com/book/en/push/alarm.html" rel="noopener noreferrer"&gt;event type definition&lt;/a&gt; to confirm documented event types.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Callback configuration is an administrator operation. Keep &lt;code&gt;AppSecret&lt;/code&gt; and administrator &lt;code&gt;accessToken&lt;/code&gt; in the backend. The public callback route should not expose those credentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prevention and change control
&lt;/h2&gt;

&lt;p&gt;Make callback health a deployment gate. Test the production hostname from an external probe, assert an exact 200 from the configured route, and verify a durable enqueue without invoking all business workers. Alert separately on non-200 responses, absence of ingress relative to known test activity, queue failures, unknown payload families, and notification errors.&lt;/p&gt;

&lt;p&gt;Keep intended callback configuration in reviewed server-side configuration. Periodically compare it with &lt;code&gt;getMessageCallback&lt;/code&gt;, especially after domain, certificate, proxy, or application migrations. Record who changed subscription state, which categories changed, how it was validated, and how to roll back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits &amp;amp; pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Do not state a retry count, retry interval, backoff algorithm, or automatic restoration time. The cited page provides none.&lt;/li&gt;
&lt;li&gt;Do not return a generic successful status other than 200 unless current documentation explicitly changes the requirement.&lt;/li&gt;
&lt;li&gt;Do not acknowledge only after image downloads, database joins, or customer webhooks complete.&lt;/li&gt;
&lt;li&gt;Do not assume no event means no delivery. Confirm device activity, enabled detection, category selection, and capability.&lt;/li&gt;
&lt;li&gt;Do not repeatedly re-subscribe before fixing public reachability; that does not repair a broken ingress.&lt;/li&gt;
&lt;li&gt;Do not let an unknown optional field make every callback fail. Preserve the bounded raw body and route parser failures for review.&lt;/li&gt;
&lt;li&gt;Do not expose tokens, signed image URLs, device identifiers, or full payloads in support tickets.&lt;/li&gt;
&lt;li&gt;Do not present queue design, idempotency, alert thresholds, or dead-letter behavior as Imou platform guarantees.&lt;/li&gt;
&lt;li&gt;Recheck live callback documentation before publishing the runbook.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If recovery still fails after a healthy 200 path and verified configuration, prepare a factual escalation: developer account region, callback category, UTC test time, last successful time, sanitized configuration, request evidence from the edge, and redacted OpenAPI result IDs. Avoid unsupported conclusions about platform retry state.&lt;/p&gt;

&lt;p&gt;Review the live &lt;a href="https://open.imoulife.com/book/en/push/push.html" rel="noopener noreferrer"&gt;Imou push process&lt;/a&gt;, then test your production callback as a small, observable ingress service before relying on downstream notifications.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>camera</category>
    </item>
    <item>
      <title>Read Imou Event Payloads Without Assuming Every Alarm Has a Picture</title>
      <dc:creator>Imou-OpenPlatform</dc:creator>
      <pubDate>Tue, 01 Sep 2026 07:06:17 +0000</pubDate>
      <link>https://dev.to/imouopenplatform/read-imou-event-payloads-without-assuming-every-alarm-has-a-picture-134f</link>
      <guid>https://dev.to/imouopenplatform/read-imou-event-payloads-without-assuming-every-alarm-has-a-picture-134f</guid>
      <description>&lt;p&gt;Do not make images a required field in a universal Imou event schema. The current event-format page shows &lt;code&gt;picUrlArray&lt;/code&gt; for specific face-detection and face-comparison payloads, while general alarms, online/offline events, accessories, statistics, heatmaps, and account/device lifecycle notifications use different shapes without that field. Route by documented &lt;code&gt;msgType&lt;/code&gt;, preserve the raw body, and process media only when the applicable payload actually contains it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;An image-first parser fails in two directions. If it rejects an event without &lt;code&gt;picUrlArray&lt;/code&gt;, valid status and alarm workflows disappear. If it assumes every URL is immediately displayable, the application may mishandle temporary references, encrypted media, or sensitive query strings. The safer abstraction is “event with optional evidence,” not “thumbnail with metadata.”&lt;/p&gt;

&lt;p&gt;The event reference is closer to a workbook of payload families than one JSON schema. Even device and channel identifiers vary: examples can use &lt;code&gt;did&lt;/code&gt;/&lt;code&gt;cid&lt;/code&gt;, &lt;code&gt;deviceId&lt;/code&gt;/&lt;code&gt;channelId&lt;/code&gt;, &lt;code&gt;msgDeviceId&lt;/code&gt;/&lt;code&gt;msgChannelId&lt;/code&gt;, or accessory identifiers. Normalize only after family-specific parsing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach / architecture
&lt;/h2&gt;

&lt;p&gt;Build a two-layer event model:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Stored data&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Raw envelope&lt;/td&gt;
&lt;td&gt;Bounded original body, receive time, request correlation&lt;/td&gt;
&lt;td&gt;Replay, audit, future adapters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Normalized event&lt;/td&gt;
&lt;td&gt;Internal event ID, family, device/channel references, type, occurred time, optional media references&lt;/td&gt;
&lt;td&gt;Product workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The receiver should durably enqueue the raw event and return the required HTTP 200. A classifier then selects a versioned adapter from &lt;code&gt;msgType&lt;/code&gt; and observed envelope. A separate media worker runs only when that adapter identifies a documented, populated image field. Business notifications should remain useful when media is absent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the current examples show
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Documented family&lt;/th&gt;
&lt;th&gt;Representative field&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;picUrlArray&lt;/code&gt; shown?&lt;/th&gt;
&lt;th&gt;Product treatment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;General device alarm&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;did&lt;/code&gt;, &lt;code&gt;cid&lt;/code&gt;, &lt;code&gt;msgType&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Accept without thumbnail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Device online/offline&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;did&lt;/code&gt;, &lt;code&gt;cid&lt;/code&gt;, &lt;code&gt;online&lt;/code&gt;/&lt;code&gt;offline&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Status transition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gateway accessory&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;deviceId&lt;/code&gt;, &lt;code&gt;accessoriesId&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Family-specific &lt;code&gt;desc&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Face detection&lt;/td&gt;
&lt;td&gt;&lt;code&gt;aiFaceDetect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Conditional image job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Face comparison&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;aiAFaceCompa&lt;/code&gt;, &lt;code&gt;aiSFaceCompa&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Parse exact comparison shape&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traffic statistics&lt;/td&gt;
&lt;td&gt;&lt;code&gt;detail&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Structured count data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heatmap&lt;/td&gt;
&lt;td&gt;&lt;code&gt;desc.heatData&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Structured heat data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sharing/binding/authorization&lt;/td&gt;
&lt;td&gt;lifecycle &lt;code&gt;msgType&lt;/code&gt; values&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Identity or inventory reconciliation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;“No” means the cited example does not define that image array. It is not a promise that no future or device-specific message could add optional fields. The current page and target event type must be checked during implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seven implementation steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Subscribe deliberately.&lt;/strong&gt; Configure &lt;a href="https://open.imoulife.com/book/en/http/push/setMessageCallback.html" rel="noopener noreferrer"&gt;&lt;code&gt;setMessageCallback&lt;/code&gt;&lt;/a&gt; with only the documented callback categories needed by the product. A selected category does not guarantee all devices generate every event.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Acknowledge at ingress.&lt;/strong&gt; Validate basic request constraints, write to durable storage or a queue, and return HTTP 200. Do not block acknowledgement on image download, customer notification, or a database join.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Preserve the original body.&lt;/strong&gt; Keep a bounded raw representation under access controls. This lets you repair an adapter without inventing what the sender provided.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Classify before validation.&lt;/strong&gt; Identify the documented family and &lt;code&gt;msgType&lt;/code&gt;, then apply that family’s required fields. Do not require &lt;code&gt;did&lt;/code&gt; and &lt;code&gt;deviceId&lt;/code&gt; simultaneously.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create optional media work.&lt;/strong&gt; Test that the exact documented field exists, is the expected type, and has usable values. If not, continue the image-free workflow and show a deliberate “image unavailable” state.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Handle media securely.&lt;/strong&gt; Retrieve applicable references promptly according to the live page, redact URL query material in logs, and use the official image-decryption component where required. Keep decryption material outside public clients and repositories.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reconcile and observe.&lt;/strong&gt; Track unknown &lt;code&gt;msgType&lt;/code&gt;, malformed family payloads, image retrieval outcomes, and downstream notifications separately. Unknown optional fields should not poison callback acknowledgement.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  APIs / SDKs
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://open.imoulife.com/book/en/push/event.html" rel="noopener noreferrer"&gt;event message format definition&lt;/a&gt; is canonical for the payload examples discussed here. It currently documents &lt;code&gt;picUrlArray&lt;/code&gt; in face-detection and face-comparison examples. Those examples also contain a note about image-data storage time; treat that note only in the context where it appears and require publication-day review before quoting any duration.&lt;/p&gt;

&lt;p&gt;Other useful sources are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;a href="https://open.imoulife.com/book/en/push/push.html" rel="noopener noreferrer"&gt;event push process&lt;/a&gt; for callback delivery and HTTP 200 acknowledgement;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/push/setMessageCallback.html" rel="noopener noreferrer"&gt;&lt;code&gt;setMessageCallback&lt;/code&gt;&lt;/a&gt; for subscription state and categories;&lt;/li&gt;
&lt;li&gt;the &lt;a href="https://open.imoulife.com/book/en/push/alarm.html" rel="noopener noreferrer"&gt;event type definition&lt;/a&gt; for documented &lt;code&gt;msgType&lt;/code&gt; values;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/device/alarm/getAlarmMessage.html" rel="noopener noreferrer"&gt;&lt;code&gt;getAlarmMessage&lt;/code&gt;&lt;/a&gt; for a separate query response that may contain &lt;code&gt;picurlArray&lt;/code&gt; and &lt;code&gt;thumbUrl&lt;/code&gt;; and&lt;/li&gt;
&lt;li&gt;the &lt;a href="https://open.imoulife.com/book/en/readme/upload.html" rel="noopener noreferrer"&gt;resource download page&lt;/a&gt; for official image-decryption resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice the casing difference: face callbacks show &lt;code&gt;picUrlArray&lt;/code&gt;; &lt;code&gt;getAlarmMessage&lt;/code&gt; documents &lt;code&gt;picurlArray&lt;/code&gt;. Do not lower-case or rename fields before selecting the source-specific adapter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contract design for downstream teams
&lt;/h2&gt;

&lt;p&gt;Expose a normalized &lt;code&gt;media&lt;/code&gt; collection as optional, and record provenance such as callback field, queried alarm record, or another documented source. Consumers should render event type, time, device, and channel without media. A thumbnail can enhance a card but must not determine whether the event exists.&lt;/p&gt;

&lt;p&gt;Version the normalized contract independently from raw Imou payloads. When documentation or observed supported payloads evolve, add an adapter and fixture. Avoid changing historical raw events or silently interpreting an absent field as an empty picture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits &amp;amp; pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No current source cited here promises that every alarm includes a picture.&lt;/li&gt;
&lt;li&gt;A missing image is not proof of callback failure; it may be valid for the message family.&lt;/li&gt;
&lt;li&gt;A push payload and an alarm-query response are different contracts, even if both concern one incident.&lt;/li&gt;
&lt;li&gt;Do not promise one-to-one reconciliation between every callback and queried media unless your tested workflow proves it.&lt;/li&gt;
&lt;li&gt;Do not log full image URLs, tokens, device credentials, or unredacted payloads.&lt;/li&gt;
&lt;li&gt;Do not assume an image-like URL returns a browser-ready JPEG; follow official decryption guidance.&lt;/li&gt;
&lt;li&gt;Do not infer support for face events, statistics, or heatmaps across all devices.&lt;/li&gt;
&lt;li&gt;Do not quote image availability or retention timing without checking the live source on publication day.&lt;/li&gt;
&lt;li&gt;Keep parser retries and dead-letter policy as your own operational design, not an Imou guarantee.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use fixtures copied from sanitized, authorized test traffic and from current documentation. For each adapter, test the expected shape, missing optional media, additional unknown fields, malformed media arrays, and an image worker failure. The callback receiver should still satisfy its acknowledgement path.&lt;/p&gt;

&lt;p&gt;Use the live &lt;a href="https://open.imoulife.com/book/en/push/event.html" rel="noopener noreferrer"&gt;Imou event format reference&lt;/a&gt; to build family-specific fixtures, then validate image handling with the exact devices and services in your product.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>camera</category>
    </item>
    <item>
      <title>SDK-Assisted Binding: When HTTP bindDevice Is Not Enough</title>
      <dc:creator>Imou-OpenPlatform</dc:creator>
      <pubDate>Tue, 01 Sep 2026 07:05:46 +0000</pubDate>
      <link>https://dev.to/imouopenplatform/sdk-assisted-binding-when-http-binddevice-is-not-enough-4ecg</link>
      <guid>https://dev.to/imouopenplatform/sdk-assisted-binding-when-http-binddevice-is-not-enough-4ecg</guid>
      <description>&lt;p&gt;HTTP &lt;code&gt;bindDevice&lt;/code&gt; is not a universal onboarding shortcut. Imou’s mobile application guide says some newer devices, and older devices upgraded to newer software, may require client OpenSDK participation to complete binding. Treat onboarding as a version-dependent state machine: discover the device state, complete required local configuration or initialization through the current SDK demo, use backend binding where applicable, and verify the final account association.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;A failed binding request is often handled as a networking problem: retry the request, rotate the token, or ask the user to scan the label again. That response misses a structural issue. Network configuration, device initialization, platform reachability, verification, and account binding are separate states. A correct HTTP request cannot replace a required local SDK stage.&lt;/p&gt;

&lt;p&gt;This is also a security boundary. The backend has application credentials and can make signed OpenAPI calls. The mobile client can interact with a device on the local network and follow SDK workflows. Moving &lt;code&gt;AppSecret&lt;/code&gt; or an administrator token into the app to “simplify” binding weakens the system without making an incompatible flow compatible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach / architecture
&lt;/h2&gt;

&lt;p&gt;Use a resumable onboarding coordinator rather than one “Add camera” request:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;th&gt;Evidence to retain&lt;/th&gt;
&lt;th&gt;Never retain&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Device identified&lt;/td&gt;
&lt;td&gt;Client/backend&lt;/td&gt;
&lt;td&gt;Redacted serial reference, scan result&lt;/td&gt;
&lt;td&gt;Public full labels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access mode discovered&lt;/td&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;Supported configuration path&lt;/td&gt;
&lt;td&gt;Guessed model rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network configured&lt;/td&gt;
&lt;td&gt;Client OpenSDK&lt;/td&gt;
&lt;td&gt;Completion state and sanitized error&lt;/td&gt;
&lt;td&gt;Wi-Fi credentials in analytics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Initialized if required&lt;/td&gt;
&lt;td&gt;Client OpenSDK&lt;/td&gt;
&lt;td&gt;SDK stage and version&lt;/td&gt;
&lt;td&gt;Device password in logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Binding branch selected&lt;/td&gt;
&lt;td&gt;Coordinator&lt;/td&gt;
&lt;td&gt;Why SDK or HTTP path was chosen&lt;/td&gt;
&lt;td&gt;A universal “new device” flag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Account bound&lt;/td&gt;
&lt;td&gt;Backend/platform&lt;/td&gt;
&lt;td&gt;Account-device relationship&lt;/td&gt;
&lt;td&gt;Administrator token in client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inventory verified&lt;/td&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Device/channel record&lt;/td&gt;
&lt;td&gt;Unverified success from UI alone&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The official &lt;a href="https://open.imoulife.com/book/en/mobile/summary.html" rel="noopener noreferrer"&gt;mobile application guide&lt;/a&gt; is explicit that binding processes vary by device version and directs developers to the client SDK demo. Therefore, code should model branches and durable progress, not hard-code one imagined SDK method.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six steps for an SDK-assisted flow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Capture the first failure accurately.&lt;/strong&gt; Save the OpenAPI method, response &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;result.code&lt;/code&gt;, &lt;code&gt;result.msg&lt;/code&gt;, account region, application version, and SDK version. Redact tokens and verification material. Do not immediately classify the cause as a security upgrade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inspect the unbound-device state.&lt;/strong&gt; Use the documented device query path, such as &lt;a href="https://open.imoulife.com/book/en/http/device/manage/query/unBindDeviceInfo.html" rel="noopener noreferrer"&gt;&lt;code&gt;unBindDeviceInfo&lt;/code&gt;&lt;/a&gt;, to learn what the platform reports about support, status, binding state, configuration mode, and capabilities. Treat returned data as evidence for this device only.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complete local prerequisites.&lt;/strong&gt; Follow the current Android or iOS OpenSDK demo for the detected configuration path. Network configuration and initialization may require direct client-device interaction. Keep sensitive inputs in the narrowest possible scope and clear them after use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Choose the binding branch from documented state.&lt;/strong&gt; The mobile guide says SDK assistance may be needed; it does not say every new device rejects HTTP binding. If the current SDK workflow completes the relevant binding stage, record that result. If it hands off to backend HTTP binding, continue there.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Call &lt;code&gt;bindDevice&lt;/code&gt; only with documented inputs.&lt;/strong&gt; The live &lt;a href="https://open.imoulife.com/book/en/http/device/manage/bind/bindDevice.html" rel="noopener noreferrer"&gt;&lt;code&gt;bindDevice&lt;/code&gt;&lt;/a&gt; page requires an administrator &lt;code&gt;accessToken&lt;/code&gt;. Its &lt;code&gt;code&lt;/code&gt; meaning depends on device capability and state; &lt;code&gt;encryptCode&lt;/code&gt; is an optional documented alternative. Do not copy a credential rule from another model.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verify and reconcile.&lt;/strong&gt; Query the intended account’s device inventory, persist device and channel identifiers, and mark onboarding complete only after the backend observes the association. Make repeated client submissions idempotent in your own coordinator.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  APIs / SDKs
&lt;/h2&gt;

&lt;p&gt;The central source is the &lt;a href="https://open.imoulife.com/book/en/mobile/summary.html" rel="noopener noreferrer"&gt;application development guide&lt;/a&gt;. It assigns network configuration, initialization, audio/video playback, and picture decryption to client SDK workflows, while recommending backend HTTP APIs for account and device binding/unbinding, management, operations, cloud storage, and alarms. Its binding section adds the important exception: security-upgraded devices may need the client SDK in the binding process.&lt;/p&gt;

&lt;p&gt;Supporting interfaces include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/device/manage/query/unBindDeviceInfo.html" rel="noopener noreferrer"&gt;&lt;code&gt;unBindDeviceInfo&lt;/code&gt;&lt;/a&gt; for pre-binding device information;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.imoulife.com/book/en/http/device/manage/bind/bindDevice.html" rel="noopener noreferrer"&gt;&lt;code&gt;bindDevice&lt;/code&gt;&lt;/a&gt; for administrator-authorized HTTP binding where applicable;&lt;/li&gt;
&lt;li&gt;device query interfaces for confirming the post-binding inventory; and&lt;/li&gt;
&lt;li&gt;current Android/iOS OpenSDK packages and demos for local configuration, initialization, and binding branches.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use the demo as executable guidance for the installed SDK version. Pseudocode should remain intentionally generic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;state = backend.inspectUnboundDevice(deviceRef)
clientOutcome = client.followCurrentOpenSdkDemo(state)
if clientOutcome.requiresBackendBind:
    backend.bindDevice(clientOutcome.secureCredentialReference)
backend.verifyAccountInventory(deviceRef)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This describes responsibility flow, not real OpenSDK method names.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operational testing
&lt;/h2&gt;

&lt;p&gt;Build a test matrix around combinations you actually support: factory-state and previously initialized devices; supported provisioning modes; online and offline starts; app termination between stages; device already bound elsewhere; incorrect verification input; and a successful resume after interruption. Record the software and SDK versions for every result.&lt;/p&gt;

&lt;p&gt;The objective is not to derive a universal model table from a few samples. It is to prove that your coordinator can identify the next safe action, avoid replaying completed sensitive stages, and give support staff enough sanitized evidence to distinguish local configuration, initialization, authorization, and account-binding failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits &amp;amp; pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;“May need SDK-assisted binding” does not mean “all new devices must use SDK binding.”&lt;/li&gt;
&lt;li&gt;An HTTP error alone does not prove a security-version mismatch. Check region, signature, token, parameters, existing binding, reachability, and device state.&lt;/li&gt;
&lt;li&gt;Do not retry indefinitely. Imou’s guide does not publish a binding retry schedule; define application policy from your own tests.&lt;/li&gt;
&lt;li&gt;Do not put &lt;code&gt;AppSecret&lt;/code&gt; or administrator &lt;code&gt;accessToken&lt;/code&gt; in a mobile app, browser bundle, crash report, or support screenshot.&lt;/li&gt;
&lt;li&gt;Do not log Wi-Fi passwords, device passwords, security codes, &lt;code&gt;encryptCode&lt;/code&gt;, or complete signed requests.&lt;/li&gt;
&lt;li&gt;Do not invent SDK calls from architecture diagrams. Use the current package documentation and demo.&lt;/li&gt;
&lt;li&gt;Do not promise support for every device, firmware, configuration mode, or region.&lt;/li&gt;
&lt;li&gt;Revalidate the full flow whenever the SDK, mobile OS, device software, or backend interface changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful support bundle contains the last completed state, current SDK and app versions, account region, sanitized platform response, device-reported model/software information where available, and whether the physical device was bound before. It excludes all reusable credentials.&lt;/p&gt;

&lt;p&gt;Review the live &lt;a href="https://open.imoulife.com/book/en/mobile/summary.html" rel="noopener noreferrer"&gt;Imou mobile application guide&lt;/a&gt; and current OpenSDK demo, then prove each supported binding branch with the devices you plan to deploy.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>camera</category>
    </item>
    <item>
      <title>What Developers Can Build with Imou Open Platform Besides Live Video</title>
      <dc:creator>Imou-OpenPlatform</dc:creator>
      <pubDate>Tue, 01 Sep 2026 07:05:11 +0000</pubDate>
      <link>https://dev.to/imouopenplatform/what-developers-can-build-with-imou-open-platform-besides-live-video-2014</link>
      <guid>https://dev.to/imouopenplatform/what-developers-can-build-with-imou-open-platform-besides-live-video-2014</guid>
      <description>&lt;p&gt;Beyond live video, Imou Open Platform exposes building blocks for device access and management, event callbacks, recorded-video playback, cloud video or snapshot storage, client applications, Home Assistant integration, and SaaS-oriented fleet and permission workflows. Treat these as separate capabilities: the combination available to a product depends on the target device, firmware, account region, client surface, and subscribed services.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;“Show a camera stream” is an easy prototype goal, but it is rarely a complete product requirement. A deployed application must also bring devices online, associate them with the right account, decide which user may control which channel, receive events, retain useful evidence, and remove access when a user leaves. Starting from the stream tends to push these decisions into ad hoc code.&lt;/p&gt;

&lt;p&gt;The Imou homepage is more useful as a capability map than as a list of promises. It groups the platform into Device Access, Video Security, Value-Added Services, App Development, Integrating Home Assistant, and SaaS Application. Those groups suggest workstreams, but each method and field still has to be verified in the current documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach / architecture
&lt;/h2&gt;

&lt;p&gt;Model the product as a set of independently testable planes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plane&lt;/th&gt;
&lt;th&gt;Product responsibility&lt;/th&gt;
&lt;th&gt;Imou building blocks&lt;/th&gt;
&lt;th&gt;Boundary to verify&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Onboarding&lt;/td&gt;
&lt;td&gt;Put an intended device under an intended account&lt;/td&gt;
&lt;td&gt;Network configuration, initialization, binding&lt;/td&gt;
&lt;td&gt;Device generation and supported flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inventory&lt;/td&gt;
&lt;td&gt;Know devices, channels, state, and capabilities&lt;/td&gt;
&lt;td&gt;Device query and management APIs&lt;/td&gt;
&lt;td&gt;Returned capabilities, not model assumptions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authorization&lt;/td&gt;
&lt;td&gt;Limit who can reach each resource&lt;/td&gt;
&lt;td&gt;Administrator and sub-account model, policies&lt;/td&gt;
&lt;td&gt;Per-interface token and permission rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Events&lt;/td&gt;
&lt;td&gt;Turn device activity into application workflow&lt;/td&gt;
&lt;td&gt;Message callback and event formats&lt;/td&gt;
&lt;td&gt;Selected categories and payload family&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence&lt;/td&gt;
&lt;td&gt;Preserve useful context&lt;/td&gt;
&lt;td&gt;Cloud snapshot or cloud video storage&lt;/td&gt;
&lt;td&gt;Service entitlement and media availability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client experience&lt;/td&gt;
&lt;td&gt;Preview, playback, talk, or device interaction&lt;/td&gt;
&lt;td&gt;Mobile/PC OpenSDK and web components&lt;/td&gt;
&lt;td&gt;Client-specific documented functions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operations&lt;/td&gt;
&lt;td&gt;Support fleets and business users&lt;/td&gt;
&lt;td&gt;Backend APIs and SaaS-oriented management&lt;/td&gt;
&lt;td&gt;Your tenant, audit, and offboarding controls&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The trusted backend should own &lt;code&gt;AppSecret&lt;/code&gt;, signed OpenAPI requests, administrator credentials, tenant authorization, and callback ingestion. Client SDKs should own only the local or media jobs documented for that client. A browser, mobile app, or desktop client is not a substitute for the backend control plane.&lt;/p&gt;

&lt;p&gt;This split is architecture guidance. The homepage describes product areas; it does not prescribe your database, queue, identity provider, or deployment model.&lt;/p&gt;

&lt;h2&gt;
  
  
  A six-step capability discovery process
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write one operational journey.&lt;/strong&gt; Replace “integrate cameras” with a verifiable flow such as “an installer adds a supported device, an operator receives an event, and an authorized reviewer opens the available evidence.”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Choose the device-access path.&lt;/strong&gt; The homepage presents Imou product access, OEM finished products, zero-code development, and network modules. Confirm the commercial and technical route before assuming all hardware enters through the same flow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inventory device and channel capabilities.&lt;/strong&gt; Query the target device instead of publishing a universal feature list. Preview, playback, talk, PTZ, event types, and storage can vary. Preserve device IDs and channel IDs as distinct resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Design identities before controls.&lt;/strong&gt; Keep administrative jobs in a restricted control plane. Where an interface accepts a sub-account token, grant only the documented resource and permission needed by that application user. Your own tenant and role check must run first.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Add events and evidence separately.&lt;/strong&gt; Configure the callback categories the product needs, return the documented HTTP 200 from a durable ingress path, and parse payloads by &lt;code&gt;msgType&lt;/code&gt;. Then decide whether a snapshot, video, or no media is appropriate. An event does not guarantee an image.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Select and test the client surface.&lt;/strong&gt; Evaluate mobile OpenSDK, PC OpenSDK, browser components, cloud live, or Home Assistant against the exact workflow. Test normal operation, offline devices, revoked access, missing media, and offboarding before expanding the fleet.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  APIs / SDKs
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://open.imoulife.com/" rel="noopener noreferrer"&gt;Imou Open Platform homepage&lt;/a&gt; is the canonical source for the capability groups in this article. For implementation, move from that map to the current documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;a href="https://open.imoulife.com/book/en/mobile/summary.html" rel="noopener noreferrer"&gt;mobile application guide&lt;/a&gt; separates SDK-oriented work such as network configuration, initialization, playback, and picture decryption from backend HTTP work such as account and device management, storage management, and alarm management.&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://open.imoulife.com/book/en/http/develop.html" rel="noopener noreferrer"&gt;HTTP development specification&lt;/a&gt; defines regional API endpoints, request envelopes, and signing.&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://open.imoulife.com/book/en/push/push.html" rel="noopener noreferrer"&gt;event push guide&lt;/a&gt; defines callback setup and the HTTP 200 acknowledgement requirement.&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://open.imoulife.com/book/en/push/event.html" rel="noopener noreferrer"&gt;event format reference&lt;/a&gt; shows that different message families have different envelopes and media fields.&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://open.imoulife.com/book/pc/summary.html" rel="noopener noreferrer"&gt;PC application guide&lt;/a&gt; describes a desktop OpenSDK media path backed by server-side token and device-list work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These references establish responsibilities, not universal compatibility. Verify each desired method on its own page and with the actual deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical product map
&lt;/h2&gt;

&lt;p&gt;A home-security application may combine binding, device inventory, event callbacks, playback, and optional storage. A retail operations product may emphasize fleet grouping, permissions, event triage, and retained evidence. A smart-home integration may expose selected entities and operations while leaving account administration in the backend. A desktop monitoring station may use PC OpenSDK for media interaction while the backend handles accounts and devices.&lt;/p&gt;

&lt;p&gt;The important pattern is composition. “Imou supports cloud storage” does not prove that a given channel has an active storage service. “App Development” does not mean one SDK supports every client environment. “AIoT” does not establish a public AI endpoint or a result for every alarm. Record each dependency beside the feature that needs it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits &amp;amp; pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Do not turn homepage examples into a model-by-model support matrix.&lt;/li&gt;
&lt;li&gt;Do not expose &lt;code&gt;AppSecret&lt;/code&gt;, administrator tokens, sub-account tokens, live addresses, or signed media URLs in public code or logs.&lt;/li&gt;
&lt;li&gt;Do not assume every callback carries an image or every device emits every documented event.&lt;/li&gt;
&lt;li&gt;Do not treat platform permissions as your product’s tenant authorization. Both boundaries are required.&lt;/li&gt;
&lt;li&gt;Do not infer pricing, SLA, data residency, storage duration, or entitlement from a product label.&lt;/li&gt;
&lt;li&gt;Do not invent AI endpoints or promise AI output for unsupported devices or services.&lt;/li&gt;
&lt;li&gt;Do not select a regional API hostname from the end user’s location; use the data center assigned to the developer account.&lt;/li&gt;
&lt;li&gt;Recheck live documentation before implementation and publication because methods, packages, and client components can evolve.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maintain a capability register for the pilot: desired user outcome, official source, device/channel tested, required service, client surface, observed result, and fallback state. That register turns a broad platform map into evidence a product team can safely ship.&lt;/p&gt;

&lt;p&gt;Explore the current capability map at &lt;a href="https://open.imoulife.com/" rel="noopener noreferrer"&gt;Imou Open Platform&lt;/a&gt;, then validate one complete device-to-user journey with the target devices and services.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>camera</category>
    </item>
    <item>
      <title>Bridge Imou HTTP Callbacks When a Home Assistant Integration Polls</title>
      <dc:creator>Imou-OpenPlatform</dc:creator>
      <pubDate>Tue, 01 Sep 2026 07:04:38 +0000</pubDate>
      <link>https://dev.to/imouopenplatform/bridge-imou-http-callbacks-when-a-home-assistant-integration-polls-387k</link>
      <guid>https://dev.to/imouopenplatform/bridge-imou-http-callbacks-when-a-home-assistant-integration-polls-387k</guid>
      <description>&lt;p&gt;If your Home Assistant Imou path talks to the cloud API on a poll interval, it will not see alarms at callback latency. For nearer-real-time events, subscribe with Open Platform &lt;code&gt;setMessageCallback&lt;/code&gt; to a backend you control, return HTTP 200, then forward a sanitized event into Home Assistant through a mechanism you own (webhook automation, MQTT, or a custom component). That bridge is application architecture, not a Core integration feature and not an Imou delivery SLA. API and playback traffic still consume the developer application quota.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;Users expect motion to fire lights immediately. A polling integration can only be as fresh as its scan interval and remaining quota. Explaining that honestly prevents duplicate “broken sensor” issues. Building a bridge is optional engineering; it must not be marketed as a hidden official HA option without verifying repositories on publish day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach / architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Imou device
  -&amp;gt; Open Platform callback
  -&amp;gt; your public HTTPS receiver (200 then queue)
  -&amp;gt; map deviceId/channel to HA entity
  -&amp;gt; HA webhook / MQTT / event bus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Freshness&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HA cloud poll&lt;/td&gt;
&lt;td&gt;Interval-bound&lt;/td&gt;
&lt;td&gt;Uses App ID quota for listed API calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open Platform callback + bridge&lt;/td&gt;
&lt;td&gt;Callback-bound, minus your queue delay&lt;/td&gt;
&lt;td&gt;You operate the receiver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local-only speculation&lt;/td&gt;
&lt;td&gt;Not claimed here&lt;/td&gt;
&lt;td&gt;Do not invent undocumented LAN event APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Name integrations carefully. Home Assistant Core &lt;code&gt;imou&lt;/code&gt; and any separately maintained HACS component can differ. Verify &lt;a href="https://www.home-assistant.io/integrations/imou/" rel="noopener noreferrer"&gt;the Core page&lt;/a&gt; and current repository ownership before you write “official.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Six implementation steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Confirm how your installed integration actually refreshes.&lt;/strong&gt; Read its docs and code path; do not assume webhooks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stand up &lt;code&gt;setMessageCallback&lt;/code&gt;&lt;/strong&gt; with documented flags and a public URL. Administrator token stays on the bridge backend.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Acknowledge 200 first.&lt;/strong&gt; Parse, enqueue, then map to HA.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Map identifiers explicitly.&lt;/strong&gt; Imou &lt;code&gt;deviceId&lt;/code&gt;/&lt;code&gt;channelId&lt;/code&gt; to HA entity_id. Keep a table you control.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sanitize payloads.&lt;/strong&gt; Do not dump encrypted images or personal data into HA history by default.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Watch quota.&lt;/strong&gt; Extra live views and API calls in HA still bill against the same App ID resources documented for that account.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  APIs / SDKs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://open.imoulife.com/book/en/guide/haDev.html" rel="noopener noreferrer"&gt;HA development guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://open.imoulife.com/book/en/http/push/setMessageCallback.html" rel="noopener noreferrer"&gt;&lt;code&gt;setMessageCallback&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://open.imoulife.com/book/en/push/push.html" rel="noopener noreferrer"&gt;Push instructions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.home-assistant.io/integrations/imou/" rel="noopener noreferrer"&gt;Home Assistant Imou integration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No prices, lead forms, or unverified “official” claims.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits &amp;amp; pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The bridge is not a guarantee of zero missed events; combine with query if you need reconciliation (guidance only).&lt;/li&gt;
&lt;li&gt;Do not put &lt;code&gt;appSecret&lt;/code&gt; in &lt;code&gt;configuration.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Recheck HA docs, callback flags, and quota notes on publication day.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Operating the bridge without turning HA into a SaaS funnel
&lt;/h2&gt;

&lt;p&gt;Keep the receiver, mapper, and Home Assistant instance in systems you administer. Rate-limit forwards so a noisy camera cannot flood HA’s recorder. Drop or summarize events you do not need.&lt;/p&gt;

&lt;p&gt;If Core already creates binary sensors from poll, decide whether the bridge duplicates them. Duplicate entities confuse automations. A dedicated &lt;code&gt;event&lt;/code&gt; stream with &lt;code&gt;device_id&lt;/code&gt; in data may be cleaner than flipping a polled sensor.&lt;/p&gt;

&lt;p&gt;Quota: extra &lt;code&gt;get*&lt;/code&gt; calls you add “to be sure” can exhaust the same App ID used by the integration. Measure your own API volume.&lt;/p&gt;

&lt;p&gt;Security: the callback URL is an ingress surface. Restrict source networks if you can operate that; still return 200 only after basic validation so you do not teach the platform that your URL is dead.&lt;/p&gt;

&lt;p&gt;This pattern is for integrators who already run a backend. It is not a community how-to for bypassing Home Assistant’s architecture, and it is not a claim that Imou maintains a webhook integration inside Core. Recheck &lt;code&gt;haDev.html&lt;/code&gt; and the Core integration page on the day you publish.&lt;/p&gt;

&lt;p&gt;Read the &lt;a href="https://open.imoulife.com/book/en/guide/haDev.html" rel="noopener noreferrer"&gt;Imou HA guide&lt;/a&gt; and the &lt;a href="https://open.imoulife.com/book/en/http/push/setMessageCallback.html" rel="noopener noreferrer"&gt;callback interface&lt;/a&gt;, then decide whether polling is enough or whether you will operate a callback bridge yourself.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>camera</category>
    </item>
    <item>
      <title>A Backend Checklist for Imou Signatures: Time, Nonce, id and SN1005</title>
      <dc:creator>Imou-OpenPlatform</dc:creator>
      <pubDate>Tue, 01 Sep 2026 07:03:56 +0000</pubDate>
      <link>https://dev.to/imouopenplatform/a-backend-checklist-for-imou-signatures-time-nonce-id-and-sn1005-4879</link>
      <guid>https://dev.to/imouopenplatform/a-backend-checklist-for-imou-signatures-time-nonce-id-and-sn1005-4879</guid>
      <description>&lt;p&gt;Stop most signature failures in code by synchronizing UTC time, generating a 32-bit nonce that never repeats inside the documented five-minute window, sending a unique non-empty request &lt;code&gt;id&lt;/code&gt;, pairing &lt;code&gt;appId&lt;/code&gt; with &lt;code&gt;appSecret&lt;/code&gt;, posting to the assigned regional host, and matching the live HMAC procedure including the official test vector. Nonce reuse in that window currently returns &lt;code&gt;SN1005&lt;/code&gt;. Do not restate a forked algorithm in a wiki; implement the development specification page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;Production incidents often mix four bugs: clock drift on Kubernetes nodes, a shared nonce in a retry helper, an empty &lt;code&gt;id&lt;/code&gt;, and the wrong data center. A checklist that runs in CI and in the HTTP client prevents “it worked on my laptop.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach / architecture
&lt;/h2&gt;

&lt;p&gt;Keep a &lt;code&gt;SignAndSend&lt;/code&gt; function that always allocates a fresh envelope:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for each attempt:
  time = utc_epoch_seconds()
  nonce = unique_32bit()
  id = unique_nonempty()
  sign = official_algorithm(appId, secret, time, nonce, params)
  POST assigned_host /openapi/method
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Retries that copy &lt;code&gt;system&lt;/code&gt; fields cause &lt;code&gt;SN1005&lt;/code&gt;. Architecture recommendation: retry at this envelope boundary, and keep a separate internal correlation id for logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seven implementation steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;NTP or equivalent on every worker&lt;/strong&gt; that signs. Stay comfortably inside the five-minute window; do not skim the edge.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Centralize nonce generation&lt;/strong&gt; with a uniqueness store or cryptographically strong RNG plus a short-lived seen-set shared across replicas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Always set &lt;code&gt;id&lt;/code&gt;.&lt;/strong&gt; Empty or duplicate ids fail independently of HMAC.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lock algorithm to the live page.&lt;/strong&gt; Use the official Java sample and fixed expected value as a unit test. Never commit the sample secret as production config.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Separate host selection from signing.&lt;/strong&gt; Wrong &lt;code&gt;openapi-sg&lt;/code&gt; versus &lt;code&gt;openapi-fk&lt;/code&gt; versus &lt;code&gt;openapi-or&lt;/code&gt; is not a HMAC bug.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Log fingerprints only:&lt;/strong&gt; time, nonce hash, &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;appId&lt;/code&gt; suffix, region, result code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;On &lt;code&gt;SN1005&lt;/code&gt;, inspect retries and cloned HTTP clients&lt;/strong&gt; before rotating &lt;code&gt;appSecret&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  APIs / SDKs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://open.imoulife.com/book/en/http/develop.html" rel="noopener noreferrer"&gt;HTTP development specification&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not duplicate the byte-level sign string in this article; it drifts. The live page is the contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits &amp;amp; pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Milliseconds versus seconds for &lt;code&gt;time&lt;/code&gt; is a common defect.&lt;/li&gt;
&lt;li&gt;Multi-thread nonce collisions look like random production-only failures.&lt;/li&gt;
&lt;li&gt;Do not claim all auth errors are &lt;code&gt;SN1005&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Recheck the five-minute rule, nonce width, and test vector on publication day.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Test harness and multi-worker reality
&lt;/h2&gt;

&lt;p&gt;Unit-test the signer with the official vector on every build. Integration-test against the assigned regional host in staging with a dedicated &lt;code&gt;appId&lt;/code&gt;. Never point CI at production secrets.&lt;/p&gt;

&lt;p&gt;In Kubernetes, clock skew between nodes is enough to flake signatures near the five-minute boundary. Use an NTP sidecar or node-level time sync, and fail health checks if skew exceeds a conservative threshold you choose—without claiming that threshold is Imou’s.&lt;/p&gt;

&lt;p&gt;Nonce uniqueness across replicas needs a shared store or a generator with collision resistance plus TTL keys. A local HashSet is not enough for two pods.&lt;/p&gt;

&lt;p&gt;When reproducing a customer failure, ask for request &lt;code&gt;id&lt;/code&gt;, UTC time, region, and result code. Re-running their exact &lt;code&gt;nonce&lt;/code&gt; is the wrong lesson; you want to know whether &lt;em&gt;they&lt;/em&gt; reused it.&lt;/p&gt;

&lt;p&gt;Do not wrap the official algorithm in a “simplified” library that omits &lt;code&gt;id&lt;/code&gt; or changes encoding. Language ports should be checked against the same vector.&lt;/p&gt;

&lt;p&gt;Put the official test vector in CI, then ship a signer that mints a new time, nonce, and &lt;code&gt;id&lt;/code&gt; on every attempt using the &lt;a href="https://open.imoulife.com/book/en/http/develop.html" rel="noopener noreferrer"&gt;development specification&lt;/a&gt; from &lt;a href="https://open.imoulife.com/" rel="noopener noreferrer"&gt;Imou Open Platform&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>camera</category>
    </item>
  </channel>
</rss>
