{
  "data": {
    "id": "5ypeDDF6QAFcBxctx",
    "actId": "OkQ64Eh2mcGjYVOSn",
    "userId": "EMm4UhWinN76trbOb",
    "startedAt": "2026-08-10T02:29:51.544Z",
    "finishedAt": "2026-08-10T02:29:53.938Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 2323,
      "runTimeSecs": 2.323,
      "computeUnits": 0.0025811111111111113,
      "imageSizeBytes": 2459469824
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Crexi Scraper — input\",\n  \"description\": \"Search public Crexi commercial real estate listings by market or by URL.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"city\": {\n      \"sectionCaption\": \"🔎 Manual mode — leave empty when using Crexi URLs\",\n      \"sectionDescription\": \"Enter a US city or county and state, or leave City empty for a statewide search.\",\n      \"title\": \"🏙️ City or county\",\n      \"type\": \"string\",\n      \"editor\": \"textfield\",\n      \"description\": \"Optional city or county within the selected state. Leave empty to search the entire state.\",\n      \"maxLength\": 256,\n      \"prefill\": \"Austin\"\n    },\n    \"state\": {\n      \"title\": \"🇺🇸 State\",\n      \"type\": \"string\",\n      \"editor\": \"textfield\",\n      \"description\": \"US state code or name, for example TX or California. Required for manual searches.\",\n      \"maxLength\": 64,\n      \"prefill\": \"TX\",\n      \"pattern\": \"^\\\\s*(?:[Aa][Ll]|[Aa][Kk]|[Aa][Zz]|[Aa][Rr]|[Cc][Aa]|[Cc][Oo]|[Cc][Tt]|[Dd][Ee]|[Ff][Ll]|[Gg][Aa]|[Hh][Ii]|[Ii][Dd]|[Ii][Ll]|[Ii][Nn]|[Ii][Aa]|[Kk][Ss]|[Kk][Yy]|[Ll][Aa]|[Mm][Ee]|[Mm][Dd]|[Mm][Aa]|[Mm][Ii]|[Mm][Nn]|[Mm][Ss]|[Mm][Oo]|[Mm][Tt]|[Nn][Ee]|[Nn][Vv]|[Nn][Hh]|[Nn][Jj]|[Nn][Mm]|[Nn][Yy]|[Nn][Cc]|[Nn][Dd]|[Oo][Hh]|[Oo][Kk]|[Oo][Rr]|[Pp][Aa]|[Rr][Ii]|[Ss][Cc]|[Ss][Dd]|[Tt][Nn]|[Tt][Xx]|[Uu][Tt]|[Vv][Tt]|[Vv][Aa]|[Ww][Aa]|[Ww][Vv]|[Ww][Ii]|[Ww][Yy]|[Dd][Cc]|[Aa][Ll][Aa][Bb][Aa][Mm][Aa]|[Aa][Ll][Aa][Ss][Kk][Aa]|[Aa][Rr][Ii][Zz][Oo][Nn][Aa]|[Aa][Rr][Kk][Aa][Nn][Ss][Aa][Ss]|[Cc][Aa][Ll][Ii][Ff][Oo][Rr][Nn][Ii][Aa]|[Cc][Oo][Ll][Oo][Rr][Aa][Dd][Oo]|[Cc][Oo][Nn][Nn][Ee][Cc][Tt][Ii][Cc][Uu][Tt]|[Dd][Ee][Ll][Aa][Ww][Aa][Rr][Ee]|[Ff][Ll][Oo][Rr][Ii][Dd][Aa]|[Gg][Ee][Oo][Rr][Gg][Ii][Aa]|[Hh][Aa][Ww][Aa][Ii][Ii]|[Ii][Dd][Aa][Hh][Oo]|[Ii][Ll][Ll][Ii][Nn][Oo][Ii][Ss]|[Ii][Nn][Dd][Ii][Aa][Nn][Aa]|[Ii][Oo][Ww][Aa]|[Kk][Aa][Nn][Ss][Aa][Ss]|[Kk][Ee][Nn][Tt][Uu][Cc][Kk][Yy]|[Ll][Oo][Uu][Ii][Ss][Ii][Aa][Nn][Aa]|[Mm][Aa][Ii][Nn][Ee]|[Mm][Aa][Rr][Yy][Ll][Aa][Nn][Dd]|[Mm][Aa][Ss][Ss][Aa][Cc][Hh][Uu][Ss][Ee][Tt][Tt][Ss]|[Mm][Ii][Cc][Hh][Ii][Gg][Aa][Nn]|[Mm][Ii][Nn][Nn][Ee][Ss][Oo][Tt][Aa]|[Mm][Ii][Ss][Ss][Ii][Ss][Ss][Ii][Pp][Pp][Ii]|[Mm][Ii][Ss][Ss][Oo][Uu][Rr][Ii]|[Mm][Oo][Nn][Tt][Aa][Nn][Aa]|[Nn][Ee][Bb][Rr][Aa][Ss][Kk][Aa]|[Nn][Ee][Vv][Aa][Dd][Aa]|[Nn][Ee][Ww]\\\\s+[Hh][Aa][Mm][Pp][Ss][Hh][Ii][Rr][Ee]|[Nn][Ee][Ww]\\\\s+[Jj][Ee][Rr][Ss][Ee][Yy]|[Nn][Ee][Ww]\\\\s+[Mm][Ee][Xx][Ii][Cc][Oo]|[Nn][Ee][Ww]\\\\s+[Yy][Oo][Rr][Kk]|[Nn][Oo][Rr][Tt][Hh]\\\\s+[Cc][Aa][Rr][Oo][Ll][Ii][Nn][Aa]|[Nn][Oo][Rr][Tt][Hh]\\\\s+[Dd][Aa][Kk][Oo][Tt][Aa]|[Oo][Hh][Ii][Oo]|[Oo][Kk][Ll][Aa][Hh][Oo][Mm][Aa]|[Oo][Rr][Ee][Gg][Oo][Nn]|[Pp][Ee][Nn][Nn][Ss][Yy][Ll][Vv][Aa][Nn][Ii][Aa]|[Rr][Hh][Oo][Dd][Ee]\\\\s+[Ii][Ss][Ll][Aa][Nn][Dd]|[Ss][Oo][Uu][Tt][Hh]\\\\s+[Cc][Aa][Rr][Oo][Ll][Ii][Nn][Aa]|[Ss][Oo][Uu][Tt][Hh]\\\\s+[Dd][Aa][Kk][Oo][Tt][Aa]|[Tt][Ee][Nn][Nn][Ee][Ss][Ss][Ee][Ee]|[Tt][Ee][Xx][Aa][Ss]|[Uu][Tt][Aa][Hh]|[Vv][Ee][Rr][Mm][Oo][Nn][Tt]|[Vv][Ii][Rr][Gg][Ii][Nn][Ii][Aa]|[Ww][Aa][Ss][Hh][Ii][Nn][Gg][Tt][Oo][Nn]|[Ww][Ee][Ss][Tt]\\\\s+[Vv][Ii][Rr][Gg][Ii][Nn][Ii][Aa]|[Ww][Ii][Ss][Cc][Oo][Nn][Ss][Ii][Nn]|[Ww][Yy][Oo][Mm][Ii][Nn][Gg]|[Dd][Ii][Ss][Tt][Rr][Ii][Cc][Tt]\\\\s+[Oo][Ff]\\\\s+[Cc][Oo][Ll][Uu][Mm][Bb][Ii][Aa])\\\\s*$\"\n    },\n    \"assetClasses\": {\n      \"title\": \"🎯 Asset class\",\n      \"type\": \"array\",\n      \"description\": \"Restrict the search to specific commercial property types. Leave empty to include all supported classes.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"office\",\n          \"retail\",\n          \"industrial\",\n          \"multifamily\",\n          \"land\",\n          \"hotel\",\n          \"mixed-use\",\n          \"specialty\"\n        ],\n        \"enumTitles\": [\n          \"🏢 Office\",\n          \"🛍️ Retail\",\n          \"🏭 Industrial\",\n          \"🏠 Multifamily\",\n          \"🌾 Land\",\n          \"🏨 Hotel\",\n          \"🏗️ Mixed-use\",\n          \"🎯 Specialty\"\n        ]\n      },\n      \"default\": []\n    },\n    \"transactionTypes\": {\n      \"title\": \"💼 Transaction type\",\n      \"type\": \"array\",\n      \"description\": \"Choose for-sale listings, for-lease spaces, or both. Selecting both returns separate rows for each public transaction type.\",\n      \"editor\": \"select\",\n      \"minItems\": 1,\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"sale\",\n          \"lease\"\n        ],\n        \"enumTitles\": [\n          \"🛒 For sale (purchase)\",\n          \"🏷️ For lease (rent)\"\n        ]\n      },\n      \"default\": [\n        \"sale\"\n      ]\n    },\n    \"maxResults\": {\n      \"title\": \"🔢 Maximum results\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of valid Crexi listings to target. Actual output depends on the available inventory and your filters.\",\n      \"minimum\": 1,\n      \"default\": 200\n    },\n    \"includeListingDetails\": {\n      \"sectionCaption\": \"📋 Public listing enrichment (optional)\",\n      \"sectionDescription\": \"Adds richer public listing and broker information when available. It is slower; unavailable contact fields remain clearly marked as not public.\",\n      \"title\": \"Public broker contacts & listing details\",\n      \"type\": \"boolean\",\n      \"description\": \"Fetch public Crexi detail pages and endpoints for additional listing and broker fields. Keep disabled for the fastest bulk export.\",\n      \"default\": false\n    },\n    \"proxyConfiguration\": {\n      \"sectionCaption\": \"⚙️ Managed network access — leave as-is\",\n      \"sectionDescription\": \"Apify supplies the proxy used for public Crexi requests. You do not need Crexi cookies, a connected session, or scraping credentials.\",\n      \"title\": \"Apify proxy (managed)\",\n      \"type\": \"object\",\n      \"description\": \"Uses Apify's residential proxy pool in the United States. Keep the default unchanged for reliable runs.\",\n      \"editor\": \"proxy\",\n      \"default\": {\n        \"useApifyProxy\": true,\n        \"apifyProxyGroups\": [\n          \"RESIDENTIAL\"\n        ],\n        \"apifyProxyCountry\": \"US\"\n      }\n    },\n    \"startUrls\": {\n      \"sectionCaption\": \"🔗 URL mode — Crexi URLs take priority\",\n      \"sectionDescription\": \"Paste an official Crexi search or listing URL. URL mode overrides the manual search fields.\",\n      \"title\": \"🔗 Crexi search or listing URLs (optional)\",\n      \"type\": \"array\",\n      \"maxItems\": 200,\n      \"description\": \"Paste one or more complete public Crexi search or direct listing URLs. Supported filters remain enforced; an unsupported advanced filter may broaden results and produce a partial run summary.\",\n      \"editor\": \"schemaBased\",\n      \"items\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"required\": [\n          \"url\"\n        ],\n        \"properties\": {\n          \"url\": {\n            \"title\": \"Crexi URL\",\n            \"type\": \"string\",\n            \"description\": \"Complete public Crexi HTTP(S) search or listing URL.\",\n            \"maxLength\": 32768,\n            \"pattern\": \"^https?://.+\",\n            \"errorMessage\": {\n              \"pattern\": \"Enter a complete public Crexi HTTP(S) URL.\"\n            }\n          }\n        }\n      },\n      \"default\": []\n    },\n    \"priceMin\": {\n      \"sectionCaption\": \"💰 Price, return & size filters (optional)\",\n      \"sectionDescription\": \"Optional filters for sale price, estimated annual lease rent, cap rate and building size. When a numeric filter is set, a listing must expose a finite comparable value for that filter.\",\n      \"title\": \"Minimum price / annual lease rent (USD)\",\n      \"type\": \"number\",\n      \"description\": \"Lower bound. For sale listings, enter the total asking price. For lease listings, enter comparable annual rent.\",\n      \"minimum\": 0\n    },\n    \"priceMax\": {\n      \"title\": \"Maximum price / annual lease rent (USD)\",\n      \"type\": \"number\",\n      \"description\": \"Upper bound. For sale listings, enter the total asking price. For lease listings, enter comparable annual rent.\",\n      \"minimum\": 0\n    },\n    \"capRateMin\": {\n      \"title\": \"Minimum cap rate (%)\",\n      \"type\": \"number\",\n      \"description\": \"Lower bound on the normalized cap rate, expressed as a percentage.\",\n      \"minimum\": 0\n    },\n    \"capRateMax\": {\n      \"title\": \"Maximum cap rate (%)\",\n      \"type\": \"number\",\n      \"description\": \"Upper bound on the normalized cap rate, expressed as a percentage.\",\n      \"minimum\": 0\n    },\n    \"buildingSizeMin\": {\n      \"title\": \"Minimum building size (sq ft)\",\n      \"type\": \"number\",\n      \"description\": \"Lower bound on building or available size in square feet.\",\n      \"minimum\": 0\n    },\n    \"buildingSizeMax\": {\n      \"title\": \"Maximum building size (sq ft)\",\n      \"type\": \"number\",\n      \"description\": \"Upper bound on building or available size in square feet.\",\n      \"minimum\": 0\n    },\n    \"outputSortBy\": {\n      \"sectionCaption\": \"📊 Output organization\",\n      \"sectionDescription\": \"Choose an optional final ordering to make exports easier to scan.\",\n      \"title\": \"Sort output by\",\n      \"type\": \"string\",\n      \"description\": \"Choose the ordering of valid Crexi rows in the output dataset.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"source_default\",\n        \"building_size_asc\",\n        \"building_size_desc\",\n        \"asking_amount_asc\",\n        \"asking_amount_desc\",\n        \"days_on_market_asc\",\n        \"days_on_market_desc\"\n      ],\n      \"enumTitles\": [\n        \"Source/default order\",\n        \"Building size: small to large\",\n        \"Building size: large to small\",\n        \"Asking amount: low to high\",\n        \"Asking amount: high to low\",\n        \"Days on market: newest first\",\n        \"Days on market: oldest first\"\n      ],\n      \"default\": \"source_default\"\n    }\n  }\n}",
    "readme": "# Crexi Listings Scraper — Sale & Lease Commercial Real Estate Data\n\n> **Scrape public Crexi listings for sale and lease.** Turn a market search or official Crexi URL into a clean, validated dataset with asking terms, property facts, cap-rate and size fields, source links, and public broker details when available.\n\n> **Two ways to run it.** Search manually by U.S. state, city, or county and filters, or paste one or more public Crexi search or listing URLs. URL mode takes priority.\n\n<a href=\"https://apify.com/kazkn/crexi-search-actor?fpr=8fp2od\">\n  <img src=\"https://api.apify.com/v2/key-value-stores/wTxgQ9qIPXv6jmGvM/records/CREXI_README_HERO_NEON_V2\" width=\"760\" alt=\"Fragmented public Crexi listing research transformed into a clean validated commercial real estate dataset\" />\n</a>\n\n<sub>Original conceptual illustrations generated for this Actor are not Crexi screenshots and do not imply Crexi endorsement.</sub>\n\n> **Built for faster CRE research.** Give acquisition teams, brokers, investors, analysts, and data operators a structured starting point for market screening, deal sourcing, underwriting, outreach preparation, and downstream data workflows.\n\nThis unofficial Actor is not affiliated with, sponsored by, or endorsed by Crexi. It works with public data and requires no Crexi cookies, connected Crexi session, Crexi API key, or user-supplied scraping credentials.\n\n<table style=\"width:100%;border-collapse:collapse;table-layout:fixed\">\n<tr>\n<td colspan=\"4\" style=\"padding:10px 14px;background:#031A2C;border:none;border-radius:4px 4px 0 0\">\n<span style=\"color:#F3FAFF;font-size:14px;font-weight:700;letter-spacing:0.5px\">KazKN · Data intelligence suite</span>\n<span style=\"color:#BFD9E8;font-size:13px\">&nbsp;&nbsp;&bull;&nbsp;&nbsp;CRE listings, Crexi search, Vinted arbitrage, Shopify intelligence</span>\n</td>\n</tr>\n<tr>\n<td style=\"padding:10px 12px;border:1px solid #B8D7E8;background:#DDF3FF;border-right:none;border-top:none;vertical-align:top;width:25%;overflow-wrap:anywhere\">\n<span><img src=\"https://images.apifyusercontent.com/JljmsVBsqZbvcsxNEaKFoAEl3VN9PR5oVoT3KxNbBnE/rs:fill:76:76/cb:1/aHR0cHM6Ly9hcGlmeS1pbWFnZS11cGxvYWRzLXByb2QuczMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vRU1tNFVoV2luTjc2dHJiT2ItYWN0b3ItT2tRNjRFaDJtY0dqWVZPU24tS2ZuWDVhcXd5ei1DcmV4aV9sb2dvLnBuZw.webp\" width=\"20\" height=\"20\" style=\"vertical-align:middle;border-radius:4px\" alt=\"Crexi Scraper\"> &nbsp;<a href=\"https://apify.com/kazkn/crexi-search-actor?fpr=8fp2od\" style=\"color:#005EA8;text-decoration:none;font-weight:700;font-size:13px\">Crexi Scraper</a></span><br>\n<span style=\"color:#005EA8;font-size:11px;font-weight:600\">&#10148; You are here</span>\n</td>\n<td style=\"background:#F7FBFF;padding:10px 12px;border:1px solid #B8D7E8;border-right:none;border-top:none;vertical-align:top;width:25%;overflow-wrap:anywhere\">\n<span><img src=\"https://images.apifyusercontent.com/p0274x4YcnV6tpq7RySfCrO01PZNvBqu-vPqIVtWQDg/rs:fill:76:76/cb:1/aHR0cHM6Ly9hcGlmeS1pbWFnZS11cGxvYWRzLXByb2QuczMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vRU1tNFVoV2luTjc2dHJiT2ItYWN0b3ItUm5HTk1jVjN2OEFUaFIzYUEtaTNFM3dkMHhYZC1DaGF0R1BUX0ltYWdlXzZfbWFpXzIwMjZfXzE5XzU5XzI3LnBuZw.webp\" width=\"20\" height=\"20\" style=\"vertical-align:middle;border-radius:4px\" alt=\"CRE Intelligence\"> &nbsp;<a href=\"https://apify.com/kazkn/commercial-real-estate-brokerage-intel?fpr=8fp2od\" style=\"color:#031A2C;text-decoration:none;font-weight:700;font-size:13px\">CRE Intelligence</a></span><br>\n<span style=\"color:#526978;font-size:11px\">LoopNet + Crexi · one clean file</span>\n</td>\n<td style=\"background:#F7FBFF;padding:10px 12px;border:1px solid #B8D7E8;border-right:none;border-top:none;vertical-align:top;width:25%;overflow-wrap:anywhere\">\n<span><img src=\"https://images.apifyusercontent.com/bmk5660gpsQw7MPFxAKCn_GfgjpNZhq9utrqOxrlAaw/rs:fill:76:76/cb:1/aHR0cHM6Ly9hcGlmeS1pbWFnZS11cGxvYWRzLXByb2QuczMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vRU1tNFVoV2luTjc2dHJiT2ItYWN0b3ItNFVBUHJ3WmIxWE9sa0NKS0stcGhxNm1Db1FvZy12aW50ZWRfbG9nby5wbmc.webp\" width=\"20\" height=\"20\" style=\"vertical-align:middle;border-radius:4px\" alt=\"Vinted Smart Scraper\"> &nbsp;<a href=\"https://apify.com/kazkn/vinted-smart-scraper?fpr=8fp2od\" style=\"color:#031A2C;text-decoration:none;font-weight:700;font-size:13px\">Vinted Smart Scraper</a></span><br>\n<span style=\"color:#526978;font-size:11px\">Cross-country price arbitrage</span>\n</td>\n<td style=\"background:#F7FBFF;padding:10px 12px;border:1px solid #B8D7E8;border-top:none;vertical-align:top;width:25%;overflow-wrap:anywhere\">\n<span><img src=\"https://images.apifyusercontent.com/16bujimlKPVXa0HDiFaYXdv9pr5wzmU5oAlQmqx2wro/rs:fill:76:76/cb:1/aHR0cHM6Ly9hcGlmeS1pbWFnZS11cGxvYWRzLXByb2QuczMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vRU1tNFVoV2luTjc2dHJiT2ItYWN0b3ItQ2dLc25NdzEyY0xmUFE4QmstOW9xdGthaHMySi1DYXB0dXJlX2RfZV9jcmFuXzIwMjYtMDUtMDFfYV9fMTcuMzcuMDcuanBlZw.webp\" width=\"20\" height=\"20\" style=\"vertical-align:middle;border-radius:4px\" alt=\"Shopify Apps Spy\"> &nbsp;<a href=\"https://apify.com/kazkn/shopify-scraper-apps-spy?fpr=8fp2od\" style=\"color:#031A2C;text-decoration:none;font-weight:700;font-size:13px\">Shopify Apps Spy</a></span><br>\n<span style=\"color:#526978;font-size:11px\">Products, reviews + installed apps</span>\n</td>\n</tr>\n</table>\n\n#### Copy to your AI assistant\n\n```text\nUse Apify Actor `kazkn/crexi-search-actor` to collect public Crexi commercial real estate sale and lease listings into a validated default Dataset. It supports manual U.S. market searches with transaction, asset-class, price, cap-rate, building-size, and sort filters, or URL mode through `startUrls` for public Crexi search and listing URLs; URL mode takes priority. It can optionally enrich rows with public listing and broker details when available. It requires no Crexi cookies, connected Crexi session, Crexi API key, or user-supplied scraping credentials. Use only fields exposed by the Actor specification and treat `maxResults` as a target, not an inventory guarantee.\n```\n\n```json\n{\n  \"city\": \"Austin\",\n  \"state\": \"TX\",\n  \"assetClasses\": [\"office\"],\n  \"transactionTypes\": [\"sale\", \"lease\"],\n  \"maxResults\": 100,\n  \"includeListingDetails\": false,\n  \"outputSortBy\": \"source_default\"\n}\n```\n\n```python\nfrom apify_client import ApifyClient\n\nclient = ApifyClient(\"TOKEN\")\nrun_input = {\n    \"city\": \"Austin\",\n    \"state\": \"TX\",\n    \"assetClasses\": [\"office\"],\n    \"transactionTypes\": [\"sale\", \"lease\"],\n    \"maxResults\": 100,\n    \"includeListingDetails\": False,\n    \"outputSortBy\": \"source_default\",\n}\n\nrun = client.actor(\"kazkn/crexi-search-actor\").call(run_input=run_input)\nitems = client.dataset(run[\"defaultDatasetId\"]).list_items().items\nprint(items)\n```\n\n[Full Actor specifications](https://api.apify.com/v2/acts/kazkn~crexi-search-actor/builds/default)\n\n**Best for:** commercial real estate market research, CRE deal sourcing, acquisition lists, broker lead review, underwriting inputs, cap-rate analysis, comparable-listing exports, Google Sheets/CSV/Excel workflows, CRM enrichment, and data pipelines.\n\n**Explore on Apify:** [Run Actor](https://apify.com/kazkn/crexi-search-actor?fpr=8fp2od) · [Input](https://apify.com/kazkn/crexi-search-actor/input-schema?fpr=8fp2od) · [Output](https://apify.com/kazkn/crexi-search-actor/output-schema?fpr=8fp2od) · [Pricing](https://apify.com/kazkn/crexi-search-actor/pricing?fpr=8fp2od) · [API](https://apify.com/kazkn/crexi-search-actor/api/python?fpr=8fp2od) · [Examples](https://apify.com/kazkn/crexi-search-actor/examples?fpr=8fp2od) · [Support](https://apify.com/kazkn/crexi-search-actor/issues/open?fpr=8fp2od)\n\n## What can this Crexi scraper do?\n\n| Need | What you get |\n|---|---|\n| Crexi scraper | Public Crexi commercial real estate listings in a flat, normalized dataset |\n| Commercial real estate API | Structured rows accessible through Apify API, integrations, exports, and webhooks |\n| Commercial real estate listings scraper | Search by state, city or county, asset class, price, cap rate, size, and transaction type |\n| Sale listings scraper | Public for-sale listings with asking price, property, financial, and source fields when available |\n| Lease listings scraper | Public for-lease spaces with comparable annual rent and property fields when available |\n| Broker data workflow | Public broker name, company, profile, phone, email, and license fields only when sufficiently proven |\n| Cap-rate data | Source-listed cap rate or a comparable rate calculated from source-declared NOI and asking price |\n| Spreadsheet-ready export | Download JSON, CSV, Excel, XML, RSS, or connect the Dataset to a workflow |\n\n## Why use this Crexi commercial real estate scraper?\n\nCommercial real estate teams often repeat the same manual process: open a market, copy listing details, clean the rows, check the asking price, and review broker information. This Actor turns that public Crexi workflow into one repeatable Apify run.\n\n1. 🔎 Search a market such as Austin, Dallas, Phoenix, Miami, Chicago, Los Angeles, or New York.\n2. 💼 Choose for-sale listings, for-lease spaces, or both.\n3. 🎯 Add only the filters that matter: asset class, price or rent, cap rate, and building size.\n4. 📋 Keep public listing and broker enrichment optional so broad exports stay fast.\n5. ✅ Receive validated rows plus a sanitized `RUN_SUMMARY` that explains completion or shortage.\n6. 📤 Export the Dataset to a spreadsheet, CRM, warehouse, BI tool, or your own API.\n\nApify adds the operational layer around the scraper: a point-and-click Input tab, API access, Dataset exports, scheduling, integrations, retries, run history, and spend controls. The Crexi V1 itself intentionally does not claim authenticated data, closed-sale verification, private ownership data, monitoring, or transaction tracking.\n\n### A public Crexi API alternative for market research\n\nIf you need structured public Crexi listings without building a browser workflow yourself, this Actor provides a point-and-click and API-accessible alternative for market research, acquisition screening, broker review, and spreadsheet exports. For broader workflow examples and a combined market-file use case, see the [LoopNet + Crexi Listings API resource hub](https://github.com/Boo-n/loopnet-crexi-listings-api).\n\n## How to scrape Crexi listings\n\n1. Open the [Input tab](https://apify.com/kazkn/crexi-search-actor/input-schema).\n2. Choose **manual search** or **URL mode**.\n3. For manual mode, enter a US state and optionally a city or county.\n4. Select sale, lease, or both, then add the filters you need.\n5. For URL mode, paste one or more complete public Crexi search or direct listing URLs.\n6. Start with a small `maxResults` value and keep public detail enrichment disabled for the first connectivity check.\n7. Run the Actor and inspect both the Dataset and the `RUN_SUMMARY` record.\n8. Download the output or consume it through the [Apify API](https://apify.com/kazkn/crexi-search-actor/api).\n\n### Run the Crexi scraper through the Apify API\n\n#### JavaScript\n\n~~~javascript\nimport { ApifyClient } from 'apify-client';\n\nconst client = new ApifyClient({\n    token: process.env.APIFY_TOKEN,\n});\n\nconst run = await client\n    .actor('kazkn/crexi-search-actor')\n    .call({\n        state: 'TX',\n        city: 'Austin',\n        transactionTypes: ['sale'],\n        assetClasses: ['office'],\n        maxResults: 10,\n        includeListingDetails: false,\n    });\n\nconsole.log('Dataset ID: ' + run.defaultDatasetId);\n~~~\n\n#### Python\n\n~~~python\nimport os\nfrom apify_client import ApifyClient\n\nclient = ApifyClient(os.environ[\"APIFY_TOKEN\"])\n\nrun = client.actor(\"kazkn/crexi-search-actor\").call(run_input={\n    \"state\": \"TX\",\n    \"city\": \"Austin\",\n    \"transactionTypes\": [\"sale\"],\n    \"assetClasses\": [\"office\"],\n    \"maxResults\": 10,\n    \"includeListingDetails\": False,\n})\n\nprint(run[\"defaultDatasetId\"])\n~~~\n\n#### cURL\n\n~~~bash\ncurl -X POST \\\n  \"https://api.apify.com/v2/acts/kazkn~crexi-search-actor/runs?token=$APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"state\": \"TX\",\n    \"city\": \"Austin\",\n    \"transactionTypes\": [\"sale\"],\n    \"assetClasses\": [\"office\"],\n    \"maxResults\": 10,\n    \"includeListingDetails\": false\n  }'\n~~~\n\n## Input\n\nThe [Input tab](https://apify.com/kazkn/crexi-search-actor/input-schema) contains the complete schema, tooltips, accepted values, and friendly Console labels. Use the table below as a quick reference.\n\n| Input field | Purpose | Default or rule |\n|---|---|---|\n| `state` | US state code or English state name for manual mode | Required for manual searches |\n| `city` | Optional city or county inside the selected state | Empty means statewide search |\n| `assetClasses` | Filter office, retail, industrial, multifamily, land, hotel, mixed-use, or specialty | Empty includes supported classes |\n| `transactionTypes` | Select `sale`, `lease`, or both | `sale` |\n| `maxResults` | Global target for valid rows | `200` by default; URL mode accepts up to `1,000`; it is not an inventory guarantee |\n| `includeListingDetails` | Fetch additional public listing and broker fields | `false` |\n| `startUrls` | Official public Crexi search or direct listing URLs | Empty; URL mode takes priority |\n| `priceMin`, `priceMax` | Sale price or comparable annual lease-rent bounds in USD | Optional, inclusive |\n| `capRateMin`, `capRateMax` | Normalized cap-rate bounds expressed as percentages | Optional, inclusive |\n| `buildingSizeMin`, `buildingSizeMax` | Building or available-space bounds in square feet | Optional, inclusive |\n| `outputSortBy` | Order rows by source order, size, asking amount, or days on market | `source_default` |\n\nUnknown fields and contradictory ranges are rejected before collection starts. The Console prefills are interface helpers; API callers should provide the values they need explicitly.\n\n## Manual mode\n\n### How to scrape Crexi manually\n\nManual mode creates a bounded public search for the selected state, optional city or county, transaction types, asset classes, numeric filters, and result target. Sale and lease rows remain distinguishable through `transaction_type`.\n\nCity searches use a bounded registry of tested Crexi markets and fail closed when a city cannot be resolved safely. For a market outside that registry, use a statewide search or paste the official Crexi URL for the exact market.\n\n#### City and state example\n\n~~~json\n{\n  \"state\": \"TX\",\n  \"city\": \"Austin\",\n  \"transactionTypes\": [\"sale\", \"lease\"],\n  \"assetClasses\": [\"office\", \"industrial\"],\n  \"priceMin\": 1000000,\n  \"buildingSizeMin\": 5000,\n  \"maxResults\": 100,\n  \"includeListingDetails\": false\n}\n~~~\n\n#### State-only example\n\n~~~json\n{\n  \"state\": \"Nevada\",\n  \"transactionTypes\": [\"sale\"],\n  \"maxResults\": 50,\n  \"outputSortBy\": \"asking_amount_asc\"\n}\n~~~\n\n## Authoritative URL mode\n\nWhen `startUrls` contains a recognized official Crexi URL, URL mode is authoritative. Manual location, transaction, asset-class, and numeric fields cannot broaden or rewrite that URL's contract.\n\nThe Actor accepts public Crexi search URLs and direct listing URLs. Each URL keeps its own immutable search contract. Duplicate listing IDs and canonical URLs are removed before output.\n\n~~~json\n{\n  \"startUrls\": [\n    {\n      \"url\": \"https://www.crexi.com/properties/123456/example-office\"\n    }\n  ],\n  \"maxResults\": 25,\n  \"includeListingDetails\": true\n}\n~~~\n\nURL mode accepts up to 1,000 rows per run. For URL asset-class filters, the Actor keeps the filter in its own validated mapper and continues through the broader public search pages when Crexi's source-side type filter under-returns inventory. Malformed, contradictory, unsafe, redirected, or unresolved URLs fail closed. If an advanced URL criterion cannot be represented exactly, supported criteria are preserved and the run is marked `partial` rather than silently claiming an exact match.\n\nWhen a URL contains a keyword such as `keywords_value=new%2520construction`, the public search response is not treated as proof because Crexi may omit marketing highlights from search cards. URL mode performs a bounded public detail pass, checks the listing's marketing or investment text, and emits only rows whose public detail contains the keyword. This verification runs automatically even when `includeListingDetails` is `false`.\n\nCrexi search URLs using `searchType=Sales`, `searchType=Lease`, or the platform's plural `searchType=Leases` form are supported; the URL's transaction type remains authoritative.\n\nCrexi market URLs are evaluated against Crexi's source geography. A market such as New York may legitimately return borough or neighborhood city labels inside the selected NY market; URL mode preserves those source-authoritative rows instead of applying a narrower literal city-name filter.\n\nFor an official URL that contains a criterion the V1 contract cannot represent exactly, the Actor uses a bounded **best-effort** interpretation: supported constraints remain enforced, unsupported constraints are reported, and the run status makes the limitation visible.\n\n| Input supplied | Behavior |\n|---|---|\n| Official Crexi search URL | Scrapes the supplied public search and preserves supported URL criteria |\n| Direct Crexi listing URL | Scrapes the supplied listing and returns its canonical public record |\n| Crexi URL plus manual fields | The URL remains authoritative; manual fields do not broaden it |\n| No URL | Uses manual state/city, transaction, asset, numeric, and sort inputs |\n| Multiple URLs | Keeps each URL's contract and deduplicates repeated listing IDs or canonical URLs |\n\n## Key features\n\n- **Manual market search**: state-wide, city, or county searches using public Crexi inventory.\n- **URL-first scraping**: paste the exact public Crexi search or listing URL you already configured.\n- **Sale and lease support**: request either transaction type or both in one run.\n- **Commercial asset filters**: office, retail, industrial, multifamily, land, hotel, mixed-use, and specialty.\n- **Numeric filters**: price or annual lease rent, cap rate, and building or available-space size.\n- **Output sorting**: order final rows by source order, building size, asking amount, or days on market.\n- **Public enrichment**: request additional listing and broker facts without making private-data claims.\n- **Validated dataset**: flat scalar rows with explicit `not public` values when the source does not expose a fact.\n- **Run transparency**: `complete`, `partial`, and `technical_failure` statuses in `RUN_SUMMARY`.\n- **Apify workflow support**: API access, Dataset exports, schedules, integrations, run history, and spend limits.\n\n## Output\n\nResults are written to the run's default Apify Dataset. Use the [Output tab](https://apify.com/kazkn/crexi-search-actor/output-schema) to inspect the schema, then download the Dataset as JSON, CSV, Excel, XML, or RSS, or access it through the Apify API and integrations.\n\n### What data can this Crexi scraper extract?\n\n| Data group | Representative fields |\n|---|---|\n| Identity | `source`, `source_listing_id`, `listing_url`, `scraped_at` |\n| Location | `address`, `city`, `state`, `zip`, `country`, `market` |\n| Transaction | `transaction_type`, `status`, `asking_price_or_rent`, `currency` |\n| Financials | `asking_amount_usd`, `price_per_sqft`, `price_per_unit`, `rent_per_sqft_per_year`, `estimated_annual_rent`, `estimated_monthly_rent`, `noi`, `cap_rate` |\n| Property | `asset_class`, `sub_type`, `building_size_sqft`, `total_available_sqft`, `lot_size_sqft`, `lot_size_acres`, `units`, `year_built`, `days_on_market` |\n| Public brokerage data | `broker_name`, `broker_company`, `broker_company_website`, `broker_phone`, `broker_email`, `broker_profile_url`, `broker_license_numbers` |\n| Quality and enrichment | `enrichment_status`, `data_quality_notes` |\n\nIf Crexi does not expose a fact publicly, the value remains `not public`. The Actor does not invent a value merely to fill a column.\n\n### Output example\n\n~~~json\n{\n  \"source\": \"crexi\",\n  \"source_listing_id\": \"123456\",\n  \"listing_url\": \"https://www.crexi.com/properties/123456/example-office\",\n  \"transaction_type\": \"sale\",\n  \"asset_class\": \"office\",\n  \"status\": \"active\",\n  \"address\": \"100 Congress Ave, Austin, TX 78701\",\n  \"city\": \"Austin\",\n  \"state\": \"TX\",\n  \"asking_price_or_rent\": \"$1,500,000\",\n  \"currency\": \"USD\",\n  \"asking_amount_usd\": 1500000,\n  \"building_size_sqft\": 10000,\n  \"cap_rate\": \"6%\",\n  \"broker_name\": \"not public\",\n  \"broker_company\": \"not public\",\n  \"enrichment_status\": \"search_only\",\n  \"scraped_at\": \"2026-01-01T00:00:00.000Z\"\n}\n~~~\n\nThe example is illustrative. Field availability depends on the public listing, the transaction type, the selected filters, and whether public detail enrichment is enabled.\n\n### Output field reference\n\nEach row is a flat scalar record designed for spreadsheets, APIs, CRM imports, and BI tools.\n\n~~~typescript\n{\n  source: \"crexi\",\n  source_listing_id: string,\n  listing_url: string,\n  scraped_at: string,\n\n  address: string,\n  city: string,\n  state: string,\n  zip: string,\n  country: string,\n  market: string,\n\n  transaction_type: \"sale\" | \"lease\",\n  asset_class: string,\n  sub_type: string,\n  status: string,\n\n  asking_price_or_rent: string,\n  currency: string,\n  asking_amount_usd: number | string,\n  price_per_sqft: string,\n  price_per_unit: string,\n  rent_per_sqft_per_year: string,\n  estimated_annual_rent: string,\n  estimated_monthly_rent: string,\n  noi: string,\n  cap_rate: string,\n\n  building_size_sqft: number | string,\n  total_available_sqft: number | string,\n  lot_size_sqft: number | string,\n  lot_size_acres: number | string,\n  units: number | string,\n  year_built: number | string,\n  days_on_market: number | string,\n\n  broker_name: string,\n  broker_company: string,\n  broker_company_website: string,\n  broker_phone: string,\n  broker_email: string,\n  broker_profile_url: string,\n  broker_license_numbers: string,\n\n  enrichment_status: string,\n  data_quality_notes: string\n}\n~~~\n\n## Public enrichment\n\n### Public listing and broker enrichment\n\nSet `includeListingDetails` to `true` to request additional public detail pages and endpoints. Enrichment is bounded by the run deadline and may add property, company, broker, phone, email, profile, or license fields only when the public evidence is sufficiently matched.\n\nMissing or weakly matched facts remain `not public`. The V1 does not access authenticated contact data, gated account data, or private datasets. Keep enrichment disabled for the fastest broad market export.\n\n## Completion and failures\n\n### Completion, partial runs, and failures\n\nThe `RUN_SUMMARY` key-value record contains a sanitized status, row counts, and bounded task outcomes:\n\n- `complete`: the requested target was reached, or a natural inventory shortage was proven.\n- `partial`: compliant rows were preserved, but a deadline, technical limit, or representable-URL limitation prevents a complete claim.\n- `technical_failure`: no usable row survived a total collection incident.\n\nThe Actor never pads results with off-filter listings. A platform `SUCCEEDED` status is not a data-quality guarantee; inspect the stored input, logs, Dataset, filters, uniqueness, and `RUN_SUMMARY` together.\n\n## Who is this Crexi scraper for?\n\n| Persona | Use case |\n|---|---|\n| CRE brokers | Review public inventory, asking terms, and broker identity by market |\n| Investment sales teams | Build sale and lease market scans with repeatable filters |\n| Acquisition teams | Export property rows into underwriting and diligence workflows |\n| REITs and family offices | Compare public inventory without rebuilding the same spreadsheet |\n| Lenders and appraisers | Review asking-price, size, cap-rate, and market signals |\n| Data teams | Use the Dataset as a commercial real estate API source |\n| Lead-generation teams | Review public broker fields where the source exposes them |\n\n## Try the Crexi scraper with a small run\n\nFor a first validation, use a narrow city search with `maxResults: 10` and `includeListingDetails: false`. This confirms connectivity, filters, output shape, and cost before you scale to a larger market.\n\nApify account credits and any plan-specific discounts are shown in the live Store interface. Always check the [Pricing tab](https://apify.com/kazkn/crexi-search-actor/pricing) before starting a large export.\n\n## Pricing\n\nThis Actor uses Apify's pay-per-event model. The current Store configuration is intentionally simple:\n\n| Event | Current price | When |\n|---|---:|---|\n| Actor start | $0.00005 per run | Once when the scraping run starts |\n| Validated Crexi listing | $0.003 per listing | Each validated row written to the default Dataset |\n| Public enrichment | Included in the listing event | No separate V1 contact-unlock event |\n| Platform usage pass-through | Disabled | The Store does not add a separate platform-usage charge in the current configuration |\n\nApproximate event cost:\n\n| Validated listings | Listing charges |\n|---:|---:|\n| 10 | $0.03 |\n| 100 | $0.30 |\n| 1,000 | $3.00 |\n\nThe exact customer price can vary with Apify plan discounts. The live [Pricing tab](https://apify.com/kazkn/crexi-search-actor/pricing) is authoritative. Do not confuse a requested `maxResults` target with a guaranteed number of billable rows: only validated rows written to the Dataset trigger the result event.\n\n## Tips for reliable runs\n\n- Start with `maxResults: 10` for a quick public-data check.\n- Use one state and one city or county for a focused manual search.\n- Keep `includeListingDetails` disabled for the fastest bulk export.\n- Use a complete official URL when you already configured a precise Crexi search.\n- Keep the URL query parameters intact; URL mode is authoritative.\n- Use `outputSortBy` when a spreadsheet or review workflow needs predictable ordering.\n- Split very broad markets into smaller runs instead of requesting an unnecessarily large target.\n- Treat fewer rows as a possible natural shortage or strict filter result; consult `RUN_SUMMARY` before changing the query.\n- Review the Dataset and sanitized summary together rather than relying only on the platform run badge.\n\n## Is scraping Crexi legal?\n\nThis Actor is an unofficial tool for public data. It does not bypass a login, request cookies, or collect private account data. You are responsible for choosing a lawful purpose, respecting Crexi's terms, handling personal data appropriately, and complying with applicable privacy, copyright, and data-protection rules.\n\nPublic broker fields can still contain personal data. Use only information you have a legitimate reason to process, protect exported data, and consult qualified legal counsel when your use case is uncertain. This section is general information, not legal advice.\n\n## Security\n\nThe Actor uses public Crexi pages and endpoints without cookies or a connected session. It does not request user-supplied scraping credentials. Public URLs and outbound targets are validated, and diagnostics exclude query strings, raw response bodies, and secrets.\n\nThe Actor never claims that an unavailable public value is known. Unsupported or unsafe URL inputs fail closed instead of being silently redirected into a broader search.\n\n## Limits\n\n### Known boundaries\n\n- 🧭 Manual searches require a US state; city and county matching depends on public Crexi inventory.\n- 🔗 URL mode returns at most 1,000 rows per run.\n- 🔢 `maxResults` is a target, not a promise that enough matching public listings exist.\n- 📋 Public broker contacts are optional and never guaranteed.\n- 🕒 Enrichment and very broad searches can take longer than a small filtered run.\n- 🧾 Sold, closed, off-market, authenticated, and private datasets are outside V1.\n- 🗓️ Monitoring and transaction tracking are outside V1 and reserved for a future version.\n- 🔄 Crexi can change its public pages or endpoints; future changes may reduce fields or require maintenance.\n\n## FAQ\n\n### What does the Crexi scraper do?\n\nIt searches public Crexi commercial real estate listings by market or official URL, filters sale and lease results, normalizes the rows, and writes them to an Apify Dataset.\n\n### How do I scrape Crexi listings?\n\nOpen the [Input tab](https://apify.com/kazkn/crexi-search-actor/input-schema), choose manual mode or URL mode, provide a state or public Crexi URL, select the filters you need, and run the Actor. The numbered tutorial above shows the recommended first run.\n\n### Do I need a Crexi login, cookies, or an API key?\n\nNo. The Actor uses public Crexi pages and endpoints without a connected Crexi session, Crexi cookies, or a user-supplied Crexi API key. You still need an Apify account to run an Apify Actor.\n\n### Is this an official Crexi API?\n\nNo. This is an unofficial public-data scraper. Crexi's official API offerings and commercial agreements are separate from this Actor. Do not represent this Actor as affiliated with or endorsed by Crexi.\n\n### Can I scrape both sale and lease listings?\n\nYes. Select `sale`, `lease`, or both. Each row keeps a normalized `transaction_type` so sale and lease records remain distinguishable.\n\n### Can I paste a Crexi URL?\n\nYes. Paste a public search or direct listing URL in `startUrls`. URL mode is authoritative and preserves the supported filters represented by each URL.\n\n### How much does it cost to scrape Crexi?\n\nThe current price is $0.00005 per run start plus $0.003 per validated listing. For example, 100 validated listings cost approximately $0.30 in result events, before any plan-specific Store discount. Check the live [Pricing tab](https://apify.com/kazkn/crexi-search-actor/pricing) for the price shown to your account.\n\n### Is the Crexi scraper free?\n\nYou can test it with a small run and the credits available on your Apify account. The Store shows the applicable allowance, event price, and any plan discount before you scale up.\n\n### Why did I receive fewer rows than `maxResults`?\n\n`maxResults` is a target. Restrictive filters, a naturally small market, missing public values required by a numeric filter, an access challenge, or a deadline can produce fewer valid rows. `RUN_SUMMARY` explains whether the result is `complete` or `partial`.\n\n### Does it include broker phone numbers and emails?\n\nOnly when the source or a public detail page exposes them and the value can be matched confidently to the listing. If a contact is gated, missing, or ambiguous, the Dataset keeps the field explicit instead of inventing a value.\n\n### Can I use the Actor for monitoring or transaction tracking?\n\nNot in V1. You can schedule ordinary runs and compare Datasets yourself, but dedicated monitoring and transaction-tracking features are reserved for a future version.\n\n### Can I export the results to CSV or Excel?\n\nYes. Apify lets you download the default Dataset as JSON, CSV, Excel, XML, or RSS, and connect it to APIs, webhooks, integrations, Google Sheets, warehouses, spreadsheets, and CRMs.\n\n### Can I scrape LoopNet and Crexi together?\n\nNot with this Crexi-only Actor. Use [Commercial Real Estate Brokerage Intelligence — LoopNet + Crexi](https://apify.com/kazkn/commercial-real-estate-brokerage-intel) when you want both platforms scraped, normalized, and exported together. This Actor remains focused on the standalone Crexi workflow.\n\n### Where can I report a problem?\n\nOpen an [Apify issue](https://apify.com/kazkn/crexi-search-actor/issues/open) with the run ID, a redacted input, the `RUN_SUMMARY` status, and the expected result. Never send credentials, cookies, tokens, private contact data, or copied remote response bodies.\n\n## Other commercial real estate Actors\n\n<a href=\"https://apify.com/kazkn/commercial-real-estate-brokerage-intel\">\n  <img src=\"https://api.apify.com/v2/key-value-stores/wTxgQ9qIPXv6jmGvM/records/CREXI_ONLY_VS_COMBINED_WORKFLOW\" width=\"960\" alt=\"Comparison of the Crexi-only workflow with the combined LoopNet and Crexi market-file workflow\" />\n</a>\n\n> This original comparison illustration makes the difference between Crexi-only scraping and simultaneous LoopNet + Crexi scraping immediately clear.\n\n| Actor | When to choose it |\n|---|---|\n| [Crexi Scraper](https://apify.com/kazkn/crexi-search-actor) | Crexi-only public listing search, filtering, and optional enrichment |\n| [Commercial Real Estate Brokerage Intelligence — LoopNet + Crexi](https://apify.com/kazkn/commercial-real-estate-brokerage-intel) | Scrape LoopNet and Crexi together, normalize the records, and export a broker-ready market file |\n\nUse the Crexi-only Actor when source isolation, a simple input form, and transparent per-listing pricing are the priority.\n\nFor a visual overview of the combined workflow, watch the [short LoopNet + Crexi demo](https://youtu.be/TVAcUSzaS7w) on the broader Actor page.\n\n## Technical notes\n\n- Stack: Apify SDK, Crawlee, TypeScript, and Node.js.\n- Source: public Crexi listing pages and public endpoints.\n- Output: Apify Dataset plus a sanitized `RUN_SUMMARY` key-value record.\n- Input: manual state/city search or authoritative official URL mode.\n- Enrichment: bounded public listing and broker enrichment only.\n- API: standard Apify Actor API, Dataset API, exports, schedules, and integrations.\n\n## Support\n\nOpen an [issue on Apify](https://apify.com/kazkn/crexi-search-actor/issues/open) for bugs, feature requests, additional fields, custom exports, or market-specific improvements.\n\nIf this Actor helps your workflow, an honest Apify review helps other commercial real estate teams evaluate it and helps prioritize maintenance.\n\nBuilt for teams that want cleaner public Crexi data without rebuilding the same commercial real estate spreadsheet every morning.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "crexi-search-actor",
      "title": "Crexi Scraper for Commercial Real Estate",
      "description": "Unofficial Crexi scraper for public commercial real estate sale and lease listings. Search by market or official URL, apply supported filters, and optionally enrich with publicly available broker details. Not affiliated with, sponsored by, or endorsed by Crexi.",
      "version": "0.1",
      "buildTag": "latest",
      "defaultRunOptions": {
        "build": "latest",
        "memoryMbytes": 1024,
        "timeoutSecs": 3600
      },
      "environmentVariables": {},
      "meta": {
        "templateId": "ts-crawlee-playwright",
        "generatedBy": "Codex with GPT-5"
      },
      "input": {
        "title": "Crexi Scraper — input",
        "description": "Search public Crexi commercial real estate listings by market or by URL.",
        "type": "object",
        "schemaVersion": 1,
        "additionalProperties": false,
        "properties": {
          "city": {
            "sectionCaption": "🔎 Manual mode — leave empty when using Crexi URLs",
            "sectionDescription": "Enter a US city or county and state, or leave City empty for a statewide search.",
            "title": "🏙️ City or county",
            "type": "string",
            "editor": "textfield",
            "description": "Optional city or county within the selected state. Leave empty to search the entire state.",
            "maxLength": 256,
            "prefill": "Austin"
          },
          "state": {
            "title": "🇺🇸 State",
            "type": "string",
            "editor": "textfield",
            "description": "US state code or name, for example TX or California. Required for manual searches.",
            "maxLength": 64,
            "prefill": "TX",
            "pattern": "^\\s*(?:[Aa][Ll]|[Aa][Kk]|[Aa][Zz]|[Aa][Rr]|[Cc][Aa]|[Cc][Oo]|[Cc][Tt]|[Dd][Ee]|[Ff][Ll]|[Gg][Aa]|[Hh][Ii]|[Ii][Dd]|[Ii][Ll]|[Ii][Nn]|[Ii][Aa]|[Kk][Ss]|[Kk][Yy]|[Ll][Aa]|[Mm][Ee]|[Mm][Dd]|[Mm][Aa]|[Mm][Ii]|[Mm][Nn]|[Mm][Ss]|[Mm][Oo]|[Mm][Tt]|[Nn][Ee]|[Nn][Vv]|[Nn][Hh]|[Nn][Jj]|[Nn][Mm]|[Nn][Yy]|[Nn][Cc]|[Nn][Dd]|[Oo][Hh]|[Oo][Kk]|[Oo][Rr]|[Pp][Aa]|[Rr][Ii]|[Ss][Cc]|[Ss][Dd]|[Tt][Nn]|[Tt][Xx]|[Uu][Tt]|[Vv][Tt]|[Vv][Aa]|[Ww][Aa]|[Ww][Vv]|[Ww][Ii]|[Ww][Yy]|[Dd][Cc]|[Aa][Ll][Aa][Bb][Aa][Mm][Aa]|[Aa][Ll][Aa][Ss][Kk][Aa]|[Aa][Rr][Ii][Zz][Oo][Nn][Aa]|[Aa][Rr][Kk][Aa][Nn][Ss][Aa][Ss]|[Cc][Aa][Ll][Ii][Ff][Oo][Rr][Nn][Ii][Aa]|[Cc][Oo][Ll][Oo][Rr][Aa][Dd][Oo]|[Cc][Oo][Nn][Nn][Ee][Cc][Tt][Ii][Cc][Uu][Tt]|[Dd][Ee][Ll][Aa][Ww][Aa][Rr][Ee]|[Ff][Ll][Oo][Rr][Ii][Dd][Aa]|[Gg][Ee][Oo][Rr][Gg][Ii][Aa]|[Hh][Aa][Ww][Aa][Ii][Ii]|[Ii][Dd][Aa][Hh][Oo]|[Ii][Ll][Ll][Ii][Nn][Oo][Ii][Ss]|[Ii][Nn][Dd][Ii][Aa][Nn][Aa]|[Ii][Oo][Ww][Aa]|[Kk][Aa][Nn][Ss][Aa][Ss]|[Kk][Ee][Nn][Tt][Uu][Cc][Kk][Yy]|[Ll][Oo][Uu][Ii][Ss][Ii][Aa][Nn][Aa]|[Mm][Aa][Ii][Nn][Ee]|[Mm][Aa][Rr][Yy][Ll][Aa][Nn][Dd]|[Mm][Aa][Ss][Ss][Aa][Cc][Hh][Uu][Ss][Ee][Tt][Tt][Ss]|[Mm][Ii][Cc][Hh][Ii][Gg][Aa][Nn]|[Mm][Ii][Nn][Nn][Ee][Ss][Oo][Tt][Aa]|[Mm][Ii][Ss][Ss][Ii][Ss][Ss][Ii][Pp][Pp][Ii]|[Mm][Ii][Ss][Ss][Oo][Uu][Rr][Ii]|[Mm][Oo][Nn][Tt][Aa][Nn][Aa]|[Nn][Ee][Bb][Rr][Aa][Ss][Kk][Aa]|[Nn][Ee][Vv][Aa][Dd][Aa]|[Nn][Ee][Ww]\\s+[Hh][Aa][Mm][Pp][Ss][Hh][Ii][Rr][Ee]|[Nn][Ee][Ww]\\s+[Jj][Ee][Rr][Ss][Ee][Yy]|[Nn][Ee][Ww]\\s+[Mm][Ee][Xx][Ii][Cc][Oo]|[Nn][Ee][Ww]\\s+[Yy][Oo][Rr][Kk]|[Nn][Oo][Rr][Tt][Hh]\\s+[Cc][Aa][Rr][Oo][Ll][Ii][Nn][Aa]|[Nn][Oo][Rr][Tt][Hh]\\s+[Dd][Aa][Kk][Oo][Tt][Aa]|[Oo][Hh][Ii][Oo]|[Oo][Kk][Ll][Aa][Hh][Oo][Mm][Aa]|[Oo][Rr][Ee][Gg][Oo][Nn]|[Pp][Ee][Nn][Nn][Ss][Yy][Ll][Vv][Aa][Nn][Ii][Aa]|[Rr][Hh][Oo][Dd][Ee]\\s+[Ii][Ss][Ll][Aa][Nn][Dd]|[Ss][Oo][Uu][Tt][Hh]\\s+[Cc][Aa][Rr][Oo][Ll][Ii][Nn][Aa]|[Ss][Oo][Uu][Tt][Hh]\\s+[Dd][Aa][Kk][Oo][Tt][Aa]|[Tt][Ee][Nn][Nn][Ee][Ss][Ss][Ee][Ee]|[Tt][Ee][Xx][Aa][Ss]|[Uu][Tt][Aa][Hh]|[Vv][Ee][Rr][Mm][Oo][Nn][Tt]|[Vv][Ii][Rr][Gg][Ii][Nn][Ii][Aa]|[Ww][Aa][Ss][Hh][Ii][Nn][Gg][Tt][Oo][Nn]|[Ww][Ee][Ss][Tt]\\s+[Vv][Ii][Rr][Gg][Ii][Nn][Ii][Aa]|[Ww][Ii][Ss][Cc][Oo][Nn][Ss][Ii][Nn]|[Ww][Yy][Oo][Mm][Ii][Nn][Gg]|[Dd][Ii][Ss][Tt][Rr][Ii][Cc][Tt]\\s+[Oo][Ff]\\s+[Cc][Oo][Ll][Uu][Mm][Bb][Ii][Aa])\\s*$"
          },
          "assetClasses": {
            "title": "🎯 Asset class",
            "type": "array",
            "description": "Restrict the search to specific commercial property types. Leave empty to include all supported classes.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "office",
                "retail",
                "industrial",
                "multifamily",
                "land",
                "hotel",
                "mixed-use",
                "specialty"
              ],
              "enumTitles": [
                "🏢 Office",
                "🛍️ Retail",
                "🏭 Industrial",
                "🏠 Multifamily",
                "🌾 Land",
                "🏨 Hotel",
                "🏗️ Mixed-use",
                "🎯 Specialty"
              ]
            },
            "default": []
          },
          "transactionTypes": {
            "title": "💼 Transaction type",
            "type": "array",
            "description": "Choose for-sale listings, for-lease spaces, or both. Selecting both returns separate rows for each public transaction type.",
            "editor": "select",
            "minItems": 1,
            "items": {
              "type": "string",
              "enum": [
                "sale",
                "lease"
              ],
              "enumTitles": [
                "🛒 For sale (purchase)",
                "🏷️ For lease (rent)"
              ]
            },
            "default": [
              "sale"
            ]
          },
          "maxResults": {
            "title": "🔢 Maximum results",
            "type": "integer",
            "description": "Maximum number of valid Crexi listings to target. Actual output depends on the available inventory and your filters.",
            "minimum": 1,
            "default": 200
          },
          "includeListingDetails": {
            "sectionCaption": "📋 Public listing enrichment (optional)",
            "sectionDescription": "Adds richer public listing and broker information when available. It is slower; unavailable contact fields remain clearly marked as not public.",
            "title": "Public broker contacts & listing details",
            "type": "boolean",
            "description": "Fetch public Crexi detail pages and endpoints for additional listing and broker fields. Keep disabled for the fastest bulk export.",
            "default": false
          },
          "proxyConfiguration": {
            "sectionCaption": "⚙️ Managed network access — leave as-is",
            "sectionDescription": "Apify supplies the proxy used for public Crexi requests. You do not need Crexi cookies, a connected session, or scraping credentials.",
            "title": "Apify proxy (managed)",
            "type": "object",
            "description": "Uses Apify's residential proxy pool in the United States. Keep the default unchanged for reliable runs.",
            "editor": "proxy",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          },
          "startUrls": {
            "sectionCaption": "🔗 URL mode — Crexi URLs take priority",
            "sectionDescription": "Paste an official Crexi search or listing URL. URL mode overrides the manual search fields.",
            "title": "🔗 Crexi search or listing URLs (optional)",
            "type": "array",
            "maxItems": 200,
            "description": "Paste one or more complete public Crexi search or direct listing URLs. Supported filters remain enforced; an unsupported advanced filter may broaden results and produce a partial run summary.",
            "editor": "schemaBased",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "title": "Crexi URL",
                  "type": "string",
                  "description": "Complete public Crexi HTTP(S) search or listing URL.",
                  "maxLength": 32768,
                  "pattern": "^https?://.+",
                  "errorMessage": {
                    "pattern": "Enter a complete public Crexi HTTP(S) URL."
                  }
                }
              }
            },
            "default": []
          },
          "priceMin": {
            "sectionCaption": "💰 Price, return & size filters (optional)",
            "sectionDescription": "Optional filters for sale price, estimated annual lease rent, cap rate and building size. When a numeric filter is set, a listing must expose a finite comparable value for that filter.",
            "title": "Minimum price / annual lease rent (USD)",
            "type": "number",
            "description": "Lower bound. For sale listings, enter the total asking price. For lease listings, enter comparable annual rent.",
            "minimum": 0
          },
          "priceMax": {
            "title": "Maximum price / annual lease rent (USD)",
            "type": "number",
            "description": "Upper bound. For sale listings, enter the total asking price. For lease listings, enter comparable annual rent.",
            "minimum": 0
          },
          "capRateMin": {
            "title": "Minimum cap rate (%)",
            "type": "number",
            "description": "Lower bound on the normalized cap rate, expressed as a percentage.",
            "minimum": 0
          },
          "capRateMax": {
            "title": "Maximum cap rate (%)",
            "type": "number",
            "description": "Upper bound on the normalized cap rate, expressed as a percentage.",
            "minimum": 0
          },
          "buildingSizeMin": {
            "title": "Minimum building size (sq ft)",
            "type": "number",
            "description": "Lower bound on building or available size in square feet.",
            "minimum": 0
          },
          "buildingSizeMax": {
            "title": "Maximum building size (sq ft)",
            "type": "number",
            "description": "Upper bound on building or available size in square feet.",
            "minimum": 0
          },
          "outputSortBy": {
            "sectionCaption": "📊 Output organization",
            "sectionDescription": "Choose an optional final ordering to make exports easier to scan.",
            "title": "Sort output by",
            "type": "string",
            "description": "Choose the ordering of valid Crexi rows in the output dataset.",
            "editor": "select",
            "enum": [
              "source_default",
              "building_size_asc",
              "building_size_desc",
              "asking_amount_asc",
              "asking_amount_desc",
              "days_on_market_asc",
              "days_on_market_desc"
            ],
            "enumTitles": [
              "Source/default order",
              "Building size: small to large",
              "Building size: large to small",
              "Asking amount: low to high",
              "Asking amount: high to low",
              "Days on market: newest first",
              "Days on market: oldest first"
            ],
            "default": "source_default"
          }
        }
      },
      "output": {
        "$schema": "https://apify.com/schemas/v1/output.ide.json",
        "actorOutputSchemaVersion": 1,
        "title": "Crexi Scraper output",
        "description": "Validated listing rows are stored in the default dataset. The sanitized completion status and bounded task counts are stored separately in RUN_SUMMARY.",
        "properties": {
          "results": {
            "type": "string",
            "title": "Validated Crexi listings",
            "description": "Flat public sale and lease listing rows that passed the requested Crexi filters.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          },
          "runSummary": {
            "type": "string",
            "title": "Sanitized run summary",
            "description": "The complete, partial, or technical_failure status with row counts and controlled per-task outcomes.",
            "template": "{{links.apiDefaultKeyValueStoreUrl}}/records/RUN_SUMMARY"
          }
        }
      },
      "readme": "# Crexi Listings Scraper — Sale & Lease Commercial Real Estate Data\n\n> **Scrape public Crexi listings for sale and lease.** Turn a market search or official Crexi URL into a clean, validated dataset with asking terms, property facts, cap-rate and size fields, source links, and public broker details when available.\n\n> **Two ways to run it.** Search manually by U.S. state, city, or county and filters, or paste one or more public Crexi search or listing URLs. URL mode takes priority.\n\n<a href=\"https://apify.com/kazkn/crexi-search-actor?fpr=8fp2od\">\n  <img src=\"https://api.apify.com/v2/key-value-stores/wTxgQ9qIPXv6jmGvM/records/CREXI_README_HERO_NEON_V2\" width=\"760\" alt=\"Fragmented public Crexi listing research transformed into a clean validated commercial real estate dataset\" />\n</a>\n\n<sub>Original conceptual illustrations generated for this Actor are not Crexi screenshots and do not imply Crexi endorsement.</sub>\n\n> **Built for faster CRE research.** Give acquisition teams, brokers, investors, analysts, and data operators a structured starting point for market screening, deal sourcing, underwriting, outreach preparation, and downstream data workflows.\n\nThis unofficial Actor is not affiliated with, sponsored by, or endorsed by Crexi. It works with public data and requires no Crexi cookies, connected Crexi session, Crexi API key, or user-supplied scraping credentials.\n\n<table style=\"width:100%;border-collapse:collapse;table-layout:fixed\">\n<tr>\n<td colspan=\"4\" style=\"padding:10px 14px;background:#031A2C;border:none;border-radius:4px 4px 0 0\">\n<span style=\"color:#F3FAFF;font-size:14px;font-weight:700;letter-spacing:0.5px\">KazKN · Data intelligence suite</span>\n<span style=\"color:#BFD9E8;font-size:13px\">&nbsp;&nbsp;&bull;&nbsp;&nbsp;CRE listings, Crexi search, Vinted arbitrage, Shopify intelligence</span>\n</td>\n</tr>\n<tr>\n<td style=\"padding:10px 12px;border:1px solid #B8D7E8;background:#DDF3FF;border-right:none;border-top:none;vertical-align:top;width:25%;overflow-wrap:anywhere\">\n<span><img src=\"https://images.apifyusercontent.com/JljmsVBsqZbvcsxNEaKFoAEl3VN9PR5oVoT3KxNbBnE/rs:fill:76:76/cb:1/aHR0cHM6Ly9hcGlmeS1pbWFnZS11cGxvYWRzLXByb2QuczMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vRU1tNFVoV2luTjc2dHJiT2ItYWN0b3ItT2tRNjRFaDJtY0dqWVZPU24tS2ZuWDVhcXd5ei1DcmV4aV9sb2dvLnBuZw.webp\" width=\"20\" height=\"20\" style=\"vertical-align:middle;border-radius:4px\" alt=\"Crexi Scraper\"> &nbsp;<a href=\"https://apify.com/kazkn/crexi-search-actor?fpr=8fp2od\" style=\"color:#005EA8;text-decoration:none;font-weight:700;font-size:13px\">Crexi Scraper</a></span><br>\n<span style=\"color:#005EA8;font-size:11px;font-weight:600\">&#10148; You are here</span>\n</td>\n<td style=\"background:#F7FBFF;padding:10px 12px;border:1px solid #B8D7E8;border-right:none;border-top:none;vertical-align:top;width:25%;overflow-wrap:anywhere\">\n<span><img src=\"https://images.apifyusercontent.com/p0274x4YcnV6tpq7RySfCrO01PZNvBqu-vPqIVtWQDg/rs:fill:76:76/cb:1/aHR0cHM6Ly9hcGlmeS1pbWFnZS11cGxvYWRzLXByb2QuczMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vRU1tNFVoV2luTjc2dHJiT2ItYWN0b3ItUm5HTk1jVjN2OEFUaFIzYUEtaTNFM3dkMHhYZC1DaGF0R1BUX0ltYWdlXzZfbWFpXzIwMjZfXzE5XzU5XzI3LnBuZw.webp\" width=\"20\" height=\"20\" style=\"vertical-align:middle;border-radius:4px\" alt=\"CRE Intelligence\"> &nbsp;<a href=\"https://apify.com/kazkn/commercial-real-estate-brokerage-intel?fpr=8fp2od\" style=\"color:#031A2C;text-decoration:none;font-weight:700;font-size:13px\">CRE Intelligence</a></span><br>\n<span style=\"color:#526978;font-size:11px\">LoopNet + Crexi · one clean file</span>\n</td>\n<td style=\"background:#F7FBFF;padding:10px 12px;border:1px solid #B8D7E8;border-right:none;border-top:none;vertical-align:top;width:25%;overflow-wrap:anywhere\">\n<span><img src=\"https://images.apifyusercontent.com/bmk5660gpsQw7MPFxAKCn_GfgjpNZhq9utrqOxrlAaw/rs:fill:76:76/cb:1/aHR0cHM6Ly9hcGlmeS1pbWFnZS11cGxvYWRzLXByb2QuczMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vRU1tNFVoV2luTjc2dHJiT2ItYWN0b3ItNFVBUHJ3WmIxWE9sa0NKS0stcGhxNm1Db1FvZy12aW50ZWRfbG9nby5wbmc.webp\" width=\"20\" height=\"20\" style=\"vertical-align:middle;border-radius:4px\" alt=\"Vinted Smart Scraper\"> &nbsp;<a href=\"https://apify.com/kazkn/vinted-smart-scraper?fpr=8fp2od\" style=\"color:#031A2C;text-decoration:none;font-weight:700;font-size:13px\">Vinted Smart Scraper</a></span><br>\n<span style=\"color:#526978;font-size:11px\">Cross-country price arbitrage</span>\n</td>\n<td style=\"background:#F7FBFF;padding:10px 12px;border:1px solid #B8D7E8;border-top:none;vertical-align:top;width:25%;overflow-wrap:anywhere\">\n<span><img src=\"https://images.apifyusercontent.com/16bujimlKPVXa0HDiFaYXdv9pr5wzmU5oAlQmqx2wro/rs:fill:76:76/cb:1/aHR0cHM6Ly9hcGlmeS1pbWFnZS11cGxvYWRzLXByb2QuczMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vRU1tNFVoV2luTjc2dHJiT2ItYWN0b3ItQ2dLc25NdzEyY0xmUFE4QmstOW9xdGthaHMySi1DYXB0dXJlX2RfZV9jcmFuXzIwMjYtMDUtMDFfYV9fMTcuMzcuMDcuanBlZw.webp\" width=\"20\" height=\"20\" style=\"vertical-align:middle;border-radius:4px\" alt=\"Shopify Apps Spy\"> &nbsp;<a href=\"https://apify.com/kazkn/shopify-scraper-apps-spy?fpr=8fp2od\" style=\"color:#031A2C;text-decoration:none;font-weight:700;font-size:13px\">Shopify Apps Spy</a></span><br>\n<span style=\"color:#526978;font-size:11px\">Products, reviews + installed apps</span>\n</td>\n</tr>\n</table>\n\n#### Copy to your AI assistant\n\n```text\nUse Apify Actor `kazkn/crexi-search-actor` to collect public Crexi commercial real estate sale and lease listings into a validated default Dataset. It supports manual U.S. market searches with transaction, asset-class, price, cap-rate, building-size, and sort filters, or URL mode through `startUrls` for public Crexi search and listing URLs; URL mode takes priority. It can optionally enrich rows with public listing and broker details when available. It requires no Crexi cookies, connected Crexi session, Crexi API key, or user-supplied scraping credentials. Use only fields exposed by the Actor specification and treat `maxResults` as a target, not an inventory guarantee.\n```\n\n```json\n{\n  \"city\": \"Austin\",\n  \"state\": \"TX\",\n  \"assetClasses\": [\"office\"],\n  \"transactionTypes\": [\"sale\", \"lease\"],\n  \"maxResults\": 100,\n  \"includeListingDetails\": false,\n  \"outputSortBy\": \"source_default\"\n}\n```\n\n```python\nfrom apify_client import ApifyClient\n\nclient = ApifyClient(\"TOKEN\")\nrun_input = {\n    \"city\": \"Austin\",\n    \"state\": \"TX\",\n    \"assetClasses\": [\"office\"],\n    \"transactionTypes\": [\"sale\", \"lease\"],\n    \"maxResults\": 100,\n    \"includeListingDetails\": False,\n    \"outputSortBy\": \"source_default\",\n}\n\nrun = client.actor(\"kazkn/crexi-search-actor\").call(run_input=run_input)\nitems = client.dataset(run[\"defaultDatasetId\"]).list_items().items\nprint(items)\n```\n\n[Full Actor specifications](https://api.apify.com/v2/acts/kazkn~crexi-search-actor/builds/default)\n\n**Best for:** commercial real estate market research, CRE deal sourcing, acquisition lists, broker lead review, underwriting inputs, cap-rate analysis, comparable-listing exports, Google Sheets/CSV/Excel workflows, CRM enrichment, and data pipelines.\n\n**Explore on Apify:** [Run Actor](https://apify.com/kazkn/crexi-search-actor?fpr=8fp2od) · [Input](https://apify.com/kazkn/crexi-search-actor/input-schema?fpr=8fp2od) · [Output](https://apify.com/kazkn/crexi-search-actor/output-schema?fpr=8fp2od) · [Pricing](https://apify.com/kazkn/crexi-search-actor/pricing?fpr=8fp2od) · [API](https://apify.com/kazkn/crexi-search-actor/api/python?fpr=8fp2od) · [Examples](https://apify.com/kazkn/crexi-search-actor/examples?fpr=8fp2od) · [Support](https://apify.com/kazkn/crexi-search-actor/issues/open?fpr=8fp2od)\n\n## What can this Crexi scraper do?\n\n| Need | What you get |\n|---|---|\n| Crexi scraper | Public Crexi commercial real estate listings in a flat, normalized dataset |\n| Commercial real estate API | Structured rows accessible through Apify API, integrations, exports, and webhooks |\n| Commercial real estate listings scraper | Search by state, city or county, asset class, price, cap rate, size, and transaction type |\n| Sale listings scraper | Public for-sale listings with asking price, property, financial, and source fields when available |\n| Lease listings scraper | Public for-lease spaces with comparable annual rent and property fields when available |\n| Broker data workflow | Public broker name, company, profile, phone, email, and license fields only when sufficiently proven |\n| Cap-rate data | Source-listed cap rate or a comparable rate calculated from source-declared NOI and asking price |\n| Spreadsheet-ready export | Download JSON, CSV, Excel, XML, RSS, or connect the Dataset to a workflow |\n\n## Why use this Crexi commercial real estate scraper?\n\nCommercial real estate teams often repeat the same manual process: open a market, copy listing details, clean the rows, check the asking price, and review broker information. This Actor turns that public Crexi workflow into one repeatable Apify run.\n\n1. 🔎 Search a market such as Austin, Dallas, Phoenix, Miami, Chicago, Los Angeles, or New York.\n2. 💼 Choose for-sale listings, for-lease spaces, or both.\n3. 🎯 Add only the filters that matter: asset class, price or rent, cap rate, and building size.\n4. 📋 Keep public listing and broker enrichment optional so broad exports stay fast.\n5. ✅ Receive validated rows plus a sanitized `RUN_SUMMARY` that explains completion or shortage.\n6. 📤 Export the Dataset to a spreadsheet, CRM, warehouse, BI tool, or your own API.\n\nApify adds the operational layer around the scraper: a point-and-click Input tab, API access, Dataset exports, scheduling, integrations, retries, run history, and spend controls. The Crexi V1 itself intentionally does not claim authenticated data, closed-sale verification, private ownership data, monitoring, or transaction tracking.\n\n### A public Crexi API alternative for market research\n\nIf you need structured public Crexi listings without building a browser workflow yourself, this Actor provides a point-and-click and API-accessible alternative for market research, acquisition screening, broker review, and spreadsheet exports. For broader workflow examples and a combined market-file use case, see the [LoopNet + Crexi Listings API resource hub](https://github.com/Boo-n/loopnet-crexi-listings-api).\n\n## How to scrape Crexi listings\n\n1. Open the [Input tab](https://apify.com/kazkn/crexi-search-actor/input-schema).\n2. Choose **manual search** or **URL mode**.\n3. For manual mode, enter a US state and optionally a city or county.\n4. Select sale, lease, or both, then add the filters you need.\n5. For URL mode, paste one or more complete public Crexi search or direct listing URLs.\n6. Start with a small `maxResults` value and keep public detail enrichment disabled for the first connectivity check.\n7. Run the Actor and inspect both the Dataset and the `RUN_SUMMARY` record.\n8. Download the output or consume it through the [Apify API](https://apify.com/kazkn/crexi-search-actor/api).\n\n### Run the Crexi scraper through the Apify API\n\n#### JavaScript\n\n~~~javascript\nimport { ApifyClient } from 'apify-client';\n\nconst client = new ApifyClient({\n    token: process.env.APIFY_TOKEN,\n});\n\nconst run = await client\n    .actor('kazkn/crexi-search-actor')\n    .call({\n        state: 'TX',\n        city: 'Austin',\n        transactionTypes: ['sale'],\n        assetClasses: ['office'],\n        maxResults: 10,\n        includeListingDetails: false,\n    });\n\nconsole.log('Dataset ID: ' + run.defaultDatasetId);\n~~~\n\n#### Python\n\n~~~python\nimport os\nfrom apify_client import ApifyClient\n\nclient = ApifyClient(os.environ[\"APIFY_TOKEN\"])\n\nrun = client.actor(\"kazkn/crexi-search-actor\").call(run_input={\n    \"state\": \"TX\",\n    \"city\": \"Austin\",\n    \"transactionTypes\": [\"sale\"],\n    \"assetClasses\": [\"office\"],\n    \"maxResults\": 10,\n    \"includeListingDetails\": False,\n})\n\nprint(run[\"defaultDatasetId\"])\n~~~\n\n#### cURL\n\n~~~bash\ncurl -X POST \\\n  \"https://api.apify.com/v2/acts/kazkn~crexi-search-actor/runs?token=$APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"state\": \"TX\",\n    \"city\": \"Austin\",\n    \"transactionTypes\": [\"sale\"],\n    \"assetClasses\": [\"office\"],\n    \"maxResults\": 10,\n    \"includeListingDetails\": false\n  }'\n~~~\n\n## Input\n\nThe [Input tab](https://apify.com/kazkn/crexi-search-actor/input-schema) contains the complete schema, tooltips, accepted values, and friendly Console labels. Use the table below as a quick reference.\n\n| Input field | Purpose | Default or rule |\n|---|---|---|\n| `state` | US state code or English state name for manual mode | Required for manual searches |\n| `city` | Optional city or county inside the selected state | Empty means statewide search |\n| `assetClasses` | Filter office, retail, industrial, multifamily, land, hotel, mixed-use, or specialty | Empty includes supported classes |\n| `transactionTypes` | Select `sale`, `lease`, or both | `sale` |\n| `maxResults` | Global target for valid rows | `200` by default; URL mode accepts up to `1,000`; it is not an inventory guarantee |\n| `includeListingDetails` | Fetch additional public listing and broker fields | `false` |\n| `startUrls` | Official public Crexi search or direct listing URLs | Empty; URL mode takes priority |\n| `priceMin`, `priceMax` | Sale price or comparable annual lease-rent bounds in USD | Optional, inclusive |\n| `capRateMin`, `capRateMax` | Normalized cap-rate bounds expressed as percentages | Optional, inclusive |\n| `buildingSizeMin`, `buildingSizeMax` | Building or available-space bounds in square feet | Optional, inclusive |\n| `outputSortBy` | Order rows by source order, size, asking amount, or days on market | `source_default` |\n\nUnknown fields and contradictory ranges are rejected before collection starts. The Console prefills are interface helpers; API callers should provide the values they need explicitly.\n\n## Manual mode\n\n### How to scrape Crexi manually\n\nManual mode creates a bounded public search for the selected state, optional city or county, transaction types, asset classes, numeric filters, and result target. Sale and lease rows remain distinguishable through `transaction_type`.\n\nCity searches use a bounded registry of tested Crexi markets and fail closed when a city cannot be resolved safely. For a market outside that registry, use a statewide search or paste the official Crexi URL for the exact market.\n\n#### City and state example\n\n~~~json\n{\n  \"state\": \"TX\",\n  \"city\": \"Austin\",\n  \"transactionTypes\": [\"sale\", \"lease\"],\n  \"assetClasses\": [\"office\", \"industrial\"],\n  \"priceMin\": 1000000,\n  \"buildingSizeMin\": 5000,\n  \"maxResults\": 100,\n  \"includeListingDetails\": false\n}\n~~~\n\n#### State-only example\n\n~~~json\n{\n  \"state\": \"Nevada\",\n  \"transactionTypes\": [\"sale\"],\n  \"maxResults\": 50,\n  \"outputSortBy\": \"asking_amount_asc\"\n}\n~~~\n\n## Authoritative URL mode\n\nWhen `startUrls` contains a recognized official Crexi URL, URL mode is authoritative. Manual location, transaction, asset-class, and numeric fields cannot broaden or rewrite that URL's contract.\n\nThe Actor accepts public Crexi search URLs and direct listing URLs. Each URL keeps its own immutable search contract. Duplicate listing IDs and canonical URLs are removed before output.\n\n~~~json\n{\n  \"startUrls\": [\n    {\n      \"url\": \"https://www.crexi.com/properties/123456/example-office\"\n    }\n  ],\n  \"maxResults\": 25,\n  \"includeListingDetails\": true\n}\n~~~\n\nURL mode accepts up to 1,000 rows per run. For URL asset-class filters, the Actor keeps the filter in its own validated mapper and continues through the broader public search pages when Crexi's source-side type filter under-returns inventory. Malformed, contradictory, unsafe, redirected, or unresolved URLs fail closed. If an advanced URL criterion cannot be represented exactly, supported criteria are preserved and the run is marked `partial` rather than silently claiming an exact match.\n\nWhen a URL contains a keyword such as `keywords_value=new%2520construction`, the public search response is not treated as proof because Crexi may omit marketing highlights from search cards. URL mode performs a bounded public detail pass, checks the listing's marketing or investment text, and emits only rows whose public detail contains the keyword. This verification runs automatically even when `includeListingDetails` is `false`.\n\nCrexi search URLs using `searchType=Sales`, `searchType=Lease`, or the platform's plural `searchType=Leases` form are supported; the URL's transaction type remains authoritative.\n\nCrexi market URLs are evaluated against Crexi's source geography. A market such as New York may legitimately return borough or neighborhood city labels inside the selected NY market; URL mode preserves those source-authoritative rows instead of applying a narrower literal city-name filter.\n\nFor an official URL that contains a criterion the V1 contract cannot represent exactly, the Actor uses a bounded **best-effort** interpretation: supported constraints remain enforced, unsupported constraints are reported, and the run status makes the limitation visible.\n\n| Input supplied | Behavior |\n|---|---|\n| Official Crexi search URL | Scrapes the supplied public search and preserves supported URL criteria |\n| Direct Crexi listing URL | Scrapes the supplied listing and returns its canonical public record |\n| Crexi URL plus manual fields | The URL remains authoritative; manual fields do not broaden it |\n| No URL | Uses manual state/city, transaction, asset, numeric, and sort inputs |\n| Multiple URLs | Keeps each URL's contract and deduplicates repeated listing IDs or canonical URLs |\n\n## Key features\n\n- **Manual market search**: state-wide, city, or county searches using public Crexi inventory.\n- **URL-first scraping**: paste the exact public Crexi search or listing URL you already configured.\n- **Sale and lease support**: request either transaction type or both in one run.\n- **Commercial asset filters**: office, retail, industrial, multifamily, land, hotel, mixed-use, and specialty.\n- **Numeric filters**: price or annual lease rent, cap rate, and building or available-space size.\n- **Output sorting**: order final rows by source order, building size, asking amount, or days on market.\n- **Public enrichment**: request additional listing and broker facts without making private-data claims.\n- **Validated dataset**: flat scalar rows with explicit `not public` values when the source does not expose a fact.\n- **Run transparency**: `complete`, `partial`, and `technical_failure` statuses in `RUN_SUMMARY`.\n- **Apify workflow support**: API access, Dataset exports, schedules, integrations, run history, and spend limits.\n\n## Output\n\nResults are written to the run's default Apify Dataset. Use the [Output tab](https://apify.com/kazkn/crexi-search-actor/output-schema) to inspect the schema, then download the Dataset as JSON, CSV, Excel, XML, or RSS, or access it through the Apify API and integrations.\n\n### What data can this Crexi scraper extract?\n\n| Data group | Representative fields |\n|---|---|\n| Identity | `source`, `source_listing_id`, `listing_url`, `scraped_at` |\n| Location | `address`, `city`, `state`, `zip`, `country`, `market` |\n| Transaction | `transaction_type`, `status`, `asking_price_or_rent`, `currency` |\n| Financials | `asking_amount_usd`, `price_per_sqft`, `price_per_unit`, `rent_per_sqft_per_year`, `estimated_annual_rent`, `estimated_monthly_rent`, `noi`, `cap_rate` |\n| Property | `asset_class`, `sub_type`, `building_size_sqft`, `total_available_sqft`, `lot_size_sqft`, `lot_size_acres`, `units`, `year_built`, `days_on_market` |\n| Public brokerage data | `broker_name`, `broker_company`, `broker_company_website`, `broker_phone`, `broker_email`, `broker_profile_url`, `broker_license_numbers` |\n| Quality and enrichment | `enrichment_status`, `data_quality_notes` |\n\nIf Crexi does not expose a fact publicly, the value remains `not public`. The Actor does not invent a value merely to fill a column.\n\n### Output example\n\n~~~json\n{\n  \"source\": \"crexi\",\n  \"source_listing_id\": \"123456\",\n  \"listing_url\": \"https://www.crexi.com/properties/123456/example-office\",\n  \"transaction_type\": \"sale\",\n  \"asset_class\": \"office\",\n  \"status\": \"active\",\n  \"address\": \"100 Congress Ave, Austin, TX 78701\",\n  \"city\": \"Austin\",\n  \"state\": \"TX\",\n  \"asking_price_or_rent\": \"$1,500,000\",\n  \"currency\": \"USD\",\n  \"asking_amount_usd\": 1500000,\n  \"building_size_sqft\": 10000,\n  \"cap_rate\": \"6%\",\n  \"broker_name\": \"not public\",\n  \"broker_company\": \"not public\",\n  \"enrichment_status\": \"search_only\",\n  \"scraped_at\": \"2026-01-01T00:00:00.000Z\"\n}\n~~~\n\nThe example is illustrative. Field availability depends on the public listing, the transaction type, the selected filters, and whether public detail enrichment is enabled.\n\n### Output field reference\n\nEach row is a flat scalar record designed for spreadsheets, APIs, CRM imports, and BI tools.\n\n~~~typescript\n{\n  source: \"crexi\",\n  source_listing_id: string,\n  listing_url: string,\n  scraped_at: string,\n\n  address: string,\n  city: string,\n  state: string,\n  zip: string,\n  country: string,\n  market: string,\n\n  transaction_type: \"sale\" | \"lease\",\n  asset_class: string,\n  sub_type: string,\n  status: string,\n\n  asking_price_or_rent: string,\n  currency: string,\n  asking_amount_usd: number | string,\n  price_per_sqft: string,\n  price_per_unit: string,\n  rent_per_sqft_per_year: string,\n  estimated_annual_rent: string,\n  estimated_monthly_rent: string,\n  noi: string,\n  cap_rate: string,\n\n  building_size_sqft: number | string,\n  total_available_sqft: number | string,\n  lot_size_sqft: number | string,\n  lot_size_acres: number | string,\n  units: number | string,\n  year_built: number | string,\n  days_on_market: number | string,\n\n  broker_name: string,\n  broker_company: string,\n  broker_company_website: string,\n  broker_phone: string,\n  broker_email: string,\n  broker_profile_url: string,\n  broker_license_numbers: string,\n\n  enrichment_status: string,\n  data_quality_notes: string\n}\n~~~\n\n## Public enrichment\n\n### Public listing and broker enrichment\n\nSet `includeListingDetails` to `true` to request additional public detail pages and endpoints. Enrichment is bounded by the run deadline and may add property, company, broker, phone, email, profile, or license fields only when the public evidence is sufficiently matched.\n\nMissing or weakly matched facts remain `not public`. The V1 does not access authenticated contact data, gated account data, or private datasets. Keep enrichment disabled for the fastest broad market export.\n\n## Completion and failures\n\n### Completion, partial runs, and failures\n\nThe `RUN_SUMMARY` key-value record contains a sanitized status, row counts, and bounded task outcomes:\n\n- `complete`: the requested target was reached, or a natural inventory shortage was proven.\n- `partial`: compliant rows were preserved, but a deadline, technical limit, or representable-URL limitation prevents a complete claim.\n- `technical_failure`: no usable row survived a total collection incident.\n\nThe Actor never pads results with off-filter listings. A platform `SUCCEEDED` status is not a data-quality guarantee; inspect the stored input, logs, Dataset, filters, uniqueness, and `RUN_SUMMARY` together.\n\n## Who is this Crexi scraper for?\n\n| Persona | Use case |\n|---|---|\n| CRE brokers | Review public inventory, asking terms, and broker identity by market |\n| Investment sales teams | Build sale and lease market scans with repeatable filters |\n| Acquisition teams | Export property rows into underwriting and diligence workflows |\n| REITs and family offices | Compare public inventory without rebuilding the same spreadsheet |\n| Lenders and appraisers | Review asking-price, size, cap-rate, and market signals |\n| Data teams | Use the Dataset as a commercial real estate API source |\n| Lead-generation teams | Review public broker fields where the source exposes them |\n\n## Try the Crexi scraper with a small run\n\nFor a first validation, use a narrow city search with `maxResults: 10` and `includeListingDetails: false`. This confirms connectivity, filters, output shape, and cost before you scale to a larger market.\n\nApify account credits and any plan-specific discounts are shown in the live Store interface. Always check the [Pricing tab](https://apify.com/kazkn/crexi-search-actor/pricing) before starting a large export.\n\n## Pricing\n\nThis Actor uses Apify's pay-per-event model. The current Store configuration is intentionally simple:\n\n| Event | Current price | When |\n|---|---:|---|\n| Actor start | $0.00005 per run | Once when the scraping run starts |\n| Validated Crexi listing | $0.003 per listing | Each validated row written to the default Dataset |\n| Public enrichment | Included in the listing event | No separate V1 contact-unlock event |\n| Platform usage pass-through | Disabled | The Store does not add a separate platform-usage charge in the current configuration |\n\nApproximate event cost:\n\n| Validated listings | Listing charges |\n|---:|---:|\n| 10 | $0.03 |\n| 100 | $0.30 |\n| 1,000 | $3.00 |\n\nThe exact customer price can vary with Apify plan discounts. The live [Pricing tab](https://apify.com/kazkn/crexi-search-actor/pricing) is authoritative. Do not confuse a requested `maxResults` target with a guaranteed number of billable rows: only validated rows written to the Dataset trigger the result event.\n\n## Tips for reliable runs\n\n- Start with `maxResults: 10` for a quick public-data check.\n- Use one state and one city or county for a focused manual search.\n- Keep `includeListingDetails` disabled for the fastest bulk export.\n- Use a complete official URL when you already configured a precise Crexi search.\n- Keep the URL query parameters intact; URL mode is authoritative.\n- Use `outputSortBy` when a spreadsheet or review workflow needs predictable ordering.\n- Split very broad markets into smaller runs instead of requesting an unnecessarily large target.\n- Treat fewer rows as a possible natural shortage or strict filter result; consult `RUN_SUMMARY` before changing the query.\n- Review the Dataset and sanitized summary together rather than relying only on the platform run badge.\n\n## Is scraping Crexi legal?\n\nThis Actor is an unofficial tool for public data. It does not bypass a login, request cookies, or collect private account data. You are responsible for choosing a lawful purpose, respecting Crexi's terms, handling personal data appropriately, and complying with applicable privacy, copyright, and data-protection rules.\n\nPublic broker fields can still contain personal data. Use only information you have a legitimate reason to process, protect exported data, and consult qualified legal counsel when your use case is uncertain. This section is general information, not legal advice.\n\n## Security\n\nThe Actor uses public Crexi pages and endpoints without cookies or a connected session. It does not request user-supplied scraping credentials. Public URLs and outbound targets are validated, and diagnostics exclude query strings, raw response bodies, and secrets.\n\nThe Actor never claims that an unavailable public value is known. Unsupported or unsafe URL inputs fail closed instead of being silently redirected into a broader search.\n\n## Limits\n\n### Known boundaries\n\n- 🧭 Manual searches require a US state; city and county matching depends on public Crexi inventory.\n- 🔗 URL mode returns at most 1,000 rows per run.\n- 🔢 `maxResults` is a target, not a promise that enough matching public listings exist.\n- 📋 Public broker contacts are optional and never guaranteed.\n- 🕒 Enrichment and very broad searches can take longer than a small filtered run.\n- 🧾 Sold, closed, off-market, authenticated, and private datasets are outside V1.\n- 🗓️ Monitoring and transaction tracking are outside V1 and reserved for a future version.\n- 🔄 Crexi can change its public pages or endpoints; future changes may reduce fields or require maintenance.\n\n## FAQ\n\n### What does the Crexi scraper do?\n\nIt searches public Crexi commercial real estate listings by market or official URL, filters sale and lease results, normalizes the rows, and writes them to an Apify Dataset.\n\n### How do I scrape Crexi listings?\n\nOpen the [Input tab](https://apify.com/kazkn/crexi-search-actor/input-schema), choose manual mode or URL mode, provide a state or public Crexi URL, select the filters you need, and run the Actor. The numbered tutorial above shows the recommended first run.\n\n### Do I need a Crexi login, cookies, or an API key?\n\nNo. The Actor uses public Crexi pages and endpoints without a connected Crexi session, Crexi cookies, or a user-supplied Crexi API key. You still need an Apify account to run an Apify Actor.\n\n### Is this an official Crexi API?\n\nNo. This is an unofficial public-data scraper. Crexi's official API offerings and commercial agreements are separate from this Actor. Do not represent this Actor as affiliated with or endorsed by Crexi.\n\n### Can I scrape both sale and lease listings?\n\nYes. Select `sale`, `lease`, or both. Each row keeps a normalized `transaction_type` so sale and lease records remain distinguishable.\n\n### Can I paste a Crexi URL?\n\nYes. Paste a public search or direct listing URL in `startUrls`. URL mode is authoritative and preserves the supported filters represented by each URL.\n\n### How much does it cost to scrape Crexi?\n\nThe current price is $0.00005 per run start plus $0.003 per validated listing. For example, 100 validated listings cost approximately $0.30 in result events, before any plan-specific Store discount. Check the live [Pricing tab](https://apify.com/kazkn/crexi-search-actor/pricing) for the price shown to your account.\n\n### Is the Crexi scraper free?\n\nYou can test it with a small run and the credits available on your Apify account. The Store shows the applicable allowance, event price, and any plan discount before you scale up.\n\n### Why did I receive fewer rows than `maxResults`?\n\n`maxResults` is a target. Restrictive filters, a naturally small market, missing public values required by a numeric filter, an access challenge, or a deadline can produce fewer valid rows. `RUN_SUMMARY` explains whether the result is `complete` or `partial`.\n\n### Does it include broker phone numbers and emails?\n\nOnly when the source or a public detail page exposes them and the value can be matched confidently to the listing. If a contact is gated, missing, or ambiguous, the Dataset keeps the field explicit instead of inventing a value.\n\n### Can I use the Actor for monitoring or transaction tracking?\n\nNot in V1. You can schedule ordinary runs and compare Datasets yourself, but dedicated monitoring and transaction-tracking features are reserved for a future version.\n\n### Can I export the results to CSV or Excel?\n\nYes. Apify lets you download the default Dataset as JSON, CSV, Excel, XML, or RSS, and connect it to APIs, webhooks, integrations, Google Sheets, warehouses, spreadsheets, and CRMs.\n\n### Can I scrape LoopNet and Crexi together?\n\nNot with this Crexi-only Actor. Use [Commercial Real Estate Brokerage Intelligence — LoopNet + Crexi](https://apify.com/kazkn/commercial-real-estate-brokerage-intel) when you want both platforms scraped, normalized, and exported together. This Actor remains focused on the standalone Crexi workflow.\n\n### Where can I report a problem?\n\nOpen an [Apify issue](https://apify.com/kazkn/crexi-search-actor/issues/open) with the run ID, a redacted input, the `RUN_SUMMARY` status, and the expected result. Never send credentials, cookies, tokens, private contact data, or copied remote response bodies.\n\n## Other commercial real estate Actors\n\n<a href=\"https://apify.com/kazkn/commercial-real-estate-brokerage-intel\">\n  <img src=\"https://api.apify.com/v2/key-value-stores/wTxgQ9qIPXv6jmGvM/records/CREXI_ONLY_VS_COMBINED_WORKFLOW\" width=\"960\" alt=\"Comparison of the Crexi-only workflow with the combined LoopNet and Crexi market-file workflow\" />\n</a>\n\n> This original comparison illustration makes the difference between Crexi-only scraping and simultaneous LoopNet + Crexi scraping immediately clear.\n\n| Actor | When to choose it |\n|---|---|\n| [Crexi Scraper](https://apify.com/kazkn/crexi-search-actor) | Crexi-only public listing search, filtering, and optional enrichment |\n| [Commercial Real Estate Brokerage Intelligence — LoopNet + Crexi](https://apify.com/kazkn/commercial-real-estate-brokerage-intel) | Scrape LoopNet and Crexi together, normalize the records, and export a broker-ready market file |\n\nUse the Crexi-only Actor when source isolation, a simple input form, and transparent per-listing pricing are the priority.\n\nFor a visual overview of the combined workflow, watch the [short LoopNet + Crexi demo](https://youtu.be/TVAcUSzaS7w) on the broader Actor page.\n\n## Technical notes\n\n- Stack: Apify SDK, Crawlee, TypeScript, and Node.js.\n- Source: public Crexi listing pages and public endpoints.\n- Output: Apify Dataset plus a sanitized `RUN_SUMMARY` key-value record.\n- Input: manual state/city search or authoritative official URL mode.\n- Enrichment: bounded public listing and broker enrichment only.\n- API: standard Apify Actor API, Dataset API, exports, schedules, and integrations.\n\n## Support\n\nOpen an [issue on Apify](https://apify.com/kazkn/crexi-search-actor/issues/open) for bugs, feature requests, additional fields, custom exports, or market-specific improvements.\n\nIf this Actor helps your workflow, an honest Apify review helps other commercial real estate teams evaluate it and helps prioritize maintenance.\n\nBuilt for teams that want cleaner public Crexi data without rebuilding the same commercial real estate spreadsheet every morning.\n",
      "dockerfile": "./Dockerfile",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "Validated Crexi listings",
          "description": "Flat commercial real estate sale and lease listing rows validated against the active Crexi input contract. Unavailable public facts are returned as not public.",
          "fields": {
            "$schema": "http://json-schema.org/draft-07/schema#",
            "type": "object",
            "required": [
              "address",
              "city",
              "state",
              "zip",
              "country",
              "market",
              "transaction_type",
              "source",
              "listing_url",
              "source_listing_id",
              "asset_class",
              "status",
              "asking_price_or_rent",
              "currency",
              "asking_amount_usd",
              "price_per_sqft",
              "rent_per_sqft_per_year",
              "estimated_annual_rent",
              "estimated_monthly_rent",
              "building_size_sqft",
              "total_available_sqft",
              "days_on_market",
              "broker_company",
              "enrichment_status",
              "data_quality_notes",
              "scraped_at"
            ],
            "additionalProperties": false,
            "properties": {
              "address": {
                "type": "string",
                "title": "Address",
                "description": "Public listing address, or not public when Crexi does not expose one.",
                "example": "100 Congress Ave, Austin, TX 78701"
              },
              "city": {
                "type": "string",
                "title": "City",
                "description": "Normalized city exposed by the public listing, or not public.",
                "example": "Austin"
              },
              "state": {
                "type": "string",
                "title": "State",
                "description": "Normalized US state code or source-provided region, or not public.",
                "example": "TX"
              },
              "zip": {
                "type": "string",
                "title": "ZIP or postal code",
                "description": "Postal code exposed by the public listing, or not public.",
                "example": "78701"
              },
              "country": {
                "type": "string",
                "title": "Country",
                "description": "Country code supported by public listing evidence.",
                "example": "US"
              },
              "market": {
                "type": "string",
                "title": "Market",
                "description": "Human-readable city and state market label, or the most precise public location.",
                "example": "Austin, TX"
              },
              "transaction_type": {
                "type": "string",
                "enum": [
                  "sale",
                  "lease"
                ],
                "title": "Transaction type",
                "description": "Normalized Crexi sale or lease transaction.",
                "example": "sale"
              },
              "source": {
                "type": "string",
                "enum": [
                  "crexi"
                ],
                "title": "Source",
                "description": "Listing platform that produced the validated row.",
                "example": "crexi"
              },
              "listing_url": {
                "type": "string",
                "title": "Listing URL",
                "description": "Canonical public Crexi listing URL.",
                "example": "https://www.crexi.com/properties/123456/example-office"
              },
              "source_listing_id": {
                "type": "string",
                "title": "Source listing ID",
                "description": "Stable listing identifier exposed by Crexi.",
                "example": "123456"
              },
              "asset_class": {
                "type": "string",
                "enum": [
                  "office",
                  "retail",
                  "industrial",
                  "multifamily",
                  "land",
                  "hotel",
                  "mixed-use",
                  "specialty",
                  "unknown"
                ],
                "title": "Asset class",
                "description": "Normalized commercial property class.",
                "example": "office"
              },
              "sub_type": {
                "type": "string",
                "title": "Property sub-type",
                "description": "Public property sub-type when detail enrichment is enabled, or not public.",
                "example": "Medical Office"
              },
              "status": {
                "type": "string",
                "enum": [
                  "active",
                  "under_contract",
                  "sold",
                  "leased",
                  "removed",
                  "off_market",
                  "unknown"
                ],
                "title": "Listing status",
                "description": "Normalized public listing status.",
                "example": "active"
              },
              "asking_price_or_rent": {
                "type": "string",
                "title": "Asking price or rent",
                "description": "Formatted sale price, lease rent, upon-request marker, or not public.",
                "example": "$1,500,000"
              },
              "currency": {
                "type": "string",
                "title": "Currency",
                "description": "Source currency when public and supported, or not public.",
                "example": "USD"
              },
              "asking_amount_usd": {
                "type": [
                  "number",
                  "string"
                ],
                "title": "Comparable asking amount in USD",
                "description": "Numeric sale price or comparable annual lease amount in USD, or not public.",
                "example": 1500000
              },
              "price_per_sqft": {
                "type": "string",
                "title": "Price per square foot",
                "description": "Public or derived USD sale price per square foot, or not public.",
                "example": "$150/SF"
              },
              "price_per_unit": {
                "type": "string",
                "title": "Price per unit",
                "description": "Derived USD sale price per public unit count, or not public.",
                "example": "$150,000"
              },
              "rent_per_sqft_per_year": {
                "type": "string",
                "title": "Rent per square foot per year",
                "description": "Annualized public USD lease rent per square foot, or not public.",
                "example": "$24/SF/YR"
              },
              "estimated_annual_rent": {
                "type": "string",
                "title": "Estimated annual rent",
                "description": "Formatted annual rent derived from compatible public USD lease facts, or not public.",
                "example": "$240,000"
              },
              "estimated_monthly_rent": {
                "type": "string",
                "title": "Estimated monthly rent",
                "description": "Formatted monthly rent derived from compatible public USD lease facts, or not public.",
                "example": "$20,000"
              },
              "noi": {
                "type": "string",
                "title": "Net operating income",
                "description": "Source-declared public net operating income in USD, or not public.",
                "example": "$90,000"
              },
              "cap_rate": {
                "type": "string",
                "title": "Cap rate",
                "description": "Source-listed rate or rate derived from source-declared NOI and asking price, or not public.",
                "example": "6%"
              },
              "building_size_sqft": {
                "type": [
                  "number",
                  "string"
                ],
                "title": "Building size in square feet",
                "description": "Public building size in square feet, or not public.",
                "example": 10000
              },
              "total_available_sqft": {
                "type": [
                  "number",
                  "string"
                ],
                "title": "Available size in square feet",
                "description": "Public total available lease or building space, or not public.",
                "example": 7500
              },
              "lot_size_sqft": {
                "type": [
                  "number",
                  "string"
                ],
                "title": "Lot size in square feet",
                "description": "Public lot size in square feet when details are enabled, or not public.",
                "example": 43560
              },
              "lot_size_acres": {
                "type": [
                  "number",
                  "string"
                ],
                "title": "Lot size in acres",
                "description": "Lot size converted from public square-foot evidence when details are enabled, or not public.",
                "example": 1
              },
              "units": {
                "type": [
                  "number",
                  "string"
                ],
                "title": "Units",
                "description": "Public unit count when details are enabled, or not public.",
                "example": 24
              },
              "year_built": {
                "type": [
                  "number",
                  "string"
                ],
                "title": "Year built",
                "description": "Public construction year when details are enabled, or not public.",
                "example": 2001
              },
              "days_on_market": {
                "type": [
                  "number",
                  "string"
                ],
                "title": "Days on market",
                "description": "Days calculated from a proven public listing date, or not public.",
                "example": 27
              },
              "broker_name": {
                "type": "string",
                "title": "Broker name",
                "description": "Public broker name when detail enrichment is enabled, or not public.",
                "example": "Jane Broker"
              },
              "broker_company": {
                "type": "string",
                "title": "Broker company",
                "description": "Public brokerage or listing company, or not public.",
                "example": "Example Realty"
              },
              "broker_company_website": {
                "type": "string",
                "title": "Broker company website",
                "description": "Sufficiently matched public brokerage website when details are enabled, or not public.",
                "example": "https://example.com"
              },
              "broker_phone": {
                "type": "string",
                "title": "Broker phone",
                "description": "Sufficiently matched public broker phone when details are enabled, or not public.",
                "example": "(512) 555-0100"
              },
              "broker_email": {
                "type": "string",
                "title": "Broker email",
                "description": "Sufficiently matched public broker email when details are enabled, or not public.",
                "example": "jane.broker@example.com"
              },
              "broker_profile_url": {
                "type": "string",
                "title": "Broker profile URL",
                "description": "Public Crexi broker profile URL when details are enabled, or not public.",
                "example": "https://www.crexi.com/profile/jane-broker"
              },
              "broker_license_numbers": {
                "type": "string",
                "title": "Broker license numbers",
                "description": "Comma-separated public license numbers when details are enabled, or not public.",
                "example": "TX-123"
              },
              "enrichment_status": {
                "type": "string",
                "enum": [
                  "search_only",
                  "detail_enriched",
                  "broker_enriched",
                  "detail_requested_but_unavailable"
                ],
                "title": "Enrichment status",
                "description": "Controlled status describing which public enrichment stage completed.",
                "example": "detail_enriched"
              },
              "data_quality_notes": {
                "type": "string",
                "title": "Data quality notes",
                "description": "Bounded comma-separated quality codes, or none.",
                "example": "none"
              },
              "scraped_at": {
                "type": "string",
                "title": "Collected at",
                "description": "UTC timestamp for collection of the public listing facts.",
                "example": "2026-07-27T12:00:00.000Z"
              }
            }
          },
          "views": {
            "overview": {
              "title": "Crexi listings overview",
              "description": "Core identity, location, transaction, price, size, and public brokerage fields for quick review.",
              "transformation": {
                "fields": [
                  "listing_url",
                  "source_listing_id",
                  "transaction_type",
                  "asset_class",
                  "status",
                  "address",
                  "city",
                  "state",
                  "asking_price_or_rent",
                  "asking_amount_usd",
                  "building_size_sqft",
                  "total_available_sqft",
                  "cap_rate",
                  "broker_name",
                  "broker_company",
                  "enrichment_status",
                  "scraped_at"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "listing_url": {
                    "label": "Listing URL",
                    "format": "link"
                  },
                  "asking_amount_usd": {
                    "label": "Asking amount (USD)",
                    "format": "number"
                  },
                  "building_size_sqft": {
                    "label": "Building size (sq ft)",
                    "format": "number"
                  },
                  "total_available_sqft": {
                    "label": "Available size (sq ft)",
                    "format": "number"
                  }
                }
              }
            },
            "financials": {
              "title": "Financials and enrichment",
              "description": "Financial, property-size, broker, and data-quality fields for analysis workflows.",
              "transformation": {
                "fields": [
                  "transaction_type",
                  "asset_class",
                  "asking_price_or_rent",
                  "asking_amount_usd",
                  "price_per_sqft",
                  "price_per_unit",
                  "rent_per_sqft_per_year",
                  "estimated_annual_rent",
                  "estimated_monthly_rent",
                  "noi",
                  "cap_rate",
                  "building_size_sqft",
                  "total_available_sqft",
                  "lot_size_sqft",
                  "lot_size_acres",
                  "year_built",
                  "units",
                  "broker_name",
                  "broker_company",
                  "broker_phone",
                  "broker_email",
                  "enrichment_status",
                  "data_quality_notes"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "asking_amount_usd": {
                    "label": "Asking amount (USD)",
                    "format": "number"
                  },
                  "building_size_sqft": {
                    "label": "Building size (sq ft)",
                    "format": "number"
                  },
                  "total_available_sqft": {
                    "label": "Available size (sq ft)",
                    "format": "number"
                  },
                  "lot_size_sqft": {
                    "label": "Lot size (sq ft)",
                    "format": "number"
                  },
                  "lot_size_acres": {
                    "label": "Lot size (acres)",
                    "format": "number"
                  },
                  "year_built": {
                    "label": "Year built",
                    "format": "number"
                  },
                  "units": {
                    "label": "Units",
                    "format": "number"
                  }
                }
              }
            }
          }
        },
        "keyValueStore": {
          "$schema": "https://apify.com/schemas/v1/key-value-store.ide.json",
          "actorKeyValueStoreSchemaVersion": 1,
          "title": "Crexi Scraper run records",
          "description": "The public run record contains only a bounded status, row counts, and controlled task outcomes. It excludes request URLs, queries, remote response bodies, and credentials.",
          "collections": {
            "run_summary": {
              "title": "Run summary",
              "description": "RUN_SUMMARY reports status, rawRows, finalRows, and sanitized per-task outcomes with fixed allowlisted reason, phase, and route codes and no remote response details.",
              "keyPrefix": "RUN_SUMMARY",
              "contentTypes": [
                "application/json"
              ]
            }
          }
        }
      }
    },
    "buildNumber": "0.1.21",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "0.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.0025811111111111113
    }
  }
}