← bleau.today

API

Public, read-only, no key required. Rate limited per IP; responses are cacheable for ten minutes. Every raw weather variable and every computed metric behind the score is exposed — nothing is held back for the UI.

Interactive OpenAPI docs

The answer

One score for the whole forest, and the five areas behind it (Fontainebleau, Bois le Roi, Milly, Nemours, Buthiers), each scored at its open blocks and its wooded ground. Every endpoint here takes an optional ?area=<slug>, which re-answers it for that area alone: the same model over that area's two profiles rather than all ten. Omit it for the forest. There is no per-sector API: the model does not compute one.

PathReturnsParameters
/api/v1/forest/nowIs it worth going, right now: the score, the verdict and the rock state behind it.area, lang
/api/v1/forest/overviewEverything the front page needs in one call: now, today's headline, windows, the week.area, lang
/api/v1/forest/forecastDay by day, each with its headline sentence, band and commentary.area, days, lang
/api/v1/forest/conditionsThe hourly series: score, stars, status and every computed metric.area, hours_back, hours_forward, lang
/api/v1/forest/windowsSession windows to plan a trip around.area, days, lang

Model internals

The published working. Every constant the score runs on, and whether the service is telling the truth about its own freshness.

PathReturnsParameters
/api/v1/meta/modelEvery constant and weight in the scoring model, plus what each status means.—
/api/v1/healthLiveness and how fresh the data is.—

Example

curl "https://bleau-conditions-api.up.railway.app/api/v1/forest/overview"

# {
#   "scope": "forest",
#   "now": { "scope": "forest", "score": 78.4, "stars": 4.0, "status": "good",
#            "rock_temp_c": 4.2, "dew_spread_c": 6.1, "w_core": 0.08,
#            "air_temp_c": 2.9, "relative_humidity_pct": 61, "cloud_cover_pct": 24,
#            "wind_kmh": 22.4, "wind_direction_deg": 41, "hours_since_rain": 73,
#            "score_shaded": 71.2, "score_open": 79.9,
#            "areas_total": 5, "areas_climbable": 4, "breadth": 0.7,
#            "areas": [{ "slug": "milly", "name": "Milly", "score": 81.0,
#                        "status": "good" }, ... five in all, for the selector ],
#            "drivers": [{ "label": "Drying NE wind at 22 km/h", ... }] },
#   "today": { "headline": "Good until the rain at 16:00",
#              "headline_code": "until_rain", "band": "good",
#              "commentary": ["damp holds", "a bit warm"],
#              "turn_time": "...T14:00Z" },
#   "windows": [{ "start": "...T08:00Z", "end": "...T11:00Z", "label": "morning" }],
#   "days": [ ... one per day for the week ... ]
# }

Status values

good
Dry enough to climb; the score says how good it feels.
marginal
Core still damp. Holds may be fragile — treat the score as an upper bound.
unsafe_wet
Too wet. Score is zero by design, not by measurement. Do not climb.