{
  "openapi": "3.0.1",
  "info": {
    "title": "Reality ČR – Sreality, Bezrealitky, Bazoš a další",
    "description": "Agreguje šest českých realitních portálů do kanonických nemovitostí: jeden byt inzerovaný na třech portálech dvěma kancelářemi je jeden záznam se třemi odkazy. Sleduje historii ceny a hlásí nové, zlevněné, přeinzerované i stažené nabídky.",
    "version": "0.1",
    "x-build-id": "AgAFLnuH69diuMexh"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/huykenny~czech-real-estate-aggregator/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-huykenny-czech-real-estate-aggregator",
        "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/huykenny~czech-real-estate-aggregator/runs": {
      "post": {
        "operationId": "runs-sync-huykenny-czech-real-estate-aggregator",
        "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/huykenny~czech-real-estate-aggregator/run-sync": {
      "post": {
        "operationId": "run-sync-huykenny-czech-real-estate-aggregator",
        "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": [
          "sources"
        ],
        "properties": {
          "sources": {
            "title": "Portály",
            "type": "array",
            "description": "Ze kterých portálů stahovat. Čím víc portálů, tím lépe funguje deduplikace — jedna nemovitost inzerovaná na třech portálech se pozná jen tehdy, když máte všechny tři. Předvyplněné jsou tři portály, které vracejí data bez dalšího nastavení, takže první běh rychle něco najde. Sreality.cz a ČeskéReality mají v robots.txt „Disallow: /\" pro všechny roboty, takže je actor při výchozím nastavení přeskočí — zapnout je jde vědomě přes „Postoj k robots.txt\".",
            "items": {
              "type": "string",
              "enum": [
                "sreality",
                "bezrealitky",
                "idnes",
                "bazos",
                "realitymix",
                "ceskereality"
              ],
              "enumTitles": [
                "Sreality.cz",
                "Bezrealitky.cz",
                "iDNES Reality",
                "Bazoš Reality",
                "RealityMIX",
                "ČeskéReality"
              ]
            },
            "default": [
              "bezrealitky",
              "idnes",
              "realitymix"
            ]
          },
          "mode": {
            "title": "Režim crawlu",
            "enum": [
              "incremental",
              "full"
            ],
            "type": "string",
            "description": "Inkrementální běh dojede k první už známé nabídce a zastaví — je rychlý a levný, na denní monitoring stačí. Plný běh projde celý katalog; je potřeba pro první naplnění a pro detekci stažených nabídek.",
            "default": "incremental"
          },
          "listingType": {
            "title": "Typ nabídky",
            "enum": [
              "SALE",
              "RENT",
              "AUCTION"
            ],
            "type": "string",
            "description": "Nechte prázdné pro prodej i pronájem."
          },
          "propertyTypes": {
            "title": "Typ nemovitosti",
            "type": "array",
            "description": "Nechte prázdné pro všechny typy.",
            "items": {
              "type": "string",
              "enum": [
                "APARTMENT",
                "HOUSE",
                "LAND",
                "COMMERCIAL",
                "COTTAGE",
                "GARAGE"
              ],
              "enumTitles": [
                "Byty",
                "Domy",
                "Pozemky",
                "Komerční",
                "Chaty a chalupy",
                "Garáže"
              ]
            }
          },
          "region": {
            "title": "Kraj",
            "type": "string",
            "description": "Například „Praha\" nebo „Jihomoravský kraj\". Nechte prázdné pro celou ČR."
          },
          "district": {
            "title": "Okres",
            "type": "string",
            "description": "Například „Praha 4\" nebo „Brno-venkov\". Portály, které okres v URL neumí, dorovná kontrola na naší straně."
          },
          "city": {
            "title": "Město",
            "type": "string",
            "description": "Například „Praha\", „Brno\" nebo „Hradec Králové\". „Praha\" zahrne i „Praha 5\" — obvod se pro porovnání odřezává."
          },
          "priceMin": {
            "title": "Cena od (Kč)",
            "minimum": 0,
            "type": "integer",
            "description": "Dolní hranice ceny v korunách. Nabídky s cenou „na dotaz\" se nevyřazují — chybějící cena neznamená, že do rozsahu nepatří."
          },
          "priceMax": {
            "title": "Cena do (Kč)",
            "minimum": 0,
            "type": "integer",
            "description": "Horní hranice ceny v korunách. Sreality tento filtr umí poslat rovnou do URL, ostatní portály se dorovnávají u nás."
          },
          "areaMin": {
            "title": "Plocha od (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Dolní hranice plochy v m². U Bazoše se plocha extrahuje z textu inzerátu, takže nabídky bez uvedené plochy zůstanou ve výsledku."
          },
          "areaMax": {
            "title": "Plocha do (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Horní hranice plochy v m²."
          },
          "maxItems": {
            "title": "Maximum inzerátů celkem",
            "minimum": 1,
            "maximum": 200000,
            "type": "integer",
            "description": "Strop pro celý běh, napříč portály. Účtuje se za vypuštěné nemovitosti, ne za stažené inzeráty. Předvyplněná hodnota je záměrně malá, aby první běh skončil do minuty — pro skutečný sběr ji zvedněte (běžně 500–5000; strop je 200 000).",
            "default": 12
          },
          "maxItemsPerSource": {
            "title": "Maximum inzerátů na portál",
            "minimum": 1,
            "type": "integer",
            "description": "Nechte prázdné a rozdělí se rovnoměrně mezi vybrané portály."
          },
          "fetchDetails": {
            "title": "Stahovat detailní stránky",
            "type": "boolean",
            "description": "Detail dá plochu, dispozici, podlaží, vlastnictví a fotky — tedy to, na čem stojí deduplikace. Vypnutím se běh zrychlí, ale kvalita párování napříč portály výrazně klesne.",
            "default": true
          },
          "deduplicate": {
            "title": "Deduplikovat napříč portály",
            "type": "boolean",
            "description": "Hlavní funkce Actoru: jedna nemovitost = jedno ID, i když ji inzerují tři portály a dvě kanceláře. Vypnutím dostanete každý inzerát zvlášť.",
            "default": true
          },
          "mergeThreshold": {
            "title": "Práh pro sloučení (30–100)",
            "minimum": 30,
            "maximum": 100,
            "type": "integer",
            "description": "Vyšší číslo = opatrnější slučování. Výchozích 45 je nastaveno tak, aby se radši nesloučila skutečná duplicita, než aby se slily dva různé byty ve stejném domě.",
            "default": 45
          },
          "useImageMatching": {
            "title": "Porovnávat fotografie",
            "type": "boolean",
            "description": "Nejsilnější signál duplicity: stejné fotky interiéru znamenají stejný byt. Stahují se jen náhledy a počítá se z nich hash — fotky se nikam neukládají ani nevypouštějí. Prodlužuje běh.",
            "default": true
          },
          "maxImagesPerListing": {
            "title": "Kolik fotek na inzerát hashovat",
            "minimum": 0,
            "maximum": 12,
            "type": "integer",
            "description": "Kolik náhledů z jednoho inzerátu stáhnout a spočítat z nich hash. Víc fotek = lepší párování duplicit, ale delší běh. Nula porovnávání fotek vypne.",
            "default": 4
          },
          "onlyChanges": {
            "title": "Jen změny",
            "type": "boolean",
            "description": "Do datasetu půjdou pouze změnové záznamy: nová nabídka, zlevnění, zdražení, stažení z trhu, přidání dalšího portálu. Režim pro monitoring — nedostanete celý katalog.",
            "default": false
          },
          "includeRawDataset": {
            "title": "Uložit i surové inzeráty",
            "type": "boolean",
            "description": "Do pojmenovaného datasetu „raw-listings\" se uloží jeden záznam za každý inzerát na každém portálu, s odkazem na kanonickou nemovitost. Hodí se na kontrolu deduplikace.",
            "default": false
          },
          "detectRemovals": {
            "title": "Detekovat stažené nabídky",
            "type": "boolean",
            "description": "Funguje jen u plného nefiltrovaného běhu — u filtrovaného nelze rozlišit „nabídka je pryč\" od „nebyla ve výběru\". Stažení se hlásí až po třech po sobě jdoucích běžích, aby výpadek portálu nevyrobil vlnu falešných hlášení.",
            "default": true
          },
          "robotsTxtPolicy": {
            "title": "robots.txt portálu",
            "enum": [
              "respect",
              "ignore"
            ],
            "type": "string",
            "description": "Actor se identifikuje vlastním User-Agentem, takže se ho v robots.txt týká pravidlo pro „*\". Sreality a ČeskéReality tam mají „Disallow: /\" — při volbě „Respektovat\" se tyto portály přeskočí a v souhrnu běhu je uveden důvod. Volba „Ignorovat\" je vědomé rozhodnutí uživatele a jeho odpovědnost.",
            "default": "respect"
          },
          "stateStoreName": {
            "title": "Název úložiště stavu",
            "type": "string",
            "description": "Key-value store, kde se drží historie mezi běhy. Stejný název = navazující historie. Změna názvu začne historii od nuly.",
            "default": "czech-real-estate-state"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}