Activity
This endpoint gives you a live feed of recent activity on Yesterdays. For overall numbers, see statistics.
Activity feed
GET /api/v2/activity/
Returns a stream of recent activity on the site, including georeference contributions, comments, and milestones.
Example request
curl "https://yesterdays.maprva.org/api/v2/activity/"
import requests
response = requests.get("https://yesterdays.maprva.org/api/v2/activity/")
data = response.json()
library(httr2)
resp <- request("https://yesterdays.maprva.org/api/v2/activity/") |>
req_perform()
data <- resp_body_json(resp)
Example response
[
{
"type": "georeference_group",
"timestamp": "2026-02-23T17:57:43Z",
"data": {
"user": "John Pole",
"count": 4,
"started_at": "2026-02-23T17:56:02Z",
"ended_at": "2026-02-23T17:57:43Z",
"images": [
{
"id": 28656,
"title": "2705 - 2703 - 2701 E. Grace St.",
"thumbnail": "https://cdn.maprva.org/eea94aadbb05db2f4a54_thumb"
},
{
"id": 26221,
"title": "13 - 17 E. Broad St.",
"thumbnail": "https://cdn.maprva.org/58d41134f2b0a2057256_thumb"
}
]
}
},
{
"type": "comment",
"timestamp": "2026-02-20T16:59:14Z",
"data": {
"user": "John Pole",
"text": "The sculptor calls this piece \"The Case of the Missing Executive\" on his own website",
"image_id": 8151,
"image_title": "Corporate Presence Sculpture"
}
},
{
"type": "user_milestone",
"timestamp": "2026-02-20T01:58:16Z",
"data": {
"user": "whwilson",
"count": 15
}
},
{
"type": "sitewide_milestone",
"timestamp": "2026-02-23T17:57:43Z",
"data": {
"count": 9000
}
}
]
Info
The activity feed returns a flat array (not a paginated response).
Use the before parameter to page through older events.
When the response contains fewer events than limit (or is empty), you've reached the end of the feed.
Event types
The feed contains four types of events:
georeference_group
Consecutive georeferences by the same user, grouped together as long as each one is made within 3 hours of the last. This reduces noise in the feed when someone georeferences many images in one session.
| Field | Type | Description |
|---|---|---|
user |
string | OpenStreetMap username of the contributor |
count |
integer | Number of georeferences in this group |
started_at |
string | When the first georeference was made |
ended_at |
string | When the last georeference was made |
images |
array | The images that were georeferenced (id, title, thumbnail) |
comment
A comment left on an image.
| Field | Type | Description |
|---|---|---|
user |
string | OpenStreetMap username of the commenter |
text |
string | Comment text |
image_id |
integer | ID of the image |
image_title |
string | Title of the image |
user_milestone
A contributor reached a georeferencing milestone (5, 15, 50, 100, 250, etc.). The exact milestones are set by the site administrator and are subject to change.
| Field | Type | Description |
|---|---|---|
user |
string | OpenStreetMap username of the contributor |
count |
integer | The milestone reached |
sitewide_milestone
The site as a whole reached a total georeferencing milestone (100, 250, 500, 1000, etc.). The exact milestones are set by the site administrator and are subject to change.
| Field | Type | Description |
|---|---|---|
count |
integer | The milestone reached |
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
before |
string | — | ISO 8601 timestamp. Return only events before this time. Use this for pagination by passing the timestamp of the last event you received. |
types |
string | all | Comma-separated list of event types to include: georeference_group, comment, user_milestone, sitewide_milestone. |
limit |
integer | 20 | Number of events to return (max 100). |
Examples
Paginating through the feed
Fetch the first page:
curl "https://yesterdays.maprva.org/api/v2/activity/"
import requests
response = requests.get("https://yesterdays.maprva.org/api/v2/activity/")
data = response.json()
library(httr2)
resp <- request("https://yesterdays.maprva.org/api/v2/activity/") |>
req_perform()
data <- resp_body_json(resp)
Then use the timestamp of the last event to fetch the next page:
curl "https://yesterdays.maprva.org/api/v2/activity/?before=2026-02-20T01:58:16Z"
import requests
response = requests.get("https://yesterdays.maprva.org/api/v2/activity/", params={
"before": "2026-02-20T01:58:16Z",
})
data = response.json()
library(httr2)
resp <- request("https://yesterdays.maprva.org/api/v2/activity/") |>
req_url_query(before = "2026-02-20T01:58:16Z") |>
req_perform()
data <- resp_body_json(resp)
Filtering by type
Show only comments and milestones:
curl "https://yesterdays.maprva.org/api/v2/activity/?types=comment,user_milestone"
import requests
response = requests.get("https://yesterdays.maprva.org/api/v2/activity/", params={
"types": "comment,user_milestone",
})
data = response.json()
library(httr2)
resp <- request("https://yesterdays.maprva.org/api/v2/activity/") |>
req_url_query(types = "comment,user_milestone") |>
req_perform()
data <- resp_body_json(resp)