Driver FixRecommendedSound, Wi-Fi or graphics acting up? Check drivers firstFind missing or outdated drivers fast.Check DriversOctober DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsClean PCRecommendedOne scan can reveal what keeps slowing WindowsLook for cleanup and repair opportunities.Run Scan×
Skip to content
World desk6 min

Find Shopify, WordPress, and HubSpot Sites in a Lead List with Python

Use a technology lookup API and Python to label a domain list with Shopify, WordPress, and HubSpot signals—while preserving evidence, timestamps, and clear non-match statuses.
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

To label a list of domains by visible Shopify, WordPress, or HubSpot signals, query a technology lookup API and save the provider’s evidence, scan mode, status, and timestamps alongside each original lead. Python can automate the CSV handling and requests, but no detector can guarantee it will find every site that actually uses those tools: a “no match” means only that the chosen provider returned no target technology for that domain under that scan mode.

Choose a lookup method for the size and needs of your list

For recurring lead enrichment, use a technology lookup service rather than trying to infer a stack from a single page element. Detection services examine observable fingerprints such as HTML, JavaScript variables, response headers, DOM elements, scripts, and metadata. A match is evidence that a signal was visible to the detector—not proof of every tool a company uses internally, or that the technology is used across every subdomain.

As an Amazon Associate I earn from qualifying purchases.

Option Best fit Input and completion Evidence and caveats
Wappalyzer API Enriching a supplied list with technology results Lookup accepts one to ten website URLs per request by default; documented limit is ten URLs per request and ten requests per second. Results may be cached, live, or asynchronous for some scans. Returns technology lookup data; preserve the response and query mode. API access, plans, limits, and credit costs should be checked before implementation. Wappalyzer lookup API documentation
BuiltWith Domain API Checking domains you already have Supports multi-domain lookups and a bulk job flow for large batches; bulk processing may be asynchronous. Requires an API key. The documentation describes domain lookup but does not establish an accuracy advantage over Wappalyzer. BuiltWith Domain API documentation
BuiltWith Lists API Finding websites by technology, rather than checking only a supplied lead list Can combine a main technology with additional technologies. It serves a different discovery use case from the Domain API. BuiltWith Lists API documentation

Wappalyzer describes its API as a way to look up sites and enrich lead lists in its API overview. Its documentation says cached data is the default; a request can select real-time scanning with live=true. Recursive lookup follows internal links for broader coverage. If a result is absent or a live recursive scan is requested, the initial response may indicate that a crawl is underway without including technologies; use a callback or check again later. Wappalyzer says a crawl can take up to 15 minutes.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Under Wappalyzer’s documented credit scheme, a normal lookup costs one credit per URL, while combining live=true and recursive=true costs five credits per URL. These documented values and API limits may change; verify the current plan and pricing before estimating a recurring job. The lookup documentation also says older verification windows are more likely to include sites that have since stopped using a technology. Its denoise option excludes low-confidence detections by default; loosening that filter can return more results, with greater false-positive risk.

There is no cited apples-to-apples evaluation establishing which provider is more accurate for Shopify, WordPress, or HubSpot. Choose based on list scale, freshness needs, completion workflow, evidence fields, access, and budget—not an unsupported accuracy ranking.

Build an auditable CSV enrichment workflow

Keep the source row intact and create separate fields for the normalized query and the result. Do not silently drop rows when a lookup fails or returns no technologies. Python’s standard library provides csv for reading and writing CSV files and urllib.request for HTTP requests; see the CSV documentation and urllib.request documentation. A maintained HTTP library is another option.

  1. Read the input and retain identity. Keep the original lead value and a stable row identifier, such as an existing lead ID or input row number. This lets you join results back to the source even if domains repeat.
  2. Normalize conservatively. Trim whitespace, remove an accidental trailing slash, and standardize obvious URL variations such as a missing scheme. Preserve the original value. Do not merge www.example.com, shop.example.com, or other subdomains unless your matching rule explicitly says they represent the same lookup target.
  3. Submit supported batches. Send only the number of URLs supported by the selected API. For Wappalyzer’s documented lookup endpoint, that means at most ten URLs in a request and no more than ten requests per second. Store the provider and scan mode with every request so that cached and live results are distinguishable.
  4. Match target names without discarding context. Compare returned technology names or provider slugs with Shopify, WordPress, and HubSpot. Save both the target labels and the complete returned technology list; the full list makes later review possible if naming or matching rules change.
  5. Write a result for every input row. Use explicit statuses such as detected, no technology returned, lookup failed, or pending. A blank technology cell alone cannot tell a reviewer whether the domain was checked, the request failed, or a crawl has not finished.
  6. Keep timestamps and review flags. Record when you checked and any provider confirmation or verification time returned. Send stale, uncertain, or commercially consequential detections for manual review before treating them as qualified leads.

A practical output schema is:

  • lead_id and original_domain
  • normalized_url
  • provider and scan_mode (for example, cached or live)
  • detected_technologies and target_labels
  • lookup_status and error_or_pending_details
  • checked_at and provider_confirmed_at, when supplied
  • A raw-response file or stable response reference, where permitted by the provider’s terms

The fields above are an auditability recommendation, not a schema either provider requires. Protect API keys as secrets rather than placing them in the CSV or source code, and confirm the provider’s terms before retaining raw responses.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Call an API from Python without losing status or evidence

The following pattern uses Python’s standard library and a generic JSON API shape. It shows how to make a request and preserve response data; it is not a drop-in client for either provider. Set the endpoint, authentication header, request body, response parsing, batching, and asynchronous handling to match the provider’s current documentation. Do not assume an API key or access plan is free.

import csv
import json
import os
import urllib.error
import urllib.request
from datetime import datetime, timezone

API_URL = os.environ["TECH_LOOKUP_URL"]
API_KEY = os.environ["TECH_LOOKUP_API_KEY"]


def lookup(urls):
    payload = json.dumps({"urls": urls}).encode("utf-8")
    request = urllib.request.Request(
        API_URL,
        data=payload,
        headers={
            "Authorization": f"Bearer {API_KEY}",
            "Content-Type": "application/json",
        },
        method="POST",
    )
    try:
        with urllib.request.urlopen(request, timeout=60) as response:
            raw = response.read().decode("utf-8")
            return "received", json.loads(raw), ""
    except urllib.error.HTTPError as exc:
        detail = exc.read().decode("utf-8", errors="replace")
        return "lookup failed", None, f"HTTP {exc.code}: {detail}"
    except (urllib.error.URLError, TimeoutError) as exc:
        return "lookup failed", None, str(exc)


checked_at = datetime.now(timezone.utc).isoformat()

After parsing a provider response, map its actual fields into your output schema rather than assuming that every successful HTTP response contains completed technologies. If the provider reports a crawl or job in progress, save its identifier and mark the row pending; poll or accept a callback according to the provider’s documented workflow, then update the row when results arrive. Keep errors separate from empty result sets.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Interpret matches and non-matches carefully

Public-page fingerprints can reveal a technology without establishing how broadly it is used. A company may use HubSpot internally without exposing a detectable signal on its public website. Conversely, a detected signal can be stale or apply only to one subdomain. Neither the sources cited here establish a universal recall rate for these three technologies, so the workflow cannot promise to find every actual user.

  • Detected: the provider returned a target technology for the queried domain and scan mode. Retain the returned evidence and its age.
  • No technology returned: no target was returned in that lookup. It does not prove the organization does not use the platform.
  • Lookup failed: the request did not produce a usable result; fix the cause and retry rather than labeling the domain as a non-match.
  • Pending: the provider has not completed an asynchronous scan or bulk job. Do not count it as a final negative.

For a lead qualification decision, use the lookup as a signal for prioritization, not as the sole basis for a consequential claim. Review the live site or another reliable source when the result is stale, ambiguous, or important enough to warrant confirmation.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More from the Wire

  1. World desk4 min
    How to Spot an AI Voice Scam Before Sending MoneyDon’t rely on how a caller sounds. Pause, call back through a known number, and verify the emergency with another trusted person before sending money.
  2. Mountain View desk4 min
    Google’s SynthID Detector: How to Check AI-Generated Images, Video and AudioGoogle’s SynthID Detector looks for an embedded watermark in supported images, video and audio. Here is what its results do—and do not—show.
  3. Redmond desk20 min
    How to create a link to File or Folder in Windows 11Windows 11 gives you several ways to point to a file or folder without moving or duplicating it. You can create a desktop shortcut,…
Recommended PC Tool
Recommended PC Tool
PC Slower Than It Used to Be?Free scan - under a minute
Crashes, No Sound, or Screen Glitches?Free driver scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.