addrbookFor publishers
← The evidence ledger

Evidence row 1054110

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint d02b0de7-9361-4a3b-9b8e-305e7f1582b0
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
d62161f91357c8944755988c8d1a4ccc8356899ce80b998dfc9e77d836ad3406
Leaf
0x064ad44b896c4e2dde306a0fc0de3a7b745697bc921e00530dffdd0261201a8d

What was observed

{
  "count": 99,
  "tools": [
    {
      "description": "Investigate recorded corporate ownership, title and agency relationships. Requires the customer's account; never use an anonymous preview key. Depth 1–3, at most 100 nodes; clipped networks explicitly say truncated. Cite publication IDs and provenance on each hop. Missing links are not negative findings. Individuals are excluded. An unpublished root costs no credits. Costs 15 credits (15p).",
      "inputSchema": {
        "properties": {
          "depth": {
            "default": 2,
            "title": "Depth",
            "type": "integer"
          },
          "entity_id": {
            "title": "Entity Id",
            "type": "string"
          },
          "kind": {
            "enum": [
              "organizations",
              "titles",
              "agents",
              "properties",
              "buildings",
              "land",
              "listings"
            ],
            "title": "Kind",
            "type": "string"
          },
          "limit": {
            "default": 50,
            "title": "Limit",
            "type": "integer"
          }
        },
        "required": [
          "kind",
          "entity_id"
        ],
        "title": "actor_networkArguments",
        "type": "object"
      },
      "name": "actor_network"
    },
    {
      "description": "Find a recorded path between two corporate-network records within three hops. Requires the customer's account. A clipped search returns incomplete, never a claim that no relationship exists. Return the ordered hops with their source/publication evidence. Costs 15 credits (15p).",
      "inputSchema": {
        "properties": {
          "depth": {
            "default": 3,
            "title": "Depth",
            "type": "integer"
          },
          "limit": {
            "default": 100,
            "title": "Limit",
            "type": "integer"
          },
          "source_id": {
            "title": "Source Id",
            "type": "string"
          },
          "source_kind": {
            "enum": [
              "organizations",
              "titles",
              "agents",
              "properties",
              "buildings",
              "land",
              "listings"
            ],
            "title": "Source Kind",
            "type": "string"
          },
          "target_id": {
            "title": "Target Id",
            "type": "string"
          },
          "target_kind": {
            "enum": [
              "organizations",
              "titles",
              "agents",
              "properties",
              "buildings",
              "land",
              "listings"
            ],
            "title": "Target Kind",
            "type": "string"
          }
        },
        "required": [
          "source_kind",
          "source_id",
          "target_kind",
          "target_id"
        ],
        "title": "actor_pathArguments",
        "type": "object"
      },
      "name": "actor_path"
    },
    {
      "description": "\n    Address autocomplete. Returns ranked candidates for a partial address or\n    postcode. Use `address_resolve` to turn a candidate into a canonical UPRN.\n\n    This is the free entry point: resolve, lookup and postcode listing are\n    priced because they return OS AddressBase content, but narrowing a search\n    is not. Prefer it for anything interactive, and resolve once at the end.\n\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "country": {
            "default": "UK",
            "title": "Country",
            "type": "string"
          },
          "max_results": {
            "default": 10,
            "title": "Max Results",
            "type": "integer"
          },
          "q": {
            "title": "Q",
            "type": "string"
          }
        },
        "required": [
          "q"
        ],
        "title": "address_autocompleteArguments",
        "type": "object"
      },
      "name": "address_autocomplete"
    },
    {
      "description": "Return all addresses at a UK postcode. Costs 2 credits (2p); free on marketcode.ai.",
      "inputSchema": {
        "properties": {
          "postcode": {
            "title": "Postcode",
            "type": "string"
          }
        },
        "required": [
          "postcode"
        ],
        "title": "address_by_postcodeArguments",
        "type": "object"
      },
      "name": "address_by_postcode"
    },
    {
      "description": "Look up an address by UPRN (UK only). Costs 1 credit (1p); free on marketcode.ai. Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "address_by_uprnArguments",
        "type": "object"
      },
      "name": "address_by_uprn"
    },
    {
      "description": "Resolve free-text address to canonical record (UPRN for UK). Costs 2 credits (2p); free on marketcode.ai.",
      "inputSchema": {
        "properties": {
          "country": {
            "default": "UK",
            "title": "Country",
            "type": "string"
          },
          "max_results": {
            "default": 5,
            "title": "Max Results",
            "type": "integer"
          },
          "query": {
            "title": "Query",
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "title": "address_resolveArguments",
        "type": "object"
      },
      "name": "address_resolve"
    },
    {
      "description": "\n    Which estate agents actually transact in an area, ranked by listing count.\n\n    Sale and rental are counted and averaged SEPARATELY — an asking price and a\n    monthly rent do not combine into one median, so read `median_asking_price`\n    and `median_monthly_rent` as answering different questions.\n\n    `area_id` is the marts area id from `area_resolve`.\n\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area_id": {
            "title": "Area Id",
            "type": "string"
          },
          "limit": {
            "default": 25,
            "title": "Limit",
            "type": "integer"
          },
          "listing_type": {
            "anyOf": [
              {
                "enum": [
                  "sale",
                  "rental"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Listing Type"
          },
          "months": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Months"
          }
        },
        "required": [
          "area_id"
        ],
        "title": "agent_activityArguments",
        "type": "object"
      },
      "name": "agent_activity"
    },
    {
      "description": "\n    The market for one area, as one document: sourcing readiness per strategy\n    from the coverage register, the commercial capital and rent indices with\n    rated stock, the planning decision record for the authority, and the live\n    listing stock.\n\n    THE TWO SCOPES ARE NOT INTERCHANGEABLE. Readiness, commercial stock and the\n    planning register are keyed on the LOCAL AUTHORITY (`lad_code`, a GSS code\n    — use `area_resolve` to get one); the live listing lane is keyed on\n    POSTCODE DISTRICT. Pass both to fill every section, and expect the\n    unsupplied half to read `not_available` with that reason rather than empty.\n\n    As with `property_report`, check `sections_degraded` before describing the\n    document as complete.\n    UK only. Costs 25 credits (25p).\n    ",
      "inputSchema": {
        "properties": {
          "lad_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Lad Code"
          },
          "postcode_district": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Postcode District"
          },
          "sector": {
            "default": "ALL",
            "title": "Sector",
            "type": "string"
          }
        },
        "title": "area_reportArguments",
        "type": "object"
      },
      "name": "area_report"
    },
    {
      "description": "\n    Resolve an area name or code (\"Hackney\", \"E5\") to its area_id, centroid\n    and full hierarchy as breadcrumbs. Call this first when a question is\n    about a named area rather than a specific address.\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area_name": {
            "title": "Area Name",
            "type": "string"
          },
          "h3_resolution": {
            "default": 9,
            "title": "H3 Resolution",
            "type": "integer"
          },
          "include_h3": {
            "default": false,
            "title": "Include H3",
            "type": "boolean"
          }
        },
        "required": [
          "area_name"
        ],
        "title": "area_resolveArguments",
        "type": "object"
      },
      "name": "area_resolve"
    },
    {
      "description": "\n    The area of a given type containing a coordinate. `type_id` is an area\n    type UUID and is required — a point sits inside one area per geography\n    layer, so without it the answer would be ambiguous.\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "lat": {
            "title": "Lat",
            "type": "number"
          },
          "lng": {
            "title": "Lng",
            "type": "number"
          },
          "type_id": {
            "title": "Type Id",
            "type": "string"
          }
        },
        "required": [
          "lat",
          "lng",
          "type_id"
        ],
        "title": "area_reverse_geocodeArguments",
        "type": "object"
      },
      "name": "area_reverse_geocode"
    },
    {
      "description": "\n    Composition of the built stock in an area: unit counts, HMO share,\n    mixed-use share, median building height and footprint, solar penetration.\n\n    Medians, not means — one tower would skew an average height enough to make\n    a low-rise district read as mid-rise. Percentages are whole percentages.\n\n    `area_id` is the marts area id from `area_resolve`.\n\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area_id": {
            "title": "Area Id",
            "type": "string"
          }
        },
        "required": [
          "area_id"
        ],
        "title": "area_stock_profileArguments",
        "type": "object"
      },
      "name": "area_stock_profile"
    },
    {
      "description": "Use the SAME Ask router as the portal. Route a place/kind into the published taxonomy, a dated figure to the governed semantic query, or exact company/property/title references to a bounded corporate network/path. This tool proposes execution; it does not execute paid work. Respect unsupported criteria and require acceptance of a paid proposal. Routing catalogue IDs are NOT evidence publication IDs; cite the eventual tool's data provenance. Free.",
      "inputSchema": {
        "properties": {
          "place_slug": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Place Slug"
          },
          "question": {
            "title": "Question",
            "type": "string"
          }
        },
        "required": [
          "question"
        ],
        "title": "ask_questionArguments",
        "type": "object"
      },
      "name": "ask_question"
    },
    {
      "description": "\n    Hedonic ASKING-PRICE index for one postcode district, local authority or\n    Great Britain, from portal listings (Rightmove ~95%), 2022M01 = 100, with\n    80% bands and posterior standard errors, smoothed toward the parent\n    geography.\n\n    Use this for \"how have asking prices in W14 moved since 2022\" or to see\n    whether sellers are ahead of or behind the sold-price index\n    (market_index_series). Asking LEADS sold by months and includes what never\n    sells; `value` is an index level, never a price. For asking-price LEVELS\n    use listing_market_series.\n\n    `area_code` is a postcode district (\"W14\") with area_type=\"district\", a\n    local authority NAME (\"Camden\") with area_type=\"lad\", or \"NATIONAL\". An\n    unknown area is an error naming the nearest matches; read them back.\n\n    READ provenance.pub_freq: the pipeline judged which grain this area's data\n    can resolve (posterior SE of the monthly move <= 1 pp). If it says\n    quarterly, prefer frequency=\"quarterly\" and say the monthly series is\n    noisy. `inc_se_pp` on each point is the SE of that period's move. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area_code": {
            "default": "NATIONAL",
            "title": "Area Code",
            "type": "string"
          },
          "area_type": {
            "default": "district",
            "enum": [
              "district",
              "lad",
              "national"
            ],
            "title": "Area Type",
            "type": "string"
          },
          "end": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "End"
          },
          "frequency": {
            "default": "monthly",
            "enum": [
              "monthly",
              "quarterly"
            ],
            "title": "Frequency",
            "type": "string"
          },
          "limit": {
            "default": 400,
            "title": "Limit",
            "type": "integer"
          },
          "method": {
            "default": "hedonic_smoothed",
            "enum": [
              "hedonic_smoothed",
              "hedonic_raw"
            ],
            "title": "Method",
            "type": "string"
          },
          "start": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Start"
          }
        },
        "title": "asking_price_index_seriesArguments",
        "type": "object"
      },
      "name": "asking_price_index_series"
    },
    {
      "description": "\n    Hedonic ASKING-RENT index for one postcode district, local authority or\n    Great Britain, from portal lettings, 2022M01 = 100, with bands and SEs.\n    This is the residential rent index; commercial_rent_index_series is the\n    VOA one for commercial property.\n\n    It is validated every build against the ONS Price Index of Private Rents\n    by local authority and NOT published in a month where the two disagree by\n    more than a few points a year — so a missing recent month is a refusal, not\n    an outage; say so. Asking rents, not achieved; `value` is an index level,\n    never a rent. For rent LEVELS and yields use listing_market_series.\n\n    Same area and frequency rules as asking_price_index_series. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area_code": {
            "default": "NATIONAL",
            "title": "Area Code",
            "type": "string"
          },
          "area_type": {
            "default": "district",
            "enum": [
              "district",
              "lad",
              "national"
            ],
            "title": "Area Type",
            "type": "string"
          },
          "end": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "End"
          },
          "frequency": {
            "default": "monthly",
            "enum": [
              "monthly",
              "quarterly"
            ],
            "title": "Frequency",
            "type": "string"
          },
          "limit": {
            "default": 400,
            "title": "Limit",
            "type": "integer"
          },
          "method": {
            "default": "hedonic_smoothed",
            "enum": [
              "hedonic_smoothed",
              "hedonic_raw"
            ],
            "title": "Method",
            "type": "string"
          },
          "start": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Start"
          }
        },
        "title": "asking_rent_index_seriesArguments",
        "type": "object"
      },
      "name": "asking_rent_index_series"
    },
    {
      "description": "\n    Auction comparables on ACHIEVED prices, each against our valuation.\n\n    A portal tells you a property went to auction. This says what it MADE, and\n    what our AVM thought it was worth at the same address — the difference\n    between a comparable and a listing. Use it to judge whether a guide price\n    is realistic, or what a lot is likely to fetch.\n\n    `achieved_to_avm` is the hammer price as a share of our AVM. Below 1.0 the\n    lot sold under the estimate; the useful spread is wide, from about 0.45 to\n    0.95 within a single postcode area. Read it alongside `auction_date`: all\n    AVMs share one snapshot date, so an older lot carries market movement as\n    well as discount.\n\n    Bedrooms and property type come from the UPRN-matched unit rather than the\n    auction catalogue, which populates property_type on 12% of sold lots and\n    tenure on none at all.\n\n    Give `postcode_district` or `postcode_area` — auction lots carry a\n    postcode, not an area_id, so there is no area_id path here.\n\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "is_commercial": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Is Commercial"
          },
          "limit": {
            "default": 50,
            "title": "Limit",
            "type": "integer"
          },
          "max_beds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Max Beds"
          },
          "min_beds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Min Beds"
          },
          "months": {
            "default": 24,
            "title": "Months",
            "type": "integer"
          },
          "postcode_area": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Postcode Area"
          },
          "postcode_district": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Postcode District"
          }
        },
        "title": "auction_compsArguments",
        "type": "object"
      },
      "name": "auction_comps"
    },
    {
      "description": "\n    How far below our valuation UK auction actually clears — the one auction\n    number nobody else can produce.\n\n    An achieved hammer price against an automated valuation of the SAME\n    property. EIG covers 530+ auctioneers to our six and sells API data, but\n    runs no AVM; we have less auction data and the valuation. The join is the\n    product, not the feed.\n\n    Nationally over the last 24 months the median lot cleared at about 0.66 of\n    our estimate — a ~34% discount — and 87% of lots sold below it. The spread\n    by district is large and real: PR2 clears near 47% below, N1 under 8%.\n\n    READ `by_year` BEFORE QUOTING THE HEADLINE, and read `meta.sufficient`.\n    Every AVM in the warehouse shares ONE snapshot date, so this ratio is an\n    auction discount only where the sale and the valuation are close in time.\n    The series sits near 0.65 from 2021 and falls to ~0.44 in 2016-2019 — that\n    fall is house-price growth sitting between the hammer and the estimate, not\n    a deeper discount. Widening `months` past about 60 measures the market, not\n    the auction.\n\n    `min_lots` suppresses the headline where too few lots match; a median over\n    three sales is not a market rate, and `meta.sufficient` says which you got.\n\n    Geography is by POSTCODE, not area_id — auction lots carry a postcode.\n\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "is_commercial": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Is Commercial"
          },
          "min_lots": {
            "default": 20,
            "title": "Min Lots",
            "type": "integer"
          },
          "months": {
            "default": 24,
            "title": "Months",
            "type": "integer"
          },
          "postcode_area": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Postcode Area"
          },
          "postcode_district": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Postcode District"
          }
        },
        "title": "auction_discountArguments",
        "type": "object"
      },
      "name": "auction_discount"
    },
    {
      "description": "\n    Individual UK auction lots: the guide price a lot was marketed at, whether\n    it sold, the HAMMER PRICE where the auctioneer published one, and the net\n    yield where quoted.\n\n    Five auction houses, Allsop back to 1999. Nothing else on the market sells\n    achieved auction outcomes through an API — a listings portal tells you a\n    property went to auction, not what it made.\n\n    Use this for: what did comparable lots actually sell for, is a guide price\n    realistic, what yields are commercial lots trading at, how does a district's\n    auction market behave. For asking-price or private-treaty sales use\n    market_volume_series or property_history instead — auction is a different\n    market and the prices are not interchangeable.\n\n    Coverage is a real constraint, not a caveat: about a quarter of lots carry\n    an achieved price and a fifth a net yield, because most auctioneers publish\n    a guide and never the result. Set `with_achieved_price` or `with_yield` to\n    restrict to lots that can answer an outcomes question, and read\n    `meta.coverage` on the way out so a thin result reads as thin.\n\n    `auctioneer` is one of: allsop, savills, acuitus, barnettross,\n    agentsproperty. Acuitus is the one that publishes net yield beside the\n    achieved price, so filter to it when yield is the question.\n\n    Dates are ISO (YYYY-MM-DD). UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "auctioneer": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Auctioneer"
          },
          "date_from": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Date From"
          },
          "date_to": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Date To"
          },
          "is_commercial": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Is Commercial"
          },
          "limit": {
            "default": 100,
            "title": "Limit",
            "type": "integer"
          },
          "offset": {
            "default": 0,
            "title": "Offset",
            "type": "integer"
          },
          "postcode_area": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Postcode Area"
          },
          "postcode_district": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Postcode District"
          },
          "sold_only": {
            "default": false,
            "title": "Sold Only",
            "type": "boolean"
          },
          "with_achieved_price": {
            "default": false,
            "title": "With Achieved Price",
            "type": "boolean"
          },
          "with_yield": {
            "default": false,
            "title": "With Yield",
            "type": "boolean"
          }
        },
        "title": "auction_lotsArguments",
        "type": "object"
      },
      "name": "auction_lots"
    },
    {
      "description": "\n    Quarterly UK auction statistics by postcode district: lots offered, lots\n    sold, the sale rate, and average guide, achieved and net yield.\n\n    Use this for the shape of a local auction market over time — is it clearing,\n    are yields moving, is stock rising. For individual comparables use\n    auction_lots.\n\n    READ `n_guide` AND `n_achieved` BEFORE COMPARING THE AVERAGES. They are\n    computed over DIFFERENT POPULATIONS: a guide price is published for most\n    lots, a hammer price by a minority of auctioneers. Subtracting one average\n    from the other does not give an uplift, a discount, or any meaningful\n    number — the two sets are not the same lots.\n\n    Each row carries a `comparable` flag that is false when the two populations\n    are too unbalanced for the difference to mean anything. When it is false,\n    report the two figures separately with their counts, and say why.\n\n    `quarter_from`/`quarter_to` are the first day of a quarter (2024-01-01,\n    2024-04-01, ...). UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "is_commercial": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Is Commercial"
          },
          "limit": {
            "default": 50,
            "title": "Limit",
            "type": "integer"
          },
          "postcode_district": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Postcode District"
          },
          "quarter_from": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Quarter From"
          },
          "quarter_to": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Quarter To"
          }
        },
        "title": "auction_statsArguments",
        "type": "object"
      },
      "name": "auction_stats"
    },
    {
      "description": "\n    Build cost for a scheme: the sector's cost index with its 1- and 5-year\n    movement, the regional location factor (`region`: NATIONAL, LONDON,\n    SOUTH_EAST — an error lists what is loaded), the editorial on-cost\n    percentages (prelims, contingency, overheads & profit, professional fees)\n    and, given `gia_m2` and `rate_gbp_m2` (your BCIS or in-house base rate,\n    with `rate_period` in the series' own format, e.g. 2024Q1), an estimate:\n    the rate carried through the index to the latest period, localised,\n    multiplied out, with totals at low / mid / high on-costs. The £/m²\n    benchmark leg says `not_available` until a tender benchmark is loaded —\n    no rate is invented, and nothing here is a modelled number.\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "basis": {
            "default": "tender",
            "enum": [
              "tender",
              "output"
            ],
            "title": "Basis",
            "type": "string"
          },
          "gia_m2": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Gia M2"
          },
          "rate_gbp_m2": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Rate Gbp M2"
          },
          "rate_period": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Rate Period"
          },
          "region": {
            "default": "NATIONAL",
            "title": "Region",
            "type": "string"
          },
          "sector": {
            "enum": [
              "residential",
              "commercial",
              "industrial",
              "infrastructure",
              "public",
              "all"
            ],
            "title": "Sector",
            "type": "string"
          }
        },
        "required": [
          "sector"
        ],
        "title": "build_costArguments",
        "type": "object"
      },
      "name": "build_cost"
    },
    {
      "description": "\n    Physical form of the buildings a set of UPRNs sit in: height, volume,\n    footprint area, floor count, construction and roof material, basement,\n    green roof, solar panels, and the residential/commercial unit mix.\n\n    `year_built` and `num_floors` are thinly populated and come back null\n    rather than estimated — treat null as unknown, not as absent.\n\n    `footprint_geojson` is the recorded WGS84 building outline, simplified at\n    0.5 m, for report maps and illustrative 3D massing. Use `building_height_m`\n    (volume divided by footprint), never altitude `height_m_above_sea_level`,\n    for extrusion. Preserve `geometry_attribution`. The extrusion does not\n    show actual facades, roof details, or a flat's internal boundaries.\n\n    UK only. Costs 15 credits (15p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprns": {
            "items": {
              "type": "integer"
            },
            "title": "Uprns",
            "type": "array"
          }
        },
        "required": [
          "uprns"
        ],
        "title": "building_physicalArguments",
        "type": "object"
      },
      "name": "building_physical"
    },
    {
      "description": "\n    What changed since you last looked — the portal change feed. Pass the\n    `next_cursor` from your previous call to get only what is new; on a first\n    call give a scope (`postcode_districts` or `uprns`) or a `since` date,\n    because an unbounded read of a 14.6-million-row feed is refused.\n\n    THE CURSOR IS AN EVENT ID, not a timestamp. Rows recorded late always take\n    higher ids, so nothing slips behind your watermark between polls. Each\n    event carries both `event_date` (when the portal says it happened) and\n    `observed_at` (when our sweep saw it) — a backfill has an old date and a\n    recent observation, which is exactly why the cursor is an id.\n\n    READ `coverage.event_types` BEFORE TRUSTING AN EMPTY PAGE. `added` and\n    `price_reduced` are live and daily. `price_increased` and `status_changed`\n    are sparse and only start in late August. **`delisted` has ONE row in the\n    whole table: withdrawal is NOT observed, so an empty result for it means we\n    cannot see it, not that nothing was withdrawn.** Five change kinds a user\n    may ask for — planning decisions, ownership changes, a lease crossing 80 or\n    60 years, a new EPC, an AVM move — have no feed at all and are listed under\n    `coverage.not_yet_fed`. Say which of these you cannot answer.\n\n    On a price change, `price.old_price_source` says whether the old price came\n    from the event itself or was derived from the listing's previous event; the\n    portal usually reports only the new price. Where neither is available the\n    change is null, never zero.\n    UK only. Costs 5 credits (5p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "channel": {
            "anyOf": [
              {
                "enum": [
                  "residential_sale",
                  "residential_rent"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Channel"
          },
          "cursor": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Cursor"
          },
          "event_types": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Event Types"
          },
          "limit": {
            "default": 100,
            "title": "Limit",
            "type": "integer"
          },
          "postcode_districts": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Postcode Districts"
          },
          "since": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Since"
          },
          "uprns": {
            "anyOf": [
              {
                "items": {
                  "type": "integer"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Uprns"
          }
        },
        "title": "changes_sinceArguments",
        "type": "object"
      },
      "name": "changes_since"
    },
    {
      "description": "\n    Repeat-sales CAPITAL index for UK commercial property, quarterly,\n    1995Q1 = 100.\n\n    Three families exist and nothing else: national ALL; national x sector\n    for the sectors that passed the level gate (OFFICE, RETAIL, HOTEL,\n    HOLIDAY_LET); and local authority x ALL for the 19 authorities with enough\n    pooled repeat sales. There is deliberately NO local x sector series — a\n    local sector cell is too thin to carry an index — so for \"office values in\n    Manchester\" call twice, sector=\"OFFICE\" (national) and area=\"Manchester\"\n    (ALL), and present the two side by side; each is real.\n\n    `area`: omit for national; a local authority NAME (\"Manchester\", \"South\n    Hams\") for the city scope. `sector`: omit for ALL, or a sector name.\n    `start` / `end`: \"2015\", \"2015Q1\", \"2015-Q1\" or \"2015-06\"; `end` is\n    inclusive.\n\n    `provenance.method` is repeat_sales for the raw estimator and\n    repeat_sales_shrunk where thin quarters were blended toward the national\n    increment; `n_pairs` per quarter is the straddle count, and a quarter with\n    few pairs is carried by the blend. An empty `series` with\n    `available_sectors` means the area exists but that sector is not published\n    for it; an unknown area is an error naming the nearest matches.\n\n    This is a capital-value index. For RENTS use commercial_rent_index_series;\n    the two are not interchangeable (capital = rent / yield, and yields\n    moved). UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Area"
          },
          "end": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "End"
          },
          "limit": {
            "default": 200,
            "title": "Limit",
            "type": "integer"
          },
          "sector": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Sector"
          },
          "start": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Start"
          }
        },
        "title": "commercial_index_seriesArguments",
        "type": "object"
      },
      "name": "commercial_index_series"
    },
    {
      "description": "\n    The commercial market for a sector and a place: the repeat-sales CAPITAL\n    index, the VOA rating-list RENT index, and the rated stock standing in the\n    authority with its hereditament count, total and median rateable value.\n\n    THE TWO INDICES ARE NOT COMPARABLE and must never be plotted on one axis\n    or differenced. The capital index is quarterly and THIN — several quarters\n    rest on single-digit sale pairs, `n_pairs` is on every point, and\n    `thin_periods` names the recent ones you should not quote a move from. The\n    rent index is keyed on VOA rating lists at their antecedent valuation\n    dates, so it has four points in sixteen years and each is a revaluation of\n    a constant sample, not a quarter.\n\n    Only 19 local authorities carry a capital series, ALL sector only, because\n    a local sector cell is too thin to publish. Ask for one that has none and\n    the NATIONAL series comes back labelled as national — check\n    `area.index_scope` before describing it as local.\n\n    Rated stock is the 2026 list only, so it is a snapshot: RV change on appeal\n    is not derivable per property.\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Area Key"
          },
          "lad_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Lad Code"
          },
          "sector": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Sector"
          }
        },
        "title": "commercial_marketArguments",
        "type": "object"
      },
      "name": "commercial_market"
    },
    {
      "description": "\n    The commercial property report, by UPRN or by VOA UARN: the hereditament\n    as the 2026 rating list describes it (rateable value, sector, description),\n    the sector's rent index across the 2010/2017/2023/2026 lists and its\n    capital index (national, plus the local authority where one exists), an\n    income-basis value that capitalises the RV at the district's commercial\n    auction net yield — with the yield's receipt, and `not_available` where\n    the district published none — the auction history at the address, the\n    district's commercial auction market by quarter, the registered owner and\n    the lease. Blocks that cannot be derived today say `not_available` with\n    the reason (the RV history per hereditament; the VOA measured area). RV is\n    a rating measure at the antecedent valuation date, not passing rent —\n    say so when you quote the income-basis figure.\n    UK only. Costs 10 credits (10p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uarn": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Uarn"
          },
          "uprn": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Uprn"
          }
        },
        "title": "commercial_propertyArguments",
        "type": "object"
      },
      "name": "commercial_property"
    },
    {
      "description": "\n    Commercial RENT index from the VOA rating lists — FOUR points, one per\n    list (2010 / 2017 / 2023 / 2026), each dated at that list's antecedent\n    valuation date (2008-04-01, 2015-04-01, 2021-04-01, 2024-04-01), with the\n    2010 list = 100.\n\n    READ `basis` AND REPEAT IT when you quote a number: the index is derived\n    from VOA rateable values — the Valuation Office Agency's assessment of\n    open-market rent at each valuation date — NOT from advertised rents, and\n    it is not a capital-value index. It moves in four steps; do not\n    interpolate between them as if it were monthly, and date each point by\n    `avd_date`, not `list_year`.\n\n    Why it exists: it covers the sectors the repeat-sales capital index\n    cannot (INDUSTRIAL_WAREHOUSE trades in portfolios, not Price Paid), for\n    every VOA sector and 320 local authorities.\n\n    `sector`: omit for ALL, or a VOA sector (OFFICE, RETAIL,\n    INDUSTRIAL_WAREHOUSE, INDUSTRIAL_FACTORY, PUB_BAR, HOTEL, LEISURE,\n    HEALTHCARE, EDUCATION, ...). `area`: omit for national; a local\n    authority GSS code (\"E08000003\") or NAME (\"Manchester\", bridged to its\n    code). `start` / `end`: rating-list years, e.g. \"2017\".\n\n    `link_ratio` is the median rateable-value ratio between consecutive lists\n    over the hereditaments present in both (`n_constant` of them). An empty\n    `series` with `available_sectors` means the area is published but not\n    that sector; an unknown area is an error. UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Area"
          },
          "end": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "End"
          },
          "sector": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Sector"
          },
          "start": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Start"
          }
        },
        "title": "commercial_rent_index_seriesArguments",
        "type": "object"
      },
      "name": "commercial_rent_index_series"
    },
    {
      "description": "\n    The evidence behind a valuation, itemised: same-building comparable\n    sales for the property, each with its registered price and date, its\n    time adjustment on the published repeat-sales index (the district's own\n    series, else the local authority's, else national) to the index's latest\n    settled month with the carry receipt (`index_unavailable` and no\n    adjustment where no series covers the property), any relisting penalty\n    (pass `relisted_uprns` only to model an explicit -10% sensitivity for\n    relisted/withdrawn comps; this is an assumption, not a measured discount), and the IQR fence that\n    decided which comps count. Use it to show WHY a value is what it is;\n    `valuation_full` gives the value itself. `lookback_months` 12–120.\n    UK only. Costs 10 credits (10p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "lookback_months": {
            "default": 60,
            "title": "Lookback Months",
            "type": "integer"
          },
          "relisted_uprns": {
            "anyOf": [
              {
                "items": {
                  "type": "integer"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Relisted Uprns"
          },
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "comps_adjustmentsArguments",
        "type": "object"
      },
      "name": "comps_adjustments"
    },
    {
      "description": "\n    Construction cost index series for a development appraisal's cost side:\n    `basis` is tender (tender price indices), output (output price indices),\n    deflator (the construction deflator) or labour. Optional `sector`\n    (residential, commercial, industrial, infrastructure, all, …), `freq`\n    (monthly | quarterly | annual) and an inclusive period window in the\n    series' own format (2014Q1, 2014M01, 2014). Each series carries its base\n    period and method. UK-wide; regional factors come with the site appraisal.\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "basis": {
            "enum": [
              "tender",
              "output",
              "deflator",
              "labour"
            ],
            "title": "Basis",
            "type": "string"
          },
          "freq": {
            "anyOf": [
              {
                "enum": [
                  "monthly",
                  "quarterly",
                  "annual"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Freq"
          },
          "from_period": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "From Period"
          },
          "sector": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Sector"
          },
          "to_period": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "To Period"
          }
        },
        "required": [
          "basis"
        ],
        "title": "cost_indexArguments",
        "type": "object"
      },
      "name": "cost_index"
    },
    {
      "description": "\n    VOA council tax band for a property, from the official list.\n\n    Every band is DECLARED — read from the VOA list, never inferred by a model.\n    `band_source` states which, and a predicted band would arrive as a distinct\n    value rather than folded in, because a caller cannot tell the two apart\n    after the fact.\n\n    DO NOT PRESENT A BAND AS A BILL. Three fields come back null on purpose and\n    must not be filled in by estimating:\n      * `annual_cost_gbp` — the per-band charge for each billing authority is a\n        separate source we do not hold.\n      * `effective_date` — the crawl records when the VOA refreshed the LIST,\n        which is not when this property's band took effect.\n      * `composite` — same reason; it lives on the per-property detail page.\n\n    `status` is `not_found` when the band exists in the VOA list but address\n    matching has not linked this UPRN to it. That is a matching gap on OUR\n    side, not evidence the property has no band — report it that way round.\n\n    England and Wales only: Scotland is the Scottish Assessors Association and\n    Northern Ireland is Land & Property Services, neither of which is in this\n    list. Free. Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "council_tax_bandArguments",
        "type": "object"
      },
      "name": "council_tax_band"
    },
    {
      "description": "\n    The data-coverage register for a local authority — read it before the\n    data: per-field non-null and source shares over every unit in the\n    authority (floor area, bedrooms, year built, EPC, last sale, tenure…),\n    which designation flags were checked and how fully, how many units carry\n    a registered lease or a hereditament, whether official planning data\n    covers the authority and how deep it goes (applications, link shares,\n    latest decision), and how much of the live listing stock the sweep has\n    dated. `area` is a GSS code (E09000032), a local authority name\n    (Wandsworth) or a warehouse area id. State the coverage before quoting a\n    share from a thin field.\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area": {
            "title": "Area",
            "type": "string"
          }
        },
        "required": [
          "area"
        ],
        "title": "data_coverageArguments",
        "type": "object"
      },
      "name": "data_coverage"
    },
    {
      "description": "\n    Properties that keep going to auction and NEVER SELL — the distress screen.\n\n    The clearest distress signal in the warehouse: a vendor who wants out and a\n    market that has said no more than once, both on the public record. Ranked by\n    how many separate auctions the lot has failed at, then by how long it has\n    been on the circuit.\n\n    READ `guide_to_avm` BEFORE CALLING ANY ROW AN OPPORTUNITY. It is the latest\n    guide divided by our AVM, and it is the difference between the two reasons a\n    lot fails:\n      * above 1.0 — guided ABOVE our estimate. It keeps failing because it is\n        priced wrong. That is a repricing conversation, not a discount.\n      * 0.5-1.0 — guided below estimate and repeatedly unsold. The cohort worth\n        a call.\n      * below ~0.5 — check the lease before anything else. A flat guided at a\n        fraction of a freehold estimate is usually short lease, ground rent or a\n        garage, not a bargain.\n\n    `max_guide_to_avm` filters on that ratio; 0.8 keeps only lots guided at\n    least 20% below estimate. Lots with no guide or no AVM are EXCLUDED when it\n    is set, because an unknown ratio is not a low one.\n\n    Rows are grouped by ADDRESS, not UPRN. Flat-level UPRN matching in this\n    table collapses separate flats onto one id — five flats in one Nottingham\n    block share a single UPRN — so a per-UPRN count over-reports. `uprn` is\n    returned for onward lookups but is not what rows are counted by, and for a\n    subdivided building it may name a neighbouring unit.\n\n    Geography is postcode district or area, not area_id — the auction table\n    carries postcodes and the UPRN join is too weak to filter on.\n\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "is_commercial": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Is Commercial"
          },
          "limit": {
            "default": 50,
            "title": "Limit",
            "type": "integer"
          },
          "max_guide_to_avm": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Max Guide To Avm"
          },
          "min_auctions": {
            "default": 3,
            "title": "Min Auctions",
            "type": "integer"
          },
          "offset": {
            "default": 0,
            "title": "Offset",
            "type": "integer"
          },
          "postcode_area": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Postcode Area"
          },
          "postcode_district": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Postcode District"
          },
          "years": {
            "default": 3,
            "title": "Years",
            "type": "integer"
          }
        },
        "title": "distressed_assetsArguments",
        "type": "object"
      },
      "name": "distressed_assets"
    },
    {
      "description": "\n    Energy composition of an area: EPC band mix, mains gas / electric / oil\n    split, heat-pump penetration.\n\n    `area_id` is the marts area id from `area_resolve` — pass\n    `analytics_area_id`, not `area_id`, if the resolve response gives both.\n\n    Percentages are of properties HOLDING an EPC, not of all stock, and are\n    whole percentages (0-100). EPCs are lodged on sale or let, so long-held and\n    social housing are under-represented — say so when reporting a figure.\n\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area_id": {
            "title": "Area Id",
            "type": "string"
          }
        },
        "required": [
          "area_id"
        ],
        "title": "energy_profileArguments",
        "type": "object"
      },
      "name": "energy_profile"
    },
    {
      "description": "Recorded relationship evidence from the derived graph. Use canonical ids from search. Cite path provenance and publication dates. Bounded and eventually consistent; missing links do not establish absence, ownership or off-market status. No private ownership payloads are returned. Free.",
      "inputSchema": {
        "properties": {
          "depth": {
            "default": 1,
            "title": "Depth",
            "type": "integer"
          },
          "entity_id": {
            "title": "Entity Id",
            "type": "string"
          },
          "kind": {
            "enum": [
              "properties",
              "listings",
              "buildings",
              "land",
              "market_facts",
              "areas"
            ],
            "title": "Kind",
            "type": "string"
          },
          "limit": {
            "default": 25,
            "title": "Limit",
            "type": "integer"
          }
        },
        "required": [
          "kind",
          "entity_id"
        ],
        "title": "entity_relationshipsArguments",
        "type": "object"
      },
      "name": "entity_relationships"
    },
    {
      "description": "Governed entity families, criteria, coverage and query limits. Call before building searches. Free.",
      "inputSchema": {
        "properties": {},
        "title": "entity_search_capabilitiesArguments",
        "type": "object"
      },
      "name": "entity_search_capabilities"
    },
    {
      "description": "\n    Recent Energy Performance Certificates for a property, newest first:\n    up to five mart certificates and up to five raw certificates. Raw readings\n    include exact certificate URL/address, floor level, top-storey indicator,\n    rooms, area and source dates. Compare source vintages; raw certificates may\n    be newer than the property summary. Unknown floor codes remain unknown;\n    habitable rooms are not bedrooms. Changes between certificates do not alone\n    prove building works or a measured-area change.\n\n    Each carries a `retrofit_gap`, or null where it cannot be computed. Null\n    means unknown, NOT zero — a zero gap means the property is already at its\n    potential, which is a different claim.\n\n    No certificate is a real answer, not a failure: EPCs are lodged on sale or\n    let, so a long-held property may never have had one.\n\n    UK only. Free. Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "epc_certificatesArguments",
        "type": "object"
      },
      "name": "epc_certificates"
    },
    {
      "description": "\n    Current estimated value against the last recorded sale: gain in pounds and\n    percent, and how long it has been held.\n\n    NOT a loan-to-value: the warehouse holds no mortgage balance, so never\n    describe the result as equity net of debt. The gain is NOMINAL — a 1998\n    purchase showing +747% has not beaten inflation by that much, and saying so\n    is part of reporting it honestly.\n\n    A null gain means no recorded sale, not a zero gain.\n\n    UK only. Free. Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprns": {
            "items": {
              "type": "integer"
            },
            "title": "Uprns",
            "type": "array"
          }
        },
        "required": [
          "uprns"
        ],
        "title": "equity_estimateArguments",
        "type": "object"
      },
      "name": "equity_estimate"
    },
    {
      "description": "\n    Hex-binned stock and transaction density for map layers, at H3 resolution 8.\n\n    DENSITY ONLY. There is no usable price per cell — the hex cube's price\n    column is populated on about 2% of rows and its rental, EPC and per-m2\n    columns are empty. The response lists what is and is not available; do not\n    offer a price heatmap from this.\n\n    `tx_n` is the transaction COUNT and `tx_value` is the total in pounds.\n\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area_id": {
            "title": "Area Id",
            "type": "string"
          },
          "limit": {
            "default": 2000,
            "title": "Limit",
            "type": "integer"
          }
        },
        "required": [
          "area_id"
        ],
        "title": "h3_densityArguments",
        "type": "object"
      },
      "name": "h3_density"
    },
    {
      "description": "\n    The parcels adjacent to one parcel and who owns each — the first question\n    of a site assembly. Returns each neighbour with its area, land use,\n    constraints and registered proprietor, plus a `combined` block: total area\n    in m² and hectares, the number of distinct owners, how many neighbours\n    already share the subject's proprietor (the parcels needing no second\n    negotiation), how many have no linked owner, and every constraint present\n    across the whole assembly.\n\n    Address the subject by `parcel_id`, `inspire_id`, `title_number` or\n    `uprn`. Adjacency means a boundary intersecting the subject's buffered by\n    `tolerance_m` (0.5 m default) — registered boundaries rarely share an\n    exact edge, so a strict touch finds almost nothing. Widen `ring_m` to look\n    further than immediate neighbours.\n\n    A neighbour with no owner is one no registered title has been linked to,\n    NOT one nobody owns — say which when you report it.\n    UK only. Costs 10 credits (10p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "inspire_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Inspire Id"
          },
          "limit": {
            "default": 100,
            "title": "Limit",
            "type": "integer"
          },
          "parcel_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Parcel Id"
          },
          "ring_m": {
            "default": 150,
            "title": "Ring M",
            "type": "integer"
          },
          "same_owner_only": {
            "default": false,
            "title": "Same Owner Only",
            "type": "boolean"
          },
          "title_number": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Title Number"
          },
          "tolerance_m": {
            "default": 0.5,
            "title": "Tolerance M",
            "type": "number"
          },
          "uprn": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Uprn"
          }
        },
        "title": "land_assemblyArguments",
        "type": "object"
      },
      "name": "land_assembly"
    },
    {
      "description": "\n    Local Housing Allowance for a postcode and bedroom category — the ceiling\n    on housing benefit, and therefore the effective rent floor for a\n    benefit-funded tenancy. Nothing else in this API tells you what the state\n    will pay for a property.\n\n    THE RATE IS WEEKLY. `rate_unit` says `gbp_per_week` and the figure is\n    exactly as the rate-setting bodies publish it. Comparing it against a\n    monthly rent — from `market_facts` rental_value, or a listing's\n    monthly_rent — understates it by about 4.33x. Convert with 52/12, NOT by\n    multiplying by 4: a \"monthly\" figure built from four weeks is 7.7% low and\n    the error is invisible once it is in a spreadsheet.\n\n    Resolved through the Broad Rental Market Area containing the postcode, not\n    the local authority — a BRMA is its own geography and they do not align.\n    `brma` names which one answered, and `shared_accommodation_rate` is the\n    separate, lower figure for under-35 single claimants.\n\n    Needs a FULL postcode (a district is not enough to place a BRMA), and\n    there is no category above 4 bedrooms. Three bodies set these rates: the\n    VOA in England, Rent Service Scotland, and Rent Officers Wales. Free.\n    ",
      "inputSchema": {
        "properties": {
          "bedrooms": {
            "enum": [
              1,
              2,
              3,
              4
            ],
            "title": "Bedrooms",
            "type": "integer"
          },
          "postcode": {
            "title": "Postcode",
            "type": "string"
          }
        },
        "required": [
          "postcode",
          "bedrooms"
        ],
        "title": "lha_rateArguments",
        "type": "object"
      },
      "name": "lha_rate"
    },
    {
      "description": "\n    Every marketing snapshot for a property: asking price over time, price\n    reductions, days listed, status changes, agent, image count and whether it\n    had a floor plan.\n\n    `price_trajectory` appears only when at least two snapshots carry a price.\n    No listing at all is a real answer, not a failure — a property sold\n    off-market or never advertised has none.\n\n    UK only. Costs 15 credits (15p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "listing_historyArguments",
        "type": "object"
      },
      "name": "listing_history"
    },
    {
      "description": "\n    Monthly supply-side statistics from portal listings for one area, channel\n    and bedroom band: listings added and reduced, reduction share (the\n    market-temperature signal), asking price or rent median and quartiles,\n    £/m² where a floor area is stated, new-build share, agent concentration\n    (HHI, top-3 share), and — on rent rows — gross yield on two bases (cell\n    rent over cell price; per-listing rent over the unit's AVM value), and on\n    sale rows the asking-to-sold ratio and days to completion on listings the\n    registry matched to a sale.\n\n    THREE THINGS TO SAY WHEN YOU QUOTE THIS. (1) listings_added_n is the\n    NEVER-REDUCED cohort — listings later reduced carry no listing date — so it\n    undercounts new listings by reduction_share. (2) sold_matched_n is a\n    match-rate-limited subset; never divide it by listings_added_n and call it\n    a sell-through rate. (3) There is no days-on-market-to-sale here: the\n    portal records no exit dates. Use listing_stock_series for what is on the\n    market NOW. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area_code": {
            "default": "NATIONAL",
            "title": "Area Code",
            "type": "string"
          },
          "area_type": {
            "default": "district",
            "enum": [
              "district",
              "lad",
              "national"
            ],
            "title": "Area Type",
            "type": "string"
          },
          "bedroom_band": {
            "default": "all",
            "enum": [
              "all",
              "1bed",
              "2bed",
              "3bed",
              "4bed",
              "5plus",
              "unknown"
            ],
            "title": "Bedroom Band",
            "type": "string"
          },
          "channel": {
            "default": "residential_sale",
            "enum": [
              "residential_sale",
              "residential_rent"
            ],
            "title": "Channel",
            "type": "string"
          },
          "end": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "End"
          },
          "limit": {
            "default": 60,
            "title": "Limit",
            "type": "integer"
          },
          "start": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Start"
          }
        },
        "title": "listing_market_seriesArguments",
        "type": "object"
      },
      "name": "listing_market_series"
    },
    {
      "description": "\n    Live listings on the market by day for one area, channel and bedroom band\n    — the stock-on-market series, with the median age of the dated live stock,\n    median asking price or rent, and the new-build count.\n\n    The series began 2026-09-05 and grows by one point a day: the portal keeps\n    no exit dates, so stock cannot be reconstructed for the past, only observed\n    forwards. A short series is therefore expected, not missing data. `start` /\n    `end` are dates (YYYY-MM-DD). Free.\n    ",
      "inputSchema": {
        "properties": {
          "area_code": {
            "default": "NATIONAL",
            "title": "Area Code",
            "type": "string"
          },
          "area_type": {
            "default": "district",
            "enum": [
              "district",
              "lad",
              "national"
            ],
            "title": "Area Type",
            "type": "string"
          },
          "bedroom_band": {
            "default": "all",
            "enum": [
              "all",
              "1bed",
              "2bed",
              "3bed",
              "4bed",
              "5plus",
              "unknown"
            ],
            "title": "Bedroom Band",
            "type": "string"
          },
          "channel": {
            "default": "residential_sale",
            "enum": [
              "residential_sale",
              "residential_rent"
            ],
            "title": "Channel",
            "type": "string"
          },
          "end": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "End"
          },
          "limit": {
            "default": 90,
            "title": "Limit",
            "type": "integer"
          },
          "start": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Start"
          }
        },
        "title": "listing_stock_seriesArguments",
        "type": "object"
      },
      "name": "listing_stock_series"
    },
    {
      "description": "\n    Long-held properties in an area carrying a large paper gain — the classic\n    off-market cohort, ordered by gain rather than by value.\n\n    Typical output for a London district: mid-1990s purchases at £23,000-37,000\n    now valued at £566,000-758,000.\n\n    `area_id` is the marts area id from `area_resolve`.\n\n    UK only. Costs 40 credits (40p).\n    ",
      "inputSchema": {
        "properties": {
          "area_id": {
            "title": "Area Id",
            "type": "string"
          },
          "limit": {
            "default": 100,
            "title": "Limit",
            "type": "integer"
          },
          "min_gain_pct": {
            "default": 50,
            "title": "Min Gain Pct",
            "type": "number"
          },
          "min_years": {
            "default": 10,
            "title": "Min Years",
            "type": "integer"
          }
        },
        "required": [
          "area_id"
        ],
        "title": "long_held_high_equityArguments",
        "type": "object"
      },
      "name": "long_held_high_equity"
    },
    {
      "description": "Find public records by title/address text, postcode or public UUID. Exact and lexical lookup uses no model or embeddings; supports token prefixes and bounded typo tolerance in accepted search publications. Returns separate families with UUID detail links and explicit searched coverage. Never claim an unlisted family was searched, or that no match proves nonexistence. For full address matching use address_autocomplete; for a UPRN use address_by_uprn. For attribute criteria use search_entities with the governed query. Free.",
      "inputSchema": {
        "properties": {
          "limit": {
            "default": 5,
            "title": "Limit",
            "type": "integer"
          },
          "q": {
            "title": "Q",
            "type": "string"
          }
        },
        "required": [
          "q"
        ],
        "title": "lookup_entitiesArguments",
        "type": "object"
      },
      "name": "lookup_entities"
    },
    {
      "description": "\n    Price, price per sqm and turnover rate for ONE geography × asset class ×\n    bedroom band × period, from the pre-cubed area_facts table.\n\n    Metrics: sales_price, price_psm, turnover_rate are populated today.\n    rental_value, gross_yield and days_on_market are NOT — the pipeline has\n    never backfilled them, so they come back null and are named in the\n    response's `metrics_with_no_data`. Do not compare or rank on them, and do\n    not report a null from them as \"no activity\"; it means \"not collected\".\n\n    turnover_rate is sales as a share of the stock that could have sold. It\n    is the liquidity measure — transaction COUNT is market size, not\n    liquidity (W2 has the largest dwelling stock of any London district and\n    near-bottom turnover).\n\n    Geography is `postcode` (resolved to its district — the cube has no\n    sector or unit grain) or `lad_code` (a local-authority NAME, e.g.\n    \"Lambeth\", not a GSS code). There are no LSOA or ward areas in the\n    warehouse; those selectors return 422.\n\n    To compare AREAS against each other use `market_ranking`, not repeated\n    calls here. For \"how many sales\" use `market_volume_series` — the `tx_n`\n    here counts only UPRN-matched, non-anomalous sales and runs well short of\n    the registry. The prices are sound; the count is a sample size.\n\n    READ `tx_decision` BEFORE QUOTING A PRICE. Every row carries one, and it\n    says how much evidence is behind that number. Measured over the whole cube:\n\n      direct      2.7%   30+ sales in the cell. Quote it plainly.\n      modeled    15.4%   5-29 sales. Sound, lightly smoothed.\n      suppressed 44.0%   1-4 sales. Indicative — say the sample is thin.\n      imputed    17.3%   ZERO sales. The price is the prior BORROWED from a\n                         parent geography, not a measurement of this cohort.\n      missing    20.7%   zero sales and no price at all (null).\n\n    An `imputed` row looks exactly like a real one — a confident, specific\n    figure — and it repeats: in one district, 25 cohorts all read the same\n    353,909, because they are all the same borrowed number. Reporting it as\n    \"2-bed detached in AL10 sell for £353,909\" states a fact the data does not\n    contain. Say the cohort has no recorded sales instead, or aggregate up to a\n    grain that does. `turnover_rate` is 0 on every one of these rows, which is\n    a second tell.\n\n    Where you want the AREA rather than a cohort, do not read a cohort row and\n    call it the area: aggregate, or use `market_ranking`, which does it for you\n    weighted by the sales behind each cohort. There is no rollup row in this\n    cube — no `bedroom_band=\"all\"` and no `hmo_flag=\"all\"`; filtering on either\n    matches nothing at all.\n\n    `max_periods` (default 3) bounds how many recent MONTHLY periods come back\n    when `period` is not given. The grain is one row per (asset_subtype ×\n    bedroom_band × hmo_flag × period) — about 13 cohorts per period — so a wide\n    window gets large fast. The response reports `period_frequency`,\n    `periods_returned` and `truncated` so you can tell a short answer from a\n    cut-off one.\n\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "asset_class": {
            "anyOf": [
              {
                "enum": [
                  "Commercial",
                  "Mixed-Use",
                  "Other",
                  "Residential",
                  "Unclassified"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Asset Class"
          },
          "asset_subtype": {
            "anyOf": [
              {
                "enum": [
                  "Detached",
                  "Education",
                  "Flat",
                  "HMO",
                  "Healthcare",
                  "Hospitality",
                  "Hotel",
                  "Leisure",
                  "Office",
                  "Other",
                  "Retail",
                  "Semi-Detached",
                  "Terraced",
                  "Transport"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Asset Subtype"
          },
          "bedroom_band": {
            "anyOf": [
              {
                "enum": [
                  "1bed",
                  "2bed",
                  "3bed",
                  "4bed",
                  "5plus",
                  "unknown"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Bedroom Band"
          },
          "h3_cell": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "H3 Cell"
          },
          "lad_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Lad Code"
          },
          "lsoa_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Lsoa Code"
          },
          "max_periods": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Max Periods"
          },
          "metrics": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Metrics"
          },
          "period": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Period"
          },
          "postcode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Postcode"
          },
          "ward_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Ward Code"
          }
        },
        "title": "market_factsArguments",
        "type": "object"
      },
      "name": "market_facts"
    },
    {
      "description": "\n    The published house-price index forecast for a postcode district or local\n    authority: the last SETTLED index point as the anchor, then up to seven\n    forecast periods with `lo`/`hi` bands, plus the method and publication\n    grain behind them. Seven is the horizon the index publishes — nothing\n    beyond it is offered, and a forecast is a projection of the smoothed\n    repeat-sales index, not a valuation of any property.\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area_code": {
            "title": "Area Code",
            "type": "string"
          },
          "area_type": {
            "default": "district",
            "enum": [
              "district",
              "lad"
            ],
            "title": "Area Type",
            "type": "string"
          },
          "frequency": {
            "default": "monthly",
            "enum": [
              "monthly",
              "quarterly"
            ],
            "title": "Frequency",
            "type": "string"
          },
          "horizon": {
            "default": 7,
            "title": "Horizon",
            "type": "integer"
          }
        },
        "required": [
          "area_code"
        ],
        "title": "market_forecastArguments",
        "type": "object"
      },
      "name": "market_forecast"
    },
    {
      "description": "\n    The published house-price INDEX for one postcode district or local\n    authority: the level per month (base period = 100), the forecast tail\n    flagged, and provenance saying how the index was built.\n\n    Use this for \"how has W14 moved since 2015\", \"what is the trend in\n    Camden\", or to carry a known price to today:\n    price(t2) = price(t1) x value(t2) / value(t1). It is the same series that\n    shapes valuation_full's back-series (`provenance.series_basis` matches\n    its `series_basis`). For PRICES by cohort use market_facts; for sale\n    COUNTS use market_volume_series. `value` is an index level, never a price.\n\n    `area_code` is a postcode district (\"W14\"; a full postcode is truncated)\n    with area_type=\"district\", or a local authority NAME (\"Camden\",\n    \"Manchester\" — not a GSS code) with area_type=\"lad\". An unknown area is an\n    error naming the nearest matches; read them back to the user.\n\n    `start` / `end` are periods: \"2015\", \"2015-06\" or \"2015-Q2\"; `end` is\n    inclusive. `limit` keeps the most recent N periods inside the bounds (the\n    default returns the whole monthly series, 1995 to present).\n\n    READ `provenance` BEFORE QUOTING A MOVE. `index_method` is\n    repeat_sales_area where the area carries its own repeat-sales index, and\n    repeat_sales_national where the area was too thin and the pipeline\n    published the NATIONAL index against it — the turns are then national,\n    not local, and you must say so. `last_settled_period` is the last month\n    the registry has filled; points after it carry is_forecast=true with\n    lo/hi bands. `tx_n` per point is the cube's UPRN-matched sample, not the\n    registry's count.\n\n    The index is published monthly. frequency=\"quarterly\" returns an empty\n    series with a note wherever no quarterly rows exist. UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area_code": {
            "title": "Area Code",
            "type": "string"
          },
          "area_type": {
            "default": "district",
            "enum": [
              "district",
              "lad"
            ],
            "title": "Area Type",
            "type": "string"
          },
          "end": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "End"
          },
          "frequency": {
            "default": "monthly",
            "enum": [
              "monthly",
              "quarterly"
            ],
            "title": "Frequency",
            "type": "string"
          },
          "include_forecast": {
            "default": true,
            "title": "Include Forecast",
            "type": "boolean"
          },
          "limit": {
            "default": 400,
            "title": "Limit",
            "type": "integer"
          },
          "start": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Start"
          }
        },
        "required": [
          "area_code"
        ],
        "title": "market_index_seriesArguments",
        "type": "object"
      },
      "name": "market_index_series"
    },
    {
      "description": "One market profile: an area × residential bedroom cohort with every published measure — asking sale price and rent, completed sale price, gross yield on asking, live stock, new listings, price reductions, turnover and registry sale volume — each with its `basis` sentence, unit, coverage and an observed monthly series sliced to `window` months (default 60); plus the asking price/rent indexes, the whole-area house price index (labelled so; there is no cohort HPI), agent concentration and days to completion, and SearchQuery links to the related completed sales and listings. A measure the source does not publish for the cohort is null with the reason, never zero. Ids come from `search_entities` with entity `market_profiles`. Free.",
      "inputSchema": {
        "properties": {
          "profile_id": {
            "title": "Profile Id",
            "type": "string"
          },
          "window": {
            "default": 60,
            "title": "Window",
            "type": "integer"
          }
        },
        "required": [
          "profile_id"
        ],
        "title": "market_profileArguments",
        "type": "object"
      },
      "name": "market_profile"
    },
    {
      "description": "\n    Rank areas AGAINST EACH OTHER on a market metric — one row per area,\n    AGGREGATED over a trailing window of whole months.\n\n    This is the comparison tool. `market_facts` answers for one geography;\n    calling it in a loop to build a league table is slower, costs more and\n    gives you rows from different periods. Use this for \"which districts in\n    Greater Manchester turn over fastest\", \"rank these twelve postcodes by\n    price per sqm\", \"cheapest LADs in the North West by price_psm\".\n\n    ALWAYS report the `window` block from the response alongside the ranking.\n    It names the months aggregated, and it matters: a 12-month turnover and a\n    3-month one differ by roughly 4x. `lag_months` (default 3) deliberately\n    drops the most recent months because HM Land Registry registers sales\n    long after completion — the newest month looks near-dead and would rank\n    registration lag rather than liquidity.\n\n    turnover_rate is exact — it is sales over stock, recomputed at this grain.\n    Price, rent and yield are weighted means of the underlying medians, so\n    describe them as indicative, not as medians.\n\n    `min_stock` (default 50) skips areas with too few dwellings for a rate to\n    mean anything: one sale in a 2-dwelling district is a turnover of 0.5,\n    which otherwise tops the table. Where a returned area still has a small\n    `stock_count`, say so rather than presenting its rate as comparable.\n\n    Scope it EITHER by `parent_area_code` (every child of that area, e.g.\n    every district in a county) OR by an explicit `area_codes` allowlist.\n    `area_type` is the grain: \"Postcode District\" (default) or an\n    administrative type such as \"Local Authority District\".\n\n    `sort` defaults to turnover_rate, the liquidity measure — sales as a\n    share of the stock that could have sold. Do NOT sort on gross_yield or\n    days_on_market: they are 0% populated, so every row ties as NULL and the\n    \"ranking\" is arbitrary order. Populated metrics are sales_price,\n    price_psm and turnover_rate. Whatever you sort on is always returned,\n    and anything empty is named in `metrics_with_no_data`.\n\n    Distinct from `market_volume_ranking`, which ranks on raw transaction\n    COUNT — that is market size, not liquidity.\n\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area_codes": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Area Codes"
          },
          "area_type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Area Type"
          },
          "asset_class": {
            "anyOf": [
              {
                "enum": [
                  "Commercial",
                  "Mixed-Use",
                  "Other",
                  "Residential",
                  "Unclassified"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Asset Class"
          },
          "bedroom_band": {
            "anyOf": [
              {
                "enum": [
                  "1bed",
                  "2bed",
                  "3bed",
                  "4bed",
                  "5plus",
                  "unknown"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Bedroom Band"
          },
          "hmo": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Hmo"
          },
          "lag_months": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Lag Months"
          },
          "limit": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Limit"
          },
          "metrics": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Metrics"
          },
          "min_stock": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Min Stock"
          },
          "order": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Order"
          },
          "parent_area_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Parent Area Code"
          },
          "sort": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Sort"
          },
          "window_months": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Window Months"
          }
        },
        "title": "market_rankingArguments",
        "type": "object"
      },
      "name": "market_ranking"
    },
    {
      "description": "\n    Rank postcode districts by transaction volume or median price over a\n    trailing window — \"the busiest districts in Greater London last year\",\n    \"the priciest districts in SW\".\n\n    Restrict the candidate set with county (\"GREATER LONDON\") or area (\"SW\");\n    omit both to rank nationally. UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Area"
          },
          "county": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "County"
          },
          "limit": {
            "default": 50,
            "title": "Limit",
            "type": "integer"
          },
          "months": {
            "default": 12,
            "title": "Months",
            "type": "integer"
          },
          "order_by": {
            "default": "txn_count",
            "enum": [
              "mean_price",
              "median_price",
              "p25_price",
              "p75_price",
              "txn_count",
              "txn_count_new_build",
              "txn_count_ppd_a",
              "txn_count_ppd_b",
              "txn_count_uprn_matched"
            ],
            "title": "Order By",
            "type": "string"
          }
        },
        "title": "market_volume_rankingArguments",
        "type": "object"
      },
      "name": "market_volume_ranking"
    },
    {
      "description": "\n    Monthly transaction VOLUME for a postcode district, postcode area or\n    county — every registered sale, 1995 to present, oldest month first.\n\n    Use this, not `market_facts`, for \"how many sales\" questions.\n    `market_facts` reads the area_facts cube, whose count is a UPRN-matched\n    sample that runs 17-66% short of the registry; this reads HMLR price paid\n    directly. Conversely use `market_facts` for price/rent/yield by asset\n    class and bedroom band, which this does not break down.\n\n    Provide exactly one of district (\"SW11\", or a full postcode, which is\n    truncated), area (\"SW\") or county (\"GREATER LONDON\"). `district` is a\n    POSTCODE district, not a borough — \"NW1\", not \"Camden\".\n\n    `start` and `end` are months: \"2024-06\" or \"2024-06-01\", either accepted.\n\n    Metrics default to txn_count + median_price. Prices are category A only —\n    a median including repossessions is not a market median.\n\n    ALWAYS check `provisional_from` in the response before reading a trend:\n    HM Land Registry registers sales months after completion, so the trailing\n    months are incomplete and will rise. UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Area"
          },
          "county": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "County"
          },
          "district": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "District"
          },
          "end": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "End"
          },
          "metrics": {
            "anyOf": [
              {
                "items": {
                  "enum": [
                    "mean_price",
                    "median_price",
                    "p25_price",
                    "p75_price",
                    "txn_count",
                    "txn_count_new_build",
                    "txn_count_ppd_a",
                    "txn_count_ppd_b",
                    "txn_count_uprn_matched"
                  ],
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Metrics"
          },
          "start": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Start"
          }
        },
        "title": "market_volume_seriesArguments",
        "type": "object"
      },
      "name": "market_volume_series"
    },
    {
      "description": "\n    Gross rental yield for an area and bedroom band on two bases, by month,\n    with n: `gross_yield_asking` (12 × the month's median asking rent ÷ the\n    median asking price of sale listings in the same area, band and month —\n    different properties) and `gross_yield_avm_median` (the median, over rent\n    listings matched to a property, of 12 × asking rent ÷ our valuation of\n    that property; `gross_yield_avm_n` behind it). Both rest on ASKING rents,\n    not achieved ones. Null where a month is too thin to publish — say so\n    rather than averaging around it. `latest` is the most recent month with a\n    figure. The basis sentence comes with it.\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area_code": {
            "default": "NATIONAL",
            "title": "Area Code",
            "type": "string"
          },
          "area_type": {
            "default": "district",
            "enum": [
              "district",
              "lad",
              "national"
            ],
            "title": "Area Type",
            "type": "string"
          },
          "bedroom_band": {
            "default": "all",
            "enum": [
              "all",
              "1bed",
              "2bed",
              "3bed",
              "4bed",
              "5plus",
              "unknown"
            ],
            "title": "Bedroom Band",
            "type": "string"
          },
          "months": {
            "default": 12,
            "title": "Months",
            "type": "integer"
          }
        },
        "title": "market_yieldsArguments",
        "type": "object"
      },
      "name": "market_yields"
    },
    {
      "description": "\n    Buildings holding BOTH residential and commercial units — the conversion\n    and permitted-development cohort.\n\n    Hard to source elsewhere: it is a property of the building's unit mix, not\n    an attribute of any single property.\n\n    UK only. Costs 30 credits (30p).\n    ",
      "inputSchema": {
        "properties": {
          "area_id": {
            "title": "Area Id",
            "type": "string"
          },
          "limit": {
            "default": 100,
            "title": "Limit",
            "type": "integer"
          },
          "min_commercial": {
            "default": 1,
            "title": "Min Commercial",
            "type": "integer"
          },
          "min_residential": {
            "default": 1,
            "title": "Min Residential",
            "type": "integer"
          }
        },
        "required": [
          "area_id"
        ],
        "title": "mixed_use_buildingsArguments",
        "type": "object"
      },
      "name": "mixed_use_buildings"
    },
    {
      "description": "\n    Average UK mortgage rates from the Bank of England: 2-year fixed, 3-year\n    fixed at 75% LTV, and the standard variable rate.\n\n    This is the BoE's published market average — an input to an appraisal, not\n    a quote. It carries no applicant, product or lender, so do not present it\n    as a rate someone can get. Pair it with a yield figure or an appraisal\n    (`site_appraisal`) rather than quoting it alone.\n\n    No parameters: it is one national series. Free.\n    ",
      "inputSchema": {
        "properties": {},
        "title": "mortgage_ratesArguments",
        "type": "object"
      },
      "name": "mortgage_rates"
    },
    {
      "description": "\n    What the Land Registry shows for one proprietor: titles held, company\n    status, country of incorporation, directors and PSCs where known.\n\n    Give a company number for an EXACT match. A name is a fuzzy substring\n    search — company names repeat across unrelated entities, so a name-matched\n    result is a candidate set, NOT a portfolio, and the response says which\n    kind you got. Report it that way.\n\n    `n_distinct_titles` is the holding count; `n_rows` is higher because one\n    title appears on several ownership rows over time.\n\n    UK only. Costs 25 credits (25p).\n    ",
      "inputSchema": {
        "properties": {
          "company_number": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Company Number"
          },
          "limit": {
            "default": 200,
            "title": "Limit",
            "type": "integer"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Name"
          }
        },
        "title": "owner_profileArguments",
        "type": "object"
      },
      "name": "owner_profile"
    },
    {
      "description": "\n    Titles held by a company, by Companies House number. Useful for mapping a\n    landlord's or developer's portfolio.\n    England & Wales only. Costs 15 credits (15p).\n    ",
      "inputSchema": {
        "properties": {
          "company_number": {
            "title": "Company Number",
            "type": "string"
          },
          "limit": {
            "default": 500,
            "title": "Limit",
            "type": "integer"
          }
        },
        "required": [
          "company_number"
        ],
        "title": "ownership_by_companyArguments",
        "type": "object"
      },
      "name": "ownership_by_company"
    },
    {
      "description": "\n    Registered proprietor(s) for an HMLR title number.\n    England & Wales only. Costs 15 credits (15p).\n    ",
      "inputSchema": {
        "properties": {
          "title_number": {
            "title": "Title Number",
            "type": "string"
          }
        },
        "required": [
          "title_number"
        ],
        "title": "ownership_by_titleArguments",
        "type": "object"
      },
      "name": "ownership_by_title"
    },
    {
      "description": "\n    One land parcel in full: its INSPIRE id, title number and OS id, area and\n    land use, the registered proprietor where a title links, the units\n    standing on it, plot utilisation, and every constraint flag.\n\n    Address it by `parcel_id`, `inspire_id`, `title_number` or `uprn` —\n    whichever handle you have. Use `land_assembly` instead when you want the\n    neighbours.\n\n    CONSTRAINTS ARE THREE-VALUED. `in_zone`, `checked_false` and `not_checked`\n    are three different answers, and a parcel with unchecked flags is\n    UNASSESSED, not unconstrained. Never report an unchecked flag as clear.\n\n    Plot coverage is built footprint over parcel area: a ground-plane measure\n    that says nothing about storeys, so it is not a density. The unbuilt ground\n    it implies is an upper bound before any constraint, access or amenity test\n    — not a developable area, and not a capacity.\n\n    Restrictive covenants read `not_available`: the register holds them per\n    title and the title-to-parcel link is partial.\n    UK only. Costs 5 credits (5p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "inspire_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Inspire Id"
          },
          "parcel_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Parcel Id"
          },
          "title_number": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Title Number"
          },
          "uprn": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Uprn"
          }
        },
        "title": "parcel_lookupArguments",
        "type": "object"
      },
      "name": "parcel_lookup"
    },
    {
      "description": "\n    The local planning authority for a location and its planning-portal URL.\n    This returns WHERE to look, not the applications themselves — council\n    portals are not machine-readable.\n\n    Give either `postcode` or `location` as \"lat,lng\".\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "location": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Location"
          },
          "postcode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Postcode"
          }
        },
        "title": "planning_applicationsArguments",
        "type": "object"
      },
      "name": "planning_applications"
    },
    {
      "description": "\n    The planning designation checks you choose, for one location, in one\n    call. `checks` is any of: article_4, brownfield, ancient_woodland,\n    heritage_at_risk, tpo, aqma, scheduled_monument, sssi, agricultural_land,\n    flood_risk, green_belt, listed_buildings, aonb, national_park,\n    conservation_area — omit it for all fifteen. Each check reports its own\n    result, and one that could not be read says `status: unknown` rather\n    than disappearing. Use `planning_designations` for the fixed bundle of\n    thirteen; use this when you need SSSI or agricultural land grade, or only\n    two or three checks. Give either `postcode` or `location` as \"lat,lng\".\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "checks": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Checks"
          },
          "location": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Location"
          },
          "postcode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Postcode"
          }
        },
        "title": "planning_checkArguments",
        "type": "object"
      },
      "name": "planning_check"
    },
    {
      "description": "\n    Every planning designation affecting a location, in one call: conservation\n    area, listed building, green belt, AONB, national park, flood zone,\n    Article 4, brownfield, ancient woodland, heritage at risk, TPO, AQMA and\n    scheduled monument.\n\n    Give either `postcode` (full UK postcode) or `location` as \"lat,lng\".\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "location": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Location"
          },
          "postcode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Postcode"
          }
        },
        "title": "planning_designationsArguments",
        "type": "object"
      },
      "name": "planning_designations"
    },
    {
      "description": "\n    What happened to applications like this one nearby — the planning\n    precedent record. Give a point (`lat`/`lon`) or an `lpa_code`, optionally\n    narrowed by `application_types` (substrings of the authority's own type\n    labels, e.g. [\"Householder\"]).\n\n    Returns the approval RATE with its denominator, the median days to a\n    decision, a breakdown by application type, and recent examples with their\n    outcomes and links.\n\n    TWO DENOMINATORS, AND THEY ARE NOT THE SAME. The rate is over approvals\n    plus refusals only. The decision time is over the much smaller set of\n    applications carrying BOTH a received and a decision date — about 13% of\n    the register. Quote each with its own n; never present the timing sample\n    as though it were the rate's.\n\n    IT IS A RATE, NOT A PROBABILITY. It says what a committee did nearby, not\n    what it will do with this proposal. Do not convert it into a chance of\n    approval.\n\n    Withdrawals, advisory outcomes (observations on another authority's\n    application, and confirmations that consent was not required) and\n    undecided applications are counted separately and excluded from the\n    denominator — they appear under `excluded_from_rate`.\n\n    COVERAGE IS LONDON. The official register is the 35 Greater London\n    authorities; elsewhere this returns nothing, which is a coverage gap and\n    NOT a quiet planning history. Say so rather than implying the site is\n    unprecedented.\n    UK only. Costs 10 credits (10p).\n    ",
      "inputSchema": {
        "properties": {
          "application_types": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Application Types"
          },
          "examples": {
            "default": 10,
            "title": "Examples",
            "type": "integer"
          },
          "lat": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Lat"
          },
          "lon": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Lon"
          },
          "lpa_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Lpa Code"
          },
          "radius_m": {
            "default": 800,
            "title": "Radius M",
            "type": "integer"
          },
          "years": {
            "default": 10,
            "title": "Years",
            "type": "integer"
          }
        },
        "title": "planning_precedentsArguments",
        "type": "object"
      },
      "name": "planning_precedents"
    },
    {
      "description": "\n    Land parcels by size and how much of them is built on. Set\n    `max_built_coverage` to 0.2 to find largely undeveloped plots.\n\n    Parcels with NO measured coverage are excluded when you set a ceiling,\n    rather than counted as empty — unknown coverage is not evidence of a vacant\n    plot. Coverage is measured on about 41% of parcels.\n\n    UK only. Costs 30 credits (30p).\n    ",
      "inputSchema": {
        "properties": {
          "area_id": {
            "title": "Area Id",
            "type": "string"
          },
          "limit": {
            "default": 100,
            "title": "Limit",
            "type": "integer"
          },
          "max_built_coverage": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Max Built Coverage"
          },
          "min_area_m2": {
            "default": 0,
            "title": "Min Area M2",
            "type": "number"
          }
        },
        "required": [
          "area_id"
        ],
        "title": "plot_utilisationArguments",
        "type": "object"
      },
      "name": "plot_utilisation"
    },
    {
      "description": "\n    Comparable sales in the same building or block. Preserve original price,\n    sale date, UPRN and `attrs_source`. Backfilled/modelled floor areas are\n    estimates: their derived price per square metre is not directly observed.\n    An EPC room count is not automatically a bedroom count. Review anomaly and\n    category flags; they do not prove distress or justify silently removing\n    lower contrary sales. Aggregate flags on duplicate identity/date/price\n    tuples. Verify combined-unit/building-parent demises before treating them\n    as flat comparables. Repeated sales of one unit are correlated evidence.\n    Report selection and rejection reasons before applying adjustments.\n    UK only. Costs 30 credits (30p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "max_backfills": {
            "default": 12,
            "title": "Max Backfills",
            "type": "integer"
          },
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "property_compsArguments",
        "type": "object"
      },
      "name": "property_comps"
    },
    {
      "description": "\n    The energy picture for one property: current rating against the\n    certificate's own potential, the points and letter bands available, the\n    fabric and heating the assessor recorded, and MEES.\n\n    MEES IS A LEGAL BAR, NOT A VALUATION NOTE. An F or G cannot lawfully be let\n    on a new or continuing tenancy in England and Wales without a registered\n    exemption. Report it as a constraint on what the owner may do, not as a\n    discount to apply.\n\n    A band letter is a RANGE — G spans 19 SAP points, D spans 13 — and the\n    range is on the response. A null gap means unknown, never \"already at\n    potential\".\n\n    `recommended_measures` reads `not_available` (gap G3): the assessor's own\n    improvement list with indicative costs is published by MHCLG in a file we\n    do not load. Do NOT substitute a generic list of retrofit measures — it\n    would read as this property's assessment. No pound figure is put on the\n    uplift either; the elasticity is local and contested and we have not\n    estimated one.\n    UK only. Costs 5 credits (5p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "property_energy_retrofitArguments",
        "type": "object"
      },
      "name": "property_energy_retrofit"
    },
    {
      "description": "\n    Environment Agency surface-water flood risk for a property.\n    UK only. Free. Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "property_flood_riskArguments",
        "type": "object"
      },
      "name": "property_flood_risk"
    },
    {
      "description": "\n    Sold-price history for a property, with per-sale detail.\n    Use `transactions_by_uprn` instead if you only need the raw HMLR rows.\n    UK only. Free. Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "max_drilldowns": {
            "default": 8,
            "title": "Max Drilldowns",
            "type": "integer"
          },
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "property_historyArguments",
        "type": "object"
      },
      "name": "property_history"
    },
    {
      "description": "\n    Registered leases linked to this UPRN, with the selected longest-expiry\n    record and up to ten alternatives, exact register property descriptions,\n    title/record identifiers, source/link limitations and computed remaining\n    term. UPRN linkage does not verify the legal demise: a garage, parking or\n    sibling title must not establish the flat lease. Compare descriptions and\n    disclose truncated/unavailable alternatives. Short-term flags are research\n    prompts, not legal advice or proof of mortgage eligibility. The AVM does\n    not adjust for a short term. `status: no_lease` means none was found; it\n    does not independently prove freehold tenure.\n    UK only. Costs 5 credits (5p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "property_leaseArguments",
        "type": "object"
      },
      "name": "property_lease"
    },
    {
      "description": "\n    `property_lease` for up to 100 properties in one call, per-item outcomes\n    (ok | no_lease | not_found | error) in input order. Charged per property\n    answered — the sum of the single calls, never more.\n    UK only. Costs 5 credits (5p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprns": {
            "items": {
              "type": "integer"
            },
            "title": "Uprns",
            "type": "array"
          }
        },
        "required": [
          "uprns"
        ],
        "title": "property_lease_batchArguments",
        "type": "object"
      },
      "name": "property_lease_batch"
    },
    {
      "description": "\n    Full property record for a UPRN, grouped into tiers: identity, property,\n    energy, building, land, risk, designations, infrastructure, ownership,\n    provenance. Up to ~300 fields — null fields are omitted, so a typical\n    urban flat returns fewer than a rural site with designations on it.\n    `provenance` carries the `<field>_source` and `<field>_confidence`\n    siblings, so you can trust individual cells and not just rows.\n    UK only. Costs 25 credits (25p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "property_lookupArguments",
        "type": "object"
      },
      "name": "property_lookup"
    },
    {
      "description": "\n    Photographs, floorplans, EPC graphs and brochures for a property, from the\n    listings we have crawled. Narrow with `types` — a comma-separated list of\n    `image`, `floorplan`, `epc`, `brochure`, `virtual_tour`.\n\n    EVERY LINK IS OURS AND EVERY LINK EXPIRES. Do not store them; call this\n    again when you need fresh ones, and set `ttl_seconds` to match how long the\n    surface you are building keeps them on screen. The portal's own URL is\n    never returned, so a saved response cannot turn into a hotlink later.\n\n    COVERAGE IS UNEVEN AND THE COUNTS TELL YOU. We hold the actual files for\n    floorplans and brochures only, and for a minority of those; everything else\n    — including all photographs — is a link that redirects to the source.\n    `n_held_by_us` against `n_redirected` says which is which for this property,\n    and `delivery` says it per item. Do not describe a property as having no\n    photographs when the answer is `no_media`: about a third of listings never\n    resolve to a UPRN, so that is as often a matching gap as an absence.\n\n    Each item carries the portal and host it came from — useful when a user\n    asks where a picture is from, and when one source turns out to be bad.\n    UK only. Free. Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "ttl_seconds": {
            "default": 21600,
            "title": "Ttl Seconds",
            "type": "integer"
          },
          "types": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Types"
          },
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "property_mediaArguments",
        "type": "object"
      },
      "name": "property_media"
    },
    {
      "description": "\n    Planning history AT this property: applications linked to the unit or its\n    building — each with decision, dates, appeal, CIL liability, development\n    type and `match_level` (`unit`, `building`, or `nearby` within 25 m when\n    nothing is linked) — a summary (approved / refused / withdrawn / pending),\n    what needs consent here from the designation flags read three-valued\n    (`applies` against `unchecked`), the LPA, and `coverage`: official\n    planning data covers the 33 London boroughs today, so\n    `status: not_covered` outside London is a different answer from\n    `no_applications`, and is not charged.\n    UK only. Costs 5 credits (5p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "property_planning_historyArguments",
        "type": "object"
      },
      "name": "property_planning_history"
    },
    {
      "description": "\n    `property_planning_history` for up to 100 properties in one call, per-item\n    outcomes (ok | no_applications | not_covered | not_found | error) in input\n    order. Charged per property answered — the sum of the single calls, never\n    more; not_covered rows are free.\n    UK only. Costs 5 credits (5p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprns": {
            "items": {
              "type": "integer"
            },
            "title": "Uprns",
            "type": "array"
          }
        },
        "required": [
          "uprns"
        ],
        "title": "property_planning_history_batchArguments",
        "type": "object"
      },
      "name": "property_planning_history_batch"
    },
    {
      "description": "\n    Cross-source property facts with provenance and unresolved attributes.\n    Review floor area, bedrooms and tenure with the user before a valuation.\n    `ml_primary` and `imputed` are predictions, not measurements; a warehouse\n    value is not automatically declared. `eligible_as_primary: false` marks\n    context only: EPC habitable rooms are not bedrooms, occupier tenure is not\n    legal tenure, and price-derived areas are not measurements. The AVM back-\n    series is scaled from its headline, not independent corroboration. Keep\n    user confirmations labelled as user-supplied and unknown facts unknown.\n    UK only. Costs 15 credits (15p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "property_reconcileArguments",
        "type": "object"
      },
      "name": "property_reconcile"
    },
    {
      "description": "\n    What this property would let for, and on what basis. Always quote the\n    basis: `unit_asking` is the property's OWN live rental listing (an asking\n    rent, not an achieved one); `area_asking` is the median asking rent for its\n    bedroom band in its postcode district — a locality statistic applied to one\n    property, so quote the p25–p75 range with it rather than the median alone.\n    `unit_hedonic`, a per-unit model, does not exist (gap G1).\n\n    THE YIELD IS GROSS: annual rent over our valuation, before voids,\n    management, maintenance, insurance, ground rent or service charge. A net\n    yield is materially lower and we do not publish one — do not present the\n    gross figure as what an investor keeps.\n\n    The LHA block is the local housing allowance for the property's broad\n    rental market area. That is a HOUSING BENEFIT CAP, not a market rent: it is\n    the floor for a supported tenancy and usually below the market median. The\n    shared-room rate is included for an HMO room-by-room comparison.\n    UK only. Costs 5 credits (5p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "beds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Beds"
          },
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "property_rental_estimateArguments",
        "type": "object"
      },
      "name": "property_rental_estimate"
    },
    {
      "description": "\n    Everything we hold about one property, as one document — summary, the\n    registered lease, the risk report with every flag three-valued, a rental\n    estimate with its basis, the energy picture, and the planning decisions\n    nearby. One price for the composition, cheaper than the sections bought\n    separately.\n\n    CHECK `sections_degraded` BEFORE SUMMARISING. A section that could not\n    answer degrades in place and names the KIND of absence — `not_found`,\n    `no_certificate`, `not_available` with its gap, or `error` — and those call\n    for different things being said. Report what did not answer rather than\n    describing the document as complete.\n\n    Each section is the standalone tool of the same name with the same\n    receipts; nothing is computed differently because it is inside a report.\n    UK only. Costs 25 credits (25p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "include_precedents": {
            "default": true,
            "title": "Include Precedents",
            "type": "boolean"
          },
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "property_reportArguments",
        "type": "object"
      },
      "name": "property_report"
    },
    {
      "description": "\n    What this property is in, and whether we actually checked: every\n    designation and hazard flag THREE-VALUED with its source — flood (zone,\n    historic flooding, defences, rivers-and-sea band, surface water), coal\n    (high-risk area, past mining, surface hazard distance), heritage (listed,\n    conservation area, scheduled monument, registered park, battlefield,\n    World Heritage), environmental (AONB, national park, green belt, SSSI, NNR,\n    ancient woodland, nutrient neutrality, SAC, Ramsar, LNR), planning\n    (Article 4, TPO, brownfield register) and infrastructure (nearest\n    substation distance, voltage and demand headroom, nearest renewable\n    project). `true` and `checked_false` are verdicts; `defaulted_false` and\n    `not_checked` are not — say which when you report it.\n    UK only. Costs 5 credits (5p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "property_risk_reportArguments",
        "type": "object"
      },
      "name": "property_risk_report"
    },
    {
      "description": "\n    `property_risk_report` for up to 100 properties in one call, per-item\n    outcomes (ok | not_found | error) in input order. Charged per property\n    answered — the sum, never more.\n    UK only. Costs 5 credits (5p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprns": {
            "items": {
              "type": "integer"
            },
            "title": "Uprns",
            "type": "array"
          }
        },
        "required": [
          "uprns"
        ],
        "title": "property_risk_report_batchArguments",
        "type": "object"
      },
      "name": "property_risk_report_batch"
    },
    {
      "description": "\n    One-call summary of a property: what it is, what building it belongs to,\n    and the headline attributes. Once you have the UPRN this is the first call\n    to make for a specific property — it usually answers the question on its\n    own, and `property_report` composes the rest.\n    UK only. Costs 20 credits (20p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "property_summaryArguments",
        "type": "object"
      },
      "name": "property_summary"
    },
    {
      "description": "\n    Run a governed query against the semantic layer: choose an entity, then\n    the metrics, dimensions and filters you want. Aliases are resolved to\n    physical columns by the registry, so this cannot reach anything the\n    semantic model does not expose. The result includes the generated SQL.\n\n    Bounded and self-describing.\n    UK only. Costs 50 credits (50p). You are charged if the query reaches the\n    warehouse and then times out or errors there; a rejected query is free,\n    and so is one that matches no rows. Filter area facts on the\n    `analytics_area_id` from area_resolve; they are monthly, so a year\n    (\"2025\") or quarter is widened to its months.\n    ",
      "inputSchema": {
        "$defs": {
          "OrderBy": {
            "description": "One sort key on a semantic query.\n\nWas `list[list[str]]`, i.e. a list of unnamed pairs. Nothing said whether\nan element is [\"price\", \"desc\"] or [\"desc\", \"price\"], and a positional pair\ncannot carry that. Naming the two halves removes the guess.",
            "properties": {
              "column": {
                "description": "Metric, dimension or column ALIAS to sort by. Must be one you also selected.",
                "title": "Column",
                "type": "string"
              },
              "direction": {
                "default": "asc",
                "description": "Sort direction.",
                "enum": [
                  "asc",
                  "desc"
                ],
                "title": "Direction",
                "type": "string"
              }
            },
            "required": [
              "column"
            ],
            "title": "OrderBy",
            "type": "object"
          },
          "SemanticFilter": {
            "description": "One filter clause on a semantic query.\n\nTyped rather than a bare dict because the model cannot guess these key\nnames, and it demonstrably does not: in one session it sent\n`{\"field\": ..., \"op\": ...}` and then `{\"dimension\": ..., \"operator\": ...}`,\nand every semantic query in that session failed validation. A\n`list[dict[str, Any]]` produces a JSON schema of `additionalProperties:\ntrue`, which tells the caller nothing at all.\n\nMirrors property_service.api.v1.endpoints.semantic_controller.SemanticFilter.\nIf that changes, this has to change with it.",
            "properties": {
              "column": {
                "description": "Column or dimension ALIAS on the entity, as returned by the catalog — not a physical column name. e.g. 'uprn'.",
                "title": "Column",
                "type": "string"
              },
              "op": {
                "description": "One of: =, !=, >, >=, <, <=, in, between, ilike",
                "title": "Op",
                "type": "string"
              },
              "value": {
                "default": null,
                "description": "Scalar for most ops; a list for `in`; a two-element list for `between`.",
                "title": "Value"
              }
            },
            "required": [
              "column",
              "op"
            ],
            "title": "SemanticFilter",
            "type": "object"
          }
        },
        "properties": {
          "dimensions": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Dimensions"
          },
          "entity": {
            "title": "Entity",
            "type": "string"
          },
          "filters": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/$defs/SemanticFilter"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Filters"
          },
          "joins": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Joins"
          },
          "limit": {
            "default": 500,
            "title": "Limit",
            "type": "integer"
          },
          "metrics": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Metrics"
          },
          "order_by": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/$defs/OrderBy"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Order By"
          },
          "period": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Period"
          },
          "select": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Select"
          }
        },
        "required": [
          "entity"
        ],
        "title": "query_semanticArguments",
        "type": "object"
      },
      "name": "query_semantic"
    },
    {
      "description": "\n    Properties in an area with the most improvement headroom, ranked by\n    potential efficiency. Defaults to the sub-standard bands E, F and G.\n\n    A targeting tool: it returns a list to act on, not a fact about one\n    property. Combine with `fuel='gas'` for the fossil-heated cohort that\n    carries the largest retrofit case.\n\n    `area_id` is the marts area id from `area_resolve`.\n\n    UK only. Costs 30 credits (30p).\n    ",
      "inputSchema": {
        "properties": {
          "area_id": {
            "title": "Area Id",
            "type": "string"
          },
          "bands": {
            "anyOf": [
              {
                "items": {
                  "enum": [
                    "A",
                    "B",
                    "C",
                    "D",
                    "E",
                    "F",
                    "G"
                  ],
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Bands"
          },
          "fuel": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Fuel"
          },
          "limit": {
            "default": 100,
            "title": "Limit",
            "type": "integer"
          }
        },
        "required": [
          "area_id"
        ],
        "title": "retrofit_candidatesArguments",
        "type": "object"
      },
      "name": "retrofit_candidates"
    },
    {
      "description": "Bounded public search using the versioned SearchQuery. Criteria are validated by the server; sorting and pagination use the same eligibility as the map. All Entities returns separate groups. No graph inference or unknown evidence changes eligibility.\n\n    QUERY SHAPE — `query` is one object:\n      {\"entity\": \"land\",\n       \"geography\": {\"kind\": \"area\", \"id\": \"Kettering\"},\n       \"criteria\": {\"parcel_area\": {\"min\": 5000, \"max\": 9000}},\n       \"sort\": \"<a sort key>\"}\n    `geography` is {\"kind\": \"area\", \"id\": <area UUID, code or exact name>} or {\"kind\": \"polygon\", \"geometry\": <GeoJSON Polygon>}. Refinements go in `criteria`, an object keyed by refinement (not a list, not `filters`/`refinements`). `limit` and `cursor` are arguments of this tool, not of the query.\n\n    Families (`query.entity`): Assets — `properties`, `buildings`, `land`, `listings`; Activity — `transactions` (HM Land Registry completed sales matched to a property) and `planning_applications` (official publishers only); Markets — `market_profiles` (one record per area × residential bedroom cohort with the selected `measure`'s latest value and observed trend; open one with `market_profile`). `market_facts` remains for existing observation ids but is superseded by `market_profiles`. Call `entity_search_capabilities` for each family's refinements and sorts. Free.. Actors — `owners` (companies that own homes in the place, ranked by holdings; companies only, signed-in account required, not the shared preview) and `agents` (estate and letting agents by listing activity in a trailing window). Owners and agents are searched on their own, not inside All Entities.",
      "inputSchema": {
        "$defs": {
          "SearchGeography": {
            "additionalProperties": false,
            "description": "Where to search: a named area or a drawn polygon.",
            "properties": {
              "geometry": {
                "anyOf": [
                  {
                    "additionalProperties": true,
                    "type": "object"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "kind \"polygon\": a GeoJSON Polygon, one closed outer ring in [lng, lat] order: {\"type\": \"Polygon\", \"coordinates\": [[[-0.22, 51.49], [-0.19, 51.49], [-0.19, 51.51], [-0.22, 51.51], [-0.22, 51.49]]]}.",
                "title": "Geometry"
              },
              "id": {
                "anyOf": [
                  {
                    "maxLength": 100,
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "kind \"area\": the area's UUID (`area_id` from `area_resolve`), its code (\"E07000153\", \"SW11\") or its exact name (\"Kettering\").",
                "title": "Id"
              },
              "kind": {
                "description": "\"area\" for a named place; \"polygon\" for a drawn boundary.",
                "enum": [
                  "area",
                  "polygon"
                ],
                "title": "Kind",
                "type": "string"
              },
              "label": {
                "anyOf": [
                  {
                    "maxLength": 150,
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Optional display name.",
                "title": "Label"
              }
            },
            "required": [
              "kind"
            ],
            "title": "SearchGeography",
            "type": "object"
          },
          "SearchQuery": {
            "additionalProperties": false,
            "description": "What to search: one family, where, and its refinements.",
            "properties": {
              "criteria": {
                "additionalProperties": true,
                "description": "Refinements, an OBJECT keyed by refinement: a range is {\"min\": .., \"max\": ..} (inclusive, either bound optional), a choice is a list of allowed values, a date range is {\"min\": \"YYYY-MM-DD\", \"max\": \"YYYY-MM-DD\"}. Keys and values per family come from `entity_search_capabilities`. e.g. {\"parcel_area\": {\"min\": 5000, \"max\": 9000}, \"built_coverage\": {\"max\": 10}}.",
                "title": "Criteria",
                "type": "object"
              },
              "description": {
                "anyOf": [
                  {
                    "maxLength": 300,
                    "minLength": 2,
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Listings only: a short written preference to rank by.",
                "title": "Description"
              },
              "entity": {
                "default": "all",
                "description": "The family to search; \"all\" returns a preview group per family and takes no criteria or sort.",
                "enum": [
                  "all",
                  "properties",
                  "listings",
                  "buildings",
                  "land",
                  "market_facts",
                  "market_profiles",
                  "transactions",
                  "planning_applications",
                  "owners",
                  "agents"
                ],
                "title": "Entity",
                "type": "string"
              },
              "geography": {
                "anyOf": [
                  {
                    "$ref": "#/$defs/SearchGeography"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Where to search."
              },
              "sort": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "A sort key the family lists in `entity_search_capabilities`. \"relevance\" only with `description`.",
                "title": "Sort"
              },
              "version": {
                "const": 1,
                "default": 1,
                "title": "Version",
                "type": "integer"
              }
            },
            "title": "SearchQuery",
            "type": "object"
          }
        },
        "properties": {
          "cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Cursor"
          },
          "limit": {
            "default": 20,
            "title": "Limit",
            "type": "integer"
          },
          "query": {
            "$ref": "#/$defs/SearchQuery"
          }
        },
        "required": [
          "query"
        ],
        "title": "search_entitiesArguments",
        "type": "object"
      },
      "name": "search_entities"
    },
    {
      "description": "Counts and statistics over EXACTLY what `search_entities` would match: how many records, grouped by a field, with min, median, mean and max of up to three numeric fields. Use it for \"how many\", \"what share\", \"median floor area\" and \"price by type\" questions instead of paging through records.\n\n    `query` is the same object `search_entities` takes (entity, geography, criteria). Summaries cover `properties`, `buildings`, `land` and `listings`. `group_by` is one choice field of that family and `measures` are its range fields; `entity_search_capabilities` lists them under `summary.families`. For example properties: group_by asset_subtype / asset_class / tenure / epc, measures bedrooms / floor_area; listings: group_by property_type / channel / auction / new_home, measures price / bedrooms / floor_area; buildings (a postcode district or a drawn area): group_by tenure / epc, measures footprint / storeys / units; land: group_by tenure, measures parcel_area / built_coverage.\n\n    Example: {\"query\": {\"entity\": \"listings\", \"geography\": {\"kind\": \"area\", \"id\": \"SW11\"}, \"criteria\": {\"transaction\": [\"sale\"]}}, \"group_by\": \"property_type\", \"measures\": [\"price\"]}.\n\n    A measure's `count` is the records that have a value for it; missing values are never zero. Groups come largest first, `top` of them (max 50), each with its `share` of the total. No record identities are returned: open records with `search_entities`. Too wide a place (a region) or too slow a summary is refused with what to narrow. Transaction counts by area: `market_volume_series`. Free.",
      "inputSchema": {
        "$defs": {
          "SearchGeography": {
            "additionalProperties": false,
            "description": "Where to search: a named area or a drawn polygon.",
            "properties": {
              "geometry": {
                "anyOf": [
                  {
                    "additionalProperties": true,
                    "type": "object"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "kind \"polygon\": a GeoJSON Polygon, one closed outer ring in [lng, lat] order: {\"type\": \"Polygon\", \"coordinates\": [[[-0.22, 51.49], [-0.19, 51.49], [-0.19, 51.51], [-0.22, 51.51], [-0.22, 51.49]]]}.",
                "title": "Geometry"
              },
              "id": {
                "anyOf": [
                  {
                    "maxLength": 100,
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "kind \"area\": the area's UUID (`area_id` from `area_resolve`), its code (\"E07000153\", \"SW11\") or its exact name (\"Kettering\").",
                "title": "Id"
              },
              "kind": {
                "description": "\"area\" for a named place; \"polygon\" for a drawn boundary.",
                "enum": [
                  "area",
                  "polygon"
                ],
                "title": "Kind",
                "type": "string"
              },
              "label": {
                "anyOf": [
                  {
                    "maxLength": 150,
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Optional display name.",
                "title": "Label"
              }
            },
            "required": [
              "kind"
            ],
            "title": "SearchGeography",
            "type": "object"
          },
          "SearchQuery": {
            "additionalProperties": false,
            "description": "What to search: one family, where, and its refinements.",
            "properties": {
              "criteria": {
                "additionalProperties": true,
                "description": "Refinements, an OBJECT keyed by refinement: a range is {\"min\": .., \"max\": ..} (inclusive, either bound optional), a choice is a list of allowed values, a date range is {\"min\": \"YYYY-MM-DD\", \"max\": \"YYYY-MM-DD\"}. Keys and values per family come from `entity_search_capabilities`. e.g. {\"parcel_area\": {\"min\": 5000, \"max\": 9000}, \"built_coverage\": {\"max\": 10}}.",
                "title": "Criteria",
                "type": "object"
              },
              "description": {
                "anyOf": [
                  {
                    "maxLength": 300,
                    "minLength": 2,
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Listings only: a short written preference to rank by.",
                "title": "Description"
              },
              "entity": {
                "default": "all",
                "description": "The family to search; \"all\" returns a preview group per family and takes no criteria or sort.",
                "enum": [
                  "all",
                  "properties",
                  "listings",
                  "buildings",
                  "land",
                  "market_facts",
                  "market_profiles",
                  "transactions",
                  "planning_applications",
                  "owners",
                  "agents"
                ],
                "title": "Entity",
                "type": "string"
              },
              "geography": {
                "anyOf": [
                  {
                    "$ref": "#/$defs/SearchGeography"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Where to search."
              },
              "sort": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "A sort key the family lists in `entity_search_capabilities`. \"relevance\" only with `description`.",
                "title": "Sort"
              },
              "version": {
                "const": 1,
                "default": 1,
                "title": "Version",
                "type": "integer"
              }
            },
            "title": "SearchQuery",
            "type": "object"
          }
        },
        "properties": {
          "group_by": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Group By"
          },
          "measures": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Measures"
          },
          "query": {
            "$ref": "#/$defs/SearchQuery"
          },
          "top": {
            "default": 20,
            "title": "Top",
            "type": "integer"
          }
        },
        "required": [
          "query"
        ],
        "title": "search_summaryArguments",
        "type": "object"
      },
      "name": "search_summary"
    },
    {
      "description": "\n    Everything known about ONE site, assembled and judged — the site dossier.\n\n    Give a `uprn` (from address_resolve or address_autocomplete) or a `land_id`\n    (from sourcing_search). Returns in one call what would otherwise be six:\n\n      * `site` — the land parcel: area, land use, built coverage, and the\n        boundary as GeoJSON you can put straight on a map\n      * `valuation` — our AVM against the last recorded sale, with gain and\n        years held\n      * `ownership` — the registered proprietor, type, company number\n      * `energy` — the latest EPC\n      * `auction_history` — every appearance, matched on address as well as\n        UPRN, and whether it ever sold\n      * `designations` — LIVE checks: conservation area, green belt, AONB,\n        national park, flood risk, listed buildings\n      * `signals` — the judgement\n\n    READ `signals` FIRST. It is why this exists rather than being six calls.\n    Each entry names what fired it and carries its evidence: repeat auction\n    failure with the guide-to-estimate ratio, long_held with the nominal gain,\n    mees_unlettable with the EPC band (F and G cannot legally be let),\n    under_built with the plot coverage, corporate_owner with the company\n    number. A site with nothing to say returns `signal: \"none\"` explicitly.\n\n    ABSENCE IS A REAL ANSWER, NOT AN ERROR. No registered proprietor means the\n    polygon-to-title backfill has not reached this parcel — it covers about 44%\n    — not that the land is unregistered. No EPC, no auction history and no\n    valuation are all normal, and each says so in its own block.\n\n    A designation check that FAILS is reported as UNKNOWN, never as absent. Do\n    not tell a user a site is unconstrained on the strength of a failed check.\n\n    A SCHEME PRICES THE BUILD. Pass `scheme_gia_m2` (and `scheme_units` for a\n    cost per unit) and you get a `scheme` block: build cost from the published\n    construction index times the regional factor, with on-costs. You must\n    supply `rate_gbp_m2` yourself — no £/m² benchmark is loaded, so without one\n    the block reads `not_available` rather than inventing a rate. It is\n    CONSTRUCTION COST ONLY: no land, finance, sales, S106 or CIL, so it is one\n    side of a residual and never a residual. Say that when you report it.\n\n    `precedents` summarises what nearby applications were decided: an approval\n    rate with its denominator, and a median decision time on the much smaller\n    sample that carries both dates. Quote each with its own n, and never as a\n    probability for this scheme.\n\n    `plot_utilisation` gives built coverage and unbuilt ground. Coverage is\n    footprint over area — a ground-plane measure, NOT a density — and unbuilt\n    ground is an upper bound before any constraint or access test, not a\n    developable area.\n\n    `include_designations=False` skips the live lookups and answers from the\n    warehouse alone, which is faster.\n\n    UK only. Costs 25 credits (25p).\n    ",
      "inputSchema": {
        "properties": {
          "include_designations": {
            "default": true,
            "title": "Include Designations",
            "type": "boolean"
          },
          "include_precedents": {
            "default": true,
            "title": "Include Precedents",
            "type": "boolean"
          },
          "land_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Land Id"
          },
          "precedent_radius_m": {
            "default": 800,
            "title": "Precedent Radius M",
            "type": "integer"
          },
          "rate_gbp_m2": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Rate Gbp M2"
          },
          "rate_period": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Rate Period"
          },
          "region": {
            "default": "NATIONAL",
            "title": "Region",
            "type": "string"
          },
          "scheme_gia_m2": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Scheme Gia M2"
          },
          "scheme_units": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Scheme Units"
          },
          "sector": {
            "default": "residential",
            "title": "Sector",
            "type": "string"
          },
          "uprn": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Uprn"
          }
        },
        "title": "site_appraisalArguments",
        "type": "object"
      },
      "name": "site_appraisal"
    },
    {
      "description": "\n    Roof characteristics for solar screening: footprint area, roof shape and\n    material, building height, and whether panels are already present.\n\n    Returns NO generation estimate, deliberately. Pitch, orientation and\n    shading are not in the warehouse, and a kWp figure derived from footprint\n    alone would read as a yield forecast without being one. Report the usable\n    roof area as a screening figure and say what it excludes.\n\n    UK only. Costs 20 credits (20p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprns": {
            "items": {
              "type": "integer"
            },
            "title": "Uprns",
            "type": "array"
          }
        },
        "required": [
          "uprns"
        ],
        "title": "solar_potentialArguments",
        "type": "object"
      },
      "name": "solar_potential"
    },
    {
      "description": "\n    Rated commercial stock in a local authority, filtered by sector and\n    rateable value — the commercial sourcing lane. Each row carries its\n    rateable value, an income-basis value, the freeholder where a title links,\n    and any auction history.\n\n    NO £/m² IS PUBLISHED and you should not compute one. The VOA's measured\n    area is not loaded, and dividing a hereditament-level rateable value by\n    the twin's unit-level floor area gives nonsense — it produced £235,301/m²\n    on a Westminster office before it was removed.\n\n    `lad_code` is REQUIRED and is the only scope: this is the one indexed way\n    into the twin for a bounded set of hereditaments. Use `area_resolve` to\n    turn a place name into a GSS code.\n\n    RATEABLE VALUE IS NOT RENT. It is the VOA's estimate of annual rental\n    value at the rating list's antecedent valuation date (1 April 2024 for the\n    2026 list). Do not quote it as passing rent or as income.\n\n    `income_basis_value` divides that RV by the district's own commercial\n    auction yield, so it is an arithmetic conversion anchored to local\n    evidence, not a valuation — and it reads `not_available` where the\n    district has no auction yield evidence, because a default yield would\n    produce a number that looks like a valuation. Report the yield and the\n    number of lots behind it.\n\n    One rating list is loaded (2026), so there is no RV trajectory per\n    property, no measured floor area from the VOA, and no vacancy signal.\n    UK only. Costs 10 credits (10p).\n    ",
      "inputSchema": {
        "properties": {
          "lad_code": {
            "title": "Lad Code",
            "type": "string"
          },
          "limit": {
            "default": 50,
            "title": "Limit",
            "type": "integer"
          },
          "max_rv": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Max Rv"
          },
          "min_rv": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Min Rv"
          },
          "offset": {
            "default": 0,
            "title": "Offset",
            "type": "integer"
          },
          "scat_codes": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Scat Codes"
          },
          "sectors": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Sectors"
          },
          "single_hereditament": {
            "default": false,
            "title": "Single Hereditament",
            "type": "boolean"
          },
          "with_owner": {
            "default": false,
            "title": "With Owner",
            "type": "boolean"
          }
        },
        "required": [
          "lad_code"
        ],
        "title": "sourcing_commercialArguments",
        "type": "object"
      },
      "name": "sourcing_commercial"
    },
    {
      "description": "\n    What is on the market RIGHT NOW in these postcode districts, each listing\n    enriched against our own record of the property: asking price against our\n    valuation (`asking_vs_avm_pct`, `discount_to_avm_gbp`), £/m², gross yield\n    on both the asking and valuation bases, unexpired lease years, EPC with\n    its retrofit gap, the designation flags, days listed, the agent, and a\n    plain-language `signals` list.\n\n    A drawn UK polygon can scope the search; pass postcode_districts=[] to\n    resolve its districts. At most 64 corners, 150 km² and 20 districts.\n    Only listings with located properties inside the boundary match.\n\n    Tenure accepts freehold or leasehold. Tenure, EPC ratings and minimum\n    gross yield filter before pagination.\n    Yield uses recorded asking monthly rent annualised against the asking or\n    auction guide price. Unknown rent/price cannot satisfy a yield filter.\n\n    There is NO total — a district holds far more archived listings than live\n    ones, so counting them costs seconds while the page costs milliseconds.\n    Read `has_more` and page with `offset`; never tell a user how many\n    listings exist, only how many you fetched.\n\n    A listing enriches only where the portal's own UPRN match landed on a unit\n    we hold; `enrichment.n_with_valuation` says how many of the rows that was,\n    and the rest carry the listing's fields with null comparisons.\n    UK only. Costs 10 credits (10p).\n    ",
      "inputSchema": {
        "properties": {
          "area_geojson": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Area Geojson"
          },
          "auction_only": {
            "default": false,
            "title": "Auction Only",
            "type": "boolean"
          },
          "channel": {
            "default": "residential_sale",
            "enum": [
              "residential_sale",
              "residential_rent",
              "commercial_sale",
              "commercial_rent",
              "any"
            ],
            "title": "Channel",
            "type": "string"
          },
          "epc_in": {
            "anyOf": [
              {
                "items": {
                  "enum": [
                    "A",
                    "B",
                    "C",
                    "D",
                    "E",
                    "F",
                    "G"
                  ],
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Epc In"
          },
          "limit": {
            "default": 50,
            "title": "Limit",
            "type": "integer"
          },
          "max_beds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Max Beds"
          },
          "max_price": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Max Price"
          },
          "min_beds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Min Beds"
          },
          "min_gross_yield_pct": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Min Gross Yield Pct"
          },
          "min_price": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Min Price"
          },
          "new_homes": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "New Homes"
          },
          "offset": {
            "default": 0,
            "title": "Offset",
            "type": "integer"
          },
          "postcode_districts": {
            "items": {
              "type": "string"
            },
            "title": "Postcode Districts",
            "type": "array"
          },
          "tenure": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Tenure"
          }
        },
        "required": [
          "postcode_districts"
        ],
        "title": "sourcing_live_listingsArguments",
        "type": "object"
      },
      "name": "sourcing_live_listings"
    },
    {
      "description": "\n    Who owns the stock in an area, ranked as an approach list: units held here,\n    total value and equity, average and longest years held, how many of their\n    units are on a short lease or already on the market, company status, and\n    the signals behind the rank. Pass a `strategy` to rank the owners of only\n    the units that preset points at — the owners of short-lease flats in a\n    borough, say.\n\n    COMPANIES ONLY, by construction: owners are grouped by company number, so\n    units held by private individuals have no group to appear in. They are\n    counted under `not_itemised` and never listed, and you must not attempt to\n    identify them by other means. Report the `scope.share_itemised` figure so\n    the user knows what fraction of the area the list covers.\n\n    `national_portfolio` reads `not_available`: only the in-area holding is\n    known, and it is not the owner's whole book — do not present it as one.\n    UK only. Costs 10 credits (10p).\n    ",
      "inputSchema": {
        "properties": {
          "lad_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Lad Code"
          },
          "limit": {
            "default": 50,
            "title": "Limit",
            "type": "integer"
          },
          "min_units": {
            "default": 2,
            "title": "Min Units",
            "type": "integer"
          },
          "postcode_district": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Postcode District"
          },
          "strategy": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Strategy"
          },
          "strategy_overrides": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Strategy Overrides"
          }
        },
        "title": "sourcing_offmarket_ownersArguments",
        "type": "object"
      },
      "name": "sourcing_offmarket_owners"
    },
    {
      "description": "\n    Resolve registered owners for parcels returned by `sourcing_search`.\n\n    Uses the bulk HM Land Registry corporate and overseas ownership registers,\n    so it names companies, public bodies and overseas entities. Individually\n    owned titles are not in the bulk data and come back unresolved — that is a\n    gap in the free register, not a failed lookup, and naming an individual\n    requires a paid per-title purchase which this tool does not make.\n\n    UK only. Costs 25 credits (25p).\n    ",
      "inputSchema": {
        "properties": {
          "asset": {
            "default": "land",
            "enum": [
              "land",
              "units"
            ],
            "title": "Asset",
            "type": "string"
          },
          "parcel_ids": {
            "items": {
              "type": "string"
            },
            "title": "Parcel Ids",
            "type": "array"
          }
        },
        "required": [
          "parcel_ids"
        ],
        "title": "sourcing_ownersArguments",
        "type": "object"
      },
      "name": "sourcing_owners"
    },
    {
      "description": "\n    Find land parcels, property units or buildings matching search criteria — the\n    sourcing tool. Give a `location` (place name, area code or postcode\n    district) or a `bbox`.\n\n    AREA LIMIT: one scan covers at most 150 km². A whole town or local\n    authority (Harrogate, Cheltenham, Farnham, most boroughs) is usually larger\n    and is refused with `area_too_large`, which lists the postcode districts\n    covering it. Search a large place district by district: pass one postcode\n    district per call as `location` (\"HG1\", then \"HG2\"), or a `bbox` no more\n    than 0.5° on a side. Nothing is charged for a refused area.\n\n    STRATEGY MODE (preferred). Pass a `strategy` key from\n    `sourcing_strategies` with `lad_code` or `postcode_district`, and the\n    search runs the published preset: its filters, its ranking, and a\n    `score_components` breakdown on every row saying which term earned what.\n    Override any published filter with `strategy_overrides` — `{\"min_yield_pct\":\n    8}` — or pass null for a key to switch that filter off. An unknown key is\n    rejected rather than ignored. `listing_state` restricts to on- or\n    off-market units; page with `cursor` from `next_cursor`. Strategy mode\n    ignores the legacy filters below.\n\n    Filter land by use class and `max_built_coverage` (built footprint as a\n    share of plot, so 0.2 finds substantially empty plots), units by type,\n    bedrooms, EPC band and tenure, and either by owner — `min_years_owned` is\n    the usual off-market signal, and `owner_types` separates companies from\n    public bodies.\n\n    Returns parcels with ownership attached where the bulk register knows it.\n    For land or units, use sourcing_owners to resolve a specific set afterwards.\n\n    PARKS, HEATHS, RAILWAYS, CEMETERIES AND UTILITY LAND ARE EXCLUDED BY\n    DEFAULT. The scan is ordered by parcel size, and the largest parcels in any\n    area are its open spaces — unfiltered, a Camden search returned Regent's\n    Park, Hampstead Heath, a cemetery and railway land as its top six, while\n    13,047 residential parcels in the same borough never appeared. Pass\n    `include_undevelopable=True` to see them; they come back with no indicative\n    land value, because a residual on a heath is a meaningless number that\n    reads as an authoritative one.\n\n    BUILDINGS: asset=\"buildings\" searches recorded footprints with footprint\n    area, storey count, unit count, dominant EPC and tenure. Supply one location,\n    bbox or drawn polygon. Results include matching footprints and stable\n    building IDs for linked-unit inspection. Page with offset, limit up to 100.\n    Unit/owner/strategy criteria are rejected for buildings.\n\n    INVENTORY PAGINATION: for land or units, supply offset=0, then next_offset\n    while has_more is true. These bounded pages apply every criterion before\n    pagination; derived-score/strategy criteria are not accepted in this mode.\n    Unit size uses min/max_floor_area_m2; land and buildings use min/max_area_m2.\n    Repeated warehouse reads are cached for five minutes. Results remain metered\n    by the gateway. No unknown tenure or EPC is asserted to meet a positive filter.\n\n    UK only. Costs 40 credits (40p).\n    ",
      "inputSchema": {
        "$defs": {
          "SourcingBBox": {
            "description": "A geographic bounding box in EPSG:4326.",
            "properties": {
              "max_lat": {
                "title": "Max Lat",
                "type": "number"
              },
              "max_lng": {
                "title": "Max Lng",
                "type": "number"
              },
              "min_lat": {
                "title": "Min Lat",
                "type": "number"
              },
              "min_lng": {
                "title": "Min Lng",
                "type": "number"
              }
            },
            "required": [
              "min_lng",
              "min_lat",
              "max_lng",
              "max_lat"
            ],
            "title": "SourcingBBox",
            "type": "object"
          }
        },
        "properties": {
          "area_geojson": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Area Geojson"
          },
          "asset": {
            "default": "land",
            "enum": [
              "land",
              "units",
              "buildings"
            ],
            "title": "Asset",
            "type": "string"
          },
          "bbox": {
            "anyOf": [
              {
                "$ref": "#/$defs/SourcingBBox"
              },
              {
                "type": "null"
              }
            ],
            "default": null
          },
          "company_status": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Company Status"
          },
          "cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "STRATEGY MODE ONLY: `next_cursor` from the previous page. Inventory pages use `offset`.",
            "title": "Cursor"
          },
          "epc_in": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Epc In"
          },
          "exclude_owner_types": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Exclude Owner Types"
          },
          "include_undevelopable": {
            "default": false,
            "title": "Include Undevelopable",
            "type": "boolean"
          },
          "lad_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "STRATEGY MODE scope (GSS code, e.g. E09000032). Without a strategy, pass the code as `location` instead.",
            "title": "Lad Code"
          },
          "landuse": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Landuse"
          },
          "limit": {
            "default": 50,
            "title": "Limit",
            "type": "integer"
          },
          "listing_state": {
            "anyOf": [
              {
                "enum": [
                  "any",
                  "live",
                  "live_sale",
                  "live_rent",
                  "off_market"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "STRATEGY MODE ONLY, units only: restrict to on- or off-market units. Rejected without `strategy`. For what is on the market now use `sourcing_live_listings`.",
            "title": "Listing State"
          },
          "location": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Location"
          },
          "max_area_m2": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Max Area M2"
          },
          "max_beds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Max Beds"
          },
          "max_built_coverage": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Max Built Coverage"
          },
          "max_floor_area_m2": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Max Floor Area M2"
          },
          "max_floors": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Max Floors"
          },
          "max_unexpired_years": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Max Unexpired Years"
          },
          "max_units": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Max Units"
          },
          "min_area_m2": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Min Area M2"
          },
          "min_beds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Min Beds"
          },
          "min_floor_area_m2": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Min Floor Area M2"
          },
          "min_floors": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Min Floors"
          },
          "min_rlv": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Min Rlv"
          },
          "min_score": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Min Score"
          },
          "min_units": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Min Units"
          },
          "min_years_owned": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Min Years Owned"
          },
          "offset": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Offset"
          },
          "opportunities_only": {
            "default": false,
            "title": "Opportunities Only",
            "type": "boolean"
          },
          "owner_types": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Owner Types"
          },
          "postcode_district": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "STRATEGY MODE scope (e.g. SW11). Without a strategy, pass it as `location`.",
            "title": "Postcode District"
          },
          "property_types": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Property Types"
          },
          "require_owner": {
            "default": false,
            "title": "Require Owner",
            "type": "boolean"
          },
          "strategy": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "A preset key from `sourcing_strategies`. Turns on strategy mode.",
            "title": "Strategy"
          },
          "strategy_overrides": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "STRATEGY MODE ONLY. Values for the preset's own filter keys.",
            "title": "Strategy Overrides"
          },
          "tenure": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Tenure"
          }
        },
        "title": "sourcing_searchArguments",
        "type": "object"
      },
      "name": "sourcing_search"
    },
    {
      "description": "\n    The nine sourcing strategies as data — read this BEFORE running\n    `sourcing_search` in strategy mode. Each preset publishes its thesis, its\n    filters (every key overridable, with the default and the unit), its\n    ranking components with weights and scales, the feature columns it reads,\n    the data gaps that limit it, and its version.\n\n    Pass `area` as a local-authority GSS code (E09000032) to get `data_ready`\n    per strategy for that authority: `ready`, `partial`, `not_ready` or\n    `unknown`, with the coverage share behind the verdict. A `partial` verdict\n    is usable — say the share when you report the results. Do not run a\n    preset over an authority marked `not_ready` without telling the user what\n    is missing.\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Area"
          }
        },
        "title": "sourcing_strategiesArguments",
        "type": "object"
      },
      "name": "sourcing_strategies"
    },
    {
      "description": "\n    The property's own last registered sale carried by the published\n    repeat-sales index to its latest settled month: the price paid, the date,\n    the index factor applied and the anchored value. Where a property has\n    sold, this is the strongest single piece of evidence a valuation has.\n    When no published series can carry the sale the factor and the anchored\n    value are null and the anchor is diagnostic, never carried at 1.0.\n    Returns an empty anchor when no registered sale is linked to the UPRN.\n    UK only. Free. Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "subject_transaction_anchorArguments",
        "type": "object"
      },
      "name": "subject_transaction_anchor"
    },
    {
      "description": "\n    Supply and demand for an area in one call: live stock today (count,\n    median days on market, new-home count) and the monthly flow — listings\n    added and reduced, reduction share, new-home share, agent concentration,\n    asking-to-sold on the registry-matched subset and days to completion.\n    Read the basis sentences: the flow count is the never-reduced cohort; the\n    live-stock series began 2026-09-05 and is forward-only.\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "area_code": {
            "default": "NATIONAL",
            "title": "Area Code",
            "type": "string"
          },
          "area_type": {
            "default": "district",
            "enum": [
              "district",
              "lad",
              "national"
            ],
            "title": "Area Type",
            "type": "string"
          },
          "bedroom_band": {
            "default": "all",
            "enum": [
              "all",
              "1bed",
              "2bed",
              "3bed",
              "4bed",
              "5plus",
              "unknown"
            ],
            "title": "Bedroom Band",
            "type": "string"
          },
          "channel": {
            "default": "residential_sale",
            "enum": [
              "residential_sale",
              "residential_rent"
            ],
            "title": "Channel",
            "type": "string"
          },
          "months": {
            "default": 12,
            "title": "Months",
            "type": "integer"
          }
        },
        "title": "supply_demandArguments",
        "type": "object"
      },
      "name": "supply_demand"
    },
    {
      "description": "\n    The factor that carries a price paid in a past month to the latest\n    SETTLED month of the published repeat-sales house-price index: the\n    postcode district's own series, else its local authority's, else the\n    national series; forecast months are never used. Returns `factor`, the\n    two index levels (`index_level_from`, `index_level_to`), `basis`\n    (repeat_sales_district | repeat_sales_lad | repeat_sales_national),\n    `current_period` (the month carried to, which trails the calendar by the\n    registry's lag) and provenance. `status` is ok or index_unavailable: a\n    price no published series covers has a null factor, never a stand-in 1.0.\n    A factor of exactly 1.0 is real (a price from that month or later; see\n    `reason`). The same carry the valuation applies to each comparable and to\n    the property's own last sale. `postcode` is a full UK postcode or a\n    district; `from_date` is YYYY-MM-DD; `lookback_years` (1–20) only sets\n    how much of `monthly_series` comes back.\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "from_date": {
            "title": "From Date",
            "type": "string"
          },
          "lookback_years": {
            "default": 5,
            "title": "Lookback Years",
            "type": "integer"
          },
          "postcode": {
            "title": "Postcode",
            "type": "string"
          },
          "property_type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Property Type"
          }
        },
        "required": [
          "postcode",
          "from_date"
        ],
        "title": "time_adjustmentArguments",
        "type": "object"
      },
      "name": "time_adjustment"
    },
    {
      "description": "\n    All HMLR Price Paid records joined to this UPRN, newest first.\n    England & Wales only. Free. Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "transactions_by_uprnArguments",
        "type": "object"
      },
      "name": "transactions_by_uprn"
    },
    {
      "description": "\n    How accurate our valuations have been, measured the only way that cannot\n    leak: each month, every registered sale the model had ALREADY valued is\n    compared with the price actually paid — MdAPE (median absolute\n    percentage error), PPE20 (share within 20%) and n, per asset class and\n    model version. Until the first vintage lands in October 2026 the answer is\n    `status: no_rows_yet` with the metric definitions: an empty table, not a\n    zero error. Filters: `asset_class` (Residential | Commercial | Mixed-Use),\n    `model_version` (e.g. gbm-h3-v4), `since` (YYYY-MM).\n    UK only. Free.\n    ",
      "inputSchema": {
        "properties": {
          "asset_class": {
            "anyOf": [
              {
                "enum": [
                  "Commercial",
                  "Mixed-Use",
                  "Other",
                  "Residential",
                  "Unclassified"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Asset Class"
          },
          "model_version": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Model Version"
          },
          "since": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Since"
          }
        },
        "title": "valuation_accuracyArguments",
        "type": "object"
      },
      "name": "valuation_accuracy"
    },
    {
      "description": "\n    Comparable completed sales for a valuation, beyond the property's own\n    building: Land Registry sales of the nearest units (within 1 km, the 60\n    months before `as_of`), widening from 250 m and 12 months until at least\n    6 qualify. A sale qualifies when it is the same broad type (flats with\n    flats, houses with houses, from the type recorded at the sale), within\n    0.67-1.5x the subject's floor area when both are known, category A and\n    not an anomaly. Category B, anomalous, new-build and out-of-band sales\n    are returned with `flags`, never dropped: review contrary sales rather\n    than ignoring them. Each sale: price, date, UPRN, address, distance,\n    floor area, bedrooms, tenure, `qualifies`, `similarity` (score with\n    distance, recency, size, type and bedrooms components). Floor area and\n    bedrooms are the unit's CURRENT record, not as at the sale\n    (`attributes_after_sale` flags a record dated after it). `selection`\n    names the step used; `provenance` lists every step tried and the data\n    watermark. Time-adjust prices with the published index before use.\n    `as_of` YYYY-MM or YYYY-MM-DD (default today); `limit` 1-60.\n    UK only. Costs 10 credits (10p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "as_of": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "As Of"
          },
          "limit": {
            "default": 30,
            "title": "Limit",
            "type": "integer"
          },
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "valuation_comparablesArguments",
        "type": "object"
      },
      "name": "valuation_comparables"
    },
    {
      "description": "\n    Automated value estimate for a property: a point value plus a range.\n    Returns 404 when we hold no valuation for the UPRN — most often because\n    the unit has no floor area on record, which the model requires.\n    UK only. Free. Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "valuation_estimateArguments",
        "type": "object"
      },
      "name": "valuation_estimate"
    },
    {
      "description": "\n    Full valuation block for a property: the value and its range, a monthly\n    back-series (the value scaled by the local £/m² index, so it terminates\n    at the headline figure by construction), a rental estimate where the\n    district benchmark supports one, and a `trust_score` scoring the evidence\n    behind the number — index sample size, floor-area provenance, model\n    confidence. Use `valuation_estimate` if you only need the number; this is\n    materially more expensive.\n    UK only. Free. Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "valuation_fullArguments",
        "type": "object"
      },
      "name": "valuation_full"
    },
    {
      "description": "\n    Comparable lets for a market rent, and the rent they indicate. ASKING\n    rents from portal adverts: no achieved rents exist, so say \"asking\" when\n    you quote them. Reads the rent adverts of the nearest units (within 1 km,\n    last seen in the 24 months before `as_of`), widening from 250 m and 6\n    months until 4 effective comparables qualify. A let qualifies when it is\n    the same type family (flats with flats, houses with houses; house shares\n    and rooms never), the same bedrooms (+/- 1 only when exact cannot reach\n    the minimum), and within 0.67-1.5x the subject's floor area when both are\n    known; others come back with `flags`. Each let:\n    address, distance, beds, floor area, first/last seen, `outcome`\n    (let_agreed | withdrawn | live | unknown), first and last asking rent,\n    reductions, days on market, the rent carried to the last complete month\n    on the asking-rent index (`carried_rent_pcm`), `adjusted_rent_pcm` (equal\n    to it while size adjustment is off) and its `weight` (distance, recency, size, beds,\n    type; let agreed counts more, an unlet reduced asking rent less).\n    `estimate`: central_pcm (weighted median, an achievable ASKING rent),\n    low_pcm/high_pcm (80% range; back-tested on let-agreed adverts: median\n    miss 10%, 80% coverage), n_effective, and asking_to_achieved_ratio\n    (ONS paid rents over the local asking median for the bedroom band, capped\n    0.85-1.05, 1.0 with ratio_source `none` when no cell) published BESIDE\n    the estimate, not applied. `time_on_market_days`: median days to let\n    agreed for the comparable lets. The property's own adverts are never\n    comparables; its latest is `subject_advert`. `status` ok | thin |\n    no_comparables | location_unavailable. PASS `beds`, `property_type`\n    (flat | terraced | semi-detached | detached | bungalow) and\n    `floor_area_m2` whenever you have established them: the unit record's\n    bedrooms are imputed for most properties, and a wrong bedroom count\n    doubles the miss (`subject.attributes_source` says what was used).\n    `as_of` YYYY-MM or YYYY-MM-DD (default today); `limit` 1-30.\n    UK only. Costs 10 credits (10p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.",
      "inputSchema": {
        "properties": {
          "as_of": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "As Of"
          },
          "beds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Beds"
          },
          "floor_area_m2": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Floor Area M2"
          },
          "limit": {
            "default": 12,
            "title": "Limit",
            "type": "integer"
          },
          "property_type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Property Type"
          },
          "uprn": {
            "title": "Uprn",
            "type": "integer"
          }
        },
        "required": [
          "uprn"
        ],
        "title": "valuation_rent_comparablesArguments",
        "type": "object"
      },
      "name": "valuation_rent_comparables"
    }
  ]
}

What the leaf hashes

{"body":"d62161f91357c8944755988c8d1a4ccc8356899ce80b998dfc9e77d836ad3406","id":1054110,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793312790074040,"prev":null,"subject":"d02b0de7-9361-4a3b-9b8e-305e7f1582b0","subject_kind":"endpoint"}

Proof

Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (242798 rows).

  1. 0x064a375df9da09f7dfa0728b0bf12e04518dbc17637f5c777be2a60f5f6f2f20
  2. 0x7db82635ddaa2afcf4388896dc97bcae74edf343fd55004652fa8ff01d1232d4
  3. 0x0c2254c77f0876839a66ef5adaffc704fff10673b88934a6a681be05d11c1b1e
  4. 0xd7d6aea6b756ec6b67c4b79702bea82e8ffb0a93955c57dcdc584a6bbd4a720e
  5. 0x22d5225af43c02130f00a09e51c895a1de1c4b98c8e919e8753a2075ab45b5ed
  6. 0x5eea0543792660afb47bdd97357dba4e8d3bd651d618af0ed92189389c7e7307
  7. 0x578974a5234d7da5cc2872d575de13f2bbec0e8d90852e071d447543819c1a0d
  8. 0x7895a3b950ea44f7ce00b48bfba9b8fb77620c7656044290276bf70634ab0db5
  9. 0xbbda3851cf26fd6a4fdc31398e797d3274433cd73acd6264394882ef74fe3a53
  10. 0x534cc04094e61352b94070e19c5b94a26043c71d96a09af0bd194a17c217d585
  11. 0xc455c315869ba566ee1c328b7afd63a26a57427f76d1ef95a4e255a037e819ca
  12. 0xeeef478e72d0232efe7ef7b610409fded4b0ea5dd5a5de8274e6124961e9927b
  13. 0xf70713c5ae237d535074be6b275af68f87013bcbf94d32957a08fb04463d4c59
  14. 0x7806c5d294aa520a3cdaf5e1d58181e6315b37856d332d91c3a1e53dff27254d
  15. 0x0507b989510de89f78184f7a10d971f7670a579c54df7d291a2d72f034ae74d3
  16. 0xa0a7723889a4c15b3e0bec353fa8dbcaec6c71cf35bb6c346415ad3e664df6a6
  17. 0xd76435ead496863d8b0bfab3434f54cd11da3c49d104fc4064b9cb3381567bbd
  18. 0xd56e61af23709ed9f460471e3c08400c0142ee83e1fd9057e46350d12edf9c07
Day root
0xc050555c6b023f2aefb6536efb9f0760b92c30a0d06c572b7daf63db259ea17c
Chained
0x4cde8bae2042512e1bec11650628f0293556311cc4ea74d99ffddf02b671a7d6
Published
On Arc Testnet, block 69753317: 0x9e85c340732f416e431b111fae72f7624870125f7f379af2732eb6c2ba8cf6a1

How to check it · This row as JSON