{"id":27487,"date":"2026-02-11T16:31:44","date_gmt":"2026-02-11T19:31:44","guid":{"rendered":"https:\/\/rutiniwines.com\/bottle-authentication\/"},"modified":"2026-03-04T12:23:34","modified_gmt":"2026-03-04T15:23:34","slug":"bottle-authentication","status":"publish","type":"page","link":"https:\/\/rutiniwines.com\/en\/bottle-authentication\/","title":{"rendered":"Bottle Authentication"},"content":{"rendered":"\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-1da25be7 wp-block-columns-is-layout-flex\" id=\"vinos-box\" style=\"margin-bottom:0;padding-top:var(--wp--preset--spacing--80);padding-bottom:0\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h1 class=\"wp-block-heading has-text-align-center animated fadeInUp\">Bottle Authentication<\/h1>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"wp-block-columns margin-b-vinos is-layout-flex wp-container-core-columns-is-layout-159f51c6 wp-block-columns-is-layout-flex\" id=\"vinos-box\" style=\"margin-top:0\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-columns are-vertically-aligned-center animated fadeIn is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" id=\"col-in-vino\">\n<div class=\"wp-block-column is-vertically-aligned-center pad-box-in is-layout-flow wp-block-column-is-layout-flow\">\n<h3 class=\"wp-block-heading has-medium-font-size\" style=\"text-transform:uppercase\"><strong>Enter the alphanumeric code shown on your bottle\u2019s authentication seal.<\/strong><\/h3>\n\n\n\n<div class=\"form-section\" id=\"form-container-main\">\n    <form method=\"post\" onsubmit=\"handleSubmit(event)\">\n        <div class=\"rutini-form-container\">\n            <input type=\"text\" id=\"tagNumberInput\" name=\"tagNumber\" class=\"rutini-input\" placeholder=\"Enter your code\" onfocus=\"hiddenInvalid()\" autocomplete=\"off\"\/>\n            \n            <input type=\"hidden\" name=\"Lang\" id=\"LangInput\"\/>\n            <input type=\"hidden\" name=\"sessionId\" id=\"sessionIdInput\"\/>\n\n            <button type=\"submit\" id=\"edit-submit\" class=\"rutini-btn\">\n Verify\n            <\/button>\n        <\/div>\n\n        <div id=\"container-info-error\">\n            <h3>Invalid code. Please try again. <\/h3>\n        <\/div>\n    <\/form>\n<\/div>\n\n<div id=\"info-codigo\">\n    \n    <div class=\"loader\"><\/div>\n    \n    <div id=\"contenido-response\" class=\"content\">\n        \n        <div id=\"container-iframe-errors\">\n            <h5 id=\"title-error\" style=\"color: #a89166; text-align:center; margin-bottom: 15px;\"><\/h5>\n            <h5 id=\"lockout-notice\" style=\"color: red !important; display: none; text-align:center;\">\n This code has been blocked for 5 minutes. Please try again later. \n            <\/h5>\n            <iframe id=\"error-iframe\" src=\"\" frameborder=\"0\" style=\"width:100%; min-height:400px;\"><\/iframe>\n        <\/div>\n\n        <div id=\"content-response\" class=\"content-response\">\n            <div id=\"container-info-success\" class=\"col-info\">\n\n                <div style=\"display: flex; align-items: flex-start; gap: 20px; margin-bottom: 30px;\">\n                    <h1 class=\"ref-title\">THE SEAL FOR THIS BOTTLE IS:<\/h1>\n                    <div class=\"tag-wrapper\" style=\"margin: 0; display: flex; flex-direction: column; align-items: center;\">\n                        <img decoding=\"async\" id=\"image_tag_64\" src=\"\" alt=\"Bubble Tag\" style=\"max-width: 180px; padding: 5px; border: 1px solid #e5e5e5; border-radius: 4px;\"\/>\n                        <p class=\"ref-number\" style=\"margin-top: 12px; margin-bottom: 0;\"> <span id=\"num_tag\"><\/span><\/p>\n                    <\/div>\n                <\/div>\n                \n                <p class=\"instruction-text\">\n Please look closely at the seal displayed on the screen<br\/> Compare the shape, size, and position of the bubbles with the label on your bottle. Make sure the design of both seals matches. Check that the seal is firmly attached to the bottle and undamaged.  \n                <\/p>\n                \n                <p class=\"authenticity-text\">\n The presence of an intact and matching seal guarantees the authenticity of the bottle.\n                <\/p>\n            <\/div>\n            \n            <div class=\"col-img\">\n                <img decoding=\"async\" id=\"image_tag_64_bottleshot\" src=\"\" alt=\"Bottle\" class=\"bottle-img\"\/>\n            <\/div>\n        <\/div>\n\n        <div id=\"wine-description-section\" class=\"wine-desc-container\">\n            <hr class=\"rutini-divider\"\/>\n            <div class=\"wine-desc-content\">\n                <h2 id=\"prd_name\"><\/h2>\n                <div class=\"gold-line\"><\/div>\n                <div id=\"desc\"><\/div>\n                <a id=\"prd_url\" href=\"\" target=\"_blank\">\n                    <button class=\"rutini-btn-outline\">More Information<\/button>\n                <\/a>\n            <\/div>\n            <hr class=\"rutini-divider\"\/>\n        <\/div>\n\n        <div id=\"container-bubbles\">\n            <h5 id=\"title-bubbles\" style=\"text-align:center; color:#a89166;\"><\/h5>\n            \n            <div class=\"bubble-list-class\"><\/div>\n\n            <form id=\"form-ccp\">\n                <input type=\"text\" name=\"cpp\" id=\"cppInput\" class=\"rutini-input\" placeholder=\"Enter CCP\" style=\"max-width: 150px;\"\/>\n                <input type=\"hidden\" name=\"sessionId\" id=\"sessionIdInputCPP\"\/>\n                <button type=\"submit\" class=\"rutini-btn\">Validate<\/button>\n                <div id=\"container-info-error-ccp\">\n                    <h3>Incorrect code<\/h3>\n                <\/div>\n            <\/form>\n        <\/div>\n        \n        <div style=\"text-align: center; margin-top: 30px;\">\n             <button onclick=\"resetSearch()\" class=\"rutini-btn-simple\">New Search<\/button>\n        <\/div>\n\n    <\/div>\n<\/div>\n\n<style>\n    \/* ================= ESTILOS RUTINI ================= *\/\n    .container-rutini-wrapper {\n        width: 100%;\n        max-width: 1400px;\n        margin: 0 auto;\n        padding: 60px 20px;\n        font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n        box-sizing: border-box;\n    }\n\n    .rutini-title {\n        text-align: center;\n        color: #a89166;\n        text-transform: uppercase;\n        letter-spacing: 2px;\n        font-weight: 400;\n        margin-bottom: 30px;\n        font-size: 24px;\n    }\n\n    \/* ESTILOS EXACTOS DE FIGMA PARA EL T\u00cdTULO *\/\n    .ref-title {\n        color: #000000;\n        font-family: \"Mr Eaves San OT\", sans-serif;\n        font-size: 22.857px;\n        font-style: normal;\n        font-weight: 700;\n        line-height: 34.182px;\n        letter-spacing: 0.269px;\n        text-transform: uppercase;\n        width: 221px;\n        margin: 0;\n    }\n\n    \/* FORMULARIO *\/\n    .rutini-form-container { display: flex; gap: 10px; max-width: 500px; }\n    .rutini-input { flex: 1; padding: 15px; border: 1px solid #ccc; background: #fdfdfd; color: #333; font-size: 16px; outline: none; border-radius: 0; }\n    .rutini-input:focus { border-color: #a89166; }\n    \/* ESTILOS DEL BOT\u00d3N Y ANIMACI\u00d3N HOVER *\/\n    \/* ESTILOS DEL BOT\u00d3N Y ANIMACI\u00d3N HOVER *\/\n    .rutini-btn {\n        background: #fff;\n        color: #a89166;\n        border: 1px solid #a89166;\n        padding: 0 30px;\n        text-transform: uppercase;\n        font-weight: bold;\n        letter-spacing: 1px;\n        cursor: pointer;\n        border-radius: 0;\n        position: relative;\n        overflow: hidden;\n        transition: color 0.5s ease;\n        z-index: 1; \n        font-family: \"Mr Eaves San OT\", sans-serif;\n        font-size: 12px;\n        outline: none;\n        box-shadow: none;\n    }\n\n    .rutini-btn::before {\n        content: \"\";\n        position: absolute;\n        left: 50%;\n        bottom: 0; \n        \/* Usamos scale(0) para que inicie en tama\u00f1o cero pero mantenga la proporci\u00f3n *\/\n        transform: translate(-50%, 50%) scale(0);\n        width: 400px;\n        height: 400px;\n        background: linear-gradient(90deg, #e7c391 0%, #b6926c 50%, #a89166 100%);\n        z-index: -1; \n        border-radius: 50%;\n        \/* Transicionamos SOLO el transform, esto evita que se deforme *\/\n        transition: transform 0.6s cubic-bezier(.4,0,.2,1);\n    }\n\n    .rutini-btn:hover,\n    .rutini-btn:focus,\n    .rutini-btn:active {\n        color: #fff;\n        outline: none !important;\n        box-shadow: none !important;\n        background: #fff;\n        border-color: #B6926C !important;\n        \n    }\n\n    .rutini-btn:hover::before {\n        \/* Al hacer hover, lo escalamos a su tama\u00f1o real (400px) *\/\n        transform: translate(-50%, 50%) scale(1);\n    }\n    .rutini-btn-simple { background: transparent; border: none; color: #999; text-decoration: underline; cursor: pointer; }\n\n    \/* MENSAJES DE ERROR *\/\n    #container-info-error, #container-info-error-ccp { display: none; color: #d9534f; text-align: center; margin-top: 15px; font-size: 14px; }\n\n    \/* RESULTADOS *\/\n    #info-codigo, #contenido-response, #container-iframe-errors, #content-response, #container-bubbles { display: none; width: 100%; }\n\n    #content-response { display: none; flex-direction: column; gap: 40px; margin-top: 40px; padding-top: 0; }\n\n    @media (min-width: 1024px) {\n        #content-response { display: none; grid-template-columns: 50% 50%; align-items: start; gap: 60px; }\n    }\n\n    \/* COLUMNA IZQUIERDA - INFO *\/\n    .col-info { text-align: left; padding: 20px; }\n    .ref-number { color: #000000; font-size: 18px; font-weight: 400; margin-bottom: 30px; }\n    #num_tag { color: #000;text-align: center; font-family: \"Mr Eaves San OT\"; font-size: 11.717px; font-style: normal; font-weight: 350; line-height: 21.632px; letter-spacing: 0.198px; }\n    .instruction-text, .authenticity-text { font-size: 15px; color: #333333; margin: 30px 0 25px; line-height: 1.7; font-weight: 400; }\n    \n    \/* COLUMNA DERECHA - IMAGEN *\/\n    .col-img { text-align: center; padding: 20px; }\n    .bottle-img { max-height: 650px; width: auto; max-width: 100%; object-fit: contain; }\n\n    \/* ================= NUEVA SECCI\u00d3N: DESCRIPCI\u00d3N DEL VINO ================= *\/\n    .wine-desc-container {\n        display: none;\n        width: 100%;\n        margin-top: 60px;\n    }\n    .rutini-divider {\n        border: none;\n        border-top: 1px solid #e5cc9d;\n        opacity: 0.5;\n        margin: 40px 0;\n    }\n    .wine-desc-content {\n        max-width: 800px;\n        margin: 0 auto;\n        text-align: left;\n    }\n    #prd_name {\n        font-family: 'Mr Eaves San OT', sans-serif;\n        font-size: 28px;\n        font-weight: 400;\n        color: #333;\n        margin-bottom: 10px;\n    }\n    .gold-line {\n        width: 40px;\n        height: 2px;\n        background: #a89166;\n        margin-bottom: 24px;\n    }\n    #desc {\n        font-size: 16px;\n        color: #666;\n        line-height: 1.8;\n        text-align: justify;\n        margin-bottom: 30px;\n    }\n    .rutini-btn-outline {\n        background: transparent;\n        border: 1px solid #a89166;\n        color: #a89166;\n        padding: 10px 25px;\n        text-transform: uppercase;\n        font-size: 12px;\n        letter-spacing: 1px;\n        cursor: pointer;\n        transition: 0.3s;\n    }\n    .rutini-btn-outline:hover { background: #a89166; color: #fff; }\n    #prd_url { display: none; text-decoration: none; } \n\n\n    \/* LOADER & BURBUJAS *\/\n    .loader { display: none; border: 3px solid #f3f3f3; border-top: 3px solid #a89166; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 40px auto; }\n    @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\n    .bubble-list-class { display: flex; flex-wrap: wrap; justify-content: center; gap: 15px; margin: 20px 0; }\n    .button-bubble { background: #fff; border: 1px solid #ddd; padding: 5px; cursor: pointer; transition: transform 0.2s; }\n    .button-bubble:hover { transform: scale(1.1); border-color: #a89166; }\n    #form-ccp { display: none; justify-content: center; gap: 10px; flex-wrap: wrap; margin-top: 20px; }\n\n    \/* AJUSTES RESPONSIVE *\/\n\n    @media (max-width: 1023px) {\n        .col-img {\n            text-align: center;\n            order: 2;\n            width: 100%;\n            padding: 10px 0 0 0;\n        }\n        .col-info {\n            text-align: left;\n            order: 1;\n            width: 100%;\n            padding: 10px 0 0 0;\n        }\n        .ref-title {\n            width: 100%;\n            font-size: 18px;\n        }\n        .rutini-form-container {\n            flex-direction: column;\n            gap: 10px;\n            width: 100%;\n        }\n        .rutini-input, .rutini-btn {\n            width: 100%;\n            box-sizing: border-box;\n        }\n        #content-response {\n            display: flex;\n            flex-direction: column;\n            gap: 20px;\n            margin-top: 20px;\n            padding: 0;\n        }\n        .bottle-img {\n            max-width: 90vw;\n            max-height: 300px;\n        }\n        .wine-desc-content {\n            padding: 0 5px;\n        }\n        .bubble-list-class {\n            gap: 8px;\n        }\n        #container-iframe-errors {\n            min-height: 60vh;\n        }\n        #error-iframe {\n            min-height: 60vh !important;\n            height: 80vh !important;\n        }\n    }\n\n    @media (max-width: 600px) {\n        .container-rutini-wrapper {\n            padding: 20px 2vw;\n        }\n        .rutini-title {\n            font-size: 18px;\n            margin-bottom: 18px;\n        }\n        .ref-title {\n            font-size: 15px;\n            line-height: 22px;\n        }\n        .rutini-form-container {\n            max-width: 100%;\n        }\n        .rutini-input, .rutini-btn {\n            font-size: 15px;\n            padding: 12px;\n        }\n        .bottle-img {\n            max-width: 98vw;\n            max-height: 180px;\n        }\n        .wine-desc-content {\n            font-size: 14px;\n        }\n        #desc {\n            font-size: 14px;\n        }\n        .rutini-btn-outline {\n            font-size: 11px;\n            padding: 8px 10px;\n        }\n        .bubble-list-class {\n            gap: 5px;\n        }\n        #container-iframe-errors {\n            min-height: 40vh;\n        }\n        #error-iframe {\n            min-height: 40vh !important;\n            height: 60vh !important;\n        }\n    }\n\n    @media (max-width: 400px) {\n        .rutini-title {\n            font-size: 15px;\n        }\n        .ref-title {\n            font-size: 12px;\n        }\n        .bottle-img {\n            max-width: 96vw;\n            max-height: 120px;\n        }\n        .rutini-input, .rutini-btn {\n            font-size: 13px;\n            padding: 8px;\n        }\n        .wine-desc-content {\n            font-size: 12px;\n        }\n        #desc {\n            font-size: 12px;\n        }\n        .rutini-btn-outline {\n            font-size: 10px;\n            padding: 6px 6px;\n        }\n    }\n\n    \/* Mejoras para el header y layout en mobile *\/\n    #contenido-response .rutini-header-block {\n        display: flex !important;\n        flex-direction: column !important;\n        align-items: flex-start !important;\n        gap: 10px !important;\n        margin-bottom: 20px !important;\n        padding: 0 !important;\n    }\n    #contenido-response .ref-title {\n        font-family: \"Mr Eaves San OT\", sans-serif !important;\n        font-size: 18px !important;\n        font-weight: 700 !important;\n        line-height: 24px !important;\n        letter-spacing: 0.2px !important;\n        color: #000000 !important;\n        text-transform: uppercase !important;\n        width: 100% !important;\n        min-width: 0 !important;\n        margin: 0 !important;\n        padding: 0 !important;\n        text-align: left !important;\n    }\n    #contenido-response .tag-wrapper {\n        margin: 0 !important;\n        padding: 0 !important;\n        flex-shrink: 0 !important;\n    }\n    #contenido-response .tag-wrapper img {\n        max-width: 120px !important;\n        height: auto !important;\n        display: block !important;\n        border: 1px solid #e5e5e5 !important;\n    }\n\n\/* Mejoras para mostrar el iframe de error como en la foto 2 *\/\n#container-iframe-errors {\n    width: 100%;\n    min-height: 80vh;\n    margin: 0;\n    background: transparent;\n    box-shadow: none;\n    border-radius: 0;\n    padding: 0;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: flex-start;\n}\n#error-iframe {\n    width: 100% !important;\n    min-height: 120vh !important;\n    height: 160vh !important;\n    max-height: none !important;\n    border: none !important;\n    background: transparent !important;\n    box-sizing: border-box;\n\n}\n\n<\/style>\n\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/dompurify\/3.0.9\/purify.min.js\"><\/script>\n\n<script>\n    const API_URL = \"\/auth2\/prooftag-rutini\/prooftag-auth-ajax.php\"; \n\n    async function handleSubmit(event) {\n        if(event) event.preventDefault();\n        const tagInput = document.getElementById(\"tagNumberInput\");\n        const tagNumber = tagInput.value.trim();\n        const sessionID = document.getElementById(\"sessionIdInput\").value;\n\n        if (tagNumber.length < 1) {\n            document.getElementById(\"container-info-error\").style.display = \"block\";\n            return;\n        }\n\n        \/\/ Limpiar entorno WP\n        document.querySelectorAll('.desc-before, .wp-block-heading, .rutini-faq-wrapper').forEach(function(el) {\n            el.style.display = 'none';\n        });\n\n        document.getElementById(\"container-info-error\").style.display = \"none\";\n        document.getElementById(\"form-container-main\").style.display = \"none\";\n        document.getElementById(\"info-codigo\").style.display = \"block\";\n        document.querySelector(\".loader\").style.display = \"block\";\n        document.getElementById(\"contenido-response\").style.display = \"none\";\n\n        try {\n            const res = await fetch(API_URL, {\n                method: \"POST\",\n                headers: { \"Content-Type\": \"application\/json\" },\n                body: JSON.stringify({ tag: tagNumber, sessionID: sessionID }),\n            });\n            const json = await res.json();\n            document.querySelector(\".loader\").style.display = \"none\";\n            document.getElementById(\"contenido-response\").style.display = \"block\";\n\n            if (json.data) {\n                const data = json.data;\n                console.log('Data:', data);\n                if (data.msg_id === \"0\") {\n                    renderSuccess(data);\n                } \n                else if (data.iframe_url) {\n                    renderErrorIframe(data, json.msg);\n                }\n                else if (data.bubbles || data.type === \"CONTROL_BUBBLE\") {\n                    renderBubbles(data, tagNumber, json.msg);\n                }\n                else {\n                    document.getElementById(\"container-info-error\").style.display = \"block\";\n                    document.getElementById(\"form-container-main\").style.display = \"block\";\n                    document.getElementById(\"info-codigo\").style.display = \"none\";\n                }\n            }\n        } catch (error) {\n            console.error(error);\n            resetSearch();\n            document.getElementById(\"container-info-error\").style.display = \"block\";\n        }\n    }\n\n    \/\/ Soporte para autocompletar tag y sessionId desde la URL y ejecutar handleSubmit autom\u00e1ticamente\n    document.addEventListener(\"DOMContentLoaded\", function () {\n        let urlParams = new URLSearchParams(window.location.search);\n        let tag = urlParams.get(\"tag\");\n        let sessionId = urlParams.get(\"sessionId\");\n        if (tag || sessionId) {\n            if (tag) document.getElementById(\"tagNumberInput\").value = tag;\n            if (sessionId) document.getElementById(\"sessionIdInput\").value = sessionId;\n            handleSubmit();\n        }\n    });\n\n    function renderSuccess(data) {\n        document.getElementById(\"container-iframe-errors\").style.display = \"none\";\n        document.getElementById(\"container-bubbles\").style.display = \"none\";\n        \n        const wpColumn = document.querySelector('.wp-block-column.is-vertically-aligned-center.efecto-corte-gris');\n        if (wpColumn) { wpColumn.style.display = \"none\"; }\n        \n        \/\/ RENDERIZAR FILA 1 (Botella y Sello)\n        const contentResponse = document.getElementById(\"content-response\");\n        if (window.innerWidth >= 1024) {\n            contentResponse.style.display = \"grid\";\n        } else {\n            contentResponse.style.display = \"flex\";\n        }\n\n        const imgBottle = document.getElementById(\"image_tag_64_bottleshot\");\n        if (data.prd_image_64) {\n            imgBottle.src = \"data:image\/jpg;base64,\" + data.prd_image_64;\n            imgBottle.style.display = \"inline-block\";\n        } else {\n            imgBottle.style.display = \"none\";\n        }\n\n        document.getElementById(\"image_tag_64\").src = \"data:image\/jpg;base64,\" + data.image_tag_64;\n        document.getElementById(\"num_tag\").innerText = data.num_tag;\n\n        \/\/ RENDERIZAR FILA 2 (Descripci\u00f3n del vino con DOMPurify)\n        const wineDescSection = document.getElementById(\"wine-description-section\");\n        \n        if (data.prd_name || data.prd_desc) {\n            document.getElementById(\"prd_name\").innerText = data.prd_name;\n            \n            \/\/ Usamos DOMPurify para limpiar el HTML (Exactamente como en la referencia)\n            const cleanDesc = DOMPurify.sanitize(data.prd_desc || \"\");\n            document.getElementById(\"desc\").innerHTML = cleanDesc;\n\n            const btnUrl = document.getElementById(\"prd_url\");\n            if (data.prd_url) {\n                btnUrl.href = data.prd_url;\n                btnUrl.style.display = \"inline-block\";\n            } else {\n                btnUrl.style.display = \"none\";\n            }\n            \n            wineDescSection.style.display = \"block\";\n        } else {\n            wineDescSection.style.display = \"none\";\n        }\n    }\n\n    \/\/ Convierte una URL relativa en absoluta para el iframe\n    function getAbsoluteIframeUrl(iframe_url) {\n        if (\/^https?:\\\/\\\/\/.test(iframe_url)) return iframe_url;\n        \/\/ Si es relativa, agreg\u00e1 el dominio base correcto\n        return \"https:\/\/rutiniwines.com\/\" + iframe_url.replace(\/^\\\/+\/, \"\");\n    }\n\n    \/\/ Muestra el iframe de error seg\u00fan la documentaci\u00f3n de Prooftag\n    function renderErrorIframe(data, msg) {\n        \/\/ Oculta todos los bloques de resultados\n        document.getElementById(\"content-response\").style.display = \"none\";\n        document.querySelectorAll('.wp-block-column.is-vertically-aligned-center.efecto-corte-gris').forEach(function(el) {\n        el.style.display = \"none\";\n        });\n        document.getElementById(\"wine-description-section\").style.display = \"none\";\n        document.getElementById(\"container-bubbles\").style.display = \"none\";\n        \/\/ Muestra el contenedor del iframe\n        document.getElementById(\"container-iframe-errors\").style.display = \"flex\";\n        \/\/ Muestra el mensaje de error\/informaci\u00f3n\n        document.getElementById(\"title-error\").innerText = msg || \"Ocurri\u00f3 un error\";\n        \/\/ Asigna la URL al iframe (absoluta si es necesario)\n        if (data.iframe_url) {\n            document.getElementById(\"error-iframe\").src = getAbsoluteIframeUrl(data.iframe_url);\n        } else {\n            document.getElementById(\"error-iframe\").src = \"\";\n        }\n    }\n\n    function renderBubbles(data, tagNumber, msg) {\n        document.getElementById(\"content-response\").style.display = \"none\";\n        document.getElementById(\"wine-description-section\").style.display = \"none\";\n        document.getElementById(\"container-iframe-errors\").style.display = \"none\";\n        \n        const container = document.getElementById(\"container-bubbles\");\n        container.style.display = \"block\";\n        document.getElementById(\"title-bubbles\").innerText = msg;\n        const listContainer = container.querySelector(\".bubble-list-class\");\n        listContainer.innerHTML = \"\";\n\n        \/\/ Si hay burbujas, mostrar botones de burbujas\n        if (data.type === \"CONTROL_BUBBLE\" && data.bubbles) {\n            document.getElementById(\"form-ccp\").style.display = \"none\";\n            data.bubbles.forEach(bubble => {\n                const btn = document.createElement(\"button\");\n                btn.className = \"button-bubble\";\n                btn.onclick = () => handleBubblesSubmit(tagNumber, data.session_id, bubble.dataValue);\n                const img = document.createElement(\"img\");\n                img.src = \"data:image\/jpg;base64,\" + bubble.dataContent;\n                btn.appendChild(img);\n                listContainer.appendChild(btn);\n            });\n        } else {\n            console.log('hola');\n            \/\/ Si requiere CPP, mostrar el formulario CPP\n            document.getElementById(\"form-ccp\").style.display = \"flex\";\n            \/\/ Manejar el submit del formulario CPP\n            const formCCP = document.getElementById(\"form-ccp\");\n            formCCP.onsubmit = async function(e) {\n                e.preventDefault();\n                const cppValue = document.getElementById(\"cppInput\").value.trim();\n                document.getElementById(\"container-info-error-ccp\").style.display = \"none\";\n                if (!cppValue) {\n                    document.getElementById(\"container-info-error-ccp\").style.display = \"block\";\n                    return;\n                }\n                const sesionid = document.getElementById(\"sessionIdInputCPP\").value = data.session_id || data.sessionID || \"\";\n                console.log('Session ID:', sesionid);\n                try {\n                    const res = await fetch(API_URL, {\n                        method: \"POST\",\n                        headers: { \"Content-Type\": \"application\/json\" },\n                        body: JSON.stringify({\n                            tag: tagNumber,\n                            type: \"1\",\n                            control_key_value: cppValue,\n                            control_key_id: data.control_key_id || \"\",\n                            control_key_name: data.control_key_name || \"\",\n                            control_key_label: data.control_key_label || \"\",\n                            control_session_id: data.session_id || data.sessionID || document.getElementById(\"sessionIdInputCPP\").value\n                        })\n                    });\n                    const json = await res.json();\n                    if (json.data && json.data.msg_id === \"0\") {\n                        \/\/ CPP correcto, mostrar \u00e9xito\n                        renderSuccess(json.data);\n                    } else {\n                        document.getElementById(\"container-info-error-ccp\").style.display = \"block\";\n                    }\n                } catch (err) {\n                    document.getElementById(\"container-info-error-ccp\").style.display = \"block\";\n                }\n            };\n        }\n    }\n\n    \/\/ Funci\u00f3n para validar la burbuja seleccionada\n    async function handleBubblesSubmit(tagNumber, sessionId, dataValue) {\n        try {\n            document.querySelector(\".loader\").style.display = \"block\";\n            const res = await fetch(API_URL, {\n                method: \"POST\",\n                headers: { \"Content-Type\": \"application\/json\" },\n                body: JSON.stringify({\n                    tag: tagNumber,\n                    type: \"2\",\n                    control_session_id: sessionId,\n                    control_bubble_index: dataValue\n                })\n            });\n            const json = await res.json();\n            document.querySelector(\".loader\").style.display = \"none\";\n            if (json.data) {\n                const data = json.data;\n                \/\/ Si es \u00e9xito\n                if (data.msg_id === \"0\") {\n                    renderSuccess(data);\n                } else if (data.msg_id === \"20\") {\n                    \/\/ Sesi\u00f3n expirada\n                    document.getElementById(\"lockout-notice\").style.display = \"flex\";\n                    document.getElementById(\"lockout-notice\").innerHTML = \"La sesi\u00f3n ha expirado desde la \u00faltima llamada.\";\n                    \/\/ Si el backend retorna bubbles o control_key, volver a mostrar el formulario correspondiente\n                    console.log(\"JSDAA\");\n                     renderErrorIframe(data, json.msg)\n                } else if (data.iframe_url) {\n                    \/\/ Error con iframe\n                    renderErrorIframe(data, json.msg);\n                } else {\n                    \/\/ Error gen\u00e9rico\n                    document.getElementById(\"container-info-error-ccp\").style.display = \"block\";\n                }\n            }\n        } catch (error) {\n            document.querySelector(\".loader\").style.display = \"none\";\n            document.getElementById(\"container-info-error-ccp\").style.display = \"block\";\n        }\n    }\n\n    function resetSearch() {\n        document.getElementById(\"form-container-main\").style.display = \"block\";\n        document.getElementById(\"info-codigo\").style.display = \"none\";\n        document.getElementById(\"wine-description-section\").style.display = \"none\";\n        document.getElementById(\"tagNumberInput\").value = \"\";\n        document.getElementById(\"container-info-error\").style.display = \"none\";\n        \/\/ Limpia el iframe de error\n        document.getElementById(\"error-iframe\").src = \"\";\n        const wpColumn = document.querySelector('.wp-block-column.is-vertically-aligned-center.efecto-corte-gris');\n        if (wpColumn) { wpColumn.style.display = \"block\"; }\n    }\n    \/\/ Asegura que la funci\u00f3n hiddenInvalid est\u00e9 definida para evitar errores en consola\n    function hiddenInvalid() {\n        var el = document.getElementById(\"container-info-error\");\n        if (el) el.style.display = \"none\";\n    }\n<\/script>\n\n\n\n<p class=\"desc-before\">Rutini Wines uses an international traceability system on selected lines as part of a broader commitment to quality, care, and excellence across its wines.<br\/><br\/>The seal features a unique, non-reproducible structure linked to a QR code and an alphanumeric identifier, enabling individual verification of bottles that carry it.<br\/><br\/>In some cases, verification may redirect to a general institutional page without affecting product authenticity<br\/><\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center efecto-corte-gris is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full foto-vino\"><img loading=\"lazy\" decoding=\"async\" width=\"732\" height=\"723\" src=\"https:\/\/rutiniwines.com\/wp-content\/uploads\/2026\/02\/PROOF.png\" alt=\"\" class=\"wp-image-27328\" srcset=\"https:\/\/rutiniwines.com\/wp-content\/uploads\/2026\/02\/PROOF.png 732w, https:\/\/rutiniwines.com\/wp-content\/uploads\/2026\/02\/PROOF-300x296.png 300w\" sizes=\"auto, (max-width: 732px) 100vw, 732px\" \/><\/figure>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" id=\"vinos-box\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" id=\"col-in-vino\">\n<h1 class=\"wp-block-heading has-text-align-center animated fadeInUp\">FAQ \u2013 Authentication | Rutini Wines<\/h1>\n\n\n\n<div class=\"rutini-faq-wrapper\">\n\n    <details class=\"rutini-acordeon\">\n        <summary>Do all Rutini Wines bottles feature an authentication seal?<\/summary>\n        <div class=\"faq-content\">\n            <p>No. The system is applied to selected lines. All Rutini Wines products meet the same quality and origin standards.  <\/p>\n        <\/div>\n    <\/details>\n\n    <details class=\"rutini-acordeon\">\n        <summary>What does the seal verify?<\/summary>\n        <div class=\"faq-content\">\n            <p>It allows individual verification of bottles that carry it as part of an international traceability system.<\/p>\n        <\/div>\n    <\/details>\n\n    <details class=\"rutini-acordeon\">\n        <summary>I scanned the code and was redirected to a general page. Is this correct? <\/summary>\n        <div class=\"faq-content\">\n            <p>Yes. This does not affect the product\u2019s authenticity and is part of the same control system. <\/p>\n        <\/div>\n    <\/details>\n\n    <details class=\"rutini-acordeon\">\n        <summary>Where can I send inquiries?<\/summary>\n        <div class=\"faq-content\">\n            <p>You can make inquiries by writing directly to: prooftag@rutiniwines.com<\/p>\n        <\/div>\n    <\/details>\n\n<\/div>\n\n<style>\n    \/* Centrar todo el bloque en la p\u00e1gina *\/\n    .rutini-faq-wrapper {\n        max-width: 800px; \/* Ancho m\u00e1ximo igual a la foto *\/\n        margin: 0 auto;   \/* Esto centra el bloque horizontalmente *\/\n        padding: 20px;\n        font-family: 'Mr Eaves San O', serif; \/* Tipograf\u00eda estilo Rutini *\/\n    }\n\n    .faq-title {\n        text-align: center;\n        font-weight: 400;\n        margin-bottom: 10px;\n        color: #333;\n    }\n\n\n\n    \/* Caja de cada pregunta *\/\n    details.rutini-acordeon {\n        background-color: #f8f8f8; \/* Gris muy clarito *\/\n        border: 1px solid #e5e5e5;\n        margin-bottom: 15px; \/* Separaci\u00f3n entre cajas *\/\n        transition: all 0.3s ease;\n    }\n\n    \/* Estilo cuando est\u00e1 abierto (Fondo blanco) *\/\n    details.rutini-acordeon[open] {\n        background-color: #ffffff;\n        border-color: #dcdcdc;\n        box-shadow: 0 5px 15px rgba(0,0,0,0.05);\n    }\n\n    \/* El texto de la pregunta (Click) *\/\n    summary {\n        padding: 20px;\n        font-size: 20px;\n        cursor: pointer;\n        list-style: none; \/* Quita el tri\u00e1ngulo feo por defecto *\/\n        position: relative;\n        font-weight: 400;\n        color: #1a1a1a;\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n    }\n\n    \/* Ocultar flecha nativa en navegadores webkit *\/\n    summary::-webkit-details-marker {\n        display: none;\n    }\n\n    \/* La flecha personalizada (V) a la derecha *\/\n    summary::after {\n        content: '';\n        width: 10px;\n        height: 10px;\n        border-right: 2px solid #333;\n        border-bottom: 2px solid #333;\n        transform: rotate(45deg); \/* Flecha hacia abajo *\/\n        transition: transform 0.3s ease;\n        margin-left: 20px;\n    }\n\n    \/* Girar la flecha cuando est\u00e1 abierto *\/\n    details.rutini-acordeon[open] summary::after {\n        transform: rotate(-135deg); \/* Flecha hacia arriba *\/\n        border-color: #a38b5e; \/* Se pone dorada *\/\n    }\n\n    \/* Contenido de la respuesta *\/\n    .faq-content {\n        padding: 0 20px 20px 20px;\n        color: #555;\n        line-height: 1.6;\n        font-family: sans-serif; \/* Texto de lectura m\u00e1s limpio *\/\n    }\n<\/style>\n\n<script>\n    \/\/ Este peque\u00f1o c\u00f3digo hace que cuando abras uno, se cierren los dem\u00e1s\n    const allDetails = document.querySelectorAll('.rutini-acordeon');\n\n    allDetails.forEach((targetDetail) => {\n        targetDetail.addEventListener('click', (e) => {\n            \/\/ Si estamos cerrando, no hacemos nada\n            if (targetDetail.hasAttribute('open')) return;\n\n            \/\/ Si estamos abriendo, cerramos todos los dem\u00e1s\n            allDetails.forEach((detail) => {\n                if (detail !== targetDetail) {\n                    detail.removeAttribute('open');\n                }\n            });\n        });\n    });\n<\/script>\n<\/div>\n<\/div>\n\n<div class=\"wp-block-columns uag-hide-desktop uag-hide-tab uag-hide-mob is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" id=\"vinos-box\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" id=\"col-in-vino\">\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Do all Rutini Wines bottles feature an authentication seal?<\/summary>\n<p>asdadads<\/p>\n<\/details>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>\u00bfQu\u00e9 permite verificar el sello?<\/summary>\n<p>asdadads<\/p>\n<\/details>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>I scanned the code and was redirected to a general page. Is this correct? <\/summary>\n<p>asdadads<\/p>\n<\/details>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Where can I send inquiries?<\/summary>\n<p>asdadads<\/p>\n<\/details>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bottle Authentication Enter the alphanumeric code shown on your bottle\u2019s authentication seal. Verify Invalid code. Please try again. This code [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":21808,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":"","_links_to":"","_links_to_target":""},"class_list":["post-27487","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Bottle Authentication - Bodega Rutini Wines<\/title>\n<meta name=\"description\" content=\"A premium line of single-varietal and bi-varietal wines from our own vineyards in the Uco Valley (Gualtallary, El Cepillo and La Consulta).\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rutiniwines.com\/en\/bottle-authentication\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bottle Authentication - Bodega Rutini Wines\" \/>\n<meta property=\"og:description\" content=\"A premium line of single-varietal and bi-varietal wines from our own vineyards in the Uco Valley (Gualtallary, El Cepillo and La Consulta).\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rutiniwines.com\/en\/bottle-authentication\/\" \/>\n<meta property=\"og:site_name\" content=\"Bodega Rutini Wines\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-04T15:23:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/09\/Linea-Rutini-Coleccion-Header.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1176\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/rutiniwines.com\/en\/bottle-authentication\/\",\"url\":\"https:\/\/rutiniwines.com\/en\/bottle-authentication\/\",\"name\":\"Bottle Authentication - Bodega Rutini Wines\",\"isPartOf\":{\"@id\":\"https:\/\/rutiniwines.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/rutiniwines.com\/en\/bottle-authentication\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/rutiniwines.com\/en\/bottle-authentication\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/09\/Linea-Rutini-Coleccion-Header.jpg\",\"datePublished\":\"2026-02-11T19:31:44+00:00\",\"dateModified\":\"2026-03-04T15:23:34+00:00\",\"description\":\"A premium line of single-varietal and bi-varietal wines from our own vineyards in the Uco Valley (Gualtallary, El Cepillo and La Consulta).\",\"breadcrumb\":{\"@id\":\"https:\/\/rutiniwines.com\/en\/bottle-authentication\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/rutiniwines.com\/en\/bottle-authentication\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/rutiniwines.com\/en\/bottle-authentication\/#primaryimage\",\"url\":\"https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/09\/Linea-Rutini-Coleccion-Header.jpg\",\"contentUrl\":\"https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/09\/Linea-Rutini-Coleccion-Header.jpg\",\"width\":1176,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/rutiniwines.com\/en\/bottle-authentication\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\/\/rutiniwines.com\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Protected: Bottle Authentication\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/rutiniwines.com\/#website\",\"url\":\"https:\/\/rutiniwines.com\/\",\"name\":\"Bodega Rutini Wines\",\"description\":\"Valle de Uco - Mendoza - Argentina\",\"publisher\":{\"@id\":\"https:\/\/rutiniwines.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/rutiniwines.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/rutiniwines.com\/#organization\",\"name\":\"Rutini Wines\",\"alternateName\":\"Rutini\",\"url\":\"https:\/\/rutiniwines.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/rutiniwines.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/06\/rutini.png\",\"contentUrl\":\"https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/06\/rutini.png\",\"width\":313,\"height\":56,\"caption\":\"Rutini Wines\"},\"image\":{\"@id\":\"https:\/\/rutiniwines.com\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Bottle Authentication - Bodega Rutini Wines","description":"A premium line of single-varietal and bi-varietal wines from our own vineyards in the Uco Valley (Gualtallary, El Cepillo and La Consulta).","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:\/\/rutiniwines.com\/en\/bottle-authentication\/","og_locale":"en_US","og_type":"article","og_title":"Bottle Authentication - Bodega Rutini Wines","og_description":"A premium line of single-varietal and bi-varietal wines from our own vineyards in the Uco Valley (Gualtallary, El Cepillo and La Consulta).","og_url":"https:\/\/rutiniwines.com\/en\/bottle-authentication\/","og_site_name":"Bodega Rutini Wines","article_modified_time":"2026-03-04T15:23:34+00:00","og_image":[{"width":1176,"height":1080,"url":"https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/09\/Linea-Rutini-Coleccion-Header.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/rutiniwines.com\/en\/bottle-authentication\/","url":"https:\/\/rutiniwines.com\/en\/bottle-authentication\/","name":"Bottle Authentication - Bodega Rutini Wines","isPartOf":{"@id":"https:\/\/rutiniwines.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/rutiniwines.com\/en\/bottle-authentication\/#primaryimage"},"image":{"@id":"https:\/\/rutiniwines.com\/en\/bottle-authentication\/#primaryimage"},"thumbnailUrl":"https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/09\/Linea-Rutini-Coleccion-Header.jpg","datePublished":"2026-02-11T19:31:44+00:00","dateModified":"2026-03-04T15:23:34+00:00","description":"A premium line of single-varietal and bi-varietal wines from our own vineyards in the Uco Valley (Gualtallary, El Cepillo and La Consulta).","breadcrumb":{"@id":"https:\/\/rutiniwines.com\/en\/bottle-authentication\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rutiniwines.com\/en\/bottle-authentication\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rutiniwines.com\/en\/bottle-authentication\/#primaryimage","url":"https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/09\/Linea-Rutini-Coleccion-Header.jpg","contentUrl":"https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/09\/Linea-Rutini-Coleccion-Header.jpg","width":1176,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/rutiniwines.com\/en\/bottle-authentication\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/rutiniwines.com\/en\/"},{"@type":"ListItem","position":2,"name":"Protected: Bottle Authentication"}]},{"@type":"WebSite","@id":"https:\/\/rutiniwines.com\/#website","url":"https:\/\/rutiniwines.com\/","name":"Bodega Rutini Wines","description":"Valle de Uco - Mendoza - Argentina","publisher":{"@id":"https:\/\/rutiniwines.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rutiniwines.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/rutiniwines.com\/#organization","name":"Rutini Wines","alternateName":"Rutini","url":"https:\/\/rutiniwines.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rutiniwines.com\/#\/schema\/logo\/image\/","url":"https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/06\/rutini.png","contentUrl":"https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/06\/rutini.png","width":313,"height":56,"caption":"Rutini Wines"},"image":{"@id":"https:\/\/rutiniwines.com\/#\/schema\/logo\/image\/"}}]}},"uagb_featured_image_src":{"full":["https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/09\/Linea-Rutini-Coleccion-Header.jpg",1176,1080,false],"thumbnail":["https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/09\/Linea-Rutini-Coleccion-Header-150x150.jpg",150,150,true],"medium":["https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/09\/Linea-Rutini-Coleccion-Header-300x276.jpg",300,276,true],"medium_large":["https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/09\/Linea-Rutini-Coleccion-Header-768x705.jpg",768,705,true],"large":["https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/09\/Linea-Rutini-Coleccion-Header-1024x940.jpg",1024,940,true],"1536x1536":["https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/09\/Linea-Rutini-Coleccion-Header.jpg",1176,1080,false],"2048x2048":["https:\/\/rutiniwines.com\/wp-content\/uploads\/2024\/09\/Linea-Rutini-Coleccion-Header.jpg",1176,1080,false]},"uagb_author_info":{"display_name":"adminrutini","author_link":"https:\/\/rutiniwines.com\/en\/author\/adminrutini\/"},"uagb_comment_info":0,"uagb_excerpt":"Bottle Authentication Enter the alphanumeric code shown on your bottle\u2019s authentication seal. Verify Invalid code. Please try again. This code [&hellip;]","_links":{"self":[{"href":"https:\/\/rutiniwines.com\/en\/wp-json\/wp\/v2\/pages\/27487","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rutiniwines.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rutiniwines.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/rutiniwines.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/rutiniwines.com\/en\/wp-json\/wp\/v2\/comments?post=27487"}],"version-history":[{"count":1,"href":"https:\/\/rutiniwines.com\/en\/wp-json\/wp\/v2\/pages\/27487\/revisions"}],"predecessor-version":[{"id":27488,"href":"https:\/\/rutiniwines.com\/en\/wp-json\/wp\/v2\/pages\/27487\/revisions\/27488"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rutiniwines.com\/en\/wp-json\/wp\/v2\/media\/21808"}],"wp:attachment":[{"href":"https:\/\/rutiniwines.com\/en\/wp-json\/wp\/v2\/media?parent=27487"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}