{
    "url": "https://oleksiimatuznyi.com",
    "final_url": "https://oleksiimatuznyi.com/",
    "host": "oleksiimatuznyi.com",
    "audited_at": "2026-11-03T12:35:43+00:00",
    "composite_score": 85,
    "score_coverage": 1,
    "tier": "GOOD",
    "site": {
        "type": "personal",
        "type_label": "Особистий сайт експерта",
        "confidence": 0.95,
        "signals": [
            "schema Person - головна сутність головної (ProfilePage.mainEntity)",
            "пункт меню «Про мене»",
            "назва сайту збігається з іменем у Person («Олексій Матузний»)",
            "немає кошика й каталогу товарів"
        ],
        "brand": "Олексій Матузний",
        "host": "oleksiimatuznyi.com",
        "lang": "uk",
        "languages": [
            "uk",
            "en"
        ],
        "scores": {
            "ecommerce": 0,
            "local": 0,
            "media": 1,
            "saas": 0,
            "services": 1.5,
            "corporate": 0,
            "personal": 9
        }
    },
    "samples": [
        {
            "role": "about",
            "url": "https://oleksiimatuznyi.com/press/",
            "final_url": "https://oleksiimatuznyi.com/press/",
            "status": 200,
            "title": "Публікації та виступи - Олексій Матузний",
            "via": "link",
            "fetched_as": "bot",
            "challenge": null
        },
        {
            "role": "contact",
            "url": "https://oleksiimatuznyi.com/contact",
            "final_url": "https://oleksiimatuznyi.com/contact",
            "status": 200,
            "title": "Залишити заявку на SEO-консультацію - Олексій Матузний",
            "via": "sitemap",
            "fetched_as": "bot",
            "challenge": null
        }
    ],
    "access": {
        "homepage_status": 200,
        "bot_status": 200,
        "browser_status": null,
        "fetched_as": "bot",
        "blocked": false,
        "block_reason": null,
        "bot_challenge": null,
        "browser_challenge": null,
        "alt_agent": null,
        "alt_tried": [],
        "fetched_with": "GeoAuditBot",
        "lang_switch": null,
        "final_url": "https://oleksiimatuznyi.com/",
        "redirect_count": 0,
        "ttfb_ms": 1345
    },
    "checks": [
        {
            "id": "crawler",
            "name": "Доступ AI-ботів та індексація",
            "weight": 0.14,
            "status": "ok",
            "score": 100,
            "summary": "Пошукові та AI-боти мають доступ: robots.txt, сервер і meta-директиви їх не блокують.",
            "sub_scores": {
                "robots_retrieval": 100,
                "robots_training": 100,
                "robots_file": 100,
                "waf_probe": 100,
                "index_directives": 100
            },
            "sub_labels": {
                "robots_retrieval": "robots.txt: пошукові та AI-пошукові боти",
                "robots_training": "robots.txt: боти для навчання моделей",
                "robots_file": "robots.txt: доступність і синтаксис",
                "waf_probe": "Сервер / WAF: відповідь AI-ботам",
                "index_directives": "meta robots / X-Robots-Tag"
            },
            "passed": [
                "robots.txt доступний: HTTP 200, 1 КБ, 1 група правил, Sitemap: 1",
                "За robots.txt усі 13 пошукових і AI-пошукових ботів (Googlebot, Bingbot, OAI-SearchBot, PerplexityBot та ще 9) мають доступ до головної і 2 перевірених внутрішніх сторінок",
                "За robots.txt боти для навчання моделей (GPTBot, Google-Extended, ClaudeBot, CCBot та ще 6) не заблоковані - тексти сайту можуть потрапляти в знання моделей",
                "Запити з User-Agent OAI-SearchBot, ChatGPT-User, PerplexityBot, Perplexity-User, Claude-SearchBot, ClaudeBot, GPTBot отримали HTTP 200 і повний HTML, як і звичайний запит (перевірка підміною User-Agent з нашого сервера)",
                "Головна та 2 внутрішні сторінки без noindex, nosnippet чи max-snippet:0 (meta robots і X-Robots-Tag)"
            ],
            "findings": [],
            "data": {
                "robots": {
                    "url": "https://oleksiimatuznyi.com/robots.txt",
                    "status": 200,
                    "state": "ok",
                    "bytes": 1223,
                    "fetched_as": "bot",
                    "attempts": [
                        "HTTP 200"
                    ],
                    "groups": 1,
                    "sitemaps": [
                        "https://oleksiimatuznyi.com/sitemap.xml"
                    ],
                    "paths": [
                        "/",
                        "/press/",
                        "/contact"
                    ]
                },
                "bots": {
                    "Googlebot": {
                        "class": "retrieval",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "Bingbot": {
                        "class": "retrieval",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "OAI-SearchBot": {
                        "class": "retrieval",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "PerplexityBot": {
                        "class": "retrieval",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "ChatGPT-User": {
                        "class": "retrieval",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "Claude-SearchBot": {
                        "class": "retrieval",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "Applebot": {
                        "class": "retrieval",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "Claude-User": {
                        "class": "retrieval",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "Perplexity-User": {
                        "class": "retrieval",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "DuckAssistBot": {
                        "class": "retrieval",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "MistralAI-User": {
                        "class": "retrieval",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "Amzn-SearchBot": {
                        "class": "retrieval",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "Amzn-User": {
                        "class": "retrieval",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "GPTBot": {
                        "class": "training",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "Google-Extended": {
                        "class": "training",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "ClaudeBot": {
                        "class": "training",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "CCBot": {
                        "class": "training",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "Applebot-Extended": {
                        "class": "training",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "Meta-ExternalAgent": {
                        "class": "training",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "Amazonbot": {
                        "class": "training",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "Bytespider": {
                        "class": "training",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "anthropic-ai": {
                        "class": "training",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    },
                    "cohere-ai": {
                        "class": "training",
                        "group": "*",
                        "home_allowed": true,
                        "blocked_paths": []
                    }
                },
                "waf": {
                    "baseline": "bot",
                    "bot_status": 200,
                    "bot_challenge": null,
                    "browser_status": null,
                    "homepage_bytes": 35942,
                    "cdn": "Cloudflare",
                    "probes": {
                        "OAI-SearchBot": {
                            "status": 200,
                            "cls": "ok",
                            "bytes": 35942,
                            "challenge": null,
                            "error": "",
                            "ms": 975
                        },
                        "ChatGPT-User": {
                            "status": 200,
                            "cls": "ok",
                            "bytes": 35942,
                            "challenge": null,
                            "error": "",
                            "ms": 1659
                        },
                        "PerplexityBot": {
                            "status": 200,
                            "cls": "ok",
                            "bytes": 35942,
                            "challenge": null,
                            "error": "",
                            "ms": 1092
                        },
                        "Perplexity-User": {
                            "status": 200,
                            "cls": "ok",
                            "bytes": 35942,
                            "challenge": null,
                            "error": "",
                            "ms": 743
                        },
                        "Claude-SearchBot": {
                            "status": 200,
                            "cls": "ok",
                            "bytes": 35942,
                            "challenge": null,
                            "error": "",
                            "ms": 1765
                        },
                        "ClaudeBot": {
                            "status": 200,
                            "cls": "ok",
                            "bytes": 35942,
                            "challenge": null,
                            "error": "",
                            "ms": 1658
                        },
                        "GPTBot": {
                            "status": 200,
                            "cls": "ok",
                            "bytes": 35942,
                            "challenge": null,
                            "error": "",
                            "ms": 1456
                        }
                    },
                    "control": null,
                    "confirmed": [],
                    "ms": 1772
                },
                "directives": {
                    "pages": [
                        {
                            "role": "home",
                            "url": "https://oleksiimatuznyi.com/",
                            "directives": []
                        },
                        {
                            "role": "about",
                            "url": "https://oleksiimatuznyi.com/press/",
                            "directives": []
                        },
                        {
                            "role": "contact",
                            "url": "https://oleksiimatuznyi.com/contact",
                            "directives": []
                        }
                    ],
                    "unavailable": []
                }
            }
        },
        {
            "id": "render",
            "name": "Рендеринг та індексованість",
            "weight": 0.1,
            "status": "ok",
            "score": 99,
            "summary": "Контент віддається в сирому HTML, canonical, lang і коди відповіді коректні.",
            "sub_scores": {
                "ssr_home": 100,
                "ssr_samples": 93,
                "canonical": 100,
                "lang": 100,
                "hreflang": 100,
                "sample_status": 100
            },
            "sub_labels": {
                "ssr_home": "Текст головної в сирому HTML",
                "ssr_samples": "Текст внутрішніх сторінок у сирому HTML",
                "canonical": "Canonical",
                "lang": "Атрибут lang і мова контенту",
                "hreflang": "hreflang",
                "sample_status": "Коди відповіді й редиректи"
            },
            "passed": [
                "Головна віддає текст у сирому HTML: 781 слово без виконання JavaScript",
                "1 внутрішня сторінка теж віддає текст у HTML: 163 слів",
                "Canonical на всіх 3 перевірених сторінках коректний: вказує на саму сторінку",
                "<html lang=\"uk-ua\"> на всіх 3 перевірених сторінках відповідає мові тексту (українська)",
                "hreflang на головній: en-GB, x-default (з посиланням на саму себе, зворотне посилання з версії en-GB підтверджено)",
                "Обидві внутрішні сторінки вибірки відповідають 200 без редиректів"
            ],
            "findings": [],
            "data": {
                "pages_checked": 3,
                "ssr": [
                    {
                        "role": "home",
                        "url": "https://oleksiimatuznyi.com/",
                        "state": "ssr",
                        "words": 781,
                        "main_words": 770,
                        "frameworks": [],
                        "empty_root": false
                    },
                    {
                        "role": "about",
                        "url": "https://oleksiimatuznyi.com/press/",
                        "state": "ssr",
                        "words": 163,
                        "main_words": 155,
                        "frameworks": [],
                        "empty_root": false
                    },
                    {
                        "role": "contact",
                        "url": "https://oleksiimatuznyi.com/contact",
                        "state": "short",
                        "words": 49,
                        "main_words": 38,
                        "frameworks": [],
                        "empty_root": false
                    }
                ],
                "canonical": [
                    {
                        "url": "https://oleksiimatuznyi.com/",
                        "canonical": "https://oleksiimatuznyi.com/",
                        "state": "self",
                        "kind": null,
                        "target_status": null
                    },
                    {
                        "url": "https://oleksiimatuznyi.com/press/",
                        "canonical": "https://oleksiimatuznyi.com/press/",
                        "state": "self",
                        "kind": null,
                        "target_status": null
                    },
                    {
                        "url": "https://oleksiimatuznyi.com/contact",
                        "canonical": "https://oleksiimatuznyi.com/contact",
                        "state": "self",
                        "kind": null,
                        "target_status": null
                    }
                ],
                "lang": [
                    {
                        "url": "https://oleksiimatuznyi.com/",
                        "attr": "uk-ua",
                        "detected": "uk"
                    },
                    {
                        "url": "https://oleksiimatuznyi.com/press/",
                        "attr": "uk-ua",
                        "detected": "uk"
                    },
                    {
                        "url": "https://oleksiimatuznyi.com/contact",
                        "attr": "uk-ua",
                        "detected": null
                    }
                ],
                "languages": [
                    "uk",
                    "en"
                ],
                "hreflang_home": [
                    "en-GB https://oleksiimatuznyi.com/en/",
                    "x-default https://oleksiimatuznyi.com/"
                ],
                "hreflang_alternates": [
                    {
                        "lang": "en-GB",
                        "url": "https://oleksiimatuznyi.com/en/",
                        "status": 200,
                        "return": true
                    }
                ],
                "samples_status": {
                    "total": 2,
                    "ok": 2,
                    "broken": 0,
                    "chains": 0,
                    "single_redirects": 0,
                    "blocked": 0,
                    "timeouts": 0
                },
                "noscript": {
                    "count": 0,
                    "texts": []
                }
            }
        },
        {
            "id": "citability",
            "name": "Цитованість контенту",
            "weight": 0.2,
            "status": "ok",
            "score": 72,
            "summary": "Оцінено 2 сторінки (головна, про мене). Найслабше: «Абзаци-відповіді (40-150 слів)» (45), «Короткий вступ після H1» (65); найкраще: «Title і meta description» (100).",
            "sub_scores": {
                "volume": 67,
                "passages": 45,
                "headings": 86,
                "answer_first": 65,
                "structure": 85,
                "facts": 70,
                "freshness": null,
                "meta": 100,
                "og": 100
            },
            "sub_labels": {
                "volume": "Обсяг тексту",
                "passages": "Абзаци-відповіді (40-150 слів)",
                "headings": "Структура заголовків",
                "answer_first": "Короткий вступ після H1",
                "structure": "Списки й таблиці",
                "facts": "Конкретні факти й цифри",
                "freshness": "Дата й свіжість статей",
                "meta": "Title і meta description",
                "og": "Open Graph"
            },
            "passed": [
                "Достатній обсяг тексту: головна - 740 сл.",
                "Абзаци-відповіді на 40-150 слів: головна - 5",
                "Рівно один H1 на всіх 2 перевірених сторінках, і кожен збігається з темою title",
                "Короткий вступ одразу після H1: головна (21 сл.)",
                "Списки й таблиці в контенті: головна - 3 списки",
                "Конкретні цифри в коротких блоках (лічильники, ціни, терміни): головна - 12 блоків з цифрами («Жовтень 2023 Теперішній час»)",
                "Title і meta description заповнені на всіх 3 перевірених сторінках",
                "Open Graph на головній повний: og:title, og:description, og:image"
            ],
            "findings": [
                {
                    "id": "citability.thin_content",
                    "severity": "medium",
                    "text": "Замало тексту для цитування на сторінці",
                    "evidence": "Про мене (/press/): основний текст - 155 слів, орієнтир - від 400",
                    "why": "AI-асистент цитує сторінку, коли знаходить на ній повну відповідь на питання. На коротких сторінках такої відповіді немає, і асистент бере текст у конкурентів.",
                    "fix": "Розширте сторінки до орієнтиру змістовним текстом (не водою): що це, для кого, як працює, ціни чи терміни, конкретні цифри, відповіді на типові питання.",
                    "bad": "Про мене (/press/) (155 слів без повторів, разом із підписами), усі текстові абзаци сторінки: «Виступи на конференціях, авторські статті, кейси та експертні коментарі у профільних медіа - публічний слід моєї роботи в SEO за 8+ років.»",
                    "good": "Хто такі Олексій Матузний (1-2 речення з роком заснування і містом), цифри (роки на ринку, клієнти, команда), ліцензії й нагороди, команда з іменами й посадами.",
                    "code": "",
                    "verify": "Порахуйте слова основного тексту (без меню й футера) у Detailed SEO Extension або Screaming Frog (Word Count); повторний аудит.",
                    "effort": "M"
                },
                {
                    "id": "citability.no_passages",
                    "severity": "medium",
                    "text": "На частині перевірених сторінок немає самодостатніх абзаців-відповідей",
                    "evidence": "Про мене (/press/): жодного абзацу від 40 слів, найдовші - 21 слово",
                    "why": "AI-пошуковики розбивають сторінку на фрагменти й цитують ті, що відповідають на питання повністю. Короткі підписи й назви карток такими фрагментами не є.",
                    "fix": "Додайте блоки по 40-150 слів, кожен відповідає на одне питання (що це, для кого, як працює, скільки коштує) і зрозумілий без контексту решти сторінки.",
                    "bad": "Про мене (/press/), один з найдовших абзаців (21 слово): «Виступи на конференціях, авторські статті, кейси та експертні коментарі у профільних медіа - публічний слід моєї роботи в SEO за 8+ років.»",
                    "good": "«Виступи на конференціях, авторські статті, кейси та експертні коментарі у профільних медіа - публічний слід моєї роботи в SEO за 8+ років. [ВКАЖІТЬ 1-2 речення з конкретикою: цифра, термін, приклад, для кого це]» - абзац на 40-120 слів, зрозумілий без решти сторінки.",
                    "code": "",
                    "verify": "Скопіюйте абзац окремо і перевірте, чи зрозуміло з нього, про що мова і про яку компанію; повторний аудит покаже кількість абзаців 40-150 слів.",
                    "effort": "M"
                },
                {
                    "id": "citability.no_question_headings",
                    "severity": "low",
                    "text": "Немає заголовків у формі питань",
                    "evidence": "Перевірено H2/H3 на 2 сторінках - жодного у формі питання (зі знаком «?» або «Як / Що / Чому / Скільки...»).\nПриклади поточних заголовків: «Досвід роботи», «Брав участь у конференціях:», «Публікації та виступи», «Виступи та конференції»",
                    "why": "Люди питають AI-асистентів питаннями. Підзаголовок-питання з короткою відповіддю під ним - цілісний фрагмент, який зручно процитувати у відповіді ChatGPT чи Perplexity.",
                    "fix": "Додайте на ключові сторінки 3-5 підзаголовків-питань із реальних запитів клієнтів (People Also Ask, питання менеджерам) і відповіді на 40-80 слів під кожним.",
                    "bad": "<h2>Досвід роботи</h2>\n<h2>Брав участь у конференціях:</h2>\n<h2>Публікації та виступи</h2>",
                    "good": "<h2>Хто такий Олексій Матузний і на чому спеціалізується?</h2>\n<h2>Скільки років досвіду і з якими проєктами працював Олексій Матузний?</h2>\n<h2>Як замовити консультацію в Олексій Матузний?</h2>",
                    "code": "<section class=\"faq\">\n  <h2>Питання та відповіді</h2>\n  <h3>Хто такий Олексій Матузний і на чому спеціалізується?</h3>\n  <p>[ВКАЖІТЬ відповідь на 40-80 слів: перше речення - пряма відповідь, далі деталі й цифри]</p>\n  <h3>Скільки років досвіду і з якими проєктами працював Олексій Матузний?</h3>\n  <p>[ВКАЖІТЬ відповідь на 40-80 слів: перше речення - пряма відповідь, далі деталі й цифри]</p>\n  <h3>Як замовити консультацію в Олексій Матузний?</h3>\n  <p>[ВКАЖІТЬ відповідь на 40-80 слів: перше речення - пряма відповідь, далі деталі й цифри]</p>\n</section>",
                    "verify": "Через 3-4 тижні після публікації задайте ці питання в Perplexity / ChatGPT search і перевірте, чи з'являється посилання на сайт.",
                    "effort": "M"
                },
                {
                    "id": "citability.answer_first",
                    "severity": "low",
                    "text": "Немає короткого вступу з відповіддю одразу після H1",
                    "evidence": "Про мене (/press/): після H1 одразу H2 «Публікації та виступи», вступного абзацу немає",
                    "why": "AI-пошуковики охоче цитують перший абзац після заголовка, якщо він одразу відповідає на питання сторінки. Довгий вступ або його відсутність змушують модель шукати відповідь у глибині тексту.",
                    "fix": "Під H1 поставте 1-2 речення до 50-80 слів: що це, для кого і ключовий факт. Деталі - нижче, в окремих абзацах.",
                    "bad": "<h1>Олексій Матузний</h1>\n<h2>Публікації та виступи</h2>",
                    "good": "<h1>Олексій Матузний</h1>\n<p>Олексій Матузний - [ВКАЖІТЬ, хто ви, з якого року, де працюєте і скільки клієнтів]</p>\n<h2>Публікації та виступи</h2>",
                    "code": "<h1>Олексій Матузний</h1>\n<p>Олексій Матузний - [ВКАЖІТЬ, хто ви, з якого року, де працюєте і скільки клієнтів]</p>\n<h2>Публікації та виступи</h2>",
                    "verify": "Прочитайте лише H1 і перший абзац: з них має бути зрозуміло, що пропонується і чим це корисно. Повторний аудит.",
                    "effort": "S"
                }
            ],
            "data": {
                "site_type": "personal",
                "pages": [
                    {
                        "role": "home",
                        "url": "https://oleksiimatuznyi.com/",
                        "words_main": 770,
                        "words_unique": 740,
                        "dup_words": 30,
                        "popup_words": 0,
                        "main_source": "main",
                        "desc_words": null,
                        "blocks_40_150": 5,
                        "blocks_151_250": 0,
                        "walls_250": 0,
                        "h1": [
                            "Олексій Матузний"
                        ],
                        "h2_count": 2,
                        "question_headings": 0,
                        "intro_words": 21,
                        "intro_type": "p",
                        "lists": 3,
                        "tables": 0,
                        "sentences": 25,
                        "fact_share": 0.16,
                        "stat_blocks": 12,
                        "date": null,
                        "title_len": 46,
                        "desc_len": 147
                    },
                    {
                        "role": "about",
                        "url": "https://oleksiimatuznyi.com/press/",
                        "words_main": 155,
                        "words_unique": 155,
                        "dup_words": 0,
                        "popup_words": 0,
                        "main_source": "main",
                        "desc_words": null,
                        "blocks_40_150": 0,
                        "blocks_151_250": 0,
                        "walls_250": 0,
                        "h1": [
                            "Олексій Матузний"
                        ],
                        "h2_count": 4,
                        "question_headings": 0,
                        "intro_words": null,
                        "intro_type": "heading",
                        "lists": 0,
                        "tables": 0,
                        "sentences": 1,
                        "fact_share": 1,
                        "stat_blocks": 0,
                        "date": null,
                        "title_len": 40,
                        "desc_len": 139
                    },
                    {
                        "role": "contact",
                        "url": "https://oleksiimatuznyi.com/contact",
                        "title_len": 54,
                        "desc_len": 142,
                        "note": "оцінено лише title і description"
                    }
                ],
                "unavailable": [],
                "sub_weights": {
                    "volume": 15,
                    "passages": 20,
                    "headings": 15,
                    "answer_first": 10,
                    "structure": 10,
                    "facts": 10,
                    "freshness": 8,
                    "meta": 7,
                    "og": 5
                },
                "role_weight": {
                    "home": 1,
                    "article": 2,
                    "service": 1.5,
                    "about": 1.2,
                    "product": 2,
                    "category": 1
                }
            }
        },
        {
            "id": "schema",
            "name": "Структуровані дані",
            "weight": 0.12,
            "status": "ok",
            "score": 95,
            "summary": "Є Organization, WebSite, Article, ProfilePage, Person та ще 1. Головне: BreadcrumbList є не на всіх внутрішніх сторінках.",
            "sub_scores": {
                "jsonld_valid": 100,
                "entity": 100,
                "entity_props": 100,
                "website": 100,
                "breadcrumbs": 50,
                "type_specific": 100
            },
            "sub_labels": {
                "jsonld_valid": "Валідність JSON-LD",
                "entity": "Сутність особи (Person)",
                "entity_props": "Повнота даних Person",
                "website": "WebSite з назвою сайту",
                "breadcrumbs": "BreadcrumbList на внутрішніх сторінках",
                "type_specific": "ProfilePage з mainEntity -> Person"
            },
            "passed": [
                "JSON-LD без синтаксичних помилок: 6 блоків на 3 сторінках",
                "Person «Олексій Матузний» (головна, «Про мене» /press/, «Контакти» /contact): name, url, image, jobTitle, sameAs (12 профілів), knowsAbout (13 тем)",
                "Person - головна сутність головної (ProfilePage.mainEntity)",
                "WebSite з назвою «Олексій Матузний» (головна)",
                "BreadcrumbList є на 1 з 2 внутрішніх сторінок",
                "ProfilePage з mainEntity -> Person (головна)",
                "Розмітка microdata: Article"
            ],
            "findings": [
                {
                    "id": "schema.breadcrumbs",
                    "severity": "low",
                    "text": "BreadcrumbList є не на всіх внутрішніх сторінках",
                    "evidence": "Без BreadcrumbList: «Про мене» /press/ (JSON-LD: ProfilePage, Person). З розміткою: «Контакти» /contact.",
                    "why": "Хлібні крихти показують машинам ієрархію сайту: до якого розділу належить сторінка. Це допомагає правильно зрозуміти контекст сторінки, а в десктопній видачі Google показує цей шлях поруч із доменом (на мобільних із січня 2025 року лише домен).",
                    "fix": "Додайте BreadcrumbList у шаблони внутрішніх сторінок; пункти мають збігатися з видимими хлібними крихтами.",
                    "bad": "«Про мене» /press/: JSON-LD: ProfilePage, Person",
                    "good": "Головна -> розділ -> поточна сторінка у вигляді BreadcrumbList з position, name та item.",
                    "code": "<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"BreadcrumbList\",\n  \"itemListElement\": [\n    {\n      \"@type\": \"ListItem\",\n      \"position\": 1,\n      \"name\": \"Головна\",\n      \"item\": \"https://oleksiimatuznyi.com/\"\n    },\n    {\n      \"@type\": \"ListItem\",\n      \"position\": 2,\n      \"name\": \"Олексій Матузний\",\n      \"item\": \"https://oleksiimatuznyi.com/press/\"\n    }\n  ]\n}\n</script>",
                    "verify": "Google Rich Results Test для https://oleksiimatuznyi.com/press/ - розділ «Навігаційні ланцюжки» без помилок.",
                    "effort": "S"
                }
            ],
            "data": {
                "jsonld_blocks": 6,
                "jsonld_invalid": 0,
                "entity": {
                    "type": "Person",
                    "name": "Олексій Матузний",
                    "found_on": [
                        "головна",
                        "«Про мене» /press/",
                        "«Контакти» /contact"
                    ],
                    "present": [
                        "name",
                        "url",
                        "image",
                        "jobTitle",
                        "sameAs (12 профілів)",
                        "knowsAbout (13 тем)"
                    ],
                    "missing": [],
                    "main_entity": "ProfilePage.mainEntity"
                },
                "breadcrumbs": "1/2",
                "type_specific": {
                    "primary": 100,
                    "article": null
                },
                "site_type": "personal",
                "pages": [
                    {
                        "role": "home",
                        "url": "https://oleksiimatuznyi.com/",
                        "types": {
                            "json-ld": [
                                "Organization",
                                "WebSite",
                                "WebPage",
                                "Article",
                                "ProfilePage",
                                "Person"
                            ],
                            "microdata": [
                                "Article"
                            ]
                        },
                        "jsonld_blocks": 2,
                        "jsonld_errors": 0
                    },
                    {
                        "role": "about",
                        "url": "https://oleksiimatuznyi.com/press/",
                        "types": {
                            "json-ld": [
                                "ProfilePage",
                                "Person"
                            ]
                        },
                        "jsonld_blocks": 1,
                        "jsonld_errors": 0
                    },
                    {
                        "role": "contact",
                        "url": "https://oleksiimatuznyi.com/contact",
                        "types": {
                            "json-ld": [
                                "BreadcrumbList",
                                "Organization",
                                "WebSite",
                                "WebPage",
                                "Article",
                                "ProfilePage",
                                "Person"
                            ],
                            "microdata": [
                                "Article"
                            ]
                        },
                        "jsonld_blocks": 3,
                        "jsonld_errors": 0
                    }
                ]
            }
        },
        {
            "id": "eeat",
            "name": "E-E-A-T сигнали",
            "weight": 0.14,
            "status": "ok",
            "score": 82,
            "summary": "Є канали зв'язку, «Про мене» (155 слів), підтвердження експертизи; бракує політики конфіденційності для форми.",
            "sub_scores": {
                "about": 100,
                "contacts": 100,
                "legal": 0,
                "identity": null,
                "authorship": null,
                "reviews": null,
                "trust_markers": 75
            },
            "sub_labels": {
                "about": "Сторінка «Про мене»",
                "contacts": "Канали зв'язку",
                "legal": "Політика конфіденційності (якщо є форма)",
                "identity": "Реквізити (необов'язково)",
                "authorship": "Автори й дати статей",
                "reviews": "Відгуки (враховано в маркерах довіри)",
                "trust_markers": "Підтвердження експертизи: кейси, публікації, виступи, відгуки, профілі"
            },
            "passed": [
                "Канали зв'язку: email alexey.websearch@gmail.com; Telegram t.me/sneex_seo; LinkedIn linkedin.com/in/alexey-matyzniy; форма зв'язку («Контакти» /contact)",
                "Сторінка контактів: https://oleksiimatuznyi.com/contact",
                "Сторінка «Про мене»: https://oleksiimatuznyi.com/press/ (155 слів, HTTP 200)",
                "На «Про мене» є: досвід («за 8+ років»), особа («Person у розмітці («Олексій Матузний»)»), географія («Odesa (розмітка Person)»), досягнення («Кейс COMFY»)",
                "Маркер довіри (роки досвіду): «8-річним досвідом»",
                "Маркер довіри (кейси / клієнти): «Кейс COMFY» («Про мене»), «Кейс Bayadera» («Про мене»)",
                "Маркер довіри (публікації / експертні коментарі): «Публікації» («Про мене»), «авторські статті» («Про мене»)",
                "Маркер довіри (виступи / конференції): «виступити на відомих», «конференціях»",
                "Маркер довіри (профілі на зовнішніх майданчиках): посилання на LinkedIn, Facebook, YouTube, GitHub, Telegram"
            ],
            "findings": [
                {
                    "id": "eeat.legal_missing",
                    "severity": "low",
                    "text": "Немає політики конфіденційності, хоча сайт збирає дані через форму",
                    "evidence": "Форма з полями контактних даних є на сторінці «Контакти» (/contact). Посилань на політику конфіденційності на головній, сторінці «Про мене», сторінці «Контакти», сторінках футера «Інструменти та проєкти» немає, типові адреси (/privacy, /privacy-policy) не відкрились. Умови використання для особистого сайту не обов'язкові й не перевірялись.",
                    "why": "Це рекомендація: форма збирає ім'я, email чи телефон, а Закон «Про захист персональних даних» вимагає повідомляти людей, хто і навіщо обробляє їхні дані. Коротка політика також додає довіри до сайту.",
                    "fix": "Додайте коротку сторінку «Політика конфіденційності» (хто обробляє дані, які, навіщо, як видалити) і посилання на неї біля форми та у футері.",
                    "bad": "Форма є (сторінці «Контакти» (/contact)), посилання на політику немає",
                    "good": "Біля форми: «Надсилаючи форму, ви погоджуєтеся з політикою конфіденційності»\nУ футері: Політика конфіденційності - /privacy-policy/",
                    "code": "<p class=\"form-consent\">Надсилаючи форму, ви погоджуєтеся з <a href=\"/privacy-policy/\">політикою конфіденційності</a>.</p>",
                    "verify": "Відкрийте сторінку з формою: біля кнопки є посилання на політику, сторінка віддає HTTP 200.",
                    "effort": "S"
                }
            ],
            "data": {
                "site_type": "personal",
                "ymyl": null,
                "ymyl_signal": null,
                "weights": {
                    "about": 24,
                    "contacts": 16,
                    "legal": 6,
                    "identity": 4,
                    "authorship": 16,
                    "reviews": 4,
                    "trust_markers": 30
                },
                "extra_requests": [
                    "footer:1",
                    "probe:/privacy/,/privacy-policy/,/polityka-konfidentsiinosti/"
                ],
                "contacts": {
                    "channels": [
                        "email",
                        "telegram",
                        "linkedin",
                        "form"
                    ],
                    "emails": [
                        "alexey.websearch@gmail.com"
                    ],
                    "phones": [],
                    "telegram": "https://t.me/sneex_seo",
                    "linkedin": "https://www.linkedin.com/in/alexey-matyzniy/",
                    "form": "https://oleksiimatuznyi.com/contact",
                    "contact_url": "https://oleksiimatuznyi.com/contact",
                    "note": "особистий сайт: телефон і адреса не обов'язкові"
                },
                "about": {
                    "url": "https://oleksiimatuznyi.com/press/",
                    "linked": true,
                    "via": "link",
                    "status": 200,
                    "words": 155,
                    "facets": {
                        "year": "за 8+ років",
                        "team": "Person у розмітці («Олексій Матузний»)",
                        "geo": "Odesa (розмітка Person)",
                        "achievements": "Кейс COMFY"
                    }
                },
                "legal": [],
                "identity": {
                    "found": "",
                    "where": [],
                    "note": "для особистого сайту експерта реквізити (ФОП, ТОВ) не обов'язкові"
                },
                "authorship": "н/д: у вибірці немає статті",
                "reviews": "н/д: для особистого сайту відгуки враховано в маркерах довіри",
                "trust_markers": {
                    "years": [
                        "«8-річним досвідом»"
                    ],
                    "cases": [
                        "«Кейс COMFY» («Про мене»)",
                        "«Кейс Bayadera» («Про мене»)"
                    ],
                    "publications": [
                        "«Публікації» («Про мене»)",
                        "«авторські статті» («Про мене»)"
                    ],
                    "talks": [
                        "«виступити на відомих»",
                        "«конференціях»"
                    ],
                    "profiles": [
                        "посилання на LinkedIn, Facebook, YouTube, GitHub, Telegram"
                    ]
                }
            }
        },
        {
            "id": "brand",
            "name": "Сутність бренду",
            "weight": 0.12,
            "status": "ok",
            "score": 79,
            "summary": "Сутність підтверджена у Wikidata (Q141100859); статті у Вікіпедії uk/en немає; 6 профілів у соцмережах; sameAs повний.",
            "sub_scores": {
                "wikidata": 96,
                "wikipedia": 0,
                "wiki_mentions": 0,
                "social": 100,
                "same_as": 100,
                "consistency": 100,
                "local_profile": null
            },
            "sub_labels": {
                "wikidata": "Wikidata (підтверджено доменом)",
                "wikipedia": "Стаття про особу у Вікіпедії (uk/en)",
                "wiki_mentions": "Посилання з Вікіпедії на сайт",
                "social": "Профілі особи (LinkedIn, соцмережі)",
                "same_as": "sameAs у Person",
                "consistency": "Узгодженість імені / назви сайту",
                "local_profile": "Google Maps / Business Profile (лише для локального бізнесу)"
            },
            "passed": [
                "Сутність у Wikidata підтверджена доменом: Q141100859 «Олексій Матузний», P856 = https://oleksiimatuznyi.com/",
                "Сайт посилається на профілі особи: Facebook - facebook.com/AlexMatuznyi, LinkedIn - linkedin.com/in/alexey-matyzniy, YouTube - youtube.com/channel/UCfOYAtm_mJzer8oiPjKFagg, Telegram - t.me/sneex_seo, GitHub - github.com/sneex-seo; лише в sameAs: Instagram",
                "sameAs в Person містить усі знайдені профілі і Wikidata (6 з 6)",
                "og:site_name «Олексій Матузний» відповідає назві бренду",
                "Назва бренду «Олексій Матузний» є в title головної",
                "Назва бренду однакова в метаданих: og:site_name «Олексій Матузний», Person.name «Олексій Матузний», WebSite.name «Олексій Матузний»"
            ],
            "findings": [
                {
                    "id": "brand.wikidata_incomplete",
                    "severity": "low",
                    "text": "Елемент Wikidata про особу заповнений не повністю",
                    "evidence": "Q141100859 «Олексій Матузний» (клас: людина): немає P734 (прізвище), P3789 Telegram. Заповнено: P31, P106, P27, P735, P2013, P2003, P2397, P2037, P6634, P856.",
                    "why": "Чим повніший елемент (рід занять, громадянство, ім'я та прізвище, профілі в соцмережах), тим точніше AI-системи описують особу і зіставляють з профілями.",
                    "fix": "Додайте відсутні твердження з джерелами. Рядки, які можна заповнити з даних сайту, - у форматі QuickStatements (quickstatements.toolforge.org, V1). Вручну: P734 (прізвище - елемент прізвища).",
                    "bad": "Q141100859: P31, P106, P27, P735, P2013, P2003, P2397, P2037, P6634, P856\nНемає: P734 (прізвище), P3789 Telegram",
                    "good": "Q141100859: P31, P106, P27, P735, P734, P856 + ідентифікатори профілів (P2013, P2003, P6634, P2397, P3789) + назва й опис uk/en",
                    "code": "Q141100859|P3789|\"sneex_seo\"",
                    "verify": "https://www.wikidata.org/wiki/Q141100859 - нові твердження видно на сторінці елемента; повторний аудит не покаже цього зауваження.",
                    "effort": "S"
                },
                {
                    "id": "brand.no_wikipedia",
                    "severity": "low",
                    "text": "Про особу немає статті у Вікіпедії (uk, en)",
                    "evidence": "Елемент Q141100859 «Олексій Матузний» не має статей у uk.wikipedia і en.wikipedia.",
                    "why": "Вікіпедія - одне з найвагоміших джерел у навчальних даних мовних моделей. Для більшості експертів статті немає, і це нормально; але якщо вона з'явиться, моделі, навчені після цього, зможуть описати вас без пошуку.",
                    "fix": "Не пишіть статтю про себе і не замовляйте її: це конфлікт інтересів, такі статті видаляють. Значущість людини доводять незалежні джерела (інтерв'ю, профільні публікації про вас, нагороди, рейтинги). Коли їх достатньо, статтю може створити незалежний автор.",
                    "bad": "uk.wikipedia.org: статті немає\nen.wikipedia.org: статті немає",
                    "good": "Стаття про «Олексій Матузний» з 3+ незалежними джерелами, пов'язана з елементом Q141100859",
                    "code": "",
                    "verify": "https://www.wikidata.org/wiki/Q141100859 - у розділі «Вікіпедія» з'являються ukwiki / enwiki.",
                    "effort": "L"
                },
                {
                    "id": "brand.no_wiki_mentions",
                    "severity": "low",
                    "text": "Жодна стаття uk/en Вікіпедії не посилається на oleksiimatuznyi.com",
                    "evidence": "Пошук зовнішніх посилань (exturlusage) на oleksiimatuznyi.com в основному просторі статей: uk.wikipedia - 0, en.wikipedia - 0.",
                    "why": "Посилання з тематичних статей Вікіпедії показують, що сайт вважають джерелом. Вага для ранжування не гарантована (Вікіпедія ставить nofollow, а Google вважає його лише підказкою), але моделі бачать ваше ім'я у контексті теми.",
                    "fix": "Не додавайте посилання на свій сайт у Вікіпедію самі - це конфлікт інтересів, такі правки відкочують. Публікуйте власні дослідження, дані й експертні матеріали, які цитують профільні медіа, - згодом вони стають джерелами для статей Вікіпедії.",
                    "bad": "uk.wikipedia.org: 0 статей з посиланням на oleksiimatuznyi.com\nen.wikipedia.org: 0",
                    "good": "Кілька тематичних статей цитують ваші дані чи матеріали в розділі «Примітки»",
                    "code": "",
                    "verify": "Спеціальна сторінка пошуку посилань: https://uk.wikipedia.org/wiki/Special:LinkSearch?target=oleksiimatuznyi.com (так само для en.wikipedia.org).",
                    "effort": "L"
                }
            ],
            "data": {
                "brand": "Олексій Матузний",
                "brand_core": "Олексій Матузний",
                "host": "oleksiimatuznyi.com",
                "search_terms": [
                    "Олексій Матузний",
                    "oleksiimatuznyi"
                ],
                "wikidata": {
                    "status": "verified",
                    "id": "Q141100859",
                    "label": "Олексій Матузний",
                    "p856": [
                        "https://oleksiimatuznyi.com/"
                    ],
                    "via": "sparql",
                    "class": "person",
                    "missing": [
                        "P734 (прізвище)",
                        "P3789 Telegram"
                    ],
                    "others": []
                },
                "wikipedia": {
                    "uk": null,
                    "en": null,
                    "other_count": 0,
                    "entity": "Q141100859"
                },
                "wiki_mentions": {
                    "uk": 0,
                    "en": 0,
                    "more": false,
                    "examples": [],
                    "own_article": []
                },
                "social": {
                    "facebook": "https://www.facebook.com/AlexMatuznyi",
                    "linkedin": "https://www.linkedin.com/in/alexey-matyzniy/",
                    "youtube": "https://www.youtube.com/channel/UCfOYAtm_mJzer8oiPjKFagg",
                    "telegram": "https://t.me/sneex_seo",
                    "github": "https://github.com/sneex-seo",
                    "instagram": "https://www.instagram.com/matyzniy (лише sameAs)"
                },
                "social_other": [
                    "https://t.me/alexey_web"
                ],
                "same_as": {
                    "org_found": true,
                    "values": [
                        "https://www.linkedin.com/in/alexey-matyzniy/",
                        "https://www.facebook.com/AlexMatuznyi",
                        "https://www.youtube.com/channel/UCfOYAtm_mJzer8oiPjKFagg",
                        "https://github.com/sneex-seo/",
                        "https://www.instagram.com/matyzniy/",
                        "https://t.me/sneex_seo",
                        "https://collaborator.pro/ua/author/oleksii-matuznyi",
                        "https://conference.collaborator.pro/speakers/profile/oleksii-matuznii",
                        "https://theorg.com/org/netpeak/person/oleksii-matuznyi",
                        "https://www.wikidata.org/wiki/Q141100859",
                        "https://orcid.org/0009-0002-0924-2690",
                        "https://openalex.org/A5119694240"
                    ],
                    "missing": [],
                    "invalid": []
                },
                "names": {
                    "title": "SEO Team Lead і консультант - Олексій Матузний",
                    "og_site_name": "Олексій Матузний",
                    "organization": "Олексій Матузний",
                    "website": "Олексій Матузний"
                },
                "weights": {
                    "wikidata": 25,
                    "wikipedia": 10,
                    "wiki_mentions": 10,
                    "social": 25,
                    "same_as": 20,
                    "consistency": 10
                }
            }
        },
        {
            "id": "technical",
            "name": "Технічна база",
            "weight": 0.1,
            "status": "ok",
            "score": 91,
            "summary": "Сервер повільно віддає головну: TTFB 1 082 мс; Бракує заголовків безпеки: X-Content-Type-Options.",
            "sub_scores": {
                "https": 100,
                "host_canonicalization": 100,
                "ttfb": 45,
                "compression": 100,
                "http2": 100,
                "cwv": null,
                "mobile": 100,
                "images_alt": 100,
                "soft404": 100,
                "security_headers": 75
            },
            "sub_labels": {
                "https": "HTTPS і редирект з http",
                "host_canonicalization": "Одна версія хоста (www / без www)",
                "ttfb": "Час відповіді сервера (TTFB)",
                "compression": "Стиснення і розмір HTML",
                "http2": "HTTP/2+",
                "cwv": "Core Web Vitals",
                "mobile": "Мобільний viewport",
                "images_alt": "Атрибут alt у зображеннях",
                "soft404": "Коректний 404 для неіснуючих URL",
                "security_headers": "Заголовки безпеки"
            },
            "passed": [
                "HTTPS: http://oleksiimatuznyi.com/ -> 301 -> https://oleksiimatuznyi.com/ -> 200",
                "Одна версія хоста: https://www.oleksiimatuznyi.com/ -> 301 -> https://oleksiimatuznyi.com/ -> 200",
                "HTML стискається (zstd): 9 КБ по мережі замість 35 КБ",
                "Розмір HTML головної: 35 КБ",
                "Протокол HTTP/2, HTTP/3 оголошено через alt-svc",
                "Мобільний viewport: width=device-width, initial-scale=1",
                "Усі 34 унікальні зображення на 3 сторінках мають атрибут alt (з них 1 з порожнім alt=\"\", що доречно лише для декоративних)",
                "Неіснуюча сторінка повертає 404"
            ],
            "findings": [
                {
                    "id": "technical.slow_ttfb",
                    "severity": "medium",
                    "text": "Сервер повільно віддає головну: TTFB 1 082 мс",
                    "evidence": "Замір із сервера аудиту (Німеччина), 2 запити: 1 345 мс і 1 082 мс.\nУ контрольному запиті (1 082 мс) очікування відповіді сервера ~1 018 мс, DNS + з'єднання + TLS ~64 мс.",
                    "why": "На повільні відповіді сервера Googlebot реагує зменшенням обходу; ліміти AI-краулерів не публікуються, але повільний сервер ризикує так само: менше сторінок потрапляє в індекс. Для людей повільний TTFB напряму погіршує LCP.",
                    "fix": "Основна затримка - генерація сторінки на сервері. Увімкніть повносторінковий кеш (кеш CMS, nginx fastcgi_cache або CDN з кешуванням HTML), перевірте повільні SQL-запити й плагіни.",
                    "bad": "TTFB головної: 1 345 мс і 1 082 мс (генерація ~1 018 мс)",
                    "good": "TTFB до 800 мс (норма web.dev), для кешованих сторінок - 100-300 мс",
                    "code": "# nginx + PHP-FPM: мікрокеш HTML на 1 хвилину для анонімних відвідувачів\n# http { ... }\nfastcgi_cache_path /var/cache/nginx/html levels=1:2 keys_zone=HTML:50m inactive=10m max_size=1g;\n\n# server { ... }\nset $skip_cache 0;\nif ($request_method = POST) { set $skip_cache 1; }\nif ($http_cookie ~* \"PHPSESSID|wordpress_logged_in|comment_author\") { set $skip_cache 1; }\n\nlocation ~ \\.php$ {\n    include fastcgi_params;\n    fastcgi_pass unix:/run/php/php-fpm.sock;\n    fastcgi_cache HTML;\n    fastcgi_cache_key $scheme$host$request_uri;\n    fastcgi_cache_valid 200 301 1m;\n    fastcgi_cache_bypass $skip_cache;\n    fastcgi_no_cache $skip_cache;\n    fastcgi_cache_use_stale error timeout updating http_500;\n    add_header X-Cache $upstream_cache_status;\n}",
                    "verify": "curl -o /dev/null -s -w \"TTFB: %{time_starttransfer}s\\n\" https://oleksiimatuznyi.com/ (повторіть 3-5 разів), а також PageSpeed Insights -> «Час до першого байта».",
                    "effort": "M"
                },
                {
                    "id": "technical.security_headers",
                    "severity": "low",
                    "text": "Бракує заголовків безпеки: X-Content-Type-Options",
                    "evidence": "+ Strict-Transport-Security: max-age=31536000\n- X-Content-Type-Options: відсутній\n+ Referrer-Policy: strict-origin-when-cross-origin\n+ X-Frame-Options / CSP frame-ancestors: X-Frame-Options: SAMEORIGIN",
                    "why": "На AI-видимість ці заголовки прямо не впливають, але це базова гігієна: захист від підміни типу контенту, клікджекінгу і витоку адрес. Їх перевіряють сканери безпеки та сервіси оцінки довіри до сайту.",
                    "fix": "Додайте відсутні заголовки на рівні веб-сервера або CDN для всіх відповідей.",
                    "bad": "HTTP/2 200\nserver: cloudflare\ncontent-type: text/html; charset=utf-8\nstrict-transport-security: max-age=31536000\nreferrer-policy: strict-origin-when-cross-origin\nx-frame-options: SAMEORIGIN",
                    "good": "HTTP/2 200\nserver: cloudflare\ncontent-type: text/html; charset=utf-8\nstrict-transport-security: max-age=31536000\nx-content-type-options: nosniff\nreferrer-policy: strict-origin-when-cross-origin\nx-frame-options: SAMEORIGIN",
                    "code": "# Cloudflare: Rules -> Transform Rules -> Modify Response Header -> Set static\n# (X-Content-Type-Options); або на сервері-джерелі:\n\n# nginx (server { ... } для oleksiimatuznyi.com)\nadd_header X-Content-Type-Options \"nosniff\" always;\n\n# Apache (.htaccess, потрібен mod_headers; Header always set замінює наявне значення)\n<IfModule mod_headers.c>\n  Header always set X-Content-Type-Options \"nosniff\"\n</IfModule>",
                    "verify": "curl -sI https://oleksiimatuznyi.com/ | grep -iE \"strict-transport|x-content-type|referrer-policy|x-frame|content-security\" або https://securityheaders.com/?q=oleksiimatuznyi.com",
                    "effort": "S"
                }
            ],
            "data": {
                "final_url": "https://oleksiimatuznyi.com/",
                "fetched_as": "bot",
                "ssl_verified": true,
                "http_chain": {
                    "status": 200,
                    "final": "https://oleksiimatuznyi.com/",
                    "hops": [
                        "301 http://oleksiimatuznyi.com/",
                        "200 https://oleksiimatuznyi.com/"
                    ],
                    "error": null
                },
                "alt_chain": {
                    "status": 200,
                    "final": "https://oleksiimatuznyi.com/",
                    "hops": [
                        "301 https://www.oleksiimatuznyi.com/",
                        "200 https://oleksiimatuznyi.com/"
                    ],
                    "error": null
                },
                "ttfb_ms": [
                    1345,
                    1082
                ],
                "ttfb_server_ms": 1018,
                "html_bytes": 35942,
                "html_bytes_network": 8912,
                "content_encoding": "zstd",
                "http_version": "HTTP/2",
                "viewport": "width=device-width, initial-scale=1",
                "images": {
                    "checked_pages": 3,
                    "unique": 34,
                    "with_alt": 34,
                    "empty_alt": 1,
                    "missing_alt": 0,
                    "ignored": 0
                },
                "stack": {
                    "host": "cloudflare"
                },
                "soft404": {
                    "url": "https://oleksiimatuznyi.com/geo-audit-404-check-5c1fa26555",
                    "status": 404,
                    "chain": "https://oleksiimatuznyi.com/geo-audit-404-check-5c1fa26555 -> 404"
                },
                "security_headers": {
                    "hsts": true,
                    "xcto": false,
                    "refpol": true,
                    "frame": true
                },
                "psi": {
                    "status": "quota",
                    "http": 429,
                    "error": "Quota exceeded for quota metric 'Queries' and limit 'Queries per day' of service 'pagespeedonline.googleapis.com' for consumer 'project_number:583797351490'.",
                    "ms": 367,
                    "keyed": false,
                    "crux_api": "no_key",
                    "note": "вичерпано спільну квоту PageSpeed Insights для запитів без ключа; потрібен власний ключ (PAGESPEED_API_KEY у .env) з увімкненим PageSpeed Insights API"
                }
            }
        },
        {
            "id": "sitemap",
            "name": "XML-карта сайту",
            "weight": 0.05,
            "status": "ok",
            "score": 100,
            "summary": "Карта знайдена (46 URL), без зауважень.",
            "sub_scores": {
                "exists": 100,
                "robots_ref": 100,
                "valid_xml": 100,
                "coverage": 100,
                "lastmod": 100,
                "consistency": 100,
                "url_status": 100
            },
            "sub_labels": {
                "exists": "Карта знайдена",
                "robots_ref": "Посилання в robots.txt",
                "valid_xml": "Валідний XML і namespace",
                "coverage": "Обсяг і повнота",
                "lastmod": "Дати lastmod",
                "consistency": "Протокол і хост URL",
                "url_status": "Коди відповіді URL з карти"
            },
            "passed": [
                "Карта https://oleksiimatuznyi.com/sitemap.xml (з robots.txt) відповідає 200: 46 URL",
                "Карта вказана в robots.txt: «Sitemap: https://oleksiimatuznyi.com/sitemap.xml»",
                "XML валідний, namespace http://www.sitemaps.org/schemas/sitemap/0.9 (перевірено файлів: 1)",
                "Головна та внутрішні сторінки з вибірки аудиту є в карті",
                "lastmod у 100% записів, найновіший 2026-11-03 (карта свіжа)",
                "URL у карті (перевірено 46) на тому ж протоколі й хості, що й головна: https://oleksiimatuznyi.com",
                "Вибірка URL з карти (6 з 6) відповідає 200 без noindex і з canonical на себе, без редиректів"
            ],
            "findings": [],
            "data": {
                "robots_state": "ok",
                "robots_lines": [
                    "Sitemap: https://oleksiimatuznyi.com/sitemap.xml"
                ],
                "robots_sitemaps_total": 1,
                "candidates": {
                    "https://oleksiimatuznyi.com/sitemap.xml": "HTTP 200, 46 URL"
                },
                "sitemap_urls": [
                    "https://oleksiimatuznyi.com/sitemap.xml"
                ],
                "source": "robots",
                "kind": "urlset",
                "fetched_as": "bot",
                "children_total": 0,
                "children_listed": 0,
                "children_checked": [],
                "urls_counted": 46,
                "urls_estimated": null,
                "complete": true,
                "lastmod": {
                    "entries": 46,
                    "with_lastmod": 46,
                    "distinct": 3,
                    "newest": "2026-11-03",
                    "age_days": 0
                },
                "mismatch": {
                    "checked": 46,
                    "scheme": 0,
                    "www": 0,
                    "foreign": 0,
                    "robots_ref": 0
                },
                "url_checks": {
                    "https://oleksiimatuznyi.com/seo-courses": "HTTP 200",
                    "https://oleksiimatuznyi.com/cases/case-2": "HTTP 200",
                    "https://oleksiimatuznyi.com/cases/case-10": "HTTP 200",
                    "https://oleksiimatuznyi.com/cases/case-17": "HTTP 200",
                    "https://oleksiimatuznyi.com/cases/case-25": "HTTP 200",
                    "https://oleksiimatuznyi.com/en/cases.php": "HTTP 200"
                },
                "timing_ms": {
                    "discover": 146,
                    "children": 0,
                    "url_checks": 1348,
                    "total": 1495
                }
            }
        },
        {
            "id": "llmstxt",
            "name": "llms.txt",
            "weight": 0.03,
            "status": "ok",
            "score": 0,
            "summary": "Файлу llms.txt немає (404). Стандарт неофіційний, вага перевірки мінімальна.",
            "sub_scores": {
                "exists": 0,
                "structure": null,
                "links_ok": null
            },
            "sub_labels": {
                "exists": "Файл доступний",
                "structure": "Структура за llmstxt.org",
                "links_ok": "Посилання працюють"
            },
            "passed": [],
            "findings": [
                {
                    "id": "llmstxt.missing",
                    "severity": "low",
                    "text": "Немає файлу llms.txt",
                    "evidence": "GET https://oleksiimatuznyi.com/llms.txt -> HTTP 404. /llms-full.txt: HTTP 404. Чернетку нижче складено з реальних даних сайту: назва, опис з метатегів, 9 посилань з головної та вибірки сторінок.",
                    "why": "llms.txt - неофіційна пропозиція (llmstxt.org, 2024): markdown-файл зі стислим описом сайту і ключовими посиланнями для мовних моделей. Google у документації Пошуку пише, що llms.txt не використовує, а OpenAI, Perplexity та інші AI-пошуковики публічно не підтверджували, що читають цей файл. Тож це дешевий експеримент на майбутнє, а не фактор видимості.",
                    "fix": "Якщо хочете підстрахуватися на майбутнє - розмістіть у корені сайту llms.txt за чернеткою нижче (перевірте опис і посилання) і віддавайте його як text/plain; charset=utf-8.",
                    "bad": "GET /llms.txt -> 404 Not Found",
                    "good": "GET /llms.txt -> 200, text/plain; charset=utf-8\n# Олексій Матузний\n\n> SEO Team Lead із 8-річним досвідом: технічний аудит, лінкбілдинг і Python-автоматизація. Веду SEO-проєкти від стратегії до вимірюваного результату.\n\n## Послуги\n- [Кейси](https://oleksiimatuznyi.com/cases)\n...",
                    "code": "# Олексій Матузний\n\n> SEO Team Lead із 8-річним досвідом: технічний аудит, лінкбілдинг і Python-автоматизація. Веду SEO-проєкти від стратегії до вимірюваного результату.\n\n## Послуги\n- [Кейси](https://oleksiimatuznyi.com/cases)\n- [Курси по SEO](https://oleksiimatuznyi.com/seo-courses)\n- [SEO Аудит](https://oleksiimatuznyi.com/seo-audit)\n- [SEO Консультації](https://oleksiimatuznyi.com/seo-consulting)\n- [SEO просування](https://oleksiimatuznyi.com/seo-promotion)\n- [Граф знань](https://oleksiimatuznyi.com/graph/)\n- [Інструменти](https://oleksiimatuznyi.com/lab/)\n\n## Про мене\n- [Про мене](https://oleksiimatuznyi.com/press/): Виступи на конференціях, авторські статті, кейси та експертні коментарі Олексія Матузного у профільних медіа...\n- [Контакти](https://oleksiimatuznyi.com/contact): Залишіть заявку на SEO-консультацію: заповніть форму й оберіть тип консультації, і Олексій Матузний зв'яжеться з вами...",
                    "verify": "curl -s -i https://oleksiimatuznyi.com/llms.txt | head -15 - очікуємо HTTP 200, Content-Type: text/plain і текст, що починається з «# Олексій Матузний».",
                    "effort": "S"
                }
            ],
            "data": {
                "llms_txt": "HTTP 404",
                "llms_full_txt": "HTTP 404"
            }
        }
    ],
    "ai": {
        "enabled": false,
        "model": null,
        "usage": {
            "in": 0,
            "out": 0
        },
        "message": "AI-аналіз вимкнено для цього запуску.",
        "sections": []
    },
    "meta": {
        "job_id": null,
        "engine_version": "2.0.0",
        "duration_ms": 11628,
        "timings": {
            "homepage": 1352,
            "robots": 140,
            "pick_samples": 313,
            "fetch_samples": 802,
            "site_profile": 9,
            "check:CrawlerCheck": 1776,
            "check:ContentRenderCheck": 200,
            "check:CitabilityCheck": 13,
            "check:SchemaCheck": 15,
            "check:EeatCheck": 1170,
            "check:BrandCheck": 1907,
            "check:TechnicalCheck": 1314,
            "check:SitemapCheck": 1495,
            "check:LlmsTxtCheck": 1076,
            "ai": 0
        }
    }
}
