---
title: "EU vessel-density aggregate (European waters)"
method: GET
path: "/api/v2/transport/vessels/density"
tags: ["Transportation"]
---

# EU vessel-density aggregate (European waters)

`GET /api/v2/transport/vessels/density`

Aggregate vessel-density intensity (hours per km2 over the period) for European waters, downsampled to a coarse grid by ship type. This is an aggregate density product, not live positions. Sourced from EMODnet Human Activities (CC BY 4.0) and refreshed monthly by the ingest Function App. Optionally filter the grid by a bbox.

## Query parameters

- `ship_type` 'all' | 'other' | 'fishing' | 'service' | 'dredging' | 'sailing' | 'pleasure' | 'highspeed' | 'tug' | 'passenger' | 'cargo' | 'tanker' | 'military' | 'unknown' — EMODnet ship-type layer (default: all types combined).
- `bbox` string — Optional bounding box minLon,minLat,maxLon,maxLat to filter the grid.

## Response `200`

Coarse density grid with hours/km2 per cell, period, and EMODnet attribution.

- EnvelopeAisDensityData
  - `data` AisDensityData, required — Payload for GET /maritime/vessels/density (LANE-EMODNET). Aggregate density intensity over a multi-month/annual period - NOT live positions. Coverage label is fixed to the honest "European waters density aggregate".
    - `coverage_label` string — Honest coverage label (binding - aggregate, not live).
    - `period` string, required — The aggregate period (e.g. annual-average).
    - `ship_type` string, required — The EMODnet ship-type layer served.
    - `bbox` string, nullable — Echo of the bbox filter applied (minLon,minLat,maxLon,maxLat).
    - `grid` EmodnetCell[], required — Coarse density grid cells (bbox-filtered when bbox given).
      - `lat_bin` number, required — Coarse latitude bin (degrees).
      - `lon_bin` number, required — Coarse longitude bin (degrees).
      - `hours_per_km2` number, required — Vessel-density intensity (hours/km2 over the aggregate period).
    - `sources` AisAttribution[], required — Provenance (EMODnet CC BY 4.0).
      - `source` string, required — Human-readable source label.
      - `license` string, required — License short name.
      - `license_url` string, required — Canonical license deed URL.
      - `attribution_text` string, required — Exact credit string to surface.
      - `modified` boolean, required — True when Sugra transforms the data.
      - `original_url` string, required — Link back to the upstream source page.
  - `meta` SugraMeta, required — Metadata attached to every /api/v1/* response envelope.
    - `endpoint` string, required — Requested endpoint path.
    - `data_time` string, required — ISO 8601 UTC timestamp of the source data, not of the request.
    - `response_time` string, required — ISO 8601 UTC timestamp when this response was produced.
    - `provider` string, required — API name and version.
    - `source` string, nullable — Identifier of the primary upstream source used for this response.
    - `attribution` string, nullable — Human-readable attribution mandated by an upstream source (e.g. a securities regulator or self-regulatory organization). Present only on responses whose source requires the owner and source to be clearly identified. Do not remove or alter it when using the response.
    - `fallback_used` boolean, nullable — True when the primary source failed and a fallback produced the data.
    - `fallback_chain` string[], nullable — Ordered list of sources attempted, in the order they were tried.
    - `cached` boolean, nullable — True when this response was served from the internal cache.
    - `stale` boolean, nullable — True when the cached response was returned after the upstream rate-limited or errored. Clients can use this to detect degraded data.

## Other responses

- `401` — Missing or invalid `x-api-key` header. JSON body with a stable `code` distinguishing `missing_api_key` (no header sent) from `invalid_api_key` (header sent, key not accepted); any other 401 source carries the generic `unauthorized` with its detail as `reason`. Plus `hint`. `plan` is always null on 401 - an unauthenticated request has no plan; quota exhaustion is 429, not 401.
- `422` — Validation Error
- `429` — Daily rate limit exceeded. Check `X-RateLimit-Reset` for the next window.
- `503` — Upstream source is temporarily unavailable. Retry after a short delay.

---

[API](https://skmtc.net/sugra/apis/sugra-api.md) · [All operations](https://skmtc.net/sugra/apis/sugra-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/sugra/sugra-api/versions/4c4530760ba1/schema)
