{"openapi":"3.1.0","info":{"title":"Trove API","version":"1.0.0","description":"Read-only API for Trove, a UK residential land sourcing platform built on the UK's land, ownership and planning record. Authenticate with a personal access token: `Authorization: Bearer <token>`. Tokens are read-only and rate limited to 1000 requests per hour; remaining quota is returned in the X-RateLimit-* headers. An MCP server is also available. Coverage is a subset of England by county; call /api/regions for the live set."},"paths":{"/api/data/sources":{"get":{"summary":"Provenance of the underlying data","operationId":"data_sources_api_data_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"description":"Every upstream dataset behind the answers, with its licence, row count and when it was last ingested."}},"/api/lpa/{lpa_code}/profile":{"get":{"summary":"How a planning authority behaves","description":"Approval rate, median decision time, and breakdowns by application type and year for one local planning authority, keyed by GSS code (e.g. E08000035 for Leeds).","operationId":"lpa_profile_api_lpa__lpa_code__profile_get","parameters":[{"name":"lpa_code","in":"path","required":true,"schema":{"type":"string","title":"Lpa Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stats":{"get":{"summary":"Coverage totals for your counties","operationId":"stats_api_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"description":"Parcel, owner and sales counts across the counties your plan covers."}},"/api/insights/schema":{"get":{"summary":"The vocabulary for research queries","description":"Which measures, statistics, dimensions and filters /api/insights/aggregate accepts, the frame every answer is computed under, and the known caveats in the planning corpus. Read this before forming a query: the measures are a fixed, small set and a guessed name gets a 400, not an approximate answer.","operationId":"insights_schema_api_insights_schema_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/insights/aggregate":{"post":{"summary":"One aggregate over the planning record","description":"A research query: days to decision, decisions or units, as a statistic, optionally grouped by authority, year, quarter, scale, outcome, application type or Green Belt. Returns aggregates only, never individual applications, each with the n behind it and the frame that produced it. Publish the frame with any figure you publish.","operationId":"insights_aggregate_api_insights_aggregate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightQuery"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/regions":{"get":{"summary":"Counties Trove covers, and which you hold","description":"The full county catalogue with which are live and which your plan reaches. Call this before concluding an area has no sites: outside the live set an empty result means not covered, not nothing there.","operationId":"region_catalogue_api_regions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/parcels/{parcel_id}/assembly":{"get":{"summary":"Corporate site assembly around a parcel","description":"Whether the parcel's owner holds adjoining or nearby land, and what else they own within your counties. Null when there is no corporate proprietor.","operationId":"parcel_assembly_api_parcels__parcel_id__assembly_get","parameters":[{"name":"parcel_id","in":"path","required":true,"schema":{"type":"integer","title":"Parcel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/parcels/{parcel_id}/holding":{"get":{"summary":"The contiguous holding around a parcel","description":"The principal corporate owner, the contiguous landholding around the parcel as GeoJSON, and that owner's other sites.","operationId":"parcel_holding_api_parcels__parcel_id__holding_get","parameters":[{"name":"parcel_id","in":"path","required":true,"schema":{"type":"integer","title":"Parcel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/parcels/{parcel_id}/locate":{"get":{"summary":"Centre point of a parcel","description":"A lightweight centroid lookup, for deep links and map focus.","operationId":"parcel_locate_api_parcels__parcel_id__locate_get","parameters":[{"name":"parcel_id","in":"path","required":true,"schema":{"type":"integer","title":"Parcel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/parcels/{parcel_id}/planning":{"get":{"summary":"Planning history near a parcel","description":"Planning applications on or near the parcel, with decisions and dates.","operationId":"parcel_planning_api_parcels__parcel_id__planning_get","parameters":[{"name":"parcel_id","in":"path","required":true,"schema":{"type":"integer","title":"Parcel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/parcels/{parcel_id}/terrain/mesh":{"get":{"summary":"Terrain heightfield for a parcel","description":"A 3D height mesh for the parcel, baked on demand and cached.","operationId":"parcel_terrain_mesh_api_parcels__parcel_id__terrain_mesh_get","parameters":[{"name":"parcel_id","in":"path","required":true,"schema":{"type":"integer","title":"Parcel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/parcels/{parcel_id}/precedents":{"get":{"summary":"Approved schemes nearby","description":"Residential schemes already approved near this parcel, ranked by distance, with unit counts: real precedent rather than policy.","operationId":"parcel_precedents_api_parcels__parcel_id__precedents_get","parameters":[{"name":"parcel_id","in":"path","required":true,"schema":{"type":"integer","title":"Parcel Id"}},{"name":"radius_m","in":"query","required":false,"schema":{"type":"integer","default":1000,"title":"Radius M"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/parcels/{parcel_id}/comparable-decisions":{"get":{"summary":"How this authority decides comparable schemes","description":"Approval rate, median decision time and sample size for schemes comparable to this parcel, from the planning authority's own decision record, matched on green-belt status, plus a plain-English note on where refusals cluster. Answers whether this authority tends to approve something like this.","operationId":"parcel_comparable_decisions_api_parcels__parcel_id__comparable_decisions_get","parameters":[{"name":"parcel_id","in":"path","required":true,"schema":{"type":"integer","title":"Parcel Id"}},{"name":"scheme","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheme"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/parcels/{parcel_id}":{"get":{"summary":"Full dossier for one parcel","operationId":"parcel_api_parcels__parcel_id__get","parameters":[{"name":"parcel_id","in":"path","required":true,"schema":{"type":"integer","title":"Parcel Id"}},{"name":"profile","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile"}},{"name":"wd","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wd"}},{"name":"wp","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wp"}},{"name":"wv","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wv"}},{"name":"wa","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wa"}},{"name":"gb","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gb"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"description":"Everything Trove holds on a site: the opportunity score and its components, a plain-English verdict with opportunities and risks, planning constraints and risk triage, ownership, routes to value, and nearby sales. A parcel outside your plan's counties returns a limited preview."}},"/api/parcels/{parcel_id}/report":{"get":{"summary":"Assembled report for a parcel","description":"The dossier and decision layer as one document, for a chosen audience. Use this instead of assembling the individual endpoints yourself.","operationId":"parcel_report_api_parcels__parcel_id__report_get","parameters":[{"name":"parcel_id","in":"path","required":true,"schema":{"type":"integer","title":"Parcel Id"}},{"name":"pack","in":"query","required":false,"schema":{"type":"string","default":"snapshot","title":"Pack"}},{"name":"profile","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile"}},{"name":"wd","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wd"}},{"name":"wp","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wp"}},{"name":"wv","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wv"}},{"name":"wa","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wa"}},{"name":"gb","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gb"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/search":{"post":{"summary":"Search for land","operationId":"search_api_search_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"description":"Find parcels matching a set of criteria: area, ownership type, planning constraints to require or exclude, brownfield status, permitted-development routes (Class Q, Class MA), grey belt, slope, and a point-and-radius around a postcode. Returns scored results ranked by the chosen strategy profile. Scoped to the counties your plan covers. Call /api/regions first."}},"/api/strategy":{"get":{"summary":"Scoring profiles","operationId":"strategy_profiles_api_strategy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"description":"The strategy profiles search accepts and which is default. Each weights the score components differently, so the same land ranks differently under each."}},"/api/geocode":{"get":{"summary":"Resolve a postcode, place name or parcel number to a point","description":"Turns a full or partial UK postcode, a town/parish name or a parcel number (#123) into a centre point for radius search. The label says what matched.","operationId":"geocode_api_geocode_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects":{"get":{"summary":"Your saved projects","operationId":"list_projects_api_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"description":"The projects (saved searches) in your workspace."}},"/api/projects/{project_id}/saved":{"get":{"summary":"Parcels saved to a project","operationId":"list_saved_api_projects__project_id__saved_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"description":"The parcels saved into one project, with any notes and status."}},"/api/parcels/{parcel_id}/projects":{"get":{"summary":"Which of your projects hold this parcel","description":"The projects in your workspace that have already saved this parcel.","operationId":"parcel_projects_api_parcels__parcel_id__projects_get","parameters":[{"name":"parcel_id","in":"path","required":true,"schema":{"type":"integer","title":"Parcel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts":{"get":{"summary":"Activity on your watched sites","operationId":"list_alerts_api_alerts_get","parameters":[{"name":"unseen_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Unseen Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"description":"Planning, sale and ownership activity detected on the parcels and owners you are watching."}},"/api/alerts/summary":{"get":{"summary":"Unread alert count","operationId":"alerts_summary_api_alerts_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"description":"A count of unseen alerts, for badging."}},"/api/mcp":{"post":{"summary":"MCP endpoint (streamable HTTP)","description":"The Model Context Protocol endpoint: the same read-only tools as the API, for an AI assistant. Add it to claude.ai or Claude Desktop as a custom connector, to Claude Code with `claude mcp add --transport http`, or to any remote-MCP client, with the personal access token as a bearer header. Stateless JSON-RPC: one POST per message, no session to keep.","tags":["mcp"],"responses":{"200":{"description":"A JSON-RPC response"}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InsightQuery":{"properties":{"measure":{"type":"string","title":"Measure"},"stats":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Stats"},"group_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group By"},"residential_only":{"type":"boolean","title":"Residential Only","default":true},"scale":{"type":"string","title":"Scale","default":"any"},"green_belt":{"type":"string","title":"Green Belt","default":"any"},"since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"},"until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Until"},"min_group_n":{"type":"integer","title":"Min Group N","default":150}},"type":"object","required":["measure"],"title":"InsightQuery"},"SearchReq":{"properties":{"filters":{"additionalProperties":true,"type":"object","title":"Filters","default":{}},"with_results":{"type":"boolean","title":"With Results","default":false},"profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile"},"weights":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Weights"},"sort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"},"desc":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Desc"}},"type":"object","title":"SearchReq"}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"A Trove personal access token."}}},"servers":[{"url":"https://app.trove.land"}],"security":[{"bearerAuth":[]}]}