{
  "openapi": "3.0.1",
  "info": {
    "title": "Tech Stack Detector - Wappalyzer & BuiltWith Alternative",
    "description": "Tech stack lookup API in bulk: CMS, ecommerce, analytics, CDN, frameworks, email provider, TLS and hosting of any website, or find websites using Shopify, WordPress or any technology. Wappalyzer & BuiltWith alternative, 7,600+ fingerprints. $3 per 1,000 sites, offline sites free.",
    "version": "0.1",
    "x-build-id": "J3J4nQKXuaGCnrWRq"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapewise~tech-stack-detector/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapewise-tech-stack-detector",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/scrapewise~tech-stack-detector/runs": {
      "post": {
        "operationId": "runs-sync-scrapewise-tech-stack-detector",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/scrapewise~tech-stack-detector/run-sync": {
      "post": {
        "operationId": "run-sync-scrapewise-tech-stack-detector",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "detect",
              "find"
            ],
            "type": "string",
            "description": "Default 'detect': one row per website in 'Websites', with its full tech stack, charged once per website that answered (offline or blocked websites are free). 'find': scans a domain list (the Tranco top 1M, or your own list in 'Websites') and returns only the websites that use the technologies in 'Technologies to find'; scanning is free and you pay per website found.",
            "default": "detect"
          },
          "urls": {
            "title": "Websites",
            "type": "array",
            "description": "Domains or URLs, one per line: example.com, www.example.com or https://example.com/pricing. A bare domain is analyzed from its home page; a full URL is analyzed as given. The scheme is added when missing and duplicates are analyzed once. In Find mode a list here is scanned instead of Tranco. Invalid entries return a free row with errorCode INVALID_URL. Default: three example sites.",
            "items": {
              "type": "string"
            },
            "default": [
              "wordpress.org",
              "www.shopify.com",
              "github.com"
            ]
          },
          "technologies": {
            "title": "Technologies to find (Find mode)",
            "type": "array",
            "description": "Find mode only. Technology names, one per line, case-insensitive, as the open fingerprint rules spell them: Shopify, WordPress, WooCommerce, Webflow, Magento, Stripe, HubSpot, Klaviyo, Intercom, Next.js, Google Workspace. A category name also works (Ecommerce, Live chat, CRM). An unknown name is reported in the log with the closest matches. Each website found is one charged result.",
            "items": {
              "type": "string"
            }
          },
          "matchAll": {
            "title": "Require all technologies",
            "type": "boolean",
            "description": "Find mode only. Off (default): a website matches when it uses any of the listed technologies. On: it must use all of them, for example Shopify and Klaviyo, which returns fewer but more targeted websites.",
            "default": false
          },
          "domainSource": {
            "title": "Domains to scan",
            "enum": [
              "auto",
              "tranco",
              "list"
            ],
            "type": "string",
            "description": "Where the domains come from. Default 'auto': the Tranco list in Find mode unless 'Websites' has entries, and your list in Detect mode. 'tranco': the Tranco top 1M (tranco-list.eu), a public research ranking rebuilt daily; in Detect mode it profiles the top N sites. 'list': only the 'Websites' field.",
            "default": "auto"
          },
          "trancoTop": {
            "title": "How many Tranco domains",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "How many Tranco domains to scan, counted after the TLD filter. Default 1,000, maximum 1,000,000. Find mode scans about 250 to 350 domains per minute, so 1,000 take a few minutes. The top ranks are big brands and infrastructure: for lists of stores or small sites, scan deeper ranks with 'Start at Tranco rank' or filter by TLD.",
            "default": 1000
          },
          "trancoStartRank": {
            "title": "Start at Tranco rank",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "First Tranco rank to use. Default 1. Set 5001 with 'How many Tranco domains' at 5,000 to scan ranks 5,001 to 10,000 in a second run without repeating the first.",
            "default": 1
          },
          "tldFilter": {
            "title": "Only these TLDs / countries (optional)",
            "type": "array",
            "description": "Keep only Tranco domains ending in these TLDs, one per line, without the dot: de, co.uk, com.br, fr, io. Useful for country lists, for example Shopify stores in Germany. Empty (default) keeps all TLDs.",
            "items": {
              "type": "string"
            }
          },
          "trancoListId": {
            "title": "Tranco list ID (optional)",
            "type": "string",
            "description": "A permanent Tranco list ID, for example V349N, to scan exactly the same domain list as an earlier run. Every row carries the ID it used in 'trancoListId'. Empty (default) uses the latest daily list."
          },
          "maxItems": {
            "title": "Maximum websites",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Cap on results, and therefore on cost. Detect mode: stop after this many websites analyzed. Find mode: stop after this many websites found (the scan stops early). Empty (default) means no limit."
          },
          "compareWithPreviousRun": {
            "title": "Compare with the previous run (change monitor)",
            "type": "boolean",
            "description": "Off by default. Detect mode: each row also gets technologiesAdded, technologiesRemoved, stackChanged, previousCheckedAt and firstSeenAt, compared with the last time this Actor checked the same domain in your account. History lives in the key-value store 'tech-stack-detector-history' in your own account; delete it to start over. Same price per website.",
            "default": false
          },
          "onlyChanged": {
            "title": "Only websites whose stack changed",
            "type": "boolean",
            "description": "Off by default. Turns the comparison on and delivers, and charges, only websites seen for the first time or whose technologies changed since the last check. A scheduled run where nothing changed delivers nothing and costs nothing for results.",
            "default": false
          },
          "categoriesFilter": {
            "title": "Only these categories (optional)",
            "type": "array",
            "description": "Keep only technologies in these categories, one per line, case-insensitive: CMS, Ecommerce, Analytics, CDN, JavaScript frameworks, Payment processors, Live chat, Tag managers, Email. Empty (default) keeps all 109 categories. The price per website is the same either way; this only makes rows shorter.",
            "items": {
              "type": "string"
            }
          },
          "minConfidence": {
            "title": "Minimum confidence",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Drop detections below this confidence, from 0 to 100. Default 50. Most fingerprints score 100; weak hints score 25 to 50 and are hidden at the default. Set 0 to see every hint.",
            "default": 50
          },
          "includeVersions": {
            "title": "Detect versions",
            "type": "boolean",
            "description": "On by default. Extracts version numbers when the website exposes them (generator meta tag, script file names, Server and X-Powered-By headers), for example WordPress 6.9.9 or jQuery 3.7.1. No effect on price.",
            "default": true
          },
          "checkDns": {
            "title": "Check DNS records",
            "type": "boolean",
            "description": "On by default. Reads the domain's MX, TXT (SPF and verification records), NS, SOA and CNAME records to detect the email provider (Google Workspace, Microsoft 365), the DNS host and SaaS tools that never show on the page (Salesforce, Atlassian, Zoom, Slack), returned in 'dnsVerifications'. Same price; turn off only for speed.",
            "default": true
          },
          "checkTls": {
            "title": "Check the TLS certificate",
            "type": "boolean",
            "description": "On by default. Reads the certificate on port 443: issuer (Let's Encrypt, DigiCert, Google Trust Services), expiry date, days left and whether it is valid, in the tls* fields. Same price.",
            "default": true
          },
          "checkHosting": {
            "title": "Check hosting (IP and ASN)",
            "type": "boolean",
            "description": "On by default. Resolves the website's IP and the network that serves it (ASN): AWS, Google Cloud, Cloudflare, Hetzner, OVH, Automattic. Behind a CDN this is the CDN, not the origin server. Same price.",
            "default": true
          },
          "legacyFieldNames": {
            "title": "Add snake_case fields",
            "type": "boolean",
            "description": "Off by default. Also writes status_code, final_url, tech_count, tech_names and scan_time_ms, the snake_case names other tech stack Actors use, so an existing integration keeps working. Turned on automatically when the input uses snake_case options (timeout_seconds, categories_filter, include_versions, include_confidence).",
            "default": false
          },
          "timeoutSecs": {
            "title": "Timeout per website (seconds)",
            "minimum": 3,
            "maximum": 60,
            "type": "integer",
            "description": "Seconds to wait for each website, from 3 to 60. Default 20 in Detect mode and 10 in Find mode. A website that does not answer in time returns a free row with errorCode TIMEOUT. Raise it for slow sites; lower it to speed up large scans.",
            "default": 20
          },
          "maxConcurrency": {
            "title": "Parallel websites",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Websites analyzed at the same time, from 1 to 100. Default 20 in Detect mode and 60 in Find mode. Higher is faster; lower it if many sites come back TIMEOUT or BLOCKED.",
            "default": 20
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "The first request to each website goes out directly, which is fastest. A website that blocks it or fails is retried through this proxy (Apify datacenter by default) and then with a Chrome-like client. Websites still blocked return a free BLOCKED row with the header and DNS detections.",
            "default": {
              "useApifyProxy": true
            }
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Same as 'Websites', kept for integrations built for other Actors. Accepts plain strings, request objects ({\"url\": \"https://example.com\"}) and {\"requestsFromUrl\": \"https://example.com/list.txt\"} for a remote text file with one domain per line. Merged into 'Websites'."
          },
          "domains": {
            "title": "Domains",
            "type": "array",
            "description": "Same as 'Websites', for bare domains, one per line (example-store.de). Anything that is not a domain returns a free INVALID_URL row; www or https here do no harm. Merged into 'Websites'.",
            "items": {
              "type": "string"
            }
          },
          "websites": {
            "title": "Websites (alias)",
            "type": "array",
            "description": "Same as 'Websites', for full page addresses, one per line (https://example-store.de/about), when you want a specific page analyzed instead of the home page. Merged into 'Websites'.",
            "items": {
              "type": "string"
            }
          },
          "startDomains": {
            "title": "Start root domains",
            "type": "array",
            "description": "Same as 'Websites': root domains, one per line, under the field name BuiltWith-style Actors use. Merged into 'Websites'.",
            "items": {
              "type": "string"
            }
          },
          "url": {
            "title": "Single URL",
            "type": "string",
            "description": "One website, or several separated by commas or new lines, as a single text value. Merged into 'Websites'."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}