Documentation

A 5-minute introduction to the POIscore API.

OpenAPI reference

Quickstart

  1. Create an account.
  2. Mint a key in /keys (the secret is shown once — copy it).
  3. Optionally save a scoring profile in /profiles and attach it to the key.
  4. Call the API with Authorization: Bearer sk_live_*.
cURL
# Sign up + create a key first (admin UI), then:
curl 'https://api.poiscore.com/v1/pois/nearby?lat=48.8584&lng=2.2945&radius_m=2000&limit=10' \
  -H 'Authorization: Bearer sk_live_...' \
  -H 'Accept: application/json'
JavaScript
const res = await fetch(
  'https://api.poiscore.com/v1/pois/nearby?lat=48.8584&lng=2.2945&radius_m=2000',
  { headers: { Authorization: 'Bearer sk_live_...' } },
);
const { data, meta } = await res.json();
data.forEach((p, i) => console.log(`#${i + 1} ${p.name} (${p.scores.final.toFixed(2)})`));

Endpoints

MethodPathWhat it doesAuth
GET/v1/pois/nearbyPOIs within radius_m, ranked by tunable scoringBearer or session
GET/v1/pois/:idSingle POI by idBearer or session
GET/v1/destinationsList seeded destinations with pipeline statusBearer or session
GET/v1/destinations/:idSingle destinationBearer or session
GET/v1/keysList your API keysSession
POST/v1/keysMint a new sk_live_* (secret returned once)Session
DEL/v1/keys/:idRevoke a keySession
GET/v1/profilesList your scoring profilesSession
POST/v1/profilesCreate a profileSession
PUT/v1/profiles/:idUpdate profileSession
DEL/v1/profiles/:idDelete profileSession
GET/v1/usage/meToday + month totals, per-key, recent callsSession

Scoring formula

final = tier_weight[tier]
      × category_boost[category]    (defaults to 1.0)
      × (base_offset + w_fame · fame_score + w_quality · osm_quality)
      × exp(−ST_Distance(loc, target) / τ)

Every coefficient is configurable per request (via query params), per key (via a saved profile), or at run-time (default values from the blueprint). The closer a POI is to your target, the higher its multiplier — but with a long enough τ even far-away iconic POIs surface.

Tiers

TierDefault weightWhat it coversExamples
S5Heritage / iconic (UNESCO, heritage tag, or admin override)Tour Eiffel, Notre-Dame, Westminster Abbey
A3Major attractions, museums, historic, parksMusée Grévin, Brasserie Lipp (heritage)
B1.5Restaurants, cafes, theatres, viewpoints, shoppingCafés, brasseries, smaller museums
C0.8Transport, cinemasMétro stations, bus stations

Categories

All POIs are mapped from OSM tags to one of these canonical categories. Boost or exclude them per profile.

attractionmuseumhistoricparkbeachrestaurantcafenightlifetheatrecinemareligioustheme_parkzooviewpointshoppingtransport

Rate limiting

Each key has a per-day budget (1,000 in dev). Every response carries X-RateLimit-* headers. Past the limit you get an RFC 7807 429.

Errors

All errors follow RFC 7807 (type, title, status, detail, instance). 400 for validation, 401 for missing/invalid auth, 404 for not-found, 429 for quota.