{
  "openapi": "3.0.1",
  "info": {
    "title": "Burpple Scraper - Singapore Restaurant & Café Discovery",
    "description": "Scrape Burpple Singapore restaurants, cafes and hawkers by neighbourhood, cuisine or URL: name, address, phone, website, cuisine, price, reviews, wishlists, opening hours and geo. Turn F&B venues into leads. Export to JSON, CSV or Excel.",
    "version": "0.1",
    "x-build-id": "DWzTP7Z12muiR84Dq"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapesage~burpple-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapesage-burpple-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/scrapesage~burpple-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapesage-burpple-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/scrapesage~burpple-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapesage-burpple-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": {
          "cuisines": {
            "title": "Cuisines / categories",
            "type": "array",
            "description": "Burpple category slugs to scrape, e.g. \"breakfast-and-brunch\", \"coffee\", \"ramen\", \"chicken-rice\", \"dim-sum\", \"bak-kut-teh\", \"halal\", \"fine-dining\", \"buffets\", \"bubble-tea\", \"desserts\", \"korean-bbq\", \"sushi\". See burpple.com/categories/sg for the full list. One per row.",
            "items": {
              "type": "string"
            }
          },
          "neighbourhoods": {
            "title": "Neighbourhoods (optional)",
            "type": "array",
            "description": "Singapore neighbourhood slugs to scrape every venue in, e.g. \"tiong-bahru\", \"bugis\", \"orchard\", \"holland-village\", \"tampines\", \"chinatown\". See burpple.com/neighbourhoods/sg for the full list. One per row.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search queries (optional)",
            "type": "array",
            "description": "Free-text food keywords (e.g. \"korean bbq\", \"mala\", \"brunch\"). Each is resolved to the matching Burpple category page. For best results use the exact category slugs in the Cuisines field above. One per row.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs (optional)",
            "type": "array",
            "description": "Direct Burpple URLs — a neighbourhood page, a category page, or a single venue page (e.g. https://www.burpple.com/tiong-bahru-bakery , https://www.burpple.com/categories/sg/cafes ). One per row.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max venues",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Cap on venue records across the whole run.",
            "default": 100
          },
          "includeVenueDetails": {
            "title": "Enrich with full venue details (phone, website, hours, geo, price)",
            "type": "boolean",
            "description": "Open each venue's Burpple page for the complete record: phone, website, full address, opening hours, geo-coordinates, price, cuisine tags, review & wishlist counts and images. One extra fast request per venue. Off = the fast, cheap listing record (name, slug, address, image).",
            "default": true
          },
          "includeReviews": {
            "title": "Include reviews",
            "type": "boolean",
            "description": "Also attach the most recent community reviews shown on each venue page (reviewer name, level, date, dish, text and photo). Requires venue details to be on. No extra request — reviews are read from the same venue page.",
            "default": false
          },
          "maxReviewsPerVenue": {
            "title": "Max reviews per venue",
            "minimum": 0,
            "maximum": 50,
            "type": "integer",
            "description": "How many recent reviews to keep per venue when 'Include reviews' is on.",
            "default": 5
          },
          "maxPagesPerSource": {
            "title": "Max pages per source",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many extra 'load more' pages to fetch per neighbourhood / category (each adds ~12 venues). Raise for deeper coverage of a single area or cuisine.",
            "default": 15
          },
          "deduplicate": {
            "title": "Deduplicate venues",
            "type": "boolean",
            "description": "Skip a venue already emitted earlier in the same run (common when one venue appears under several cuisines or neighbourhoods).",
            "default": true
          },
          "monitorMode": {
            "title": "Monitoring mode — only new venues",
            "type": "boolean",
            "description": "Remember which venues were already returned and emit ONLY venues not seen in previous runs. Pairs with Apify Schedules to track new restaurant & cafe openings over time (it does not conflict with Schedules — Schedules decide when to run, this decides what is new).",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitor store name",
            "type": "string",
            "description": "Named key-value store that holds the 'already seen' venue ids for monitoring mode. Use a different name per tracked area/cuisine to keep histories separate.",
            "default": "burpple-scraper-monitor"
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum parallel requests. Lower it if you see transient blocks; raise it for speed.",
            "default": 8
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy settings. Burpple is read over Apify Residential proxy (datacenter IPs are blocked), with automatic IP rotation; the default works well. Blocked requests retry automatically on a fresh IP.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}