{
  "openapi": "3.0.1",
  "info": {
    "title": "Hepsiemlak Scraper - Property Listings, Prices & Contacts",
    "description": "Scrape hepsiemlak.com sale and rental listings by city or district, or paste listing links. Every row carries price, area, rooms, seller and location. Detail enrichment adds specs, description and contact.",
    "version": "0.1",
    "x-build-id": "4SRLMyhsBuUffZkHf"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~hepsiemlak-com-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-hepsiemlak-com-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~hepsiemlak-com-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-hepsiemlak-com-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~hepsiemlak-com-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-hepsiemlak-com-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": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Search mode walks listing pages for each location. URL mode reads each pasted link.",
            "default": "search"
          },
          "listingType": {
            "title": "Listing type",
            "enum": [
              "sale",
              "rent",
              "seasonal-rent"
            ],
            "type": "string",
            "description": "sale reads satilik paths, rent reads kiralik paths, seasonal-rent reads sezonluk-kiralik paths.",
            "default": "sale"
          },
          "propertyType": {
            "title": "Property type",
            "enum": [
              "any",
              "apartment",
              "villa",
              "detached-house"
            ],
            "type": "string",
            "description": "Narrow search walks to a property kind. Pasted listing links ignore this.",
            "default": "any"
          },
          "roomCount": {
            "title": "Room plan",
            "type": "string",
            "description": "Keep only listings with this room plan, for example 2+1 (rooms plus living rooms). Empty means any."
          },
          "ownerOnly": {
            "title": "Owner listings only",
            "type": "boolean",
            "description": "Keep only listings posted by the owner (the site's sahibinden path), not by an agency.",
            "default": false
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "default",
              "price-asc",
              "price-desc",
              "area-asc",
              "area-desc"
            ],
            "type": "string",
            "description": "Order of results in Search mode. Pasted links keep their own sort.",
            "default": "default"
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "City or district names, for example Istanbul, Kadıköy, Izmir Karsiyaka. Each is resolved through the site's own location lookup (Turkish letters are fine); an unknown name stops the run with a message naming it. Empty means the nationwide listing path.",
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Min price (TRY)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only listings at or above this price in lira."
          },
          "maxPrice": {
            "title": "Max price (TRY)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only listings at or below this price in lira."
          },
          "minArea": {
            "title": "Min area (m2)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only listings with at least this gross area."
          },
          "maxArea": {
            "title": "Max area (m2)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only listings with at most this gross area."
          },
          "urls": {
            "title": "Listing or catalogue links",
            "type": "array",
            "description": "One or more hepsiemlak.com links. A listing page returns that listing; a catalogue page is walked like a search.",
            "default": [
              "https://www.hepsiemlak.com/en/satilik",
              "https://www.hepsiemlak.com/satilik",
              "https://www.hepsiemlak.com/en/istanbul-satilik",
              "https://www.hepsiemlak.com/istanbul-satilik",
              "https://www.hepsiemlak.com/en/kiralik",
              "https://www.hepsiemlak.com/en/sezonluk-kiralik",
              "https://www.hepsiemlak.com/en/satilik/daire",
              "https://www.hepsiemlak.com/en/istanbul-satilik/villa",
              "https://www.hepsiemlak.com/en/satilik?page=2",
              "https://www.hepsiemlak.com/en/istanbul-kiralik?page=2",
              "https://www.hepsiemlak.com/en/istanbul-satilik?sortField=PRICE&sortDirection=ASC",
              "https://www.hepsiemlak.com/en/satilik-2-1",
              "https://www.hepsiemlak.com/en/satilik-sahibinden",
              "https://www.hepsiemlak.com/en/istanbul-silivri-cumhuriyet-satilik/villa/125785-729",
              "https://www.hepsiemlak.com/istanbul-silivri-cumhuriyet-satilik/villa/125785-729"
            ],
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "Fetch details",
            "type": "boolean",
            "description": "Read each listing page for the spec table, description and contact. Adds one detail-enrichment charge per record, at most.",
            "default": false
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "The single cap on this run: stop after collecting this many records across all locations and links. Set 0 for unlimited.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per source",
            "minimum": 0,
            "type": "integer",
            "description": "Safety bound on how many result pages to walk per location or link. Leave at 0 for no page limit: the run then stops at Max items, not here.",
            "default": 0
          },
          "maxItemsPerSource": {
            "title": "Max items per location or link",
            "minimum": 0,
            "type": "integer",
            "description": "Optional extra cap per location or pasted link, on top of Max items. Leave empty or 0 for no per-source cap."
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Leave the default for the cheapest run. The portal challenges plain connections, so residential exits in the home market are the default lane. Change it only if a run reports that it could not read any results.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "TR"
            }
          },
          "resumeFromRunId": {
            "title": "Resume from run ID",
            "type": "string",
            "description": "Continue an interrupted crawl: records already collected by this run ID (or dataset ID) are skipped. Cannot be combined with recurring updates on one run."
          },
          "incrementalMode": {
            "title": "Recurring updates",
            "type": "boolean",
            "description": "Remember this setup's listings between runs and label every row NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED. UPDATED is decided by comparing every output field (price, title, rooms, area, photos, seller and the rest) with the stored copy, and changedFields names what moved. Excluded from the comparison (still returned): scrapedAt, sourceType, sourceId, sourceUrl and position, which describe the run rather than the listing, plus any fields you list under Ignore fields below. EXPIRED is only produced after a complete scan, never after a capped run, a page limit, a resume or a link that starts at page 2 or later. Cannot be combined with resume on one run.",
            "default": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Name this monitoring setup. Runs with the same key share one baseline; leave empty to derive it from the search setup."
          },
          "emitUnchanged": {
            "title": "Return unchanged rows",
            "type": "boolean",
            "description": "Return UNCHANGED rows too (they still count as dataset items and are billed as such). Off by default: unchanged rows are suppressed.",
            "default": false
          },
          "emitExpired": {
            "title": "Return gone rows",
            "type": "boolean",
            "description": "Return EXPIRED rows for listings missing from a complete scan (they still count as dataset items and are billed as such). Only on complete scans.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Optional. Field names to leave out of UPDATED change detection, on top of the built-in exclusions (scrapedAt, sourceType, sourceId, sourceUrl, position). Use a top-level name such as description, or a dotted path such as agent.name for a nested field. The fields are still returned; they just never make a row UPDATED. Changing this list does not cause a 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}