{
  "openapi": "3.0.1",
  "info": {
    "title": "Imovirtual Scraper",
    "description": "[💰 $2.50 / 1K] Extract property listings from Imovirtual, Portugal's leading real-estate portal. Search by location, buy/rent, property type, price, area and rooms — or paste search URLs — to get prices, areas, locations, photos and agency contacts.",
    "version": "1.0",
    "x-build-id": "ylAXV5KqW5RVi6wP2"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/solidcode~imovirtual-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-solidcode-imovirtual-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/solidcode~imovirtual-scraper/runs": {
      "post": {
        "operationId": "runs-sync-solidcode-imovirtual-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/solidcode~imovirtual-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-solidcode-imovirtual-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "startUrls": {
            "title": "Search URLs",
            "maxItems": 50,
            "type": "array",
            "description": "Paste one or more Imovirtual search-results URLs (for example https://www.imovirtual.com/pt/resultados/comprar/apartamento/lisboa). This is the fastest way to get exactly the results you see on the site. When you provide URLs here, the guided 'Build a Search' fields below are ignored.",
            "items": {
              "type": "string"
            }
          },
          "transaction": {
            "title": "Buy or Rent",
            "enum": [
              "buy",
              "rent"
            ],
            "type": "string",
            "description": "Are you looking for properties to buy or to rent? Used only when no Search URLs are provided."
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "Where to search. Type a district (Lisboa, Porto, Faro), a council (Cascais, Albufeira — or 'Lisboa/Cascais' to be exact), a region (Algarve, Alentejo, Madeira, Açores) or 'Portugal' for the whole country. Accents, capitals and English names ('Lisbon') all work. Regions are searched across every district they cover. If the place isn't recognised the run stops and tells you which forms to use, instead of finishing with an empty result."
          },
          "propertyType": {
            "title": "Property Type",
            "enum": [
              "any",
              "apartment",
              "house",
              "land",
              "commercial",
              "garage",
              "room",
              "warehouse",
              "development"
            ],
            "type": "string",
            "description": "Filter by property category. Mirrors Imovirtual's own categories. Choose 'Any' to include all types."
          },
          "priceMin": {
            "title": "Minimum Price (€)",
            "minimum": 0,
            "type": "integer",
            "description": "Only include listings at or above this price in euros — monthly rent when renting, total price when buying. Leave empty for no minimum. Used only with the guided 'Build a Search' fields; when you paste Search URLs, the URL controls the filters."
          },
          "priceMax": {
            "title": "Maximum Price (€)",
            "minimum": 0,
            "type": "integer",
            "description": "Only include listings at or below this price in euros. Leave empty for no maximum."
          },
          "areaMin": {
            "title": "Minimum Area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Only include properties with living area at or above this many square metres. Leave empty for no minimum."
          },
          "areaMax": {
            "title": "Maximum Area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Only include properties with living area at or below this many square metres. Leave empty for no maximum."
          },
          "rooms": {
            "title": "Bedrooms (Portuguese T typology)",
            "uniqueItems": true,
            "type": "array",
            "description": "Only include listings with these bedroom counts, in the Portuguese 'T' typology — T3 means 3 bedrooms, T0 is a studio. Whatever you pick here comes back in each row's `bedrooms` field. Rows also carry `totalRooms`, Imovirtual's own count, which adds the living room and is therefore one higher (a T3 has 3 bedrooms and 4 total rooms). T5+ is open-ended, and so is Imovirtual's own top bracket at the other end of the scale: listings it files under '10 rooms or more' carry no published exact figure, so they come back with `roomsAreMinimum: true` and a `bedroomsLabel` of '9+' — on those rows the numbers are floors, not counts. Select several to combine. Leave empty for any number of bedrooms.",
            "items": {
              "type": "string",
              "enum": [
                "0",
                "1",
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "T0 (studio, 0 bedrooms)",
                "T1 (1 bedroom)",
                "T2 (2 bedrooms)",
                "T3 (3 bedrooms)",
                "T4 (4 bedrooms)",
                "T5+ (5 or more bedrooms)"
              ]
            }
          },
          "maxResults": {
            "title": "Max Results",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of listings to collect per search or URL. Use 50-100 for a quick scan or a higher number for deep research. Results are collected in full pages, so the final page may overshoot this number by a few rows. When Property Type is 'Any type', this cap is shared across the property categories rather than applied to each one. Set to 0 for no cap (an internal safety limit of 50,000 is then applied)."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}