REAL ESTATE · POLAND, PORTUGAL
OLX-Group Real-Estate (PL/PT)
Real-estate listings from OLX Group portals: Otodom (Poland) and Imovirtual (Portugal).
About this data
Real-estate listings from OLX Group portals: Otodom (Poland) and Imovirtual (Portugal). Filter by country, buy or rent, property type and location. One normalized record: price, area, rooms, extras, images, listing URL. On-demand scrape — fresh listings every run.
From the actor’s Apify Store listing. The per-call endpoint may return a bounded subset; its own description is below.
Buy per call over x402
2 endpoints at api.ssh.autos. Each call is one JSON POST, paid in USDC with no account or API key, and answered in the same HTTP response.
Otodom Poland Property
POST /v1/pl/otodom/listings
Live Otodom Poland apartment or house listings for sale or rent, for a supported location or the whole country: listing ID, price in PLN, area in m2, rooms, address, location, property type, images and listing URL.
First results page only, up to 20 listings, without detail enrichment.
Input
Send a JSON body to POST https://api.ssh.autos/v1/pl/otodom/listings.
| Field | Type | Required | Notes |
|---|---|---|---|
location | string | optional | up to 80 characters |
operation | string | optional | one of buy, rent; default "buy" |
propertyType | string | optional | one of apartments, houses; default "apartments" |
maxResults | integer | optional | 1–20; default 10 |
Returned fields
The answer is JSON: records, a list of up to 20, and summary, the run status and counts. Each record has these 20 fields; a field the source does not publish comes back null.
20 fields per record
| Field | Type | Notes |
|---|---|---|
id | string | Portal's listing id from the {slug}-ID{id} URL grammar. |
listingKey | string | Composite unique key: source:id (e.g. otodom.pl:4dQ8b1). |
url | string | Canonical listing URL on the portal (otodom.pl /pl/oferta/... or imovirtual.com /pt/anuncio/...), tracking query parameters removed. |
name | string | Listing title from the JSON-LD Accommodation (null on card-fallback records without a heading). |
price | number | Advertised price amount from the JSON-LD Offer (or the card); null when the listing shows no price. |
currency | string | Currency of price: PLN on otodom, EUR on imovirtual; null when no price. |
areaM2 | number | Floor area in m² from the JSON-LD floorSize QuantitativeValue (or the card). |
rooms | integer | Number of rooms from the JSON-LD numberOfRooms (or the card). |
bedrooms | integer | Number of bedrooms from the JSON-LD numberOfBedrooms. |
bathrooms | integer | Number of bathrooms from the JSON-LD numberOfBathroomsTotal. |
address | string | Location line composed from the JSON-LD postal address (streetAddress, addressLocality, addressRegion, postalCode). |
imageUrl | string | Primary listing image URL (OLX CDN, ireland.apollo.olxcdn.com); null when the listing carries no image. |
images | array of strings | Listing image URLs, deduplicated. |
operation | string | Requested operation: 'buy' or 'rent'. |
propertyType | string | Requested property type: 'apartments' or 'houses'. |
location | string | Location scope stamped on the record; the portal's default when no location was requested. |
portal | string | Portal slug the record came from ('otodom' or 'imovirtual'). |
country | string | Portal country: PL or PT. |
source | string | Source website hostname (otodom.pl or imovirtual.com). |
collectedAt | string | UTC ISO-8601 collection timestamp. |
Example call
npx agentcash@latest fetch https://api.ssh.autos/v1/pl/otodom/listings -m POST -b '{"maxResults": 3}'
The example values come from the API spec or the actor’s own sample input. Running it is a paid call.
Imovirtual Portugal Property
POST /v1/pt/imovirtual/listings
Live Imovirtual Portugal apartment or house listings for sale or rent in Lisbon: listing ID, price in EUR, area in m2, rooms, address, location, property type, images and listing URL.
First results page only, up to 20 listings, without detail enrichment.
Input
Send a JSON body to POST https://api.ssh.autos/v1/pt/imovirtual/listings.
| Field | Type | Required | Notes |
|---|---|---|---|
location | string | optional | up to 80 characters |
operation | string | optional | one of buy, rent; default "buy" |
propertyType | string | optional | one of apartments, houses; default "apartments" |
maxResults | integer | optional | 1–20; default 10 |
Returned fields
The answer is JSON: records, a list of up to 20, and summary, the run status and counts. Each record has these 20 fields; a field the source does not publish comes back null.
20 fields per record
| Field | Type | Notes |
|---|---|---|
id | string | Portal's listing id from the {slug}-ID{id} URL grammar. |
listingKey | string | Composite unique key: source:id (e.g. otodom.pl:4dQ8b1). |
url | string | Canonical listing URL on the portal (otodom.pl /pl/oferta/... or imovirtual.com /pt/anuncio/...), tracking query parameters removed. |
name | string | Listing title from the JSON-LD Accommodation (null on card-fallback records without a heading). |
price | number | Advertised price amount from the JSON-LD Offer (or the card); null when the listing shows no price. |
currency | string | Currency of price: PLN on otodom, EUR on imovirtual; null when no price. |
areaM2 | number | Floor area in m² from the JSON-LD floorSize QuantitativeValue (or the card). |
rooms | integer | Number of rooms from the JSON-LD numberOfRooms (or the card). |
bedrooms | integer | Number of bedrooms from the JSON-LD numberOfBedrooms. |
bathrooms | integer | Number of bathrooms from the JSON-LD numberOfBathroomsTotal. |
address | string | Location line composed from the JSON-LD postal address (streetAddress, addressLocality, addressRegion, postalCode). |
imageUrl | string | Primary listing image URL (OLX CDN, ireland.apollo.olxcdn.com); null when the listing carries no image. |
images | array of strings | Listing image URLs, deduplicated. |
operation | string | Requested operation: 'buy' or 'rent'. |
propertyType | string | Requested property type: 'apartments' or 'houses'. |
location | string | Location scope stamped on the record; the portal's default when no location was requested. |
portal | string | Portal slug the record came from ('otodom' or 'imovirtual'). |
country | string | Portal country: PL or PT. |
source | string | Source website hostname (otodom.pl or imovirtual.com). |
collectedAt | string | UTC ISO-8601 collection timestamp. |
Example call
npx agentcash@latest fetch https://api.ssh.autos/v1/pt/imovirtual/listings -m POST -b '{"maxResults": 3}'
The example values come from the API spec or the actor’s own sample input. Running it is a paid call.
What is and isn’t charged
You pay the call price for
- An answer, including a definitive “not found” or an empty result.
- Otodom Poland Property: Confirmed no matches returns records: [] (charged: it is an answer).
- Imovirtual Portugal Property: Confirmed no matches returns records: [] (charged: it is an answer).
Free
- Invalid input (422), busy (503), source failure (502), timeout (504) and calls whose client hung up are never charged.
- Otodom Poland Property: Invalid input and source failures are not charged.
- Imovirtual Portugal Property: Invalid input and source failures are not charged.
Prefer a subscription? Run it on Apify
This data source is a public actor on the Apify Store: OLX-Group Real-Estate Scraper (PL/PT). Run it with your Apify account and plan for larger, scheduled or exported runs; it may offer more input options than the per-call endpoint.
How x402 payment works
- Your client sends the request. The API answers
402 Payment Requiredwith the price and where to pay. - The client pays from its own wallet: USDC on Base or Solana over x402, or over MPP on Tempo. No account, sign-up or API key.
- The client retries with the payment attached and gets the JSON answer in the same call. You are only charged for answers.
The AgentCash CLI in the example does all three steps for you and pays from your AgentCash wallet. Any x402 or MPP client works the same way.
Machine-readable: openapi.json · llms.txt