{
  "study": "ukraine-dental-2026",
  "title": "Websites of private dental practices in Ukraine",
  "publisher": "TimeKairos",
  "page": "https://timekairos.com/research/stomatolohiyi-2026",
  "measuredOn": "2026-10-01",
  "sampleFrozenOn": "2026-09-29",
  "engine": "AI X-Ray · research-xray-lab 1.2",
  "run": "Ds9oV6lZFXUw",
  "seed": 2027,
  "note": "Percentages are counted over all 200 selected sites unless a different denominator is named. A site that could not be reached is counted neither as having a problem nor as free of it. Speed figures use the 116 sites whose speed could be measured, and say so.",
  "frame": {
    "onOpenStreetMap": 2964,
    "drawnPool": 332,
    "withWebsite": 293,
    "eligible": 278,
    "checked": 200,
    "fullyMeasured": 121,
    "speedMeasured": 116
  },
  "speed": {
    "lcpBands": {
      "good_under_2500ms": 10,
      "needsWork_2500_4000ms": 11,
      "poor_over_4000ms": 95,
      "notMeasured": 84
    },
    "clsBands": {
      "good": 99,
      "needsWork": 4,
      "poor": 13,
      "notMeasured": 84
    },
    "medians": {
      "lcpMs": 8816,
      "ttfbMs": 287,
      "pageSpeedScore": 59.5
    }
  },
  "shares": {
    "site_dead": {
      "count": 47,
      "of": 200,
      "percent": 23.5,
      "ci95": [
        18.2,
        29.8
      ],
      "definition": "Served no working home page on the measurement day: 35 domains had no DNS record (ERR_NAME_NOT_RESOLVED), 2 hosts were unreachable, 10 servers returned HTTP 404. Verified to contain no bot blocks, robots.txt refusals, rate limits or offsite redirects. A single-day observation, not a claim of permanent unavailability nor of the domain having ceased to exist."
    },
    "exposed_files": {
      "count": 16,
      "of": 200,
      "percent": 8.0,
      "ci95": [
        5.0,
        12.6
      ],
      "definition": "Files normally closed off were reachable over HTTP. Severity split by the analyser: 3 sites served a file of the credential-bearing kind (.env, .git/config, wp-config, .sql), 13 served files that reveal internal structure only. Paths are not published and were not retained in the published dataset.",
      "bySeverity": {
        "credentialBearing": 3,
        "structureOnly": 13
      }
    },
    "domain_expiring": {
      "count": 11,
      "of": 200,
      "percent": 5.5,
      "ci95": [
        3.1,
        9.6
      ],
      "definition": "60 days or fewer remaining on the domain registration."
    },
    "no_https": {
      "count": 5,
      "of": 200,
      "percent": 2.5,
      "ci95": [
        1.1,
        5.7
      ]
    },
    "ssl_bad": {
      "count": 3,
      "of": 200,
      "percent": 1.5,
      "ci95": [
        0.5,
        4.3
      ],
      "definition": "Certificate invalid, or 60 days or fewer remaining with no automatic renewal detected."
    },
    "hacked": {
      "count": 0,
      "of": 200,
      "percent": 0.0,
      "ci95": [
        0,
        1.9
      ]
    },
    "no_local_biz": {
      "count": 68,
      "of": 200,
      "percent": 34.0,
      "ci95": [
        27.8,
        40.8
      ]
    },
    "no_schema": {
      "count": 55,
      "of": 200,
      "percent": 27.5,
      "ci95": [
        21.8,
        34.1
      ]
    },
    "no_desc": {
      "count": 34,
      "of": 200,
      "percent": 17.0,
      "ci95": [
        12.4,
        22.8
      ]
    },
    "no_sitemap": {
      "count": 21,
      "of": 200,
      "percent": 10.5,
      "ci95": [
        7.0,
        15.5
      ]
    },
    "noindex": {
      "count": 3,
      "of": 200,
      "percent": 1.5,
      "ci95": [
        0.5,
        4.3
      ]
    },
    "no_title": {
      "count": 1,
      "of": 200,
      "percent": 0.5,
      "ci95": [
        0.1,
        2.8
      ]
    },
    "no_messenger": {
      "count": 71,
      "of": 200,
      "percent": 35.5,
      "ci95": [
        29.2,
        42.3
      ]
    },
    "no_form": {
      "count": 47,
      "of": 200,
      "percent": 23.5,
      "ci95": [
        18.2,
        29.8
      ]
    },
    "no_tel": {
      "count": 26,
      "of": 200,
      "percent": 13.0,
      "ci95": [
        9.0,
        18.4
      ]
    },
    "cta_broken": {
      "count": 13,
      "of": 200,
      "percent": 6.5,
      "ci95": [
        3.8,
        10.8
      ]
    },
    "no_alt": {
      "count": 33,
      "of": 200,
      "percent": 16.5,
      "ci95": [
        12.0,
        22.3
      ]
    },
    "small_text": {
      "count": 13,
      "of": 200,
      "percent": 6.5,
      "ci95": [
        3.8,
        10.8
      ]
    },
    "no_viewport": {
      "count": 5,
      "of": 200,
      "percent": 2.5,
      "ci95": [
        1.1,
        5.7
      ],
      "definition": "No mobile viewport meta setting found. This is the presence of the setting, not a judgement on mobile usability."
    },
    "overflow": {
      "count": 1,
      "of": 200,
      "percent": 0.5,
      "ci95": [
        0.1,
        2.8
      ]
    }
  },
  "notMeasuredReasons": {
    "deadDomain": 37,
    "httpError": 10,
    "offsiteRedirect": 10,
    "botChallenge": 9,
    "other": 9,
    "timeout": 3,
    "robotsDisallowed": 1,
    "deadDomain_breakdown": {
      "noDnsRecord": 35,
      "hostUnreachable": 2
    }
  },
  "limits": [
    "Only practices whose website OpenStreetMap records — about one in ten. Not a slice of the whole industry.",
    "The sample tilts towards large cities: 44.5% capital/million-plus against the 30% intended.",
    "Home page only.",
    "A snapshot of 1 October 2026; the list was fixed two days earlier.",
    "Source is OpenStreetMap, which is not an official business register.",
    "Measured from a single location in a mobile profile; lab figures, not field data.",
    "An automated check is not a full audit and does not prove the absence of other problems.",
    "Unreachable sites are counted as neither having nor lacking a given problem.",
    "No data on these businesses' calls or revenue; no causal claim is made."
  ],
  "samplingScope": {
    "country": "Ukraine",
    "nationwide": true,
    "query": "OpenStreetMap Overpass, area ISO3166-1=UA admin_level=2, dental tags carrying website or contact:website",
    "coverage": "OpenStreetMap records a website for roughly one dental practice in ten (293 of 2964). Practices absent from it, or with the field empty, were never in scope. This is not a slice of the whole industry.",
    "sources": {
      "openStreetMap": 293,
      "ukrainianDirectory": 39,
      "candidatesTotal": 332,
      "eligible": 278,
      "checked": 200
    },
    "cityList": "A list of cities is used only to label each record with a stratum; a practice more than 40 km from any listed city is placed in the \"smaller towns\" stratum, never excluded.",
    "cityStrata": {
      "intendedPercent": {
        "capitalAndMillionPlus": 30,
        "regionalCentres": 40,
        "smallerTowns": 30
      },
      "actualPercent": {
        "capitalAndMillionPlus": 44.5,
        "regionalCentres": 36,
        "smallerTowns": 19.5
      },
      "note": "The quota could not be met: only 39 eligible sites fell in the smaller-towns stratum against the 60 required, so the shortfall was filled from large cities. Kyiv alone accounts for 53 of the 200."
    },
    "largestCity": {
      "name": "Kyiv",
      "sites": 53,
      "ofSample": 200
    }
  },
  "measurement": {
    "speed": {
      "metric": "LCP (Largest Contentful Paint)",
      "type": "lab",
      "provider": "Google PageSpeed Insights API (Lighthouse)",
      "strategy": "mobile",
      "runsPerSite": 5,
      "aggregation": "median",
      "note": "Lab data from Lighthouse via the PSI API, not Google field data from real users (CrUX)."
    },
    "everythingElse": {
      "provider": "TimeKairos analyser (AI X-Ray)",
      "covers": [
        "reachability",
        "TTFB",
        "TLS and domain expiry",
        "exposed server files",
        "structured data",
        "contact paths",
        "mobile viewport and text size",
        "image alt text"
      ],
      "note": "Our own crawl and analysis; no third-party service involved in these checks."
    }
  },
  "splitHalfCheck": {
    "totalDomains": 250,
    "halfSize": 125,
    "sharedSites": 0,
    "rows": [
      {
        "metric": "site_dead",
        "firstHalfPercent": 24.0,
        "secondHalfPercent": 20.0,
        "differencePoints": 4.0
      },
      {
        "metric": "no_local_biz",
        "firstHalfPercent": 36.8,
        "secondHalfPercent": 34.4,
        "differencePoints": 2.4
      },
      {
        "metric": "no_schema",
        "firstHalfPercent": 28.8,
        "secondHalfPercent": 27.2,
        "differencePoints": 1.6
      },
      {
        "metric": "no_sitemap",
        "firstHalfPercent": 7.2,
        "secondHalfPercent": 12.8,
        "differencePoints": 5.6
      },
      {
        "metric": "no_messenger",
        "firstHalfPercent": 32.8,
        "secondHalfPercent": 37.6,
        "differencePoints": 4.8
      },
      {
        "metric": "no_form",
        "firstHalfPercent": 20.0,
        "secondHalfPercent": 23.2,
        "differencePoints": 3.2
      },
      {
        "metric": "exposed_files",
        "firstHalfPercent": 6.4,
        "secondHalfPercent": 6.4,
        "differencePoints": 0.0
      },
      {
        "metric": "no_desc",
        "firstHalfPercent": 16.0,
        "secondHalfPercent": 16.8,
        "differencePoints": 0.8
      },
      {
        "metric": "lcp_poor",
        "firstHalfPercent": 44.0,
        "secondHalfPercent": 51.2,
        "differencePoints": 7.2
      }
    ],
    "medianLcpMs": {
      "firstHalf": 8609.0,
      "secondHalf": 8817.5
    },
    "provenance": "Two draws of 200 were made from the same list of 278: one measured 2026-09-29, one 2026-10-01. The list is small, so the draws share 150 sites, giving 250 distinct sites in all. The headline figures come from the 2026-10-01 draw.",
    "shows": "Internal consistency of the measurements across different sets of sites.",
    "doesNotShow": "Representativeness for the Ukrainian market; the sampling limits above still apply."
  }
}