DEV Community

Boehner
Boehner

Posted on • Originally published at snapapi.tech

How to Build a Competitor Tech Stack Auditor in 15 Minutes (Node.js + SnapAPI)

I wanted to know what technologies my top 5 competitors were using. Google it? Useless. Run Wappalyzer on each one manually? Fine for one site. But I had 50 sites and I wanted the results in a spreadsheet, not a browser tab.

Here's the 25-line script I built. It runs in Node.js 18+ with no npm install, takes about 15 minutes to set up, and outputs a markdown table you can paste anywhere.

What SnapAPI's /analyze endpoint returns

The SnapAPI analyze endpoint runs a real Chromium browser against any URL and returns structured JSON in a single call:

{
  "technologies": ["React", "Next.js", "Vercel", "Stripe.js"],
  "word_count": 1842,
  "primary_cta": "Start for free",
  "navigation": ["Products", "Solutions", "Pricing", "Docs"],
  "load_time_ms": 412
}
Enter fullscreen mode Exit fullscreen mode

One call. No Puppeteer setup. No DOM parsing. The tech detection covers 30+ frameworks and services — React, Vue, Next.js, Nuxt, Vercel, Cloudflare, Stripe, Intercom, Segment, and more.

The full script

// tech-audit.js
// Audits competitor tech stacks and prints a markdown table.
// Requirements: Node.js 18+ — no npm install needed.
// Usage: SNAPAPI_KEY=your_key node tech-audit.js

const API_KEY = process.env.SNAPAPI_KEY;
if (!API_KEY) { console.error('Set SNAPAPI_KEY env var. Free key at https://snapapi.tech'); process.exit(1); }

const COMPETITORS = [
  'https://stripe.com/pricing',
  'https://notion.so/pricing',
  'https://linear.app/pricing',
  // Add as many as you want — each costs 1 API call
];

async function analyze(url) {
  const res = await fetch(
    `https://api.snapapi.tech/v1/analyze?url=${encodeURIComponent(url)}&api_key=${API_KEY}`
  );
  if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
  return res.json();
}

async function main() {
  const results = [];
  for (const url of COMPETITORS) {
    process.stdout.write(`Analyzing ${url} ... `);
    try {
      const data = await analyze(url);
      results.push({
        url,
        technologies: (data.technologies || []).join(', ') || '',
        cta_count:    (data.cta || (data.primary_cta ? [data.primary_cta] : [])).length,
        word_count:   data.word_count ?? '',
      });
      console.log('done');
    } catch (err) {
      console.log(`ERROR: ${err.message}`);
      results.push({ url, technologies: 'error', cta_count: '', word_count: '' });
    }
    await new Promise(r => setTimeout(r, 500)); // be polite to the API
  }

  // Print markdown table
  console.log('\n| URL | Technologies | CTA Count | Word Count |');
  console.log('|-----|-------------|-----------|------------|');
  for (const r of results) {
    console.log(`| ${r.url} | ${r.technologies} | ${r.cta_count} | ${r.word_count} |`);
  }
}

main().catch(err => { console.error(err.message); process.exit(1); });
Enter fullscreen mode Exit fullscreen mode

Run it:

export SNAPAPI_KEY=your_key_here
node tech-audit.js
Enter fullscreen mode Exit fullscreen mode

Sample output

Analyzing https://stripe.com/pricing ... done
Analyzing https://notion.so/pricing ... done
Analyzing https://linear.app/pricing ... done

| URL | Technologies | CTA Count | Word Count |
|-----|-------------|-----------|------------|
| https://stripe.com/pricing | React, Next.js, Vercel, Stripe.js | 2 | 1842 |
| https://notion.so/pricing | React, Next.js, Segment, Intercom | 3 | 1204 |
| https://linear.app/pricing | React, Next.js, Cloudflare | 2 | 890 |
Enter fullscreen mode Exit fullscreen mode

Paste that table straight into Notion, a GitHub comment, or a Slack message. Takes about 5 seconds per URL.

Taking it further

  • Save to CSV — add const fs = require('fs'); fs.writeFileSync('audit.csv', results.map(r => Object.values(r).join(',')).join('\n')); after the table output. One line.

  • Schedule daily with cron0 9 * * 1 SNAPAPI_KEY=your_key node /path/to/tech-audit.js >> ~/audit.log runs every Monday morning. You'll see tech stack changes before anyone tells you about them.

  • Compare week-over-week — save a JSON snapshot each run and diff against last week's. The open-source automation-health-monitor already does this — it watches for CTA changes, word count shifts, and tech stack changes, and alerts you the moment something differs.

Get started

SnapAPI gives you 100 free calls/month — enough to run this audit weekly for 15 competitors with no cost. The Starter plan ($9/mo) gives you 1,000 calls if you need more scale.

Sign up at snapapi.tech — API key in about 30 seconds, no credit card.


Top comments (0)