Places API#
Search places#
GET /api/v1/places
Query parameters#
| Parameter | Type | Required | Description |
|---|---|---|---|
country |
string | yes | Dataset code of a country with published data: es (Spain), gb (United Kingdom), fr (France) or pt (Portugal). France and Portugal have partial initial coverage around twenty major cities and nearby lodging. |
city |
string | no | Lowercase city slug such as madrid, girona, or london. |
q |
string | no | Literal text match across names, city, and lodging categories; maximum 100 characters. |
lodgingType |
string | no | One lodging type. lodging is the catch-all and restricts nothing. |
whatsapp |
boolean | no | true selects records whose primary number appears WhatsApp-reachable. |
verified |
boolean | no | Select places whose Google listing is marked verified. |
limit |
integer | no | Records per page, from 1 to 100. Default: 25. |
cursor |
string | no | Opaque nextCursor from the preceding response. |
curl --get 'https://www.hotelovia.com/api/v1/places' \
--header "X-API-Key: $HOTELOVIA_API_KEY" \
--data-urlencode 'country=es' \
--data-urlencode 'city=girona' \
--data-urlencode 'lodgingType=campsite'
Place object#
| Field | Type | Meaning |
|---|---|---|
id |
string | Stable Hotelovia place identifier. |
name, legalName |
string or null | Published display and legal names. |
address |
object | street, city, state, postalCode, and two-letter country. |
location |
object or null | latitude and longitude. |
phone, phoneType |
string or null | Primary normalized number and mobile, landline, or other. |
additionalPhones |
array | Additional normalized phone records. |
email |
string or null | Published contact email. |
website, googleMapsUrl |
string or null | Validated public HTTP(S) URLs. |
primaryType, lodgingTypes |
string / array | Google's own category labels, in the country's language. |
lodgingType |
string | One lodging type key, derived from those labels. |
rating, reviewCount |
number or null | Google's rating and review count, not Hotelovia's. |
whatsappEligible |
boolean | Technical reachability signal; never consent. |
verified |
boolean | Whether the Google listing is marked verified. |
openingHours |
object or null | Published source day labels mapped to time ranges. |
profileUrl |
string | Canonical public Hotelovia profile. |
Fields with no published value remain null or an empty array; clients should
not invent data from neighboring fields.
Hotelovia is a directory, not a booking site. A place record carries no availability, no prices and no reservation, and Hotelovia neither rates nor inspects a place itself. Confirm anything that matters directly with the place.
Lodging types#
lodgingType is a language-neutral key. lodgingTypes and primaryType keep
Google's own labels, which arrive in the country's language, so the key is what
an integration should branch on.
| Key | Places it covers |
|---|---|
lodging |
The catch-all: a place to sleep with no narrower label. |
hotel |
Hotels, motels, paradores. |
guesthouse |
Hostales, pensiones, guest houses, posadas. |
hostel |
Hostels, albergues, mountain refuges. |
ruralHouse |
Casas rurales, agroturismo, farm stays. |
apartment |
Tourist apartments, aparthotels, serviced apartments. |
holidayHome |
Holiday homes, villas, chalets, bungalows, cabins. |
campsite |
Campsites and glamping. |
bedAndBreakfast |
Bed and breakfasts. |
resort |
Resorts, spa hotels, holiday villages. |
motorhomeArea |
Motorhome and RV areas. |
A place belongs to exactly one key: the most specific one its categories name.
Filtering by hotel therefore excludes an aparthotel and a spa resort, which
answer to apartment and resort.
Get one place#
GET /api/v1/places/{placeId}
URL-encode the id received from a search response:
const url = `https://www.hotelovia.com/api/v1/places/${encodeURIComponent(place.id)}`
const response = await fetch(url, {
headers: { 'X-API-Key': process.env.HOTELOVIA_API_KEY },
})
const { place } = await response.json()
The endpoint returns 404 when the id is unknown, suppressed, closed, or no
longer published.