With out meta;, every element comes with its version number, the time of its last edit, the user who made it and the changeset. timestamp() makes the time usable in filters.
This query finds the shops in Bern that nobody has edited since 2020: a list for a survey, to check that they still exist.
The query
[out:json][timeout:60];
area["name"="Bern"]["admin_level"="8"]["wikidata"="Q70"]->.a;
nwr["shop"](area.a)(if:date(timestamp())<date("2020-01-01"));
out center meta;
Run it
Live result from overpass.ch, cached for up to 12 hours. Map data © OpenStreetMap contributors (ODbL).
How it works
- Another place called Bern also has admin_level 8.
["wikidata"="Q70"]picks the Swiss capital. timestamp()is the time of the last edit.date(…)turns a time into a number, so two times can be compared.(if:date(timestamp())<date("2020-01-01"))keeps the shops last edited before 2020.out center meta;adds the version, time and user to each result; the table shows them.
Variations
- After a survey, a
check_datetag with the date of the visit records that the shop is still there. - Edited by one user:
(user:"…"). Changed in a period:(changed:"2025-01-01T00:00:00Z","2025-02-01T00:00:00Z"). Keep the period short: over a year,changedran out of memory even on a small box. - Every version of one object: see every version of an object.
Run it from your code
curl https://api.overpass.ch/v1/YOUR_API_KEY/interpreter \
--data-urlencode 'data@query.overpassql'
import requests
query = open("query.overpassql").read()
r = requests.post("https://api.overpass.ch/v1/YOUR_API_KEY/interpreter",
data={"data": query}, timeout=120)
r.raise_for_status()
print(r.json()["elements"][:3])
const res = await fetch("https://api.overpass.ch/v1/YOUR_API_KEY/interpreter", {
method: "POST",
body: new URLSearchParams({ data: query }),
});
if (!res.ok) throw new Error(await res.text());
console.log(await res.json());
Save the query as query.overpassql. It works the same in Overpass Turbo, QGIS and JOSM.