{
  "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": "OM1ckybEW3f3HCIKd"
  },
  "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 to collect",
            "enum": [
              "search",
              "sitemap",
              "urls",
              "market"
            ],
            "type": "string",
            "description": "search = listings from the property search pages JLL publishes for the markets, deal type, property types and places below (each page shows up to 50 listings). sitemap = every listing address in the markets, newest first (the way to reach the full catalog). urls = the JLL listing or search addresses you list in startUrls. market = one summary row per search page: how many listings JLL shows, its market text and area statistics.",
            "default": "search"
          },
          "maxItems": {
            "title": "Maximum items",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Stops after this many rows (all record types together). Free plans are limited to 10 items per run.",
            "default": 50
          },
          "markets": {
            "title": "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",
            "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",
            "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": "Minimum price",
            "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": "Maximum price",
            "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",
            "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": "Minimum area (m2)",
            "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": "Maximum area (m2)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings that offer at most this many square meters. Leave empty or 0 for no limit."
          },
          "startUrls": {
            "title": "Addresses",
            "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": "Changed since (date)",
            "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 every listing",
            "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": "Include available spaces",
            "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": "Include broker 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": "Include 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 (monitor)",
            "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": "Forget seen listings",
            "type": "boolean",
            "description": "Clear the monitor memory for this search before the run, so everything counts as new.",
            "default": false
          },
          "maxScan": {
            "title": "Maximum pages to open",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}