{
  "openapi": "3.0.1",
  "info": {
    "title": "Dunkin' Donuts Menu Scraper: Items, Nutrition & Category Data",
    "description": "Extract Dunkin' Donuts' national menu: category, item name, image, plus optional description, calories, and size options. Categories read live from the site's own category grid, verified zero-duplicate. Built-in monitor mode tracks menu changes over time. No start fee, just $0.0028 per item.",
    "version": "0.2",
    "x-build-id": "pQKV5OeVro55cjstO"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/getascraper~dunkin-menu-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-getascraper-dunkin-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/getascraper~dunkin-menu-scraper/runs": {
      "post": {
        "operationId": "runs-sync-getascraper-dunkin-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/getascraper~dunkin-menu-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-getascraper-dunkin-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": {
          "categories": {
            "title": "Menu Categories",
            "type": "array",
            "description": "Only return items from these menu categories. Leave empty to return every category. The live category list can change with the season (e.g. limited-time drops), so this uses suggested values rather than a locked set.",
            "items": {
              "type": "string",
              "enum": [
                "$6 Meal Deal",
                "Iced Coffee, Espresso & Cold Brew",
                "Iced Refreshers, Specialty & Tea",
                "Hot Drinks",
                "Sandwiches & Wraps",
                "Donuts, Bagels & Bakery",
                "Snacks & Sides",
                "Bottled Drinks",
                "The Pumpkin Patch",
                "Alix's Earle-Y Riser",
                "Latest Drops",
                "Refreshing Sips",
                "Protein Picks",
                "Crafted Coffees & Cold Brew"
              ]
            },
            "default": []
          },
          "searchTerm": {
            "title": "Search Term",
            "type": "string",
            "description": "Only return items whose name or description contains this text (not case-sensitive). Leave blank to skip this filter.",
            "default": ""
          },
          "minCalories": {
            "title": "Minimum Calories",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Only return items with at least this many calories. Requires Fetch Full Details to be on, since calories are only known after opening an item's own page, so this only sees items within the Max Items cap below, not the whole menu. Leave blank for no minimum."
          },
          "maxCalories": {
            "title": "Maximum Calories",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Only return items with at most this many calories. Same Fetch Full Details and Max Items requirement as Minimum Calories above. Leave blank for no maximum."
          },
          "fetchDetails": {
            "title": "Fetch Full Details",
            "type": "boolean",
            "description": "Open each item's own page for its full description, calorie count, and size options. This is what makes calorie filtering possible, but it costs one extra page load per item, so it defaults off for a fast, cheap first pass. Turn it on once you know which items you actually need.",
            "default": false
          },
          "maxItems": {
            "title": "Max Items",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Maximum number of menu items to return in this run, after any filters above are applied.",
            "default": 25
          },
          "onlyNewOrChanged": {
            "title": "Incremental Monitor Mode",
            "type": "boolean",
            "description": "Only return items that are new or whose description, calories, or size options changed since your last run with the same monitor state name. Pair with an Apify schedule to catch new seasonal drops (Dunkin' rotates limited-time categories like The Pumpkin Patch and Latest Drops) without re-downloading the whole menu every time.",
            "default": false
          },
          "stateName": {
            "title": "Monitor State Name",
            "type": "string",
            "description": "Name for this run's incremental state, used only when Incremental Monitor Mode is on. Use different names to track separate category filters independently.",
            "default": "default"
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Dunkin's website is geo-gated to US traffic: Cloudflare redirects every non-US request (even a real browser) straight to a 403 page, confirmed live during development. Apify Proxy with the RESIDENTIAL group and US country is required; datacenter or non-US proxies will not reach the menu.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}