# Website Tech Stack & Platform Detector: Shopify, CMS, Analytics (`charlesmarkette/website-tech-stack-detector-shopify-cms-analytics`) Actor

Find out what websites are built with: e-commerce platform (Shopify, WooCommerce, Magento, BigCommerce), CMS and site builder, analytics and ad pixels, chat, payments, CDN and 200+ more technologies. Bulk URLs or any lead dataset; one row per site.

- **URL**: https://apify.com/charlesmarkette/website-tech-stack-detector-shopify-cms-analytics.md
- **Developed by:** [Charles Markette](https://apify.com/charlesmarkette) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 analyzed websites

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**Website Tech Stack & Platform Detector** tells you what each website runs on. For every website it reports the **e-commerce platform** (Shopify, WooCommerce, BigCommerce, Magento / Adobe Commerce, Wix, Squarespace, Webflow, PrestaShop, Shopware, Salesforce Commerce Cloud, Ecwid…), the **CMS or site builder** (WordPress, Drupal, Joomla, Ghost, HubSpot CMS, Wix, Squarespace, Webflow…), **analytics and ad pixels** (Google Analytics 4, Google Tag Manager, Meta Pixel, TikTok Pixel, LinkedIn Insight Tag, Hotjar, Microsoft Clarity…), **marketing, CRM and chat** tools (HubSpot, Klaviyo, Mailchimp, Marketo, Intercom, Zendesk…), **payments** (Stripe, PayPal, Klarna, Afterpay, Shop Pay…), **CDN and hosting** (Cloudflare, Fastly, Akamai, Vercel, Netlify, CloudFront…), **JavaScript frameworks** (React, Next.js, Vue, Nuxt, Angular…), **cookie consent**, **reviews**, **search** and **A/B testing** tools: **221 technologies in 23 categories**. You get **one row per website**, and every detection comes with a **confidence** level and the **evidence** that triggered it. Paste a list of websites, or point it at any Apify dataset of leads or stores and the technology columns are added next to each item.

### Why this Actor

- **Evidence, not guesses.** Each technology in the output says *why* it was detected, for example `header x-shopid: 56789012`, `script https://static.klaviyo.com/onsite/js/klaviyo.js?company_id=…` or `meta generator: WordPress 6.6.2`, and whether that marker is a **high** or **medium** confidence signal.
- **Markup, not mentions.** Detection rules match the markers a product leaves in a page's code: its script and CDN hosts, the generator tag it writes, its response headers and cookie names, and its bootstrap code. A blog post that *talks about* Shopify or links to wordpress.org is not reported as using them.
- **Shopify, including headless.** Classic Shopify themes and headless **Shopify Hydrogen** storefronts (hosted on Shopify's Oxygen) are both reported as Shopify, with Hydrogen as a separate framework entry. For Shopify stores you also get the `.myshopify.com` domain, shop ID, theme name, theme ID and version, currency, country and locale, when the store's own page states them.
- **Tracking IDs.** The public Google Analytics 4, Universal Analytics, Google Tag Manager, Google Ads, Meta Pixel and TikTok Pixel IDs found in the page. Websites that share a GTM container or pixel ID are often run by the same company or agency.
- **Fast and light.** One request per website (plus redirects), no browser, 256 MB of memory by default.
- **Works through rate limits.** Big stores often answer automated requests with HTTP 429 or 403. Those answers' headers sometimes still name the platform (Shopify's `x-shopid`, `powered-by: Shopify`, `_shopify_*` cookies…). When they reveal something about the site itself, you get a partial row based on headers only, with a `warning`; when they only show the CDN, web server or security layer in front of it (for example just Cloudflare's `cf-ray`), you get a free error row. An optional Apify Proxy may improve access, but doesn't guarantee a full page or complete detections.
- **Polite.** At most 2 requests at a time to a website, retries with backoff when a server is busy, and a User-Agent that names the tool (`TechStackDetector/1.0; +https://apify.com/charlesmarkette`).
- **Only pay for results.** Websites that give nothing about the site itself (unreachable, or blocked with only CDN/server/security headers) are free, and with **Only matching websites** on, websites without the technology you're after are left out and not charged.

### Use cases

- **Lead lists of online stores:** find which websites in a list run Shopify, WooCommerce, BigCommerce or Magento, then add their contact details with [Website Contact Info Scraper](https://apify.com/charlesmarkette/website-contact-info-scraper-emails-phones-socials).
- **Agency prospecting:** find websites where this scan did not detect analytics, a cookie consent tool or a chat widget (then check them by hand: not detected doesn't mean not installed), or websites still loading Universal Analytics, which Google has shut down.
- **Migration targeting:** list stores on Magento or PrestaShop, sites on older WordPress versions (from the generator tag), and sites still loading Google Optimize (shut down in 2023) or Polyfill.io (a script host that was compromised in 2024).
- **Competitor and market research:** see which email, review, payment and search tools the leading stores in a niche use.
- **App and plugin vendors:** find stores that use a competing app (Klaviyo, Judge.me, Yotpo, Recharge…) or where no tool in your category was detected (verify before drawing conclusions).

### How to use it

1. Add **Websites** (home page URLs or bare domains such as `example.com`), and/or pick a **Dataset to enrich** and set **URL field** to the field that holds the website (dotted paths such as `company.website` work).
2. Optional filters: **Only report these categories** (for example only *E-commerce* and *Analytics*), **Technologies to look for** plus **Only matching websites** (for example only output the Shopify and WooCommerce stores).
3. Run it. Export the results as CSV, Excel or JSON, or chain the run into an integration.

**Input example**

```json
{
  "startUrls": ["https://www.fashionnova.com", "https://wordpress.org", "https://www.python.org"],
  "technologies": ["Shopify", "WooCommerce"],
  "onlyMatches": false,
  "maxConcurrency": 10,
  "proxyConfiguration": {"useApifyProxy": false}
}
```

**Output example** (illustrative, shortened)

```json
{
  "url": "birdie-shoes-example.com",
  "finalUrl": "https://www.birdie-shoes-example.com/",
  "domain": "birdie-shoes-example.com",
  "status": 200,
  "title": "Birdie Shoes – Comfortable sneakers",
  "language": "en-US",
  "server": "cloudflare",
  "generator": null,
  "ecommercePlatform": "Shopify",
  "cms": null,
  "analytics": ["Google Analytics 4", "Google Tag Manager", "Meta Pixel"],
  "technologyNames": ["Shopify", "Google Analytics 4", "Google Tag Manager", "Meta Pixel", "Klaviyo", "Shop Pay", "Cloudflare", "Judge.me"],
  "technologies": [
    {"name": "Shopify", "category": "E-commerce", "confidence": "high", "version": null, "evidence": "header x-shopid: 56789012"},
    {"name": "Klaviyo", "category": "Marketing & CRM", "confidence": "high", "version": null, "evidence": "script https://static.klaviyo.com/onsite/js/klaviyo.js?company_id=AbC123"},
    {"name": "Cloudflare", "category": "CDN & hosting", "confidence": "high", "version": null, "evidence": "header cf-ray: 8c1a2b3c4d5e6f70-LHR"}
  ],
  "categories": {
    "E-commerce": ["Shopify"],
    "Analytics": ["Google Analytics 4"],
    "Tag manager": ["Google Tag Manager"],
    "Advertising": ["Meta Pixel"],
    "Marketing & CRM": ["Klaviyo"],
    "Payments": ["Shop Pay"],
    "CDN & hosting": ["Cloudflare"],
    "Reviews": ["Judge.me"]
  },
  "shopifyStore": {
    "myshopifyDomain": "birdie-shoes.myshopify.com",
    "shopId": 56789012,
    "themeName": "Dawn",
    "themeId": 134567890123,
    "themeSchemaName": "Dawn",
    "themeSchemaVersion": "15.0.0",
    "themeStoreId": 887,
    "currency": "USD",
    "country": "US",
    "locale": "en"
  },
  "wordpressVersion": null,
  "trackingIds": {
    "googleAnalytics4": ["G-ABC123XYZ9"],
    "universalAnalytics": [],
    "googleTagManager": ["GTM-W8K2Q9P"],
    "googleAds": [],
    "metaPixel": ["123456789012345"],
    "tiktokPixel": []
  },
  "scannedAt": "2026-10-17T12:00:00Z",
  "error": null,
  "warning": null
}
```

- `status` is the HTTP status of the page after redirects (`null` when the website didn't answer). `error` is `null` when the row has results, else a plain-English reason. `error: null` does not by itself mean the HTML page was read: check `warning` and `status` too.
- `warning` is set when the website didn't return its page (for example HTTP 429 or 403) but its response headers still revealed technologies: `"The site answered HTTP 429; only response headers were analysed, so some technologies may be missing."` Such rows have `error: null`, list only what the headers and cookies showed, and are charged, because the headers revealed more than the CDN, web server or security layer. They are partial results, not a full-page analysis.
- Four row states, in short: **page read** (charged, even if nothing was detected); **headers only** (`warning` set, `error: null`, charged); **failed** (`error` set, not charged; left out when *Only matching websites* is on); **filtered out** by *Only matching websites* (not stored, not charged).
- Illustrative examples (not run receipts):
  - Headers-only, charged: `{"url": "https://store.example", "status": 429, "ecommercePlatform": "Shopify", "technologyNames": ["Shopify", "Cloudflare"], "error": null, "warning": "The site answered HTTP 429; only response headers were analysed, so some technologies may be missing."}`
  - Infrastructure only, free: `{"url": "https://news.example", "status": 403, "technologyNames": [], "error": "The website answered HTTP 403, so the page couldn't be read. This usually means bot protection or rate limiting.", "warning": null}`
- `technologies` lists every detection with its `category`, `confidence` (`high` or `medium`), `version` (when the page states one, for example a generator tag, `ng-version`, or a versioned script file name; otherwise `null`) and `evidence` (the marker that matched, cut to 160 characters). `technologyNames` is the same list as plain names, handy in CSV exports; `categories` groups the names by category.
- `ecommercePlatform` is the main e-commerce platform found (high confidence first), else `null`. `cms` is the main CMS, else the site builder (Wix, Squarespace, Webflow…), else `null`. `analytics` lists the analytics, tag manager and advertising pixel tools found.
- `shopifyStore` is filled for Shopify stores only; each field is `null` when the store's page doesn't state it. `wordpressVersion` is filled only when the site states it in its `generator` meta tag (many sites hide it).
- **Only report these categories** limits `technologies`, `technologyNames` and `categories`; `ecommercePlatform`, `cms` and `analytics` are always filled.
- A medium-confidence detection with evidence `implied by …` means another detection implies it (WooCommerce runs on WordPress, Next.js on React, Nuxt on Vue).
- A run summary (websites read and failed, how many use each e-commerce platform, CMS and technology, why the run stopped) is saved as `OUTPUT` in the key-value store.

### Supported technologies

- **E-commerce:** Shopify, WooCommerce, BigCommerce, Magento (Adobe Commerce), Wix eCommerce, Squarespace Commerce, Webflow Ecommerce, PrestaShop, Shopware, Salesforce Commerce Cloud, Ecwid, OpenCart, Lightspeed eCom, VTEX
- **CMS:** WordPress, Drupal, Joomla, Ghost, HubSpot CMS, TYPO3, Craft CMS, Adobe Experience Manager, Sitecore, Blogger, Substack, and headless CMS hints from their asset hosts: Contentful, Sanity, Prismic, Storyblok, DatoCMS
- **Site builder:** Wix, Squarespace, Webflow, Duda, GoDaddy Website Builder, Weebly / Square Online, Jimdo, Framer, Tilda
- **Analytics:** Google Analytics 4, Universal Analytics, Hotjar, Microsoft Clarity, Segment, Mixpanel, Heap, Plausible, Matomo, Adobe Analytics, Amplitude, FullStory, Mouseflow, Crazy Egg, Yandex Metrica, Baidu Tongji, Cloudflare Web Analytics, Vercel Analytics, PostHog, Pendo, Contentsquare, Fathom, Chartbeat
- **Tag manager:** Google Tag Manager, Adobe Experience Platform Tags, Tealium iQ
- **Advertising:** Google Ads, Google AdSense, Google Ad Manager, Meta Pixel, TikTok Pixel, LinkedIn Insight Tag, Pinterest Tag, Snap Pixel, X (Twitter) Pixel, Reddit Pixel, Microsoft Advertising UET, Criteo, Taboola, Outbrain, AdRoll
- **Marketing & CRM:** HubSpot, Marketo, Pardot, Mailchimp, Klaviyo, Omnisend, ActiveCampaign, Brevo, Attentive, Postscript, Kit (ConvertKit), Constant Contact, Privy, OptinMonster, Justuno
- **Live chat & support:** Intercom, Drift, Zendesk, Crisp, Tidio, LiveChat, tawk.to, Freshworks, Gorgias, Zoho SalesIQ, Help Scout, Olark
- **Payments:** Stripe, PayPal, Klarna, Afterpay, Shop Pay, Affirm, Sezzle, Amazon Pay, Braintree, Adyen, Square
- **CDN & hosting:** Cloudflare, Fastly, Akamai, Vercel, Netlify, Amazon CloudFront, Amazon S3, Google Cloud, Microsoft Azure, Bunny CDN, Sucuri, Imperva, WP Engine, Kinsta, Pantheon, Heroku, GitHub Pages, Fly.io, Render
- **JavaScript framework:** React, Next.js, Shopify Hydrogen, Gatsby, Remix, Vue.js, Nuxt, Angular, AngularJS, SvelteKit, Astro
- **JavaScript library:** jQuery, jQuery UI, Bootstrap, Alpine.js, htmx, GSAP, Swiper, Polyfill.io
- **Consent management:** OneTrust, Cookiebot, Usercentrics, TrustArc, Didomi, Quantcast Choice, Termly, Osano, CookieYes, iubenda, Complianz
- **Reviews:** Trustpilot, Yotpo, Judge.me, Okendo, Stamped, Loox, REVIEWS.io, Feefo, Bazaarvoice, PowerReviews
- **Search:** Algolia, Klevu, Searchspring, Constructor, Doofinder, Coveo, Searchanise, Google Programmable Search
- **A/B testing:** Optimizely, VWO, AB Tasty, Google Optimize, Convert, Kameleoon, Dynamic Yield, Adobe Target
- **Web server:** Nginx, Apache HTTP Server, Microsoft IIS, LiteSpeed, OpenResty, Caddy
- **Backend:** PHP, ASP.NET, Express, Laravel, Django, Ruby on Rails, Java
- **Security:** reCAPTCHA, hCaptcha, Cloudflare Turnstile
- **Accessibility:** accessiBe, UserWay, AudioEye
- **Fonts:** Google Fonts, Adobe Fonts, Font Awesome
- **Video:** YouTube, Vimeo, Wistia
- **Loyalty & subscriptions:** Recharge, Smile.io, LoyaltyLion

In **Technologies to look for**, use these names (case doesn't matter). Common aliases work too: `GA4`, `Google Analytics` (GA4 and Universal Analytics), `GTM`, `Adobe Commerce`, `Demandware`, `Facebook Pixel`, `Clearpay`, `CloudFront`, `Sendinblue`, `ConvertKit` and others.

### How much does it cost?

Pay per event: **$0.002 per website analyzed**, which is **$2.00 per 1,000 websites, Apify platform usage included**, plus $0.005 per run start. A website is charged when its page was read: it answered with an HTML page (after redirects), whatever technologies were or weren't found. It is also charged when it answered with an error such as 429 or 403 but that answer's headers still revealed something about the site itself, such as its platform (the row then has a `warning`). Headers that only show the CDN, web server or security layer in front of the site (for example just Cloudflare) don't count: that row is a free error row. These are **free**: DNS errors, connection failures, error or bot-protection answers (403, 429, 503…) whose headers reveal nothing beyond the CDN or web server, redirect loops, files that aren't web pages, empty pages, private or internal addresses, and input that isn't a website. With **Only matching websites** on, websites that are left out are free too.

**Apify Store discounts:** the price above is for Apify's Free plan. Paid plans pay less per 1,000 websites: $1.80 on Starter, $1.60 on Scale, $1.40 on Business. The "from" price at the top of the Store page is the Business price. Apify Proxy traffic, if you turn it on, is billed separately by Apify.

**Worked examples** (website-event subtotals at the Free-plan rate; add the run-start charge, $0.005 at the default memory and more at higher memory, plus any optional Apify Proxy charges):

- 1,000 websites, all reachable: 1,000 × $0.002 = **$2.00**.
- 5,000 leads from a Google Maps run, 400 of them with a dead website: 4,600 × $0.002 = **$9.20**.
- 10,000 websites with *Technologies to look for* = Shopify and *Only matching websites* on, 1,200 of which run Shopify: 1,200 × $0.002 = **$2.40**.

If you set a maximum cost per run, the Actor stops cleanly at that limit, and a run that is resumed continues after the websites already done.

### FAQ and limits

#### How does it detect technologies?

It requests the page at each URL you give (bare domains = the home page), follows redirects, and reads the **HTML, the response headers and the names of the cookies the response sets**. It then checks those against its own rules: script, stylesheet, image and iframe URLs; `<meta name="generator">` and similar tags; header names and values (`x-shopid`, `cf-ray`, `x-powered-by`…); cookie names; product-specific markup and the bootstrap code products put in inline scripts. It makes no other requests to the website.

#### What can it miss?

- **Anything loaded by JavaScript.** There is no browser and no JavaScript execution. A tool that a tag manager (such as Google Tag Manager) loads after the page opens is not in the page's HTML, so it is usually not detected; only GTM itself is. The same goes for apps that build the whole page in the browser.
- **Anything only on other pages.** Only the page you give is read. A checkout provider, chat widget or review app that appears only on product, cart or contact pages may be missed.
- **Hidden or customised setups.** Headless storefronts, proxied analytics, server-side tagging and sites that strip generator tags and headers show fewer markers.
- **Bot protection and rate limits.** Some websites answer automated requests with a challenge, a 403 or a 429. If the answer's headers reveal something about the site beyond its CDN, web server or security layer, you get a charged partial row with a `warning` and only those detections; otherwise a free row with an `error`. See *Proxy* below.

#### Proxy: big stores answer 429 or 403

Large stores and media sites often rate-limit or block requests from datacenter IP addresses, which is where Apify runs. For those, turn on **Proxy → Apify Proxy** in the input (try the default datacenter group first, then **residential** if the sites still block). Proxy traffic is billed by Apify to your account, separately from this Actor's price; a proxy may improve access but doesn't guarantee it. This Actor's maximum-cost setting doesn't include proxy charges, so check your proxy usage separately. Without a proxy (the default), requests go out directly. Custom `http://` proxy URLs work too.

#### Are the results guaranteed?

No. They are **indicators** based on public markers. `high` means a marker specific to that product was found (its own CDN host, header, cookie or generator tag); `medium` means a weaker or less specific marker, or a technology implied by another one. Always check the `evidence` before relying on a single detection. Versions are reported only where the page states them.

#### Does it give traffic, revenue or company data?

No. It doesn't estimate visitors, sales, ad spend or company size, and it doesn't look anything up in third-party databases. The tracking IDs it reports are the public tag IDs that every visitor's browser receives.

#### Is this based on Wappalyzer?

No. The fingerprint rules were written for this Actor from each product's own public markers. They are not copied from Wappalyzer or any other fingerprint database.

#### Why is a website's row "failed"?

The `error` column says why, in plain English: for example the domain doesn't resolve, the site answered 403 (usually bot protection), or the URL points to a PDF. Failed websites don't incur the site-analyzed charge. Starting another run still incurs a start fee, and enabled proxy traffic may incur separate Apify charges, even if no website produces a billable result.

### Other tools by the same author

| Actor | Use it to |
|---|---|
| [Website Contact Info Scraper](https://apify.com/charlesmarkette/website-contact-info-scraper-emails-phones-socials) | Add emails, phones and social profiles to the stores and websites you found. |
| [Domain WHOIS & DNS Lookup](https://apify.com/charlesmarkette/domain-whois-dns-lookup-bulk-rdap) | Add domain age, registrar and email provider (Google Workspace, Microsoft 365…) to the same list. |
| [PageSpeed & Lighthouse Audit](https://apify.com/charlesmarkette/pagespeed-lighthouse-audit-core-web-vitals) | Score the same websites on speed, SEO and accessibility. |
| [Bulk URL Status Checker](https://apify.com/charlesmarkette/bulk-url-status-checker-redirects-ssl) | Check which websites load, where they redirect and whether their SSL certificate is valid. |
| [Dataset Filter & Transform](https://apify.com/charlesmarkette/dataset-filter-transform-rename-flatten-fields) | Keep only the rows you need (for example `ecommercePlatform` = Shopify), rename and flatten fields. |
| [Merge & Deduplicate Datasets](https://apify.com/charlesmarkette/merge-deduplicate-datasets-only-new-items) | Keep only new websites between runs before analyzing them. |
| [Google Sheets Sync](https://apify.com/charlesmarkette/google-sheets-sync) | Send the rows to a Google Sheet. |

Domain parsing: [tldextract](https://github.com/john-kurkowski/tldextract) with the Public Suffix List. HTML parsing: [lxml](https://lxml.de).

# Actor input Schema

## `startUrls` (type: `array`):

One per line. Home page URLs or bare domains (example.com becomes https://example.com/). Each website becomes one output row. A URL with a path is analyzed as that page.

## `datasetId` (type: `string`):

Optional. A dataset of companies, stores or leads (from Google Maps, a directory scraper, a CSV import…). Each item's website (see URL field) is analyzed and the technology columns are added next to the item's fields. Use {{resource.defaultDatasetId}} in an integration.

## `urlField` (type: `string`):

The item field that holds the website. Dotted paths work (company.website). If it holds a list, the first URL is used.

## `keepItemFields` (type: `boolean`):

On: each output row is the original item plus the technology columns. Off: only the technology columns.

## `categories` (type: `array`):

Optional. Limit the technologies, technologyNames and categories columns to these categories. Empty = all. ecommercePlatform, cms and analytics are always filled.

## `technologies` (type: `array`):

Optional, used with 'Only matching websites'. Names as they appear in the output, one per line (e.g. Shopify, WooCommerce, Klaviyo). Case doesn't matter; common aliases such as GA4, GTM, Adobe Commerce or Facebook Pixel work too.

## `onlyMatches` (type: `boolean`):

On: output only websites where at least one of 'Technologies to look for' was found (or, with that list empty, where anything in the chosen categories was found). Websites left out are not charged and not stored; failed websites are left out too. A headers-only row (a blocked site whose headers revealed a match) can still match and is charged.

## `maxConcurrency` (type: `integer`):

How many websites to analyze at the same time (1–50). Each website gets at most 2 requests at a time.

## `maxResults` (type: `integer`):

Optional cap on output rows (each row is one website).

## `proxyConfiguration` (type: `object`):

Optional. Big stores and media sites often rate-limit (HTTP 429) or block (403) datacenter IPs. Turn on Apify Proxy for those (residential if datacenter is still blocked). Proxy traffic is billed by Apify to your account. Default: no proxy.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.fashionnova.com",
    "https://wordpress.org",
    "https://www.python.org"
  ],
  "urlField": "url",
  "keepItemFields": true,
  "onlyMatches": false,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `items` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://www.fashionnova.com",
        "https://wordpress.org",
        "https://www.python.org"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("charlesmarkette/website-tech-stack-detector-shopify-cms-analytics").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [
        "https://www.fashionnova.com",
        "https://wordpress.org",
        "https://www.python.org",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("charlesmarkette/website-tech-stack-detector-shopify-cms-analytics").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://www.fashionnova.com",
    "https://wordpress.org",
    "https://www.python.org"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call charlesmarkette/website-tech-stack-detector-shopify-cms-analytics --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,charlesmarkette/website-tech-stack-detector-shopify-cms-analytics"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/13BGfLYfxbjiPWiKM/builds/fQKKbvGjksWQeytHY/openapi.json
