{"id":3418,"date":"2026-02-21T17:26:18","date_gmt":"2026-02-21T17:26:18","guid":{"rendered":"https:\/\/housefly1stg.wpenginepowered.com\/service-find\/"},"modified":"2026-04-16T23:20:41","modified_gmt":"2026-04-16T23:20:41","slug":"service-find","status":"publish","type":"page","link":"https:\/\/housefly.com\/es\/service-find\/","title":{"rendered":"Service Find"},"content":{"rendered":"    <div class=\"hf-find-wrap\">\n        <form id=\"hf-find-form\" method=\"post\" action=\"https:\/\/housefly.com\/wp-admin\/admin-post.php\">\n                        <input type=\"hidden\" name=\"action\" value=\"hf_find_fallback\" \/>\n            <input type=\"hidden\" id=\"hf_selected_service_id\" name=\"selected_service_id\" value=\"\" \/>\n            <input type=\"hidden\" id=\"hf_selected_service_flow\" name=\"selected_service_flow\" value=\"\" \/>\n            <input type=\"hidden\" id=\"hf_customer_base_url\" value=\"https:\/\/housefly.com\" \/>\n            <input type=\"hidden\" id=\"hf_redirect_sig\" value=\"eyJrIjoiMzJmYmUyNmI3NThmMmJiYjBlODM0OWM0IiwidCI6MTc5MDE1OTgzNX0.eVqyzZxQThW2xz4RlxuR_EzTgBN-4zOTGeeMw3l7yXM\" \/>\n\n                            <div class=\"hf-address-row\">\n        <div class=\"hf-address-field\">\n            <svg class=\"hf-input-icon\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"8\"><\/circle><path d=\"m21 21-4.35-4.35\"><\/path><\/svg>\n            <input\n                id=\"hf_address\"\n                name=\"address\"\n                type=\"text\"\n                class=\"hf-address-input\"\n                placeholder=\"What service do you need?\"\n                autocomplete=\"off\"\n            \/>\n        <\/div>\n        <div\n            id=\"hf-search-suggestions\"\n            class=\"hf-search-suggestions\"\n            style=\"display: none;\">\n        <\/div>\n    <\/div>\n    <style>    .hf-address-row {\n        position: relative;\n    }\n    .hf-address-field {\n        position: relative;\n        display: flex;\n        align-items: center;\n        height: 100%;\n        gap: 10px;\n        padding-left: 20px;\n    }\n    .hf-input-icon {\n        flex-shrink: 0;\n        line-height: 1;\n        color: #8da0ac;\n        pointer-events: none;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n    }\n    .hf-search-suggestions {\n        position: absolute;\n        top: calc(100% + 10px);\n        left: 0;\n        right: 0;\n        background: #fff;\n        border: 1px solid #d9e2e8;\n        border-radius: 12px;\n        max-height: 420px;\n        overflow-y: auto;\n        z-index: 1000;\n        box-shadow: 0 10px 30px rgba(16, 42, 67, 0.14);\n    }\n    .hf-search-suggestions .suggestion-item {\n        padding: 12px 16px;\n        cursor: pointer;\n        transition: background-color 0.2s;\n        color: #1a1a1a;\n        font-weight: 500;\n        font-size: 15px;\n        text-align: left;\n    }\n    .hf-search-suggestions .suggestion-item:hover {\n        background-color: #f2f8fc;\n    }\n    .hf-search-suggestions .suggestion-keyword {\n        display: none;\n        font-size: 11px;\n        color: #666;\n        margin-top: 4px;\n        font-weight: 400;\n    }\n    .hf-search-suggestions .no-results {\n        padding: 15px;\n        text-align: center;\n        color: #999;\n        font-size: 14px;\n    }<\/style>    <script>\n    (function() {\n        'use strict';\n\n        function hfFindNode(node, targetId, targetType) {\n            if (!node || typeof node !== 'object') {\n                return null;\n            }\n\n            if (node.id === targetId && node.type === targetType) {\n                return node;\n            }\n\n            if (!Array.isArray(node.children)) {\n                return null;\n            }\n\n            for (const child of node.children) {\n                const found = hfFindNode(child, targetId, targetType);\n                if (found) {\n                    return found;\n                }\n            }\n\n            return null;\n        }\n\n        function hfGetAllServices(node) {\n            if (!node || typeof node !== 'object') {\n                return [];\n            }\n\n            let services = [];\n\n            if (node.type === 'service') {\n                services.push(node);\n            }\n\n            if (Array.isArray(node.children)) {\n                node.children.forEach(child => {\n                    services = services.concat(hfGetAllServices(child));\n                });\n            }\n\n            return services;\n        }\n\n        function hfEscapeHtml(text) {\n            const map = {\n                '&': '&amp;',\n                '<': '&lt;',\n                '>': '&gt;',\n                '\"': '&quot;',\n                \"'\": '&#039;'\n            };\n\n            return String(text ?? '').replace(\/[&<>\"']\/g, function(char) {\n                return map[char];\n            });\n        }\n\n        document.addEventListener('DOMContentLoaded', function() {\n            const searchInput = document.getElementById('hf_address');\n            if (!searchInput) return; \/\/ Exit if element not found\n\n            const suggestionsContainer = document.getElementById('hf-search-suggestions');\n            const jsonUrls = [\"https:\\\/\\\/housefly.com\\\/wp-content\\\/plugins\\\/hf-booking\\\/data\\\/search-cleaning.json\",\"https:\\\/\\\/housefly.com\\\/wp-content\\\/plugins\\\/hf-booking\\\/data\\\/search-electric.json\",\"https:\\\/\\\/housefly.com\\\/wp-content\\\/plugins\\\/hf-booking\\\/data\\\/search-fencing.json\",\"https:\\\/\\\/housefly.com\\\/wp-content\\\/plugins\\\/hf-booking\\\/data\\\/search-flooring.json\",\"https:\\\/\\\/housefly.com\\\/wp-content\\\/plugins\\\/hf-booking\\\/data\\\/search-handyman.json\",\"https:\\\/\\\/housefly.com\\\/wp-content\\\/plugins\\\/hf-booking\\\/data\\\/search-home-inspection.json\",\"https:\\\/\\\/housefly.com\\\/wp-content\\\/plugins\\\/hf-booking\\\/data\\\/search-lawn-care.json\",\"https:\\\/\\\/housefly.com\\\/wp-content\\\/plugins\\\/hf-booking\\\/data\\\/search-moving.json\",\"https:\\\/\\\/housefly.com\\\/wp-content\\\/plugins\\\/hf-booking\\\/data\\\/search-painting.json\",\"https:\\\/\\\/housefly.com\\\/wp-content\\\/plugins\\\/hf-booking\\\/data\\\/search-photo-and-marketing.json\",\"https:\\\/\\\/housefly.com\\\/wp-content\\\/plugins\\\/hf-booking\\\/data\\\/search-plumbing.json\"];\n            let searchTimeout;\n            let serviceData = null;\n\n            \/**\n             * Load and merge JSON service data from all files\n             *\/\n            function loadServiceData() {\n                const requests = (Array.isArray(jsonUrls) ? jsonUrls : []).map(url =>\n                    fetch(url)\n                        .then(response => response.json())\n                        .catch(() => null)\n                );\n\n                Promise.all(requests)\n                    .then(payloads => {\n                        const merged = {\n                            services: [],\n                            keyword_map: []\n                        };\n\n                        payloads.forEach(payload => {\n                            if (!payload || typeof payload !== 'object') {\n                                return;\n                            }\n\n                            if (Array.isArray(payload.services)) {\n                                merged.services.push(...payload.services);\n                            } else if (payload.services && typeof payload.services === 'object') {\n                                merged.services.push(payload.services);\n                            }\n\n                            if (Array.isArray(payload.keyword_map)) {\n                                merged.keyword_map.push(...payload.keyword_map);\n                            }\n                        });\n\n                        serviceData = merged;\n                    })\n                    .catch(error => console.warn('Failed to load service data:', error));\n            }\n\n            \/**\n             * Search in service tree by name (groups and services)\n             * Returns matches with priority flag and root info\n             *\/\n            function searchInServiceTree(node, query, rootId = '', rootName = '') {\n                if (!node || typeof node !== 'object') return [];\n\n                const results = [];\n                const lowerQuery = query.toLowerCase();\n                \n                \/\/ Track root if this is a root node\n                if (node.type === 'root') {\n                    rootId = node.id || '';\n                    rootName = node.name || '';\n                }\n\n                \/\/ Check if current node matches\n                if (node.name && node.name.toLowerCase().includes(lowerQuery)) {\n                    if (node.type === 'group' && Array.isArray(node.children)) {\n                        \/\/ Group match: return all child services\n                        node.children.forEach(child => {\n                            if (child.type === 'service') {\n                                results.push({\n                                    name: child.name,\n                                    id: child.id,\n                                    serviceId: child.service_id || child.id,\n                                    flow: child.flow || '',\n                                    priority: true,\n                                    matchType: 'priority-group',\n                                    matchInfo: node.name,\n                                    rootId: rootId,\n                                    rootName: rootName\n                                });\n                            }\n                        });\n                    } else if (node.type === 'service') {\n                        \/\/ Service match: return the service itself\n                        results.push({\n                            name: node.name,\n                            id: node.id,\n                            serviceId: node.service_id || node.id,\n                            flow: node.flow || '',\n                            priority: true,\n                            matchType: 'priority-service',\n                            matchInfo: node.name,\n                            rootId: rootId,\n                            rootName: rootName\n                        });\n                    }\n                }\n\n                \/\/ Recursively search children\n                if (Array.isArray(node.children)) {\n                    node.children.forEach(child => {\n                        const childResults = searchInServiceTree(child, query, rootId, rootName);\n                        results.push(...childResults);\n                    });\n                }\n\n                return results;\n            }\n\n            \/**\n             * Main local search function\n             * Searches in service names first (priority), then in keyword_map\n             *\/\n            function searchServices(query) {\n                if (!serviceData || !Array.isArray(serviceData.services) || serviceData.services.length === 0) {\n                    return [];\n                }\n\n                const priorityResults = [];\n                const regularResults = [];\n                const seenResultIds = new Set();\n\n                \/\/ 1. Search in service tree by name (priority)\n                const treeMatches = [];\n                serviceData.services.forEach(rootNode => {\n                    treeMatches.push(...searchInServiceTree(rootNode, query));\n                });\n                treeMatches.forEach(item => {\n                    const key = String(item.id || '');\n                    if (key && !seenResultIds.has(key)) {\n                        seenResultIds.add(key);\n                        priorityResults.push(item);\n                    }\n                });\n\n                \/\/ 2. Search in keyword_map\n                if (Array.isArray(serviceData.keyword_map)) {\n                    const matchedKeywords = serviceData.keyword_map.filter(item => \n                        item.keyword.toLowerCase().startsWith(query.toLowerCase())\n                    );\n\n                    const processedIds = new Set();\n\n                    for (const keyword of matchedKeywords) {\n                        const keyCombo = `${keyword.type}:${keyword.target_id}`;\n                        if (processedIds.has(keyCombo)) continue;\n                        processedIds.add(keyCombo);\n\n                        let node = null;\n                        serviceData.services.some(rootNode => {\n                            node = hfFindNode(rootNode, keyword.target_id, keyword.type);\n                            return !!node;\n                        });\n                        if (!node) continue;\n\n                        if (keyword.type === 'root') {\n                            let allServices = hfGetAllServices(node);  \/\/ node is already the target root found by hfFindNode\n                            allServices.forEach(svc => {\n                                const key = String(svc.id || '');\n                                if (key && !seenResultIds.has(key)) {\n                                    seenResultIds.add(key);\n                                    regularResults.push({\n                                        name: svc.name,\n                                        id: svc.id,\n                                        serviceId: svc.service_id || svc.id,\n                                        flow: svc.flow || '',\n                                        priority: false,\n                                        matchType: 'keyword-root',\n                                        matchInfo: keyword.keyword,\n                                        targetId: keyword.target_id\n                                    });\n                                }\n                            });\n                        } else if (keyword.type === 'group') {\n                            if (node.children) {\n                                node.children.forEach(child => {\n                                    const key = String(child.id || '');\n                                    if (child.type === 'service' && key && !seenResultIds.has(key)) {\n                                        seenResultIds.add(key);\n                                        regularResults.push({\n                                            name: child.name,\n                                            id: child.id,\n                                            serviceId: child.service_id || child.id,\n                                            flow: child.flow || '',\n                                            priority: false,\n                                            matchType: 'keyword-group',\n                                            matchInfo: keyword.keyword,\n                                            targetId: keyword.target_id\n                                        });\n                                    }\n                                });\n                            }\n                        } else if (keyword.type === 'service') {\n                            const key = String(node.id || '');\n                            if (key && !seenResultIds.has(key)) {\n                                seenResultIds.add(key);\n                                regularResults.push({\n                                    name: node.name,\n                                    id: node.id,\n                                    serviceId: node.service_id || node.id,\n                                    flow: node.flow || '',\n                                    priority: false,\n                                    matchType: 'keyword-service',\n                                    matchInfo: keyword.keyword,\n                                    targetId: keyword.target_id\n                                });\n                            }\n                        }\n                    }\n                }\n\n                \/\/ Combine: priority first, then regular\n                const allResults = [...priorityResults, ...regularResults];\n\n                return allResults;\n            }\n\n            \/\/ Input change event with debounce\n            searchInput.addEventListener('input', function() {\n                const query = this.value.trim();\n\n                if (searchTimeout) clearTimeout(searchTimeout);\n\n                \/\/ Only search if query has at least 1 character\n                if (query.length < 1) {\n                    suggestionsContainer.style.display = 'none';\n                    suggestionsContainer.innerHTML = '';\n                    return;\n                }\n\n                \/\/ Debounce search by 150ms\n                searchTimeout = setTimeout(() => {\n                    const results = searchServices(query);\n                    if (results.length > 0) {\n                        hfDisplayResults(results, suggestionsContainer, searchInput);\n                    } else {\n                        suggestionsContainer.innerHTML = '<div class=\"no-results\">No services found<\/div>';\n                        suggestionsContainer.style.display = 'block';\n                    }\n                }, 150);\n            });\n\n            \/\/ Close suggestions when clicking outside\n            document.addEventListener('click', function(e) {\n                if (!e.target.closest('.hf-address-row')) {\n                    suggestionsContainer.style.display = 'none';\n                }\n            });\n\n            \/\/ Load service data on initialization\n            loadServiceData();\n        });\n\n        \/**\n         * Global helper: Display search results in dropdown\n         *\/\n        window.hfDisplayResults = function(results, container, input) {\n            let html = '';\n            results.forEach(item => {\n                const name = hfEscapeHtml(item.name);\n                const encodedServiceId = encodeURIComponent(item.serviceId || item.id || '');\n                const encodedFlow = encodeURIComponent(item.flow || '');\n                let debugInfo = '';\n                \n                if (item.matchType === 'priority-group') {\n                    debugInfo = `<div class=\"suggestion-keyword\">\u2713 Priority: Group match (${hfEscapeHtml(item.matchInfo)}) - Group: ${hfEscapeHtml(item.targetId)} - Root: ${hfEscapeHtml(item.rootName)}<\/div>`;\n                } else if (item.matchType === 'priority-service') {\n                    debugInfo = `<div class=\"suggestion-keyword\">\u2713 Priority: Service name match - Service: ${hfEscapeHtml(item.targetId)} - Root: ${hfEscapeHtml(item.rootName)}<\/div>`;\n                } else if (item.matchType === 'keyword-group') {\n                    debugInfo = `<div class=\"suggestion-keyword\">Keyword: \"${hfEscapeHtml(item.matchInfo)}\" \u2192 Group: ${hfEscapeHtml(item.targetId)}<\/div>`;\n                } else if (item.matchType === 'keyword-service') {\n                    debugInfo = `<div class=\"suggestion-keyword\">Keyword: \"${hfEscapeHtml(item.matchInfo)}\" \u2192 Service: ${hfEscapeHtml(item.targetId)}<\/div>`;\n                } else if (item.matchType === 'keyword-root') {\n                    debugInfo = `<div class=\"suggestion-keyword\">Keyword: \"${hfEscapeHtml(item.matchInfo)}\" \u2192 Root: ${hfEscapeHtml(item.targetId)}<\/div>`;\n                }\n                \n                html += `<div class=\"suggestion-item\" data-service-name=\"${name}\" data-service-id=\"${encodedServiceId}\" data-service-flow=\"${encodedFlow}\"><div>${name}<\/div>${debugInfo}<\/div>`;\n            });\n            container.innerHTML = html;\n            container.style.display = 'block';\n\n            \/\/ Add click handlers to items\n            container.querySelectorAll('.suggestion-item').forEach(item => {\n                item.addEventListener('click', function() {\n                    input.value = this.getAttribute('data-service-name');\n                    container.innerHTML = '';\n                    container.style.display = 'none';\n                    const selectedServiceId = decodeURIComponent(this.getAttribute('data-service-id') || '');\n                    const selectedFlow = decodeURIComponent(this.getAttribute('data-service-flow') || '');\n                    \n                    \/\/ Mark service as selected for validation\n                    if (typeof window.hfMarkServiceSelected === 'function') {\n                        window.hfMarkServiceSelected({\n                            serviceId: selectedServiceId,\n                            flow: selectedFlow,\n                            name: this.getAttribute('data-service-name') || ''\n                        });\n                    }\n                });\n            });\n        };\n    })();\n    <\/script>\n    \n            <div class=\"hf-zip-row\">\n                <div class=\"hf-zip-field\">\n                    <svg class=\"hf-input-icon hf-input-icon-zip\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M20 10c0 6-8 13-8 13s-8-7-8-13a8 8 0 0 1 16 0Z\"><\/path><circle cx=\"12\" cy=\"10\" r=\"3\"><\/circle><\/svg>\n                    <input\n                        id=\"hf_zip\"\n                        name=\"search_zipcode\"\n                        type=\"text\"\n                        class=\"hf-zip-input\"\n                        placeholder=\"ZIP Code\"\n                    \/>\n                <\/div>\n                <button type=\"submit\" class=\"hf-see-pricing\">\n                    <svg class=\"hf-btn-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"8\"><\/circle><path d=\"m21 21-4.35-4.35\"><\/path><\/svg>\n                    Search                <\/button>\n            <\/div>\n            <div id=\"hf-zip-error\" class=\"hf-zip-error\" style=\"display: none;\"><\/div>\n\n            <!-- Honeypot field to prevent spam -->\n            <div style=\"display:none;\">\n                <label>Leave this empty<\/label>\n                <input name=\"hf_hp\" type=\"text\" value=\"\" \/>\n            <\/div>\n        <\/form>\n        \n        <style>\n            .hf-zip-error {\n                position: absolute;\n                top: calc(100% + 8px);\n                left: 0;\n                z-index: 20;\n                color: #d63638;\n                font-size: 14px;\n                margin-top: 0;\n                padding: 8px 12px;\n                background-color: #fcf0f1;\n                border: 1px solid #f5c6cb;\n                border-radius: 4px;\n                box-shadow: 0 4px 12px rgba(214, 54, 56, 0.15);\n            }\n            .hf-zip-input.error,\n            .hf-address-input.error {\n                background-color: transparent !important;\n            }\n            .hf-address-field.error,\n            .hf-zip-field.error {\n                background-color: #fff5f5;\n            }\n            .hf-address-field.error {\n                border-radius: 12px 0 0 12px !important;\n            }\n            @media (max-width: 480px) {\n                .hf-address-field.error {\n                    border-radius: 10px !important;\n                }\n            }\n        <\/style>\n        \n        <script>\n        (function() {\n            'use strict';\n            \n            \/\/ Track if user has selected a service from dropdown\n            let serviceSelected = false;\n            let selectedServiceData = null;\n            \n            document.addEventListener('DOMContentLoaded', function() {\n                const form = document.getElementById('hf-find-form');\n                const zipInput = document.getElementById('hf_zip');\n                const addressInput = document.getElementById('hf_address');\n                const errorDiv = document.getElementById('hf-zip-error');\n                const selectedIdInput = document.getElementById('hf_selected_service_id');\n                const selectedFlowInput = document.getElementById('hf_selected_service_flow');\n                const customerBaseInput = document.getElementById('hf_customer_base_url');\n                const sigInput = document.getElementById('hf_redirect_sig');\n                \n                if (!form || !zipInput || !addressInput || !errorDiv || !selectedIdInput || !selectedFlowInput || !customerBaseInput || !sigInput) return;\n                \n                \/**\n                 * Validate US zip code format\n                 * Accepts: 12345 or 12345-6789\n                 *\/\n                function isValidZipCode(zip) {\n                    const trimmed = zip.trim();\n                    \/\/ US zip: 5 digits or 5+4 format\n                    const zipPattern = \/^\\d{5}(-\\d{4})?$\/;\n                    return zipPattern.test(trimmed);\n                }\n                \n                function showError(message, inputElement) {\n                    errorDiv.textContent = message;\n                    errorDiv.style.display = 'block';\n                    if (inputElement) {\n                        const fieldWrap = inputElement.closest('.hf-address-field, .hf-zip-field');\n                        inputElement.classList.add('error');\n                        if (fieldWrap) {\n                            fieldWrap.classList.add('error');\n                        }\n                        inputElement.focus();\n                    }\n                }\n                \n                function clearError() {\n                    errorDiv.textContent = '';\n                    errorDiv.style.display = 'none';\n                    zipInput.classList.remove('error');\n                    addressInput.classList.remove('error');\n                    const addressField = addressInput.closest('.hf-address-field');\n                    const zipField = zipInput.closest('.hf-zip-field');\n                    if (addressField) {\n                        addressField.classList.remove('error');\n                    }\n                    if (zipField) {\n                        zipField.classList.remove('error');\n                    }\n                }\n                \n                \/\/ Clear error on input\n                zipInput.addEventListener('input', function() {\n                    if (errorDiv.style.display !== 'none') {\n                        clearError();\n                    }\n                });\n                \n                addressInput.addEventListener('input', function() {\n                    \/\/ Reset service selection when user modifies input\n                    serviceSelected = false;\n                    selectedServiceData = null;\n                    selectedIdInput.value = '';\n                    selectedFlowInput.value = '';\n                    if (errorDiv.style.display !== 'none') {\n                        clearError();\n                    }\n                });\n                \n                \/\/ Mark service as selected when clicked from dropdown\n                window.hfMarkServiceSelected = function(payload) {\n                    serviceSelected = true;\n                    selectedServiceData = payload || null;\n                    selectedIdInput.value = payload && payload.serviceId ? payload.serviceId : '';\n                    selectedFlowInput.value = payload && payload.flow ? payload.flow : '';\n                };\n                \n                \/\/ Validate on form submit\n                form.addEventListener('submit', function(e) {\n                    const zipValue = zipInput.value.trim();\n                    const addressValue = addressInput.value.trim();\n                    \n                    \/\/ Check if address\/service is empty\n                    if (addressValue === '') {\n                        e.preventDefault();\n                        showError('Please enter a service or address', addressInput);\n                        return false;\n                    }\n                    \n                    \/\/ Check if service was selected from dropdown\n                    if (!serviceSelected) {\n                        e.preventDefault();\n                        showError('Please select a service from the suggestion list', addressInput);\n                        return false;\n                    }\n\n                    if (!selectedServiceData || !selectedServiceData.serviceId) {\n                        e.preventDefault();\n                        showError('Selected service is invalid. Please choose again.', addressInput);\n                        return false;\n                    }\n\n                    if (!\/^\\d+$\/.test(String(selectedServiceData.serviceId))) {\n                        e.preventDefault();\n                        showError('Service ID must be numeric. Please update JSON mapping.', addressInput);\n                        return false;\n                    }\n                    \n                    \/\/ Check if zip is empty\n                    if (zipValue === '') {\n                        e.preventDefault();\n                        showError('Please enter a zip code', zipInput);\n                        return false;\n                    }\n                    \n                    \/\/ Check zip format\n                    if (!isValidZipCode(zipValue)) {\n                        e.preventDefault();\n                        showError('Please enter a valid zip code (e.g., 12345 or 12345-6789)', zipInput);\n                        return false;\n                    }\n                    \n                    \/\/ Valid - clear any previous errors\n                    clearError();\n\n                    \/\/ JS mode: redirect using legacy Laravel path.\n                    e.preventDefault();\n                    try {\n                        const baseUrl = customerBaseInput.value || window.location.origin;\n                        let path = `\/account\/customer\/services\/find\/${encodeURIComponent(selectedServiceData.serviceId)}`;\n                        const sig = (sigInput.value || '').trim();\n                        if (sig) {\n                            path += `\/${encodeURIComponent(sig)}`;\n                        }\n\n                        const redirectUrl = new URL(path, `${baseUrl}\/`);\n\n                        redirectUrl.searchParams.set('search_zipcode', zipValue);\n                        redirectUrl.searchParams.set('zip_code', zipValue);\n                        if (selectedServiceData.flow) {\n                            \/\/ Encode flow to base64 for URL\n                            const flowBase64 = btoa(selectedServiceData.flow);\n                            redirectUrl.searchParams.set('flow', flowBase64);\n                        }\n\n                        window.location.href = redirectUrl.toString();\n                        return false;\n                    } catch (err) {\n                        showError('Unable to build redirect URL. Please try again.', addressInput);\n                        return false;\n                    }\n                });\n            });\n        })();\n        <\/script>\n    <\/div>\n    \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":6,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-3418","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.5 (Yoast SEO v28.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Service Find - House Fly<\/title>\n<meta name=\"description\" content=\"Find and book trusted home service pros in your area. Plumbing, electrical, fencing, lawn care, and more, with upfront pricing and instant booking.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/housefly.com\/es\/service-find\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Service Find\" \/>\n<meta property=\"og:description\" content=\"Find and book trusted home service pros in your area. Plumbing, electrical, fencing, lawn care, and more, with upfront pricing and instant booking.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/housefly.com\/es\/service-find\/\" \/>\n<meta property=\"og:site_name\" content=\"House Fly\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/houseflyapp\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-16T23:20:41+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@houseflyapp\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Service Find - House Fly","description":"Find and book trusted home service pros in your area. Plumbing, electrical, fencing, lawn care, and more, with upfront pricing and instant booking.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/housefly.com\/es\/service-find\/","og_locale":"es_MX","og_type":"article","og_title":"Service Find","og_description":"Find and book trusted home service pros in your area. Plumbing, electrical, fencing, lawn care, and more, with upfront pricing and instant booking.","og_url":"https:\/\/housefly.com\/es\/service-find\/","og_site_name":"House Fly","article_publisher":"https:\/\/www.facebook.com\/houseflyapp","article_modified_time":"2026-04-16T23:20:41+00:00","twitter_card":"summary_large_image","twitter_site":"@houseflyapp","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/housefly.com\/service-find\/","url":"https:\/\/housefly.com\/service-find\/","name":"Service Find - House Fly","isPartOf":{"@id":"https:\/\/housefly.com\/#website"},"datePublished":"2026-02-21T17:26:18+00:00","dateModified":"2026-04-16T23:20:41+00:00","description":"Find and book trusted home service pros in your area. Plumbing, electrical, fencing, lawn care, and more, with upfront pricing and instant booking.","breadcrumb":{"@id":"https:\/\/housefly.com\/service-find\/#breadcrumb"},"inLanguage":"es-MX","potentialAction":[{"@type":"ReadAction","target":["https:\/\/housefly.com\/service-find\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/housefly.com\/service-find\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/housefly.com\/"},{"@type":"ListItem","position":2,"name":"Service Find"}]},{"@type":"WebSite","@id":"https:\/\/housefly.com\/#website","url":"https:\/\/housefly.com\/","name":"House Fly","description":"App M\u00f3vil de Servicios para el Hogar Bajo Demanda","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/housefly.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es-MX"}]}},"_links":{"self":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/3418","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/comments?post=3418"}],"version-history":[{"count":0,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/3418\/revisions"}],"wp:attachment":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/media?parent=3418"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}