Guide

Locate a batch of points

Have a spreadsheet of sites, incidents or survey points? Send up to 100 coordinates in one request, match each to its containing area, and keep the points the API could not place instead of losing them in a failed join.
  1. Send the points

    Repeat point for each coordinate. This example sends a point in Leeds and another outside UK coverage, asking for local authorities as they were published on 1 June 2025.

    curl "https://api.ukdataatlas.com/v1/areas:containsBatch?geography=localAuthority&date=2025-06-01"
    Response200
    {
      "apiVersion": "v1",
      "atlasRelease": "sha256:da4898229392e8fa52cd5098cf24c52f11abf454b0adcab178c6c82e30032c15",
      "data": {
        "date": "2025-06-01",
        "boundaryRule": "included",
        "releases": [
          {
            "geography": "localAuthority",
            "boundaryRelease": "2025-05-uk-bgc-v2",
            "selection": {
              "policy": "latest-release-dated-on-or-before",
              "date": "2025-06-01"
            },
            "boundaryResolution": {
              "generalisation": "generalised-20m",
              "toleranceM": 20
            },
            "geometrySource": {
              "sourceCrs": "EPSG:4326"
            }
          }
        ],
        "summary": {
          "points": 2,
          "lookups": 2,
          "matched": 1,
          "noMatch": 0,
          "outsideCoverage": 1,
          "unresolved": 0,
          "nearBoundary": 0
        },
        "points": [
          {
            "index": 0,
            "point": {
              "lng": -1.5491,
              "lat": 53.8008
            },
            "country": {
              "code": "GB-ENG",
              "determinedBy": "area-code",
              "area": "localAuthority/2025-05-uk-bgc-v2/E08000035"
            },
            "results": [
              {
                "geography": "localAuthority",
                "boundaryRelease": "2025-05-uk-bgc-v2",
                "status": "matched",
                "positionalToleranceM": 25.57,
                "matches": [
                  {
                    "id": "localAuthority/2025-05-uk-bgc-v2/E08000035",
                    "code": "E08000035",
                    "name": "Leeds",
                    "containment": "interior",
                    "distanceToBoundaryM": 6460.39,
                    "nearBoundary": false
                  }
                ]
              }
            ]
          },
          {
            "index": 1,
            "point": {
              "lng": 1,
              "lat": 54.5
            },
            "country": {
              "code": null,
              "determinedBy": "country-boundary",
              "boundaryRelease": "2024-12-uk-bgc"
            },
            "results": [
              {
                "geography": "localAuthority",
                "status": "outside-coverage",
                "reason": "outside-uk-boundaries",
                "matches": []
              }
            ]
          }
        ]
      }
    }
  2. Read every result

    Use points[].index to join the answer back to your input row. A matched point has an area id and code; an outside-coverage point is still a successful response, with an explanation and no invented area.

    Keep summary.outsideCoverage, summary.unresolved and nearBoundary in your import report. They tell you how much of your input needs review.

  3. Join your data

    For matched rows, store the complete area id, not only its code. The id preserves the geography and boundary release, so a later data request uses the same area vintage as the lookup.

    You can then request a measure for the matched codes, or keep the point-to-area table as a reusable spatial join. The batch endpoint is capped at 100 points; page your own input into bounded batches.

post/areas:containsBatchFind areas for many pointsget/data/{measure-id}Get observations