{
  "openapi": "3.0.1",
  "info": {
    "title": "Zonaprop Argentina - Properties, Prices & Agencies",
    "description": "Scrape Zonaprop.com.ar property listings across Argentina. Extract 140+ fields including USD/ARS prices, price per m², expenses, area, rooms, bedrooms, bathrooms, GPS, descriptions, photos, agency contacts, phone and WhatsApp. Supports buy, rent, temporary listings, filters, sorting and URLs.",
    "version": "1.0",
    "x-build-id": "l27Ab5aTDhlEGMh8x"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~zonaprop-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-zonaprop-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~zonaprop-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-zonaprop-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~zonaprop-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-zonaprop-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": "🎯 Search mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "search = build searches from location names + filters. url = paste one or more zonaprop search URLs.",
            "default": "search"
          },
          "locations": {
            "title": "📍 Locations",
            "type": "array",
            "description": "Location names to search, e.g. Capital Federal, Palermo, Cordoba, Mendoza. Accents and spaces are handled automatically. Only applies when mode = search.",
            "items": {
              "type": "string"
            }
          },
          "operationType": {
            "title": "🏷️ Operation",
            "enum": [
              "sale",
              "rent",
              "temporary"
            ],
            "type": "string",
            "description": "Buy, rent or temporary rent. Only applies when mode = search.",
            "default": "sale"
          },
          "propertyType": {
            "title": "🏠 Property type",
            "enum": [
              "all",
              "apartment",
              "house",
              "ph",
              "land",
              "office",
              "store",
              "warehouse",
              "country_house",
              "farm",
              "office_practice",
              "building",
              "garage"
            ],
            "type": "string",
            "description": "Property category to search. 'All' covers every type. Only applies when mode = search.",
            "default": "all"
          },
          "minPrice": {
            "title": "💲 Min price",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum price in the listing currency. Applies in Search mode and URL mode, including a pasted URL."
          },
          "maxPrice": {
            "title": "💲 Max price",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum price in the listing currency. Applies in Search mode and URL mode, including a pasted URL."
          },
          "currency": {
            "title": "💱 Currency",
            "enum": [
              "any",
              "USD",
              "ARS"
            ],
            "type": "string",
            "description": "Keep only listings priced in this currency. Argentine listings are quoted in USD or ARS. Applies in Search mode and URL mode, including a pasted URL.",
            "default": "any"
          },
          "minArea": {
            "title": "📐 Min area (m2)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum total area in square metres. Applies in Search mode and URL mode, including a pasted URL."
          },
          "maxArea": {
            "title": "📐 Max area (m2)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum total area in square metres. Applies in Search mode and URL mode, including a pasted URL."
          },
          "minRooms": {
            "title": "🚪 Min rooms",
            "minimum": 1,
            "type": "integer",
            "description": "Minimum number of rooms (ambientes). Applies in Search mode and URL mode, including a pasted URL."
          },
          "maxRooms": {
            "title": "🚪 Max rooms",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of rooms (ambientes). Applies in Search mode and URL mode, including a pasted URL."
          },
          "minBedrooms": {
            "title": "🛏️ Min bedrooms",
            "minimum": 1,
            "type": "integer",
            "description": "Minimum number of bedrooms (dormitorios). Applies in Search mode and URL mode, including a pasted URL."
          },
          "minBathrooms": {
            "title": "🛁 Min bathrooms",
            "minimum": 1,
            "type": "integer",
            "description": "Minimum number of bathrooms (banos). Applies in Search mode and URL mode, including a pasted URL. Listings that do not state a bathroom count are excluded."
          },
          "agenciesOnly": {
            "title": "🏢 Agencies only",
            "type": "boolean",
            "description": "Keep only listings published by a real-estate agency (drops listings from private owners). Applies in Search mode and URL mode, including a pasted URL.",
            "default": false
          },
          "sortBy": {
            "title": "↕️ Sort order",
            "enum": [
              "relevance",
              "price-asc",
              "price-desc",
              "newest"
            ],
            "type": "string",
            "description": "Result ordering. Only applies when mode = search. A pasted URL carries its own order.",
            "default": "relevance"
          },
          "urls": {
            "title": "🔗 Search, agency or property URLs",
            "type": "array",
            "description": "Paste one or more zonaprop URLs: a search page (any type, operation, location, rooms or sort slug, temporary rent, or a '-pagina-N' page to start from), an agency page (/inmobiliarias/<name>_<id>-inmuebles.html), or a single property page (/propiedades/clasificado/...). The agency directory (/inmobiliarias.bum) is not supported. Non-www and mobile hosts are normalised to www. Location, operation, property type and sort order above are ignored in this mode (a pasted URL carries its own); price, currency, area, room, bedroom, bathroom and agency filters above still apply to search and agency pages (not to single property pages). Results are collected starting from the page in the URL.",
            "default": [
              "https://www.zonaprop.com.ar/departamentos-venta-palermo.html",
              "https://www.zonaprop.com.ar/departamentos-venta-palermo-pagina-2.html",
              "https://www.zonaprop.com.ar/inmuebles-venta-capital-federal.html",
              "https://www.zonaprop.com.ar/casas-venta-cordoba.html",
              "https://www.zonaprop.com.ar/departamentos-venta-palermo-orden-precio-ascendente.html",
              "https://www.zonaprop.com.ar/departamentos-alquiler-capital-federal-2-ambientes.html",
              "https://www.zonaprop.com.ar/departamentos-venta-palermo-2-habitaciones.html",
              "https://www.zonaprop.com.ar/departamentos-venta-palermo-mas-de-2-banos.html",
              "https://www.zonaprop.com.ar/departamentos-venta-palermo-100000-200000-dolar.html",
              "https://www.zonaprop.com.ar/departamentos-venta-palermo-menos-200000-dolar.html",
              "https://www.zonaprop.com.ar/departamentos-venta-palermo-con-pileta.html",
              "https://www.zonaprop.com.ar/departamentos-alquiler-temporal-palermo.html",
              "https://www.zonaprop.com.ar/propiedades/clasificado/veclapin-venta-duplex-2-ambientes-con-cochera-en-palermo-60051784.html",
              "https://www.zonaprop.com.ar/inmobiliarias/aguilar-bugeau-valor-inmobiliario_30351457-inmuebles.html"
            ],
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "📄 Fetch full description from each property page",
            "type": "boolean",
            "description": "Fetch each property page to add the full untruncated description. The search results already include a description, location, GPS, agency contact, prices and all photos, so leave this off for the fastest, cheapest run. Adds one request per property.",
            "default": false
          },
          "maxPages": {
            "title": "📑 Max pages per search",
            "minimum": 1,
            "type": "integer",
            "description": "Optional safety stop on how many result pages to read per location/URL (about 30 listings per page). This does NOT cap the run: leave it empty (or 0) for unlimited pages and the run is bounded solely by Max listings. Set a value only if you also want a per-search page ceiling."
          },
          "maxListings": {
            "title": "🔢 Max listings",
            "minimum": 0,
            "type": "integer",
            "description": "The run's single hard cap: maximum total listings across all searches. Defaults to 20. Set 0 for unlimited. This is the only default limit; Max pages is unlimited by default and defers to this.",
            "default": 20
          },
          "proxy": {
            "title": "🌐 Proxy configuration",
            "type": "object",
            "description": "An Argentina residential proxy is required: zonaprop serves results only to Argentine residential connections. The actor defaults the country to Argentina."
          },
          "allowProxyDowngrade": {
            "title": "💸 Allow cheaper proxy when the site permits",
            "type": "boolean",
            "description": "When on, the run may fall back to a cheaper backup connection if the primary connection keeps failing, and will stay on the cheaper connection if the site serves results from it. This saves residential proxy quota. Turn off to always use the configured proxy only: a refused or failing connection is never escalated to another one. The residential cap and traffic budget below, when set, still move the run to the cheaper backup connection once reached, whatever this setting says.",
            "default": true
          },
          "residentialCap": {
            "title": "🧢 Residential request cap (per run)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional ceiling on how many requests may use the residential proxy in one run. Once reached, the run switches to the cheaper backup connection. Leave empty or 0 for no cap. Use this to bound residential proxy spend."
          },
          "trafficBudgetMb": {
            "title": "📶 Traffic budget (MB, per run)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional cap on total downloaded data per run, in megabytes. Once reached, the run switches to the cheaper backup connection. Leave empty or 0 for no budget."
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large pull without returning or charging for listings already collected there. Use this after an interrupted run. For recurring 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 return only NEW, UPDATED and REAPPEARED listings. A listing counts as UPDATED when a real listing field changes (price, expenses, title, description, address, publisher, features, photo count and similar). Photo URLs (images, photos, mainImage, publisher logo), the antiquity counter (age, yearBuilt, condition) and the scrape timestamp (scrapedAt) never count as changes, though they are still returned. Listings that did not change are not returned and not billed unless \"Emit unchanged\" is on. Listings that were not scanned in a run keep their previous state.",
            "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 mode, locations/URLs, operation, property type and filters, so different searches never mix state."
          },
          "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. Detail enrichment is not run for unchanged rows.",
            "default": false
          },
          "emitExpired": {
            "title": "⌛ Emit expired listings (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return listings that were in your previous scans but are no longer found, marked EXPIRED. Only emitted when the run walked every result page of every search to the end (no Max listings cap hit, no Max pages limit, no URL starting past page 1); otherwise nothing is marked expired.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "🙈 Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Output field names that should NOT make a listing count as UPDATED. Always ignored: images, photos, media, pictures, mainImage, list_first_image_url, publisherLogo, url_logo, publisher.logo (rotating photo URLs; photoCount still catches added or removed photos), age, yearBuilt, condition (antiquity counter), viewCount (per-visit counter on a property page), publishedAgo (daily \"hace N días\" text) and scrapedAt. Add fields such as description or labels here if changes to them are not relevant to you. Use a dotted path (for example publisher.name) for a field inside a nested object. Ignored fields are still returned in the output.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}