{
  "openapi": "3.0.1",
  "info": {
    "title": "Tech Stack Scanner | Shopify Apps & WordPress Plugins",
    "description": "Detect 130+ web technologies, Shopify apps, WordPress plugins with versions, the ads.txt ad stack, and an A-F security header grade. Re-run on a schedule for install, migration and posture-drift alerts.",
    "version": "0.0",
    "x-build-id": "Pe1wAyZKeTqYyyfzN"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/adored_maze~tech-stack-scanner/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-adored_maze-tech-stack-scanner",
        "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/adored_maze~tech-stack-scanner/runs": {
      "post": {
        "operationId": "runs-sync-adored_maze-tech-stack-scanner",
        "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/adored_maze~tech-stack-scanner/run-sync": {
      "post": {
        "operationId": "run-sync-adored_maze-tech-stack-scanner",
        "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": [
          "domains"
        ],
        "properties": {
          "domains": {
            "title": "Domains",
            "type": "array",
            "description": "Domains or URLs to scan, e.g. shopify.com or https://www.allbirds.com. Re-run the same list on a schedule to get change alerts.",
            "items": {
              "type": "string"
            }
          },
          "trackChanges": {
            "title": "Track changes between runs",
            "type": "boolean",
            "description": "Remember each domain's stack and report what was added or removed since the previous scan. This is what makes repeat runs worth it - a site switching from WooCommerce to Shopify is the signal you are buying.",
            "default": true
          },
          "onlyChanged": {
            "title": "Only return domains that changed",
            "type": "boolean",
            "description": "Skip domains whose stack is identical to last scan. Ideal for a daily or weekly monitoring job over a large domain list.",
            "default": false
          },
          "mustUseAny": {
            "title": "Only sites using any of these",
            "type": "array",
            "description": "Keep only domains running at least one of these technologies, e.g. Shopify, Klaviyo, HubSpot. Exact technology names as returned in the output.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Only these categories",
            "type": "array",
            "description": "Keep only domains with a detection in one of these categories: ecommerce, cms, framework, javascript, analytics, tag-manager, advertising, marketing-automation, crm, payments, support, ab-testing, error-tracking, cdn, hosting, security, search, reviews, consent, video, maps.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "shopifyOnly": {
            "title": "Shopify stores only",
            "type": "boolean",
            "description": "Keep only domains detected as Shopify stores. Combine with mustUseAny to find, for example, every Shopify store running Klaviyo.",
            "default": false
          },
          "wordpressOnly": {
            "title": "WordPress sites only",
            "type": "boolean",
            "description": "Keep only domains detected as WordPress. Combine with mustUseAny to find, for example, every WordPress site running Elementor Pro.",
            "default": false
          },
          "includeAdsTxt": {
            "title": "Include ads.txt (ad monetisation stack)",
            "type": "boolean",
            "description": "Fetch and parse /ads.txt to list every ad system the site authorises to sell its inventory, which are DIRECT vs RESELLER, and which managed ad partner runs its monetisation. One extra small static request per domain.",
            "default": true
          },
          "securityGradeAtMost": {
            "title": "Security grade at most",
            "type": "string",
            "description": "Keep only domains whose security-header grade is this or worse (A is best, F is worst). Set to C to surface the weakest sites in a monitored list. Leave empty for no filter."
          },
          "retryBlockedViaProxy": {
            "title": "Retry blocked domains through a proxy",
            "type": "boolean",
            "description": "When a site answers with a bot wall (Cloudflare challenge, HTTP 403/429, DataDome and similar) instead of its homepage, try once more from a different IP. Blocked domains are always reported as blocked rather than as a site with no technologies, so turning this off costs coverage, not accuracy.",
            "default": true
          },
          "proxyGroups": {
            "title": "Proxy groups (advanced)",
            "type": "array",
            "description": "Apify Proxy groups to use for the blocked-domain retry, e.g. RESIDENTIAL. Leave empty for the automatic selection.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "rescueBlockedWithBrowser": {
            "title": "Rescue blocked domains with a browser",
            "type": "boolean",
            "description": "When a site answers with a bot wall instead of its homepage, open it in a real browser and scan what loads. Measured recovery is roughly two thirds of blocked domains, including Cloudflare-protected DTC stores and publishers. Only blocked domains reach the browser, so an unblocked list costs nothing extra. Rescued rows are marked with rescued_with_browser.",
            "default": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}