{
  "openapi": "3.0.1",
  "info": {
    "title": "Website Tech Stack Detector — 100+ Technologies",
    "description": "Identify the technologies, frameworks, and services running on any website. Website Tech Stack Detector crawls one or more URLs, inspects HTTP headers, HTML meta tags, script sources, and body content, then matches them against a fingerprint database of 106 web technologies across 17 categories.",
    "version": "1.0",
    "x-build-id": "m6lcqDTlvCUUrAQzl"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/ryanclinton~website-tech-stack-detector/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-ryanclinton-website-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/ryanclinton~website-tech-stack-detector/runs": {
      "post": {
        "operationId": "runs-sync-ryanclinton-website-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/ryanclinton~website-tech-stack-detector/run-sync": {
      "post": {
        "operationId": "run-sync-ryanclinton-website-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",
        "required": [
          "urls"
        ],
        "properties": {
          "urls": {
            "title": "Website URLs or Domains",
            "maxItems": 1000,
            "type": "array",
            "description": "List of websites or bare domains to analyze (e.g., https://shopify.com or stripe.com). Same domain entered multiple times is collapsed.",
            "items": {
              "type": "string"
            },
            "default": [
              "https://apify.com",
              "https://shopify.com",
              "https://stripe.com"
            ]
          },
          "preset": {
            "title": "Use-case preset",
            "enum": [
              "security-audit",
              "sales-prospecting",
              "competitor-tracking",
              "portfolio-analysis",
              "raw"
            ],
            "type": "string",
            "description": "One-click configuration for common workflows. Each preset sets sensible defaults for crawl depth, security depth, output mode, competitive intel, diff tracking, and alerts. Explicit fields below always override the preset."
          },
          "outputMode": {
            "title": "Output mode",
            "enum": [
              "raw",
              "enriched",
              "executive"
            ],
            "type": "string",
            "description": "raw = legacy detection fields only (back-compat). enriched = full premium output (default). executive = collapsed decision-grade view: grade, priority score, summary, recommendations, change insights, lead intel, alerts.",
            "default": "enriched"
          },
          "maxPagesPerDomain": {
            "title": "Max pages per domain",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Maximum pages crawled per domain. Inner pages may reveal additional technologies. Higher values find more, slower runs.",
            "default": 3
          },
          "compareToPriorRun": {
            "title": "Compare to prior run (stack diff + change intelligence)",
            "type": "boolean",
            "description": "Persist this run's tech list per domain and diff against the prior run. Output includes added/removed technologies, lastSeenAt, and a classified `changeInsights` block (CDN swap, CMS migration, framework migration, etc.). Set to false for one-off audits that should not affect the snapshot baseline.",
            "default": true
          },
          "securityDepth": {
            "title": "Security depth",
            "enum": [
              "basic",
              "advanced"
            ],
            "type": "string",
            "description": "basic = OWASP headers grade only (default). advanced = also probes Set-Cookie flags (Secure / HttpOnly / SameSite) and a small set of well-known admin / config paths (/.env, /.git/HEAD, /wp-admin, etc.) to flag exposed surfaces.",
            "default": "basic"
          },
          "renderMode": {
            "title": "Render mode",
            "enum": [
              "auto",
              "cheerio",
              "headless"
            ],
            "type": "string",
            "description": "auto (default) — Cheerio first, fall back to Playwright Chromium for SPA-detected domains so runtime-only technologies become visible. cheerio — never use Playwright (cheapest, fastest). headless — always render every domain in Chromium (most thorough, slowest, highest memory).",
            "default": "auto"
          },
          "enableCompetitiveIntel": {
            "title": "Enable competitive intelligence",
            "type": "boolean",
            "description": "When the batch contains 2+ successful domains, compute a `competitivePosition` block per domain: most common stack in batch, overlap, outlier flag, behind/ahead vs cohort median, and dominant tech trend.",
            "default": false
          },
          "emitAlerts": {
            "title": "Emit alerts (Slack/webhook-ready)",
            "type": "boolean",
            "description": "Populate the `alerts[]` array on each record when conditions cross a threshold (new critical CVE, multiple high CVEs, failing security grade, new tech detected since prior run, exposed admin path).",
            "default": true
          },
          "emitNotification": {
            "title": "Emit notification block (Slack / email-ready strings)",
            "type": "boolean",
            "description": "Adds `notification: { slackMessage, emailSubject, emailSummary }` per domain. Drop-in for webhook routing.",
            "default": true
          },
          "emitBatchInsight": {
            "title": "Emit batch-insight record",
            "type": "boolean",
            "description": "Adds a single `recordType: 'batch-insight'` record at the end of the dataset summarising the cohort: top recurring CVEs, most-adopted tech, highest-priority domains, dominant tech trend, change-type counts. Auto-skipped on single-domain runs.",
            "default": true
          },
          "compareDomains": {
            "title": "Compare two domains (head-to-head)",
            "minItems": 2,
            "maxItems": 2,
            "type": "array",
            "description": "Optional. Two domains from `urls` to head-to-head compare. Emits a single `recordType: 'comparison'` record with winner, dimensional breakdown, and confidence.",
            "items": {
              "type": "string"
            }
          },
          "customDetectors": {
            "title": "Custom detectors",
            "type": "array",
            "description": "User-defined fingerprints — encode your own internal-tool detection by providing a name, category, and at least one matcher (script regex, html regex, or header). Matched custom detectors appear as first-class technologies in output.",
            "items": {
              "type": "object"
            }
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy settings. Apify Proxy enabled by default. Recommended for batches over ~20 sites or Cloudflare-protected origins.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}