{
  "lexichat_export_version": 2,
  "exported_at": "2026-07-26T00:00:00.000Z",
  "profile": {
    "id": "jfx3uiuwfgo",
    "name": "OS Data Explorer",
    "systemPrompt": "You are an expert in UK geospatial data and the Ordnance Survey (OS) identifier\nsystem. You help users navigate the relationships between properties, streets,\nroads and buildings, and can also fetch geometry, basemap tiles and routing\nwhen needed — always via a real tool call, never by guessing.\n\nTHE IDENTIFIER SYSTEM (learn these — they drive everything):\n- UPRN (Unique Property Reference Number) — a single property/address. Feature type: BLPU.\n- USRN (Unique Street Reference Number) — a street. Feature type: Street.\n- TOID (Topographic Identifier) — an OS MasterMap feature: a building/land polygon\n  (feature type TopographicArea), a road centre-line (RoadLink), or a road (Road).\n- GUID — Open Roads network features (feature types ORRoadLink, ORRoadNode).\nEvery real-world thing carries one or more of these IDs. The Linked Identifiers API\ntells you which identifiers refer to the same or related real-world feature.\n\nDO NOT CONFUSE identifierType with featureType — they are two different enums:\n- identifierType (used on /identifierTypes/{identifierType}/{id}): GUID | TOID | UPRN | USRN\n- featureType (used on /featureTypes/{featureType}/{id}): BLPU | ORRoadNode | ORRoadLink |\n  Road | RoadLink | Street | TopographicArea\nUPRN is an identifierType, NOT a featureType. The featureType that corresponds to a UPRN\nis BLPU. Passing 'UPRN' as a featureType (or any wrong-list value, or wrong casing) causes\nan 'Identifier type is not valid' 400 error. If you get that error, check you used the\nright enum for the endpoint you called before retrying.\n\nWHICH TOOL TO USE — DECIDE FIRST, THEN CALL (read this before picking a tool):\n\n1. \"I have an ID (UPRN/USRN/TOID/GUID) and want related IDs\" -> OS Linked Identifiers API.\n   This is your workhorse. Use /identifierTypes/{type}/{id} when you know the type\n   (more precise); /identifiers/{id} only when you don't; /featureTypes/{featureType}/{id}\n   to jump straight to one relationship; /productVersionInfo for data provenance.\n\n2. \"I have an address/postcode/place NAME and need a UPRN\" -> there is currently NO\n   connected tool that resolves an address to a UPRN. Do NOT use OS Names API for\n   this — it is a place-name gazetteer, not an address lookup, and cannot return a\n   UPRN. Ask the user for the UPRN/USRN/TOID directly (or explain that an address\n   lookup tool such as OS Places API would be needed and isn't connected).\n\n3. \"Where is [place name / town / hill / postcode district]?\" (coordinates only,\n   no UPRN needed) -> OS Names API `find_place`. This is a coarse gazetteer search,\n   good for named places, not house-level addresses.\n\n4. \"What is near this coordinate?\" (nearest named feature) -> OS Names API\n   `find_nearest_place`.\n\n5. \"I need the actual geometry/attributes of a building, road, or area\" (for\n   analysis, not just to look at) -> OS Features API. Pick typeNames by need:\n   Zoomstack_* for national/overview scale, Topography_* for precise large-scale\n   building/road outlines, OpenUPRN_Address/OpenUSRN_USRN for lightweight\n   address/street points. NOTE: Topography_* (detailed building/road outlines) needs a PREMIUM OS plan — with a free OpenData key it returns 403, so on a free key prefer the OpenData layers (Zoomstack_*, OpenUPRN_Address, OpenUSRN_USRN) and do not retry Topography_* after a 403.\n\n6. \"Show me / build me a basemap\" -> two options, pick based on what the user\n   needs:\n   - A ready-made image tile / simple background map -> OS Maps API (raster PNG).\n   - A restylable, interactive, click-the-features basemap for a web/GIS app ->\n     OS Vector Tile API (vector .pbf + style JSON).\n   Either way: these return BINARY tile data you cannot read. Only call them to\n   construct a tile/style URL to hand to the user or another app — never to\n   \"look at\" the map yourself, and don't loop retrying them expecting text back.\n\n7. \"Get me directions / travel time / distance between places\" or \"find a coffee\n   shop / brand / POI near X\" (not a UK administrative identifier or address) ->\n   Mapbox MCP tools (mapbox_directions, mapbox_matrix, geocoding/search, static\n   map image). Mapbox is global and POI/routing-focused; prefer OS APIs instead\n   whenever the request is really about a UK address, UPRN/USRN/TOID, or\n   authoritative OS mapping — don't reach for Mapbox geocoding as a substitute\n   for OS Names/Linked Identifiers.\n\n8. If OS Features / OS NGD is connected and you already have a TopographicArea\n   or RoadLink TOID, feed it onward to fetch the actual geometry.\n\nCORRELATION METHODS (Linked Identifiers results are grouped by a named method,\ne.g. BLPU_UPRN<->RoadLink_TOID, RoadLink_TOID<->TopographicArea_TOID, Road<->Street,\nOpen Roads<->OS MasterMap Highways mappings). The method name IS the meaning of\nthe link — always tell the user which relationship each linked identifier came from.\n\nWORKFLOWS YOU EXCEL AT (chain the endpoints yourself — the output ID of one call is\nthe input to the next; never ask the user to do the chaining):\n- \"What street is this property on?\"        -> UPRN -> USRN\n- \"List every property on this street\"       -> USRN -> UPRNs (often hundreds — aggregate)\n- \"Which building polygon is this address?\"  -> UPRN -> TopographicArea TOID\n- \"What is this building / road link?\"        -> TOID -> UPRN / USRN\n- Cross-reference Open Roads (GUID) with OS MasterMap Highways (TOID)\n\nRULES:\n- NEVER invent or guess a UPRN, USRN, TOID or GUID. Every identifier in your answer\n  comes from a tool call THIS turn. If a lookup returns nothing, say so plainly — do\n  not fabricate a plausible-looking number.\n- Read the ACTUAL JSON the API returns and follow its real fields and groupings;\n  don't assume a response shape.\n- One ID can link to many others (a street -> hundreds of UPRNs). When a result is\n  large, use run_python (if available) to count, group and de-duplicate exactly\n  rather than estimating from a truncated slice.\n- For every result, state the identifier, its type, its feature type, and the\n  correlation method (the relationship). Present multiple results as a clear table.\n- Give data currency from Product Version Information when provenance matters.\n- Be precise, neutral and factual. No guessing, no filler.\n",
    "model": "",
    "enabledTools": {
      "read_file": false,
      "list_files": false,
      "web_search": true,
      "run_python": true
    },
    "enabledMcpServerIds": [
      "19d7f398-19d7-4398-bf39-19d81c46f47848"
    ],
    "enabledOpenapiSpecIds": [
      "0e817488-0e81-4488-9748-e818b5dca7218",
      "1adbfde8-1adb-4de8-bfde-1adc283050b438",
      "364b79a0-364b-49a0-b79a-364bcf18d076e0",
      "32f5e218-32f5-4218-9e21-32f6325112ebc8",
      "2d4bee98-2d4b-4e98-bee9-2d4c35e6889948"
    ],
    "enabledSparqlEndpointIds": [
      "builtin-landregistry"
    ],
    "maxTools": 80,
    "toolResultLimit": 22000,
    "allowCodeTools": true,
    "chatParams": {
      "style": "precise",
      "responseLength": "auto",
      "contextSize": "short"
    },
    "allowedDirs": [],
    "enabledSkillIds": [
      "geospatial-map",
      "spreadsheet-model",
      "dashboard",
      "branded-report",
      "api-explainer",
      "chart-styling"
    ]
  },
  "toolRegistry": {
    "openapiSpecs": [
      {
        "id": "364b79a0-364b-49a0-b79a-364bcf18d076e0",
        "title": "OS Names API",
        "base_url": "https://api.os.uk/search/names/v1",
        "spec_json": "{\"openapi\": \"3.0.3\", \"info\": {\"title\": \"OS Names API\", \"version\": \"1.0\", \"description\": \"OS Names API is a PLACE-NAME gazetteer / coarse geocoder from Ordnance Survey. It resolves a free-text place name, road name, or postcode district to a British National Grid (EPSG:27700) coordinate pair and an administrative context.\\n\\nDOES NOT DO: it does not return individual/precise addresses, and it CANNOT be used to resolve an address to a UPRN. If a user wants a UPRN from an address, there is no connected tool for that \\u2014 ask them for the UPRN/USRN/TOID directly, or for the postcode + house name/number if you only need an approximate location (not a UPRN).\\n\\nUSE THIS WHEN: the user names a place, town, hill, station, or postcode district and wants to know where it is / its coordinates \\u2014 not when they give a specific house address and want its identifier.\\n\\nTwo operations: `find_place` (fuzzy text search) for \\\"where is X\\\" / \\\"find place named X\\\"; `find_nearest_place` for \\\"what's the closest [feature type] to this coordinate\\\". Coordinates returned are BNG easting/northing, not lat/lon \\u2014 convert if you need WGS84. Optionally narrow with the `fq` local-type filter (e.g. `LOCAL_TYPE:Hospital`). One query per request; no batch search.\", \"contact\": {\"name\": \"OS Data Hub / OS APIs documentation\", \"url\": \"https://docs.os.uk/os-apis/accessing-os-apis/os-names-api\"}, \"license\": {\"name\": \"Ordnance Survey Data Hub Terms and Conditions\", \"url\": \"https://osdatahub.os.uk/legal/terms\"}}, \"servers\": [{\"url\": \"https://api.os.uk/search/names/v1\", \"description\": \"OS Names API v1 production endpoint\"}], \"tags\": [{\"name\": \"Find\", \"description\": \"A free string text search of OS Names, intended to be an ambiguous/fuzzy search by name.\"}, {\"name\": \"Nearest\", \"description\": \"Find the feature(s) closest to a given British National Grid coordinate point.\"}], \"security\": [{\"api-key\": []}], \"paths\": {\"/find\": {\"get\": {\"tags\": [\"Find\"], \"summary\": \"Fuzzy text search for a place NAME (not an address) \\u2014 returns coordinates\", \"operationId\": \"findPlace\", \"description\": \"Resolves a free-text PLACE NAME (town, village, hill, station, postcode district, road name, etc.) to a BNG coordinate. NOT for addresses \\u2014 it will not return a UPRN, and results for a house-level address query will be unreliable/approximate at best. Use when the user asks 'where is X' / 'find place called X'. Pass the user's text verbatim as `query`; use `fq` to narrow by local_type if the user implies a category (e.g. \\\"the hospital called...\\\"); use `bounds` to bias to a BNG bounding box if the user gives an approximate area.\", \"parameters\": [{\"name\": \"query\", \"in\": \"query\", \"required\": true, \"description\": \"The free-text search string, e.g. a place name, road name, or postcode district. This is a fuzzy/ambiguous match, not an exact match \\u2014 the API will return its best-ranked interpretations.\", \"schema\": {\"type\": \"string\"}, \"example\": \"Southampton\"}, {\"name\": \"format\", \"in\": \"query\", \"required\": false, \"description\": \"The format the response will be returned in.\", \"schema\": {\"type\": \"string\", \"enum\": [\"JSON\", \"XML\"], \"default\": \"JSON\"}, \"example\": \"JSON\"}, {\"name\": \"maxresults\", \"in\": \"query\", \"required\": false, \"description\": \"The maximum number of results to return. Minimum = 1. Maximum = 100. Default = 100.\", \"schema\": {\"type\": \"integer\", \"minimum\": 1, \"maximum\": 100, \"default\": 100}, \"example\": 10}, {\"name\": \"offset\", \"in\": \"query\", \"required\": false, \"description\": \"Offsets the list of returned results by this amount, for paging through a large result set.\", \"schema\": {\"type\": \"integer\", \"minimum\": 1}, \"example\": 1}, {\"name\": \"bounds\", \"in\": \"query\", \"required\": false, \"style\": \"form\", \"explode\": false, \"description\": \"Biases results toward a certain area. Given as a British National Grid bounding box in the form `XMIN,YMIN,XMAX,YMAX` (four comma-separated numbers).\", \"schema\": {\"type\": \"array\", \"minItems\": 4, \"maxItems\": 4, \"items\": {\"type\": \"number\"}}, \"example\": [438000, 114000, 445000, 117000]}, {\"name\": \"fq\", \"in\": \"query\", \"required\": false, \"description\": \"Filters results to only a specific `local_type` (feature category). Useful to disambiguate (\\\"only towns\\\", \\\"only railway stations\\\", \\\"only hospitals\\\"). See the full code list for allowed values.\", \"schema\": {\"$ref\": \"#/components/schemas/LocalType\"}, \"example\": \"City\"}], \"responses\": {\"200\": {\"description\": \"A list of gazetteer entries matching the free-text search.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/SearchResponse\"}, \"examples\": {\"southamptonExample\": {\"summary\": \"query=Southampton\", \"value\": {\"header\": {\"uri\": \"https://api.os.uk/search/names/v1/find?query=Southampton\", \"query\": \"Southampton\", \"format\": \"JSON\", \"maxresults\": 100, \"offset\": 0, \"totalresults\": 3}, \"results\": [{\"GAZETTEER_ENTRY\": {\"ID\": \"osgb4000000074559645\", \"NAMES_URI\": \"http://data.os.uk/id/4000000074559645\", \"NAME1\": \"Southampton\", \"TYPE\": \"populatedPlace\", \"LOCAL_TYPE\": \"City\", \"GEOMETRY_X\": 442100, \"GEOMETRY_Y\": 112000, \"MOST_DETAIL_VIEW_RES\": 10000, \"LEAST_DETAIL_VIEW_RES\": 250000, \"MBR_XMIN\": 434900, \"MBR_YMIN\": 108300, \"MBR_XMAX\": 447500, \"MBR_YMAX\": 117800, \"POSTCODE_DISTRICT\": \"SO14\", \"POSTCODE_DISTRICT_URI\": \"http://data.os.uk/id/postcodedistrict/SO14\", \"COUNTY_UNITARY\": \"Southampton\", \"COUNTY_UNITARY_URI\": \"http://data.os.uk/id/7000000000037256\", \"COUNTY_UNITARY_TYPE\": \"UnitaryAuthority\", \"REGION\": \"South East\", \"REGION_URI\": \"http://data.os.uk/id/7000000000041462\", \"COUNTRY\": \"England\", \"COUNTRY_URI\": \"http://data.os.uk/id/7000000000041446\"}}]}}}}, \"application/xml\": {\"schema\": {\"$ref\": \"#/components/schemas/SearchResponse\"}}}}, \"400\": {\"$ref\": \"#/components/responses/BadRequest\"}, \"401\": {\"$ref\": \"#/components/responses/Unauthorized\"}, \"403\": {\"$ref\": \"#/components/responses/Forbidden\"}, \"429\": {\"$ref\": \"#/components/responses/TooManyRequests\"}, \"500\": {\"$ref\": \"#/components/responses/ServerError\"}}}}, \"/nearest\": {\"get\": {\"tags\": [\"Nearest\"], \"summary\": \"Find the nearest named place/feature to a coordinate point\", \"operationId\": \"findNearestPlace\", \"description\": \"Given a BNG coordinate point, returns the nearest named gazetteer feature (place, road, station, etc.). Use for 'what is near this point' \\u2014 not for resolving an address to an identifier.\", \"parameters\": [{\"name\": \"point\", \"in\": \"query\", \"required\": true, \"description\": \"A British National Grid coordinate pair, `easting,northing`, to which the nearest record (in a straight line) should be found.\", \"schema\": {\"type\": \"string\"}, \"example\": \"440200,449300\"}, {\"name\": \"radius\", \"in\": \"query\", \"required\": false, \"description\": \"The radius in metres to search within. Minimum = 0.01, Maximum = 1000, Default = 100.\", \"schema\": {\"type\": \"number\", \"minimum\": 0.01, \"maximum\": 1000, \"default\": 100}, \"example\": 100}, {\"name\": \"format\", \"in\": \"query\", \"required\": false, \"description\": \"The format the response will be returned in.\", \"schema\": {\"type\": \"string\", \"enum\": [\"JSON\", \"XML\"], \"default\": \"JSON\"}, \"example\": \"JSON\"}, {\"name\": \"fq\", \"in\": \"query\", \"required\": false, \"description\": \"Filters results to only a specific `local_type` (feature category), e.g. only `Railway_Station` or only `Hospital`. See the full code list for allowed values.\", \"schema\": {\"$ref\": \"#/components/schemas/LocalType\"}, \"example\": \"Railway_Station\"}], \"responses\": {\"200\": {\"description\": \"The nearest gazetteer entry to the given point.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/SearchResponse\"}, \"examples\": {\"nearestExample\": {\"summary\": \"point=440200,449300\", \"value\": {\"header\": {\"uri\": \"https://api.os.uk/search/names/v1/nearest?point=440200,449300\", \"format\": \"JSON\", \"maxresults\": 1, \"offset\": 0, \"totalresults\": 1}, \"results\": [{\"GAZETTEER_ENTRY\": {\"ID\": \"osgb4000000074552549\", \"NAMES_URI\": \"http://data.os.uk/id/4000000074552549\", \"NAME1\": \"York\", \"TYPE\": \"populatedPlace\", \"LOCAL_TYPE\": \"City\", \"GEOMETRY_X\": 460200, \"GEOMETRY_Y\": 449319, \"MOST_DETAIL_VIEW_RES\": 10000, \"LEAST_DETAIL_VIEW_RES\": 250000, \"MBR_XMIN\": 459300, \"MBR_YMIN\": 448300, \"MBR_XMAX\": 461200, \"MBR_YMAX\": 450200, \"POSTCODE_DISTRICT\": \"YO1\", \"POSTCODE_DISTRICT_URI\": \"http://data.os.uk/id/postcodedistrict/YO1\", \"COUNTY_UNITARY\": \"York\", \"COUNTY_UNITARY_URI\": \"http://data.os.uk/id/7000000000037266\", \"COUNTY_UNITARY_TYPE\": \"UnitaryAuthority\", \"REGION\": \"Yorkshire and The Humber\", \"REGION_URI\": \"http://data.os.uk/id/7000000000041461\", \"COUNTRY\": \"England\", \"COUNTRY_URI\": \"http://data.os.uk/id/7000000000041446\"}}]}}}}, \"application/xml\": {\"schema\": {\"$ref\": \"#/components/schemas/SearchResponse\"}}}}, \"400\": {\"$ref\": \"#/components/responses/BadRequest\"}, \"401\": {\"$ref\": \"#/components/responses/Unauthorized\"}, \"403\": {\"$ref\": \"#/components/responses/Forbidden\"}, \"429\": {\"$ref\": \"#/components/responses/TooManyRequests\"}, \"500\": {\"$ref\": \"#/components/responses/ServerError\"}}}}}, \"components\": {\"securitySchemes\": {\"api-key\": {\"type\": \"apiKey\", \"name\": \"key\", \"in\": \"query\", \"description\": \"API key passed as the `key` query-string parameter, e.g. `?key=YOUR_API_KEY`. Obtained from an API project in the OS Data Hub.\"}}, \"responses\": {\"BadRequest\": {\"description\": \"Bad request \\u2014 a required parameter was missing, malformed, or a parameter value was outside its allowed range (e.g. `radius` above 1000, or an invalid `fq` value).\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}}}}, \"Unauthorized\": {\"description\": \"Missing or invalid API key.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}}}}, \"Forbidden\": {\"description\": \"The API key is valid but is not authorised for the OS Names API (e.g. not added to the API project), or a usage/plan limit was reached.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}}}}, \"TooManyRequests\": {\"description\": \"Rate limit exceeded \\u2014 throttle/back off and retry.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}}}}, \"ServerError\": {\"description\": \"An unexpected server-side error occurred.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}}}}}, \"schemas\": {\"LocalType\": {\"type\": \"string\", \"description\": \"Feature category used to filter `/find` and `/nearest` results via the `fq` parameter (as `local_type:<value>`). This is the OS Names API \\\"code list\\\" of local types.\", \"enum\": [\"Airfield\", \"Airport\", \"Bay\", \"Beach\", \"Bus_Station\", \"Channel\", \"Chemical_Works\", \"Cirque_Or_Hollow\", \"City\", \"Cliff_Or_Slope\", \"Coach_Station\", \"Coastal_Headland\", \"Electricity_Distribution\", \"Electricity_Production\", \"Estuary\", \"Further_Education\", \"Gas_Distribution_or_Storage\", \"Group_Of_Islands\", \"Hamlet\", \"Harbour\", \"Helicopter_Station\", \"Heliport\", \"Higher_or_University_Education\", \"Hill_Or_Mountain\", \"Hill_Or_Mountain_Ranges\", \"Hospice\", \"Hospital\", \"Inland_Water\", \"Island\", \"Medical_Care_Accommodation\", \"Named_Road\", \"Non_State_Primary_Education\", \"Non_State_Secondary_Education\", \"Numbered_Road\", \"Oil_Distribution_or_Storage\", \"Oil_Refining\", \"Oil_Terminal\", \"Other_Coastal_Landform\", \"Other_Landcover\", \"Other_Landform\", \"Other_Settlement\", \"Passenger_Ferry_Terminal\", \"Port_Consisting_of_Docks_and_Nautical_Berthing\", \"Postcode\", \"Primary_Education\", \"Railway\", \"Railway_Station\", \"Road_User_Services\", \"Sea\", \"Secondary_Education\", \"Section_Of_Named_Road\", \"Section_Of_Numbered_Road\", \"Special_Needs_Education\", \"Spot_Height\", \"Suburban_Area\", \"Tidal_Water\", \"Town\", \"Tramway\", \"Urban_Greenspace\", \"Valley\", \"Vehicular_Ferry_Terminal\", \"Vehicular_Rail_Terminal\", \"Village\", \"Waterfall\", \"Wetland\", \"Woodland_Or_Forest\"]}, \"Header\": {\"type\": \"object\", \"description\": \"Echoes the request parameters and pagination/result-count metadata.\", \"properties\": {\"uri\": {\"type\": \"string\", \"description\": \"The fully resolved request URI (minus the API key) that produced this response.\"}, \"query\": {\"type\": \"string\", \"description\": \"The free-text query submitted (present for `/find` responses).\"}, \"format\": {\"type\": \"string\", \"description\": \"The response format, JSON or XML.\"}, \"maxresults\": {\"type\": \"integer\", \"description\": \"The maximum number of results requested/returned.\"}, \"offset\": {\"type\": \"integer\", \"description\": \"The offset applied to the result list.\"}, \"totalresults\": {\"type\": \"integer\", \"description\": \"Total number of matching results available (may exceed the number actually returned).\"}}}, \"GazetteerEntry\": {\"type\": \"object\", \"description\": \"A single wrapper object containing one gazetteer feature.\", \"properties\": {\"GAZETTEER_ENTRY\": {\"type\": \"object\", \"description\": \"The gazetteer feature details.\", \"additionalProperties\": true, \"properties\": {\"ID\": {\"type\": \"string\", \"description\": \"Unique OS identifier for this gazetteer entry (e.g. \\\"osgb4000000074559645\\\").\"}, \"NAMES_URI\": {\"type\": \"string\", \"description\": \"Linked-data URI identifying this named feature.\"}, \"NAME1\": {\"type\": \"string\", \"description\": \"The primary name of the feature (e.g. the English name).\"}, \"NAME2\": {\"type\": \"string\", \"description\": \"An alternative name of the feature where one exists (e.g. the Welsh or Gaelic name, such as \\\"Caerdydd\\\" for Cardiff). Only present when an alternative name exists.\"}, \"TYPE\": {\"type\": \"string\", \"description\": \"Broad feature type, e.g. \\\"populatedPlace\\\", \\\"transportNetwork\\\", \\\"landform\\\".\"}, \"LOCAL_TYPE\": {\"type\": \"string\", \"description\": \"More specific feature classification, e.g. \\\"City\\\", \\\"Hamlet\\\", \\\"Railway_Station\\\". Matches the LocalType code list.\"}, \"GEOMETRY_X\": {\"type\": \"number\", \"description\": \"British National Grid easting of the feature's representative point.\"}, \"GEOMETRY_Y\": {\"type\": \"number\", \"description\": \"British National Grid northing of the feature's representative point.\"}, \"MOST_DETAIL_VIEW_RES\": {\"type\": \"integer\", \"description\": \"The most detailed map resolution (scale denominator) at which this feature is shown.\"}, \"LEAST_DETAIL_VIEW_RES\": {\"type\": \"integer\", \"description\": \"The least detailed map resolution (scale denominator) at which this feature is shown.\"}, \"MBR_XMIN\": {\"type\": \"number\", \"description\": \"Minimum easting of the feature's minimum bounding rectangle.\"}, \"MBR_YMIN\": {\"type\": \"number\", \"description\": \"Minimum northing of the feature's minimum bounding rectangle.\"}, \"MBR_XMAX\": {\"type\": \"number\", \"description\": \"Maximum easting of the feature's minimum bounding rectangle.\"}, \"MBR_YMAX\": {\"type\": \"number\", \"description\": \"Maximum northing of the feature's minimum bounding rectangle.\"}, \"POSTCODE_DISTRICT\": {\"type\": \"string\", \"description\": \"The postcode district the feature falls within, if applicable.\"}, \"POSTCODE_DISTRICT_URI\": {\"type\": \"string\", \"description\": \"Linked-data URI for the postcode district.\"}, \"POPULATED_PLACE\": {\"type\": \"string\", \"description\": \"The name of the populated place the feature falls within (if the feature itself is not a populated place).\"}, \"POPULATED_PLACE_URI\": {\"type\": \"string\", \"description\": \"Linked-data URI for the populated place.\"}, \"POPULATED_PLACE_TYPE\": {\"type\": \"string\", \"description\": \"Local type of the containing populated place.\"}, \"COUNTY_UNITARY\": {\"type\": \"string\", \"description\": \"The county or unitary authority the feature falls within.\"}, \"COUNTY_UNITARY_URI\": {\"type\": \"string\", \"description\": \"Linked-data URI for the county/unitary authority.\"}, \"COUNTY_UNITARY_TYPE\": {\"type\": \"string\", \"description\": \"Type of the county/unitary authority area, e.g. \\\"UnitaryAuthority\\\", \\\"County\\\".\"}, \"REGION\": {\"type\": \"string\", \"description\": \"The region the feature falls within (e.g. \\\"South East\\\", \\\"Yorkshire and The Humber\\\").\"}, \"REGION_URI\": {\"type\": \"string\", \"description\": \"Linked-data URI for the region.\"}, \"COUNTRY\": {\"type\": \"string\", \"description\": \"The country the feature falls within, e.g. \\\"England\\\", \\\"Wales\\\", \\\"Scotland\\\".\"}, \"COUNTRY_URI\": {\"type\": \"string\", \"description\": \"Linked-data URI for the country.\"}, \"DISTANCE\": {\"type\": \"number\", \"description\": \"Straight-line distance in metres from the queried point to this feature. Only present in `/nearest` responses.\"}}}}}, \"SearchResponse\": {\"type\": \"object\", \"description\": \"Top-level response body returned by both `/find` and `/nearest`.\", \"properties\": {\"header\": {\"$ref\": \"#/components/schemas/Header\"}, \"results\": {\"type\": \"array\", \"items\": {\"$ref\": \"#/components/schemas/GazetteerEntry\"}}}}, \"ErrorResponse\": {\"type\": \"object\", \"description\": \"Standard error payload returned for non-2xx responses.\", \"properties\": {\"error\": {\"type\": \"object\", \"properties\": {\"statuscode\": {\"type\": \"integer\", \"description\": \"HTTP status code.\", \"example\": 400}, \"message\": {\"type\": \"string\", \"description\": \"Human-readable description of the error.\", \"example\": \"Required parameter 'query' is missing.\"}}}}}}}}",
        "auth": {
          "type": "apikey",
          "api_key_header": "key",
          "api_key_value": ""
        }
      },
      {
        "id": "1adbfde8-1adb-4de8-bfde-1adc283050b438",
        "title": "OS LinkedData API",
        "base_url": "https://api.os.uk/search/links/v1",
        "spec_json": "{\"openapi\": \"3.0.0\", \"info\": {\"title\": \"OS Linked Identifiers API\", \"version\": \"1.0.0\", \"description\": \"OS Linked Identifiers API (free OpenData) cross-references UK geographic identifier schemes for the SAME real-world thing: UPRN (address/property, BLPU), USRN (street), TOID (OS MasterMap feature \\u2014 building, road link, road; format `osgb` + 13-16 digits), GUID (OS Open Roads feature).\\n\\nENDPOINTS: `/identifiers/{id}` \\u2014 id, type unknown. `/identifierTypes/{identifierType}/{id}` \\u2014 type known (UPRN|USRN|TOID|GUID), more precise, prefer this over the above when you know the type. `/featureTypes/{featureType}/{id}` \\u2014 filter to one relationship (BLPU|Street|RoadLink|Road|TopographicArea|ORRoadLink|ORRoadNode). `/productVersionInfo/{correlationMethod}` \\u2014 data currency/provenance for a given correlation.\\n\\nResults are grouped by named correlation method (e.g. BLPU_UPRN_Street_USRN_11 = address<->street) \\u2014 the method name IS the meaning of the link; always report it alongside the linked identifier. Auth: `key` query parameter.\"}, \"servers\": [{\"url\": \"https://api.os.uk/search/links/v1\", \"description\": \"OS Linked Identifiers API production server on OS Data Hub\"}], \"security\": [{\"ApiKeyAuth\": []}], \"tags\": [{\"name\": \"OS OpenData Users\", \"description\": \"Operations available to all customers on the free OpenData plan (no premium subscription required).\"}], \"components\": {\"securitySchemes\": {\"ApiKeyAuth\": {\"type\": \"apiKey\", \"in\": \"query\", \"name\": \"key\", \"description\": \"Your OS Data Hub API key, passed as a query string parameter, e.g. https://api.os.uk/search/links/v1/identifiers/100023336956?key=YOUR_API_KEY. Register a free project at https://osdatahub.os.uk to obtain a key. Do not expose your key in client-side/browser code for public-facing apps; proxy requests through a server instead.\"}}, \"parameters\": {\"featureIdentifier\": {\"name\": \"id\", \"in\": \"path\", \"required\": true, \"description\": \"The identifier value of the feature being queried, e.g. a UPRN like '100023336956', a USRN like '4205097', or a TOID like 'osgb1000002153452735'. Do not include the identifierType or featureType prefix in this value \\u2014 it goes in a separate path segment where relevant.\", \"schema\": {\"type\": \"string\", \"minLength\": 1, \"maxLength\": 36}, \"example\": \"100023336956\"}}, \"schemas\": {\"featureType\": {\"type\": \"string\", \"description\": \"The kind of real-world/geometric feature an identifier refers to.\\n- BLPU: Basic Land and Property Unit \\u2014 an address record (identified by a UPRN).\\n- ORRoadNode: a junction/node in the OS Open Roads network (identified by a GUID).\\n- ORRoadLink: a road section in the OS Open Roads network (identified by a GUID).\\n- Road: a named road, grouping multiple RoadLinks (identified by a TOID), from OS MasterMap Highways Network.\\n- RoadLink: a single road section from junction to junction (identified by a TOID), from OS MasterMap Highways Network.\\n- Street: a street as allocated by a local authority (identified by a USRN).\\n- TopographicArea: a polygon feature from OS MasterMap Topography Layer, e.g. a building outline or road surface area (identified by a TOID).\", \"enum\": [\"BLPU\", \"ORRoadNode\", \"ORRoadLink\", \"Road\", \"RoadLink\", \"Street\", \"TopographicArea\"]}, \"identifierType\": {\"type\": \"string\", \"description\": \"The identifier scheme used for a value.\\n- GUID: Globally Unique Identifier, used by OS Open Roads (ORRoadLink/ORRoadNode).\\n- TOID: Topographic Identifier, used across OS MasterMap products (BLPU/Road/RoadLink/TopographicArea). Format: 'osgb' + 13 or 16 digits.\\n- UPRN: Unique Property Reference Number, the national standard identifier for an address/property (BLPU feature type).\\n- USRN: Unique Street Reference Number, the national standard identifier for a street (Street feature type).\", \"enum\": [\"GUID\", \"TOID\", \"UPRN\", \"USRN\"]}, \"correlationMethodIdentifier\": {\"type\": \"string\", \"description\": \"Identifies which of the 11 published relationship types a correlation belongs to. The naming convention is '{FeatureA}_{IdA}_{FeatureB}_{IdB}_{n}'.\\n- RoadLink_TOID_TopographicArea_TOID_2: RoadLink <-> TopographicArea\\n- Road_TOID_TopographicArea_TOID_3: Road <-> TopographicArea\\n- Street_USRN_TopographicArea_TOID_4: Street <-> TopographicArea\\n- BLPU_UPRN_TopographicArea_TOID_5: address <-> building outline\\n- RoadLink_TOID_Road_TOID_7: RoadLink <-> Road\\n- RoadLink_TOID_Street_USRN_8: RoadLink <-> Street\\n- BLPU_UPRN_RoadLink_TOID_9: address <-> RoadLink\\n- Road_TOID_Street_USRN_10: Road <-> Street\\n- BLPU_UPRN_Street_USRN_11: address <-> street (common address-to-street lookup)\\n- ORRoadLink_GUID_RoadLink_TOID_12: Open Roads RoadLink <-> OSMM Highways RoadLink\\n- ORRoadNode_GUID_RoadLink_TOID_13: Open Roads RoadNode <-> OSMM Highways RoadLink\", \"enum\": [\"RoadLink_TOID_TopographicArea_TOID_2\", \"Road_TOID_TopographicArea_TOID_3\", \"Street_USRN_TopographicArea_TOID_4\", \"BLPU_UPRN_TopographicArea_TOID_5\", \"RoadLink_TOID_Road_TOID_7\", \"RoadLink_TOID_Street_USRN_8\", \"BLPU_UPRN_RoadLink_TOID_9\", \"Road_TOID_Street_USRN_10\", \"BLPU_UPRN_Street_USRN_11\", \"ORRoadLink_GUID_RoadLink_TOID_12\", \"ORRoadNode_GUID_RoadLink_TOID_13\"]}, \"correlatedIdentifier\": {\"type\": \"object\", \"description\": \"A single identifier found to correlate with the searched-for identifier, plus versioning/confidence metadata for that specific correlated value.\", \"required\": [\"identifier\", \"confidence\", \"correlationIdentifier\"], \"additionalProperties\": false, \"properties\": {\"identifier\": {\"type\": \"string\", \"description\": \"The value of the correlated identifier, e.g. a USRN or TOID.\", \"example\": \"4205097\"}, \"versionNumber\": {\"type\": \"number\", \"description\": \"Version number of this specific identifier value at the time of correlation.\"}, \"versionDate\": {\"type\": \"string\", \"description\": \"Date this version of the identifier was published, e.g. '2026-05-13'.\"}, \"confidence\": {\"type\": \"string\", \"description\": \"Confidence level of this particular correlation (e.g. how reliable OS considers the match to be), as text, e.g. 'HIGH' or 'LOW' depending on the correlation method.\", \"example\": \"HIGH\"}, \"correlationIdentifier\": {\"type\": \"string\", \"description\": \"An internal identifier for this specific correlation record, useful for support/traceability rather than for further lookups.\"}}}, \"correlation\": {\"type\": \"object\", \"description\": \"One relationship set: describes which correlation method was used, what type of feature/identifier was found on the other end, and the list of actual correlated identifier values.\", \"required\": [\"correlationMethodIdentifier\", \"correlatedFeatureType\", \"correlatedIdentifierType\", \"correlatedIdentifiers\"], \"additionalProperties\": false, \"properties\": {\"searchedIdentifierVersionDate\": {\"type\": \"string\", \"description\": \"Version date of the identifier that was searched for (the input 'id').\"}, \"searchedIdentifierVersionNumber\": {\"type\": \"number\", \"description\": \"Version number of the identifier that was searched for (the input 'id').\"}, \"correlationMethodIdentifier\": {\"$ref\": \"#/components/schemas/correlationMethodIdentifier\"}, \"correlatedFeatureType\": {\"$ref\": \"#/components/schemas/featureType\"}, \"correlatedIdentifierType\": {\"$ref\": \"#/components/schemas/identifierType\"}, \"correlatedIdentifiers\": {\"type\": \"array\", \"description\": \"The one or more identifier values that correlate with the searched-for identifier via this correlation method. Usually a single item, but can be more than one (e.g. several building TOIDs on the same UPRN, or several addresses on a street if this were queried the other way).\", \"items\": {\"$ref\": \"#/components/schemas/correlatedIdentifier\"}}}}, \"linkedIdentifier\": {\"type\": \"object\", \"description\": \"The full result for one searched-for identifier: what it is, and every correlation (relationship) found for it.\", \"required\": [\"linkedIdentifier\", \"correlations\"], \"additionalProperties\": false, \"properties\": {\"linkedIdentifier\": {\"title\": \"linkedIdentifier\", \"type\": \"object\", \"description\": \"Describes the identifier that was searched for.\", \"required\": [\"identifier\", \"featureType\", \"identifierType\"], \"additionalProperties\": false, \"properties\": {\"identifier\": {\"type\": \"string\", \"description\": \"The identifier value that was searched for, echoed back.\", \"example\": \"100023336956\"}, \"featureType\": {\"$ref\": \"#/components/schemas/featureType\"}, \"identifierType\": {\"$ref\": \"#/components/schemas/identifierType\"}}}, \"correlations\": {\"type\": \"array\", \"description\": \"All relationships found for the searched-for identifier, one entry per correlation method that returned a match.\", \"items\": {\"$ref\": \"#/components/schemas/correlation\"}}}}, \"linkedIdentifierSet\": {\"type\": \"object\", \"description\": \"Wrapper used only by GET /identifiers/{id}, because that endpoint can return more than one distinct linkedIdentifier result for a single input value (this happens because UPRNs and USRNs can share the same numeric namespace, so an ambiguous 'id' with no declared type can genuinely match both).\", \"required\": [\"linkedIdentifiers\"], \"additionalProperties\": false, \"properties\": {\"linkedIdentifiers\": {\"type\": \"array\", \"title\": \"linkedIdentifiers\", \"description\": \"One or more independent linkedIdentifier results for the searched-for id.\", \"items\": {\"$ref\": \"#/components/schemas/linkedIdentifier\"}}}}, \"identifierSource\": {\"type\": \"object\", \"description\": \"Describes the specific OS product edition that one side of a correlation was derived from.\", \"required\": [\"productName\", \"productPublicationDate\", \"featureType\", \"identifierType\"], \"additionalProperties\": false, \"properties\": {\"productName\": {\"type\": \"string\", \"description\": \"Name of the OS product this identifier/feature comes from.\", \"enum\": [\"AddressBase Premium\", \"OS MasterMap Highways Network - Roads\", \"OS MasterMap Topography Layer\", \"OS Open Roads\"]}, \"productPublicationDate\": {\"type\": \"string\", \"description\": \"Publication date of the specific product edition used, e.g. '2026-06-13'.\"}, \"productPublicationName\": {\"type\": \"string\", \"description\": \"Publication/epoch name or label for this product edition, e.g. 'Epoch 44'.\"}, \"featureType\": {\"$ref\": \"#/components/schemas/featureType\"}, \"identifierType\": {\"$ref\": \"#/components/schemas/identifierType\"}}}, \"correlationMethodInformation\": {\"type\": \"object\", \"description\": \"Version/provenance metadata for one correlation method, describing the two source products whose data was combined to create that relationship.\", \"required\": [\"methodIdentifier\", \"productCreationDate\", \"identifier1Source\", \"identifier2Source\"], \"additionalProperties\": false, \"properties\": {\"methodIdentifier\": {\"$ref\": \"#/components/schemas/correlationMethodIdentifier\"}, \"productCreationDate\": {\"type\": \"string\", \"description\": \"Date the correlation dataset itself was created/generated, e.g. '2026-06-13'.\"}, \"productPublicationName\": {\"type\": \"string\", \"description\": \"Publication/epoch label for the correlation dataset, e.g. 'Epoch 44'.\"}, \"identifier1Source\": {\"$ref\": \"#/components/schemas/identifierSource\"}, \"identifier2Source\": {\"$ref\": \"#/components/schemas/identifierSource\"}}}}, \"responses\": {\"BadRequest\": {\"description\": \"400 Bad Request. E.g. a missing required query parameter, or malformed syntax in the path (id too long/short, invalid enum value for identifierType/featureType/correlationMethod).\", \"content\": {\"application/json\": {\"example\": {\"message\": \"Bad Request\", \"detail\": \"id does not match required pattern or length constraints\"}}}}, \"Unauthorized\": {\"description\": \"401 Unauthorized. The 'key' query parameter (or OAuth2 bearer token) was not provided, or the API key is invalid/expired. Check that 'key=YOUR_API_KEY' is present and correctly spelled in the request URL.\", \"content\": {\"application/json\": {\"example\": {\"message\": \"Unauthorized\", \"detail\": \"API key missing or invalid\"}}}}, \"Forbidden\": {\"description\": \"403 Forbidden. The API key is valid but does not have sufficient rights for this API/plan (e.g. the key's project has not been given access to OS Linked Identifiers API, or a plan mismatch).\", \"content\": {\"application/json\": {\"example\": {\"message\": \"Forbidden\", \"detail\": \"This API key does not have access to this resource\"}}}}, \"NotFound\": {\"description\": \"404 Not Found. No feature/identifier matches the given path (e.g. the id, identifierType/id combination, featureType/id combination, or correlationMethod does not exist).\", \"content\": {\"application/json\": {\"example\": {\"message\": \"Not Found\", \"detail\": \"No matching identifier found\"}}}}, \"MethodNotAllowed\": {\"description\": \"405 Method Not Allowed. An unsupported HTTP method was used against this resource, e.g. POST, PUT or DELETE. All operations in this API are GET-only.\", \"content\": {\"application/json\": {\"example\": {\"message\": \"Method Not Allowed\"}}}}, \"TooManyRequests\": {\"description\": \"429 Too Many Requests. You have exceeded the number of requests per minute allowed for your API key/plan. Wait and retry with backoff; consider batching or caching results client-side.\", \"content\": {\"application/json\": {\"example\": {\"message\": \"Too Many Requests\", \"detail\": \"Rate limit exceeded\"}}}}, \"InternalServerError\": {\"description\": \"500 Internal Server Error. A generic, unexpected error occurred on the OS server. Retrying later may succeed; if it persists, contact OS support.\", \"content\": {\"application/json\": {\"example\": {\"message\": \"Internal Server Error\"}}}}, \"ServiceUnavailable\": {\"description\": \"503 Service Unavailable. Temporary outage due to overloading or planned maintenance. Retry after a delay; check the OS service status dashboard if it persists.\", \"content\": {\"application/json\": {\"example\": {\"message\": \"Service Unavailable\"}}}}}}, \"paths\": {\"/identifiers/{id}\": {\"get\": {\"operationId\": \"getLinksByIdentifier\", \"tags\": [\"OS OpenData Users\"], \"summary\": \"Query identifier (type unknown)\", \"description\": \"Use this when you have an identifier value (a UPRN, USRN, TOID, or GUID) but you do NOT know which of those four schemes it belongs to. The API infers the type and returns the associated linked identifiers.\\n\\nIMPORTANT: because UPRNs and USRNs can share overlapping numeric ranges, a single input id can sometimes match both a property AND a street. That's why the response is a `linkedIdentifierSet` \\u2014 an ARRAY of results (`linkedIdentifiers`) \\u2014 rather than a single object. Always iterate over the array rather than assuming exactly one result.\\n\\nIf you already know the identifier's type or feature type, prefer /identifierTypes/{identifierType}/{id} or /featureTypes/{featureType}/{id} instead \\u2014 they are unambiguous and return a single result.\\n\\nWORKED EXAMPLE\\nRequest: GET https://api.os.uk/search/links/v1/identifiers/100023336956?key=YOUR_API_KEY\\nThis returns every correlation found for the id '100023336956' across all feature/identifier types it matches. Inspect `linkedIdentifiers[].linkedIdentifier.identifierType` in the response to see which type(s) OS actually resolved it to.\", \"parameters\": [{\"$ref\": \"#/components/parameters/featureIdentifier\"}], \"responses\": {\"200\": {\"description\": \"One or more sets of linked identifiers matching the searched-for id.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/linkedIdentifierSet\"}, \"example\": {\"linkedIdentifiers\": [{\"linkedIdentifier\": {\"identifier\": \"100023336956\", \"featureType\": \"BLPU\", \"identifierType\": \"UPRN\"}, \"correlations\": [{\"searchedIdentifierVersionDate\": \"2026-06-13\", \"searchedIdentifierVersionNumber\": 3, \"correlationMethodIdentifier\": \"BLPU_UPRN_Street_USRN_11\", \"correlatedFeatureType\": \"Street\", \"correlatedIdentifierType\": \"USRN\", \"correlatedIdentifiers\": [{\"identifier\": \"4205097\", \"versionNumber\": 2, \"versionDate\": \"2026-05-13\", \"confidence\": \"HIGH\", \"correlationIdentifier\": \"abc-123\"}]}, {\"correlationMethodIdentifier\": \"BLPU_UPRN_TopographicArea_TOID_5\", \"correlatedFeatureType\": \"TopographicArea\", \"correlatedIdentifierType\": \"TOID\", \"correlatedIdentifiers\": [{\"identifier\": \"osgb1000002153452735\", \"confidence\": \"HIGH\", \"correlationIdentifier\": \"def-456\"}]}]}]}}}}, \"400\": {\"$ref\": \"#/components/responses/BadRequest\"}, \"401\": {\"$ref\": \"#/components/responses/Unauthorized\"}, \"403\": {\"$ref\": \"#/components/responses/Forbidden\"}, \"404\": {\"$ref\": \"#/components/responses/NotFound\"}, \"405\": {\"$ref\": \"#/components/responses/MethodNotAllowed\"}, \"429\": {\"$ref\": \"#/components/responses/TooManyRequests\"}, \"500\": {\"$ref\": \"#/components/responses/InternalServerError\"}, \"503\": {\"$ref\": \"#/components/responses/ServiceUnavailable\"}}}}, \"/identifierTypes/{identifierType}/{id}\": {\"get\": {\"operationId\": \"getLinksByIdentifierType\", \"tags\": [\"OS OpenData Users\"], \"summary\": \"Query identifier when its identifier type is known\", \"description\": \"Use this when you know both the identifier value AND which scheme it belongs to (GUID, TOID, UPRN, or USRN). This is the preferred/most precise endpoint: unlike /identifiers/{id}, it returns exactly one `linkedIdentifier` object rather than an array, because declaring the identifierType removes the UPRN/USRN namespace-overlap ambiguity.\\n\\nWORKED EXAMPLE\\nGoal: find the street (USRN) and building outline (TOID) for a known UPRN.\\nRequest: GET https://api.os.uk/search/links/v1/identifierTypes/UPRN/100023336956?key=YOUR_API_KEY\\nResponse: a single linkedIdentifier object whose `correlations` array contains one entry per relationship OS has for that UPRN \\u2014 e.g. one entry with correlatedFeatureType='Street' (giving the USRN) and one with correlatedFeatureType='TopographicArea' (giving the building outline TOID).\\n\\nAnother example \\u2014 resolving a road TOID to its Open Roads GUID equivalent:\\nGET https://api.os.uk/search/links/v1/identifierTypes/TOID/osgb1000002153452735?key=YOUR_API_KEY\\nLook for a correlation with correlationMethodIdentifier='ORRoadLink_GUID_RoadLink_TOID_12' to get the matching Open Roads GUID.\", \"parameters\": [{\"$ref\": \"#/components/parameters/featureIdentifier\"}, {\"name\": \"identifierType\", \"in\": \"path\", \"required\": true, \"explode\": true, \"description\": \"The IDENTIFIER type of the id being queried. Must be exactly one of GUID, TOID, UPRN, USRN (uppercase, case-sensitive). This is NOT the same list as featureType (BLPU|ORRoadNode|ORRoadLink|Road|RoadLink|Street|TopographicArea) used on /featureTypes/{featureType}/{id} \\u2014 e.g. a UPRN's corresponding featureType is BLPU, not 'UPRN'.\", \"schema\": {\"$ref\": \"#/components/schemas/identifierType\"}, \"example\": \"UPRN\"}], \"responses\": {\"200\": {\"description\": \"The single linked identifier result and all its correlations.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/linkedIdentifier\"}, \"example\": {\"linkedIdentifier\": {\"identifier\": \"100023336956\", \"featureType\": \"BLPU\", \"identifierType\": \"UPRN\"}, \"correlations\": [{\"searchedIdentifierVersionDate\": \"2026-06-13\", \"searchedIdentifierVersionNumber\": 3, \"correlationMethodIdentifier\": \"BLPU_UPRN_Street_USRN_11\", \"correlatedFeatureType\": \"Street\", \"correlatedIdentifierType\": \"USRN\", \"correlatedIdentifiers\": [{\"identifier\": \"4205097\", \"versionNumber\": 2, \"versionDate\": \"2026-05-13\", \"confidence\": \"HIGH\", \"correlationIdentifier\": \"abc-123\"}]}]}}}}, \"400\": {\"$ref\": \"#/components/responses/BadRequest\"}, \"401\": {\"$ref\": \"#/components/responses/Unauthorized\"}, \"403\": {\"$ref\": \"#/components/responses/Forbidden\"}, \"404\": {\"$ref\": \"#/components/responses/NotFound\"}, \"405\": {\"$ref\": \"#/components/responses/MethodNotAllowed\"}, \"429\": {\"$ref\": \"#/components/responses/TooManyRequests\"}, \"500\": {\"$ref\": \"#/components/responses/InternalServerError\"}, \"503\": {\"$ref\": \"#/components/responses/ServiceUnavailable\"}}}}, \"/featureTypes/{featureType}/{id}\": {\"get\": {\"operationId\": \"getLinksByFeatureType\", \"tags\": [\"OS OpenData Users\"], \"summary\": \"Query identifier when its feature type is known\", \"description\": \"NOTE: reconstructed by analogy with /identifierTypes/{identifierType}/{id} (see the top-level info.description for why) \\u2014 confirm against the live docs 'try it' panel before production use.\\n\\nUse this when you know both the identifier value AND the kind of real-world feature it represents (BLPU, ORRoadNode, ORRoadLink, Road, RoadLink, Street, or TopographicArea) rather than its raw identifier scheme. This is useful when your calling system tracks 'this is a Street' rather than 'this is a USRN', for example.\\n\\nWORKED EXAMPLE\\nGoal: you have a TOID that you know represents a TopographicArea (a building outline polygon) and want its address (UPRN).\\nRequest: GET https://api.os.uk/search/links/v1/featureTypes/TopographicArea/osgb1000002153452735?key=YOUR_API_KEY\\nResponse: a linkedIdentifier object; look for a correlation with correlatedFeatureType='BLPU' to get the UPRN.\", \"parameters\": [{\"$ref\": \"#/components/parameters/featureIdentifier\"}, {\"name\": \"featureType\", \"in\": \"path\", \"required\": true, \"explode\": true, \"description\": \"The FEATURE type to filter to (BLPU|ORRoadNode|ORRoadLink|Road|RoadLink|Street|TopographicArea) \\u2014 this is NOT the same list as identifierType. Common mix-up: UPRN is an identifierType, not a featureType \\u2014 the featureType for a UPRN is BLPU. Do not pass UPRN, USRN, TOID or GUID here; those go on /identifierTypes/{identifierType}/{id} instead.\", \"schema\": {\"$ref\": \"#/components/schemas/featureType\"}, \"example\": \"TopographicArea\"}], \"responses\": {\"200\": {\"description\": \"The single linked identifier result and all its correlations.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/linkedIdentifier\"}, \"example\": {\"linkedIdentifier\": {\"identifier\": \"osgb1000002153452735\", \"featureType\": \"TopographicArea\", \"identifierType\": \"TOID\"}, \"correlations\": [{\"correlationMethodIdentifier\": \"BLPU_UPRN_TopographicArea_TOID_5\", \"correlatedFeatureType\": \"BLPU\", \"correlatedIdentifierType\": \"UPRN\", \"correlatedIdentifiers\": [{\"identifier\": \"100023336956\", \"confidence\": \"HIGH\", \"correlationIdentifier\": \"def-456\"}]}]}}}}, \"400\": {\"$ref\": \"#/components/responses/BadRequest\"}, \"401\": {\"$ref\": \"#/components/responses/Unauthorized\"}, \"403\": {\"$ref\": \"#/components/responses/Forbidden\"}, \"404\": {\"$ref\": \"#/components/responses/NotFound\"}, \"405\": {\"$ref\": \"#/components/responses/MethodNotAllowed\"}, \"429\": {\"$ref\": \"#/components/responses/TooManyRequests\"}, \"500\": {\"$ref\": \"#/components/responses/InternalServerError\"}, \"503\": {\"$ref\": \"#/components/responses/ServiceUnavailable\"}}}}, \"/productVersionInfo/{correlationMethod}\": {\"get\": {\"operationId\": \"getProductVersionInfo\", \"tags\": [\"OS OpenData Users\"], \"summary\": \"Get product version information for a correlation method\", \"description\": \"Returns metadata about the two underlying OS source products that were combined to build a given correlation method's relationship data \\u2014 e.g. which edition/epoch of AddressBase Premium and OS MasterMap Topography Layer were used to build the BLPU<->TopographicArea correlation. Useful for auditing data currency/provenance rather than for looking up individual identifiers.\\n\\nWORKED EXAMPLE\\nRequest: GET https://api.os.uk/search/links/v1/productVersionInfo/BLPU_UPRN_Street_USRN_11?key=YOUR_API_KEY\\nResponse tells you, for example, that identifier1Source is AddressBase Premium published on a given date, and identifier2Source is the street dataset published on another date \\u2014 letting you judge how current the address-to-street correlation you're relying on actually is.\", \"parameters\": [{\"name\": \"correlationMethod\", \"in\": \"path\", \"required\": true, \"explode\": true, \"description\": \"Which of the 11 correlation methods to get version/provenance information for. See correlationMethodIdentifier schema description for what each value means.\", \"schema\": {\"$ref\": \"#/components/schemas/correlationMethodIdentifier\"}, \"example\": \"BLPU_UPRN_Street_USRN_11\"}], \"responses\": {\"200\": {\"description\": \"Product version information about the requested correlation method.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/correlationMethodInformation\"}, \"example\": {\"methodIdentifier\": \"BLPU_UPRN_Street_USRN_11\", \"productCreationDate\": \"2026-06-13\", \"productPublicationName\": \"Epoch 44\", \"identifier1Source\": {\"productName\": \"AddressBase Premium\", \"productPublicationDate\": \"2026-06-01\", \"productPublicationName\": \"June 2026\", \"featureType\": \"BLPU\", \"identifierType\": \"UPRN\"}, \"identifier2Source\": {\"productName\": \"OS MasterMap Highways Network - Roads\", \"productPublicationDate\": \"2026-05-15\", \"productPublicationName\": \"May 2026\", \"featureType\": \"Street\", \"identifierType\": \"USRN\"}}}}}, \"400\": {\"$ref\": \"#/components/responses/BadRequest\"}, \"401\": {\"$ref\": \"#/components/responses/Unauthorized\"}, \"403\": {\"$ref\": \"#/components/responses/Forbidden\"}, \"404\": {\"$ref\": \"#/components/responses/NotFound\"}, \"405\": {\"$ref\": \"#/components/responses/MethodNotAllowed\"}, \"429\": {\"$ref\": \"#/components/responses/TooManyRequests\"}, \"500\": {\"$ref\": \"#/components/responses/InternalServerError\"}, \"503\": {\"$ref\": \"#/components/responses/ServiceUnavailable\"}}}}}}",
        "auth": {
          "type": "apikey",
          "api_key_header": "key",
          "api_key_value": ""
        }
      },
      {
        "id": "0e817488-0e81-4488-9748-e818b5dca7218",
        "title": "OS Features API",
        "base_url": "https://api.os.uk/features/v1",
        "spec_json": "{\"openapi\": \"3.0.1\", \"info\": {\"title\": \"OS Features API\", \"version\": \"v1.0\", \"description\": \"OS Features API exposes detailed feature GEOMETRY and attributes (buildings, roads, greenspace, addresses...) via OGC WFS. Use this \\u2014 not Maps/Vector Tile \\u2014 when the user needs actual coordinates/attributes for analysis (e.g. 'the outline of this building', 'roads within this area'), rather than a renderable basemap.\\n\\nONE endpoint, `GET /wfs` (+ `/wfs/archive/{year}` for annual snapshots); the operation is chosen via `request`: GetCapabilities (metadata) -> DescribeFeatureType (attribute schema for a typeNames) -> GetFeature (actual data, GeoJSON via outputFormat=GEOJSON). Always send service=WFS and version (2.0.0 recommended).\\n\\nKEY typeNames: Zoomstack_* (Open, small-scale, good for national/overview maps), Topography_* (Premium, precise large-scale building/road geometry), OpenUPRN_Address (Open, one point per UPRN), OpenUSRN_USRN (Open, one line per USRN), Highways_*/Sites_*/Greenspace_* (Premium overlays). Max 100 features per request \\u2014 page with count/startIndex. Default CRS is EPSG:27700 (bbox order is y,x \\u2014 northing before easting); srsName=4326/3857 also supported. Not for arbitrary historical dates (only live + whole-year archive snapshots) and not a zoomable basemap (use Maps/Vector Tile API for that). Auth: `key` query parameter.\"}, \"servers\": [{\"url\": \"https://api.os.uk/features/v1\", \"description\": \"OS Features API production server on OS Data Hub\"}], \"security\": [{\"ApiKeyAuth\": []}], \"tags\": [{\"name\": \"GetCapabilities\", \"description\": \"Returns a metadata document describing the WFS service provided by the server as well as valid WFS operations and parameters.\"}, {\"name\": \"DescribeFeatureType\", \"description\": \"Returns a description of the attributes for each feature type supported by the WFS service.\"}, {\"name\": \"GetFeature\", \"description\": \"Access to features matching a given query, from the current live dataset.\"}, {\"name\": \"Product Archive\", \"description\": \"Access to features matching a given query for a particular year, as an annual snapshot (the last full release published within that calendar year).\"}], \"components\": {\"securitySchemes\": {\"ApiKeyAuth\": {\"type\": \"apiKey\", \"in\": \"query\", \"name\": \"key\", \"description\": \"Your OS Data Hub API key, passed as a query string parameter, e.g. https://api.os.uk/features/v1/wfs?service=WFS&version=2.0.0&request=GetFeature&typeNames=Topography_TopographicArea&key=YOUR_API_KEY. Register a free project at https://osdatahub.os.uk and add OS Features API to it to obtain a working key. Do not expose your key in client-side/browser code for public-facing apps; proxy requests through a server instead.\"}}, \"parameters\": {\"request\": {\"name\": \"request\", \"in\": \"query\", \"required\": true, \"description\": \"Which WFS operation to perform. This single parameter is what actually determines the behaviour of the /wfs endpoint \\u2014 everything else (which other parameters are relevant, what the response looks like) depends on this value.\\n- GetCapabilities: discover service metadata (ignore typeNames/bbox/filter/etc \\u2014 they're not used).\\n- DescribeFeatureType: discover the attribute schema of a feature type (only typeNames is relevant in addition to service/version).\\n- GetFeature: fetch actual feature data (typeNames required; bbox/filter/count/startIndex/propertyName/outputFormat/resultType/srsName all apply).\", \"schema\": {\"type\": \"string\", \"default\": \"GetFeature\", \"enum\": [\"GetCapabilities\", \"DescribeFeatureType\", \"GetFeature\"]}, \"example\": \"GetFeature\"}, \"service\": {\"name\": \"service\", \"in\": \"query\", \"required\": true, \"description\": \"The OGC service type being requested. Always 'WFS' for this API.\", \"schema\": {\"type\": \"string\", \"enum\": [\"WFS\"]}, \"example\": \"WFS\"}, \"version\": {\"name\": \"version\", \"in\": \"query\", \"required\": true, \"description\": \"The WFS protocol version to use. 2.0.0 is recommended (it's the default and uses `count` for page size); 1.1.0/1.0.0 are older WFS versions retained for compatibility with legacy GIS clients (they use `maxFeatures` instead of `count`).\", \"schema\": {\"type\": \"string\", \"default\": \"2.0.0\", \"enum\": [\"1.0.0\", \"1.1.0\", \"2.0.0\"]}, \"example\": \"2.0.0\"}, \"typeNamesLive\": {\"name\": \"typeNames\", \"in\": \"query\", \"required\": true, \"description\": \"The feature type being requested (required for DescribeFeatureType and GetFeature; ignored for GetCapabilities). See the full catalog and product-family guidance in the top-level description. Note: DetailedPathNetwork_* and Greenspace_* are nearing End-of-Life; WaterNetwork_* has already been withdrawn and will fail even though listed here for historical reference.\", \"schema\": {\"type\": \"string\", \"enum\": [\"DetailedPathNetwork_RouteLink\", \"DetailedPathNetwork_RouteNode\", \"Highways_RoadLink\", \"Highways_RoadNode\", \"Highways_FerryLink\", \"Highways_FerryNode\", \"Highways_Street\", \"Highways_ConnectingLink\", \"Highways_ConnectingNode\", \"Highways_PathLink\", \"Highways_PathNode\", \"Greenspace_GreenspaceArea\", \"Sites_AccessPoint\", \"Sites_RoutingPoint\", \"Sites_FunctionalSite\", \"Topography_CartographicText\", \"Topography_CartographicSymbol\", \"Topography_TopographicPoint\", \"Topography_TopographicLine\", \"Topography_TopographicArea\", \"Topography_BoundaryLine\", \"WaterNetwork_HydroNode\", \"WaterNetwork_WatercourseLink\", \"Zoomstack_Airports\", \"Zoomstack_Boundaries\", \"Zoomstack_Contours\", \"Zoomstack_DistrictBuildings\", \"Zoomstack_ETL\", \"Zoomstack_Foreshore\", \"Zoomstack_Greenspace\", \"Zoomstack_LocalBuildings\", \"Zoomstack_Names\", \"Zoomstack_NationalParks\", \"Zoomstack_RailwayStations\", \"Zoomstack_Rail\", \"Zoomstack_RoadsLocal\", \"Zoomstack_RoadsNational\", \"Zoomstack_RoadsRegional\", \"Zoomstack_Sites\", \"Zoomstack_Surfacewater\", \"Zoomstack_UrbanAreas\", \"Zoomstack_Waterlines\", \"Zoomstack_Woodland\", \"OpenUPRN_Address\", \"OpenUSRN_USRN\", \"OpenTOID_TopographyLayer\", \"OpenTOID_HighwaysNetwork\", \"OpenTOID_SitesLayer\"]}, \"example\": \"Topography_TopographicArea\"}, \"typeNamesArchive\": {\"name\": \"typeNames\", \"in\": \"query\", \"required\": true, \"description\": \"The feature type being requested from the Product Archive (year-scoped) service. This is a smaller set than the live endpoint \\u2014 only products with historical annual snapshots are available here.\", \"schema\": {\"type\": \"string\", \"enum\": [\"Highways_RoadLink\", \"Highways_RoadNode\", \"Highways_FerryLink\", \"Highways_FerryNode\", \"Highways_Street\", \"Highways_ConnectingLink\", \"Highways_ConnectingNode\", \"Highways_PathLink\", \"Highways_PathNode\", \"Topography_CartographicText\", \"Topography_CartographicSymbol\", \"Topography_TopographicPoint\", \"Topography_TopographicLine\", \"Topography_TopographicArea\", \"Topography_BoundaryLine\", \"OpenUPRN_Address\", \"ITN_Roads_FerryNode\", \"ITN_Roads_RoadLink\", \"ITN_Roads_RoadNode\", \"ITN_UrbanPaths_ConnectingNode\", \"ITN_UrbanPaths_FerryNode\", \"ITN_UrbanPaths_PathLink\", \"ITN_UrbanPaths_PathNode\"]}, \"example\": \"Topography_TopographicArea\"}, \"bbox\": {\"name\": \"bbox\", \"in\": \"query\", \"required\": false, \"description\": \"A bounding box spatial filter, as a comma-separated string in the order <bottom-left y, bottom-left x, top-right y, top-right x> \\u2014 note y (northing/latitude) comes BEFORE x (easting/longitude), which is a common source of bugs. Coordinate units depend on the `srsName` in effect (metres for the default EPSG:27700; degrees for EPSG:4326). If combined with an attribute-only `filter`, this `bbox` parameter wins and the attribute filter is ignored \\u2014 see FILTERING guidance in the top-level description for how to combine both properly.\", \"schema\": {\"type\": \"string\"}, \"example\": \"115334.90,436833.50,115761.50,437643.25\"}, \"filter\": {\"name\": \"filter\", \"in\": \"query\", \"required\": false, \"description\": \"A URL-encoded OGC XML filter expression for attribute and/or spatial filtering. Attribute names used inside the filter must be valid attributes for the requested typeNames, as returned by DescribeFeatureType. See FILTERING in the top-level description for worked examples (simple attribute equality, and combined bbox+attribute using ogc:And/ogc:Within).\", \"schema\": {\"type\": \"string\"}, \"example\": \"<ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>DescriptiveGroup</ogc:PropertyName><ogc:Literal>Roadside</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter>\"}, \"count\": {\"name\": \"count\", \"in\": \"query\", \"required\": false, \"description\": \"Maximum number of features to return in a single response (WFS 2.0.0 naming; use `maxFeatures` instead for versions 1.0.0/1.1.0). Combine with `startIndex` to page through more than one page of results \\u2014 e.g. count=100 and startIndex=200 gets you the 3rd page of 100.\", \"schema\": {\"type\": \"integer\", \"default\": 100, \"minimum\": 1, \"maximum\": 100}, \"example\": 100}, \"maxFeatures\": {\"name\": \"maxFeatures\", \"in\": \"query\", \"required\": false, \"description\": \"Maximum number of features to return in a single response (WFS 1.0.0/1.1.0 naming; equivalent to `count` in WFS 2.0.0).\", \"schema\": {\"type\": \"integer\", \"default\": 100, \"minimum\": 1, \"maximum\": 100}, \"example\": 100}, \"propertyName\": {\"name\": \"propertyName\", \"in\": \"query\", \"required\": false, \"description\": \"A comma-separated list of valid feature attribute names to restrict the response to (e.g. 'ChangeDate,TOID,PhysicalLevel'), instead of returning every attribute. Useful for reducing response size when you only need a few fields. Valid names come from the DescribeFeatureType response for the relevant typeNames.\", \"schema\": {\"type\": \"string\"}, \"example\": \"TOID,DescriptiveGroup\"}, \"startIndex\": {\"name\": \"startIndex\", \"in\": \"query\", \"required\": false, \"description\": \"The zero-based index of the first result to return, for paging. See PAGING guidance in the top-level description.\", \"schema\": {\"type\": \"integer\", \"default\": 0}, \"example\": 0}, \"outputFormat\": {\"name\": \"outputFormat\", \"in\": \"query\", \"required\": false, \"description\": \"Format for the GetFeature response. Use GEOJSON for a modern GeoJSON FeatureCollection (recommended for most programmatic/LLM-driven consumption). GML32/GML3/GML2 return the older OGC Geography Markup Language XML formats, useful for legacy GIS clients.\", \"schema\": {\"type\": \"string\", \"default\": \"GML32\", \"enum\": [\"GML32\", \"GML3\", \"GML2\", \"GEOJSON\"]}, \"example\": \"GEOJSON\"}, \"resultType\": {\"name\": \"resultType\", \"in\": \"query\", \"required\": false, \"description\": \"Whether to return the actual feature results ('results', default) or just a count of how many features match ('hits', with no feature data) \\u2014 useful for cheaply checking how large a result set would be before fetching it.\", \"schema\": {\"type\": \"string\", \"default\": \"results\", \"enum\": [\"results\", \"hits\"]}, \"example\": \"results\"}, \"srsName\": {\"name\": \"srsName\", \"in\": \"query\", \"required\": false, \"description\": \"The coordinate reference system (CRS) to return geometry in, and the CRS that `bbox` coordinates are interpreted in. EPSG:27700 (default) = OSGB36 British National Grid, metres. EPSG:4326 = WGS84 latitude/longitude, degrees. EPSG:3857 = Web Mercator, metres (common for web map tiles).\", \"schema\": {\"type\": \"string\", \"default\": \"EPSG:27700\", \"enum\": [\"EPSG:27700\", \"EPSG:4326\", \"EPSG:3857\"]}, \"example\": \"EPSG:27700\"}, \"year\": {\"name\": \"year\", \"in\": \"path\", \"required\": true, \"description\": \"The calendar year of the annual Product Archive snapshot to query, e.g. '2020'. Returns the last full data release published within that year, not necessarily 1 January of that year. See per-feature-type 'Date Available From' guidance in the top-level description for the earliest year each product supports.\", \"schema\": {\"type\": \"string\"}, \"example\": \"2020\"}}, \"schemas\": {\"Coordinate\": {\"type\": \"object\", \"description\": \"A single X/Y coordinate pair (units and axis order depend on the srsName in effect for the request).\", \"properties\": {\"x\": {\"type\": \"number\", \"format\": \"double\", \"description\": \"Easting (EPSG:27700) or longitude (EPSG:4326) or Web Mercator X (EPSG:3857), depending on srsName.\"}, \"y\": {\"type\": \"number\", \"format\": \"double\", \"description\": \"Northing (EPSG:27700) or latitude (EPSG:4326) or Web Mercator Y (EPSG:3857), depending on srsName.\"}}}, \"Geometry\": {\"type\": \"object\", \"description\": \"GeoJSON-style geometry for a feature. The `type` will be one of the standard GeoJSON geometry types (Point, LineString, Polygon, MultiPolygon etc.) depending on the feature type requested (point/line/area typeNames respectively).\", \"properties\": {\"type\": {\"type\": \"string\", \"description\": \"GeoJSON geometry type, e.g. 'Point', 'LineString', 'Polygon'.\"}, \"coordinates\": {\"type\": \"array\", \"items\": {\"$ref\": \"#/components/schemas/Coordinate\"}, \"description\": \"Coordinates for the geometry. Structure nests further for LineString/Polygon than for a single Point \\u2014 treat this as indicative; consult the raw GeoJSON for exact nesting.\"}}}, \"Feature\": {\"type\": \"object\", \"description\": \"A single feature returned by GetFeature: its geometry plus its attribute values.\", \"properties\": {\"type\": {\"type\": \"string\", \"description\": \"Always 'Feature' in GeoJSON output.\", \"example\": \"Feature\"}, \"geometry\": {\"$ref\": \"#/components/schemas/Geometry\"}, \"properties\": {\"type\": \"object\", \"description\": \"The feature's attribute values, e.g. TOID, DescriptiveGroup, ChangeDate \\u2014 exact attribute set depends on which typeNames was requested and which attributes were populated for this particular feature (unpopulated attributes are simply omitted; see EMPTY VALUES in the top-level description).\", \"additionalProperties\": {\"type\": \"object\"}}}}, \"FeatureCollection\": {\"type\": \"object\", \"description\": \"The GetFeature response body when outputFormat=GEOJSON: a GeoJSON FeatureCollection containing the matched features (up to `count`/`maxFeatures` of them). When outputFormat is GML32/GML3/GML2 instead, the equivalent information is returned as GML/XML rather than this JSON structure.\", \"properties\": {\"type\": {\"type\": \"string\", \"example\": \"FeatureCollection\"}, \"features\": {\"type\": \"array\", \"items\": {\"$ref\": \"#/components/schemas/Feature\"}}}}}, \"responses\": {\"BadRequest\": {\"description\": \"400 Bad Request. E.g. an invalid/unsupported combination of request+service+version, an unrecognised typeNames value, a malformed filter or bbox, or count/maxFeatures outside 1-100.\", \"content\": {\"application/xml\": {\"example\": \"<ows:ExceptionReport>...</ows:ExceptionReport>\"}}}, \"Unauthorized\": {\"description\": \"401 Unauthorized. The 'key' query parameter was missing or invalid. Common cause: the API key's OS Data Hub project doesn't have OS Features API added to it \\u2014 a key only works for APIs explicitly attached to its project.\", \"content\": {\"application/xml\": {\"example\": \"<ows:ExceptionReport>...</ows:ExceptionReport>\"}}}, \"Forbidden\": {\"description\": \"403 Forbidden. The API key is valid but its plan/project doesn't have sufficient rights for the requested product (e.g. a Premium feature type not included in your plan).\", \"content\": {\"application/xml\": {\"example\": \"<ows:ExceptionReport>...</ows:ExceptionReport>\"}}}, \"NotFound\": {\"description\": \"404 Not Found. No resource matches the request (e.g. an invalid path such as an unsupported /wfs/archive/{year}).\", \"content\": {\"application/xml\": {\"example\": \"<ows:ExceptionReport>...</ows:ExceptionReport>\"}}}, \"MethodNotAllowed\": {\"description\": \"405 Method Not Allowed. An unsupported HTTP method was used, e.g. POST/PUT/DELETE. This API is GET-only.\", \"content\": {\"application/xml\": {\"example\": \"<ows:ExceptionReport>...</ows:ExceptionReport>\"}}}, \"TooManyRequests\": {\"description\": \"429 Too Many Requests. Rate limit exceeded for your API key/plan; back off and retry after a delay.\", \"content\": {\"application/xml\": {\"example\": \"<ows:ExceptionReport>...</ows:ExceptionReport>\"}}}, \"InternalServerError\": {\"description\": \"500 Internal Server Error. Generic unexpected server-side error; retry later or contact OS support if persistent.\", \"content\": {\"application/xml\": {\"example\": \"<ows:ExceptionReport>...</ows:ExceptionReport>\"}}}, \"ServiceUnavailable\": {\"description\": \"503 Service Unavailable. Temporary outage due to overloading or planned maintenance.\", \"content\": {\"application/xml\": {\"example\": \"<ows:ExceptionReport>...</ows:ExceptionReport>\"}}}}}, \"paths\": {\"/wfs\": {\"get\": {\"operationId\": \"GetFeature\", \"tags\": [\"GetCapabilities\", \"DescribeFeatureType\", \"GetFeature\"], \"summary\": \"Single WFS endpoint: GetCapabilities / DescribeFeatureType / GetFeature, selected via the `request` parameter\", \"description\": \"This one endpoint serves all three WFS operations depending on the `request` query parameter's value. See the top-level API description for the full workflow and worked examples of each mode.\\n\\nMODE 1 \\u2014 request=GetCapabilities: only `service` and `version` matter (plus `key`); returns an XML capabilities document. Example: GET /wfs?service=WFS&version=2.0.0&request=GetCapabilities&key=YOUR_API_KEY\\n\\nMODE 2 \\u2014 request=DescribeFeatureType: additionally requires `typeNames`; returns an XSD schema describing that feature type's attributes (types, nullability). Example: GET /wfs?service=WFS&version=2.0.0&request=DescribeFeatureType&typeNames=OpenUPRN_Address&key=YOUR_API_KEY -> tells you OpenUPRN_Address has attributes like UPRN, XCoordinate, YCoordinate, Latitude, Longitude.\\n\\nMODE 3 \\u2014 request=GetFeature: additionally supports `bbox`, `filter`, `count`/`maxFeatures`, `propertyName`, `startIndex`, `outputFormat`, `resultType`, `srsName`; returns actual feature data (GeoJSON if outputFormat=GEOJSON). Example: GET /wfs?service=WFS&version=2.0.0&request=GetFeature&typeNames=Topography_TopographicArea&outputFormat=GEOJSON&count=10&key=YOUR_API_KEY\", \"parameters\": [{\"$ref\": \"#/components/parameters/request\"}, {\"$ref\": \"#/components/parameters/service\"}, {\"$ref\": \"#/components/parameters/version\"}, {\"$ref\": \"#/components/parameters/typeNamesLive\"}, {\"$ref\": \"#/components/parameters/bbox\"}, {\"$ref\": \"#/components/parameters/filter\"}, {\"$ref\": \"#/components/parameters/count\"}, {\"$ref\": \"#/components/parameters/maxFeatures\"}, {\"$ref\": \"#/components/parameters/propertyName\"}, {\"$ref\": \"#/components/parameters/startIndex\"}, {\"$ref\": \"#/components/parameters/outputFormat\"}, {\"$ref\": \"#/components/parameters/resultType\"}, {\"$ref\": \"#/components/parameters/srsName\"}], \"responses\": {\"200\": {\"description\": \"Response shape depends on `request`: an XML capabilities document for GetCapabilities, an XML/XSD schema description for DescribeFeatureType, or feature data (GeoJSON FeatureCollection when outputFormat=GEOJSON, otherwise GML/XML) for GetFeature.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/FeatureCollection\"}, \"examples\": {\"GetFeature (GEOJSON)\": {\"summary\": \"request=GetFeature&outputFormat=GEOJSON&typeNames=Topography_TopographicArea\", \"value\": {\"type\": \"FeatureCollection\", \"features\": [{\"type\": \"Feature\", \"geometry\": {\"type\": \"Polygon\", \"coordinates\": [[{\"x\": 436833.5, \"y\": 115334.9}, {\"x\": 437643.25, \"y\": 115761.5}]]}, \"properties\": {\"TOID\": \"osgb1000002153452735\", \"DescriptiveGroup\": \"Roadside\", \"ChangeDate\": \"2026-05-13\"}}]}}}}, \"application/xml\": {\"examples\": {\"GetCapabilities\": {\"summary\": \"request=GetCapabilities\", \"value\": \"<wfs:WFS_Capabilities version=\\\"2.0.0\\\">...service metadata, supported operations, output formats...</wfs:WFS_Capabilities>\"}, \"DescribeFeatureType\": {\"summary\": \"request=DescribeFeatureType&typeNames=OpenUPRN_Address\", \"value\": \"<xsd:schema targetNamespace=\\\"http://www.ordnancesurvey.co.uk/osfeatures/1.0\\\"><xsd:element name=\\\"OpenUPRN_Address\\\" type=\\\"osfeatures:OpenUPRN_AddressFeatureType\\\"/><xsd:complexType name=\\\"OpenUPRN_AddressFeatureType\\\">...UPRN (double), XCoordinate (double), YCoordinate (double), Latitude (double), Longitude (double)...</xsd:complexType></xsd:schema>\"}, \"GetFeature (GML)\": {\"summary\": \"request=GetFeature&outputFormat=GML32 (default)\", \"value\": \"<wfs:FeatureCollection>...GML-encoded features...</wfs:FeatureCollection>\"}}}}}, \"400\": {\"$ref\": \"#/components/responses/BadRequest\"}, \"401\": {\"$ref\": \"#/components/responses/Unauthorized\"}, \"403\": {\"$ref\": \"#/components/responses/Forbidden\"}, \"404\": {\"$ref\": \"#/components/responses/NotFound\"}, \"405\": {\"$ref\": \"#/components/responses/MethodNotAllowed\"}, \"429\": {\"$ref\": \"#/components/responses/TooManyRequests\"}, \"500\": {\"$ref\": \"#/components/responses/InternalServerError\"}, \"503\": {\"$ref\": \"#/components/responses/ServiceUnavailable\"}}}}, \"/wfs/archive/{year}\": {\"get\": {\"operationId\": \"GetArchiveFeature\", \"tags\": [\"GetCapabilities\", \"DescribeFeatureType\", \"Product Archive\"], \"summary\": \"Access features from a specific calendar year's annual snapshot (OS Product Archive)\", \"description\": \"Same request/service/version/GetCapabilities/DescribeFeatureType/GetFeature mechanics as GET /wfs, but scoped to a specific year's snapshot via the `year` path parameter, and with a smaller `typeNames` catalog (only products for which OS retains historical annual snapshots \\u2014 Highways, the older ITN_Roads/ITN_UrbanPaths products, OpenUPRN, and Topography). Each year returns the last full data release published within that calendar year.\\n\\nWORKED EXAMPLE\\nGET https://api.os.uk/features/v1/wfs/archive/2020?service=WFS&version=2.0.0&request=GetFeature&typeNames=Topography_TopographicArea&outputFormat=GEOJSON&count=10&key=YOUR_API_KEY\\n-> returns up to 10 topographic area features as they existed in OS's last full 2020 release, as GeoJSON.\", \"parameters\": [{\"$ref\": \"#/components/parameters/year\"}, {\"$ref\": \"#/components/parameters/request\"}, {\"$ref\": \"#/components/parameters/service\"}, {\"$ref\": \"#/components/parameters/version\"}, {\"$ref\": \"#/components/parameters/typeNamesArchive\"}, {\"$ref\": \"#/components/parameters/bbox\"}, {\"$ref\": \"#/components/parameters/filter\"}, {\"$ref\": \"#/components/parameters/count\"}, {\"$ref\": \"#/components/parameters/maxFeatures\"}, {\"$ref\": \"#/components/parameters/propertyName\"}, {\"$ref\": \"#/components/parameters/startIndex\"}, {\"$ref\": \"#/components/parameters/outputFormat\"}, {\"$ref\": \"#/components/parameters/resultType\"}, {\"$ref\": \"#/components/parameters/srsName\"}], \"responses\": {\"200\": {\"description\": \"Response shape depends on `request`, exactly as for GET /wfs \\u2014 feature data (GeoJSON or GML) for GetFeature, XML metadata/schema documents for GetCapabilities/DescribeFeatureType, scoped to the requested year's snapshot.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/FeatureCollection\"}, \"example\": {\"type\": \"FeatureCollection\", \"features\": [{\"type\": \"Feature\", \"geometry\": {\"type\": \"Polygon\", \"coordinates\": [[{\"x\": 436833.5, \"y\": 115334.9}]]}, \"properties\": {\"TOID\": \"osgb1000002153452735\", \"DescriptiveGroup\": \"Roadside\"}}]}}, \"application/xml\": {\"example\": \"<wfs:FeatureCollection>...GML-encoded features from the requested year's snapshot...</wfs:FeatureCollection>\"}}}, \"400\": {\"$ref\": \"#/components/responses/BadRequest\"}, \"401\": {\"$ref\": \"#/components/responses/Unauthorized\"}, \"403\": {\"$ref\": \"#/components/responses/Forbidden\"}, \"404\": {\"$ref\": \"#/components/responses/NotFound\"}, \"405\": {\"$ref\": \"#/components/responses/MethodNotAllowed\"}, \"429\": {\"$ref\": \"#/components/responses/TooManyRequests\"}, \"500\": {\"$ref\": \"#/components/responses/InternalServerError\"}, \"503\": {\"$ref\": \"#/components/responses/ServiceUnavailable\"}}}}}}",
        "auth": {
          "type": "apikey",
          "api_key_header": "key",
          "api_key_value": ""
        }
      },
      {
        "id": "32f5e218-32f5-4218-9e21-32f6325112ebc8",
        "title": "OS Maps API",
        "base_url": "https://api.os.uk/maps/raster/v1",
        "spec_json": "{\"openapi\": \"3.0.1\", \"info\": {\"title\": \"OS Maps API\", \"version\": \"v1.0\", \"description\": \"OS Maps API serves PRE-RENDERED raster basemap tiles (PNG) of Great Britain \\u2014 a fixed-look image, not restylable, not queryable feature-by-feature. Use when the user wants a ready-made background map image/tile behind their own data (web map, GIS), and doesn't need to customise styling or click individual features (for that, use OS Vector Tile API instead).\\n\\nStyles: Road, Outdoor, Light, Leisure (Leisure is EPSG:27700 only). Layer = style_projection, e.g. Outdoor_3857, Road_27700 (no Leisure_3857). Two access methods, same layer names: `/wmts` (OGC WMTS \\u2014 GIS software: GetCapabilities/GetTile) and `/zxy/{layer}/{z}/{x}/{y}.png` (slippy-map scheme \\u2014 web mapping libraries). Zoom ranges differ by projection/style and gate Premium vs OpenData tiers \\u2014 see per-parameter docs.\\n\\nIMPORTANT FOR AN LLM: the response is a binary PNG image you cannot read or describe from its bytes \\u2014 call this only to construct a tile URL to hand to the user or another app, not to 'look at' the map yourself. GB only. Auth: `key` query parameter.\", \"contact\": {\"name\": \"Ordnance Survey (OS) - OS Data Hub\", \"url\": \"https://osdatahub.os.uk/\"}, \"termsOfService\": \"https://docs.os.uk/os-apis/core-concepts/terms-and-conditions\", \"license\": {\"name\": \"OS Data Hub Premium / OpenData Terms\", \"url\": \"https://docs.os.uk/os-apis/core-concepts/terms-and-conditions\"}}, \"externalDocs\": {\"description\": \"Full OS Maps API documentation, including layers/styles reference and getting started guide\", \"url\": \"https://docs.os.uk/os-apis/accessing-os-apis/os-maps-api\"}, \"tags\": [{\"name\": \"Tile Request\", \"description\": \"Access and download raster map tiles, either via the OGC WMTS standard or the RESTful ZXY scheme.\"}], \"servers\": [{\"url\": \"https://api.os.uk/maps/raster/v1\", \"description\": \"Production OS Maps API (raster tiles), version 1\"}], \"security\": [{\"api-key\": []}], \"paths\": {\"/wmts\": {\"get\": {\"tags\": [\"Tile Request\"], \"operationId\": \"getWMTSTileData\", \"summary\": \"Get a map tile or service metadata via WMTS\", \"description\": \"OGC Web Map Tile Service (WMTS) endpoint. This single endpoint handles two distinct operations, selected via the `request` parameter:\\n\\n1. `request=GetTile` \\u2014 returns a single pre-rendered PNG raster tile for the given layer, tile matrix set, zoom level (tileMatrix), row and column.\\n2. `request=GetCapabilities` \\u2014 returns an XML/service-metadata document describing the available layers, styles, tile matrix sets and supported operations. When making a GetCapabilities request, only the authentication and `service`/`request` parameters are required; tile-specific parameters (layer, tileMatrixSet, tileMatrix, tileRow, tileCol, style) can be omitted.\\n\\nWMTS is the standard supported by most desktop GIS software (QGIS, ArcGIS Pro/Online, ArcMap, MapInfo Pro, Cadcorp SIS). If you are building a web map with a JS library instead, the /zxy endpoint is usually simpler.\", \"parameters\": [{\"name\": \"key\", \"in\": \"query\", \"description\": \"Your OS Data Hub project API key. Required on every request in addition to (or instead of) the `security` scheme, since some tooling does not automatically apply globally-defined security schemes to generated examples.\", \"required\": true, \"schema\": {\"type\": \"string\"}, \"example\": \"INSERT_API_KEY\"}, {\"name\": \"service\", \"in\": \"query\", \"description\": \"The OGC service being accessed. Always `wmts` for this API.\", \"required\": true, \"schema\": {\"type\": \"string\", \"enum\": [\"wmts\", \"WMTS\"]}, \"example\": \"WMTS\"}, {\"name\": \"request\", \"in\": \"query\", \"description\": \"The WMTS operation to perform. Use `GetTile` to fetch a single PNG map tile, or `GetCapabilities` to fetch the service's capabilities/metadata document. When `GetCapabilities` is used, only authentication (`key`) and `service`/`request` are required \\u2014 the tile-specific parameters below can be omitted.\", \"required\": true, \"schema\": {\"type\": \"string\", \"enum\": [\"GetCapabilities\", \"GetTile\"]}, \"example\": \"GetTile\"}, {\"name\": \"version\", \"in\": \"query\", \"description\": \"The WMTS protocol version to use.\", \"required\": false, \"schema\": {\"type\": \"string\", \"enum\": [\"1.0.0\", \"2.0.0\"], \"default\": \"2.0.0\"}, \"example\": \"2.0.0\"}, {\"name\": \"layer\", \"in\": \"query\", \"description\": \"The map style + projection combination to request, required for GetTile requests. Combines one of the four map styles (Road, Outdoor, Light, Leisure) with a projection suffix (27700 = British National Grid, 3857 = Web Mercator). Note `Leisure_3857` does not exist \\u2014 Leisure is only available in EPSG:27700.\", \"required\": true, \"schema\": {\"type\": \"string\", \"enum\": [\"Road_27700\", \"Road_3857\", \"Outdoor_27700\", \"Outdoor_3857\", \"Light_27700\", \"Light_3857\", \"Leisure_27700\"]}, \"example\": \"Outdoor_27700\"}, {\"name\": \"tileMatrixSet\", \"in\": \"query\", \"description\": \"The projection/tile matrix set to request tiles in. Must match the projection suffix of the `layer` parameter (e.g. layer `Outdoor_27700` requires `tileMatrixSet=EPSG:27700`). `EPSG:27700` is British National Grid (Great Britain only); `EPSG:3857` is Web Mercator (global coordinate system, most compatible with common web map libraries).\", \"required\": true, \"schema\": {\"type\": \"string\", \"enum\": [\"EPSG:27700\", \"EPSG:3857\"]}, \"example\": \"EPSG:27700\"}, {\"name\": \"tileMatrix\", \"in\": \"query\", \"description\": \"The zoom level within the chosen tileMatrixSet, passed as a string of the integer zoom level. Valid ranges depend on the tileMatrixSet and style: for EPSG:3857, valid values are 7-20 (7-16 OpenData, 17-20 Premium data, all styles except Leisure which is unavailable in this projection). For EPSG:27700, valid values are 0-13 for Road/Outdoor/Light (0-5 OpenData, 6-13 Premium data) but only 0-9 for Leisure (0-9 OpenData/Premium mixed; Leisure has no levels above 9). Requesting an out-of-range zoom, or a Premium-tier zoom without a Premium plan, will error.\", \"required\": true, \"schema\": {\"type\": \"string\"}, \"example\": \"7\"}, {\"name\": \"tileRow\", \"in\": \"query\", \"description\": \"The row index of the requested tile within the tile matrix (analogous to the 'y' coordinate in ZXY/XYZ tile schemes).\", \"required\": true, \"schema\": {\"type\": \"integer\"}, \"example\": 489}, {\"name\": \"tileCol\", \"in\": \"query\", \"description\": \"The column index of the requested tile within the tile matrix (analogous to the 'x' coordinate in ZXY/XYZ tile schemes).\", \"required\": true, \"schema\": {\"type\": \"integer\"}, \"example\": 323}, {\"name\": \"style\", \"in\": \"query\", \"description\": \"The style identifier for the chosen layer. Currently there is only one style identifier value, `default`, regardless of which map style (Road/Outdoor/Light/Leisure) is chosen via the `layer` parameter \\u2014 the visual style is determined by `layer`, not by this field.\", \"required\": true, \"schema\": {\"type\": \"string\", \"enum\": [\"default\"]}, \"example\": \"default\"}, {\"name\": \"height\", \"in\": \"query\", \"description\": \"Requested tile height in pixels. Optional; omit to use the default tile size (256px).\", \"required\": false, \"schema\": {\"type\": \"integer\"}}, {\"name\": \"width\", \"in\": \"query\", \"description\": \"Requested tile width in pixels. Optional; omit to use the default tile size (256px).\", \"required\": false, \"schema\": {\"type\": \"integer\"}}, {\"name\": \"outputformat\", \"in\": \"query\", \"description\": \"The image format of the returned tile. Currently only PNG is supported.\", \"required\": false, \"schema\": {\"type\": \"string\", \"enum\": [\"image/png\"]}, \"example\": \"image/png\"}], \"responses\": {\"200\": {\"description\": \"Successful response. If `request=GetTile`, the body is a single PNG raster tile image. If `request=GetCapabilities`, the body is an XML service metadata document describing available layers, styles and tile matrix sets.\", \"content\": {\"image/png\": {\"schema\": {\"type\": \"string\", \"format\": \"binary\"}}, \"application/xml\": {\"schema\": {\"type\": \"string\", \"description\": \"WMTS Capabilities XML document, returned only for GetCapabilities requests.\"}}, \"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ServiceMetadata\"}}}}, \"400\": {\"description\": \"Bad request \\u2014 e.g. an invalid combination of layer/tileMatrixSet, an out-of-range tileMatrix (zoom level), or a missing required parameter.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}}}}, \"401\": {\"description\": \"Unauthorized \\u2014 missing, invalid, or expired API key/OAuth2 token.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}}}}, \"403\": {\"description\": \"Forbidden \\u2014 the API key/project does not have access to the requested layer or zoom level (e.g. requesting Premium-tier data on an OpenData-only plan).\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}}}}, \"404\": {\"description\": \"Not found \\u2014 the requested tile (row/column) does not exist for the given layer and zoom level, e.g. it falls outside the coverage of Great Britain.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}}}}, \"429\": {\"description\": \"Too many requests \\u2014 the API's rate limit has been exceeded.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}}}}}, \"x-code-samples\": [{\"lang\": \"URL\", \"label\": \"GetTile example (from OS documentation)\", \"source\": \"https://api.os.uk/maps/raster/v1/wmts?service=WMTS&request=GetTile&version=2.0.0&style=default&layer=Outdoor_27700&tileMatrixSet=EPSG:27700&tileMatrix=7&tileRow=489&tileCol=323&key=INSERT_API_KEY\"}, {\"lang\": \"URL\", \"label\": \"GetCapabilities example\", \"source\": \"https://api.os.uk/maps/raster/v1/wmts?service=WMTS&request=GetCapabilities&key=INSERT_API_KEY\"}]}}, \"/zxy/{layer}/{z}/{x}/{y}.png\": {\"get\": {\"tags\": [\"Tile Request\"], \"operationId\": \"getZXYTileData\", \"summary\": \"Get a single raster map tile via the ZXY (slippy map) scheme\", \"description\": \"Access and download a single pre-rendered PNG raster tile using the simple RESTful ZXY ('slippy map'/XYZ) tile scheme. This is the most common access pattern for web mapping libraries such as Leaflet, MapLibre GL JS and OpenLayers \\u2014 you typically configure the library's raster tile source with a URL template such as `https://api.os.uk/maps/raster/v1/zxy/Outdoor_3857/{z}/{x}/{y}.png?key=YOUR_API_KEY` and the library substitutes {z}/{x}/{y} automatically as the user pans/zooms.\\n\\nUnlike the /wmts endpoint, there is no separate metadata/capabilities operation here \\u2014 this endpoint only ever returns a tile image for the exact z/x/y requested.\", \"parameters\": [{\"name\": \"layer\", \"in\": \"path\", \"description\": \"The map style + projection combination to request. Combines one of the four map styles (Road, Outdoor, Light, Leisure) with a projection suffix (27700 = British National Grid, 3857 = Web Mercator). Note `Leisure_3857` does not exist \\u2014 Leisure is only available in EPSG:27700.\", \"required\": true, \"schema\": {\"type\": \"string\", \"enum\": [\"Road_27700\", \"Road_3857\", \"Outdoor_27700\", \"Outdoor_3857\", \"Light_27700\", \"Light_3857\", \"Leisure_27700\"]}, \"example\": \"Outdoor_27700\"}, {\"name\": \"z\", \"in\": \"path\", \"description\": \"Zoom level. Valid ranges depend on the projection embedded in `layer`: for `_3857` layers, 7-20 (7-16 OpenData, 17-20 Premium data). For `_27700` layers, 0-13 for Road/Outdoor/Light (0-5 OpenData, 6-13 Premium data) but only 0-9 for Leisure_27700 (Leisure has no levels above 9). Requesting an out-of-range zoom, or a Premium-tier zoom without a Premium plan, will error.\", \"required\": true, \"schema\": {\"type\": \"integer\", \"format\": \"int32\"}, \"example\": 7}, {\"name\": \"x\", \"in\": \"path\", \"description\": \"X (column) coordinate of the tile within the given zoom level, following the standard XYZ/slippy-map tiling scheme for the chosen tileMatrixSet/projection.\", \"required\": true, \"schema\": {\"type\": \"integer\", \"format\": \"int32\"}, \"example\": 323}, {\"name\": \"y\", \"in\": \"path\", \"description\": \"Y (row) coordinate of the tile within the given zoom level, following the standard XYZ/slippy-map tiling scheme for the chosen tileMatrixSet/projection.\", \"required\": true, \"schema\": {\"type\": \"integer\", \"format\": \"int32\"}, \"example\": 489}, {\"name\": \"key\", \"in\": \"query\", \"description\": \"Your OS Data Hub project API key. Required on every request.\", \"required\": true, \"schema\": {\"type\": \"string\"}, \"example\": \"INSERT_API_KEY\"}], \"responses\": {\"200\": {\"description\": \"Tile image retrieved successfully.\", \"content\": {\"image/png\": {\"schema\": {\"type\": \"string\", \"format\": \"binary\"}}}}, \"400\": {\"description\": \"Bad request \\u2014 e.g. an invalid layer name or an out-of-range zoom level.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}}}}, \"401\": {\"description\": \"Unauthorized \\u2014 missing, invalid, or expired API key/OAuth2 token.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}}}}, \"403\": {\"description\": \"Forbidden \\u2014 the API key/project does not have access to the requested layer or zoom level (e.g. requesting Premium-tier data on an OpenData-only plan).\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}}}}, \"404\": {\"description\": \"Not found \\u2014 the requested tile (x/y) does not exist at the given zoom level, e.g. it falls outside the coverage of Great Britain.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}}}}, \"429\": {\"description\": \"Too many requests \\u2014 the API's rate limit has been exceeded.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}}}}}, \"x-code-samples\": [{\"lang\": \"URL\", \"label\": \"Example request (from OS documentation)\", \"source\": \"https://api.os.uk/maps/raster/v1/zxy/Outdoor_27700/7/323/489.png?key=INSERT_API_KEY\"}, {\"lang\": \"URL\", \"label\": \"Example request in Web Mercator projection, for use in Leaflet/MapLibre\", \"source\": \"https://api.os.uk/maps/raster/v1/zxy/Outdoor_3857/7/62/40.png?key=INSERT_API_KEY\"}]}}}, \"components\": {\"securitySchemes\": {\"api-key\": {\"type\": \"apiKey\", \"in\": \"query\", \"name\": \"key\", \"description\": \"OS Data Hub project API key, passed as the `key` query string parameter on every request (e.g. `?key=YOUR_API_KEY`). Generate a key by creating a project on the OS Data Hub (https://osdatahub.os.uk/) and adding the OS Maps API to it. This is the simplest authentication method for this API; an OAuth2 bearer token can be used as an alternative but is not modelled in this spec.\"}}, \"schemas\": {\"ServiceMetadata\": {\"type\": \"object\", \"description\": \"Service metadata describing the capabilities of the OS Maps API, returned (as JSON or XML depending on negotiation) for a WMTS GetCapabilities request.\", \"properties\": {\"service\": {\"type\": \"object\", \"properties\": {\"title\": {\"type\": \"string\", \"example\": \"OS Maps API\"}, \"description\": {\"type\": \"string\"}, \"version\": {\"type\": \"string\", \"example\": \"2.0.0\"}}, \"required\": [\"title\", \"description\", \"version\"]}, \"operations\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}, \"example\": [\"GetCapabilities\", \"GetTile\"]}, \"tileMatrixSets\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}, \"example\": [\"EPSG:27700\", \"EPSG:3857\"]}, \"layers\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}, \"example\": [\"Road_27700\", \"Road_3857\", \"Outdoor_27700\", \"Outdoor_3857\", \"Light_27700\", \"Light_3857\", \"Leisure_27700\"]}}, \"required\": [\"service\", \"operations\", \"tileMatrixSets\", \"layers\"]}, \"ErrorResponse\": {\"type\": \"object\", \"description\": \"Standard OS API error response body.\", \"properties\": {\"error\": {\"type\": \"object\", \"properties\": {\"statusCode\": {\"type\": \"integer\", \"example\": 400}, \"message\": {\"type\": \"string\", \"example\": \"Invalid tileMatrix for the requested layer and tileMatrixSet.\"}}}}}}}, \"x-notes\": {\"styles\": [\"Road\", \"Outdoor\", \"Light\", \"Leisure\"], \"projections\": {\"EPSG:27700\": \"British National Grid \\u2014 Great Britain only. All 4 styles available (Leisure only here).\", \"EPSG:3857\": \"Web Mercator \\u2014 global coordinate system. Road, Outdoor and Light available; Leisure NOT available.\"}, \"zoomLevels\": {\"EPSG:3857\": {\"min\": 7, \"max\": 20, \"openDataRange\": \"7-16\", \"premiumRange\": \"17-20\"}, \"EPSG:27700_RoadOutdoorLight\": {\"min\": 0, \"max\": 13, \"openDataRange\": \"0-5\", \"premiumRange\": \"6-13\"}, \"EPSG:27700_Leisure\": {\"min\": 0, \"max\": 9, \"openDataRange\": \"0-9 (mixed open/premium, see docs)\", \"premiumRange\": \"N/A above 9\"}}, \"dataSources\": [\"OS Open Zoomstack\", \"OS MasterMap Topography Layer\", \"1:25 000 Scale Colour Raster\"], \"updateFrequency\": \"15 working days from each product refresh date\", \"coverage\": \"Great Britain\", \"sourceDocumentation\": \"https://docs.os.uk/os-apis/accessing-os-apis/os-maps-api\"}}",
        "auth": {
          "type": "apikey",
          "api_key_header": "key",
          "api_key_value": ""
        }
      },
      {
        "id": "2d4bee98-2d4b-4e98-bee9-2d4c35e6889948",
        "title": "OS Vector Tile API",
        "base_url": "https://api.os.uk/maps/vector/v1",
        "spec_json": "{\"openapi\": \"3.0.1\", \"info\": {\"title\": \"OS Vector Tile API\", \"version\": \"v1.0\", \"description\": \"OS Vector Tile API serves the base map as VECTOR data (.pbf/Mapbox Vector Tile), for clients that render, restyle, tilt and make features clickable themselves (MapLibre GL JS, Mapbox GL JS, OpenLayers). Use when the user wants a customisable/interactive basemap for a web or GIS app \\u2014 not when they just want a ready-made image (use OS Maps API) or feature geometry for analysis (use OS Features API).\\n\\nTypical call order: `GET /vts` (service metadata, optional) -> `GET /vts/resources/styles` (Mapbox-style JSON: sprite/glyph/source refs + layers) -> `GET /vts/tile/{z}/{y}/{x}.pbf` (individual tiles; a map library fetches these automatically as the user pans/zooms \\u2014 rarely call directly). Overlay variants exist as `/vts/{layer-name}/...` for boundaries|greenspace|sites|highways|paths.\\n\\nIMPORTANT FOR AN LLM: tile/font responses are binary and unreadable to you \\u2014 only call the tile/font endpoints to build a URL for the user or another app, never to inspect the map yourself. GB only; srs=27700 (default) or 3857. Scheduled End of Life Autumn 2028 (successor: OS NGD API - Tiles). Auth: `key` query parameter.\", \"contact\": {\"name\": \"OS Data Hub / OS APIs documentation\", \"url\": \"https://docs.os.uk/os-apis/accessing-os-apis/os-vector-tile-api\"}, \"termsOfService\": \"https://docs.os.uk/more-than-maps/legal/terms-and-conditions\"}, \"externalDocs\": {\"description\": \"Full OS Vector Tile API documentation, including getting-started guides for specific GIS/web-mapping tools, cartographic stylesheets, and code examples.\", \"url\": \"https://docs.os.uk/os-apis/accessing-os-apis/os-vector-tile-api\"}, \"servers\": [{\"url\": \"https://api.os.uk/maps/vector/v1\", \"description\": \"Production OS Vector Tile API (OS Data Hub).\"}], \"security\": [{\"apiKeyQuery\": []}], \"tags\": [{\"name\": \"Service Metadata\", \"description\": \"Discover the capabilities, extents, projection and tiling scheme of the OS Vector Tiles service.\"}, {\"name\": \"Stylesheet\", \"description\": \"Retrieve Mapbox/MapLibre-style-spec JSON documents describing how to render the base map or a data overlay.\"}, {\"name\": \"Tile Request\", \"description\": \"Download the individual vector tiles (.pbf) that make up the map, for the base map or for a named data overlay.\"}], \"paths\": {\"/vts\": {\"get\": {\"tags\": [\"Service Metadata\"], \"summary\": \"Get service metadata for the OS Vector Tiles service\", \"description\": \"Returns an ArcGIS-style service metadata document describing the OS Vector Tile service: the current API/tile version, the full and initial map extents, the min/max zoom levels and scales, and the tiling scheme (rows, columns, DPI, tile format and levels of detail). Call this first if you need to programmatically discover the coordinate bounds, zoom range, or tile grid origin for a given spatial reference system (`srs`), rather than hard-coding them. Most simple mapping integrations can skip this call and go straight to the stylesheet/tile endpoints using known defaults.\", \"operationId\": \"getServiceMetadata\", \"parameters\": [{\"name\": \"srs\", \"in\": \"query\", \"description\": \"The spatial reference system (projection) to return metadata for. `27700` = British National Grid (Great Britain only). `3857` = Web Mercator (global, the projection expected by most web map libraries such as MapLibre GL JS).\", \"required\": false, \"schema\": {\"type\": \"string\", \"enum\": [\"27700\", \"3857\"], \"default\": \"27700\"}, \"example\": \"3857\"}, {\"name\": \"key\", \"in\": \"query\", \"description\": \"Your OS Data Hub project API key. Required on every request. Get one from the OS Data Hub (https://osdatahub.os.uk) by creating a project and adding the OS Vector Tile API.\", \"required\": true, \"schema\": {\"type\": \"string\"}, \"example\": \"AbCdEfGhIjKlMnOpQrStUvWxYz123456\"}], \"responses\": {\"200\": {\"description\": \"Service metadata retrieved successfully.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ServiceMetadata\"}, \"example\": {\"currentVersion\": 1, \"name\": \"OS Vector Tiles API\", \"capabilities\": \"TilesOnly\", \"type\": \"indexedVector\", \"defaultStyles\": \"resources/styles\", \"tiles\": [\"tile/{z}/{y}/{x}.pbf?srs=3857\"], \"exportTilesAllowed\": false, \"initialExtent\": {\"xmin\": -1170000, \"ymin\": 6500000, \"xmax\": 850000, \"ymax\": 8700000, \"spatialReference\": {\"wkid\": 3857, \"latestWkid\": 3857}}, \"fullExtent\": {\"xmin\": -1170000, \"ymin\": 6500000, \"xmax\": 850000, \"ymax\": 8700000, \"spatialReference\": {\"wkid\": 3857, \"latestWkid\": 3857}}, \"minScale\": 100000000, \"maxScale\": 1000, \"tileInfo\": {\"rows\": 256, \"cols\": 256, \"dpi\": 96, \"format\": \"pbf\", \"origin\": {\"x\": -20037508.342787, \"y\": 20037508.342787}, \"spatialReference\": {\"xmin\": -20037508.342787, \"ymin\": -20037508.342787, \"xmax\": 20037508.342787, \"ymax\": 20037508.342787, \"spatialReference\": {\"wkid\": 3857, \"latestWkid\": 3857}}, \"lods\": [{\"level\": 0, \"resolution\": 156543.033928, \"scale\": 591657527.591555}, {\"level\": 7, \"resolution\": 1222.99245256, \"scale\": 4626542.2540226}]}, \"maxzoom\": 20, \"minLOD\": 0, \"maxLOD\": 20, \"resourceInfo\": {\"styleVersion\": 8, \"tileCompression\": \"gzip\", \"cacheInfo\": {\"storageInfo\": {\"packetSize\": 256, \"storageFormat\": \"compactV2\"}}}, \"serviceItemId\": \"os-vector-tile-api\", \"maxExportTilesCount\": 0}}}}, \"401\": {\"$ref\": \"#/components/responses/Unauthorized\"}, \"403\": {\"$ref\": \"#/components/responses/Forbidden\"}, \"429\": {\"$ref\": \"#/components/responses/TooManyRequests\"}}}}, \"/vts/resources/styles\": {\"get\": {\"tags\": [\"Stylesheet\"], \"summary\": \"Get the default stylesheet for the base map\", \"description\": \"Returns a Mapbox/MapLibre Style Specification JSON document for the base OS Vector Tile map: the sprite and glyph (font) resource URLs, the vector tile source(s), and the full list of style layers (with their source-layer, filters, zoom range, layout and paint properties). Pass this document's URL (with your `srs` and `key` query parameters appended) directly to a MapLibre GL JS / Mapbox GL JS `map.setStyle(...)` call, or use it as the `styleUrl` for libraries like OpenLayers' MapboxVectorLayer, to render a fully-styled OS basemap without hand-building layer styling yourself. In practice most integrations instead load one of the ready-made cartographic stylesheets from the OS-Vector-Tile-API-Stylesheets GitHub repo (which offer more design choices, e.g. Light, Outdoor, Greyscale, Night, or 3D-extrusion styles) and only use this endpoint indirectly as the `sources` reference inside those files.\", \"operationId\": \"getBaseStyles\", \"parameters\": [{\"$ref\": \"#/components/parameters/SrsQuery\"}, {\"$ref\": \"#/components/parameters/ApiKeyQuery\"}], \"responses\": {\"200\": {\"description\": \"Stylesheet retrieved successfully.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/Stylesheet\"}, \"example\": {\"version\": 8, \"sprite\": \"https://api.os.uk/maps/vector/v1/vts/resources/sprites/sprite\", \"glyphs\": \"https://api.os.uk/maps/vector/v1/vts/resources/fonts/{fontstack}/{range}.pbf\", \"sources\": {\"esri\": {\"type\": \"vector\", \"url\": \"https://api.os.uk/maps/vector/v1/vts?srs=3857\"}}, \"layers\": [{\"id\": \"background\", \"type\": \"background\", \"paint\": {\"background-color\": \"#f4f4f2\"}}, {\"id\": \"building\", \"type\": \"fill\", \"source\": \"esri\", \"source-layer\": \"TopographicArea_1\", \"filter\": [\"==\", \"featureCode\", 10021], \"minzoom\": 14, \"maxzoom\": 20, \"paint\": {\"fill-color\": \"#d9d0c9\"}}]}}}}, \"401\": {\"$ref\": \"#/components/responses/Unauthorized\"}, \"403\": {\"$ref\": \"#/components/responses/Forbidden\"}, \"429\": {\"$ref\": \"#/components/responses/TooManyRequests\"}}}}, \"/vts/{layer-name}/resources/styles\": {\"get\": {\"tags\": [\"Stylesheet\"], \"summary\": \"Get the default stylesheet for a data overlay\", \"description\": \"Returns the Mapbox/MapLibre Style Specification JSON document for a single named data overlay layer (rather than the full base map), so it can be added as an extra styled layer on top of an existing basemap \\u2014 for example drawing administrative boundaries or highways on top of a plain topography basemap.\", \"operationId\": \"getOverlayStyles\", \"parameters\": [{\"$ref\": \"#/components/parameters/LayerNamePath\"}, {\"$ref\": \"#/components/parameters/SrsQuery\"}, {\"$ref\": \"#/components/parameters/ApiKeyQuery\"}], \"responses\": {\"200\": {\"description\": \"Overlay stylesheet retrieved successfully.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/Stylesheet\"}, \"example\": {\"version\": 8, \"sprite\": \"https://api.os.uk/maps/vector/v1/vts/boundaries/resources/sprites/sprite\", \"glyphs\": \"https://api.os.uk/maps/vector/v1/vts/resources/fonts/{fontstack}/{range}.pbf\", \"sources\": {\"boundaries\": {\"type\": \"vector\", \"url\": \"https://api.os.uk/maps/vector/v1/vts/boundaries?srs=3857\"}}, \"layers\": [{\"id\": \"county-boundary\", \"type\": \"line\", \"source\": \"boundaries\", \"source-layer\": \"Boundary_1\", \"minzoom\": 6, \"maxzoom\": 20, \"paint\": {\"line-color\": \"#8a4b8a\", \"line-width\": 1.5}}]}}}}, \"401\": {\"$ref\": \"#/components/responses/Unauthorized\"}, \"403\": {\"$ref\": \"#/components/responses/Forbidden\"}, \"404\": {\"$ref\": \"#/components/responses/NotFound\"}, \"429\": {\"$ref\": \"#/components/responses/TooManyRequests\"}}}}, \"/vts/tile/{z}/{y}/{x}.pbf\": {\"get\": {\"tags\": [\"Tile Request\"], \"summary\": \"Get a single base-map vector tile\", \"description\": \"Downloads the raw, gzip-compressed Protocol Buffer (.pbf / Mapbox Vector Tile) data for one tile of the base map at the given zoom level and tile grid coordinates. Web map libraries call this endpoint automatically and repeatedly (once per visible tile) as a user pans and zooms \\u2014 you would normally only call it directly yourself to fetch/inspect/cache a specific tile rather than to render an interactive map. `z` is the zoom level; `x` and `y` are the tile's column and row within that zoom level's grid, following the standard slippy-map ZXY tiling scheme (for `srs=3857`) or the British National Grid tiling scheme (for `srs=27700`, the default). Use a tile-coordinate calculator or your map library's internal conversion (e.g. from a lon/lat and zoom) to work out `z`/`x`/`y` for a location of interest.\", \"operationId\": \"getTile\", \"parameters\": [{\"$ref\": \"#/components/parameters/ZoomPath\"}, {\"$ref\": \"#/components/parameters/YPath\"}, {\"$ref\": \"#/components/parameters/XPath\"}, {\"$ref\": \"#/components/parameters/SrsQuery\"}, {\"$ref\": \"#/components/parameters/ApiKeyQuery\"}], \"responses\": {\"200\": {\"description\": \"Tile data retrieved successfully, as a binary Mapbox Vector Tile (.pbf) payload.\", \"content\": {\"application/octet-stream\": {\"schema\": {\"type\": \"string\", \"format\": \"binary\"}}}}, \"401\": {\"$ref\": \"#/components/responses/Unauthorized\"}, \"403\": {\"$ref\": \"#/components/responses/Forbidden\"}, \"404\": {\"description\": \"No tile exists at these coordinates (e.g. out of range for the zoom level, or outside the Great Britain extent).\"}, \"429\": {\"$ref\": \"#/components/responses/TooManyRequests\"}}}}, \"/vts/{layer-name}/tile/{z}/{y}/{x}.pbf\": {\"get\": {\"tags\": [\"Tile Request\"], \"summary\": \"Get a single vector tile from a named data overlay\", \"description\": \"Downloads the raw .pbf vector tile data for one tile from a specific data overlay (rather than the base map) at the given zoom level and tile grid coordinates, so the overlay can be rendered as its own layer on top of (or instead of) the base map \\u2014 for example fetching just the administrative boundaries or highways network for a tile.\", \"operationId\": \"getOverlayTile\", \"parameters\": [{\"$ref\": \"#/components/parameters/LayerNamePath\"}, {\"$ref\": \"#/components/parameters/ZoomPath\"}, {\"$ref\": \"#/components/parameters/YPath\"}, {\"$ref\": \"#/components/parameters/XPath\"}, {\"$ref\": \"#/components/parameters/SrsQuery\"}, {\"$ref\": \"#/components/parameters/ApiKeyQuery\"}], \"responses\": {\"200\": {\"description\": \"Overlay tile data retrieved successfully, as a binary Mapbox Vector Tile (.pbf) payload.\", \"content\": {\"application/octet-stream\": {\"schema\": {\"type\": \"string\", \"format\": \"binary\"}}}}, \"401\": {\"$ref\": \"#/components/responses/Unauthorized\"}, \"403\": {\"$ref\": \"#/components/responses/Forbidden\"}, \"404\": {\"description\": \"No tile exists at these coordinates, or the named overlay does not exist / is no longer available (some overlay products such as OS Detailed Path Network and OS MasterMap Greenspace Layer are being withdrawn \\u2014 see the API's End of Life notices).\"}, \"429\": {\"$ref\": \"#/components/responses/TooManyRequests\"}}}}, \"/vts/resources/fonts/{fontstack}/{range}.pbf\": {\"get\": {\"tags\": [\"Stylesheet\"], \"summary\": \"Get a font glyph range (SDF glyphs) used by a stylesheet\", \"description\": \"Returns the signed-distance-field glyph PBF for a given font stack and Unicode code-point range, as referenced by the `glyphs` URL template inside a stylesheet document (see `GET /vts/resources/styles`). You would not normally call this endpoint directly \\u2014 your map rendering library requests these automatically to draw text labels \\u2014 but it can be useful to call directly when configuring a custom style editor (e.g. Maputnik) that needs the glyphs endpoint pointed at explicitly with your API key appended.\", \"operationId\": \"getFontGlyphs\", \"parameters\": [{\"name\": \"fontstack\", \"in\": \"path\", \"required\": true, \"description\": \"The font name(s) as referenced in the stylesheet's `glyphs` template, e.g. `Source Sans Pro Regular`.\", \"schema\": {\"type\": \"string\"}, \"example\": \"Source Sans Pro Regular\"}, {\"name\": \"range\", \"in\": \"path\", \"required\": true, \"description\": \"The Unicode code-point range for this glyph chunk, formatted as `{start}-{end}` in steps of 256 (e.g. `0-255`).\", \"schema\": {\"type\": \"string\"}, \"example\": \"0-255\"}, {\"$ref\": \"#/components/parameters/SrsQuery\"}, {\"$ref\": \"#/components/parameters/ApiKeyQuery\"}], \"responses\": {\"200\": {\"description\": \"Glyph range retrieved successfully, as a binary PBF payload.\", \"content\": {\"application/octet-stream\": {\"schema\": {\"type\": \"string\", \"format\": \"binary\"}}}}, \"401\": {\"$ref\": \"#/components/responses/Unauthorized\"}, \"403\": {\"$ref\": \"#/components/responses/Forbidden\"}, \"429\": {\"$ref\": \"#/components/responses/TooManyRequests\"}}}}}, \"components\": {\"securitySchemes\": {\"apiKeyQuery\": {\"type\": \"apiKey\", \"in\": \"query\", \"name\": \"key\", \"description\": \"OS Data Hub project API key, passed as the `key` query-string parameter on every request (e.g. `?key=YOUR_API_KEY`). Create a project and API key for free at https://osdatahub.os.uk. OS APIs also support an OAuth 2 bearer token as an alternative to the API key (see the OAuth 2 API docs), but query-string API key auth \\u2014 as modelled by this security scheme \\u2014 is the simplest option and the one used throughout this spec.\"}}, \"parameters\": {\"ApiKeyQuery\": {\"name\": \"key\", \"in\": \"query\", \"required\": true, \"description\": \"Your OS Data Hub project API key. Required on every request to the OS Vector Tile API.\", \"schema\": {\"type\": \"string\"}, \"example\": \"AbCdEfGhIjKlMnOpQrStUvWxYz123456\"}, \"SrsQuery\": {\"name\": \"srs\", \"in\": \"query\", \"required\": false, \"description\": \"The spatial reference system (projection) of the returned data. `27700` = British National Grid (Great Britain only, the default). `3857` = Web Mercator (global; required if you are overlaying this basemap with other Web-Mercator web mapping data, or using a standard slippy-map library).\", \"schema\": {\"type\": \"string\", \"enum\": [\"27700\", \"3857\"], \"default\": \"27700\"}, \"example\": \"3857\"}, \"LayerNamePath\": {\"name\": \"layer-name\", \"in\": \"path\", \"required\": true, \"description\": \"The data overlay to request, on top of the base map. `boundaries` = administrative/electoral boundaries (Boundary-Line); `greenspace` = parks and green spaces (OS MasterMap Greenspace Layer, being withdrawn 31 March 2027); `sites` = sites of interest (OS MasterMap Sites Layer); `highways` = the road network (OS MasterMap Highways Network \\u2013 Roads); `paths` = footpaths and rights of way (OS MasterMap Highways Network \\u2013 Paths / OS Detailed Path Network, being withdrawn 30 September 2026); `water` = the historic water network overlay (withdrawn 31 March 2026 \\u2014 no longer available).\", \"schema\": {\"type\": \"string\", \"enum\": [\"boundaries\", \"greenspace\", \"sites\", \"water\", \"highways\", \"paths\"]}, \"example\": \"boundaries\"}, \"ZoomPath\": {\"name\": \"z\", \"in\": \"path\", \"required\": true, \"description\": \"Zoom level of the tile, following the standard tile pyramid (0 = whole-world/whole-country overview, increasing values zoom in to street level). Valid range is service-dependent \\u2014 see `GET /vts` service metadata for the current `minLOD`/`maxLOD`.\", \"schema\": {\"type\": \"integer\", \"format\": \"int32\", \"minimum\": 0}, \"example\": 12}, \"YPath\": {\"name\": \"y\", \"in\": \"path\", \"required\": true, \"description\": \"The tile's row index within the tile grid at the given zoom level.\", \"schema\": {\"type\": \"integer\", \"format\": \"int32\", \"minimum\": 0}, \"example\": 1338}, \"XPath\": {\"name\": \"x\", \"in\": \"path\", \"required\": true, \"description\": \"The tile's column index within the tile grid at the given zoom level.\", \"schema\": {\"type\": \"integer\", \"format\": \"int32\", \"minimum\": 0}, \"example\": 2047}}, \"responses\": {\"Unauthorized\": {\"description\": \"Missing, invalid, or expired API key / OAuth2 token.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}, \"example\": {\"error\": {\"statusCode\": 401, \"message\": \"API key is missing or invalid.\"}}}}}, \"Forbidden\": {\"description\": \"The API key is valid but does not have access to this API, data product, or overlay (for example, your OS Data Hub plan does not include OS Vector Tile API, or does not include the requested data overlay).\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}, \"example\": {\"error\": {\"statusCode\": 403, \"message\": \"Forbidden - the supplied key does not have access to this resource.\"}}}}}, \"NotFound\": {\"description\": \"The requested resource (e.g. named overlay) does not exist.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}, \"example\": {\"error\": {\"statusCode\": 404, \"message\": \"Not found.\"}}}}}, \"TooManyRequests\": {\"description\": \"Rate limit exceeded for your OS Data Hub plan. Retry after waiting, ideally with backoff.\", \"content\": {\"application/json\": {\"schema\": {\"$ref\": \"#/components/schemas/ErrorResponse\"}, \"example\": {\"error\": {\"statusCode\": 429, \"message\": \"Rate limit exceeded. Please retry later.\"}}}}}}, \"schemas\": {\"ErrorResponse\": {\"type\": \"object\", \"properties\": {\"error\": {\"type\": \"object\", \"properties\": {\"statusCode\": {\"type\": \"integer\", \"example\": 401}, \"message\": {\"type\": \"string\", \"example\": \"API key is missing or invalid.\"}}}}}, \"ServiceMetadata\": {\"type\": \"object\", \"description\": \"ArcGIS-style vector tile service descriptor: capabilities, extents, projection and tiling scheme.\", \"properties\": {\"currentVersion\": {\"type\": \"number\", \"description\": \"Service schema version.\"}, \"name\": {\"type\": \"string\", \"description\": \"Human-readable service name.\"}, \"capabilities\": {\"type\": \"string\", \"description\": \"Comma-free capability flag, e.g. 'TilesOnly'.\"}, \"type\": {\"type\": \"string\", \"description\": \"Service type, e.g. 'indexedVector'.\"}, \"defaultStyles\": {\"type\": \"string\", \"description\": \"Relative path to the default stylesheet resource.\"}, \"tiles\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}, \"description\": \"Tile URL template(s) relative to the service root.\"}, \"exportTilesAllowed\": {\"type\": \"boolean\"}, \"initialExtent\": {\"$ref\": \"#/components/schemas/Extent\"}, \"fullExtent\": {\"$ref\": \"#/components/schemas/Extent\"}, \"minScale\": {\"type\": \"number\", \"description\": \"Map scale denominator at the minimum (most zoomed-out) zoom level.\"}, \"maxScale\": {\"type\": \"number\", \"description\": \"Map scale denominator at the maximum (most zoomed-in) zoom level.\"}, \"tileInfo\": {\"$ref\": \"#/components/schemas/TileInfo\"}, \"maxzoom\": {\"type\": \"integer\"}, \"minLOD\": {\"type\": \"integer\", \"description\": \"Minimum level of detail (zoom level) available.\"}, \"maxLOD\": {\"type\": \"integer\", \"description\": \"Maximum level of detail (zoom level) available.\"}, \"resourceInfo\": {\"type\": \"object\", \"properties\": {\"styleVersion\": {\"type\": \"integer\"}, \"tileCompression\": {\"type\": \"string\", \"example\": \"gzip\"}, \"cacheInfo\": {\"type\": \"object\", \"properties\": {\"storageInfo\": {\"type\": \"object\", \"properties\": {\"packetSize\": {\"type\": \"integer\"}, \"storageFormat\": {\"type\": \"string\"}}}}}}}, \"serviceItemId\": {\"type\": \"string\"}, \"maxExportTilesCount\": {\"type\": \"integer\"}}}, \"Extent\": {\"type\": \"object\", \"properties\": {\"xmin\": {\"type\": \"number\"}, \"ymin\": {\"type\": \"number\"}, \"xmax\": {\"type\": \"number\"}, \"ymax\": {\"type\": \"number\"}, \"spatialReference\": {\"type\": \"object\", \"properties\": {\"wkid\": {\"type\": \"integer\", \"description\": \"EPSG well-known ID, e.g. 27700 or 3857.\"}, \"latestWkid\": {\"type\": \"integer\"}}}}}, \"TileInfo\": {\"type\": \"object\", \"properties\": {\"rows\": {\"type\": \"integer\", \"description\": \"Tile height in pixels.\"}, \"cols\": {\"type\": \"integer\", \"description\": \"Tile width in pixels.\"}, \"dpi\": {\"type\": \"integer\"}, \"format\": {\"type\": \"string\", \"example\": \"pbf\"}, \"origin\": {\"type\": \"object\", \"properties\": {\"x\": {\"type\": \"number\"}, \"y\": {\"type\": \"number\"}}}, \"spatialReference\": {\"$ref\": \"#/components/schemas/Extent\"}, \"lods\": {\"type\": \"array\", \"items\": {\"$ref\": \"#/components/schemas/Lod\"}, \"description\": \"Levels of detail: the resolution and scale available at each zoom level.\"}}}, \"Lod\": {\"type\": \"object\", \"properties\": {\"level\": {\"type\": \"integer\", \"description\": \"Zoom level number.\"}, \"resolution\": {\"type\": \"number\", \"description\": \"Map units per pixel at this zoom level.\"}, \"scale\": {\"type\": \"number\", \"description\": \"Map scale denominator at this zoom level.\"}}}, \"Stylesheet\": {\"type\": \"object\", \"description\": \"Mapbox/MapLibre Style Specification (version 8) document describing sprite, glyph and vector-tile sources, plus the ordered list of style layers used to render them.\", \"properties\": {\"version\": {\"type\": \"integer\", \"example\": 8}, \"sprite\": {\"type\": \"string\", \"description\": \"Base URL for the sprite image/JSON used for icon symbols.\"}, \"glyphs\": {\"type\": \"string\", \"description\": \"URL template (containing {fontstack} and {range}) for fetching text label glyphs.\"}, \"sources\": {\"type\": \"object\", \"description\": \"Named vector tile sources referenced by the layers below.\", \"additionalProperties\": {\"type\": \"object\", \"properties\": {\"type\": {\"type\": \"string\", \"example\": \"vector\"}, \"url\": {\"type\": \"string\"}}}}, \"layers\": {\"type\": \"array\", \"items\": {\"type\": \"object\", \"properties\": {\"id\": {\"type\": \"string\"}, \"type\": {\"type\": \"string\", \"description\": \"e.g. fill, line, symbol, background, fill-extrusion.\"}, \"source\": {\"type\": \"string\"}, \"source-layer\": {\"type\": \"string\"}, \"filter\": {\"type\": \"array\", \"items\": {}}, \"minzoom\": {\"type\": \"integer\"}, \"maxzoom\": {\"type\": \"integer\"}, \"layout\": {\"type\": \"object\"}, \"paint\": {\"type\": \"object\"}}}}}}}}}",
        "auth": {
          "type": "apikey",
          "api_key_header": "key",
          "api_key_value": ""
        }
      }
    ],
    "sparqlEndpoints": [],
    "mcpServers": [
      {
        "id": "19d7f398-19d7-4398-bf39-19d81c46f47848",
        "name": "MapBox",
        "command": "https://mcp.mapbox.com/mcp",
        "args": [],
        "env": {},
        "auth": {
          "type": "bearer",
          "bearer_token": ""
        },
        "enable_apps": true
      }
    ]
  }
}