{
  "openapi": "3.0.1",
  "info": {
    "title": "SeLoger Scraper - Property Listings, Prices & Agents",
    "description": "Scrape SeLoger.com properties for sale and rent. Search by location with price, room and property type filters. Extract prices, areas, rooms, energy ratings, coordinates, images, descriptions, transport links and agent details.",
    "version": "0.2",
    "x-build-id": "jjS1bvfneBKoVqt9U"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~seloger-france-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-seloger-france-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/abotapi~seloger-france-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-seloger-france-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/abotapi~seloger-france-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-seloger-france-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "1. Search mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Search mode = build URLs from locations + filters below. URL mode = paste any seloger.com search URL already refined in a browser (recommended for complex filters).",
            "default": "search"
          },
          "locations": {
            "title": "Locations to search",
            "type": "array",
            "description": "City names, postcodes, neighborhoods, or SeLoger location codes. Examples: 'Paris', 'Toulouse', '75016', 'Paix Jartom, Tomblaine'. Names are auto-resolved. Each location is searched separately with maxPages per location.",
            "items": {
              "type": "string"
            },
            "default": [
              "Paris"
            ]
          },
          "distributionType": {
            "title": "Transaction Type",
            "enum": [
              "Buy",
              "Rent"
            ],
            "type": "string",
            "description": "Type of transaction.",
            "default": "Buy"
          },
          "privateSellerOnly": {
            "title": "Private sellers only",
            "type": "boolean",
            "description": "Only listings posted by private owners (no agency). Search mode only; in URL mode use the site's own filter (classifiedBusiness=Private) in the pasted URL.",
            "default": false
          },
          "estateTypes": {
            "title": "Property Types",
            "type": "array",
            "description": "Types of properties to search.",
            "items": {
              "type": "string",
              "enum": [
                "House",
                "Apartment"
              ]
            },
            "default": [
              "House",
              "Apartment"
            ]
          },
          "priceMin": {
            "title": "Min Price (EUR)",
            "type": "integer",
            "description": "Minimum price in euros."
          },
          "priceMax": {
            "title": "Max Price (EUR)",
            "type": "integer",
            "description": "Maximum price in euros."
          },
          "roomsMin": {
            "title": "Min Rooms",
            "minimum": 1,
            "type": "integer",
            "description": "Minimum number of rooms."
          },
          "bedroomsMin": {
            "title": "Min Bedrooms",
            "minimum": 1,
            "type": "integer",
            "description": "Minimum number of bedrooms."
          },
          "spaceMin": {
            "title": "Min Area (m2)",
            "type": "integer",
            "description": "Minimum living space in square meters."
          },
          "sortBy": {
            "title": "Sort By",
            "enum": [
              "Default",
              "DateDesc",
              "PriceAsc",
              "PriceDesc"
            ],
            "type": "string",
            "description": "Sort order for search results.",
            "default": "Default"
          },
          "urls": {
            "title": "Search URLs",
            "type": "array",
            "description": "SeLoger search URLs. Use the live /classified-search or /classified-map grammar. Open seloger.com, apply filters, copy the address bar URL. Left untouched, this field scrapes one example search. The homepage and single-listing pages are not search URLs and are skipped with a warning. The legacy /list.htm URLs are no longer served and will return 404. URL mode ignores the Search-mode filters above.",
            "items": {
              "type": "string"
            },
            "default": [
              "https://www.seloger.com/classified-search?distributionTypes=Buy&estateTypes=House,Apartment&locations=AD08FR31096"
            ]
          },
          "maxItems": {
            "title": "Max Items (total)",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum total listings across all locations. 0 means no cap (an internal safety ceiling of 100000 listings still applies).",
            "default": 50
          },
          "maxPages": {
            "title": "Max Pages (per location)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum search result pages per location (~35 listings/page). 0 means the built-in cap of 20 pages per location; values above 1000 are clamped to 1000.",
            "default": 0
          },
          "getDetails": {
            "title": "Get Full Details",
            "type": "boolean",
            "description": "Fetch full property details from detail pages. When OFF (default), only SERP fields are returned (fastest, cheapest). When ON, each listing's detail page is fetched: classic listings gain description, features, year built, energy class, and point-precision coordinates; selogerneuf listings additionally gain street_address.",
            "default": false
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "EU residential proxy is required. Leave the country blank to spread requests across FR/DE/BE/CH/ES/IT/NL exits (recommended), or pin a single country if you prefer. Free-tier accounts need to add residential proxy credit (https://console.apify.com/proxy/residential).",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large crawl of listings without returning or charging for listings already collected there. Use this after an interrupted run, or when continuing a search pull in another run. For recurring daily monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED listings. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those listings returned (and billed). State is kept separately for each location/URL and filter setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. What is compared: every output field of a listing (price, surface, rooms, description, photos, agency, status, coordinates and every other field) is fingerprinted; any change in one of them makes it UPDATED and lists it in changedFields. Excluded: nothing by default, plus any field names you add in \"Ignore fields when detecting changes\" below. Field order and 25.0 vs 25 number formatting never count as a change.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the locations/URLs and filters used — different search setups then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged listings (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired listings (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search — not when Max items or Max pages capped it, or when Resume was used. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Optional. Field names that must never make a listing UPDATED or appear in changedFields (they stay in the output). Use a top-level name such as updated_at, or a dotted path for a nested field such as agency.phone; a path applies to every element of a list. Changing this list does not trigger a one-time wave of UPDATED rows.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}