{
  "openapi": "3.0.1",
  "info": {
    "title": "Crexi Scraper - Commercial Real Estate, Prices & Broker Leads",
    "description": "Scrape Crexi commercial real estate — for-sale & auction CRE listings with asking prices, price/SqFt, cap rate, financials, photos & geo, plus deduped broker leads (brokerage, license, phone). Keyless, no browser. Filter by location, type & price; monitor new listings & price drops.",
    "version": "0.1",
    "x-build-id": "sRDX9Dax4Ty40o2eP"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapesage~crexi-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapesage-crexi-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/scrapesage~crexi-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapesage-crexi-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/scrapesage~crexi-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapesage-crexi-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": [
          "outputType"
        ],
        "properties": {
          "outputType": {
            "title": "What to scrape",
            "enum": [
              "search",
              "propertyDetail",
              "brokerLeads"
            ],
            "type": "string",
            "description": "search = commercial real estate listings (the headline mode). propertyDetail = look up full property records by Crexi ID or URL. brokerLeads = deduped CRE broker contact leads sourced from the matching listings.",
            "default": "search"
          },
          "searchText": {
            "title": "Search text (keyword / area)",
            "type": "string",
            "description": "Free-text query matched across property name, description and area — e.g. \"Austin\", \"gas station\", \"medical office\", a ZIP or an address. Combine with the precise State and Property type filters below. Leave empty to browse the whole marketplace."
          },
          "states": {
            "title": "States",
            "type": "array",
            "description": "Filter listings by US state — 2-letter codes (TX, CA, FL) or full names (Texas). Leave empty for all states. This is the precise location filter (Search text alone is a loose keyword match).",
            "items": {
              "type": "string"
            }
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Filter by CRE property type. Valid values: Multifamily, Office, Retail, Industrial, Hospitality, Land, Special Purpose, Mixed Use, Self Storage, Mobile Home Park, Senior Living, Note/Loan, Business For Sale. Leave empty for all types.",
            "items": {
              "type": "string",
              "enum": [
                "Multifamily",
                "Office",
                "Retail",
                "Industrial",
                "Hospitality",
                "Land",
                "Special Purpose",
                "Mixed Use",
                "Self Storage",
                "Mobile Home Park",
                "Senior Living",
                "Note/Loan",
                "Business For Sale"
              ],
              "enumTitles": [
                "Multifamily (Multifamily)",
                "Office (Office)",
                "Retail (Retail)",
                "Industrial (Industrial)",
                "Hospitality (Hospitality)",
                "Land (Land)",
                "Special Purpose (Special Purpose)",
                "Mixed Use (Mixed Use)",
                "Self Storage (Self Storage)",
                "Mobile Home Park (Mobile Home Park)",
                "Senior Living (Senior Living)",
                "Note/Loan (Note/Loan)",
                "Business For Sale (Business For Sale)"
              ]
            }
          },
          "askingPriceMin": {
            "title": "Asking price — min (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings with an asking price at or above this value. Set \"Include unpriced\" off to exclude call-for-offer / unpriced listings."
          },
          "askingPriceMax": {
            "title": "Asking price — max (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings with an asking price at or below this value."
          },
          "includeUnpriced": {
            "title": "Include unpriced listings",
            "type": "boolean",
            "description": "Include listings marketed without a public asking price (\"Contact for price\" / auctions / call-for-offers). Turn off to keep only priced listings.",
            "default": true
          },
          "assetIds": {
            "title": "Property IDs (propertyDetail mode)",
            "type": "array",
            "description": "For outputType = propertyDetail or brokerLeads: numeric Crexi asset IDs (the number in a /properties/<id>/<slug> URL).",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Crexi URLs (optional)",
            "type": "array",
            "description": "Paste Crexi listing URLs (https://www.crexi.com/properties/<id>/<slug>) to scrape them directly. Works alongside the filters above and in any mode.",
            "items": {
              "type": "string"
            }
          },
          "includePropertyDetails": {
            "title": "Include full property details (search mode)",
            "type": "boolean",
            "description": "In search mode, fetch each listing's full record (marketing description, cap rate / NOI / tenancy / year built / zoning and all other financial & physical attributes, plus the photo gallery). Off = faster, card-level listings only. When on, each record is billed as a property detail.",
            "default": true
          },
          "includeBrokerLeads": {
            "title": "Also output broker leads",
            "type": "boolean",
            "description": "In search / propertyDetail mode, also emit one deduped CRE broker lead per listing broker (name, brokerage, license, phone, profile, lead score). The dedicated \"Broker leads\" mode outputs only leads.",
            "default": false
          },
          "maxPhotos": {
            "title": "Max photos per property",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Cap on high-resolution gallery image URLs collected per property (detail records only).",
            "default": 25
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Overall cap on the number of listings (or leads) collected for this run.",
            "default": 100
          },
          "monitorMode": {
            "title": "Monitor mode (only new / changed)",
            "type": "boolean",
            "description": "Remember what was emitted in previous runs (in a named key-value store) and output only NEW or CHANGED listings — new listings, price drops/rises, status changes (e.g. on-market → sold). Perfect for scheduled CRE deal-flow and price-watch alerts. Each record carries a monitorReason field.",
            "default": false
          },
          "monitorKey": {
            "title": "Monitor key",
            "type": "string",
            "description": "Namespace for monitor memory. Use a distinct key per saved search so separate watch lists don't share state.",
            "default": "default"
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Parallel requests. The actor rotates a fresh proxy IP per request; lower this if you hit throttling.",
            "default": 6
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy settings. Apify Proxy (datacenter) is recommended and enabled by default — Crexi's public API is clean from datacenter IPs with fresh-session rotation.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}