{
  "openapi": "3.0.1",
  "info": {
    "title": "VRBO Vacation Rentals [$2.5💰] Scraper",
    "description": "[💰$2.5/1K] VRBO vacation-rentals scraper — paste any VRBO property URL and get one structured row: title, price/night, bedrooms, sleeps, lat/lng, photos, amenities, host. Pure HTTP via Apify Residential, no auth required. Same Expedia Group backend as memo23/expedia-scraper.",
    "version": "1.0",
    "x-build-id": "EUKyCa46pvcpfunWK"
  },
  "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
          },
          "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",
            "type": "object",
            "description": "Residential proxies are required — VRBO blocks datacenter IPs. Leave the default unless you have a specific reason to change.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          },
          "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}