{
  "openapi": "3.0.1",
  "info": {
    "title": "Tech Stack Detector & Change Monitor - Wappalyzer Alternative",
    "description": "Detect the technologies behind any list of websites — CMS, ecommerce, analytics, frameworks, CDN, email provider (DNS) — and track changes between runs. 7,600+ open fingerprints. Pay only per site analyzed.",
    "version": "0.1",
    "x-build-id": "G4MWshjfqJhdatCwY"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/optalgin~tech-stack-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-optalgin-tech-stack-monitor",
        "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/optalgin~tech-stack-monitor/runs": {
      "post": {
        "operationId": "runs-sync-optalgin-tech-stack-monitor",
        "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/optalgin~tech-stack-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-optalgin-tech-stack-monitor",
        "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": "Websites",
            "type": "array",
            "description": "Domains or URLs, one per line. Bare domains are fine (https:// is assumed). Duplicates by hostname are removed.",
            "items": {
              "type": "string"
            }
          },
          "onlyIfDetected": {
            "title": "Output only sites that use…",
            "type": "array",
            "description": "Technology names or categories (e.g. Shopify, WordPress, Ecommerce, HubSpot). Only sites where at least one of these was detected are written to the dataset. All sites are still analysed and billed; this just keeps your dataset to the matches.",
            "items": {
              "type": "string"
            }
          },
          "monitorId": {
            "title": "Change monitor ID (optional)",
            "type": "string",
            "description": "Give your watch-list a name (e.g. 'competitors'). The last known stack of every site is kept in a named key-value store in YOUR account, and each result reports added / removed technologies and version changes since the previous run. Schedule the Actor to get a change feed."
          },
          "outputOnlyChanges": {
            "title": "Output only changed sites",
            "type": "boolean",
            "description": "With a monitor ID: output only sites whose stack changed (or that are checked for the first time). Every analyzed site is still billed.",
            "default": false
          },
          "confirmChanges": {
            "title": "Confirm changes on two runs",
            "type": "boolean",
            "description": "Report an added/removed technology only after it is seen in two consecutive checks. Filters out flapping tags (bot protection, A/B tests, rotating ads). First sightings appear in `pendingChanges`.",
            "default": true
          },
          "detectDns": {
            "title": "DNS-based detection",
            "type": "boolean",
            "description": "Also look at MX / TXT (SPF, verification) / NS / SOA records to detect email providers, DNS hosts and SaaS verifications.",
            "default": true
          },
          "unblock": {
            "title": "Unblock blocked sites (residential proxy)",
            "type": "boolean",
            "description": "Every site is first fetched with a real Chrome TLS fingerprint (free). If it still comes back as HTTP 403 or a bot-challenge page, it is retried once through a residential proxy located in the site's own country (e.g. .co.il → Israel). The extra `site-unblocked` event is charged only when the retry actually returns a real page. Sites that stay blocked are marked with a `warning` and cost nothing extra.",
            "default": true
          },
          "proxyCountry": {
            "title": "Proxy country override",
            "pattern": "^[A-Za-z]{2}$",
            "type": "string",
            "description": "ISO country code (e.g. IL, DE, US) to use for every proxy retry instead of the one inferred from the domain."
          },
          "browserMode": {
            "title": "Browser mode",
            "enum": [
              "off",
              "auto",
              "always"
            ],
            "type": "string",
            "description": "Renders the page in headless Chromium to see what only JavaScript reveals: window.* fingerprints (about 900 technologies are detectable only this way), scripts injected at runtime (chat widgets, heatmaps, marketing tags), XHR/fetch calls and JS-set cookies. 'auto' scans a site only when the static pass found 4 or fewer technologies on the page or hit a JavaScript challenge. Each rendered site adds the `site-browser-scan` event. Needs ≥ 2 GB run memory; 4 GB (the default) renders two pages at once.",
            "default": "auto"
          },
          "browserConcurrency": {
            "title": "Parallel browser pages",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "How many pages to render at once. Automatically capped to one page per 2 GB of run memory (default run memory is 4 GB → 2 pages); raise the run memory to render more in parallel.",
            "default": 3
          },
          "minConfidence": {
            "title": "Minimum confidence",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Drop detections below this confidence (0–100).",
            "default": 50
          },
          "includeImplied": {
            "title": "Include implied technologies",
            "type": "boolean",
            "description": "Technologies inferred from others rather than seen directly (WordPress implies PHP and MySQL; Amazon S3 implies AWS) are marked via: [\"implied\"]. Turn this off to keep only what was observed on the page or in DNS.",
            "default": true
          },
          "includeEvidence": {
            "title": "Include evidence",
            "type": "boolean",
            "description": "Add which header / cookie / meta tag / script / DNS record triggered each detection.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "How many sites to fetch in parallel.",
            "default": 20
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 3,
            "maximum": 120,
            "type": "integer",
            "description": "Per-site HTTP timeout. Slow sites are retried once over plain http.",
            "default": 20
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}