API Documentation
Free, open JSON API for Amsterdam hotel quality data. No authentication required.
GET
/api/hotelsList all hotels with filtering, sorting, and pagination.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| sort | string | score | Sort order: score, stars, or name |
| stars | integer | - | Filter by star rating (1-5) |
| minScore | float | - | Minimum Continental Score |
| neighborhood | string | - | Filter by neighborhood (e.g. Centrum, Zuid, West) |
| q | string | - | Text search across name, address, and brand |
| amenity | string | - | Filter by amenity. Comma-separated for multiple (e.g. wifi,spa) |
| limit | integer | 24 | Number of results per page |
| offset | integer | 0 | Pagination offset |
Example Request
GET /api/hotels?stars=5&sort=score&limit=10Response
{
"hotels": [
{
"id": "osm:12345",
"name": "Hotel Example",
"lat": 52.37,
"lon": 4.89,
"address": "Keizersgracht, 123, 1015AA, Amsterdam",
"stars": 5,
"continental_score": 6.5,
"neighborhood": "Centrum",
"amenities_list": ["wifi", "spa", "gym"],
"website": "https://example.com",
"image_url": "/images/osm_12345.jpg",
...
}
],
"total": 16
}GET
/api/hotels/[id]Get full details for a single hotel by ID.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| id | string (path) | - | Hotel ID (e.g. osm:12345). URL-encode the colon. |
Example Request
GET /api/hotels/osm%3A12345Response
{
"id": "osm:12345",
"name": "Hotel Example",
"lat": 52.37,
"lon": 4.89,
"address": "Keizersgracht, 123, 1015AA, Amsterdam",
"stars": 5,
"continental_score": 6.5,
"neighborhood": "Centrum",
"amenities_list": ["wifi", "spa", "gym"],
"amenities": { /* raw OSM tags */ },
"website": "https://example.com",
"phone": "+31 20 1234567",
"email": "info@example.com",
"brand": "Example Hotels",
"image_url": "/images/osm_12345.jpg",
...
}GET
/api/statsGet aggregate statistics about the hotel index.
Example Request
GET /api/statsResponse
{
"total": 415,
"avgScore": 1.2,
"certified": 15,
"maxScore": 6.5,
"topNeighborhoods": [
{ "name": "Centrum", "count": 200 },
{ "name": "Zuid", "count": 66 }
],
"starCounts": { "5": 16, "4": 24, "unrated": 332 },
"scoreDistribution": { "0-1": 70, "1-2": 95, ... }
}Continental Score Methodology
Each hotel is scored on a 0-10 scale based on publicly available data from OpenStreetMap:
Star Rating0-3 pts5-star = 3, 4-star = 2, 3-star = 1
Amenity Richness0-3 ptsCount of: spa, pool, gym, restaurant, bar, room service, concierge, parking, breakfast, A/C, wifi
Service Indicators0-2 pts24h reception, concierge, room service availability
Digital Presence0-1 ptsWebsite (+0.5), phone/email (+0.5)
Brand Recognition0-1 ptsKnown luxury hotel brands receive a bonus