← Docs

Stack API

Identify the technologies observed on a website.

Look up the technologies used on a website's homepage. Get its CMS platforms, servers, frameworks and other tools, with versions and the time of the check. Try Stack.

Local preview. API access and SDK releases are pending.

Look up a website

GET
api.parseapi.com/stack/{domain}
Website technologies
Explore
Parameters 1
domainstring · path · required

Public hostname only, including an optional subdomain. Internationalized names and a trailing dot are accepted. URLs, paths, ports, IP addresses and private names return 400.

Run uses the free demo on API 2.0.0. Copied code uses your API key when signed in, or YOUR_API_KEY when signed out.

import { parseAPI } from '@parseapi/sdk';

const parse = parseAPI("YOUR_API_KEY");
const result = await parse.stack("wordpress.org");
console.log(result);

Run on your server with a secret key. Calling from a browser or app?

Example response
{
  "domain": "wordpress.org",
  "url": "https://wordpress.org/",
  "checked_at": "2026-09-21T01:06:18.169Z",
  "scope": "homepage",
  "pages": 1,
  "partial": true,
  "cms": [
    {
      "technology": "wordpress",
      "name": "WordPress",
      "version": null
    }
  ],
  "servers": [
    {
      "technology": "nginx",
      "name": "nginx",
      "version": null
    }
  ],
  "frameworks": [],
  "ecommerce": [],
  "analytics": [],
  "chat": [],
  "payments": [],
  "hosting": []
}

Pass a domain such as wordpress.org. One lookup checks its homepage and follows allowed redirects. The API uses your existing key and version 2.0.0. Each lookup uses one request.

Domain format and response fields

Subdomains and internationalized domain names are supported. Use the hostname alone, without a URL scheme, path or port. IP addresses and private hostnames return 400. The response retains the requested domain and reports the final URL.

Response fields

domain
Requested public hostname, normalized to lowercase ASCII
url
Homepage URL after redirects; requested HTTPS URL if no homepage response was received
checked_at
Successful check time in UTC. Cached reads retain it. Null when the check did not complete
scope
homepage or site. Site covers a bounded set of discovered pages
pages
Successfully checked HTML pages. Zero when no page could be checked
partial
True for homepage-only results or unchecked in-scope pages. False only for a finished bounded discovered set. Null when no page could be checked
cms
Detected CMS platforms and site builders
servers
Detected web servers
frameworks
Detected frameworks, such as Next.js or Express
ecommerce
Detected ecommerce platforms, such as Shopify or WooCommerce
analytics
Detected analytics tools
chat
Detected chat tools
payments
Detected payment tools
hosting
Detected hosting and edge services, such as Vercel or Cloudflare
technology
Stable code within each category array entry, such as wordpress or nextjs
name
Display name within each category array entry
version
Version within each category array entry. Null when unknown or conflicting

Read the result

Each category is a list: cms, servers, frameworks, ecommerce, analytics, chat, payments and hosting. Each entry has a stable technology code, a display name and nullable version. Empty means no match on the checked pages. A check that could not inspect any page returns null categories and checked_at.

scope identifies homepage or site coverage, and pages counts successfully checked HTML pages. The current preview checks one homepage and returns partial: true. A site inventory is also partial when known pages remain unchecked. partial: false means the bounded discovered set was checked; it does not mean every page on the website was found. No successful page returns pages: 0 and partial: null.

Successful checks are reused for up to 24 hours. checked_at always records the original check time. Failed checks can be retried after 15 minutes.

Stack reads the returned homepage HTML and headers. Technologies loaded only after JavaScript runs or on other pages may be absent. Versions are null when they are missing or conflicting.

Request timing and preview behavior

Allow 35 seconds for a fresh check in a custom HTTP client. The SDKs use this default for Stack. An explicit timeout setting takes precedence. Cached checks can return sooner.

The local playground runs without account authentication or billing. Its preview headers identify the simulated plan. Production API access remains disabled.

Handle errors

Invalid domains or unsupported options return 400. Authentication and key restrictions use 401 or 403. Request limits use 429. Service configuration failures return 503. API version 1.0.0 does not include Stack.

Questions? Email