{
  "openapi": "3.0.1",
  "info": {
    "title": "Website Tech Stack Detector",
    "description": "Detect a website's technology stack in a real browser. Finds the analytics, ad tech, CDPs, chat widgets and payment providers that HTML-only scanners miss, and tracks what changes between scans.",
    "version": "1.0",
    "x-build-id": "oZDgccjjZMmZUhXQD"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fullspeedtram~website-tech-stack-detector/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fullspeedtram-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/fullspeedtram~website-tech-stack-detector/runs": {
      "post": {
        "operationId": "runs-sync-fullspeedtram-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/fullspeedtram~website-tech-stack-detector/run-sync": {
      "post": {
        "operationId": "run-sync-fullspeedtram-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",
        "properties": {
          "urls": {
            "title": "Websites",
            "type": "array",
            "description": "Domains or URLs to analyse, for example example.com or https://example.com. One record is returned per site. Leave empty if you are enriching a lead list instead.",
            "items": {
              "type": "string"
            }
          },
          "inputDatasetId": {
            "title": "Enrich a lead list (dataset ID)",
            "type": "string",
            "description": "Instead of typing websites, point this at the dataset of another Actor's run: any lead list, company search or directory scrape. Every row comes back with its technology stack attached, so you enrich your own list rather than getting a second table to join by hand. Rows sharing a website are scanned once and charged once."
          },
          "domainField": {
            "title": "Website column",
            "type": "string",
            "description": "Which column of that dataset holds the company website. Detected from the data by default, so set it only to correct a wrong guess."
          },
          "passthroughFields": {
            "title": "Columns to carry through",
            "type": "array",
            "description": "Which of your original columns to keep on the enriched rows. Empty means all of them, which is usually what you want. Every row also carries sourceItemIndex so you can join back by position.",
            "items": {
              "type": "string"
            }
          },
          "maxLeads": {
            "title": "Maximum leads to read",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Cap on how many rows to read from that dataset.",
            "default": 1000
          },
          "maxPagesPerSite": {
            "title": "Pages per site",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many pages to scan per site. The scanner starts at the URL you give it and then follows internal links to higher-signal pages such as pricing, checkout and contact, where payment and chat tools live. 1 scans only the entry page.",
            "default": 3
          },
          "categories": {
            "title": "Only these categories",
            "type": "array",
            "description": "Restrict the report to certain categories. Leave empty to return everything detected.",
            "items": {
              "type": "string",
              "enum": [
                "analytics",
                "tag-manager",
                "ad-tech",
                "cdp",
                "chat-support",
                "ab-testing",
                "session-replay",
                "payments",
                "ecommerce",
                "framework",
                "cms",
                "cdn",
                "consent",
                "error-tracking",
                "marketing-automation",
                "search",
                "auth",
                "hosting"
              ],
              "enumTitles": [
                "Analytics",
                "Tag managers",
                "Ad tech",
                "CDPs",
                "Chat and support",
                "A/B testing",
                "Session replay",
                "Payments",
                "Ecommerce",
                "JS frameworks",
                "CMS",
                "CDN",
                "Consent management",
                "Error tracking",
                "Marketing automation",
                "Site search",
                "Auth",
                "Hosting"
              ]
            }
          },
          "trackChanges": {
            "title": "Track changes between scans",
            "type": "boolean",
            "description": "Compare this scan against the previous one for the same domain and report which technologies were added or removed. The first scan of a domain establishes the baseline.",
            "default": false
          },
          "trackingStoreName": {
            "title": "Tracking store name",
            "type": "string",
            "description": "Named key-value store holding your baselines. Reuse the same name across runs to keep comparing against your own history.",
            "default": "technographics-baseline"
          },
          "onlyReportChanges": {
            "title": "Only output sites that changed",
            "type": "boolean",
            "description": "Skip sites whose stack is identical to the previous scan. Useful for monitoring a large list on a schedule. Sites with no baseline yet are always returned.",
            "default": false
          },
          "concurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many sites to scan in parallel.",
            "default": 5
          },
          "timeoutSecs": {
            "title": "Page timeout (seconds)",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "Maximum time to wait for a single page to load.",
            "default": 30
          },
          "settleMs": {
            "title": "Settle time (ms)",
            "minimum": 0,
            "maximum": 15000,
            "type": "integer",
            "description": "How long to wait after load for tags that arrive late, such as anything a tag manager or consent layer installs. Too short and the scan does not just miss them, it makes the same site look like it adopts and drops a pixel on alternate scans. Lower it only if you care more about speed than about a stable answer.",
            "default": 6000
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Datacenter proxy is the default and is sufficient for nearly every site, because a company's own marketing pages have no reason to block a reader. The country defaults to US and is worth keeping fixed: consent platforms gate marketing tags on the visitor's geography, so an unpinned proxy makes the same site look like it adopts and drops pixels between scans.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyCountry": "US"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}