# OpenStreetMap Community API
> Live OpenStreetMap community and contribution data as an API — the people and the edits behind the collaborative free world map, served from the official OSM API. Look up any mapper by their user id for their profile (display name, account age, total changesets and GPS traces, roles), pull a user's recent changesets — each edit batch with its comment, the editor used, and how many map features it created, modified or deleted — or read the open and resolved map notes, the community feedback pins, inside a geographic bounding box. The OSM contributor-and-edits layer for mapping, community and dashboard apps. Live, no key. Distinct from geocoding, routing and map-tile APIs that merely consume OpenStreetMap data — this is the OSM community and editing activity itself.

## Authentication
All requests require your oanor API key in the `x-oanor-key` header. Get one at https://www.oanor.com/developer/keys.

```bash
curl -H "x-oanor-key: oanor_live_…" "https://api.oanor.com/openstreetmap-api/..."
```

## Pricing
- **Free** (Free) — 13,000 calls/Mo, 5 req/s
- **Starter** ($6/Mo) — 160,000 calls/Mo, 15 req/s
- **Pro** ($20/Mo) — 780,000 calls/Mo, 40 req/s
- **Scale** ($47/Mo) — 3,900,000 calls/Mo, 100 req/s

## Endpoints

### User

#### `GET /v1/user` — A mapper's profile by user id

**Parameters:**
- `id` (query, required, string) — Numeric OSM user id Example: `1`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/openstreetmap-api/v1/user?id=1"
```

**Response:**
```json
{
    "data": {
        "id": 1,
        "roles": [],
        "changesets": 1181,
        "gps_traces": 23,
        "description": null,
        "profile_url": "https://www.openstreetmap.org/user/Steve",
        "display_name": "Steve",
        "account_created": "2005-09-13T15:32:57Z",
        "blocks_received": 0,
        "account_age_days": 7573,
        "contributor_terms_agreed": true
    },
    "meta": {
        "timestamp": "2026-06-09T03:02:22.202Z",
        "request_id": "b000cea6-582f-4e7c-ab5f-0a6136aaf35c"
    },
    "status": "ok",
    "message": "User retrieved successfully",
    "success": true
}
```

### Changesets

#### `GET /v1/changeset` — One changeset in full, with its discussion

**Parameters:**
- `id` (query, required, string) — Numeric changeset id (from /v1/changesets) Example: `1`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/openstreetmap-api/v1/changeset?id=1"
```

**Response:**
```json
{
    "data": {
        "id": 1,
        "uid": 1,
        "url": "https://www.openstreetmap.org/changeset/1",
        "bbox": {
            "max_lat": 51.528862,
            "max_lon": -0.1464925,
            "min_lat": 51.5288506,
            "min_lon": -0.1465242
        },
        "open": false,
        "user": "Steve",
        "editor": null,
        "source": null,
        "changes": 2,
        "comment": null,
        "created": 2,
        "deleted": 0,
        "modified": 0,
        "closed_at": "2005-04-09T20:54:39Z",
        "created_at": "2005-04-09T19:54:13Z",
        "discussion": [
            {
                "date": "2014-11-15T11:43:09Z",
                "text": "From humble beginnings…",
                "user": "Minh Nguyen"
            },
            {
                "date": "2016-05-06T14:14:03Z",
                "text": "?",
                "user": "Geography Canada"
            },
            {
                "date": "2016-12-06T16:21:28Z",
                "text": "Ah, the great \"first.\"",
                "user": "Roadsguy"
            },
            {
                "date": "2017-02-28T15:41:09Z",
                "text": "http://www.directionsmag.com/entry/osm-the-simple-map-that-became-a-global-movement/466280 \"The very first contribution to OpenStreetMap was probably a road.\" Turns out it wasn't",
                "user": "NiedernhausenerJunge"
            },
            {
                "date": "2017-07-23T01:33:07Z",
                "text"
…(truncated, see openapi.json for full schema)
```

#### `GET /v1/changesets` — A user's recent changesets

**Parameters:**
- `uid` (query, optional, string) — Numeric OSM user id (or pass user=) Example: `1`
- `user` (query, optional, string) — OSM display name (alternative to uid) Example: `Steve`
- `limit` (query, optional, string) — Max changesets (1-100) Example: `20`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/openstreetmap-api/v1/changesets?uid=1&user=Steve&limit=20"
```

**Response:**
```json
{
    "data": {
        "uid": "1",
        "user": "Steve",
        "count": 20,
        "changesets": [
            {
                "id": 183694744,
                "uid": 1,
                "url": "https://www.openstreetmap.org/changeset/183694744",
                "bbox": {
                    "max_lat": 38.5567618,
                    "max_lon": -109.5344292,
                    "min_lat": 38.5546611,
                    "min_lon": -109.5354331
                },
                "open": false,
                "user": "Steve",
                "editor": "iD 2.40.0",
                "source": "Bing Maps Aerial",
                "changes": 21,
                "comment": "fix hostel in moab",
                "created": 19,
                "deleted": 0,
                "modified": 2,
                "closed_at": "2026-06-05T12:59:01Z",
                "created_at": "2026-06-05T12:59:00Z",
                "discussion_comments": 0
            },
            {
                "id": 183694548,
                "uid": 1,
                "url": "https://www.openstreetmap.org/changeset/183694548",
                "bbox": {
                    "max_lat": 38.5953912,
                    "max_lon": -109.5622348,
                    "min_lat": 38.5900786,
                    "min_lon": -109.5692329
                },
                "open": false,
                "user": "Steve",
                "editor": "iD 2.40.0",
                "source": "Bing Maps Aerial",
                "change
…(truncated, see openapi.json for full schema)
```

### Notes

#### `GET /v1/note` — One map note with its full comment thread

**Parameters:**
- `id` (query, required, string) — Numeric note id (from /v1/notes) Example: `3338553`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/openstreetmap-api/v1/note?id=3338553"
```

**Response:**
```json
{
    "data": {
        "id": 3338553,
        "lat": 51.5106121,
        "lon": -0.1168451,
        "url": "https://www.openstreetmap.org/note/3338553",
        "status": "closed",
        "comments": [
            {
                "date": "2022-08-30 16:12:36 UTC",
                "text": "This restaurant is now the https://dipnasomersethouse.co.uk/",
                "user": null,
                "action": "opened"
            },
            {
                "date": "2026-06-09 20:33:32 UTC",
                "text": "It's changed again, to Aram by Imad. Now updated",
                "user": "Mikey Co",
                "action": "closed"
            }
        ],
        "closed_at": "2026-06-09 20:33:32 UTC",
        "date_created": "2022-08-30 16:12:35 UTC",
        "comment_count": 2
    },
    "meta": {
        "timestamp": "2026-06-13T14:10:23.126Z",
        "request_id": "bcd2945e-20da-4c1a-8341-cca8f01cae8d"
    },
    "status": "ok",
    "message": "Note retrieved successfully",
    "success": true
}
```

#### `GET /v1/notes` — Map notes in a bounding box

**Parameters:**
- `bbox` (query, required, string) — left,bottom,right,top Example: `-0.13,51.50,-0.11,51.52`
- `closed` (query, optional, string) — Days a closed note stays (0 = open only) Example: `7`
- `limit` (query, optional, string) — Max notes (1-100) Example: `25`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/openstreetmap-api/v1/notes?bbox=-0.13%2C51.50%2C-0.11%2C51.52&closed=7&limit=25"
```

**Response:**
```json
{
    "data": {
        "bbox": {
            "top": 51.52,
            "left": -0.13,
            "right": -0.11,
            "bottom": 51.5
        },
        "count": 25,
        "notes": [
            {
                "id": 5324412,
                "lat": 51.5133776,
                "lon": -0.1282109,
                "url": "https://www.openstreetmap.org/note/5324412",
                "text": "This place does not exist: \"There's something called Seven Dials now\" A CoMaps user reported that the POI was visible on the map (see snapshot date below), but was not found on the ground. OSM snapshot date: 2026-05-04T17:33:07Z POI name: Tristan Bates Theatre POI types: amenity-theatre #CoMaps andr",
                "status": "closed",
                "comments": 4,
                "closed_at": "2026-06-04 12:50:41 UTC",
                "date_created": "2026-06-03 08:39:14 UTC"
            },
            {
                "id": 5317400,
                "lat": 51.51386,
                "lon": -0.1286213,
                "url": "https://www.openstreetmap.org/note/5317400",
                "text": "\"They moved on a different road, this is not the current location. I've updated road and postocode.\" OSM snapshot date: 2026-05-04T17:33:07Z POI name: Nisbets POI types: wheelchair-no shop-kitchen #CoMaps android 2026.05.06-11-FDroid",
                "status": "closed",
                "comments": 4,
                "closed_at": "2026-06-04 12:49:30 UTC",
                "date_created
…(truncated, see openapi.json for full schema)
```

#### `GET /v1/notes-search` — Search map notes by text

**Parameters:**
- `q` (query, required, string) — Search query (min 2 chars) Example: `parking`
- `limit` (query, optional, string) — Max notes (1-100) Example: `25`
- `closed` (query, optional, string) — Days a closed note stays (0 = open only) Example: `0`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/openstreetmap-api/v1/notes-search?q=parking&limit=25&closed=0"
```

**Response:**
```json
{
    "data": {
        "count": 25,
        "notes": [
            {
                "id": 5342628,
                "lat": 35.978108,
                "lon": -82.847974,
                "url": "https://www.openstreetmap.org/note/5342628",
                "text": "\"Sign says Overlook Access. parking, picnic tables, pit toilet\" OSM snapshot date: 2026-05-03T01:52:52Z POI has no name POI types: tourism-picnic_site #organicmaps android 2026.05.08-1-Google",
                "status": "open",
                "comments": 1,
                "date_created": "2026-06-13 13:59:34 UTC"
            },
            {
                "id": 991969,
                "lat": 50.9158036,
                "lon": -0.4636574,
                "url": "https://www.openstreetmap.org/note/991969",
                "text": "Kithurst Park is a cul-de-sac and ends at this marker. The road to the West of the marker a spur off Kithurst Lane. So there is no access, except for pedestrians, between Kithurst Park and Kithurst Lane. For pedestrians there is a short 1 meter wide foot path.",
                "status": "open",
                "comments": 3,
                "date_created": "2017-05-10 19:33:36 UTC"
            },
            {
                "id": 5342595,
                "lat": 47.5601715,
                "lon": -1.0423821,
                "url": "https://www.openstreetmap.org/note/5342595",
                "text": "Parking vélo non repertorié - Poteau poteaux à trouver de l'autre côté des toile
…(truncated, see openapi.json for full schema)
```

### Meta

#### `GET /v1/meta` — Service metadata

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/openstreetmap-api/v1/meta"
```

**Response:**
```json
{
    "data": {
        "source": "OpenStreetMap official API 0.6 (live)",
        "service": "openstreetmap-api",
        "endpoints": {
            "GET /v1/meta": "This document.",
            "GET /v1/user": "A mapper's profile by user id (id=1).",
            "GET /v1/notes": "Map notes in a bounding box (bbox=left,bottom,right,top, closed=days, limit).",
            "GET /v1/changesets": "A user's recent changesets (user=Steve or uid=, limit)."
        },
        "description": "Live OpenStreetMap community and contribution data from the official OSM API: any mapper's profile by user id (display name, account age, total changesets and GPS traces, roles), a user's recent changesets (each edit batch with comment, editor, and create/modify/delete counts), and the open and resolved map notes inside a bounding box. Live, no key. Distinct from geocoding, routing and map-tile APIs that consume OSM data — this is the OSM community and editing activity itself.",
        "upstream_status": "ok"
    },
    "meta": {
        "timestamp": "2026-06-09T03:02:23.058Z",
        "request_id": "a775bbd9-dcbd-4700-9bde-0b233c6ff5e9"
    },
    "status": "ok",
    "message": "Meta",
    "success": true
}
```


---
Marketplace page: https://www.oanor.com/api/openstreetmap-api
OpenAPI spec: https://www.oanor.com/api/openstreetmap-api/openapi.json
