Skip to main content

API Documentation

Free, open JSON API for Amsterdam hotel quality data. No authentication required.

GET/api/hotels

List all hotels with filtering, sorting, and pagination.

Parameters

NameTypeDefaultDescription
sortstringscoreSort order: score, stars, or name
starsinteger-Filter by star rating (1-5)
minScorefloat-Minimum Continental Score
neighborhoodstring-Filter by neighborhood (e.g. Centrum, Zuid, West)
qstring-Text search across name, address, and brand
amenitystring-Filter by amenity. Comma-separated for multiple (e.g. wifi,spa)
limitinteger24Number of results per page
offsetinteger0Pagination offset

Example Request

GET /api/hotels?stars=5&sort=score&limit=10

Response

{
  "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

NameTypeDefaultDescription
idstring (path)-Hotel ID (e.g. osm:12345). URL-encode the colon.

Example Request

GET /api/hotels/osm%3A12345

Response

{
  "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/stats

Get aggregate statistics about the hotel index.

Example Request

GET /api/stats

Response

{
  "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