{"schema_version":"1.0","audience":"automated agents and LLMs accessing this Zarr store","domain":"ocean","access":{"open":"xarray.open_zarr(store, group='_obs', consolidated=True)","combined_view":"_obs","available_views":["_obs"],"layout":"station × time panel — dims (station, time); latitude/longitude are 1-D coords on station","station_dim":"station","time_coord":"time","lat_coord":"latitude in _obs (lat/lon are aliases there). In a PER-CRUISE group the coords are lat/lon ONLY — ds['latitude'] there is a KeyError.","lon_coord":"longitude in _obs; lon in a per-cruise group","bbox_filter":"select station whose latitude/longitude fall in range, then slice time","entity_groups":"top-level groups not starting with '_' are individual stations/sites/cruises; '_combined' holds cross-entity views","list_entities":"listing groups is a ZARR call, not an xarray one: zarr.open_group(store, mode='r').group_keys() returns the top-level group names. An xarray Dataset has no .group_keys() and no .groups — reaching for either raises AttributeError. List first, then read one with xarray.open_zarr(store, group=<id>).","entity_ids":"expocode-style <PLATFORM><YYYYMMDD> — e.g. 34FM20240623 (Finnmaid, cruise starting 2024-06-23); 34FM/11SS/26RA/58G2 are platform codes","entity_views":["<PLATFORM><YYYYMMDD>"],"open_entity":"xarray.open_zarr(store, group='34FM20240623', consolidated=True)","list_entities_example":"import zarr; keys = list(zarr.open_group(store, mode='r').group_keys()); cruises = [g for g in keys if g.startswith('34FM')]   # one platform's cruises; '34FM' is Finnmaid. bind group_keys() with list(): it is a generator","entity_vs_combined":"for a single named entity open its own group; use the combined view only for cross-entity work. Do NOT locate a named entity by bounding box — match it by id","station_ids":["BE-FOS-Thornton Buoy","BE-SOOP-Simon Stevin","DE-SOOP-Finnmaid","ES-SOOP-CanOA","FR-SOOP-France-Brazil","IT-FOS-MIRAMARE","IT-FOS-PALOMA","IT-FOS-W1M3A","NO-SOOP-G.O.Sars","NO-SOOP-Kronprins Haakon","NO-SOOP-Nuka Arctica","NO-SOOP-Sea-Cargo Express","NO-SOOP-Tukuma Arctica","SE-FOS-Östergarnsholm","UK-FOS-PAP"],"query_params":"station= takes the platform id above (CASE-SENSITIVE); cruise= takes the expocode (34FM20240623). Swapping them answers 400 with the valid id list.","axes":"_obs has THREE axes: obs (4,656,602), cruise (476), station (15). cruise_idx (obs-long) maps obs → cruise; station_idx (cruise-long) maps cruise → station. Nothing maps obs → station directly, and a mask built on one axis cannot index another.","track_lookup":"rows per cruise are CONTIGUOUS — _obs is sorted by (deployment, time). For cruise i: isel(obs=slice(int(obs_start[i]), int(obs_start[i]+obs_count[i]))). A whole ship is the union of its cruises' slices — no boolean mask over 4.6 M rows."},"conventions":{"metadata":"CF-1.12, ACDD-1.3 with a canonical cross-store attribute vocabulary","identity_attrs":["latitude","longitude","elevation","station_id","station_name","network","country","source_doi","citation","collection_doi","license","license_url"],"quality_control":"<var>_QC is an int8 WOCE flag: 2=good, 3=questionable, 4=bad (-1=no source flag). Keep == 2.","reading_string_arrays":"take .values before iterating: for a coord like 'cruise' or a byte-flag array, iterating the DataArray yields 0-d DataArrays, so .startswith()/.decode() fail and a boolean mask can come out silently all-False. Use arr.values (or arr[:].values) first."},"discovery":{"variable_catalog":"variable_catalog.json (sibling of the store directory)","api":"ICOS zarr proxy — GET /variables, /variables/{id}, /query?id=..&station=..&cruise=..&lat_min=..&lat_max=..&lon_min=..&lon_max=..&start=..&end=..&apply_qc=true ; station/cruise ids are CASE-SENSITIVE, end is EXCLUSIVE, apply_qc DROPS rows the store flags bad; for WOCE stores it keeps flag 2 AND the -1 'no source flag' rows, whose values may be NaN — filter *_QC == 2 yourself (unknown/unusable filters answer 400 naming the problem); machine-readable contract at /openapi.json","croissant":"icos-socat.croissant.jsonld (sibling of the store directory)","croissant_url":"ICOS zarr proxy: GET /icos-socat.zarr/croissant — same Croissant, also linked (with @id) from the proxy-root schema.org DataCatalog when fetched with Accept: application/ld+json","collection_doi":""},"docs":["CONVENTIONS.md","CONSUMER_MIGRATION.md"]}