{
  "openapi": "3.0.1",
  "info": {
    "title": "atHome.lu Scraper - Luxembourg Real Estate Data & Prices",
    "description": "atHome.lu listings for sale or rent as clean JSON: price as a number with its meaning (sale, monthly rent or new-build range), charges apart from rent, price per m2, surface, bedrooms, energy class, address with coordinates and the agency. No agent contacts. Unofficial.",
    "version": "0.1",
    "x-build-id": "cZSNxjtfjdWRaQSQ5"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~athome-listings/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-athome-listings",
        "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/neverempty~athome-listings/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-athome-listings",
        "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/neverempty~athome-listings/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-athome-listings",
        "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": {
          "searchUrl": {
            "title": "atHome search URL (optional)",
            "type": "string",
            "description": "Paste an English atHome listing page, for example https://www.athome.lu/en/buy/apartment/luxembourg or https://www.athome.lu/en/rent/house/esch-sur-alzette, and the three fields below are ignored. Query parameters are dropped; every filter runs here on the rows already fetched."
          },
          "channel": {
            "title": "For sale or to rent",
            "enum": [
              "sale",
              "rent"
            ],
            "type": "string",
            "description": "sale = buy, rent = rent.",
            "default": "sale"
          },
          "propertyType": {
            "title": "Property type",
            "enum": [
              "apartment",
              "house"
            ],
            "type": "string",
            "description": "atHome's own words. Other words are not accepted, because atHome would silently answer with houses from the whole country.",
            "default": "apartment"
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "A town as atHome spells it: luxembourg, esch-sur-alzette, differdange. Every row carries the place atHome resolved it to (kirchberg, for example, is a village in Germany on atHome). A place atHome does not know is reported as a no-such-search row, not as an empty result - atHome would otherwise silently widen the search to the whole country.",
            "default": "luxembourg"
          },
          "maxListings": {
            "title": "Maximum properties",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many properties to return. You are charged for the rows you actually receive.",
            "default": 20
          },
          "maxPages": {
            "title": "Maximum listing pages to open",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "A hard stop on how many pages are requested, whatever the filters do. 0 lets the run work it out.",
            "default": 0
          },
          "includeDescription": {
            "title": "Include the description text",
            "type": "boolean",
            "description": "The English description (French or German where no English one exists). Turn it off for a smaller dataset - the keyword filter still searches it either way.",
            "default": true
          },
          "useProxy": {
            "title": "Use an Apify proxy",
            "type": "boolean",
            "description": "Off by default because atHome answers Apify's own network directly. If atHome ever starts blocking, the run switches to a proxy on its own.",
            "default": false
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Keep only properties whose title, description, type, address, city, energy class or agency contain these words. No extra requests are made.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "keywordMatch": {
            "title": "Keyword match",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "any: at least one keyword. all: every keyword.",
            "default": "any"
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop properties containing any of these words.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "agencyNames": {
            "title": "Agencies",
            "type": "array",
            "description": "Keep only properties marketed by these agencies. Partial names work.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Minimum price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "A sale price is a total; a rent is per month, the way atHome publishes it. A new-build project with a price range is kept if any part of the range fits. 0 means no minimum.",
            "default": 0
          },
          "maxPrice": {
            "title": "Maximum price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "0 means no maximum. Charges are a separate column and are not included.",
            "default": 0
          },
          "requirePrice": {
            "title": "Only properties with a single published price",
            "type": "boolean",
            "description": "Off by default: a property whose price is confidential, or only a range, is simply kept.",
            "default": false
          },
          "minBedrooms": {
            "title": "Minimum bedrooms",
            "minimum": -1,
            "maximum": 30,
            "type": "integer",
            "description": "-1 turns the filter off. A property without a bedroom count is kept.",
            "default": -1
          },
          "maxBedrooms": {
            "title": "Maximum bedrooms",
            "minimum": -1,
            "maximum": 30,
            "type": "integer",
            "description": "-1 turns the filter off.",
            "default": -1
          },
          "minSurfaceSqm": {
            "title": "Minimum surface (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "0 means no minimum. A property without a published surface is kept.",
            "default": 0
          },
          "maxSurfaceSqm": {
            "title": "Maximum surface (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "0 means no maximum.",
            "default": 0
          },
          "propertyTypes": {
            "title": "Property subtypes",
            "type": "array",
            "description": "Partial match on atHome's words: Apartment, Penthouse, Duplex, Studio, House, Semi-detached house, Apartment block …",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "postalCodes": {
            "title": "Postcodes",
            "type": "array",
            "description": "Keep only these 4-digit Luxembourg postcodes.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "cities": {
            "title": "Cities or districts",
            "type": "array",
            "description": "Partial match on atHome's city name (Luxembourg-Kirchberg, Esch-sur-Alzette …). Useful with a country-wide search.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "energyClasses": {
            "title": "Energy class",
            "type": "array",
            "description": "Keep only these Luxembourg energy classes (A, B, C … I). A property without a published class is kept.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeProjects": {
            "title": "Exclude new-build projects with a price range",
            "type": "boolean",
            "description": "Drop the grouped project listings that carry a min-max price and several units.",
            "default": false
          },
          "excludeSold": {
            "title": "Exclude sold or under agreement",
            "type": "boolean",
            "description": "Drop listings atHome flags as sold or under a sales agreement.",
            "default": false
          },
          "advertiserType": {
            "title": "Advertiser",
            "enum": [
              "any",
              "agency",
              "private"
            ],
            "type": "string",
            "description": "Agency listings, or listings from private sellers. Private sellers are never named.",
            "default": "any"
          },
          "monitoringMode": {
            "title": "Only return listings that are new since the last run",
            "type": "boolean",
            "description": "Turn this on and schedule the Actor: each run returns only the properties it has never returned before, so you are charged for new stock rather than for the same pages again. Properties that did not fit under the limit are still waiting for you on the next run.",
            "default": false
          },
          "resetMonitoringState": {
            "title": "Forget what was already returned",
            "type": "boolean",
            "description": "Clears the memory for this search, so the next monitoring run starts from scratch. Works with or without monitoring mode on.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}