# overpass.ch > Hosted Overpass API for OpenStreetMap data, with API keys, a free plan and monthly plans. The same key works for an elevation API in the format of the Google Elevation API and for vector map tiles with MapLibre styles. overpass.ch runs a custom Rust engine, overpass-rust (https://github.com/cdutsov/overpass-rust), on the full planet with metadata and minutely updates; history queries run on Overpass API 0.7.62. Overpass QL and XML queries work unchanged. To move code from overpass-api.de, replace `https://overpass-api.de/api/interpreter` with `https://api.overpass.ch/v1//interpreter`. On customer queries with identical answers on 11 and 12 November 2026, on the same hardware, the Rust engine was typically 84 times faster than Overpass API 0.7.62, the software of the public Overpass servers, on queries with answers under 100 KB, and 14 times faster in total time over all queries. On the afternoon of 5 November, five typical queries took 0.14–0.19 s each on overpass.ch and 35–120 s on overpass-api.de, overpass.kumi.systems and overpass.private.coffee, which answered some of them with HTTP 502 or 504 or not within two minutes. - Every request needs an API key. Create an account at https://overpass.ch/signup and a key at https://overpass.ch/dashboard/keys. Requests without a valid key get HTTP 401. - Send queries to `https://api.overpass.ch/v1//interpreter`, with GET and `?data=`, or with POST and a form field `data` or the raw query as the body. - The key can also go in an `X-API-Key` header, with `https://api.overpass.ch/v1/interpreter` as the URL. - `https://api.overpass.ch/v1//translate?q=` turns a sentence such as "cafés in Zürich" (English, German, French or Italian) into an Overpass query: JSON with `query`, `understood`, `exact`, `notes`, `alternatives` and `places`. With `run=1` it answers with the Overpass result of the query. Each call counts as one Overpass request. Docs: https://overpass.ch/docs#translate. - Overpass Turbo, JOSM and QuickOSM take the server URL `https://api.overpass.ch/v1//` with the trailing slash. In OSMnx, set `ox.settings.overpass_url = "https://api.overpass.ch/v1/"`. In osmdata for R, call `set_overpass_url("https://api.overpass.ch/v1//interpreter")`. - Anyone who opens a web page can read a key in its code. Restrict such a key to your websites under Allowed referers on the API keys page and tick “Reject requests without a referer”, or send the queries from your own server. Do not put keys in public code repositories. - Limits apply per account and are shared by all its keys. Requests per month count successful (HTTP 2xx) interpreter and translate calls, and each allowance starts again every month at 00:00 UTC on the day its plan was bought (free plans: the day of the sign-up; in shorter months their last day). Every response has `X-RateLimit-Limit` and `X-RateLimit-Remaining` headers. - `[timeout:]` and `[maxsize:]` above the plan maximum are lowered to it, and the query still runs. Without them, the default timeout of the plan and a maxsize of 512 MiB apply (or the plan maximum, if lower). - Errors from overpass.ch are JSON, such as `{"error": "rate_limited", "message": "…"}`. HTTP 429 (`rate_limited`, `concurrency_limit`, `quota_exceeded`) and 503 (`server_busy`) come with a `Retry-After` header. Wait that many seconds before the next request, and do not retry in a loop. Errors from Overpass itself (syntax errors, timeouts) pass through unchanged. - Identical queries within 60 seconds are answered from a cache (`X-Cache: HIT`). Send `Cache-Control: no-cache` for a fresh result. - `https://api.overpass.ch/v1//status` shows the free query slots of the key in the plain-text format of overpass-api.de. With `?format=json`, it shows the plan, the usage this month and the age of the data. - The data is © OpenStreetMap contributors under the Open Database Licence. An app that shows it must credit “© OpenStreetMap contributors” with a link to https://www.openstreetmap.org/copyright. ```js const res = await fetch("https://api.overpass.ch/v1//interpreter", { method: "POST", body: new URLSearchParams({ data: '[out:json][timeout:25];node["amenity"="drinking_water"](47.36,8.53,47.38,8.55);out;', }), }); if (!res.ok) { // on 429 and 503, wait Retry-After seconds before the next request throw new Error(`${res.status} ${await res.text()}`); } const { elements } = await res.json(); ``` ```python import requests query = '[out:json][timeout:25];node["amenity"="drinking_water"](47.36,8.53,47.38,8.55);out;' r = requests.post("https://api.overpass.ch/v1//interpreter", data={"data": query}, timeout=60) r.raise_for_status() elements = r.json()["elements"] ``` The elevation API takes the same key. `GET https://api.overpass.ch/v1//elevation?locations=46.0207,7.7491|35.95,-5.6` returns heights in metres, negative at sea, in the format of the Google Elevation API (`status`, `results[].elevation`, `results[].location`). For many points, POST JSON `{"locations": [[lat, lon], …]}`, up to 10'000 per request on paid plans and 1'000 on Free. `/v1//elevation/profile` takes a path or a GPX file and adds distance, ascent and descent. `elevation=1` in the URL of an Overpass query adds an `elevation` field to every point of a JSON result. Heights on land come from Copernicus GLO-30 (30 m grid, a surface model that includes buildings and trees; GLO-90 in Armenia and Azerbaijan) and, in Switzerland and Liechtenstein, from swissALTI3D of swisstopo (2 m grid, a terrain model of the ground without trees and buildings); depths at sea from GEBCO. Each result names its `dataset` (`copernicus-glo30`, `swissalti3d`, `copernicus-glo90`, `gebco-`) and `resolution` in metres. Results from swissalti3d need the credit "© swisstopo". Map tiles take the same key. MapLibre styles are at `https://api.overpass.ch/v1//maps/styles/