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 docsThe 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.
| Path | Returns | Parameters |
|---|---|---|
| /api/v1/forest/now | Is it worth going, right now: the score, the verdict and the rock state behind it. | area, lang |
| /api/v1/forest/overview | Everything the front page needs in one call: now, today's headline, windows, the week. | area, lang |
| /api/v1/forest/forecast | Day by day, each with its headline sentence, band and commentary. | area, days, lang |
| /api/v1/forest/conditions | The hourly series: score, stars, status and every computed metric. | area, hours_back, hours_forward, lang |
| /api/v1/forest/windows | Session 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.
| Path | Returns | Parameters |
|---|---|---|
| /api/v1/meta/model | Every constant and weight in the scoring model, plus what each status means. | — |
| /api/v1/health | Liveness 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.