Three meter grid index
The three-meter grid index maps a latitude and longitude to one stable numeric cell address.
Run — free
It divides the globe into narrow latitude rows and sizes each row's longitude columns for an approximately three-meter footprint. The response provides the combined index, row, column, number of columns in that row, center coordinate, and geographic bounds. It is useful when a compact repeatable location key matters more than a street address, and it works without a network lookup or a proprietary word dictionary.
Convert a coordinate into a repeatable numeric address
Provide `lat` and `lon` as decimal degrees and the calculator assigns that point to exactly one global cell. The main `grid_index` value joins the latitude row and longitude column with a period, giving applications a compact key that can be stored, compared, logged, or placed in a URL. The separate `row` and `column` fields make sorting and database work easier, while `columns_in_row` explains the geometry of the selected latitude band. The same finite inputs always produce the same output because the algorithm has no network request, random choice, clock, or mutable reference table. Coordinates on ordinary boundaries follow a consistent half-open rule: the southern or western boundary is included and the northern or eastern boundary is excluded. The North Pole is assigned explicitly to the last row, while longitude 180 degrees is treated as the same antimeridian as -180 degrees. Those conventions remove ambiguous duplicate addresses at the edges of the coordinate system.
Understand what three meters means on a spherical grid
The calculation models Earth as a sphere with a fixed mean radius. It creates equal angular latitude rows whose north-to-south distance is no more than three meters. For each row, it measures the circumference of the parallel through the row center and chooses enough longitude columns that their centerline width is also no more than three meters. The number of columns therefore decreases toward the poles, where circles of latitude become shorter. This is more useful than applying one longitude step everywhere, which would make east-to-west cells progressively narrower at high latitudes. The returned bounds describe the exact angular rectangle used by this definition, and the returned center gives a convenient representative coordinate. Physical size remains approximate: Earth is not a perfect sphere, terrain adds surface distance, and positioning devices have their own uncertainty. Use the index for deterministic grouping and addressing, not as a substitute for cadastral boundaries, safety-critical navigation, or a professional geodetic survey.
Use the index safely in data systems
Store `grid_index` as text because it contains two potentially large integers separated by a period. Do not parse the combined value as a floating-point number, since that would discard the distinction between the row and column and can lose integer precision in some environments. For compound database keys, storing `row` and `column` in separate integer columns is equally valid; include a version or grid name in long-lived datasets so a future algorithm cannot be confused with this definition. Nearby coordinates usually share an index, which makes the key useful for deduplication, coarse presence records, cache partitions, and privacy-aware aggregation. However, two points separated by a cell boundary receive different keys even when they are centimeters apart. If proximity matters, compare the selected cell and its neighboring rows and columns or use an actual distance calculation. The scheme is inspired by the approximate scale associated with what3words, but it is numeric and independent: it neither converts official three-word addresses nor reproduces their proprietary cell identifiers or word assignments.
What you can do with it
Group repeated location reports
Collapse observations that land in the same small cell while retaining a deterministic key for later comparison.
Build compact map references
Represent a coordinate with a numeric row and column when a full formatted decimal coordinate is inconvenient.
Partition spatial records
Use row and column components as predictable database or cache partitions for point-based data.
FAQ
Does this return an official what3words address?
No. It returns an independent numeric grid index and does not use or reproduce the what3words word dictionary or official addressing service.
Are all cells exactly three meters square?
No. They are spherical latitude-longitude cells designed to be no more than approximately three meters high and wide at each row center. Ellipsoid, terrain, and pole effects make physical dimensions approximate.
What does the grid index contain?
It contains the zero-based latitude row, a period, and the zero-based longitude column for that row. The response also returns both numbers separately.
Why does the number of columns change by row?
Circles of latitude become shorter toward the poles. Varying the column count keeps east-to-west cell width near the intended scale.
How are coordinates on a boundary handled?
Southern and western edges are included in a cell, while northern and eastern edges lead to the next cell. Special rules place the North Pole in the final row and canonicalize longitude 180 to -180.
What does an API request cost?
Each API request costs $0.002. The same deterministic logic can also run locally in the browser.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/geo/what3words-grid-index \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"lat":51.520847,"lon":-0.195521}'const res = await fetch("https://api.kit.forhosting.com/geo/what3words-grid-index", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"lat": 51.520847,
"lon": -0.195521
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/what3words-grid-index",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"lat": 51.520847,
"lon": -0.195521
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/what3words-grid-index", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"lat":51.520847,"lon":-0.195521}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"lat":51.520847,"lon":-0.195521}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/what3words-grid-index", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"lat": 51.520847,
"lon": -0.195521
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.what3words_grid_index",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |