{"title":"Pet Security","description":null,"products":[{"product_id":"sayby-s-gift-cards","title":"Sayby’s Gift Cards","description":"\u003cp dir=\"auto\" class=\"PDq2pG_selectionAnchorContainer\"\u003e\u003cstrong\u003eDescription:\u003c\/strong\u003e\u003cbr\u003eGive someone the freedom to choose their favourite products with a convenient gift card. Perfect for birthdays, celebrations, or special occasions, this gift card allows recipients to select something they truly love.\u003cspan class=\"PDq2pG_selectionAnchor\"\u003e\u003c\/span\u003e\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eSpecifications:\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eDigital gift card for online purchases\u003c\/li\u003e\n\u003cli\u003eIdeal for gifting on special occasions\u003c\/li\u003e\n\u003cli\u003eAllows recipients to choose their preferred products\u003c\/li\u003e\n\u003cli\u003eConvenient and easy to use\u003c\/li\u003e\n\u003cli\u003eNo physical delivery required\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Sayby’s Sanctuary ","offers":[{"title":"£15.00","offer_id":48962487943433,"sku":null,"price":15.0,"currency_code":"GBP","in_stock":true},{"title":"£25.00","offer_id":48962487976201,"sku":null,"price":25.0,"currency_code":"GBP","in_stock":true},{"title":"£50.00","offer_id":48962488008969,"sku":null,"price":50.0,"currency_code":"GBP","in_stock":true},{"title":"£75.00","offer_id":48962488041737,"sku":null,"price":75.0,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0859\/0508\/0585\/files\/C2C7BC4F-5783-42D9-B8A9-3FD0FDED57DE_6346dcab-9177-4f12-9af0-a8a1496d0ed2.png?v=1789479222"},{"product_id":"blurams-pet-camera-2k-indoor-camera-dog-camera-360-home-security-camera-night-vision-motion-tracking-2-way-talk-cloud-sd-app-control-works-with-alexa","title":"2K Pet Camera","description":"\u003cp dir=\"auto\" class=\"PDq2pG_selectionAnchorContainer\"\u003e\u003cstrong\u003eDescription:\u003c\/strong\u003e\u003cbr\u003eA smart pet camera designed to help you monitor your pets from anywhere. With high-resolution video quality, it allows you to keep an eye on your pets while you are away, helping provide reassurance and better pet care.\u003cspan class=\"PDq2pG_selectionAnchor\"\u003e\u003c\/span\u003e\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eSpecifications:\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003e2K high-resolution video monitoring\u003c\/li\u003e\n\u003cli\u003eDesigned for pet monitoring\u003c\/li\u003e\n\u003cli\u003eHelps keep track of pets remotely\u003c\/li\u003e\n\u003cli\u003eProvides clear video quality\u003c\/li\u003e\n\u003cli\u003eSuitable for home use\u003c\/li\u003e\n\u003cli\u003eHelps monitor pet activity and behaviour\u003c\/li\u003e\n\u003cli\u003eEasy setup and convenient operation\u003c\/li\u003e\n\u003cli\u003eIdeal for cats, dogs, and other pets\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Sayby’s Sanctuary ","offers":[{"title":"1PC-White (Colour Night Vision)","offer_id":55481251037449,"sku":"B07YB8HZ8T","price":18.46,"currency_code":"GBP","in_stock":true},{"title":"1PC-Black","offer_id":55481251004681,"sku":"B0C8MQMSYK","price":19.43,"currency_code":"GBP","in_stock":true},{"title":"2PC-White","offer_id":55481251070217,"sku":"B0BNHM8NNJ","price":36.68,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0859\/0508\/0585\/files\/71alUymUlvL.jpg?v=1747315649"},{"product_id":"tapo-tc40-pan-tilt-smart-security-outdoor-camera-full-hd-360-smart-person-detection-motion-tracking-color-night-vision-wifi-camera-no-monthly-fee-two-way-talk-ip65-works-with-alexa-google","title":"Pan\/Tilt Smart Outdoor Security Camera","description":"\u003cp dir=\"auto\" class=\"PDq2pG_selectionAnchorContainer\"\u003e\u003cstrong\u003eDescription:\u003c\/strong\u003e\u003cbr\u003eA smart outdoor security camera designed to provide reliable monitoring and protection around your home or property. Featuring pan and tilt functionality, it allows flexible viewing angles while helping you keep an eye on outdoor areas with clear video monitoring and smart security features.\u003cspan class=\"PDq2pG_selectionAnchor\"\u003e\u003c\/span\u003e\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eSpecifications:\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eDesigned for outdoor security monitoring\u003c\/li\u003e\n\u003cli\u003ePan and tilt functionality for wider viewing coverage\u003c\/li\u003e\n\u003cli\u003eProvides clear video surveillance\u003c\/li\u003e\n\u003cli\u003eSuitable for home and property security\u003c\/li\u003e\n\u003cli\u003eHelps monitor outdoor areas remotely\u003c\/li\u003e\n\u003cli\u003eSmart security features for added protection\u003c\/li\u003e\n\u003cli\u003eDurable design for outdoor use\u003c\/li\u003e\n\u003cli\u003eEasy installation and setup\u003c\/li\u003e\n\u003cli\u003eSuitable for everyday security monitoring\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Sayby’s Sanctuary ","offers":[{"title":"2K 3MP","offer_id":55801070059785,"sku":"B0DQ5NTHB8","price":0.0,"currency_code":"GBP","in_stock":true},{"title":"2MP 360°","offer_id":55801070158089,"sku":"B0CJML18KP","price":45.3,"currency_code":"GBP","in_stock":true},{"title":"Old Version","offer_id":55801070092553,"sku":"B0BQJVKVQR","price":50.97,"currency_code":"GBP","in_stock":true},{"title":"3K 5MP 360°","offer_id":55801070125321,"sku":"B0DRW85XNL","price":81.09,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0859\/0508\/0585\/files\/51m-4Z_arXL.jpg?v=1751097787"},{"product_id":"tapo-c211-2k-3mp-pan-tilt-indoor-camera-house-security-camera-wifi-camera-no-monthly-fee-ai-detection-dog-camera-baby-camera-monitor-cctv-360-view-night-vision-works-with-alexa-google","title":"2K 3MP Pan \u0026 Tilt Indoor Security Camera","description":"\u003cp class=\"isSelectedEnd\"\u003e\u003cstrong\u003e\u003cspan\u003eDescription:\u003c\/span\u003e\u003c\/strong\u003e\u003cbr\u003e\u003cspan\u003eA smart indoor Wi-Fi security camera with 2K 3MP resolution, 360° pan and tilt coverage, night vision, AI detection, motion tracking, and two-way audio. It is suitable for home security, pet monitoring, and baby monitoring with instant phone alerts and flexible local or cloud storage.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"isSelectedEnd\"\u003e\u003cstrong\u003e\u003cspan\u003eSpecifications:\u003c\/span\u003e\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cspan\u003eResolution: 2K \/ 3MP\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eLens: 4mm\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eCamera Type: Indoor Pan \u0026amp; Tilt Camera\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eHorizontal Coverage: 360°\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eVertical Coverage: 114°\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eNight Vision Range: Up to 10m \/ 30ft\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eInfrared Light: 850nm\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003ePerson Detection: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eMotion Detection: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eMotion Tracking: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eBaby Cry Detection: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eTwo-Way Audio: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eCustom Activity Zones: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eLocal Storage: Supports up to 512GB MicroSD card\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003e24\/7 Recording: Supported with MicroSD card\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eCloud Storage: Optional\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eHub Required: No\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eConnectivity: Wi-Fi\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eAlexa Compatible: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eGoogle Assistant Compatible: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eRTSP Support: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eRecommended Use: Home security, pet monitoring, and baby monitoring\u003c\/span\u003e\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Sayby’s Sanctuary ","offers":[{"title":"2K 3MP","offer_id":56070906249481,"sku":"B0CQHY41NY","price":21.59,"currency_code":"GBP","in_stock":true},{"title":"2K HD","offer_id":56070906282249,"sku":"B08LHG2W7Y","price":45.34,"currency_code":"GBP","in_stock":true},{"title":"2K 4MP","offer_id":56070906315017,"sku":"B0CF2RRBW5","price":26.99,"currency_code":"GBP","in_stock":true},{"title":"4K 8MP 360°Outdoor","offer_id":56070906347785,"sku":"B0FJMSDN3W","price":97.19,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0859\/0508\/0585\/files\/tapo-c211-2k-3mp-pantilt-indoor-camera-house-security-camera-wifi-camera-no-monthly-fee-ai-detection-dog-camera-baby-camera-monitor-cctv-360-view-night-vision-w-2981823.jpg?v=1789638677"},{"product_id":"tapo-c210-2k-3mp-pan-tilt-indoor-camera-house-security-camera-wifi-camera-no-monthly-fee-ai-detection-dog-puppy-camera-baby-camera-monitor-360-view-night-vision-works-with-alexa-google","title":"2K 3MP Pan \u0026 Tilt Indoor Security Camera","description":"\u003cp class=\"isSelectedEnd\"\u003e\u003cstrong\u003e\u003cspan\u003eDescription:\u003c\/span\u003e\u003c\/strong\u003e\u003cbr\u003e\u003cspan\u003eA smart indoor Wi-Fi security camera with 2K 3MP video, 360° pan and tilt coverage, night vision, motion tracking, and AI detection. It can be used for home security, baby monitoring, or pet monitoring, with two-way audio and real-time phone notifications.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"isSelectedEnd\"\u003e\u003cstrong\u003e\u003cspan\u003eSpecifications:\u003c\/span\u003e\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cspan\u003eResolution: 2K \/ 3MP\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eCamera Type: Indoor Pan \u0026amp; Tilt Camera\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eViewing Coverage: 360°\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eNight Vision Range: Up to 10m \/ 30ft\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eMotion Detection: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eMotion Tracking: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eAI Detection: Human and baby crying detection\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eTwo-Way Audio: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eActivity Zones: Customisable\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003ePrivacy Zones: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eWi-Fi: Built-in\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eHub Required: No\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eLocal Storage: Supports up to 512GB MicroSD card\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eCloud Storage: Optional\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eAlexa Compatible: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eGoogle Compatible: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eRecommended Use: Home security, pet monitoring, and baby monitoring\u003c\/span\u003e\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Sayby’s Sanctuary ","offers":[{"title":"2K Pan Tilt","offer_id":56070906478857,"sku":"B09Y8TLP25","price":29.38,"currency_code":"GBP","in_stock":true},{"title":"2K 3MP","offer_id":56070906511625,"sku":"B08ZNTM1X1","price":23.11,"currency_code":"GBP","in_stock":true},{"title":"4G LTE Outdoor","offer_id":56070906544393,"sku":"B0DSPXF41Z","price":86.39,"currency_code":"GBP","in_stock":true},{"title":"2MP 2 Pack","offer_id":56070906577161,"sku":"B0CRQPV8MS","price":41.03,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0859\/0508\/0585\/files\/tapo-c210-2k-3mp-pantilt-indoor-camera-house-security-camera-wifi-camera-no-monthly-fee-ai-detection-dog-puppy-camera-baby-camera-monitor-360-view-night-vision--2944967.jpg?v=1789638564"},{"product_id":"codnida-2k-security-camera-outdoor-360-ptz-wifi-camera-cctv-camera-with-24-7-recording-pir-human-detection-sound-and-light-alarm-support-16-128g-sd-card-works-with-alexa","title":"2K PTZ Security Camera","description":"\u003cdiv\u003e\n\u003cdiv class=\"aplus-v2 desktop celwidget\"\u003e\n\u003cscript type=\"application\/javascript\"\u003e\/\/ \u003c![CDATA[\n    \/**\n     * Common event handler for click and keydown events.\n     * @param {Event} event - The event object.\n     * @param {Function} handleClickOrEnter - Function to handle click or Enter key events.\n     * @param {Function} handleEsc - Function to handle Esc key events.\n     *\/\n    \/\/ [TODO][AplusMantle-8064] Create common event handler util(key events, click events) in AplusModuleResources\n    function handleClickAndKeyEvents(event, handleClickOrEnterOrSpace) {\n        const ENTER_KEY_CODE = 13;\n        const ESCAPE_KEY_CODE = 27;\n        const SPACE_KEY_CODE = 32;\n        const isClick = event.type === 'click';\n        const isKeydown = event.type === 'keydown';\n        const isEnter = isKeydown \u0026\u0026 event.keyCode === ENTER_KEY_CODE;\n        const isSpace = isKeydown \u0026\u0026 event.keyCode === SPACE_KEY_CODE;\n        const isEsc = isKeydown \u0026\u0026 event.keyCode === ESCAPE_KEY_CODE;\n\n        if (isClick || isEnter || isSpace) {\n            handleClickOrEnterOrSpace();\n        } else if (isEsc) {\n            handleEsc(event);\n        }\n    }\n\n    \/**\n    * Function to handle esc key event.\n    * @param {Event} event - The event object.\n    *\/\n    function handleEsc(event) {\n        event.target.blur()  \/\/ force remove focus\n    }\n\/\/ ]]\u003e\u003c\/script\u003e\u003cscript type=\"text\/javascript\"\u003e\/\/ \u003c![CDATA[\n(function(f) {var _np=(window.P._namespace(\"PremiumAplusModule\"));if(_np.guardFatal){_np.guardFatal(f)(_np);}else{f(_np);}}(function(P) {\nP.now('premium-module-11-faq').execute(function(init) {\n    if (init) {\n        return;\n    }\n    P.register('premium-module-11-faq', function() {\n        return function() {\n            P.when('A', 'jQuery', 'ready').execute(function(A, $){\n                function initFaq(module) {                   \n                    const MODULE_CLASS_NAME = 'premium-aplus-module-11';\n                    const FAQ_CONTAINER_CLASS_NAME = 'faqs-container';\n                    const FAQ_BLOCK_CLASS_NAME = 'faq-block';\n                    const moduleId = $(module).data('faq-block');\n                    const $faqBlocks = $('.aplus-v2 .' + MODULE_CLASS_NAME + ' .' + FAQ_CONTAINER_CLASS_NAME + '.' + moduleId + ' .' + FAQ_BLOCK_CLASS_NAME);\n\n                    \/**\n                    * Function to handle click or Enter or Space key events.\n                    * @param {Element} element - The this object from which the event is dispatched\n                    * @param {faqBlocks} faqBlocks - List of all the Question and Answer blocks.\n                    *\/\n                    function handleClickOrEnterOrSpace(element, faqBlocks) {\n                        const $element = $(element);\n                        const isActive = $element.hasClass('aplus-active');\n\n                        faqBlocks.removeClass('aplus-active');\n                        faqBlocks.find('[data-faq-question]').attr('aria-expanded', 'false');\n\n                        if (!isActive) {\n                            $element.addClass('aplus-active');\n                            $element.find('[data-faq-question]').attr('aria-expanded', 'true');\n                        }\n                    }\n\n                    \/* Using jQuery event namespace for preventing duplicate binding on twister refresh *\/\n                    $faqBlocks.unbind('click keydown.premiumAplusModule11ClickHandler').bind('click keydown.premiumAplusModule11ClickHandler', function(event) {\n                        handleClickAndKeyEvents(event, () =\u003e handleClickOrEnterOrSpace(this, $faqBlocks)); \n                    });\n                }\n                $(\".aplus-v2 .premium-aplus-module-11 .faqs-container\").each(function(index, module) {\n                    initFaq(module);\n                });\n            });\n        };\n    });\n});\n}));\n\/\/ ]]\u003e\u003c\/script\u003e\u003cscript type=\"text\/javascript\"\u003e\/\/ \u003c![CDATA[\n(function(f) {var _np=(window.P._namespace(\"PremiumAplusModule\"));if(_np.guardFatal){_np.guardFatal(f)(_np);}else{f(_np);}}(function(P) {\nP.now('premium-module-12-nav-carousel').execute(function(init) {\n    if (init) {\n        return;\n    }\n    P.register('premium-module-12-nav-carousel', function(){\n        return function() {\n            P.when('A', 'jQuery', 'a-carousel-framework', 'ready').execute(function (A, $, framework) {\n                function initiateCarousel(module) {\n                    var MODULE_ID = $(module).data('module-id');\n                    \/**\n                    * Carousel button element classname\n                    * @const\n                    *\/\n                    var GOTO_BTN_CLASS_NAME = \"aplus-goto-btn-\" + MODULE_ID;\n                    \/**\n                    * Carousel button element active classname\n                    * @const\n                    *\/\n                    var GOTO_BTN_ACTIVE_CLASS_NAME = \"aplus-active\";\n                    \/**\n                    * AUI name for aui carousel\n                    * @const\n                    *\/\n                    var CAROUSEL_NAME = \"premium-aplus-12-carousel-\" + MODULE_ID;\n                    \/**\n                    * Module class name\n                    * @const\n                    *\/\n                    var MODULE_CLASS_NAME = \".aplus-v2 .premium-aplus-module-12\";\n                    \/**\n                    * Carousel text container class name\n                    * @const\n                    *\/\n                    var TEXT_CONTAINER_CLASS_NAME = MODULE_CLASS_NAME + \" .aplus-carousel-text-container-\" + MODULE_ID;\n                    \/**\n                    * Carousel text hidden class name\n                    * @const\n                    *\/\n                    var TEXT_CONTAINER_HIDDEN = \"aplus-hidden\";\n                    \/**\n                    * Carousel horizontal scroll container class name\n                    * @const\n                    *\/\n                    var HORIZONTAL_SCROLL_CONTAINER_CLASS_NAME = MODULE_CLASS_NAME + \" .aplus-horizontal-scroll-container-\" + MODULE_ID;\n\n                    function showCarouselText(oldIndex, newIndex) {\n                        var oldClass = TEXT_CONTAINER_CLASS_NAME + \"-\" + oldIndex;\n                        var newClass= TEXT_CONTAINER_CLASS_NAME + \"-\" + newIndex;\n                        $(oldClass).addClass(TEXT_CONTAINER_HIDDEN);\n                        $(newClass).removeClass(TEXT_CONTAINER_HIDDEN);\n                    }\n\n                    function scrollToCarouselButton(scrollLeft) {\n                        if ($(HORIZONTAL_SCROLL_CONTAINER_CLASS_NAME).length) {\n                            $(HORIZONTAL_SCROLL_CONTAINER_CLASS_NAME).animate({scrollLeft}, 200);\n                        }\n                    }\n\n                    \/**\n                    * Creates a CarouselButton class for provided carousel instance\n                    * @param {object} carousel - AUI Carousel instance\n                    * @returns {Class} - CarouselButton Class\n                    *\/\n                    function CarouselButtonTemplate(carousel) {\n                        \/**\n                        * Button for controlling the active slide\n                        * @constructor\n                        * @param {number} index - slide index\n                        * @param {DOMElement} [elem] - optional DOM element to use as this objects DOM representation\n                        *\/\n                        function CarouselButton(index, elem) {\n                            var self = this;\n                            this.index = index;\n                            this.carousel = carousel;\n\n                            \/* create the button element *\/\n                            this.elem = this.getElem(elem);\n                            this.$elem = $(this.elem);  \/* store jquery version *\/\n                            this.elem.addEventListener('click', self.handleClick.bind(self));\n                            this.elem.setAttribute('role', 'tab');\n\n                            \/* add this object to the object manager *\/\n                            CarouselButton.objects.byId[index] = this;\n                            CarouselButton.objects.all.push(this);\n                        }\n\n                        \/**\n                        * Describe behavior for click events on this.elem\n                        * @memberOf CarouselButton\n                        *\/\n                        CarouselButton.prototype.handleClick = function(e) {\n                            e.preventDefault();\n                            this.carousel.gotoPage(this.index);\n                        };\n\n                        \/**\n                        * Enter active state\n                        * @memberOf CarouselButton\n                        *\/\n                        CarouselButton.prototype.activate = function() {\n                            this.$elem.addClass(GOTO_BTN_ACTIVE_CLASS_NAME).attr('aria-selected', 'true');\n                        };\n\n                        \/**\n                        * Enter inactive state\n                        * @memberOf CarouselButton\n                        *\/\n                        CarouselButton.prototype.deactivate = function() {\n                            this.$elem.removeClass(GOTO_BTN_ACTIVE_CLASS_NAME).attr('aria-selected', 'false');\n                        };\n\n                        \/**\n                        * Returns an existing or creates a new bound element for this object\n                        * @memberOf CarouselButton\n                        * @param {DOMElement} [elem] - optionally provide an existing element in the DOM to use\n                        * @returns {DOMElement} - this objects DOM representation\n                        *\/\n                        CarouselButton.prototype.getElem = function(elem) {\n                            if (this.elem) return this.elem;\n                            if (elem) return elem;\n\n                            var createdElem = document.createElement('span');\n                            createdElem.className = GOTO_BTN_CLASS_NAME;\n\n                            return createdElem;\n                        };\n\n                        \/** @const Object manager *\/\n                        CarouselButton.objects = {\n                            byId: {},\n                            all: [],\n                        };\n\n                        return CarouselButton;\n                    }\n\n                    framework.onInit(CAROUSEL_NAME, function(carousel) {\n                        \/** @const {Class} *\/\n                        var CarouselButton = CarouselButtonTemplate(carousel);\n\n                        \/* create carousel controls *\/\n                        var $carouselBtns = $(safeClassSelector(GOTO_BTN_CLASS_NAME));\n                        var btns = $carouselBtns.map(function(i, btnElem) {\n                            return new CarouselButton(i + 1, btnElem);\n                        });\n\n                        \/* activate first one *\/\n                        CarouselButton.objects.byId[1].activate();\n\n                        \/* Listen to slide changes *\/\n                        A.on(\"a:carousel:\" + CAROUSEL_NAME + \":change:pageNumber\", function (data) {\n                            var newCarouselButton = CarouselButton.objects.byId[data.newValue];\n                            var marginLeft = parseInt(getComputedStyle(newCarouselButton.elem).getPropertyValue('margin-left'));\n                            var positionLeft = newCarouselButton.elem.offsetLeft - marginLeft;\n\n                            newCarouselButton.activate();\n                            CarouselButton.objects.byId[data.oldValue].deactivate();\n                            scrollToCarouselButton(positionLeft);\n                            showCarouselText(data.oldValue, data.newValue);\n                        });\n                    });\n\n                    \/**\n                    * @returns {string} - css classname prefixed with module selector\n                    *\/\n                    function safeClassSelector(className) {\n                        return '.' + MODULE_CLASS_NAME + ' .' + className;\n                    }\n                }\n\n                $('.aplus-v2 .premium-aplus-module-12 .aplus-carousel-container').each(function (index, module) {\n                    initiateCarousel(module);\n                });\n                framework.createAll();\n                framework.initializeAll();\n            });\n        }\n    })\n});\n}));\n\/\/ ]]\u003e\u003c\/script\u003e\n\u003cdiv class=\"celwidget aplus-module premium-module-8-hero-video aplus-premium\"\u003e\n\u003cdiv class=\"a-section a-spacing-none premium-aplus premium-aplus-module-8\"\u003e\n\u003cdiv class=\"a-section a-spacing-none premium-aplus-module-8-video\"\u003e\n\u003cdiv class=\"a-section a-spacing-none video-placeholder\"\u003e\n\u003cp class=\"isSelectedEnd\"\u003e\u003cstrong\u003e\u003cspan\u003eDescription:\u003c\/span\u003e\u003c\/strong\u003e\u003cbr\u003e\u003cspan\u003eA smart indoor and outdoor security camera with 2K resolution, 360° PTZ viewing, motion detection, auto tracking, two-way audio, and colour night vision. It supports 24\/7 recording, app alerts, SD card or cloud storage, and Alexa compatibility for convenient home monitoring.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"isSelectedEnd\"\u003e\u003cstrong\u003e\u003cspan\u003eSpecifications:\u003c\/span\u003e\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cspan\u003eResolution: 2K \/ 3MP\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eCamera Type: PTZ Security Camera\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eHorizontal Rotation: Up to 355°\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eVertical Rotation: Up to 90°\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eNight Vision: Colour and infrared\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eNight Vision Range: Up to 10m\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eMotion Detection: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eAuto Tracking: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eCustom Detection Zones: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eTwo-Way Audio: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eSound \u0026amp; Light Alarm: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eRecording: 24\/7 supported\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eSD Card Support: 16GB–128GB\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eCloud Storage: Supported\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eWi-Fi: 2.4GHz only\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eApp: CloudEdge\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eAlexa Compatible: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003ePower Cable Length: 3m\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eConnectivity: Wireless\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eRecommended Use: Indoor and outdoor security\u003c\/span\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\u003c\/div\u003e","brand":"Sayby’s Sanctuary ","offers":[{"title":"Black","offer_id":56071780696329,"sku":"B0DCJYL91L","price":31.8,"currency_code":"GBP","in_stock":true},{"title":"1 Pack","offer_id":56071780729097,"sku":"B0CGL36F9C","price":25.64,"currency_code":"GBP","in_stock":true},{"title":"2 Pack","offer_id":56071780761865,"sku":"B0CPHSHQDQ","price":55.52,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0859\/0508\/0585\/files\/codnida-2k-security-camera-outdoor-360-ptz-wifi-camera-cctv-camera-with-247-recording-pir-human-detection-sound-and-light-alarm-support-16-128g-sd-card-works-wi-4474646.jpg?v=1788169886"},{"product_id":"furbo-360-dog-camera-w-home-safety-package-premium-w-subscrpition-smart-pet-monitor-w-app-for-dog-home-rotating-360-view-colour-night-vision-auto-tracking-treat-toss-barking-smart-alert","title":"360° Pet Camera","description":"\u003cdiv\u003e\n\u003cdiv class=\"aplus-v2 desktop celwidget\"\u003e\n\u003cscript type=\"text\/javascript\"\u003e\/\/ \u003c![CDATA[\n(function(f) {var _np=(window.P._namespace(\"PremiumAplusModule\"));if(_np.guardFatal){_np.guardFatal(f)(_np);}else{f(_np);}}(function(P) {\nP.now('module-9-comparison-table-carousel').execute(function(init){\n    if (init) {\n        return;\n    }\n    P.register('module-9-comparison-table-carousel', function() {\n        return function() {\n            P.when('A', 'jQuery', 'a-carousel-framework', 'ready').execute(function (A, $, framework) {\n                function initiateCarousel(module) {\n                    var moduleId = $(module).data('carousel-name');\n                    var containerClass = '.aplus-v2 .premium-aplus-module-9';\n                    var carouselName = 'premium-aplus-9-carousel-'+moduleId;\n                    var comparisonName = '.compare-'+moduleId;\n                    var productLink = '.aplus-product-link-'+moduleId;\n\n                    \/* If the carousel goes to a new page, make sure the right toggle button is selected *\/\n                    A.on('a:carousel:'+carouselName+':change:pageNumber', function (data) {\n                        var oldCompareClass = containerClass+' '+comparisonName+data.oldValue;\n                        var newCompareClass = containerClass+' '+comparisonName+data.newValue;\n                        var oldLinkClass = containerClass+' '+productLink+data.oldValue;\n                        var newLinkClass = containerClass+' '+productLink+data.newValue;\n\n                        $(oldCompareClass+', '+oldLinkClass).hide();\n                        $(newCompareClass+', '+newLinkClass).show();\n                    });\n                }\n                $(\".aplus-v2 .premium-aplus-module-9 .aplus-comparison-carousel-container\").each(function(index) {\n                    initiateCarousel(this);\n                });\n            });\n        }\n    });\n})\n}));\n\/\/ ]]\u003e\u003c\/script\u003e\u003cscript type=\"application\/javascript\"\u003e\/\/ \u003c![CDATA[\n    \/**\n     * Common event handler for click and keydown events.\n     * @param {Event} event - The event object.\n     * @param {Function} handleClickOrEnter - Function to handle click or Enter key events.\n     * @param {Function} handleEsc - Function to handle Esc key events.\n     *\/\n    \/\/ [TODO][AplusMantle-8064] Create common event handler util(key events, click events) in AplusModuleResources\n    function handleClickAndKeyEvents(event, handleClickOrEnterOrSpace) {\n        const ENTER_KEY_CODE = 13;\n        const ESCAPE_KEY_CODE = 27;\n        const SPACE_KEY_CODE = 32;\n        const isClick = event.type === 'click';\n        const isKeydown = event.type === 'keydown';\n        const isEnter = isKeydown \u0026\u0026 event.keyCode === ENTER_KEY_CODE;\n        const isSpace = isKeydown \u0026\u0026 event.keyCode === SPACE_KEY_CODE;\n        const isEsc = isKeydown \u0026\u0026 event.keyCode === ESCAPE_KEY_CODE;\n\n        if (isClick || isEnter || isSpace) {\n            handleClickOrEnterOrSpace();\n        } else if (isEsc) {\n            handleEsc(event);\n        }\n    }\n\n    \/**\n    * Function to handle esc key event.\n    * @param {Event} event - The event object.\n    *\/\n    function handleEsc(event) {\n        event.target.blur()  \/\/ force remove focus\n    }\n\/\/ ]]\u003e\u003c\/script\u003e\u003cscript type=\"text\/javascript\"\u003e\/\/ \u003c![CDATA[\n(function(f) {var _np=(window.P._namespace(\"PremiumAplusModule\"));if(_np.guardFatal){_np.guardFatal(f)(_np);}else{f(_np);}}(function(P) {\nP.now('premium-module-11-faq').execute(function(init) {\n    if (init) {\n        return;\n    }\n    P.register('premium-module-11-faq', function() {\n        return function() {\n            P.when('A', 'jQuery', 'ready').execute(function(A, $){\n                function initFaq(module) {                   \n                    const MODULE_CLASS_NAME = 'premium-aplus-module-11';\n                    const FAQ_CONTAINER_CLASS_NAME = 'faqs-container';\n                    const FAQ_BLOCK_CLASS_NAME = 'faq-block';\n                    const moduleId = $(module).data('faq-block');\n                    const $faqBlocks = $('.aplus-v2 .' + MODULE_CLASS_NAME + ' .' + FAQ_CONTAINER_CLASS_NAME + '.' + moduleId + ' .' + FAQ_BLOCK_CLASS_NAME);\n\n                    \/**\n                    * Function to handle click or Enter or Space key events.\n                    * @param {Element} element - The this object from which the event is dispatched\n                    * @param {faqBlocks} faqBlocks - List of all the Question and Answer blocks.\n                    *\/\n                    function handleClickOrEnterOrSpace(element, faqBlocks) {\n                        const $element = $(element);\n                        const isActive = $element.hasClass('aplus-active');\n\n                        faqBlocks.removeClass('aplus-active');\n                        faqBlocks.find('[data-faq-question]').attr('aria-expanded', 'false');\n\n                        if (!isActive) {\n                            $element.addClass('aplus-active');\n                            $element.find('[data-faq-question]').attr('aria-expanded', 'true');\n                        }\n                    }\n\n                    \/* Using jQuery event namespace for preventing duplicate binding on twister refresh *\/\n                    $faqBlocks.unbind('click keydown.premiumAplusModule11ClickHandler').bind('click keydown.premiumAplusModule11ClickHandler', function(event) {\n                        handleClickAndKeyEvents(event, () =\u003e handleClickOrEnterOrSpace(this, $faqBlocks)); \n                    });\n                }\n                $(\".aplus-v2 .premium-aplus-module-11 .faqs-container\").each(function(index, module) {\n                    initFaq(module);\n                });\n            });\n        };\n    });\n});\n}));\n\/\/ ]]\u003e\u003c\/script\u003e\u003cscript type=\"text\/javascript\"\u003e\/\/ \u003c![CDATA[\n(function(f) {var _np=(window.P._namespace(\"PremiumAplusModule\"));if(_np.guardFatal){_np.guardFatal(f)(_np);}else{f(_np);}}(function(P) {\nP.now('premium-module-12-nav-carousel').execute(function(init) {\n    if (init) {\n        return;\n    }\n    P.register('premium-module-12-nav-carousel', function(){\n        return function() {\n            P.when('A', 'jQuery', 'a-carousel-framework', 'ready').execute(function (A, $, framework) {\n                function initiateCarousel(module) {\n                    var MODULE_ID = $(module).data('module-id');\n                    \/**\n                    * Carousel button element classname\n                    * @const\n                    *\/\n                    var GOTO_BTN_CLASS_NAME = \"aplus-goto-btn-\" + MODULE_ID;\n                    \/**\n                    * Carousel button element active classname\n                    * @const\n                    *\/\n                    var GOTO_BTN_ACTIVE_CLASS_NAME = \"aplus-active\";\n                    \/**\n                    * AUI name for aui carousel\n                    * @const\n                    *\/\n                    var CAROUSEL_NAME = \"premium-aplus-12-carousel-\" + MODULE_ID;\n                    \/**\n                    * Module class name\n                    * @const\n                    *\/\n                    var MODULE_CLASS_NAME = \".aplus-v2 .premium-aplus-module-12\";\n                    \/**\n                    * Carousel text container class name\n                    * @const\n                    *\/\n                    var TEXT_CONTAINER_CLASS_NAME = MODULE_CLASS_NAME + \" .aplus-carousel-text-container-\" + MODULE_ID;\n                    \/**\n                    * Carousel text hidden class name\n                    * @const\n                    *\/\n                    var TEXT_CONTAINER_HIDDEN = \"aplus-hidden\";\n                    \/**\n                    * Carousel horizontal scroll container class name\n                    * @const\n                    *\/\n                    var HORIZONTAL_SCROLL_CONTAINER_CLASS_NAME = MODULE_CLASS_NAME + \" .aplus-horizontal-scroll-container-\" + MODULE_ID;\n\n                    function showCarouselText(oldIndex, newIndex) {\n                        var oldClass = TEXT_CONTAINER_CLASS_NAME + \"-\" + oldIndex;\n                        var newClass= TEXT_CONTAINER_CLASS_NAME + \"-\" + newIndex;\n                        $(oldClass).addClass(TEXT_CONTAINER_HIDDEN);\n                        $(newClass).removeClass(TEXT_CONTAINER_HIDDEN);\n                    }\n\n                    function scrollToCarouselButton(scrollLeft) {\n                        if ($(HORIZONTAL_SCROLL_CONTAINER_CLASS_NAME).length) {\n                            $(HORIZONTAL_SCROLL_CONTAINER_CLASS_NAME).animate({scrollLeft}, 200);\n                        }\n                    }\n\n                    \/**\n                    * Creates a CarouselButton class for provided carousel instance\n                    * @param {object} carousel - AUI Carousel instance\n                    * @returns {Class} - CarouselButton Class\n                    *\/\n                    function CarouselButtonTemplate(carousel) {\n                        \/**\n                        * Button for controlling the active slide\n                        * @constructor\n                        * @param {number} index - slide index\n                        * @param {DOMElement} [elem] - optional DOM element to use as this objects DOM representation\n                        *\/\n                        function CarouselButton(index, elem) {\n                            var self = this;\n                            this.index = index;\n                            this.carousel = carousel;\n\n                            \/* create the button element *\/\n                            this.elem = this.getElem(elem);\n                            this.$elem = $(this.elem);  \/* store jquery version *\/\n                            this.elem.addEventListener('click', self.handleClick.bind(self));\n                            this.elem.setAttribute('role', 'tab');\n\n                            \/* add this object to the object manager *\/\n                            CarouselButton.objects.byId[index] = this;\n                            CarouselButton.objects.all.push(this);\n                        }\n\n                        \/**\n                        * Describe behavior for click events on this.elem\n                        * @memberOf CarouselButton\n                        *\/\n                        CarouselButton.prototype.handleClick = function(e) {\n                            e.preventDefault();\n                            this.carousel.gotoPage(this.index);\n                        };\n\n                        \/**\n                        * Enter active state\n                        * @memberOf CarouselButton\n                        *\/\n                        CarouselButton.prototype.activate = function() {\n                            this.$elem.addClass(GOTO_BTN_ACTIVE_CLASS_NAME).attr('aria-selected', 'true');\n                        };\n\n                        \/**\n                        * Enter inactive state\n                        * @memberOf CarouselButton\n                        *\/\n                        CarouselButton.prototype.deactivate = function() {\n                            this.$elem.removeClass(GOTO_BTN_ACTIVE_CLASS_NAME).attr('aria-selected', 'false');\n                        };\n\n                        \/**\n                        * Returns an existing or creates a new bound element for this object\n                        * @memberOf CarouselButton\n                        * @param {DOMElement} [elem] - optionally provide an existing element in the DOM to use\n                        * @returns {DOMElement} - this objects DOM representation\n                        *\/\n                        CarouselButton.prototype.getElem = function(elem) {\n                            if (this.elem) return this.elem;\n                            if (elem) return elem;\n\n                            var createdElem = document.createElement('span');\n                            createdElem.className = GOTO_BTN_CLASS_NAME;\n\n                            return createdElem;\n                        };\n\n                        \/** @const Object manager *\/\n                        CarouselButton.objects = {\n                            byId: {},\n                            all: [],\n                        };\n\n                        return CarouselButton;\n                    }\n\n                    framework.onInit(CAROUSEL_NAME, function(carousel) {\n                        \/** @const {Class} *\/\n                        var CarouselButton = CarouselButtonTemplate(carousel);\n\n                        \/* create carousel controls *\/\n                        var $carouselBtns = $(safeClassSelector(GOTO_BTN_CLASS_NAME));\n                        var btns = $carouselBtns.map(function(i, btnElem) {\n                            return new CarouselButton(i + 1, btnElem);\n                        });\n\n                        \/* activate first one *\/\n                        CarouselButton.objects.byId[1].activate();\n\n                        \/* Listen to slide changes *\/\n                        A.on(\"a:carousel:\" + CAROUSEL_NAME + \":change:pageNumber\", function (data) {\n                            var newCarouselButton = CarouselButton.objects.byId[data.newValue];\n                            var marginLeft = parseInt(getComputedStyle(newCarouselButton.elem).getPropertyValue('margin-left'));\n                            var positionLeft = newCarouselButton.elem.offsetLeft - marginLeft;\n\n                            newCarouselButton.activate();\n                            CarouselButton.objects.byId[data.oldValue].deactivate();\n                            scrollToCarouselButton(positionLeft);\n                            showCarouselText(data.oldValue, data.newValue);\n                        });\n                    });\n\n                    \/**\n                    * @returns {string} - css classname prefixed with module selector\n                    *\/\n                    function safeClassSelector(className) {\n                        return '.' + MODULE_CLASS_NAME + ' .' + className;\n                    }\n                }\n\n                $('.aplus-v2 .premium-aplus-module-12 .aplus-carousel-container').each(function (index, module) {\n                    initiateCarousel(module);\n                });\n                framework.createAll();\n                framework.initializeAll();\n            });\n        }\n    })\n});\n}));\n\/\/ ]]\u003e\u003c\/script\u003e\n\u003cdiv class=\"celwidget aplus-module premium-module-8-hero-video aplus-premium\"\u003e\n\u003cdiv class=\"a-section a-spacing-none premium-aplus premium-aplus-module-8\"\u003e\n\u003cdiv class=\"a-section a-spacing-none premium-aplus-module-8-video\"\u003e\n\u003cdiv class=\"a-section a-spacing-none video-placeholder\"\u003e\n\u003cp class=\"isSelectedEnd\"\u003e\u003cstrong\u003e\u003cspan\u003eDescription:\u003c\/span\u003e\u003c\/strong\u003e\u003cbr\u003e\u003cspan\u003eA smart pet monitoring camera with 360° rotation, HD zoom, two-way audio, night vision, motion detection, and treat tossing. It helps you stay connected with your dog while away and provides app-based alerts, recording, and monitoring features. Advanced features require a paid subscription.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"isSelectedEnd\"\u003e\u003cstrong\u003e\u003cspan\u003eSpecifications:\u003c\/span\u003e\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cspan\u003eCamera Type: 360° Pet Monitoring Camera\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eCoverage: 360° Rotating View\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eZoom: 4× HD Zoom\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eTwo-Way Audio: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eNight Vision: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eMotion Detection: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eBark Detection: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eTreat Tossing: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eApp Control: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eConnectivity: Wireless Wi-Fi\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eCloud Recording: Available with subscription\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eAlerts: Barking, person, smoke\/CO, glass breaking, and activity alerts\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eSecurity: Two-factor authentication and encrypted connection\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eRecommended Use: Dog and pet monitoring\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eSubscription: Required for advanced features\u003c\/span\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\u003c\/div\u003e","brand":"Sayby’s Sanctuary ","offers":[{"title":"Dog Camera Only","offer_id":56111965339913,"sku":"B09GDQZLD1","price":139.32,"currency_code":"GBP","in_stock":true},{"title":"Cat Cam - Needs Subscription","offer_id":56111965372681,"sku":"B0CFGQBCDX","price":45.36,"currency_code":"GBP","in_stock":true},{"title":"Mini Camera - Subscription required","offer_id":56111965405449,"sku":"B0CTKXQNPX","price":25.92,"currency_code":"GBP","in_stock":true},{"title":"Mini Camera - Subscription Optional","offer_id":56111965438217,"sku":"B0C4XYGMF1","price":61.56,"currency_code":"GBP","in_stock":true},{"title":"Cat Cam - Subscription Optional","offer_id":56111965470985,"sku":"B0C4XXBY44","price":160.92,"currency_code":"GBP","in_stock":true},{"title":"Dog Cam - Needs Subscription","offer_id":56111965503753,"sku":"B0BWN22T25","price":56.16,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0859\/0508\/0585\/files\/furbo-360-pet-camera-whome-safety-package-premium-wsubscrpition-smart-pet-monitor-wapp-for-pet-home-rotating-360-view-colour-night-vision-auto-tracking-treat-to-5974816.jpg?v=1788170182"},{"product_id":"imou-dual-lens-2k-2k-indoor-security-camera-house-security-camera-360-full-coverage-pet-baby-camera-with-app-color-night-vision-human-pet-sound-motion-detection-siren-spotlight-2-4ghz-only","title":"Dual-Lens 2K Indoor Security Camera","description":"\u003cdiv\u003e\n\u003cdiv class=\"aplus-v2 desktop celwidget\"\u003e\n\u003cscript type=\"text\/javascript\"\u003e\/\/ \u003c![CDATA[\n(function(f) {var _np=(window.P._namespace(\"PremiumAplusModule\"));if(_np.guardFatal){_np.guardFatal(f)(_np);}else{f(_np);}}(function(P) {\nP.now('premium-module-12-nav-carousel').execute(function(init) {\n    if (init) {\n        return;\n    }\n    P.register('premium-module-12-nav-carousel', function(){\n        return function() {\n            P.when('A', 'jQuery', 'a-carousel-framework', 'ready').execute(function (A, $, framework) {\n                function initiateCarousel(module) {\n                    var MODULE_ID = $(module).data('module-id');\n                    \/**\n                    * Carousel button element classname\n                    * @const\n                    *\/\n                    var GOTO_BTN_CLASS_NAME = \"aplus-goto-btn-\" + MODULE_ID;\n                    \/**\n                    * Carousel button element active classname\n                    * @const\n                    *\/\n                    var GOTO_BTN_ACTIVE_CLASS_NAME = \"aplus-active\";\n                    \/**\n                    * AUI name for aui carousel\n                    * @const\n                    *\/\n                    var CAROUSEL_NAME = \"premium-aplus-12-carousel-\" + MODULE_ID;\n                    \/**\n                    * Module class name\n                    * @const\n                    *\/\n                    var MODULE_CLASS_NAME = \".aplus-v2 .premium-aplus-module-12\";\n                    \/**\n                    * Carousel text container class name\n                    * @const\n                    *\/\n                    var TEXT_CONTAINER_CLASS_NAME = MODULE_CLASS_NAME + \" .aplus-carousel-text-container-\" + MODULE_ID;\n                    \/**\n                    * Carousel text hidden class name\n                    * @const\n                    *\/\n                    var TEXT_CONTAINER_HIDDEN = \"aplus-hidden\";\n                    \/**\n                    * Carousel horizontal scroll container class name\n                    * @const\n                    *\/\n                    var HORIZONTAL_SCROLL_CONTAINER_CLASS_NAME = MODULE_CLASS_NAME + \" .aplus-horizontal-scroll-container-\" + MODULE_ID;\n\n                    function showCarouselText(oldIndex, newIndex) {\n                        var oldClass = TEXT_CONTAINER_CLASS_NAME + \"-\" + oldIndex;\n                        var newClass= TEXT_CONTAINER_CLASS_NAME + \"-\" + newIndex;\n                        $(oldClass).addClass(TEXT_CONTAINER_HIDDEN);\n                        $(newClass).removeClass(TEXT_CONTAINER_HIDDEN);\n                    }\n\n                    function scrollToCarouselButton(scrollLeft) {\n                        if ($(HORIZONTAL_SCROLL_CONTAINER_CLASS_NAME).length) {\n                            $(HORIZONTAL_SCROLL_CONTAINER_CLASS_NAME).animate({scrollLeft}, 200);\n                        }\n                    }\n\n                    \/**\n                    * Creates a CarouselButton class for provided carousel instance\n                    * @param {object} carousel - AUI Carousel instance\n                    * @returns {Class} - CarouselButton Class\n                    *\/\n                    function CarouselButtonTemplate(carousel) {\n                        \/**\n                        * Button for controlling the active slide\n                        * @constructor\n                        * @param {number} index - slide index\n                        * @param {DOMElement} [elem] - optional DOM element to use as this objects DOM representation\n                        *\/\n                        function CarouselButton(index, elem) {\n                            var self = this;\n                            this.index = index;\n                            this.carousel = carousel;\n\n                            \/* create the button element *\/\n                            this.elem = this.getElem(elem);\n                            this.$elem = $(this.elem);  \/* store jquery version *\/\n                            this.elem.addEventListener('click', self.handleClick.bind(self));\n                            this.elem.setAttribute('role', 'tab');\n\n                            \/* add this object to the object manager *\/\n                            CarouselButton.objects.byId[index] = this;\n                            CarouselButton.objects.all.push(this);\n                        }\n\n                        \/**\n                        * Describe behavior for click events on this.elem\n                        * @memberOf CarouselButton\n                        *\/\n                        CarouselButton.prototype.handleClick = function(e) {\n                            e.preventDefault();\n                            this.carousel.gotoPage(this.index);\n                        };\n\n                        \/**\n                        * Enter active state\n                        * @memberOf CarouselButton\n                        *\/\n                        CarouselButton.prototype.activate = function() {\n                            this.$elem.addClass(GOTO_BTN_ACTIVE_CLASS_NAME).attr('aria-selected', 'true');\n                        };\n\n                        \/**\n                        * Enter inactive state\n                        * @memberOf CarouselButton\n                        *\/\n                        CarouselButton.prototype.deactivate = function() {\n                            this.$elem.removeClass(GOTO_BTN_ACTIVE_CLASS_NAME).attr('aria-selected', 'false');\n                        };\n\n                        \/**\n                        * Returns an existing or creates a new bound element for this object\n                        * @memberOf CarouselButton\n                        * @param {DOMElement} [elem] - optionally provide an existing element in the DOM to use\n                        * @returns {DOMElement} - this objects DOM representation\n                        *\/\n                        CarouselButton.prototype.getElem = function(elem) {\n                            if (this.elem) return this.elem;\n                            if (elem) return elem;\n\n                            var createdElem = document.createElement('span');\n                            createdElem.className = GOTO_BTN_CLASS_NAME;\n\n                            return createdElem;\n                        };\n\n                        \/** @const Object manager *\/\n                        CarouselButton.objects = {\n                            byId: {},\n                            all: [],\n                        };\n\n                        return CarouselButton;\n                    }\n\n                    framework.onInit(CAROUSEL_NAME, function(carousel) {\n                        \/** @const {Class} *\/\n                        var CarouselButton = CarouselButtonTemplate(carousel);\n\n                        \/* create carousel controls *\/\n                        var $carouselBtns = $(safeClassSelector(GOTO_BTN_CLASS_NAME));\n                        var btns = $carouselBtns.map(function(i, btnElem) {\n                            return new CarouselButton(i + 1, btnElem);\n                        });\n\n                        \/* activate first one *\/\n                        CarouselButton.objects.byId[1].activate();\n\n                        \/* Listen to slide changes *\/\n                        A.on(\"a:carousel:\" + CAROUSEL_NAME + \":change:pageNumber\", function (data) {\n                            var newCarouselButton = CarouselButton.objects.byId[data.newValue];\n                            var marginLeft = parseInt(getComputedStyle(newCarouselButton.elem).getPropertyValue('margin-left'));\n                            var positionLeft = newCarouselButton.elem.offsetLeft - marginLeft;\n\n                            newCarouselButton.activate();\n                            CarouselButton.objects.byId[data.oldValue].deactivate();\n                            scrollToCarouselButton(positionLeft);\n                            showCarouselText(data.oldValue, data.newValue);\n                        });\n                    });\n\n                    \/**\n                    * @returns {string} - css classname prefixed with module selector\n                    *\/\n                    function safeClassSelector(className) {\n                        return '.' + MODULE_CLASS_NAME + ' .' + className;\n                    }\n                }\n\n                $('.aplus-v2 .premium-aplus-module-12 .aplus-carousel-container').each(function (index, module) {\n                    initiateCarousel(module);\n                });\n                framework.createAll();\n                framework.initializeAll();\n            });\n        }\n    })\n});\n}));\n\/\/ ]]\u003e\u003c\/script\u003e\n\u003cdiv class=\"celwidget aplus-module premium-module-2-fullbackground-image aplus-premium\"\u003e\n\u003cdiv class=\"a-section a-spacing-none premium-aplus premium-aplus-module-2\"\u003e\n\u003cdiv class=\"a-section a-spacing-none premium-background-wrapper\"\u003e\n\u003cdiv class=\"a-section a-spacing-none background-image\"\u003e\n\u003cp class=\"isSelectedEnd\"\u003e\u003cstrong\u003e\u003cspan\u003eDescription:\u003c\/span\u003e\u003c\/strong\u003e\u003cbr\u003e\u003cspan\u003eA smart indoor security camera with dual lenses for wider home monitoring and reduced blind spots. It combines a fixed lens with a rotating 360° lens and supports AI-based human and pet detection, motion tracking, two-way audio, night vision, and app alerts for everyday indoor security.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp class=\"isSelectedEnd\"\u003e\u003cstrong\u003e\u003cspan\u003eSpecifications:\u003c\/span\u003e\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cspan\u003eCamera Type: Dual-lens indoor security camera\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eResolution: 6MP total, 3MP fixed lens + 3MP rotating lens\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eCoverage: 360° pan and tilt\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eNight Vision: Full-colour night vision\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eNight Vision Range: Up to 15 m \/ 49 ft\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eZoom: Up to 8×\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eDetection: Human, pet, sound, and motion detection\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eMotion Tracking: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eTwo-Way Audio: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003ePrivacy Mode: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eSiren \u0026amp; Spotlight: Yes\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eWi-Fi: 2.4 GHz only\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eStorage: Supports up to 256GB microSD card\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eCloud Storage: 30-day trial available\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eSmart Home Support: Works with Alexa\u003c\/span\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cspan\u003eRecommended Use: Baby monitoring, pet monitoring, and indoor security\u003c\/span\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\u003c\/div\u003e","brand":"Sayby’s Sanctuary ","offers":[{"title":"3MP+3MP","offer_id":56111966191881,"sku":"B0CP7GY5CS","price":32.39,"currency_code":"GBP","in_stock":true},{"title":"3MP+5MP","offer_id":56111966224649,"sku":"B0CP7GSS5Q","price":53.99,"currency_code":"GBP","in_stock":true},{"title":"2Pack 2K+2K","offer_id":56111966257417,"sku":"B0F18Y4ZWC","price":64.79,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0859\/0508\/0585\/files\/imou-dual-lens-2k2k-indoor-security-camera-house-security-camera-360full-coverage-pet-baby-camera-with-app-color-night-vision-humanpetsoundmotion-detection-sire-9535170.jpg?v=1789560842"},{"product_id":"pawfit-lite-4g-gps-cat-tracker-live-tracking-ultra-light-onyx-black","title":"Pawfit Lite 4G GPS Cat Tracker","description":"\u003cstyle type=\"text\/css\"\u003e\n    .aplus-v2 .premium-aplus-module-13 .aplus-carousel-container {\n        position: relative;\n    }\n\n    .aplus-v2 .premium-aplus-module-13 .aplus-carousel-element {\n        position: relative;\n        width: 100%;\n    }\n\n    .aplus-v2 .premium-aplus-module-13 .aplus-card-link-button {\n        text-align: center;\n        padding-top: 20px;\n    }\n\n    .aplus-v2 .premium-aplus-module-13 .aplus-text-background,\n    .aplus-v2 .premium-aplus-module-13 .aplus-text-background h1,\n    .aplus-v2 .premium-aplus-module-13 .aplus-text-background h5,\n    .aplus-v2 .premium-aplus-module-13 .aplus-text-background ol,\n    .aplus-v2 .premium-aplus-module-13 .aplus-text-background ul,\n    .aplus-v2 .premium-aplus-module-13 .aplus-text-background ol .a-list-item,\n    .aplus-v2 .premium-aplus-module-13 .aplus-text-background ul .a-list-item {\n        color: #fff;\n    }\n\n\u003c\/style\u003e\n\u003cstyle type=\"text\/css\"\u003e\n\n.aplus-v2 .premium-aplus-module-2 .premium-background-wrapper {\n    position: relative;\n}\n\n.aplus-v2 .premium-aplus-module-2 .premium-intro-wrapper {\n    position: absolute;\n    width: 50%;\n    height: 100%;\n    top: 0;\n}\n\n.aplus-v2 .premium-aplus-module-2 .premium-intro-wrapper.right {\n    left: 50%;\n}\n\nhtml[dir=\"rtl\"] .aplus-v2 .premium-aplus-module-2 .premium-intro-wrapper.right {\n    left: auto;\n    right: 50%;\n}\n\n.aplus-v2 .premium-aplus-module-2 .premium-intro-wrapper.secondary-color {\n    color: #fff;\n}\n\n.aplus-v2 .premium-aplus-module-2 .premium-intro-background {\n    padding: 20px;\n}\n\n.aplus-v2 .premium-aplus-module-2 .aplus-module-2-topic {\n    padding-bottom: 10px;\n}\n\n.aplus-v2 .premium-aplus-module-2 .aplus-module-2-heading {\n    padding-bottom: 20px;\n}\n\n.aplus-v2 .premium-aplus-module-2 .aplus-module-2-description {\n    line-height: 1.5em;\n}\n\n.aplus-v2 .premium-aplus-module-2 .premium-intro-background.white-background {\n    background: rgba(255,255,255,0.5);\n}\n\n.aplus-v2 .premium-aplus-module-2 .premium-intro-background.black-background {\n    background: rgba(0,0,0,0.5);\n}\n\n.aplus-v2 .premium-aplus-module-2 .premium-intro-background.black-background,\n.aplus-v2 .premium-aplus-module-2 .premium-intro-background.black-background h1,\n.aplus-v2 .premium-aplus-module-2 .premium-intro-background.black-background h5,\n.aplus-v2 .premium-aplus-module-2 .premium-intro-background.black-background ol,\n.aplus-v2 .premium-aplus-module-2 .premium-intro-background.black-background ul,\n.aplus-v2 .premium-aplus-module-2 .premium-intro-background.black-background ol .a-list-item,\n.aplus-v2 .premium-aplus-module-2 .premium-intro-background.black-background ul .a-list-item {\n  color: #fff;\n}\n\n.aplus-v2 .premium-aplus-module-2 .premium-intro-content-container {\n    display: table;\n    height: 100%;\n}\n\n.aplus-v2 .premium-aplus-module-2 .premium-intro-wrapper.left .premium-intro-content-container {\n    padding-left: 40px;\n}\n\nhtml[dir=\"rtl\"] .aplus-v2 .premium-aplus-module-2 .premium-intro-wrapper.left .premium-intro-content-container {\n\tpadding-left: 0px;\n\tpadding-right: 40px;\n}\n\n.aplus-v2 .premium-aplus-module-2 .premium-intro-wrapper.right .premium-intro-content-container {\n    padding-right: 40px;\n}\n\nhtml[dir=\"rtl\"] .aplus-v2 .premium-aplus-module-2 .premium-intro-wrapper.right .premium-intro-content-container {\n    padding-right: 0px;\n    padding-left: 40px;\n}\n\n.aplus-v2 .premium-aplus-module-2 .premium-intro-content-column {\n    display: table-cell;\n    vertical-align: middle;\n}\n\n\n\u003c\/style\u003e\n\u003cstyle type=\"text\/css\"\u003e\n\n\/**\n * Premium modules global styles\n *\/\n.aplus-v2.desktop {\n  max-width: 1464px;\n  min-width: 800px;\n  margin-left: auto;\n  margin-right: auto;\n  word-wrap: break-word;\n  overflow-wrap: break-word;\n  word-break: break-word;\n}\n\/* Undo this for tech-specs because it breaks table layout *\/\n.aplus-v2.desktop .premium-aplus .aplus-tech-spec-table { word-break: initial; }\n\n.aplus-v2 .premium-aplus,\n.aplus-v2 .premium-aplus .aplus-h1,\n.aplus-v2 .premium-aplus .aplus-h2,\n.aplus-v2 .premium-aplus .aplus-p1,\n.aplus-v2 .premium-aplus .aplus-p2,\n.aplus-v2 .premium-aplus .aplus-p3,\n.aplus-v2 .premium-aplus .aplus-accent1,\n.aplus-v2 .premium-aplus .aplus-accent2\n{ font-family: Arial, sans-serif; }\n\n.aplus-v2 .premium-aplus,\n.aplus-v2 .premium-aplus .aplus-h1,\n.aplus-v2 .premium-aplus .aplus-h2,\n.aplus-v2 .premium-aplus .aplus-p1,\n.aplus-v2 .premium-aplus .aplus-p2,\n.aplus-v2 .premium-aplus .aplus-p3,\n.aplus-v2 .premium-aplus .aplus-accent1,\n.aplus-v2 .premium-aplus .aplus-accent2\n{ font-family: inherit; }\n\n\/* type *\/\n.aplus-v2 .premium-aplus .aplus-h1 { font-size: 32px; line-height: 1.2em; font-weight: 500; }\n.aplus-v2 .premium-aplus .aplus-h2 { font-size: 26px; line-height: 1.25em; font-weight: 500; }\n.aplus-v2 .premium-aplus .aplus-h3 { font-size: 18px; line-height: 1.25em; font-weight: 500; }\n.aplus-v2 .premium-aplus .aplus-p1 { font-size: 20px; line-height: 1.3em; font-weight: 300; }\n.aplus-v2 .premium-aplus .aplus-p2 { font-size: 16px; line-height: 1.4em; font-weight: 300; }\n.aplus-v2 .premium-aplus .aplus-p3 { font-size: 14px; line-height: 1.4em; font-weight: 300; }\n.aplus-v2 .premium-aplus .aplus-accent1 { font-size: 16px; line-height: 1.4em; font-weight: 600; }\n.aplus-v2 .premium-aplus .aplus-accent2 { font-size: 14px; line-height: 1.4em; font-weight: 600; }\n\n\/* spacing *\/\n.aplus-v2 .aplus-container-1 { padding: 40px; }\n.aplus-v2 .aplus-container-1-2 { padding: 40px 80px; }\n.aplus-v2 .aplus-container-2 { padding: 80px; }\n.aplus-v2 .aplus-container-3 { padding: 40px 0; }\n\n\/* Display *\/\n.aplus-v2 .premium-aplus .aplus-display-table { display: table; }\n.aplus-v2 .premium-aplus .aplus-display-table-cell { display: table-cell; }\n.aplus-v2 .premium-aplus .aplus-display-inline-block { display: inline-block; }\n\n\/* Aplus display table with min-width 1000px and fill remaining space inside parent *\/\n.aplus-v2.desktop .premium-aplus .aplus-display-table-width { min-width: 1000px; width: 100% }\n\n\/**\n* Padding and margin for element should be 10, 20, 40, or 80 px. Considering mini 10, small 20, medium 40, large 80.\n*\/\n\n\u003c\/style\u003e\n\u003cstyle type=\"text\/css\"\u003e\n\n\/**\n * Premium-module 13: Carousel\n *\/\n\n.aplus-v2 .premium-aplus-module-13 .aplus-card-description-wrapper {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n}\n\n.aplus-v2 .premium-aplus-module-13 .aplus-card-description {\n    display: table;\n    width: 50%;\n    height: 100%;\n    color: #fff;\n}\n\n.aplus-v2 .premium-aplus-module-13 .aplus-card-table-cell {\n    display: table-cell;\n    vertical-align: middle;\n    text-align: left;\n}\n\nhtml[dir=\"rtl\"] .aplus-v2 .premium-aplus-module-13 .aplus-card-table-cell {\n    text-align: right;\n}\n\n.aplus-v2 .premium-aplus-module-13 .aplus-text-background {\n    background: rgba(0, 0, 0, 0.6);\n}\n\n.aplus-v2 .premium-aplus-module-13 .aplus-card-body {\n    padding: 20px 40px 0 0;\n}\n\nhtml[dir=\"rtl\"] .aplus-v2 .premium-aplus-module-13 .aplus-card-body {\n    padding: 20px 0 0 40px;\n}\n\n.aplus-v2 .premium-aplus-module-13 .aplus-pagination-wrapper {\n    position: absolute;\n    top: 92%;\n    width: 100%;\n}\n\n\u003c\/style\u003e\n\u003cdiv\u003e\n\u003cdiv lang=\"en_GB\"\u003e\n\u003cdiv class=\"aplus-v2 desktop celwidget\"\u003e\n\u003cdiv class=\"aplus-content-wrapper\"\u003e\n\u003cdiv class=\"celwidget aplus-module premium-module-2-fullbackground-image aplus-premium\"\u003e\n\u003cdiv class=\"a-section a-spacing-none premium-aplus premium-aplus-module-2\"\u003e\n\u003cdiv class=\"a-section a-spacing-none premium-background-wrapper\"\u003e\n\u003cdiv class=\"a-section a-spacing-none background-image\"\u003e\n\u003cp\u003e\u003cstrong\u003eDescription\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eKeep track of your cat with live GPS location updates through a mobile app. The lightweight tracker includes a breakaway collar, waterproof construction and an LED light for improved visibility in low light. Set virtual safe zones, receive escape alerts and monitor daily activity with 24-hour location history. A subscription is required for mobile data and tracking services.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eSpecifications\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eBuilt-in GPS with multiple satellite systems\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003e4G connectivity with an integrated multi-network SIM\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003eTracking across supported regions, including Europe and North America, wherever mobile network coverage is available\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003eVirtual safe zones and escape notifications\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003eDaily activity monitoring and personalised exercise goals\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003e24-hour location history\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003eBuilt-in LED light\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003eTracker weight: Less than 18g\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003eIncludes a breakaway safety collar\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003eWaterproof construction\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003eBattery: 400mAh lithium polymer\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003eCompatible operating system: Android\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003eShape: Rectangular\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cp\u003eSubscription required; monthly and longer-term plans available\u003c\/p\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cstyle type=\"text\/css\"\u003e\n\n.aplus-mantle.aplus-module .aplus-pagination-dots {\n    margin: 0;\n}\n\n.aplus-mantle.aplus-module .aplus-pagination-dot {\n    display: inline-block;\n    list-style: none;\n}\n\n.aplus-mantle.aplus-module .aplus-carousel-nav {\n    text-align:center;\n}\n\n.aplus-mantle.aplus-module .carousel-slider-circle {\n    display: inline-block;\n    cursor: pointer;\n    height: 15px;\n    width: 15px;\n    border: 1px solid #000;\n    border-radius: 20px;\n    background-color: #fff;\n    margin-left: 5px;\n}\n\n.aplus-mantle.aplus-module .carousel-slider-circle.aplus-carousel-active {\n    background-color: #DE7921;\n}\n\n.aplus-mantle.aplus-module .aplus-pagination-dot--display-none {\n    display: none;\n}\n\n\u003c\/style\u003e","brand":"Sayby’s","offers":[{"title":"Onyx black","offer_id":57341728915721,"sku":"B0F1TY598T","price":45.36,"currency_code":"GBP","in_stock":true},{"title":"Simply white","offer_id":57341728948489,"sku":"B0F1TVPBKH","price":48.6,"currency_code":"GBP","in_stock":true},{"title":"Lilac grey","offer_id":57341728981257,"sku":"B0FDR5VCW2","price":45.36,"currency_code":"GBP","in_stock":true},{"title":"Charcoal grey","offer_id":57341729014025,"sku":"B0F1TTC6NR","price":45.36,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0859\/0508\/0585\/files\/71sWK7OpC3L._AC_SL1500.jpg?v=1789672045"},{"product_id":"2-in-1-cat-tracker-collar-reflective-dog-tracker-with-no-monthly-fees-supports-real-time-tracking-anti-loss-ios-android-includes-adjustable-collar-with-bell-suitable-for-small-dogs-cats-black","title":"2-in-1 Cat \u0026 Dog Tracker Collar","description":"","brand":"Sayby’s","offers":[{"title":"Black","offer_id":57342785028361,"sku":"B0HF4XX7Z1","price":32.39,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0859\/0508\/0585\/files\/81N3HsTruxL._AC_SL1500.jpg?v=1789718167"}],"url":"https:\/\/www.saybys.com\/collections\/security-cameras.oembed","provider":"Sayby’s","version":"1.0","type":"link"}