Score an activity at a place in a window
The core endpoint. One call returns a 0–100 score, a verdict, a per-dimension breakdown and the raw physical readings behind it.
The scoring engine is deterministic: given the same inputs and provider chain, the score is reproducible, and the audit log replays the call.
Overview
Send a location and an activity; an optional time window narrows the score to a specific range. Omit it and the engine scores the current forecast instant. Get back a single suitability score with its full breakdown. The verdict is one of excellent, favorable, fair, marginal, poor, not_feasible or unsafe. A universal hard gate (lightning ≥ 0.85 or hazardous AQI) forces unsafe regardless of the rest; a profile's own feasibility gate (e.g. no rideable wind) forces not_feasible instead — impossible, not dangerous.
Authentication
Include your API key in the X-Goable-Key header. See Authentication for key handling + rotation.
Request
[-90, +90], longitude [-180, +180]. Resolved against the bathymetry catalog for marine activities and the spot catalog for regional calibration.kitesurfing, surfing, windsurfing, sailing, scuba, ski-touring, freeride, paragliding, trail-running, climbing, …POST /v1/score/historical (climatology) or POST /v1/projections (climate).beginner, intermediate, expert. Requests skill-conditioned scoring against the difficulty atlas. Plan-gated to Pro and Scale.Response
audit_log_id on POST /v1/outcomes (or as the :id on POST /v1/score/:id/outcome) to link the observed outcome to this exact forecast, closing the calibration loop.verdict_buckets (every profile in the catalog uses this same set today): excellent 86–100 · favorable 71–85 · fair 51–70 · marginal 31–50 · poor 1–30 · not_feasible< 1 from a feasibility gate (impossible, e.g. no rideable wind — not dangerous) · unsafe< 1 from a safety gate (lightning, hazardous AQI, a profile's own safety threshold).score/verdict came out as they did: forecast (normal path, all gates passed) · gated (a hard safety/feasibility gate tripped — score is forced to 0, but breakdown/physics still show the real conditions) · no_data (no samples). Read this to tell a veto apart from a genuinely poor score — don't infer it from an empty breakdown.[0,1] product of forecast skill (a horizon-decaying prior — higher for a near-term verdict, lower far out, from ≈ 0.90 nowcast to ≈ 0.51 at the 16-day limit), provider agreement, profile maturity, calibration locality, and data coverage. See Confidence detail in the response for the full discriminated union.value in its native unit (wind in knots, wave in metres, temp in °C), a 0–1 suitability, its weight, and contribution (weight × suitability). Names are profile-specific (kitesurfing: wind_speed, wind_direction, wave, visibility, air_temp_comfort, water_temp, sun). prerequisite: true marks a hard feasibility dimension that caps the whole score.beaufort force, wave_power_kw_per_meter). The raw per-dimension readings the score used — wind in knots, wave in metres — live in each breakdown entry's value, not here.code — map your UI, icons and localization off this, not the English description (which is debug copy, not localized) — a level (info · warning · critical), and, on a gate trip, a kind (safety = dangerous · feasibility = impossible-but-not-dangerous).Code samples
Same call, two ways. The TypeScript SDK (@goable-io/sdk) is the most ergonomic; cURL works anywhere.
Try it
Pick an activity, a spot and the option flags. Runs against the live engine (public demo tenant, 60 calls / hour / IP); falls back to a deterministic sample.
Display-only — the real /v1/score request has no option to omit fields; this just trims what's shown here.
Errors
issues field lists each failing path and reason.00:00 UTC.