{
  "openapi": "3.0.1",
  "info": {
    "title": "Dutchie Dispensary & Menu Scraper - Cannabis Prices",
    "description": "Scrape Dutchie (dutchie.com) cannabis dispensaries and menus: products by size, recreational and medical prices, specials, THC and CBD, stock, hours and location. Search by city, zip or state. Cache returns only new or changed products. Export JSON, CSV or Excel.",
    "version": "1.0",
    "x-build-id": "J0C6ztE7Vamhu5kZj"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/confidential_gnat~dutchie-dispensary-menu-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-confidential_gnat-dutchie-dispensary-menu-scraper",
        "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/confidential_gnat~dutchie-dispensary-menu-scraper/runs": {
      "post": {
        "operationId": "runs-sync-confidential_gnat-dutchie-dispensary-menu-scraper",
        "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/confidential_gnat~dutchie-dispensary-menu-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-confidential_gnat-dutchie-dispensary-menu-scraper",
        "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": {
          "startUrls": {
            "title": "Dispensary URLs",
            "type": "array",
            "description": "Dutchie dispensary menu pages, for example https://dutchie.com/dispensary/pinnacle-cannabis-quincy. Embedded menu links work too. Leave empty if you only use the search locations below.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxItems": {
            "title": "Max products per dispensary",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum product rows saved for each dispensary. A product with three sizes makes three rows. In dispensary details mode this is not used.",
            "default": 5
          },
          "cacheProjectName": {
            "title": "Cache project name",
            "type": "string",
            "description": "Use the same name on each scheduled run to get only new or changed products. Products already saved under that name with the same price, special and stock are skipped, not charged and not counted towards the maximums. Every row gets changeType: new or updated. Leave empty to turn the cache off."
          },
          "searchLocations": {
            "title": "Search dispensaries by location",
            "type": "array",
            "description": "One search per line: a city and state (Boston, MA), a zip or postal code (02169), coordinates (42.36,-71.06) or a whole state or province (CO). A city searches that city only, a zip or coordinates search the radius below, and a state is covered with a grid of searches.",
            "items": {
              "type": "string"
            }
          },
          "radiusMiles": {
            "title": "Search radius (miles)",
            "minimum": 1,
            "maximum": 150,
            "type": "integer",
            "description": "Distance around a zip code or coordinates, up to 150 miles.",
            "default": 25
          },
          "maxDispensaries": {
            "title": "Max dispensaries per search",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum stores kept for each location search, nearest first. Closed and test stores are not counted.",
            "default": 5
          },
          "outputMode": {
            "title": "What to save",
            "enum": [
              "products",
              "dispensaries"
            ],
            "type": "string",
            "description": "Menu products (one row per product size) or only the dispensary details, without opening any menu.",
            "default": "products"
          },
          "maxTotalItems": {
            "title": "Max rows in total",
            "minimum": 1,
            "type": "integer",
            "description": "Optional cap for the whole run, across all dispensaries. Leave empty for no total cap."
          },
          "menuType": {
            "title": "Menu type",
            "enum": [
              "rec",
              "med"
            ],
            "type": "string",
            "description": "Which menu's price is the shelf price (price, specialPrice). Recreational and medical prices are saved on every row either way.",
            "default": "rec"
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "Keep only these menu categories. Leave empty for the whole menu.",
            "items": {
              "type": "string",
              "enum": [
                "Flower",
                "Pre-Rolls",
                "Vaporizers",
                "Concentrate",
                "Edible",
                "Tincture",
                "Topicals",
                "CBD",
                "Seeds",
                "Accessories",
                "Apparel"
              ]
            }
          },
          "offersOnly": {
            "title": "Specials only",
            "type": "boolean",
            "description": "Keep only products with a live sale or mix-and-match special.",
            "default": false
          },
          "includeDescriptions": {
            "title": "Include product descriptions",
            "type": "boolean",
            "description": "Adds the full product description to every row. It makes each menu page larger and the run a little slower.",
            "default": false
          },
          "includeClosedStores": {
            "title": "Include closed and test stores",
            "type": "boolean",
            "description": "Location searches skip stores that are not open and test or demo stores. Turn this on to keep them.",
            "default": false
          },
          "storeNames": {
            "title": "Store name contains",
            "type": "array",
            "description": "Keep only stores whose name contains one of these words, for example the name of a chain. Applies to location searches. Leave empty to keep every store.",
            "items": {
              "type": "string"
            }
          },
          "brands": {
            "title": "Brands",
            "type": "array",
            "description": "Keep only products of these brands (name match, case does not matter). Leave empty for every brand.",
            "items": {
              "type": "string"
            }
          },
          "includeReviews": {
            "title": "Include product reviews",
            "type": "boolean",
            "description": "Adds customer reviews (first name and last initial, rating, text, effects) to products that have reviews. Makes the run slower.",
            "default": false
          },
          "maxReviewsPerProduct": {
            "title": "Max reviews per product",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Newest reviews kept for each product when reviews are included.",
            "default": 5
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}