{
  "openapi": "3.0.1",
  "info": {
    "title": "atHome.lu Scraper - Luxembourg Property Listings & Prices",
    "description": "Read atHome.lu listings across Luxembourg and the Greater Region: euro prices, m2, bedrooms, energy class, GPS, agency contacts and photos. No key needed.",
    "version": "1.0",
    "x-build-id": "qW2G7jRLVcuzxd0Xa"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~athome-lu-property-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-athome-lu-property-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/sian.agency~athome-lu-property-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-athome-lu-property-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/sian.agency~athome-lu-property-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-athome-lu-property-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": {
          "operation": {
            "title": "🎯 What to do",
            "enum": [
              "search",
              "detail"
            ],
            "type": "string",
            "description": "Property Search walks atHome's own result pages and returns one row per listing. Property Detail takes the advert URLs in Listing URLs below and returns the complete advert text, monthly charges, deposit, construction year and full energy record for each one.",
            "default": "search"
          },
          "transaction": {
            "title": "🤝 Buy or rent",
            "enum": [
              "buy",
              "rent"
            ],
            "type": "string",
            "description": "Which side of atHome to read. Ignored when you paste your own search URLs below.",
            "default": "buy"
          },
          "propertyType": {
            "title": "🏠 Property section",
            "enum": [
              "all",
              "apartment",
              "house",
              "new-property",
              "new-house",
              "land",
              "commercial-property",
              "office",
              "garage-parking",
              "investment-building"
            ],
            "type": "string",
            "description": "The section atHome publishes for this deal type. New houses are sold, never rented — a rent run that asks for them is answered from the new-build projects section instead, and the run log says so. All property types reads atHome's combined section, which mixes sale and rental inventory.",
            "default": "apartment"
          },
          "location": {
            "title": "📍 Town or commune",
            "type": "string",
            "description": "One atHome locality: luxembourg, esch-sur-alzette, strassen, bertrange, differdange, dudelange, mersch, ettelbruck. The cross-border towns work too — thionville, arlon, trier, longwy, metz — because atHome indexes them. Type the name as atHome spells it in its own address bar, lower case with hyphens; the actor checks it against the 1,154 localities atHome publishes and tells you the closest matches instead of running a search that cannot return anything. Leave empty to read the whole portal.",
            "default": "luxembourg"
          },
          "bedrooms": {
            "title": "🛏️ Exact bedrooms",
            "enum": [
              "",
              "1-bedroom",
              "2-bedrooms",
              "3-bedrooms",
              "4-bedrooms",
              "5-bedrooms"
            ],
            "type": "string",
            "description": "atHome publishes its own page for each of these, so picking one narrows the search on atHome's side rather than here. For a range rather than an exact count use the two bedroom bounds below.",
            "default": ""
          },
          "maxResults": {
            "title": "🔢 Max listings",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Stop after this many listings. Each page atHome serves holds 20, so 100 is five page requests. You are charged per listing returned, so this is also the run's budget.",
            "default": 100
          },
          "minPrice": {
            "title": "💶 Min price (€)",
            "minimum": 0,
            "type": "integer",
            "description": "Lower price bound in euro, handed to atHome's own search. For rentals this is the monthly rent. Leave at 0 for no lower bound.",
            "default": 0
          },
          "maxPrice": {
            "title": "💶 Max price (€)",
            "minimum": 0,
            "type": "integer",
            "description": "Upper price bound in euro. For rentals this is the monthly rent. Leave at 0 for no upper bound.",
            "default": 0
          },
          "minSurface": {
            "title": "📐 Min surface (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Smallest living area in square metres. Leave at 0 for no lower bound.",
            "default": 0
          },
          "maxSurface": {
            "title": "📐 Max surface (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Largest living area in square metres. Leave at 0 for no upper bound.",
            "default": 0
          },
          "minBedrooms": {
            "title": "🛏️ Min bedrooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Fewest bedrooms. Use this with the maximum below for a range; use Exact bedrooms above when you want one specific count.",
            "default": 0
          },
          "maxBedrooms": {
            "title": "🛏️ Max bedrooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Most bedrooms. Leave at 0 for no upper bound.",
            "default": 0
          },
          "minRooms": {
            "title": "🚪 Min rooms",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "Fewest rooms in total, bedrooms included. atHome counts rooms and bedrooms separately, so this is a different filter from the one above.",
            "default": 0
          },
          "maxRooms": {
            "title": "🚪 Max rooms",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "Most rooms in total. Leave at 0 for no upper bound.",
            "default": 0
          },
          "sort": {
            "title": "↕️ Order",
            "enum": [
              "",
              "date_desc",
              "date_asc",
              "price_asc",
              "price_desc",
              "surface_asc",
              "surface_desc"
            ],
            "type": "string",
            "description": "How atHome should order the results before the actor reads them. Newest first is what you want for monitoring; cheapest first is what you want for a price floor. These are the six orders atHome itself offers.",
            "default": ""
          },
          "includeDetails": {
            "title": "📄 Add the full advert to every listing",
            "type": "boolean",
            "description": "Fetch each listing's own advert page as well as the search page, adding the complete advert text, monthly charges, deposit, construction year and full energy record. This makes one extra request per listing and charges the detail event on top of the listing event, so leave it off unless you need the long text.",
            "default": false
          },
          "searchUrls": {
            "title": "🌐 Search URLs",
            "type": "array",
            "description": "Paste atHome result pages you already have and the pickers above are ignored — any https://www.athome.lu/... listing address works, in French, German or English, with whatever filters you set up in your browser. Use this to reproduce a search you refined on the site itself.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "listingUrls": {
            "title": "📄 Listing URLs",
            "type": "array",
            "description": "Advert addresses for Property Detail — https://www.athome.lu/en/buy/apartment/luxembourg/id-8949077.html and the like. Required when the mode above is Property Detail.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}