Skip to content
Vrbo

Vrbo quote

A Vrbo stay quote: nightly and total price, fees and payment model.

POST/v1/ota/vrbo
8 credits

The total is Vrbo's own figure and fees_included repeats its "All fees included" label; cleaning and service fees and taxes are not itemised by Vrbo for this request, so they are not invented here. A stay Vrbo will not sell as asked (minimum stay, dates taken) returns available: false with Vrbo's reason, billed like any other answer.

Request

POSThttps://api.scrapercompany.com/v1/ota/vrbo

Authenticate with your API key in the x-api-key header (see Authentication).

Body

JSON object. Unknown fields are rejected with 422.

  • property_idstring | nullpattern ^\d+$

    Numeric id returned by POST /v1/ota/vrbo/search (property_id on each listing). Not the id in the Vrbo URL.

  • listing_idstring | nullpattern ^\d+(?:ha)?$

    The listing id in a Vrbo URL, e.g. 20218736ha for vrbo.com/20218736ha. Resolved to property_id with one page load.

  • check_instring (date)required

    First night of the stay, YYYY-MM-DD.

  • check_outstring (date) | null

    Departure date. An alternative to nights — if both are given, this wins.

  • nightsintegerdefault 1min 1, max 28

    Length of stay. Ignored when check_out is supplied.

  • adultsintegerdefault 2min 1, max 16

    Guests (adults).

  • marketstringdefault US

    Vrbo point-of-sale. Only US (www.vrbo.com, USD) is verified.

    One ofUS

Example request

curl -X POST "https://api.scrapercompany.com/v1/ota/vrbo" \
  -H "x-api-key: $SCRAPERCOMPANY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "property_id": "122942416",
    "check_in": "2026-11-30",
    "nights": 3,
    "adults": 2
  }'

Response

200 — A Vrbo stay quote. `fees_included` repeats Vrbo's own label; fees and taxes are not itemised. Metered responses carry x-credits-charged and x-credits-remaining headers (see credit headers).

200 response
{
  "search_parameters": {
    "engine": "vrbo_property",
    "property_id": "122942416",
    "check_in_date": "2029-04-10",
    "check_out_date": "2029-04-13",
    "adults": 2,
    "market": "US",
    "currency": "USD"
  },
  "property": {
    "property_id": "122942416",
    "total": 1386,
    "price_per_night": 462,
    "basis": "cheapest_offer",
    "total_text": "$1,386 for 3 nights",
    "nightly_text": "$462",
    "fees_included": true,
    "currency": "USD",
    "currency_verified": true,
    "available": true,
    "payment_model": "PAY_LATER_WITH_DEPOSIT",
    "provenance": {
      "schema_version": 1,
      "observation_id": "rateobs_0123456789abcdef0123456789abcdef",
      "collection_id": "ratecol_0123456789abcdef0123456789abcdef",
      "observed_at": "2026-08-07T01:23:45.678Z",
      "source": "vrbo",
      "source_kind": "ota_offer",
      "collector": "scrapingme.ota.vrbo",
      "source_property_id": "122942416",
      "requested_market": "US",
      "requested_currency": "USD",
      "returned_currency": "USD",
      "egress_mode": "direct",
      "price_basis": "stay_headline",
      "derivation": "upstream"
    }
  },
  "offers": [
    {
      "plan_id": "0000f7528ddb0787463c9be9506a3b5eceb0",
      "room_type_id": "122942416",
      "total": 1386,
      "nightly": 462,
      "currency": "USD",
      "total_text": "$1,386 for 3 nights",
      "nightly_text": "$462",
      "fees_included": true,
      "payment_model": "PAY_LATER_WITH_DEPOSIT",
      "hotel_collect": true,
      "member_only": false,
      "inventory_type": "VRBO",
      "business_model": "HOTEL_COLLECT",
      "messages": [
        "Reserve now, pay deposit",
        "Your dates are available"
      ],
      "provenance": {
        "schema_version": 1,
        "observation_id": "rateobs_0123456789abcdef0123456789abcdef",
        "collection_id": "ratecol_0123456789abcdef0123456789abcdef",
        "observed_at": "2026-08-07T01:23:45.678Z",
        "source": "vrbo",
        "source_kind": "ota_rate_plan",
        "collector": "scrapingme.ota.vrbo",
        "source_property_id": "122942416",
        "requested_market": "US",
        "requested_currency": "USD",
        "returned_currency": "USD",
        "egress_mode": "direct",
        "price_basis": "stay_total_fees_included",
        "derivation": "upstream",
        "upstream_rate_id": "0000f7528ddb0787463c9be9506a3b5eceb0"
      }
    }
  ],
  "meta": {
    "source": "vrbo",
    "nights": 3,
    "wire_bytes": 8065,
    "listing_resolved": false,
    "elapsed_s": 0.44,
    "egress_mode": "direct",
    "collection_id": "ratecol_0123456789abcdef0123456789abcdef",
    "observed_at": "2026-08-07T01:23:45.678Z"
  }
}

Response fields

Fields marked required are always present; others appear when they apply.

  • search_parametersobjectrequired
    Show 8 child fields
    • search_parameters.enginestringrequired

      One ofvrbo_property

    • search_parameters.property_idstringrequired

      The property id quoted (resolved from listing_id when only that was sent).

    • search_parameters.listing_idstring

      Present only when listing_id was supplied.

    • search_parameters.check_in_datestring (date)required
    • search_parameters.check_out_datestring (date)required
    • search_parameters.adultsintegerrequired
    • search_parameters.marketstringrequired

      US.

    • search_parameters.currencystringrequired

      The market's currency (USD).

  • propertyobjectrequired
    Show 15 child fields
    • property.property_idstringrequired

      Numeric Vrbo property id; store it to skip listing resolution next time.

    • property.listing_idstring | nullrequired

      The listing_id you sent, echoed; null when you sent only property_id. When both are sent, property_id is used and the two are not cross-checked.

    • property.totalnumber | nullrequired

      Headline stay total for all nights (Vrbo's own figure); see basis. Null when nothing priced.

    • property.price_per_nightnumber | nullrequired

      Headline nightly price.

    • property.basisstring | nullrequired

      Where the headline comes from: sticky_bar (the page's own headline price, read by its labels) or cheapest_offer (the cheapest priced offer). Null when nothing priced.

      One ofsticky_barcheapest_offer

    • property.total_textstringrequired

      Headline total as displayed; empty when not shown.

    • property.nightly_textstringrequired

      Headline nightly price as displayed; empty when not shown.

    • property.taxes_and_fees_includedboolean | nullrequired

      True when the headline total is labelled "with taxes and fees"; null when no such label was shown.

    • property.fees_includedboolean | nullrequired

      True when the headline total is labelled "All fees included"; null when no such label was shown.

    • property.currencystringrequired

      Currency the point-of-sale actually priced in.

    • property.currency_verifiedbooleanrequired

      Whether currency equals the market's currency.

    • property.availablebooleanrequired

      False when Vrbo will not sell the stay as asked.

    • property.unavailable_reasonstring | nullrequired

      Vrbo's own message when the stay cannot be booked (minimum stay, dates taken). Null otherwise; available can be false with a null reason when nothing priced.

    • property.payment_modelstring | nullrequired

      payment_model of the cheapest offer; null when nothing priced.

      One ofPAY_NOWPAY_LATERPAY_LATER_WITH_DEPOSIT

    • property.provenanceobjectrequired

      Where, when and how one normalized price was observed.

      Show 15 child fields
      • property.provenance.schema_versionintegerrequired

        Provenance schema version (currently 1).

      • property.provenance.observation_idstringrequired

        Deterministic id of this price observation (rateobs_...).

      • property.provenance.collection_idstringrequired

        Id shared by every price from one upstream fetch (ratecol_...).

      • property.provenance.observed_atstringrequired

        UTC observation time, ISO-8601.

      • property.provenance.sourcestringrequired

        Upstream source, e.g. google_hotels_calendar.

      • property.provenance.source_kindstringrequired

        Kind of source, e.g. calendar, offer, ota_calendar, official.

      • property.provenance.collectorstringrequired

        Identifier of the collector that produced the price.

      • property.provenance.source_property_idstringrequired

        Property identifier at the source.

      • property.provenance.requested_marketstring | nullrequired
      • property.provenance.requested_currencystring | nullrequired
      • property.provenance.returned_currencystring | nullrequired
      • property.provenance.egress_modestringrequired

        How the request reached the source, e.g. direct.

      • property.provenance.price_basisstringrequired

        What the price represents, e.g. room_base_before_taxes_and_fees.

      • property.provenance.derivationstringrequired

        How the figure was derived, e.g. normalized_upstream.

      • property.provenance.upstream_rate_idstring | nullrequired

        Source-native rate/room id when available.

  • offersarray of objectrequired

    Every rate plan for the rental.

    Show 23 child fields
    • offers[].plan_idstringrequired

      Vrbo rate-plan id.

    • offers[].room_type_idstringrequired
    • offers[].totalnumber | nullrequired

      Stay total for all nights, Vrbo's own figure; fees_included repeats its "All fees included" label. Cleaning and service fees and taxes are not itemised.

    • offers[].nightlynumber | nullrequired

      Vrbo's nightly price.

    • offers[].taxes_and_feesnumber | nullrequired

      Derived, not read from the source: total - nightly × nights, set only when taxes_and_fees_included is true. Accurate to within nights currency units because nightly is rounded; taxes and fees are not itemised. See taxes_and_fees_provenance.

    • offers[].currencystringrequired

      ISO 4217 code read back from the reply.

    • offers[].total_textstringrequired

      Total as displayed, e.g. $635 total.

    • offers[].nightly_textstringrequired

      Nightly price as displayed, e.g. $509 nightly.

    • offers[].taxes_and_fees_includedboolean | nullrequired

      True when the source labels the total "Total with taxes and fees". Null means no such label was shown, not that taxes are excluded.

    • offers[].fees_includedboolean | nullrequired

      True when the source labels the total "All fees included". Null means no such label was shown.

    • offers[].payment_modelstringrequired

      PAY_NOW, PAY_LATER or PAY_LATER_WITH_DEPOSIT; empty when not stated. A plan sold both ways is two offers.

      One ofPAY_NOWPAY_LATERPAY_LATER_WITH_DEPOSIT

    • offers[].hotel_collectboolean | nullrequired

      True when the property collects payment; null when not stated.

    • offers[].member_onlybooleanrequired

      True when booking the plan requires signing in as a member.

    • offers[].refundableboolean | nullrequired

      Always null on Vrbo: refundability is not read, rather than guessed.

    • offers[].cancellation_textstringrequired

      Always empty on Vrbo.

    • offers[].extrasstring | nullrequired

      Always null on Vrbo.

    • offers[].extras_textstringrequired

      Always empty on Vrbo.

    • offers[].strikeout_textstringrequired

      Struck-through comparison price as displayed; empty when none.

    • offers[].inventory_typestringrequired

      Source inventory type, e.g. MERCHANT, TRIPCOM, DIRECT_AGENCY, VRBO; empty when not stated.

    • offers[].business_modelstringrequired

      EXPEDIA_COLLECT or HOTEL_COLLECT; empty when not stated.

    • offers[].messagesarray of stringrequired

      Vrbo's highlighted messages for the plan, e.g. Reserve now, pay deposit, Your dates are available.

    • offers[].provenanceobjectrequired

      Where, when and how one normalized price was observed.

      Show 15 child fields
      • offers[].provenance.schema_versionintegerrequired

        Provenance schema version (currently 1).

      • offers[].provenance.observation_idstringrequired

        Deterministic id of this price observation (rateobs_...).

      • offers[].provenance.collection_idstringrequired

        Id shared by every price from one upstream fetch (ratecol_...).

      • offers[].provenance.observed_atstringrequired

        UTC observation time, ISO-8601.

      • offers[].provenance.sourcestringrequired

        Upstream source, e.g. google_hotels_calendar.

      • offers[].provenance.source_kindstringrequired

        Kind of source, e.g. calendar, offer, ota_calendar, official.

      • offers[].provenance.collectorstringrequired

        Identifier of the collector that produced the price.

      • offers[].provenance.source_property_idstringrequired

        Property identifier at the source.

      • offers[].provenance.requested_marketstring | nullrequired
      • offers[].provenance.requested_currencystring | nullrequired
      • offers[].provenance.returned_currencystring | nullrequired
      • offers[].provenance.egress_modestringrequired

        How the request reached the source, e.g. direct.

      • offers[].provenance.price_basisstringrequired

        What the price represents, e.g. room_base_before_taxes_and_fees.

      • offers[].provenance.derivationstringrequired

        How the figure was derived, e.g. normalized_upstream.

      • offers[].provenance.upstream_rate_idstring | nullrequired

        Source-native rate/room id when available.

    • offers[].taxes_and_fees_provenanceobject | nullrequired

      Provenance of taxes_and_fees (price_basis: taxes_and_fees_combined, derivation: total_minus_nightly_times_nights); null when taxes_and_fees is null.

      Show 15 child fields
      • offers[].taxes_and_fees_provenance.schema_versionintegerrequired

        Provenance schema version (currently 1).

      • offers[].taxes_and_fees_provenance.observation_idstringrequired

        Deterministic id of this price observation (rateobs_...).

      • offers[].taxes_and_fees_provenance.collection_idstringrequired

        Id shared by every price from one upstream fetch (ratecol_...).

      • offers[].taxes_and_fees_provenance.observed_atstringrequired

        UTC observation time, ISO-8601.

      • offers[].taxes_and_fees_provenance.sourcestringrequired

        Upstream source, e.g. google_hotels_calendar.

      • offers[].taxes_and_fees_provenance.source_kindstringrequired

        Kind of source, e.g. calendar, offer, ota_calendar, official.

      • offers[].taxes_and_fees_provenance.collectorstringrequired

        Identifier of the collector that produced the price.

      • offers[].taxes_and_fees_provenance.source_property_idstringrequired

        Property identifier at the source.

      • offers[].taxes_and_fees_provenance.requested_marketstring | nullrequired
      • offers[].taxes_and_fees_provenance.requested_currencystring | nullrequired
      • offers[].taxes_and_fees_provenance.returned_currencystring | nullrequired
      • offers[].taxes_and_fees_provenance.egress_modestringrequired

        How the request reached the source, e.g. direct.

      • offers[].taxes_and_fees_provenance.price_basisstringrequired

        What the price represents, e.g. room_base_before_taxes_and_fees.

      • offers[].taxes_and_fees_provenance.derivationstringrequired

        How the figure was derived, e.g. normalized_upstream.

      • offers[].taxes_and_fees_provenance.upstream_rate_idstring | nullrequired

        Source-native rate/room id when available.

  • metaobjectrequired
    Show 8 child fields
    • meta.sourcestringrequired

      One ofvrbo

    • meta.collection_idstringrequired
    • meta.observed_atstringrequired
    • meta.nightsintegerrequired
    • meta.wire_bytesintegerrequired

      Bytes received from the source, including the listing page when listing_id was resolved.

    • meta.elapsed_snumberrequired
    • meta.egress_modestringrequired

      How the request was routed: direct or proxy.

      One ofdirectproxy

    • meta.listing_resolvedbooleanrequired

      True when listing_id was resolved to property_id in this call.

Errors

Errors return a JSON body with a detail field. Failed requests are not charged. See Errors for the full list and retry advice.

StatusMeaningRetry?
401Unauthorized

Missing or invalid API key.

{"detail":"missing or invalid API key"}
No, fix the request
402Payment Required

Not enough credits for this request. Only returned once credit enforcement is switched on; during the beta metering runs in shadow mode and never blocks.

{"detail":"insufficient credits: this request costs 5, 0 available. Credits renew 2026-11-01."}
No, fix the request
404Not Found

The property, stay, job or record was not found.

{"detail":"job not found"}
No, fix the request
422Unprocessable Content

Request validation failed. detail is a list of problems for schema errors, or a string for semantic checks performed by the endpoint.

{"detail":[{"loc":["body","name"],"msg":"Field required","type":"missing"}]}
No, fix the request
429Too Many Requests

Too many requests: the key's requests-per-minute limit was exceeded, or (once credit enforcement is on) the plan's concurrent-request limit. No rate-limit or Retry-After headers are sent; back off and retry.

{"detail":"rate limit 60/min exceeded"}
Yes, with backoff
502Bad Gateway

The upstream source failed, blocked the request or returned an unusable answer. Safe to retry later; failed requests are not charged.

{"detail":"RuntimeError"}
Yes, with backoff
503Service Unavailable

Temporarily unavailable: a dependency of this endpoint is down, or the upstream source changed its contract. Retry later.

{"detail":"database unavailable: OperationalError"}
Yes, with backoff

Try it

  1. Export your key: export SCRAPERCOMPANY_API_KEY=sk_... (no key yet? request access).
  2. Copy the cURL example above and run it in a terminal.
  3. Or open the interactive playground on api.scrapercompany.com, paste your key and pick this endpoint.

Credits

8 credits per successful call. Failed, blocked and empty results are free. Credit metering is in beta and does not block requests yet.