{
  "openapi": "3.0.1",
  "info": {
    "title": "Corotos Property Scraper",
    "description": "Dominican Republic property adverts from Corotos: asking price in pesos or dollars, bedrooms, bathrooms, built area, province and town, photos and the advertiser behind each advert. Search 30 provinces and 72 towns across houses, apartments, penthouses, land, holiday homes, offices and shared rooms,",
    "version": "1.0",
    "x-build-id": "mlbZ0By7egfuq6msp"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~corotos-com-property-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-corotos-com-property-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/sian.agency~corotos-com-property-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-corotos-com-property-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/sian.agency~corotos-com-property-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-corotos-com-property-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": {
          "operation": {
            "title": "⚙️ What to do",
            "enum": [
              "search",
              "detail"
            ],
            "type": "string",
            "description": "Pick one per run. Property Search walks a Corotos property board and returns one row per advert. Property Detail takes Corotos advert addresses you already hold and opens each one for the full record: the advertiser's own Spanish description, the complete photo set, map coordinates, the published date, the spec table and the advertiser's shop. A search row alone carries none of those.",
            "default": "search"
          },
          "dealType": {
            "title": "🤝 For sale or to rent",
            "enum": [
              "any",
              "sale",
              "rent"
            ],
            "type": "string",
            "description": "Which side of the market to read. Corotos keeps for-sale and to-rent adverts on separate boards that together hold the whole vertical: 20,833 adverts for sale and 11,257 to rent on 2026-09-13. Both reads them together, which is the larger board and the default.",
            "default": "any"
          },
          "propertyType": {
            "title": "🏠 Property type",
            "enum": [
              "all",
              "apartamentos",
              "casas",
              "penthouses",
              "solares-terrenos",
              "casas-vacacionales",
              "oficinas-comerciales",
              "habitaciones-compartidas",
              "otros-inmuebles"
            ],
            "type": "string",
            "description": "Which board to walk. Every type here was fetched and confirmed to return its own narrowed board; a type the portal does not publish is answered with 404 rather than quietly widened, so a wrong value stops the run instead of billing you for the whole corpus. Apartments is the deep board at 11,845 for sale and 5,484 to rent; offices and commercial premises hold 5,148, houses 3,994, land and plots 2,950 and holiday homes 1,165. Penthouses are the one type the portal files under two different…",
            "default": "all"
          },
          "location": {
            "title": "📍 Province or town",
            "enum": [
              "any",
              "azua",
              "barahona",
              "dajabon",
              "duarte",
              "el-seibo",
              "elias-pina",
              "espaillat",
              "hato-mayor",
              "hermanas-mirabal",
              "independencia",
              "la-altagracia",
              "la-romana",
              "la-vega",
              "maria-trinidad-sanchez",
              "monsenor-nouel",
              "monte-cristi",
              "monte-plata",
              "pedernales",
              "peravia",
              "puerto-plata",
              "samana",
              "san-cristobal",
              "san-jose-de-ocoa",
              "san-juan",
              "san-pedro-de-macoris",
              "sanchez-ramirez",
              "santiago",
              "santiago-rodriguez",
              "santo-domingo",
              "valverde",
              "azua/azua",
              "azua/otras-ciudades",
              "barahona/barahona",
              "barahona/otras-ciudades",
              "dajabon/dajabon",
              "dajabon/otras-ciudades",
              "duarte/san-francisco-de-macoris",
              "duarte/otras-ciudades",
              "el-seibo/otras-ciudades",
              "el-seibo/el-seibo",
              "elias-pina/otras-ciudades",
              "espaillat/moca",
              "espaillat/otras-ciudades",
              "hato-mayor/hato-mayor",
              "hato-mayor/otras-ciudades",
              "hermanas-mirabal/salcedo",
              "hermanas-mirabal/otras-ciudades",
              "independencia/otras-ciudades",
              "la-altagracia/bavaropunta-cana",
              "la-altagracia/otras-ciudades",
              "la-altagracia/bayahibe",
              "la-romana/la-romana",
              "la-romana/otras-ciudades",
              "la-vega/jarabacoa",
              "la-vega/constanza",
              "la-vega/la-vega",
              "la-vega/otras-ciudades",
              "maria-trinidad-sanchez/nagua",
              "maria-trinidad-sanchez/otras-ciudades",
              "monsenor-nouel/bonao",
              "monsenor-nouel/otras-ciudades",
              "monte-cristi/monte-cristi",
              "monte-cristi/otras-ciudades",
              "monte-plata/monte-plata",
              "monte-plata/otras-ciudades",
              "pedernales/pedernales",
              "peravia/bani",
              "peravia/otras-ciudades",
              "puerto-plata/puerto-plata",
              "puerto-plata/sosua",
              "puerto-plata/otras-ciudades",
              "puerto-plata/luperon",
              "samana/las-terrenas",
              "samana/samana",
              "samana/otras-ciudades",
              "san-cristobal/san-cristobal",
              "san-cristobal/villa-altagracia",
              "san-cristobal/otras-ciudades",
              "san-jose-de-ocoa/san-jose-de-ocoa",
              "san-jose-de-ocoa/otras-ciudades",
              "san-juan/san-juan-de-la-maguana",
              "san-juan/otras-ciudades",
              "san-juan/las-matas-de-farfan",
              "san-pedro-de-macoris/san-pedro-de-macoris",
              "san-pedro-de-macoris/juan-dolio",
              "san-pedro-de-macoris/guayacanes",
              "san-pedro-de-macoris/otras-ciudades",
              "sanchez-ramirez/cotui",
              "sanchez-ramirez/otras-ciudades",
              "santiago/santiago-de-los-caballeros",
              "santiago/otras-ciudades",
              "santiago-rodriguez/otras-ciudades",
              "santiago-rodriguez/sabaneta",
              "santo-domingo/distrito-nacional",
              "santo-domingo/santo-domingo-este",
              "santo-domingo/santo-domingo-oeste",
              "santo-domingo/santo-domingo-norte",
              "santo-domingo/otras-ciudades",
              "santo-domingo/boca-chica",
              "santo-domingo/guerra",
              "valverde/mao",
              "valverde/otras-ciudades"
            ],
            "type": "string",
            "description": "Where to look. The list is the portal's own place index, and every entry was fetched against the 32,090-advert national board to confirm it narrows the result set — five town slugs that the portal publishes but which carry no property at all were dropped, and so was a duplicate name for Santo Domingo city. Provinces come first, then the towns inside each one. Distrito Nacional is the deep market at 18,615 adverts, then Santo Domingo Este, Santiago de los Caballeros and Bávaro / Punta Cana.",
            "default": "any"
          },
          "searchText": {
            "title": "🔎 Free-text search",
            "type": "string",
            "description": "Optional words to match inside the advert, exactly as the portal's own search box takes them — 'piscina', 'Confotur', 'amueblado', 'planos'. Leave empty to read the whole board. The portal matches these server-side, so a word no advert carries returns nothing rather than everything.",
            "default": ""
          },
          "minPrice": {
            "title": "💵 Minimum price (DOP)",
            "type": "integer",
            "description": "Lowest asking price to keep, in Dominican pesos. Corotos stores every advert against a peso-normalised price column and filters on that, so this bound applies to dollar-priced adverts too, converted by the portal. 0 means no lower bound.",
            "default": 0
          },
          "maxPrice": {
            "title": "💵 Maximum price (DOP)",
            "type": "integer",
            "description": "Highest asking price to keep, in Dominican pesos, on the same peso-normalised column as the minimum. 0 means no upper bound.",
            "default": 0
          },
          "minAreaSqm": {
            "title": "📐 Minimum built area (m²)",
            "type": "integer",
            "description": "Smallest built area to keep, in square metres. 0 means no lower bound.",
            "default": 0
          },
          "maxAreaSqm": {
            "title": "📐 Maximum built area (m²)",
            "type": "integer",
            "description": "Largest built area to keep, in square metres. 0 means no upper bound.",
            "default": 0
          },
          "minBedrooms": {
            "title": "🛏️ Minimum bedrooms",
            "type": "integer",
            "description": "Fewest bedrooms to keep. 0 means no lower bound.",
            "default": 0
          },
          "minBathrooms": {
            "title": "🛁 Minimum bathrooms",
            "type": "integer",
            "description": "Fewest full bathrooms to keep. Half-bathrooms are counted separately by the portal and are not included here. 0 means no lower bound.",
            "default": 0
          },
          "condition": {
            "title": "🏗️ Building condition",
            "enum": [
              "any",
              "Primer Uso",
              "Segundo Uso",
              "Nuevo",
              "En construcción",
              "En planos",
              "Otros"
            ],
            "type": "string",
            "description": "How far along the building is. Most adverts declare no condition at all, so choosing one narrows the board sharply — on the apartments-for-sale board these six values return 1,331, 1,252, 864, 632, 220 and 499 adverts out of 11,844. Three of them are not offered by the portal's own filter panel; they were found by testing the values that appear on advert pages, and each was confirmed to return real adverts.",
            "default": "any"
          },
          "advertiser": {
            "title": "👤 Advertiser",
            "enum": [
              "anyone",
              "shops",
              "verified"
            ],
            "type": "string",
            "description": "Who placed the advert. Registered shops and agencies removes private sellers; verified accounts keeps only advertisers Corotos has identity-checked. On the apartments-for-sale board these drop the count from 11,844 to 10,967 and 10,344 respectively, so both narrow the board rather than being decorative.",
            "default": "anyone"
          },
          "sortBy": {
            "title": "↕️ Order",
            "enum": [
              "recent",
              "relevance",
              "price-asc",
              "price-desc"
            ],
            "type": "string",
            "description": "The order the portal returns the board in. This matters when you cap the run below the board size, because the cap keeps the first N in this order. Price ordering runs on the peso-normalised price, so dollar and peso adverts interleave correctly rather than forming two separate ladders.",
            "default": "recent"
          },
          "searchUrls": {
            "title": "🔗 Or paste Corotos URLs",
            "type": "array",
            "description": "Paste Corotos result-page addresses to use them verbatim instead of the pickers above. Use this to reach a board the pickers do not cover. Each address is walked from its first page, and anything already in the address — filters, ordering, place — is left exactly as you wrote it.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "listingUrls": {
            "title": "🔗 Advert URLs (Property Detail)",
            "type": "array",
            "description": "Corotos advert addresses to open, one per line, for the Property Detail operation. They look like https://www.corotos.com.do/anuncio/inmuebles-en-venta/apartamentos/some-title-kdj6prz. An address the portal no longer publishes comes back as a clearly-marked error row and is not charged.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "🔢 Maximum adverts",
            "type": "integer",
            "description": "How many adverts to return before the run stops. Adverts arrive 24 to a request and the deepest board runs to 1,338 pages, so raise this to read a whole market and leave it low to sample one. Nothing beyond this number is fetched, saved or charged.",
            "default": 100
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}