{
  "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": "zILvBqPeZxn35fkhb"
  },
  "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"
          },
          "rentalType": {
            "title": "Rental type (rent only)",
            "enum": [
              "any",
              "longTerm",
              "seasonal"
            ],
            "type": "string",
            "description": "Split the rental market by how long the let is. Long-term is ordinary residential letting; Short-term is Idealista’s “alquiler de temporada” — months rather than years, the stock that feeds short-let yield analysis. Measured on Madrid: 10,631 rentals in total, 6,909 long-term and 3,722 short-term. Ignored on a sale search. Idealista offers this filter in its app but not as a website URL, so it is available here through the form only — a Start URL cannot carry it.",
            "default": "any"
          },
          "propertyType": {
            "title": "Property type",
            "enum": [
              "homes",
              "newDevelopments",
              "offices",
              "premises",
              "transfers",
              "garages",
              "lands",
              "buildings",
              "storageRooms",
              "bedrooms",
              "vacationRentals"
            ],
            "type": "string",
            "description": "What kind of property to search. Three of these exist on one side of the market only, and the operation is corrected for you with a note in the log: Business transfers are for sale only, Holiday rentals and Rooms (shared) are to rent only.",
            "default": "homes"
          },
          "location": {
            "title": "City / area name",
            "type": "string",
            "description": "Type a place the way Idealista names it — \"Marbella\", \"Chamberí\", or \"Marbella, Málaga\" when the name is ambiguous. It is resolved to Idealista’s own Location ID before the search runs, so you do not need to look one up. Districts and neighbourhoods work too. A name that cannot be resolved stops the run and lists what Idealista suggested instead."
          },
          "locations": {
            "title": "Several city / area names",
            "type": "array",
            "description": "Same as City / area name, but several at once. Each name becomes its own Idealista search and all results merge into one dataset.",
            "items": {
              "type": "string"
            }
          },
          "locationId": {
            "title": "Location ID",
            "type": "string",
            "description": "Idealista location ID, e.g. 0-EU-ES-28-07-001-079 (Madrid). Optional — City / area name above resolves one for you. 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"
            }
          },
          "postalCodes": {
            "title": "Postal codes (Buscar por código postal)",
            "type": "array",
            "description": "Search by postal code — no Location ID needed. Add one or more codes (e.g. 28013, 08013, 29602); each is run as its own Idealista search and the results are merged into one dataset. Works for Spain, Italy and Portugal. You can use this on its own (leave Location ID empty) or alongside it.",
            "items": {
              "type": "string"
            }
          },
          "propertyIds": {
            "title": "Specific listing IDs",
            "type": "array",
            "description": "Re-fetch known listings by ID (or paste /inmueble/<id>/ URLs). Idealista applies this inside the search, so keep the location and the other filters wide enough to cover them — a mismatch returns nothing rather than an error. Up to ~30 per run.",
            "items": {
              "type": "string"
            }
          },
          "center": {
            "title": "Center point for radius search (lat,lng)",
            "type": "string",
            "description": "Latitude,longitude of the point to search around, e.g. 40.4168,-3.7038 (Madrid). Combine with \"Search radius\" below to pull every listing within X km of this point. Leave empty unless you want a radius search."
          },
          "distanceKm": {
            "title": "Search radius (km) around the center point",
            "type": "integer",
            "description": "Radius in kilometres around the Center point above. Example: 5 = everything within 5 km. Requires a Center point — Idealista's radius search is coordinate-based, so this has no effect on a Location ID or postal-code search."
          },
          "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",
              "newDevelopment"
            ],
            "type": "string",
            "description": "Property condition.",
            "default": ""
          },
          "currentOccupationType": {
            "title": "Occupancy status",
            "type": "array",
            "description": "Whether the property is free to move into. Idealista lists tenanted and illegally occupied stock separately — useful for investors buying rented assets.",
            "items": {
              "type": "string",
              "enum": [
                "free",
                "tenanted",
                "bareOwnership",
                "illegallyOccupied"
              ],
              "enumTitles": [
                "Available (vacant)",
                "Rented, with tenants",
                "Bare ownership",
                "Illegally occupied"
              ]
            }
          },
          "homeType": {
            "title": "Home type",
            "type": "array",
            "description": "Which kinds of home to return. Several can be picked — they widen the search rather than narrowing it.",
            "items": {
              "type": "string",
              "enum": [
                "flat",
                "chalet",
                "penthouse",
                "duplex",
                "studio",
                "countryHouse"
              ],
              "enumTitles": [
                "Flat / apartment",
                "House or chalet",
                "Penthouse",
                "Duplex",
                "Studio",
                "Country house"
              ]
            }
          },
          "subTypology": {
            "title": "Sub-type",
            "type": "array",
            "description": "Idealista’s finer property sub-types, on top of Home type. Measured on Madrid sale, against 18,109 homes: apartments 350, villas 156, lofts 43, single-storey houses 9, attics 2. Idealista offers single-storey houses and attics on sale searches only.",
            "items": {
              "type": "string",
              "enum": [
                "villaType",
                "apartamentoType",
                "loftType",
                "casaBajaType",
                "atticStudioType"
              ],
              "enumTitles": [
                "Villas",
                "Apartments",
                "Lofts",
                "Single-storey houses (sale only)",
                "Attics (sale only)"
              ]
            }
          },
          "floorHeights": {
            "title": "Floor",
            "type": "array",
            "description": "Which floors to include. Several can be picked.",
            "items": {
              "type": "string",
              "enum": [
                "topFloor",
                "intermediateFloor",
                "groundFloor"
              ],
              "enumTitles": [
                "Top floor",
                "Middle floors",
                "Ground floor"
              ]
            }
          },
          "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 properties with a fitted kitchen. Idealista offers this on RENT searches only — on a sale search it is ignored.",
            "default": false
          },
          "furnished": {
            "title": "Fully furnished",
            "type": "boolean",
            "description": "Only fully furnished properties. Idealista offers this on RENT searches only — on a sale search it is ignored. Takes precedence over \"Fitted kitchen\": the two are one either/or filter on Idealista’s side.",
            "default": false
          },
          "exteriorDomesticSpace": {
            "title": "Balcony or terrace",
            "type": "boolean",
            "description": "Idealista’s combined outdoor-space filter. Wider than the separate Balcony and Terrace toggles.",
            "default": false
          },
          "hasPlan": {
            "title": "With floor plan",
            "type": "boolean",
            "description": "Only listings that include a floor plan.",
            "default": false
          },
          "petsAllowed": {
            "title": "Pets allowed",
            "type": "boolean",
            "description": "Rentals only — Idealista offers this filter on rent searches.",
            "default": false
          },
          "onlyFlats": {
            "title": "Flats only",
            "type": "boolean",
            "description": "Idealista’s narrower \"flats only\" toggle. Home type = Flat is the broader option (it also covers penthouses and duplexes).",
            "default": false
          },
          "energyEfficiency": {
            "title": "Energy rating",
            "enum": [
              "",
              "high",
              "medium",
              "low"
            ],
            "type": "string",
            "description": "Energy certificate band.",
            "default": ""
          },
          "auction": {
            "title": "Auctions",
            "enum": [
              "",
              "onlyAuctions",
              "excludeAuctions"
            ],
            "type": "string",
            "description": "Idealista accepts only these two values, so this either narrows to auctions or removes them.",
            "default": ""
          },
          "agency": {
            "title": "Agency (microsite)",
            "type": "string",
            "description": "Restrict the search to one agency, by its Idealista microsite slug — the part after /pro/ in the agency URL, e.g. \"servihabitat1\". Leave empty for all agencies."
          },
          "bankOffer": {
            "title": "Bank repossessions only",
            "type": "boolean",
            "description": "Only bank-owned / repossessed stock (Idealista’s \"Of banks\" filter).",
            "default": false
          },
          "seaViews": {
            "title": "Sea views only",
            "type": "boolean",
            "description": "Only listings flagged with sea views. Meaningful for coastal areas.",
            "default": false
          },
          "publicationDate": {
            "title": "Published within",
            "enum": [
              "",
              "T",
              "Y",
              "W",
              "M"
            ],
            "type": "string",
            "description": "Only listings published in this window. Idealista offers a different shortest window per search type — 48 hours for sale, 24 hours for rent, and neither for new developments — so the closest available one is used and the run log says when that happened.",
            "default": ""
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "",
              "price",
              "publicationDate",
              "modificationDate",
              "size",
              "ratioeurm2",
              "rooms",
              "floor",
              "priceDown",
              "weigh",
              "distance"
            ],
            "type": "string",
            "description": "Field the results are ordered by. Leave empty for Idealista’s own default. Ignored when you use Start URLs — a URL carries its own ordering and wins. \"Nearest first\" needs a Center point and a radius; on a city or postal-code search Idealista accepts it and then orders by relevance instead.",
            "default": ""
          },
          "sortDirection": {
            "title": "Sort direction",
            "enum": [
              "desc",
              "asc"
            ],
            "type": "string",
            "description": "Ascending or descending.",
            "default": "desc"
          },
          "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
          },
          "fetchStats": {
            "title": "📈 Add each listing's engagement stats",
            "type": "boolean",
            "description": "Adds a <code>_stats</code> field per listing with Idealista's own counters: <code>views</code>, <code>contactMails</code> (people who emailed the advertiser), <code>sentToFriend</code> and <code>favorites</code>, plus Idealista's phrasing for each. This is the demand signal behind an ad — a flat with 34,000 views and 900 saves that has not sold says something a price never will, and a fresh ad with no traction says the opposite. Costs one extra request per listing, so it roughly doubles the time a large run takes; off by default. Needs detail fetches on.",
            "default": false
          },
          "fetchDetails": {
            "title": "Open each listing for the full detail page",
            "type": "boolean",
            "description": "On by default. Each listing gets its own request, which is where the deep fields come from — moreCharacteristics, energy certification, translated texts, the agency's phone, the full ubication block. Turn it OFF to deliver the search row instead: still around 50 fields including the description, the whole photo gallery, price, size, rooms, floor, coordinates and the advertiser's contact block, at one request per PAGE of 30 instead of one per listing. Much faster on large searches, and gentler on the anti-bot layer. Holiday rentals ignore this setting — Idealista publishes no detail page for them, so they are always delivered as search rows.",
            "default": true
          },
          "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
          },
          "indexMode": {
            "title": "🛰️ Index / delta monitoring — events only, no detail fetches",
            "type": "boolean",
            "description": "Lightweight monitoring for customers who already store the full data: scans your search results and emits ONLY slim event rows to the default dataset — <code>status: \"new\"</code> (propertyCode, price, url), <code>status: \"price_changed\"</code> (oldPrice, newPrice, delta, %), and <code>status: \"removed\"</code> at the end of a full scan. No property details are fetched or charged. Billing: the standard per-result price per event row + a small scan fee of $0.10 per 1,000 listings scanned (billed as <code>additional-data</code> events, 1 per 10 listings, until the dedicated <code>index-scan</code> event activates on Sep 10, 2026). To get full details for new listings, run the actor again with their property URLs as Start URLs (without this toggle). Keep <code>splitByPrice</code> on so searches over 1,500 results enumerate fully — removed-detection skips truncated searches. Regular search URLs only (drawn-area/shape URLs are skipped). Paid plans only.",
            "default": false
          },
          "seedBaseline": {
            "title": "Seed baseline (first index run)",
            "type": "boolean",
            "description": "Only with <code>indexMode</code>: record the current state of your searches WITHOUT emitting NEW rows — use it on your very first index run when your own database already contains the listings, so you don't pay for thousands of <code>status: \"new\"</code> rows you already have. Turn it off for all subsequent runs.",
            "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 (legacy — ignored)",
            "type": "integer",
            "description": "Kept for saved tasks that still set it. The scraper's request engine runs a fixed sliding window up to Max Concurrency and has no lower bound to raise, so this value changes nothing. Use Max Concurrency to control speed.",
            "default": 1
          },
          "maxRequestRetries": {
            "title": "Max Request Retries (legacy — ignored)",
            "type": "integer",
            "description": "Kept for saved tasks that still set it. Retries are no longer a single number: search pages get 30 parallel bursts and each listing gets 5 attempts, both tuned against Idealista's own rate limits, so a value here would either waste proxy bandwidth or cut a page short. Nothing to set.",
            "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}