---
title: "Batch reverse geocoding (cached, grid-snapped)"
method: POST
path: "/api/v1/reverse/batch"
tags: ["Geocoding"]
---

# Batch reverse geocoding (cached, grid-snapped)

`POST /api/v1/reverse/batch`

Reverse-geocode many coordinates in one round trip.

* **Coords are snapped to a ~11 m grid** (4 decimal places) when computing the cache key,
  so repeated lookups of points within ~11 m of each other share a result.
* **Solid Cache** (Rails 8 default) memoizes results for 30 days — dawarich-style trip
  replays after the first run hit cache nearly 100%.
* Hard cap: 500 coords per request. For larger inputs, page client-side.
* Each result preserves the caller's optional `id` so clients can correlate.

## Request body

- BatchReverseRequest
  - `coords` object[], required
    - `id` string, nullable
    - `lat` number, double, required
    - `lon` number, double, required
  - `lang` string, nullable

## Response `200`

batch results

- BatchReverseResponse
  - `data` object[]
    - `id` string, nullable
    - `coord` Coords
      - `lat` number, double, required
      - `lon` number, double, required
    - `here` GeocodeFeature
      - `id` string, required
      - `name` string, nullable
      - `label` string, required
      - `type` string, nullable
      - `coords` Coords, required
        - `lat` number, double, required
        - `lon` number, double, required
      - `admin` AdminHierarchy
        - `country` string, nullable
        - `state` string, nullable
        - `county` string, nullable
        - `city` string, nullable
        - `postcode` string, nullable
    - `admin` AdminHierarchy
      - `country` string, nullable
      - `state` string, nullable
      - `county` string, nullable
      - `city` string, nullable
      - `postcode` string, nullable
    - `error` string, nullable
  - `meta` object
    - `timestamp` string, date-time
    - `upstream` string
    - `count` integer
    - `cache_hits` integer
    - `cache_misses` integer
    - `upstream_errors` integer
    - `grid_precision` integer — Decimal places used for cache-key snapping (4 ≈ 11 m)
    - `max_coords` integer

## Other responses

- `400` — missing or invalid coords array
- `422` — non-numeric coordinate inside payload

---

[API](https://skmtc.net/dawarich-app/apis/dawarich-atlas-api.md) · [All operations](https://skmtc.net/dawarich-app/apis/dawarich-atlas-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/dawarich-app/dawarich-atlas-api/versions/9e2938c3b0a6/schema)
