{
  "openapi": "3.0.1",
  "info": {
    "title": "Realitica Property Scraper & Listing Monitor",
    "description": "Scrape Realitica listings across the Balkans by location, filters, or URL. Export prices, €/m², rooms, images, and optional seller contacts. Monitor new listings, updates, price changes, and safely confirmed removals with coverage, summaries, duplicate clusters, and comparables.",
    "version": "0.6",
    "x-build-id": "aZaxGabM7Nrgfh2Xa"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/luminar~realitica-balkan-property-radar-private-v1/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-luminar-realitica-balkan-property-radar-private-v1",
        "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/luminar~realitica-balkan-property-radar-private-v1/runs": {
      "post": {
        "operationId": "runs-sync-luminar-realitica-balkan-property-radar-private-v1",
        "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/luminar~realitica-balkan-property-radar-private-v1/run-sync": {
      "post": {
        "operationId": "run-sync-luminar-realitica-balkan-property-radar-private-v1",
        "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": {
          "countries": {
            "title": "Countries / states",
            "maxItems": 3,
            "type": "array",
            "description": "Enter Realitica country/state labels. Ignored when Start URLs are provided. Country × listing-mode combinations may create at most three source searches per run.",
            "items": {
              "type": "string"
            }
          },
          "areas": {
            "title": "Areas / cities",
            "maxItems": 40,
            "type": "array",
            "description": "Enter one or more Realitica area/city labels. Ignored when Start URLs are provided. Values are matched against the source-derived catalog.",
            "items": {
              "type": "string"
            }
          },
          "listingModes": {
            "title": "Listing modes",
            "maxItems": 3,
            "uniqueItems": true,
            "type": "array",
            "description": "Choose the market to search. Each country × mode pair is one source target; the complete matrix may contain at most three targets. Ignored when Start URLs are provided.",
            "items": {
              "type": "string",
              "enum": [
                "sale",
                "long_rent",
                "vacation",
                "other"
              ],
              "enumTitles": [
                "For sale",
                "Long-term rent",
                "Vacation / tourism",
                "Other source mode"
              ]
            },
            "default": [
              "sale"
            ]
          },
          "propertyTypes": {
            "title": "Property types",
            "maxItems": 30,
            "type": "array",
            "description": "Use Realitica property-type labels such as Apartment or House. Leave empty for every type. Ignored when Start URLs are provided.",
            "items": {
              "type": "string"
            }
          },
          "maxListings": {
            "title": "Maximum listing rows",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Global ceiling for unique listing rows. If the ceiling is reached while more results may remain, coverage is CAPPED instead of COMPLETE.",
            "default": 50
          },
          "startUrls": {
            "title": "Realitica search or listing URLs",
            "maxItems": 3,
            "type": "array",
            "description": "Start URLs take precedence over the location search. If at least one URL is supplied, Countries, Areas, Listing modes, Property types, source price, date, and sort controls are ignored. Local filters still apply to fetched rows.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "title": "Realitica URL",
                  "description": "A public Realitica search-results or listing URL.",
                  "type": "string",
                  "pattern": "^https://(www\\.)?realitica\\.com/"
                }
              }
            }
          },
          "priceMin": {
            "title": "Minimum source price",
            "minimum": 0,
            "type": "number",
            "description": "Adds Realitica's minimum-price filter to generated location searches. Ignored for Start URLs."
          },
          "priceMax": {
            "title": "Maximum source price",
            "minimum": 0,
            "type": "number",
            "description": "Adds Realitica's maximum-price filter to generated location searches. Ignored for Start URLs."
          },
          "subLocations": {
            "title": "Sublocations",
            "maxItems": 60,
            "type": "array",
            "description": "Narrow generated searches with source-backed neighborhood labels. Local matching may also refine the fetched rows.",
            "items": {
              "type": "string"
            }
          },
          "currency": {
            "title": "Expected currency",
            "type": "string",
            "description": "Optional currency label for local matching. The source currency remains authoritative in each output row."
          },
          "publishedWindow": {
            "title": "Source posting window",
            "enum": [
              "site_7d",
              "site_1mo",
              "site_1yr",
              "anytime"
            ],
            "type": "string",
            "description": "Applies Realitica's posting-window filter to generated searches. Ignored for Start URLs. Source dates remain day-precision unless a page proves more.",
            "default": "anytime"
          },
          "sortBy": {
            "title": "Source sort order",
            "enum": [
              "default",
              "newest",
              "oldest",
              "price_low",
              "price_high"
            ],
            "type": "string",
            "description": "Applies Realitica's supported sort order to generated searches. Ignored for Start URLs.",
            "default": "default"
          },
          "roomsMin": {
            "title": "Minimum rooms",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Locally keeps rows with at least this many total rooms when the source exposes a numeric value."
          },
          "roomsMax": {
            "title": "Maximum rooms",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Locally keeps rows with at most this many total rooms when the source exposes a numeric value."
          },
          "surfaceMin": {
            "title": "Minimum surface",
            "minimum": 0,
            "type": "number",
            "description": "Locally keeps rows at or above this source-backed surface."
          },
          "surfaceMax": {
            "title": "Maximum surface",
            "minimum": 0,
            "type": "number",
            "description": "Locally keeps rows at or below this source-backed surface."
          },
          "pricePerM2Min": {
            "title": "Minimum price per m²",
            "minimum": 0,
            "type": "number",
            "description": "Local filter calculated only when both numeric price and surface are available."
          },
          "pricePerM2Max": {
            "title": "Maximum price per m²",
            "minimum": 0,
            "type": "number",
            "description": "Local filter calculated only when both numeric price and surface are available."
          },
          "includeKeywords": {
            "title": "Include keywords",
            "maxItems": 30,
            "type": "array",
            "description": "Keeps a row when at least one normalized keyword appears in its title, location, excerpt, description, or seller fields.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "maxItems": 30,
            "type": "array",
            "description": "Removes a row when any normalized keyword appears in its searchable text fields.",
            "items": {
              "type": "string"
            }
          },
          "includeImages": {
            "title": "Include image URLs",
            "type": "boolean",
            "description": "Keeps image URLs already exposed by fetched listing pages. Images themselves are not downloaded.",
            "default": true
          },
          "stateMode": {
            "title": "Output mode",
            "enum": [
              "current",
              "changes"
            ],
            "type": "string",
            "description": "Current returns every listing. The first Changes run seeds the selected scope and marks observed listings SEEDED; later sequential runs emit useful NEW, UPDATED, or safely proven REMOVED changes.",
            "default": "current"
          },
          "firstSeenWindow": {
            "title": "First seen by this Actor",
            "enum": [
              "anytime",
              "last_run",
              "last_1h",
              "last_2h",
              "last_6h",
              "last_12h",
              "last_24h",
              "last_3d",
              "last_7d"
            ],
            "type": "string",
            "description": "Used only in Changes mode. Filters by when this Actor first observed a listing; it is not the same as Realitica's posted date.",
            "default": "anytime"
          },
          "includeUnchanged": {
            "title": "Include unchanged rows",
            "type": "boolean",
            "description": "Used only in Changes mode. Enable for audit exports; UNCHANGED listing rows are included without a listing-result charge.",
            "default": false
          },
          "includeDetails": {
            "title": "Open detail pages",
            "type": "boolean",
            "description": "Opens each deduplicated listing page for richer fields. A successfully enriched row uses the detailed-listing price instead of, not in addition to, the basic-listing price.",
            "default": false
          },
          "bedroomsMin": {
            "title": "Minimum bedrooms",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Automatically opens detail pages, then locally keeps rows at or above this bedroom count."
          },
          "bedroomsMax": {
            "title": "Maximum bedrooms",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Automatically opens detail pages, then locally keeps rows at or below this bedroom count."
          },
          "parking": {
            "title": "Require parking",
            "type": "boolean",
            "description": "When enabled, automatically opens detail pages and keeps only rows whose fetched detail proves parking."
          },
          "maxDistanceFromSeaMeters": {
            "title": "Maximum distance from sea",
            "minimum": 0,
            "type": "number",
            "description": "Automatically opens detail pages, then applies this maximum distance when the source exposes a usable value."
          },
          "sellerQuery": {
            "title": "Seller / agency contains",
            "type": "string",
            "description": "Automatically opens detail pages, then keeps rows whose seller or agency contains this text."
          },
          "includeContact": {
            "title": "Include exposed phone",
            "type": "boolean",
            "description": "Automatically opens detail pages and returns a public phone field when Realitica exposes one. Missing detail can fall back to a basic listing row.",
            "default": false
          },
          "referenceListing": {
            "title": "Reference listing",
            "description": "Provide a listing ID, URL, or source-backed reference fields to score comparable rows already fetched in this run. Comparable rows and explanations are included without an extra event charge."
          },
          "maxPagesPerSearch": {
            "title": "Maximum pages per search",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Stops each search after this many pages. If another page is visible, coverage is CAPPED instead of COMPLETE.",
            "default": 2
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}