{"openapi": "3.0.3", "info": {"title": "Enviromarine Public Observations API", "version": "0.2.0", "description": "Free read-only snapshots of consented, reviewed marine observations. Exact positions may be delayed. Synthetic reports and private identifiers are excluded. Configure an approved HTTPS server URL for FreeMCP catalog review."}, "servers": [{"url": "/"}], "paths": {"/api/v1/observations/": {"get": {"operationId": "get_marine_observations", "summary": "Read recent approved marine observations", "description": "Returns at most 100 latest matching observations. A snapshot, not paginated history. Coordinates are exact and released with provider permission. This operation does not mutate state or require credentials. Automated checks are not instrument certification. No results does not imply benign weather.", "security": [], "parameters": [{"name": "hours", "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 168, "default": 24}}, {"name": "limit", "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 100, "default": 100}}, {"name": "bbox", "in": "query", "description": "Optional WGS84 west,south,east,north. west < east and south < north; split antimeridian-crossing queries.", "schema": {"type": "string"}, "example": "-12,50,-4,56"}], "responses": {"200": {"description": "Approved observations; results can be empty", "content": {"application/json": {"schema": {"type": "object", "properties": {"data_mode": {"type": "string", "enum": ["published"]}, "generated_at": {"type": "string", "format": "date-time"}, "count": {"type": "integer"}, "limit": {"type": "integer"}, "window_hours": {"type": "integer"}, "units": {"type": "object", "additionalProperties": {"type": "string"}}, "notice": {"type": "string"}, "results": {"type": "array", "items": {"type": "object", "required": ["id", "observed_at", "received_at", "latitude", "longitude", "age_seconds", "source_type", "quality", "quality_flags", "attribution", "licence", "measurements"], "properties": {"id": {"type": "string", "format": "uuid"}, "observed_at": {"type": "string", "format": "date-time"}, "received_at": {"type": "string", "format": "date-time"}, "latitude": {"type": "number", "minimum": -90, "maximum": 90}, "longitude": {"type": "number", "minimum": -180, "maximum": 180}, "age_seconds": {"type": "integer", "minimum": 0}, "source_type": {"type": "string"}, "quality": {"type": "string", "enum": ["automated_checks_passed"]}, "quality_flags": {"type": "array", "items": {"type": "string"}}, "attribution": {"type": "string"}, "licence": {"type": "string", "enum": ["CC-BY-4.0"]}, "measurements": {"type": "object", "properties": {"air_temperature_c": {"type": "number", "nullable": true, "description": "Air temperature, degrees Celsius"}, "sea_surface_temperature_c": {"type": "number", "nullable": true, "description": "Sea surface temperature, degrees Celsius"}, "pressure_hpa": {"type": "number", "nullable": true, "description": "Pressure as reported, hPa; verify source reduction metadata before comparison"}, "relative_humidity_pct": {"type": "number", "nullable": true, "description": "Relative humidity, percent"}, "wind_speed_ms": {"type": "number", "nullable": true, "description": "Reported wind speed, m/s; sensor reference-frame verification is part of release review"}, "wind_gust_ms": {"type": "number", "nullable": true, "description": "Reported gust, m/s"}, "wind_direction_deg": {"type": "number", "nullable": true, "description": "Wind from direction relative to true north, degrees"}, "wave_height_m": {"type": "number", "nullable": true, "description": "Reported wave height, metres"}, "wave_period_s": {"type": "number", "nullable": true, "description": "Reported wave period, seconds"}, "visibility_m": {"type": "number", "nullable": true, "description": "Reported visibility, metres"}}}, "instrument": {"type": "object", "description": "Optional instrument passport supplied by the contributor; not certification.", "properties": {"manufacturer": {"type": "string"}, "model": {"type": "string"}, "wind_reference": {"type": "string"}, "pressure_reference": {"type": "string"}, "height_m": {"type": "number", "nullable": true}, "calibration_date": {"type": "string", "format": "date", "nullable": true}}}, "transport": {"type": "string"}, "publication_delay_hours": {"type": "integer", "enum": [0, 6, 24, 72]}}}}}}}}}, "400": {"description": "Invalid bounds or parameters"}, "429": {"description": "Client request limit exceeded"}}}}, "/api/v1/coverage/": {"get": {"operationId": "get_marine_coverage", "summary": "Read observed coastal grid cells", "description": "Derived exclusively from the same bounded public observation snapshot. No forecast, extrapolation, private fleet access or mutation. Empty results mean no returned evidence.", "security": [], "parameters": [{"name": "hours", "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 168, "default": 24}}, {"name": "limit", "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 100, "default": 100}}, {"name": "bbox", "in": "query", "description": "Optional WGS84 west,south,east,north. west < east and south < north; split antimeridian-crossing queries.", "schema": {"type": "string"}, "example": "-12,50,-4,56"}], "responses": {"200": {"description": "Approved observations; results can be empty", "content": {"application/json": {"schema": {"type": "object", "properties": {"data_mode": {"type": "string", "enum": ["published"]}, "cell_degrees": {"type": "number"}, "scope": {"type": "string"}, "observation_count": {"type": "integer"}, "notice": {"type": "string"}, "cells": {"type": "array", "items": {"type": "object", "properties": {"bbox": {"type": "array", "minItems": 4, "maxItems": 4, "items": {"type": "number"}}, "reports": {"type": "integer"}, "latest_at": {"type": "string", "format": "date-time"}}}}}}}}}, "400": {"description": "Invalid bounds or parameters"}, "429": {"description": "Client request limit exceeded"}}}}, "/api/v1/briefing/": {"get": {"operationId": "get_marine_briefing", "summary": "Read regional observed ranges and evidence IDs", "description": "Derived exclusively from the same bounded public observation snapshot. No forecast, extrapolation, private fleet access or mutation. Empty results mean no returned evidence.", "security": [], "parameters": [{"name": "hours", "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 168, "default": 24}}, {"name": "limit", "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 100, "default": 100}}, {"name": "bbox", "in": "query", "description": "Optional WGS84 west,south,east,north. west < east and south < north; split antimeridian-crossing queries.", "schema": {"type": "string"}, "example": "-12,50,-4,56"}], "responses": {"200": {"description": "Approved observations; results can be empty", "content": {"application/json": {"schema": {"type": "object", "properties": {"data_mode": {"type": "string", "enum": ["published"]}, "observations": {"type": "integer"}, "ranges": {"type": "object", "additionalProperties": {"type": "object", "nullable": true, "properties": {"min": {"type": "number"}, "max": {"type": "number"}, "reports": {"type": "integer"}}}}, "freshest_at": {"type": "string", "format": "date-time", "nullable": true}, "oldest_at": {"type": "string", "format": "date-time", "nullable": true}, "coverage_cells": {"type": "integer"}, "evidence_ids": {"type": "array", "items": {"type": "string", "format": "uuid"}}, "notice": {"type": "string"}}}}}}, "400": {"description": "Invalid bounds or parameters"}, "429": {"description": "Client request limit exceeded"}}}}}}