Stack Scan

Detect a website's technology stack with POST /v1/stack/scan.

POST https://api.jobspipe.dev/v1/stack/scan

Given a domain, returns the technologies its homepage serves: frontend frameworks, analytics, CDNs, payment processors and SaaS widgets. Results are cached. Requires authentication.

Try it live in the API Explorer.

Request

The body is a JSON object with a required domain.

FieldTypeDescription
domainstringRequired. The domain to scan, e.g. stripe.com. URLs and a leading www. are normalized off.
modestringOptional. auto (default) tries a fast HTTP fetch, then a headless browser render if results are thin. html or render forces one method.
curl https://api.jobspipe.dev/v1/stack/scan \
  -H "Authorization: Bearer jp_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{ "domain": "stripe.com" }'
import requests

resp = requests.post(
    "https://api.jobspipe.dev/v1/stack/scan",
    headers={"Authorization": "Bearer jp_live_your_key_here"},
    json={"domain": "stripe.com"},
)
resp.raise_for_status()
result = resp.json()
for tech in result["detected"]:
    print(tech["name"], "-", ", ".join(tech["categories"]))
const resp = await fetch("https://api.jobspipe.dev/v1/stack/scan", {
  method: "POST",
  headers: {
    Authorization: "Bearer jp_live_your_key_here",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ domain: "stripe.com" }),
});
const result = await resp.json();
for (const tech of result.detected) {
  console.log(tech.name, "-", tech.categories.join(", "));
}

Response

A 200 response describes the domain's current stack:

  • detected - the detected technologies. Each has name, slug, categories, a confidence score (0-100), an optional version, and metadata such as website, saas, and oss.
  • scanned_at - when this stack was recorded. A new record is stored only when the stack changes, so this reads as "unchanged since".
  • http_status - how the domain responded when scanned.
200 OK
{
  "domain": "stripe.com",
  "scanned_at": "2026-06-25T05:56:00Z",
  "http_status": 200,
  "detected": [
    {
      "slug": "react",
      "name": "React",
      "categories": ["JavaScript frameworks"],
      "confidence": 100,
      "version": null,
      "website": "https://react.dev",
      "saas": false,
      "oss": true
    },
    {
      "slug": "cloudflare",
      "name": "Cloudflare",
      "categories": ["CDN"],
      "confidence": 100,
      "version": null,
      "website": "https://www.cloudflare.com",
      "saas": true,
      "oss": false
    }
  ]
}

A reachable domain with no recognizable technologies returns http_status: 200 and an empty detected array. A domain the scanner could not reach returns http_status: 0.

Each scan that detects at least one technology costs 1 credit, including a repeat scan served from cache. A scan that detects nothing, or fails, costs nothing. See plans.

Status codes

StatusMeaning
200Success
400Missing or invalid domain
401Missing or invalid API key
402Out of credits
429Per-second rate limit exceeded
502The scanner failed
504The scan timed out

See the error reference for handling guidance.

On this page