{
  "openapi": "3.0.1",
  "info": {
    "title": "Tech Stack Detector: Website Technology Lookup",
    "description": "Website technology lookup for any domain: 7,600+ technologies with versions and evidence (CMS, ecommerce, analytics, marketing, payments, hosting) from the page, Tag Manager, DNS and certificates. Tech history, change monitoring and lead-list filters. From $3 per 1,000 sites.",
    "version": "0.1",
    "x-build-id": "PQzzuD0YqLoQYrXLn"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/cleanpull~tech-stack-detector/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-cleanpull-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/cleanpull~tech-stack-detector/runs": {
      "post": {
        "operationId": "runs-sync-cleanpull-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/cleanpull~tech-stack-detector/run-sync": {
      "post": {
        "operationId": "run-sync-cleanpull-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": {
          "domains": {
            "title": "Domains or URLs",
            "type": "array",
            "description": "Websites to scan, one per line: example.com, shop.example.com or a full URL. The exact host is scanned (a subdomain is not swapped for its main domain); redirects are followed and reported.",
            "items": {
              "type": "string"
            }
          },
          "datasetId": {
            "title": "Domains from a dataset",
            "type": "string",
            "description": "Optional. The ID of an Apify dataset (from another actor, a CSV you uploaded…) whose rows hold the domains. Every row's columns are kept in the output under \"source\"."
          },
          "domainField": {
            "title": "Domain column",
            "type": "string",
            "description": "The dataset column that holds the domain or URL.",
            "default": "domain"
          },
          "maxDomains": {
            "title": "Max domains",
            "minimum": 1,
            "type": "integer",
            "description": "Optional. Stop after this many domains."
          },
          "urls": {
            "title": "URLs (alias)",
            "type": "array",
            "description": "Optional. Same as Domains; accepted so inputs from other detectors work unchanged.",
            "items": {
              "type": "string"
            }
          },
          "websites": {
            "title": "Websites (alias)",
            "type": "array",
            "description": "Optional. Same as Domains.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs (alias)",
            "type": "array",
            "description": "Optional. Same as Domains; objects with a \"url\" key work too.",
            "items": {
              "type": "string"
            }
          },
          "domain": {
            "title": "Domain (alias)",
            "type": "string",
            "description": "Optional. One domain, for workflows that send one at a time."
          },
          "url": {
            "title": "URL (alias)",
            "type": "string",
            "description": "Optional. One URL, for workflows that send one at a time."
          },
          "maxPagesPerDomain": {
            "title": "Pages per domain",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "1 reads the homepage. More adds key pages the homepage links to (pricing, cart, contact, login, careers, blog, about), where checkout, chat and sign-up tools often load. Each extra page is billed as an extra request.",
            "default": 1
          },
          "readTagManager": {
            "title": "Read Google Tag Manager containers",
            "type": "boolean",
            "description": "Read the site's public Tag Manager containers: the analytics, ad and heat-map tags they fire are invisible to a plain page fetch. Free.",
            "default": true
          },
          "checkDns": {
            "title": "Check DNS and certificate",
            "type": "boolean",
            "description": "Read MX, TXT, NS, SOA, CNAME and DMARC records and the TLS certificate issuer: email provider, services that send its email, services it verified its domain with (Microsoft 365, Atlassian, Stripe…), DNS host and certificate authority. Free.",
            "default": true
          },
          "scanScriptFiles": {
            "title": "Read script files",
            "type": "boolean",
            "description": "Also download up to 5 of the page's script files (its own bundles first) to find libraries and versions bundled inside them. Each file is billed as an extra request.",
            "default": false
          },
          "useBrowser": {
            "title": "Use a real browser",
            "enum": [
              "never",
              "auto",
              "always"
            ],
            "type": "string",
            "description": "A real Chrome sees JavaScript globals with their values, every host the page calls and tags added after load. \"When needed\" renders only pages that block plain requests or are empty without JavaScript. Billed per domain rendered.",
            "default": "never"
          },
          "historyYears": {
            "title": "Years of history",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Scan one Wayback Machine capture of the homepage per year, up to 5 years back: when each technology was first seen, what the site used before (WooCommerce before Shopify), and every past snapshot. Billed per snapshot scanned.",
            "default": 0
          },
          "discoverSubdomains": {
            "title": "Discover subdomains",
            "type": "boolean",
            "description": "Find the domain's subdomains in public certificate logs (shop., blog., app., help.) and scan them too. Billed per domain searched, plus each subdomain scanned.",
            "default": false
          },
          "maxSubdomains": {
            "title": "Max subdomains per domain",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Subdomains to scan per domain, shortest names first.",
            "default": 10
          },
          "requireTechnologies": {
            "title": "Must use",
            "type": "array",
            "description": "Optional. Keep only sites using these technologies or categories, for example \"Shopify\", \"Klaviyo\" or \"Live chat\". Names match the 7,600+ technologies and 110 categories, in any case; an unknown name is reported with suggestions. Sites that do not match are billed at the checked rate and not returned.",
            "items": {
              "type": "string"
            }
          },
          "requireMode": {
            "title": "Must use: any or all",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "Whether a site needs one of the Must use names or all of them.",
            "default": "any"
          },
          "excludeTechnologies": {
            "title": "Must not use",
            "type": "array",
            "description": "Optional. Leave out sites using any of these technologies or categories.",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Only list these categories",
            "type": "array",
            "description": "Optional. List only technologies in these categories (for example \"Ecommerce\", \"Analytics\"); summaries still cover everything.",
            "items": {
              "type": "string"
            }
          },
          "minConfidence": {
            "title": "Minimum confidence",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Leave out detections below this confidence (0–100). Most detections are 100; a few weak signals (a single generic cookie) score lower.",
            "default": 50
          },
          "monitorMode": {
            "title": "Monitor for changes",
            "type": "boolean",
            "description": "Return only sites whose technologies changed since the last run under the same monitor name: added, removed, new version, or migrated (one product replaced by another in the same category). The first run returns every site as a baseline. Schedule it daily or weekly.",
            "default": false
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Runs with the same name share one memory; use different names for different lists.",
            "default": "default"
          },
          "changeTypes": {
            "title": "Changes to report",
            "type": "array",
            "description": "Which changes count. A site with only other changes is billed at the checked rate and not returned.",
            "items": {
              "type": "string",
              "enum": [
                "added",
                "removed",
                "version-changed",
                "migrated"
              ],
              "enumTitles": [
                "Added",
                "Removed",
                "Version changed",
                "Migrated (replaced in the same category)"
              ]
            },
            "default": [
              "added",
              "removed",
              "version-changed",
              "migrated"
            ]
          },
          "confirmRemovalRuns": {
            "title": "Runs before a removal counts",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "A technology is reported removed only after it is missing from this many complete scans in a row, so a tag that loads only sometimes does not raise false alarms. A blocked or failed scan never removes anything.",
            "default": 2
          },
          "outputFormat": {
            "title": "Output format",
            "enum": [
              "domains",
              "technologies",
              "columns"
            ],
            "type": "string",
            "description": "How results are shaped. Billing is per domain in every format.",
            "default": "domains"
          },
          "columnTechnologies": {
            "title": "Columns",
            "type": "array",
            "description": "For the columns format: technologies (true/false) and categories (names found) to make columns for. Defaults to the Must use list.",
            "items": {
              "type": "string"
            }
          },
          "includeEvidence": {
            "title": "Include evidence",
            "type": "boolean",
            "description": "For each technology, what matched and where (script URL, header, cookie, DNS record, Tag Manager tag).",
            "default": true
          },
          "includeDescriptions": {
            "title": "Include descriptions",
            "type": "boolean",
            "description": "A one-line description of each technology, useful for AI agents.",
            "default": false
          },
          "includeSiteInfo": {
            "title": "Include site info",
            "type": "boolean",
            "description": "Title, description, language, organization name, logo and country from structured data, social profiles and the contact page link. No emails or phone numbers.",
            "default": true
          },
          "fields": {
            "title": "Only these fields",
            "type": "array",
            "description": "Optional. Keep only these fields, for example [\"domain\", \"cms\", \"technologies.name\"]. Dotted paths reach into lists.",
            "items": {
              "type": "string"
            }
          },
          "maxConcurrency": {
            "title": "Sites at a time",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many sites are scanned in parallel.",
            "default": 10
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. The actor picks proxies itself (direct, then datacenter, then residential only for a site that blocks the others)."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}