Skip to content

Latest commit

 

History

History
84 lines (61 loc) · 2.43 KB

File metadata and controls

84 lines (61 loc) · 2.43 KB

JavaScript (apify-client) — Website Tech Stack Detector

Call the Website Tech Stack Detector from Node.js with the official apify-client. This runs the hosted Actor and reads its dataset — client-side only.

Install

npm install apify-client

Run the Actor and read the tech stack

import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const input = {
  domains: ['techcrunch.com', 'shopify.com', 'webflow.com', 'stripe.com'],
  concurrency: 15,
  maxResults: 500,
};

// Start the Actor and wait for it to finish
const run = await client.actor('logiover/website-tech-stack-detector').call(input);

// Read the results (one row per domain)
const { items } = await client.dataset(run.defaultDatasetId).listItems();

for (const site of items) {
  console.log(`${site.domain}`);
  console.log(`  CMS:        ${site.cms ?? '-'}`);
  console.log(`  Ecommerce:  ${site.ecommerce ?? '-'}`);
  console.log(`  Server:     ${site.server ?? '-'}`);
  console.log(`  Tech (${site.technologyCount}): ${site.technologies.join(', ')}`);
}

Filter for a target segment

Build a prospecting list — e.g. every Shopify store that also runs Klaviyo:

const run = await client.actor('logiover/website-tech-stack-detector').call({
  domains: ['store-a.com', 'store-b.com', 'store-c.com'],
  concurrency: 20,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();

const shopifyPlusKlaviyo = items.filter(
  (site) => site.ecommerce === 'Shopify' && site.technologies.includes('Klaviyo'),
);

console.log(`${shopifyPlusKlaviyo.length} Shopify + Klaviyo stores:`);
console.log(shopifyPlusKlaviyo.map((s) => s.domain));

Find sites missing analytics

Surface accounts with no analytics detected — good candidates for a measurement pitch:

const noAnalytics = items.filter(
  (site) => !site.byCategory?.Analytics || site.byCategory.Analytics.length === 0,
);

Combine domains and startUrls

const run = await client.actor('logiover/website-tech-stack-detector').call({
  domains: ['magento.com'],
  startUrls: [
    { url: 'https://bigcommerce.com' },
    { url: 'https://prestashop.com' },
  ],
  concurrency: 10,
});

domains and startUrls are merged before fingerprinting.

See also: cli.md · api-curl.md · python.md