{
  "openapi": "3.0.1",
  "info": {
    "title": "Tock Scraper [$3/1K💰] | Restaurant Venues | Availability",
    "description": "Extract restaurant, bar and venue data from Tock (exploretock.com) — name, city, cuisine, price tier, experience and offer counts, bookable dates and reservation availability — as structured JSON. Built for dining market research, availability monitoring and F&B lead generation. $3 per 1,000 venues.",
    "version": "0.8",
    "x-build-id": "9KMvPZEYQ9BaVfixP"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/ahmed_jasarevic~exploretock-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-ahmed_jasarevic-exploretock-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/ahmed_jasarevic~exploretock-scraper/runs": {
      "post": {
        "operationId": "runs-sync-ahmed_jasarevic-exploretock-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/ahmed_jasarevic~exploretock-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-ahmed_jasarevic-exploretock-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": {
          "scrapeMode": {
            "title": "What do you want to scrape?",
            "enum": [
              "venues",
              "availability"
            ],
            "type": "string",
            "description": "Venue profiles: full venue data, experiences, prices, and optional availability. Availability search: venues with bookable slots for one date, time, and party size.",
            "default": "venues"
          },
          "citySlugs": {
            "title": "City slugs",
            "type": "array",
            "description": "Tock metro slugs, e.g. chicago, new-york-city, portland, san-francisco. Venue mode discovers venues from each city page; availability mode runs one search per city.",
            "items": {
              "type": "string"
            }
          },
          "venueSlugs": {
            "title": "Direct venue slugs or URLs",
            "type": "array",
            "description": "Venue mode only. Direct venue slugs (e.g. alinea) or exploretock.com venue URLs. These are scraped in addition to city discovery. Availability mode ignores this field.",
            "items": {
              "type": "string"
            }
          },
          "date": {
            "title": "Date",
            "type": "string",
            "description": "Availability mode only. Reservation date in YYYY-MM-DD format. Leave empty for today's UTC date. Tock returns slots in a window around the chosen time, not the whole day.",
            "default": ""
          },
          "partySize": {
            "title": "Party size",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Availability mode only. Number of guests per reservation.",
            "default": 2
          },
          "time": {
            "title": "Preferred time",
            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
            "type": "string",
            "description": "Availability mode only. 24-hour HH:mm, e.g. 19:00. Tock returns slots in a window around this time.",
            "default": "19:00"
          },
          "searchType": {
            "title": "Availability category",
            "enum": [
              "DINE_IN_EXPERIENCES",
              "DINE_IN"
            ],
            "type": "string",
            "description": "Dine-in + experiences is the default and returns restaurants, bars, wineries, and bookable experiences. Dine-in only restricts the search to standard reservations.",
            "default": "DINE_IN_EXPERIENCES"
          },
          "fetchMode": {
            "title": "Fetch mode",
            "enum": [
              "browser",
              "http"
            ],
            "type": "string",
            "description": "Headful Chrome clears the Cloudflare challenge once, then fetches server-rendered pages directly inside the browser (recommended, fast and reliable). HTTP only skips the browser and uses curl-impersonate; it starts faster but Cloudflare blocks more requests.",
            "default": "browser"
          },
          "maxVenues": {
            "title": "Max results per run",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Venue mode: maximum venue detail pages. Availability mode: maximum availability rows. Free users are capped at 10.",
            "default": 25
          },
          "maxRequestsPerCrawl": {
            "title": "Max HTTP requests",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Hard cap on HTTP requests. Venue mode counts city discovery plus venue pages; availability mode counts one search per city.",
            "default": 200
          },
          "maxConcurrency": {
            "title": "Parallel workers",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "HTTP fallback only. With a proxy, each worker gets one sticky proxy IP and cookie jar and rotates to a fresh IP when challenged. Browser mode always uses one Chrome tab and serialized in-page fetches.",
            "default": 5
          },
          "requestDelayMs": {
            "title": "Delay between requests",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Pause before each request inside a session. Lower is faster but may increase Cloudflare challenges; challenged requests automatically rotate to a fresh proxy IP. 0 disables the extra delay.",
            "default": 250
          },
          "retryCooldownSecs": {
            "title": "Retry cooldown",
            "minimum": 0,
            "maximum": 120,
            "type": "integer",
            "description": "How long to wait before the final retry pass for pages that are still blocked after an automatic proxy IP rotation. Short cooldowns are usually enough because blocked workers already switched IPs.",
            "default": 5
          },
          "includeAvailability": {
            "title": "Include experiences and availability",
            "type": "boolean",
            "description": "Venue mode only. Include experiences with prices and party-size limits, plus the venue's open dates and time slots. Availability mode always returns offers and slots.",
            "default": true
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Tock uses Cloudflare. Browser mode clears the challenge on the platform IP; a residential proxy adds a clean sticky IP and automatic browser-level rotation if that IP gets blocked. Without a proxy, a hard-blocked platform IP cannot be rotated."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}