{
  "openapi": "3.0.1",
  "info": {
    "title": "Jitty UK AI Property Scraper",
    "description": "Scrape residential property listings from jitty.com, extract properties across the UK with 20+ filters, including AI vision search.",
    "version": "0.1",
    "x-build-id": "zstu1VOyOQnh4qUwv"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~jitty-uk-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-jitty-uk-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/abotapi~jitty-uk-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-jitty-uk-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/abotapi~jitty-uk-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-jitty-uk-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Scraping mode: 'search' builds URL from filters, 'url' uses provided URLs directly",
            "default": "search"
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "Location to search (e.g. 'london', 'bath', 'greenwich', 'manchester'). Leave empty for all UK.",
            "default": "london"
          },
          "radius_miles": {
            "title": "Search Radius (miles)",
            "minimum": 1,
            "maximum": 40,
            "type": "integer",
            "description": "Expand the search to include nearby areas within this many miles of the location."
          },
          "look_for": {
            "title": "AI Search",
            "type": "string",
            "description": "Search by visual features (e.g. 'cottage', 'sea_views', 'warehouse_conversion', 'barn_conversion', 'character_property'). Can be combined with location and other filters."
          },
          "property_type": {
            "title": "Property Type",
            "enum": [
              "flat",
              "detached",
              "semi-detached",
              "terraced",
              "bungalow",
              "maisonette",
              "land",
              "boat",
              "mobile-home",
              "parking"
            ],
            "type": "string",
            "description": "Filter by property type"
          },
          "bedrooms": {
            "title": "Min Bedrooms",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Minimum number of bedrooms (0=Studio+)"
          },
          "max_bedrooms": {
            "title": "Max Bedrooms",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Maximum number of bedrooms"
          },
          "min_bathrooms": {
            "title": "Min Bathrooms",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Minimum number of bathrooms"
          },
          "min_price": {
            "title": "Min Price (GBP)",
            "type": "integer",
            "description": "Minimum price in British Pounds (use with max_price for range)"
          },
          "max_price": {
            "title": "Max Price (GBP)",
            "type": "integer",
            "description": "Maximum price in British Pounds"
          },
          "ownership": {
            "title": "Ownership",
            "enum": [
              "freehold",
              "leasehold",
              "shared-ownership",
              "share-of-freehold"
            ],
            "type": "string",
            "description": "Filter by ownership type"
          },
          "condition": {
            "title": "Condition",
            "enum": [
              "good",
              "renovation-potential",
              "renovation-needed",
              "derelict"
            ],
            "type": "string",
            "description": "Filter by property condition"
          },
          "exterior_style": {
            "title": "Exterior Style",
            "enum": [
              "period",
              "contemporary",
              "early-modern",
              "late-modern"
            ],
            "type": "string",
            "description": "Filter by exterior style"
          },
          "date_added": {
            "title": "Date Added",
            "enum": [
              "24h",
              "3d",
              "1w",
              "1m"
            ],
            "type": "string",
            "description": "Filter by when listing was added"
          },
          "min_area_sqft": {
            "title": "Min Area (sqft)",
            "type": "integer",
            "description": "Minimum floor area in square feet"
          },
          "max_area_sqft": {
            "title": "Max Area (sqft)",
            "type": "integer",
            "description": "Maximum floor area in square feet"
          },
          "outside_space": {
            "title": "Outside Space",
            "enum": [
              "garden",
              "large-garden",
              "balcony",
              "roof-terrace",
              "communal-garden",
              "patio"
            ],
            "type": "string",
            "description": "Filter by outdoor area type"
          },
          "interior_features": {
            "title": "Interior Features",
            "type": "array",
            "description": "Filter by interior features. Multiple features are combined.",
            "items": {
              "type": "string",
              "enum": [
                "fireplace",
                "exposed-brickwork",
                "high-ceilings",
                "sash-windows",
                "wooden-beams",
                "vaulted-ceilings",
                "open-plan-kitchen",
                "kitchen-island",
                "breakfast-bar"
              ]
            }
          },
          "green_tech": {
            "title": "Green Tech",
            "enum": [
              "solar-panels",
              "ev-charger",
              "heat-pump",
              "underfloor-heating"
            ],
            "type": "string",
            "description": "Filter by green technology"
          },
          "urls": {
            "title": "Search URLs",
            "type": "array",
            "description": "URLs to scrape (url mode only). Provide jitty.com search URLs.",
            "items": {
              "type": "string"
            }
          },
          "include_details": {
            "title": "Include Full Details",
            "type": "boolean",
            "description": "Add coordinates, floor area, tenure, EPC, council tax, estate agent, features, and full address to each property. Turn off for a faster, lighter run with card-level fields only.",
            "default": true
          },
          "max_properties": {
            "title": "Max Properties",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of properties to scrape (0=unlimited)",
            "default": 10
          },
          "max_pages": {
            "title": "Max Pages",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum search result pages to fetch. Leave empty (or 0) to go as deep as needed, bounded by Max Properties."
          },
          "resumeFromRunId": {
            "title": "Resume from run/dataset ID",
            "type": "string",
            "description": "Continue ONE interrupted crawl: paste a previous run or dataset ID and this run will skip properties it already collected. For recurring monitoring of the same search instead, use Incremental mode below (the two are mutually exclusive when Incremental mode has no saved state yet)."
          },
          "incrementalMode": {
            "title": "Incremental mode (recurring monitoring)",
            "type": "boolean",
            "description": "Remembers the previous run of this SAME search itself (no need to paste a run ID) and classifies every property as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED. Intended for scheduled/recurring runs against an unchanged search. See 'Resume from run/dataset ID' above for continuing one interrupted crawl instead.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional)",
            "type": "string",
            "description": "Manual label for the Incremental mode baseline. Leave empty to auto-derive one from the mode, location/URLs and every filter (so two different searches never share state). Set this to deliberately share one baseline across otherwise-different filter setups."
          },
          "emitUnchanged": {
            "title": "Emit unchanged properties",
            "type": "boolean",
            "description": "Incremental mode only. When off (default), a property with no detected change since the last run is not returned or billed. Turn on to also return (and bill for) UNCHANGED rows.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired properties",
            "type": "boolean",
            "description": "Incremental mode only. When on, a property tracked in a previous run that no longer appears after a complete scan of this search is returned once with changeType EXPIRED (and billed like any other row). Skipped whenever this run did not reach a genuine end of results (a page cap, a blocked page, or Resume from run/dataset ID).",
            "default": false
          },
          "proxy": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Proxy configuration. GB residential proxy recommended."
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}