{
  "version": "1.0",
  "title": "Contact paths on 20 contractor websites serving San Antonio",
  "publishedDate": "2026-10-29",
  "observationWindowUtc": {
    "start": "2026-10-29T14:15:20.834Z",
    "end": "2026-10-29T14:15:35.729Z"
  },
  "selection": {
    "selectedSites": 20,
    "sitesPerTrade": 5,
    "trades": [
      "electrical",
      "plumbing",
      "HVAC",
      "concrete"
    ],
    "type": "Convenience sample; no probability sampling or market prevalence estimate",
    "queries": [
      "San Antonio electrical contractor",
      "San Antonio plumbing contractor",
      "San Antonio HVAC contractor",
      "San Antonio concrete contractor"
    ],
    "protocolRecordedAtUtc": "2026-10-29T14:07:12Z",
    "frozenAtUtc": "2026-10-29T14:12:09Z",
    "supplementaryQueriesUsed": 0,
    "replacements": 0,
    "rule": "First five eligible distinct official domains in each query’s returned discovery order, globally deduplicated before outcome classification; not Google-rank data."
  },
  "methods": {
    "html": "Anonymous verified-TLS HTTPS GET, sequential, 20-second deadline, 2 MiB body limit, at most five redirects. No scripts or contact-page requests.",
    "labels": "Cloned anchor textContent after script/style/template/noscript removal; CSS-hidden text remains. Image alt text and accessible names are not substituted.",
    "phone": "Exactly one recognizable ten-digit US-style displayed number or initial +1 equivalent and an unambiguous normalized own tel destination. Extensions separate. No phone-allocation or connection verification.",
    "contact": "Same-host HTTP(S) page anchor, ignoring www, whose path or source label contains contact/request/quote/estimate/schedule. In-page-only links and external booking services excluded; destinations not fetched.",
    "manualReview": "Both proposed base-number differences checked against independently captured browser DOM label/href pairs; no conclusion about destination intent.",
    "rendered": {
      "attemptedPages": 20,
      "actualViewportWidth": 390,
      "actualViewportHeight": 844,
      "passes": 2,
      "visibilityStatistics": "Withheld: loaders, opacity transitions and changed DOM counts occurred. Snapshot visibility is not stable usability.",
      "scope": "Main document only; no menus opened, no cookie choices changed, no embedded-frame inspection, no occlusion, taps, calls or form submissions. No loading-time benchmark."
    }
  },
  "results": {
    "selectedSites": 20,
    "usableHtmlSites": 20,
    "unknownSites": 0,
    "states": {
      "usable_html": 20
    },
    "sitesWithTelAnchor": 12,
    "telAnchorCount": 64,
    "comparableTelAnchorCount": 53,
    "numberDiscrepancyCount": 2,
    "extensionDiscrepancyCount": 0,
    "sitesWithNumberDiscrepancy": 2,
    "sitesWithSameSiteContactPageLink": 15,
    "sameSiteContactLinkCount": 68,
    "sitesWithComparablePhoneLinks": 12,
    "excludedTelAnchorCount": 11,
    "excludedTelReasons": {
      "no_single_us_displayed_number": 11
    }
  },
  "rows": [
    {
      "id": "R01",
      "htmlState": "usable_html",
      "telLinkCount": 4,
      "contactPageLinkCount": 0,
      "comparablePhoneLinkCount": 4,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R02",
      "htmlState": "usable_html",
      "telLinkCount": 8,
      "contactPageLinkCount": 12,
      "comparablePhoneLinkCount": 7,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R03",
      "htmlState": "usable_html",
      "telLinkCount": 6,
      "contactPageLinkCount": 5,
      "comparablePhoneLinkCount": 4,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R04",
      "htmlState": "usable_html",
      "telLinkCount": 0,
      "contactPageLinkCount": 0,
      "comparablePhoneLinkCount": 0,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R05",
      "htmlState": "usable_html",
      "telLinkCount": 3,
      "contactPageLinkCount": 2,
      "comparablePhoneLinkCount": 1,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R06",
      "htmlState": "usable_html",
      "telLinkCount": 4,
      "contactPageLinkCount": 4,
      "comparablePhoneLinkCount": 4,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R07",
      "htmlState": "usable_html",
      "telLinkCount": 3,
      "contactPageLinkCount": 3,
      "comparablePhoneLinkCount": 3,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R08",
      "htmlState": "usable_html",
      "telLinkCount": 0,
      "contactPageLinkCount": 2,
      "comparablePhoneLinkCount": 0,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R09",
      "htmlState": "usable_html",
      "telLinkCount": 8,
      "contactPageLinkCount": 4,
      "comparablePhoneLinkCount": 3,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R10",
      "htmlState": "usable_html",
      "telLinkCount": 0,
      "contactPageLinkCount": 5,
      "comparablePhoneLinkCount": 0,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R11",
      "htmlState": "usable_html",
      "telLinkCount": 6,
      "contactPageLinkCount": 4,
      "comparablePhoneLinkCount": 6,
      "differingBaseNumberLinkCount": 1,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R12",
      "htmlState": "usable_html",
      "telLinkCount": 0,
      "contactPageLinkCount": 1,
      "comparablePhoneLinkCount": 0,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R13",
      "htmlState": "usable_html",
      "telLinkCount": 4,
      "contactPageLinkCount": 0,
      "comparablePhoneLinkCount": 4,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R14",
      "htmlState": "usable_html",
      "telLinkCount": 0,
      "contactPageLinkCount": 2,
      "comparablePhoneLinkCount": 0,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R15",
      "htmlState": "usable_html",
      "telLinkCount": 0,
      "contactPageLinkCount": 6,
      "comparablePhoneLinkCount": 0,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R16",
      "htmlState": "usable_html",
      "telLinkCount": 7,
      "contactPageLinkCount": 0,
      "comparablePhoneLinkCount": 7,
      "differingBaseNumberLinkCount": 1,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R17",
      "htmlState": "usable_html",
      "telLinkCount": 5,
      "contactPageLinkCount": 3,
      "comparablePhoneLinkCount": 5,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R18",
      "htmlState": "usable_html",
      "telLinkCount": 0,
      "contactPageLinkCount": 0,
      "comparablePhoneLinkCount": 0,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R19",
      "htmlState": "usable_html",
      "telLinkCount": 0,
      "contactPageLinkCount": 7,
      "comparablePhoneLinkCount": 0,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    },
    {
      "id": "R20",
      "htmlState": "usable_html",
      "telLinkCount": 6,
      "contactPageLinkCount": 8,
      "comparablePhoneLinkCount": 5,
      "differingBaseNumberLinkCount": 0,
      "differingExtensionLinkCount": 0
    }
  ],
  "corrections": [
    {
      "version": "1.0",
      "note": "Before publication, a classifier was corrected because a normal background anti-bot script had been mistaken for a blocking interstitial. The saved response was reclassified without refetching or replacing a site."
    }
  ],
  "limitations": [
    "Counts describe these selected entry pages at the recorded time; no population estimate, confidence interval, industry rank or platform/agency comparison.",
    "HTML absence is an observed absence in that response, not proof that the browser offers no contact method. Repeated anchors count separately.",
    "Phone-number inequality may be intentional, including tracking or alternate numbers. Equality does not show a call connects.",
    "Contact links do not establish form delivery. No customer behavior, conversions, inquiries, clients, revenue or lead loss measured.",
    "Anonymous rows allow recalculation of aggregate counts. Source identities, source-to-row mapping, HTML copies and browser screenshots are withheld, so independent source-level replication from this download is not possible.",
    "Sparrow Group sells website services and authored this study; no independent third-party validation or ranking/AI-visibility outcome is claimed."
  ]
}
