{
  "openapi": "3.0.1",
  "info": {
    "title": "Crexi Commercial Real Estate Scraper & Deal Screener",
    "description": "Scrape Crexi commercial real-estate listings and underwrite them: price/SF, price/unit, DSCR, debt yield, cash-on-cash and a transparent 0-100 Deal Score.",
    "version": "1.0",
    "x-build-id": "dw0gaS2fzxWdcOhiB"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/zapticx~crexi-investment-analyzer/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-zapticx-crexi-investment-analyzer",
        "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/zapticx~crexi-investment-analyzer/runs": {
      "post": {
        "operationId": "runs-sync-zapticx-crexi-investment-analyzer",
        "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/zapticx~crexi-investment-analyzer/run-sync": {
      "post": {
        "operationId": "run-sync-zapticx-crexi-investment-analyzer",
        "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": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "urls",
              "dealFinder"
            ],
            "type": "string",
            "description": "Property Search finds listings by location and filters. Analyze Listing URLs extracts deep data for specific Crexi listings you already have. Deal Finder screens and ranks listings by investment quality -- it needs financing assumptions AND a Crexi-disclosed cap rate or NOI, which public listings currently do not carry.",
            "default": "search"
          },
          "cities": {
            "title": "Cities",
            "type": "array",
            "description": "City names, e.g. Dallas. Crexi matches city names against neighborhoods and nearby suburbs as well as the city itself, and the same name recurs across states (Dallas exists in TX, GA and NC). Always pair a city with its state below for precise geographic targeting.",
            "items": {
              "type": "string"
            }
          },
          "states": {
            "title": "States",
            "type": "array",
            "description": "Two-letter codes (TX) or full names (Texas).",
            "items": {
              "type": "string"
            }
          },
          "zipCodes": {
            "title": "ZIP codes",
            "type": "array",
            "description": "Optional. Narrows the search to specific ZIP codes.",
            "items": {
              "type": "string"
            }
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Leave empty to include every asset class.",
            "items": {
              "type": "string",
              "enum": [
                "Retail",
                "Office",
                "Industrial",
                "Multifamily",
                "Land",
                "Mixed Use",
                "Special Purpose",
                "Hospitality",
                "Self Storage",
                "Mobile Home Park",
                "Senior Living",
                "Note/Loan"
              ]
            }
          },
          "listingType": {
            "title": "Listing status",
            "enum": [
              "all",
              "underContract"
            ],
            "type": "string",
            "description": "All listings, or only those already under contract / contract pending.",
            "default": "all"
          },
          "minPrice": {
            "title": "Minimum asking price (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Leave empty for no lower bound."
          },
          "maxPrice": {
            "title": "Maximum asking price (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Leave empty for no upper bound."
          },
          "minCapRate": {
            "title": "Minimum cap rate (%)",
            "type": "string",
            "description": "In percent, e.g. 6.5. Crexi applies this filter server-side, so results really are restricted to listings whose cap rate meets it -- but Crexi no longer discloses cap rate or NOI values to anonymous callers, so source.capRate will still be null. Use this to narrow WHICH listings you get, not to obtain the figure itself."
          },
          "maxCapRate": {
            "title": "Maximum cap rate (%)",
            "type": "string",
            "description": "In percent, e.g. 12. Applied server-side by Crexi like the minimum. The cap rate value itself is not disclosed publicly and is returned as null."
          },
          "includeUnpriced": {
            "title": "Include listings with no published price",
            "type": "boolean",
            "description": "Many Crexi listings are marketed without an asking price. These cannot be financially analysed and are excluded by default.",
            "default": false
          },
          "opportunityZoneOnly": {
            "title": "Opportunity Zone listings only",
            "type": "boolean",
            "description": "Restricts results to listings Crexi flags as being inside a designated Qualified Opportunity Zone.",
            "default": false
          },
          "listingUrls": {
            "title": "Crexi listing URLs",
            "type": "array",
            "description": "Used only in 'Analyze Listing URLs' mode. Paste full listing URLs, e.g. https://www.crexi.com/properties/2522223/georgia-glenrose-apartments",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Maximum results",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Number of listings to return. Crexi limits any single query to 1,499 results; beyond that this Actor automatically splits the search into smaller queries and merges them.",
            "default": 50
          },
          "sortBy": {
            "title": "Sort results by",
            "enum": [
              "newest",
              "priceAsc",
              "priceDesc",
              "capRateDesc",
              "dealScoreDesc"
            ],
            "type": "string",
            "description": "Sorting is applied by this Actor after collection, because Crexi's API does not provide reliable server-side sorting.",
            "default": "newest"
          },
          "includeInvestmentAnalysis": {
            "title": "Calculate investment metrics & Deal Score",
            "type": "boolean",
            "description": "Adds calculated metrics (price/SF, price/unit, loan sizing, debt service, DSCR, debt yield, cash-on-cash, Deal Score) in a separate 'analysis' object. Yield metrics need a cap rate or NOI from Crexi, which is currently withheld from public data, so in practice expect price-based figures only. Billing follows what is actually produced: a listing is charged the premium 'listing-analyzed' event only when real yield analysis was computed, otherwise the basic 'listing-scraped' event.",
            "default": true
          },
          "includeBrokerDetails": {
            "title": "Include broker details",
            "type": "boolean",
            "description": "Adds publicly listed broker name, brokerage, licence numbers and profile URL. Crexi does not publish broker phone numbers or emails, so those are not included.",
            "default": true
          },
          "includeImages": {
            "title": "Include property images",
            "type": "boolean",
            "description": "Adds full-resolution image URLs.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Maximum concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Parallel requests to Crexi. Lower this if you see rate-limit warnings.",
            "default": 8
          },
          "downPaymentPercent": {
            "title": "Down payment (%)",
            "type": "string",
            "description": "Required for DSCR, debt yield and cash-on-cash. Without financing inputs these metrics are returned as null with a stated reason - never guessed. Decimals are supported.",
            "default": "25"
          },
          "interestRatePercent": {
            "title": "Interest rate (%)",
            "type": "string",
            "description": "Annual nominal rate, e.g. 6.75. Decimals are supported.",
            "default": "7.0"
          },
          "amortizationYears": {
            "title": "Amortization period (years)",
            "minimum": 1,
            "type": "integer",
            "description": "Used to compute the monthly payment.",
            "default": 25
          },
          "loanTermYears": {
            "title": "Loan term (years)",
            "minimum": 1,
            "type": "integer",
            "description": "Optional. Falls back to the amortization period when omitted."
          },
          "closingCostsPercent": {
            "title": "Closing costs (% of price)",
            "type": "string",
            "description": "Included in total cash required and therefore in cash-on-cash return. Decimals are supported.",
            "default": "2"
          },
          "additionalAnnualExpenses": {
            "title": "Additional annual expenses (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Subtracted from NOI before debt service, e.g. capital reserves."
          },
          "minDscr": {
            "title": "Minimum DSCR",
            "type": "string",
            "description": "Deal Finder screening. Drops listings whose DSCR falls below this, e.g. 1.25. DSCR needs a Crexi-disclosed cap rate or NOI, which public listings currently do not carry, so this filter will usually leave nothing to evaluate. Listings that cannot be evaluated are reported separately from listings that genuinely failed."
          },
          "minDealScore": {
            "title": "Minimum Deal Score (0-100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Deal Finder screening. Drops listings scoring below this threshold. Like minDscr, this needs Crexi-disclosed cap rate or NOI, which is currently unavailable in public data."
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. Enable Apify Proxy if Crexi rate-limits or blocks requests from your run.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}