{
  "openapi": "3.0.1",
  "info": {
    "title": "Idealista $0.65💰 AI Market Intel · Bypass 1,500 · EMAILS",
    "description": "Production Idealista scraper for Spain, Italy & Portugal — anti-bot handled, maintained daily, bypasses the hidden 1,500-result cap (+31% rows). 80+ fields, agent phones & emails, GPS. NEW 🧠 AI Market Analysis: per-city short-let ADR, occupancy, rent & yield with cited sources. Flat $0.65/1k.",
    "version": "0.0",
    "x-build-id": "3v76cJaldIq2d6vCq"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~idealista-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-idealista-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/memo23~idealista-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-idealista-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/memo23~idealista-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-idealista-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",
        "properties": {
          "instantDatabase": {
            "title": "Use Instant Database mode",
            "type": "boolean",
            "description": "Serve agencies from the database instead of live-scraping. Auto-enabled if you set Agency name below.",
            "default": false
          },
          "dbAgencyName": {
            "title": "Agency name contains",
            "type": "string",
            "description": "e.g. Tecnocasa. Optional. Returns only Instant-Database agencies whose name contains this text; setting it auto-enables Instant Database mode (no live scraping)."
          },
          "dbCountry": {
            "title": "Country",
            "enum": [
              "es",
              "it",
              "pt"
            ],
            "type": "string",
            "description": "Limit to one market: es (Spain), it (Italy) or pt (Portugal). Leave empty for all three."
          },
          "dbHasPhone": {
            "title": "Only agencies with a phone",
            "type": "boolean",
            "description": "Only return agencies that have a phone number on file (virtually all do).",
            "default": false
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "URLs to start with. Accepts Idealista search URLs, filtered-search URLs, individual property URLs (/inmueble/{id}/) and new-development URLs (/obra-nueva/{id}/) on idealista.com, idealista.it or idealista.pt — other hosts are rejected. Example: https://www.idealista.com/venta-viviendas/madrid-madrid/  ⚠️ Start URLs TAKE PRECEDENCE: if you fill this in, the Form Search fields below are ignored. Leave it empty to use the form instead.",
            "items": {
              "type": "string"
            }
          },
          "country": {
            "title": "Country",
            "enum": [
              "es",
              "it",
              "pt"
            ],
            "type": "string",
            "description": "Idealista market to search.",
            "default": "es"
          },
          "operation": {
            "title": "Operation",
            "enum": [
              "sale",
              "rent"
            ],
            "type": "string",
            "description": "Buy or rent.",
            "default": "sale"
          },
          "propertyType": {
            "title": "Property type",
            "enum": [
              "homes",
              "newDevelopments",
              "offices",
              "premises",
              "garages",
              "lands",
              "storageRooms",
              "bedrooms"
            ],
            "type": "string",
            "description": "What kind of property to search.",
            "default": "homes"
          },
          "locationId": {
            "title": "Location ID",
            "type": "string",
            "description": "Idealista location ID, e.g. 0-EU-ES-28-07-001-079 (Madrid). This is how the form targets an area. Leave Start URLs empty when using the form."
          },
          "locationIds": {
            "title": "Location IDs (multiple)",
            "type": "array",
            "description": "Advanced: several location IDs in one search. Overrides the single Location ID above when set.",
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Min price (€)",
            "type": "integer",
            "description": "Minimum price. Leave empty for no minimum."
          },
          "maxPrice": {
            "title": "Max price (€)",
            "type": "integer",
            "description": "Maximum price. Leave empty for no maximum."
          },
          "minSize": {
            "title": "Min size (m²)",
            "type": "integer",
            "description": "Minimum built area in m²."
          },
          "maxSize": {
            "title": "Max size (m²)",
            "type": "integer",
            "description": "Maximum built area in m²."
          },
          "bedrooms": {
            "title": "Bedrooms",
            "type": "string",
            "description": "Comma-separated: 0=studio,1,2,3,4 (4 means 4+). Example: 2,3,4"
          },
          "bathrooms": {
            "title": "Bathrooms",
            "type": "string",
            "description": "Comma-separated: 1,2,3 (3 means 3+). Example: 2,3"
          },
          "preservation": {
            "title": "Condition",
            "enum": [
              "",
              "good",
              "renew"
            ],
            "type": "string",
            "description": "Property condition.",
            "default": ""
          },
          "newDevelopment": {
            "title": "New development only",
            "type": "boolean",
            "description": "Only brand-new / off-plan developments.",
            "default": false
          },
          "airConditioning": {
            "title": "Air conditioning",
            "type": "boolean",
            "description": "Only listings with: air conditioning.",
            "default": false
          },
          "elevator": {
            "title": "Lift / elevator",
            "type": "boolean",
            "description": "Only listings with: lift / elevator.",
            "default": false
          },
          "garage": {
            "title": "Garage / parking",
            "type": "boolean",
            "description": "Only listings with: garage / parking.",
            "default": false
          },
          "garden": {
            "title": "Garden",
            "type": "boolean",
            "description": "Only listings with: garden.",
            "default": false
          },
          "terrace": {
            "title": "Terrace",
            "type": "boolean",
            "description": "Only listings with: terrace.",
            "default": false
          },
          "swimmingPool": {
            "title": "Swimming pool",
            "type": "boolean",
            "description": "Only listings with: swimming pool.",
            "default": false
          },
          "exterior": {
            "title": "Exterior-facing",
            "type": "boolean",
            "description": "Only listings with: exterior-facing.",
            "default": false
          },
          "storeRoom": {
            "title": "Storage room",
            "type": "boolean",
            "description": "Only listings with: storage room.",
            "default": false
          },
          "builtInWardrobes": {
            "title": "Fitted wardrobes",
            "type": "boolean",
            "description": "Only listings with: fitted wardrobes.",
            "default": false
          },
          "luxury": {
            "title": "Luxury",
            "type": "boolean",
            "description": "Only listings with: luxury.",
            "default": false
          },
          "balcony": {
            "title": "Balcony",
            "type": "boolean",
            "description": "Only listings with: balcony.",
            "default": false
          },
          "accessible": {
            "title": "Wheelchair accessible",
            "type": "boolean",
            "description": "Only listings with: wheelchair accessible.",
            "default": false
          },
          "virtualTour": {
            "title": "Has virtual tour",
            "type": "boolean",
            "description": "Only listings with: has virtual tour.",
            "default": false
          },
          "furnishedKitchen": {
            "title": "Furnished kitchen",
            "type": "boolean",
            "description": "Only listings with: furnished kitchen.",
            "default": false
          },
          "maxItems": {
            "title": "Maximum number of items OR limit the results per crawl",
            "type": "integer",
            "description": "Maximum number of items that will be scraped. Each item is one billed result row; in agency mode (scrapeAgencies) it caps unique agencies instead of properties. Default: 10000.",
            "default": 10000
          },
          "monitoringMode": {
            "title": "Run in monitoring mode where only newly listings compared to previous runs will be scraped",
            "type": "boolean",
            "description": "If checked, it will only scrape newly listings compared to what has been scraped in previous runs.",
            "default": false
          },
          "detectPriceChanges": {
            "title": "📉 Detect price changes across runs (needs monitoring mode)",
            "type": "boolean",
            "description": "Requires \"monitoring mode\". Across runs, tracks each listing's price and reports every change — one row per price move with <code>oldPrice</code>, <code>newPrice</code>, <code>priceDelta</code>, <code>pctChange</code>, <code>direction</code> (increase/decrease) and <code>firstSeenAt</code>, plus the listing's URL & address. Price-change rows are written to a separate run dataset named <code>idealista-changes-&lt;runId&gt;</code> (not the default output) and billed at the low <code>additional-data</code> rate. Perfect for spotting price drops on properties you're tracking. No effect unless monitoring mode is also on.",
            "default": false
          },
          "detectRemovedListings": {
            "title": "🗑️ Detect removed / sold listings across runs (needs monitoring mode)",
            "type": "boolean",
            "description": "Requires \"monitoring mode\". Reports listings that have LEFT the market (sold/withdrawn) since your previous run — one <code>{ \"status\": \"removed\", propertyCode, url, searchUrl, detectedRemovedAt }</code> row each, written to a separate run dataset named <code>idealista-removed-&lt;runId&gt;</code> and billed at the low <code>additional-data</code> rate. <b>Needs a full scan:</b> set <code>maxItems</code> high enough to cover the whole search — runs that stop early are skipped so nothing is wrongly flagged as removed. No effect unless monitoring mode is also on.",
            "default": false
          },
          "splitByPrice": {
            "title": "Get all listings (bypass Idealista's 1500-item per-query cap)",
            "type": "boolean",
            "description": "Idealista silently caps each search query at 1500 listings — confirmed against the iOS app itself; the limit lives on the API, not on the website. With this enabled (the default), the actor probes each start URL and, when the total would exceed 1500, automatically captures the complete result set past the cap and merges it into one dataset. Searches with under 1500 hits run as-is (one extra probe request). Turn this OFF if you want the legacy behavior — a single query that stops at the cap.",
            "default": true
          },
          "scrapeAgencies": {
            "title": "Scrape agencies instead of properties (with phone numbers)",
            "type": "boolean",
            "description": "When enabled, the actor returns one row per unique real-estate AGENCY found across your search URLs — agency name, <b>phone number</b>, profile URL, microsite, and logo — instead of property listings. Phone numbers come straight from Idealista's mobile API (most agency scrapers leave phone empty). Works with any normal search/result URL (e.g. /venta-viviendas/madrid-madrid/) and respects the 1500-cap bypass for full coverage. Email is not published by Idealista, so it is not included.",
            "default": false
          },
          "enrichEmails": {
            "title": "Enrich with contact emails (experimental, billed per email)",
            "type": "boolean",
            "description": "If enabled, finds a contact email for each result from its own website (or by discovering it from the name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Billed per contact email found; only charged when an email is returned, never for misses.",
            "default": false
          },
          "qualifyByPayment": {
            "title": "💳 Qualify by payment (flag businesses that take money online)",
            "type": "boolean",
            "description": "Requires \"Enrich with contact emails\". Scans each listing agent/business website — reusing the pages already fetched for email discovery, so no extra cost or time — for payment processors and e-commerce platforms (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more). Adds takesPayments (is this a real paying business?), paymentProcessors (which stack), stripeLiveKey (the public key if exposed) and paymentConfidence. Turn raw contacts into monetization-qualified leads. No extra charge — included with each enriched company.",
            "default": false
          },
          "marketAnalysis": {
            "title": "🧠 AI Market Analysis per area ($0.15/area, cached)",
            "type": "boolean",
            "description": "If enabled, appends a `rowType: \"marketAnalysis\"` row per area found in your results (up to 8 areas per run, largest first). Billed per area row delivered via the `market-analysis` event; never charged when analysis fails or signal is too thin.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Max Concurrency",
            "type": "integer",
            "description": "Maximum number of pages that can be processed at the same time.",
            "default": 10
          },
          "minConcurrency": {
            "title": "Min Concurrency",
            "type": "integer",
            "description": "Minimum number of pages that will be processed at the same time.",
            "default": 1
          },
          "maxRequestRetries": {
            "title": "Max Request Retries",
            "type": "integer",
            "description": "Number of times the crawler will retry a failed request before giving up.",
            "default": 100
          },
          "proxy": {
            "title": "Proxy configuration (optional override)",
            "type": "object",
            "description": "Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}