Prebook rate from search step

Prebook rate from search step

πŸ†•
The Sandbox environment is available exclusively to new partners who begin their integration in Q4 2025.
This call is available to only certified partners who don’t use the Retrieve hotelpage call in their flow.
https://api-sandbox.worldota.net/api/b2b/v3/serp/prebook/
ℹ️

The call checks if the requested rate is still available before it can be booked and improves the booking success rate:

  • When the original rate is not available, the system searches only for alternative rates of the same room type and board type (e.g., switching between refundable and non-refundable conditions within the price_increase_percent limit). The search does not extend to different room types or board types. If an alternative rate is found, new book_hash and match_hash values are returned.
  • In cases where the same rate cannot be found and a price increase is permitted via the price_increase_percent field. The call will attempt to find the same room and board type at an increased price, but not exceeding the allowed percentage. The value in the payment_options field may change.
ℹ️

The limitations:

  • The recommended call timeout is 60 seconds.
  • The minimum call timeout is 30 seconds.

Sandbox limitations

⚠️
Use all field values and API keys obtained from the sandbox environment only within the sandbox. Don’t mix them with test or production environments.

Response

  • hotels.rates. The maximum items’ number is 5.
  • Not supported fields:
    • hotels.rates.payment_options.payment_types.cancellation_penalties.policies.commission_info.charge.amount_gross.
    • hotels.rates.payment_options.payment_types.cancellation_penalties.policies.commission_info.charge.amount_commission.

Errors

  • Not supported errors:
    • no_available_rates.
    • unknown.

Request example

curl --user '<KEY_ID>:<API_KEY>' 'https://api-sandbox.worldota.net/api/b2b/v3/serp/prebook/' \
--header 'Content-Type: application/json' \
--data '{
  "hash": "sr-d27e97a3-249e-4e40-893f-5bdef51f41eb",
  "price_increase_percent": 20
}'

Request body

Response

Response example

{
  "data": {
    "hotels": [
      {
        "id": "stidio_muzeinaya_apartment",
        "hid": 6838886,
        "rates": [
          {
            "book_hash": "p-d27e97a3-249e-4e40-893f-5bdef51f41eb",
            "match_hash": "m-bc4f2153-0547-5fc9-9255-d45fd8ce016c",
            "daily_prices": [
              "92.59"
            ],
            "meal": "nomeal",
            "meal_data": {
              "value": "nomeal",
              "has_breakfast": false,
              "no_child_meal": true
            },
            "payment_options": {
              "payment_types": [
                {
                  "amount": "108.00",
                  "show_amount": "92.59",
                  "currency_code": "USD",
                  "show_currency_code": "EUR",
                  "by": null,
                  "is_need_credit_card_data": false,
                  "is_need_cvc": false,
                  "type": "deposit",
                  "vat_data": {
                    "included": false,
                    "applied": false,
                    "amount": "0.00",
                    "currency_code": "USD",
                    "value": "0.00"
                  },
                  "tax_data": {},
                  "perks": {},
                  "commission_info": {
                    "show": {
                      "amount_gross": "92.59",
                      "amount_net": "92.59",
                      "amount_commission": "0.00"
                    },
                    "charge": {
                      "amount_gross": "108.00",
                      "amount_net": "108.00",
                      "amount_commission": "0.00"
                    }
                  },
                  "cancellation_penalties": {
                    "policies": [
                      {
                        "start_at": null,
                        "end_at": null,
                        "amount_charge": "108.00",
                        "amount_show": "92.59",
                        "commission_info": {
                          "show": {
                            "amount_gross": "102.88",
                            "amount_net": "92.59",
                            "amount_commission": "10.29"
                          },
                          "charge": {
                            "amount_gross": "120.00",
                            "amount_net": "108.00",
                            "amount_commission": "12.00"
                          }
                        }
                      }
                    ],
                    "free_cancellation_before": null
                  },
                  "recommended_price": null
                }
              ]
            },
            "bar_rate_price_data": null,
            "rg_ext": {
              "class": 6,
              "quality": 0,
              "sex": 0,
              "bathroom": 2,
              "bedding": 3,
              "family": 0,
              "capacity": 2,
              "club": 0,
              "bedrooms": 0,
              "balcony": 0,
              "view": 0,
              "floor": 0
            },
            "room_name": "Double Apartment",
            "room_name_info": null,
            "serp_filters": [
              "has_bathroom"
            ],
            "sell_price_limits": null,
            "allotment": 2,
            "amenities_data": [
              "private-bathroom"
            ],
            "any_residency": true,
            "deposit": null,
            "no_show": {
              "amount": "0.00",
              "currency_code": "USD",
              "from_time": "00:00:00"
            },
            "room_data_trans": null,
            "legal_info": null
          }
        ],
        "bar_price_data": null
      }
    ],
    "changes": {
      "price_changed": false
    }
  },
  "debug": {
    "api_endpoint": {
      "endpoint": "api/b2b/v3/serp/prebook",
      "is_active": true,
      "is_limited": true,
      "remaining": 99,
      "requests_number": 100,
      "reset": "2025-09-17T08:37:20",
      "seconds_number": 10
    },
    "request": {
      "hash": "sr-d27e97a3-249e-4e40-893f-5bdef51f41eb",
      "price_increase_percent": 20
    },
    "method": "POST",
    "real_ip": "10.96.90.22",
    "request_id": "536cc60b9dda26ba13765893817fc30d",
    "key_id": 8,
    "api_key_id": 8,
    "utcnow": "2025-09-17T08:37:15.456850"
  },
  "status": "ok",
  "error": null
}

Errors

The error field has the value specified in the headers below.

no_available_rates

⚠️
The error isn’t supported yet.

The rate with the price_increase_percent field value isn’t found. Try to change the value.

rate_not_found

  • The rate with the hash field value isn’t found.
  • The hash field value has expired.

Send another search request and change the hash field value.

invalid_params

  • The hash field is required.
  • The hash field value is incorrect.
  • The price_increase_percent field value is less than 0.

prebook_from_serp_disabled

There is no permission to use this call for this contract. Contact the API support team.

contract_mismatch

The pre-book contract differs from the rate contract. They should be the same.

timeout, unknown, and 5xx

If you get errors timeout, unknown, or the 5Ρ…Ρ… status code from this call:

  • Make another request with a new partner_order_id.
  • The number of calls should be limited to 10.
  • If you get this error more than 10 times in a row, the issue is probably in automatically changed settings of your contract. Contact your account manager to resolve the issue. Otherwise, the ETG has temporary technical issues.