{
  "openapi": "3.0.1",
  "info": {
    "title": "VRBO Scraper — Properties + Calendar + Full Reviews [$2.5💰]",
    "description": "VRBO all-in-one scraper — paste any property URL, bare ID, location, region, or coordinates and get property rows, the date-by-date availability calendar with per-night pricing, full rates breakdown, and the complete paginated review history. Pure HTTP, no login. $2.50/1k rows.",
    "version": "1.0",
    "x-build-id": "jsCMPp2d3pU8KfR5X"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~vrbo-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-vrbo-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/memo23~vrbo-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-vrbo-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/memo23~vrbo-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-vrbo-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",
        "required": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "VRBO inputs — URL, ID, location, region, coordinates, or reviews",
            "type": "array",
            "description": "Paste any combination of the six input forms below. The actor classifies each input automatically and dispatches to the right handler.\n\n**Examples:**\n- `https://www.vrbo.com/2165911` — full property URL → one property row\n- `2165911` — bare numeric ID → one property row (auto-prepends `https://www.vrbo.com/`)\n- `4193579ha` — VRBO-style ID with `ha` suffix → one property row\n- `2165911/reviews` or `4193579ha/reviews` — scrape **review rows** for the property\n- `Bali`, `New York`, `Tulum Mexico` — free-text **location search** → walks pagination + fans out to each property\n- `region:2554` — search by region ID\n- `-7.7956, 110.3695` — search by coordinates (lat, lon)\n- `https://www.vrbo.com/search/keywords:bali/` — full search URL → walks pagination\n\nNon-paying users are capped at 25 total rows.",
            "items": {
              "type": "string"
            }
          },
          "checkIn": {
            "title": "Check-in date",
            "type": "string",
            "description": "ISO date (YYYY-MM-DD). Reserved for the upcoming per-night rates + availability calendar feature. Leave empty to use a sensible default (tomorrow). Does not affect property or review scraping."
          },
          "checkOut": {
            "title": "Check-out date",
            "type": "string",
            "description": "ISO date (YYYY-MM-DD). Default: check-in + 30 days. Reserved for the upcoming per-night rates + availability calendar feature."
          },
          "adultsCount": {
            "title": "Adults (for rate calculation)",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Adult guest count used for rate calculation when the calendar feature is enabled. Default 2.",
            "default": 2
          },
          "scrapeAvailability": {
            "title": "Scrape minimum nights + availability calendar",
            "type": "boolean",
            "description": "When checked, **every property the actor visits** gets one extra GraphQL call to VRBO's date-selector endpoint, which populates:\n\n- `minimumNights` — the minimum number of nights required to book\n- `calendar[]` — per-date availability, nightly price, and per-date minimum stay (up to ~2 years / 730 days)\n- `calendarLength` — number of calendar days returned\n\nWithout this flag those fields stay empty (the property/detail endpoints don't carry stay constraints). **Cost:** ~1 extra request (~285 KB) per property. Default: off.",
            "default": false
          },
          "includeReviews": {
            "title": "Also scrape full review history for every property",
            "type": "boolean",
            "description": "When checked, **every property the actor visits** (direct URLs, bare IDs, AND properties discovered from a location/region/coordinates search) also produces paginated review rows — not just the property row.\n\nLeave **unchecked** to get only the property row. Use the `{id}/reviews` URL form (e.g. `2165911/reviews`) to grab reviews for a specific property without touching this flag.\n\n**Cost example:** a `Bali` search hitting 50 properties × `maxReviewsPerProperty=50` = **2,500 review rows ≈ $7.50** at $3.00/1k, plus 50 property rows ≈ $0.15. Always paired with `maxReviewsPerProperty` to cap the blowout.\n\nDefault: off.",
            "default": false
          },
          "maxReviewsPerProperty": {
            "title": "Max reviews per property",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Hard cap on review rows emitted **per property** when `includeReviews` is on (or when an input is in `{id}/reviews` form). VRBO publishes some properties with 500+ reviews; without a cap, one property can dominate your dataset and budget. The actor walks GraphQL pagination (25 reviews per request) until this cap is hit or VRBO returns an empty page. Default 50, max 1,000.",
            "default": 50
          },
          "maxItems": {
            "title": "Max items per source",
            "minimum": 1,
            "type": "integer",
            "description": "Soft cap on rows emitted per source input. Detail inputs always emit 1 row each. Search inputs walk pagination until this cap. Reviews inputs emit N review rows (one per review). Default 100. Non-paying users are capped at 25 total.",
            "default": 100
          },
          "maxConcurrency": {
            "title": "Max parallel requests",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "Parallel HTTP requests. VRBO is Akamai-protected — sweet spot 3–6 via residential proxies to avoid rate-limit retries.",
            "default": 4
          },
          "maxRequestRetries": {
            "title": "Max request retries",
            "minimum": 0,
            "type": "integer",
            "description": "Per-URL retry budget on 429/403 responses and proxy connection failures. The actor also rotates proxy sessions internally before falling back to a secondary pool, so this controls the higher-level retry budget on top of that.",
            "default": 6
          },
          "proxy": {
            "title": "Proxy configuration (optional override)",
            "type": "object",
            "description": "Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies."
          },
          "fallbackProxyUrl": {
            "title": "Fallback proxy URL (optional)",
            "type": "string",
            "description": "Optional secondary residential proxy URL (Evomi / Decodo / BrightData / your own) to try when the primary pool returns 429 after 3 retry attempts with rotated sessions. Format: `http://user:pass@host:port`. Leave empty unless you've burned through the default pool."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}