{
  "openapi": "3.0.1",
  "info": {
    "title": "JLL Scraper: Commercial Property Listings for Lease & Sale",
    "description": "Scrape property.jll.com, JLL commercial real estate listings in 14 markets: office, industrial, retail and land for lease or sale with size in m2 and sq ft, coordinates, photos, floor plans, brochures and available suites. Sitemap, market summaries, new-listing monitor. No proxy. Export JSON, CSV.",
    "version": "0.1",
    "x-build-id": "SdsS5Rg75h3wi4EOd"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/recordsdata~jll-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-recordsdata-jll-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/recordsdata~jll-scraper/runs": {
      "post": {
        "operationId": "runs-sync-recordsdata-jll-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/recordsdata~jll-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-recordsdata-jll-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "title": "What do you want to collect?",
            "enum": [
              "search",
              "sitemap",
              "urls",
              "market"
            ],
            "type": "string",
            "description": "Search = listings by market, deal type and place. Sitemap = every listing, newest first. Addresses = links you paste. Market = one summary row per search page. Example: search.",
            "default": "search"
          },
          "maxItems": {
            "title": "Max items to return (free plan: 10)",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Stops after this many rows. Example: 50. Free plans are limited to 10 items per run.",
            "default": 50
          },
          "markets": {
            "title": "Country sites (markets)",
            "type": "array",
            "description": "Which JLL country sites to read. The United States has most of the catalog (about 10,700 of 13,100 listings). Empty means the United States.",
            "items": {
              "type": "string",
              "enum": [
                "us",
                "ca-en",
                "ca-fr",
                "mx",
                "br-pt",
                "br-en",
                "cl",
                "co",
                "ar",
                "cr",
                "pe",
                "uy",
                "pr",
                "za"
              ],
              "enumTitles": [
                "United States",
                "Canada (English)",
                "Canada (French)",
                "Mexico",
                "Brazil (Portuguese)",
                "Brazil (English)",
                "Chile",
                "Colombia",
                "Argentina",
                "Costa Rica",
                "Peru",
                "Uruguay",
                "Puerto Rico",
                "South Africa"
              ]
            },
            "default": [
              "us"
            ]
          },
          "tenure": {
            "title": "Deal type (rent, sale or both)",
            "enum": [
              "any",
              "rent",
              "sale"
            ],
            "type": "string",
            "description": "Rent (lease, sublease), sale, or both. Used by search, market and sitemap modes.",
            "default": "any"
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Office, industrial, retail, land and more (search, market and sitemap modes). Empty means all types. The Latin American markets also use warehouse.",
            "items": {
              "type": "string",
              "enum": [
                "office",
                "industrial",
                "retail",
                "land",
                "warehouse",
                "medical",
                "multifamily",
                "lab",
                "coworking",
                "data-center"
              ],
              "enumTitles": [
                "Office",
                "Industrial",
                "Retail",
                "Land",
                "Warehouse",
                "Medical",
                "Multifamily",
                "Lab",
                "Flex R&D (coworking)",
                "Data center"
              ]
            },
            "default": []
          },
          "locations": {
            "title": "Places (city, state or neighborhood)",
            "type": "array",
            "description": "Optional. Cities, states or neighborhoods as written in JLL addresses, for example houston, texas, sao paulo, toronto. Search and market modes match the names of JLL search pages; sitemap mode matches the words of each listing address. Empty means no place filter.",
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Min price (published price, in currency below)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings with a published price at or above this figure, in the currency below. The figure is compared as JLL shows it (often per square foot or per m2, not the total). Leave empty or 0 for no limit."
          },
          "maxPrice": {
            "title": "Max price (published price, in currency below)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings with a published price at or below this figure, in the currency below. Leave empty or 0 for no limit."
          },
          "priceCurrency": {
            "title": "Price currency code (e.g. USD)",
            "type": "string",
            "description": "Three-letter code of the currency the price filter refers to, for example USD, CAD, BRL, MXN, CLP. Required when a price filter is set.",
            "default": ""
          },
          "minAreaM2": {
            "title": "Min area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings whose size range reaches at least this many square meters (1,000 m2 is about 10,764 sq ft). Leave empty or 0 for no limit."
          },
          "maxAreaM2": {
            "title": "Max area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings that offer at most this many square meters. Leave empty or 0 for no limit."
          },
          "startUrls": {
            "title": "JLL links (Addresses mode)",
            "type": "array",
            "description": "urls mode: JLL listing addresses (https://property.jll.com/listings/<name>, also /en-ca/, /pt-br/ and the other market prefixes) or search pages (for example https://property.jll.com/rent-office/houston). Query strings are ignored.",
            "items": {
              "type": "string"
            }
          },
          "modifiedSince": {
            "title": "Sitemap: changed since (YYYY-MM-DD)",
            "type": "string",
            "description": "sitemap mode: only listings the site sitemap reports as changed on or after this date, written YYYY-MM-DD (for example 2026-10-01). Empty means no date limit.",
            "default": ""
          },
          "fetchDetails": {
            "title": "Open each listing page (full details)",
            "type": "boolean",
            "description": "On: open each listing page for the full description, all photos, floor plans, amenities, brochures and business contact data (listing-detail-record). Off: card data only from the search page, about twice as fast, and in sitemap mode just the address and change date (listing-record, listing-url-record).",
            "default": true
          },
          "includeAvailabilities": {
            "title": "Add available spaces (suites and floors)",
            "type": "boolean",
            "description": "Also deliver one row for each space (suite, floor or unit) a listing offers, with its own size, rent, lease term and availability date (availability-record). Each space counts as one item and one extra request is made per listing.",
            "default": false
          },
          "includeContactDetails": {
            "title": "Add broker contact details",
            "type": "boolean",
            "description": "Adds the JLL brokers shown on each listing (name, job title, office, business email and phone, license number). These are individuals, so it is off by default; the JLL business phone, license number and office cities are always included.",
            "default": false
          },
          "includeRaw": {
            "title": "Add raw site data",
            "type": "boolean",
            "description": "Adds a raw object with the unprocessed site fields that have no dedicated column.",
            "default": false
          },
          "onlyNew": {
            "title": "Only new listings",
            "type": "boolean",
            "description": "Skip listings already delivered by an earlier run of the same search, so scheduled runs only return and charge for what is new. In sitemap mode a listing the site changed since is delivered again. The memory is stored in your own Apify account.",
            "default": false
          },
          "stateKey": {
            "title": "Monitor name",
            "type": "string",
            "description": "Optional label to keep several monitors on the same search apart.",
            "default": ""
          },
          "resetSeen": {
            "title": "Reset monitor memory",
            "type": "boolean",
            "description": "Clear the monitor memory for this search before the run, so everything counts as new.",
            "default": false
          },
          "maxScan": {
            "title": "Max pages to open (safety limit)",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Safety limit on search pages and listing pages opened in one run, whatever the number of items. Filters that match few listings can need many pages; raise it for deep scans.",
            "default": 300
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 4,
            "type": "integer",
            "description": "Listing pages opened in parallel. All requests share one pace of about one per second to respect the site, so this only hides waiting time.",
            "default": 2
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. Empty means direct requests, which work. If the site keeps refusing a connection, the actor switches to the Apify datacenter proxy on its own."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}