Imovirtual property search
Homes, land and commercial property for sale and rent in Portugal on Imovirtual with the site's filters: place, transaction, property type, price, area, price per m², rooms, build year, plot area, days since listed, radius, floors, extras, building type, advertiser type (private, agency, developer), new or resale, keywords, plus sort. Each result has id, link, title, property type, transaction, price, price per m², area, rooms, floor, street and place (district, council, parish), dates, promoted and exclusive flags, advertiser type, the agency or developer (name, type, page, logo; a private owner's name is left out), development details and photos. Pass next_page back as page; null on the last page.
Every response includes credits_used: the credits this call cost.
Parameters
| name | type | description |
|---|---|---|
location | string | Place path as in imovirtual.com links: a district (lisboa, porto, faro), a council (lisboa/cascais) or a parish path; default all of Portugal. Example: lisboa |
url | string | Or an imovirtual.com/pt/resultados/... search link (its filters are used as they are). |
transaction | sale | rent | Buy or rent. Example: sale |
estate | flat | house | room | plot | commercial | warehouse | garage | development | Property type. Example: flat |
price_min | number | Minimum price (EUR). |
price_max | number | Maximum price (EUR). |
area_min | number | Minimum area (m²). |
area_max | number | Maximum area (m²). |
price_m2_min | number | Minimum price per m². |
price_m2_max | number | Maximum price per m². |
rooms | string | Rooms (T0..T10), comma list of numbers; 11 = more. |
build_year_min | integer | Built from year. |
build_year_max | integer | Built up to year. |
plot_area_min | number | Minimum plot area (m²). |
plot_area_max | number | Maximum plot area (m²). |
days_since_created | integer | Listed in the last N days (1, 3, 7, 14, 30). |
radius_km | number | Extra distance around the place (km). |
floors | string | Floors, comma list as on the site (GROUND, FIRST, ... HIGHER_10, GARRET). |
extras | string | Extras, comma list as on the site (BALCONY, TERRACE, GARAGE, LIFT, POOL, GARDEN, AIR_CONDITIONING...). |
building_type | string | Building types, comma list as on the site (BLOCK, DETACHED, TERRACED...). |
owner_type | all | private | agency | developer | Advertiser type. |
market | all | primary | secondary | New (primary) or resale (secondary). |
keywords | string | Words in the description. |
sort | relevance | newest | price_asc | price_desc | area_asc | area_desc | price_m2_asc | price_m2_desc | Sort order. Example: relevance |
limit | 24 | 36 | 48 | 72 | Results per page. |
page | integer | Result page (1 = first). Example: 1 |
Every endpoint also takes fresh, raw, fields (see lean responses and caching).
Example
curl "https://api.api.sh/imovirtual/v1/search?location=lisboa" \
-H "x-api-key: $APISH_KEY" import os, requests
res = requests.get(
"https://api.api.sh/imovirtual/v1/search",
params={"location": "lisboa"},
headers={"x-api-key": os.environ["APISH_KEY"]},
timeout=120,
)
res.raise_for_status()
data = res.json() const url = new URL("https://api.api.sh/imovirtual/v1/search");
url.searchParams.set("location", "lisboa");
const res = await fetch(url, { headers: { "x-api-key": process.env.APISH_KEY } });
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json(); Response
A JSON object with the fields described above, plus raw (the source's own data), cached, fetched_at and credits_used. Errors return {"success": false, "error": "…"} with the HTTP status (see errors). A lookup that ran but found nothing (404) costs the price above; refused calls and errors on our side are free (what's charged).