Want to know which of 500 prospects run Shopify, which use HubSpot, or what analytics and payment tools your competitors use? That's technographics — and the usual tools are subscriptions: BuiltWith starts at $295/month (API access only on higher plans) and Wappalyzer Pro is $250/month.
If you only need it now and then, or want it inside a script, a pipeline or an AI agent, here's how to do it pay-per-website in a few lines of Python.
1. Setup
pip install "apify-client>=3"
export APIFY_TOKEN=... # free account at console.apify.com
I'm using the Tech Stack Detector on Apify (disclosure: I built it). It returns up to 20 technologies per site with categories, and invalid, offline or undetectable sites aren't charged.
2. Tech stack of a list of domains → CSV
import csv, os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("jesting_grass/tech-stack-detector").call(run_input={
"domains": ["allbirds.com", "gymshark.com", "klarna.com", "hubspot.com", "ikea.com"],
})
cols = ["domain", "cms", "ecommerce", "payments", "analytics", "crm", "hosting", "technologyNames"]
with open("tech_stacks.csv", "w", newline="", encoding="utf-8") as f:
w = csv.DictWriter(f, fieldnames=cols, extrasaction="ignore")
w.writeheader()
for row in client.dataset(run.default_dataset_id).iterate_items():
if "error" not in row:
w.writerow(row)
print(f'{row["domain"]:<14} CMS: {row["cms"] or "-":<22} payments: {row["payments"] or "-"}')
Real output (September 2026):
klarna.com CMS: Contentful payments: Klarna Checkout
gymshark.com CMS: Contentful, Shopify payments: -
allbirds.com CMS: Shopify payments: Stripe
ikea.com CMS: WordPress payments: -
hubspot.com CMS: HubSpot CMS Hub payments: -
Besides the full technologies list, every row has flat columns — cms, ecommerce, payments, analytics, marketingAutomation, crm, hosting, cdn, jsFrameworks — so the CSV drops straight into Sheets or a CRM.
3. Lead generation: keep only sites using a technology
Selling a Shopify app? Only want prospects on HubSpot? Add one field:
run = client.actor("jesting_grass/tech-stack-detector").call(run_input={
"domains": ["allbirds.com", "gymshark.com", "klarna.com", "hubspot.com", "ikea.com"],
"onlyDomainsUsing": ["Shopify"],
})
for row in client.dataset(run.default_dataset_id).iterate_items():
if "error" not in row:
print(row["domain"], "uses", row["matchedTechnologies"])
gymshark.com uses ['Shopify']
allbirds.com uses ['Shopify']
Feed it domains from anywhere — a lead list, a CRM export, Google Maps or search results.
4. No Python? One HTTP call
curl -X POST "https://api.apify.com/v2/acts/jesting_grass~tech-stack-detector/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"domains":["stripe.com","allbirds.com"]}'
It also runs from n8n, Make and Zapier, and AI agents can call it as a tool through the Apify MCP server.
A note on accuracy
Any tech-stack detector — BuiltWith and Wappalyzer included — can only see what a website exposes publicly: scripts, headers, cookies, markup. Back-office tools that leave no trace on the site can't be detected by anyone. Treat results as strong signals, not a complete inventory.
All examples (Python CSV export, Shopify lead filter, Node.js, cURL): github.com/emiohr/builtwith-wappalyzer-alternative. Questions or feature requests — drop a comment.
This article was written with AI assistance and all code was tested against the live API. Not affiliated with BuiltWith or Wappalyzer.
Top comments (0)