---
type: "firecrawl-provider"
description: "NOAA Office for Coastal Management / BOEM MarineCadastre AIS vessel traffic archive (USCG NAIS broadcast points) as published in the noaaocm Azure blob container: one csv.zst file per day from 2015 on. Year listings pinned to a publication hash, one-day file descriptors (URL, size, Content-MD5, ETag, Last-Modified) and a bounded preview of the first rows decoded from a 1 MiB range. A file-level hand-off collector: the downstream loader downloads the 200-340 MB files itself."
use_when: "NOAA Office for Coastal Management / BOEM MarineCadastre AIS vessel traffic archive (USCG NAIS broadcast points) as published in the noaaocm Azure blob container: one csv.zst file per day from 2015 on. Year listings pinned to a publication hash, one-day file descriptors (URL, size, Content-MD5, ETag, Last-Modified) and a bounded preview of the first rows decoded from a 1 MiB range. A file-level hand-off collector: the downstream loader downloads the 200-340 MB files itself."
categories: "Public records"
capabilities: 3
credits_per_call: 5
---
# MarineCadastre AIS vessel traffic daily files on Firecrawl Alexandria

NOAA Office for Coastal Management / BOEM MarineCadastre AIS vessel traffic archive (USCG NAIS broadcast points) as published in the noaaocm Azure blob container: one csv.zst file per day from 2015 on. Year listings pinned to a publication hash, one-day file descriptors (URL, size, Content-MD5, ETag, Last-Modified) and a bounded preview of the first rows decoded from a 1 MiB range. A file-level hand-off collector: the downstream loader downloads the 200-340 MB files itself.

- Categories: Public records
- Category index: [Public records category](https://firecrawl.dev/alexandria/agents/categories/public-records)
- Provider key: `marinecadastre-gov`
- Access: Firecrawl credits
- Cost: 5 credits per call

## More

- [Human guide](https://firecrawl.dev/app/alexandria/marinecadastre-gov)
- [OpenAPI spec](https://firecrawl.dev/alexandria/agents/providers/marinecadastre-gov/openapi.json)

## Capabilities

- [Records get](https://firecrawl.dev/alexandria/agents/providers/marinecadastre-gov/vessel-traffic/records_get): One day's file by date: the descriptor from the year listing (URL, size_bytes, Content-MD5, ETag, Last-Modified, publication_id of the year) and, with preview=true, up to 1,000 rows decoded from the first 1 MiB of the file (one Range request; each file is a single non-seekable zstd frame, so only its prefix can be read inside the runner's limits). Rows are typed per the data dictionary: mmsi, base_date_time (UTC), longitude, latitude, sog, cog, heading, vessel_name, imo (IMO-prefixed, often blank), call_sign, vessel_type, status, length, width, draft, cargo, transceiver (A or B); blank is null and IMO is never inferred.
- [Records list](https://firecrawl.dev/alexandria/agents/providers/marinecadastre-gov/vessel-traffic/records_list): The daily files of one year as file records (source_record_id ais:<YYYY-MM-DD>, URL, size_bytes, Content-MD5, ETag, Last-Modified, format csv.zst), paged by offset with a cursor pinned to the year's publication hash. Every page re-reads the year listing (one List Blobs call, under 100 KB) and recomputes the hash; a cursor from another publication fails with invalid_input (issue code publication_changed) instead of mixing versions. Segment key: year.
- [Source status](https://firecrawl.dev/alexandria/agents/providers/marinecadastre-gov/vessel-traffic/source_status): Cheap version check of one year's AIS daily-file listing (default: the newest year the archive has). Returns publication_id = SHA-256 of the sorted (blob name, Content-MD5) pairs of the year's csv.zst files, published_at = the newest Last-Modified, the file count and total bytes, the earliest and latest day, the latest file's descriptor (URL, size, Content-MD5, ETag) and the years the archive holds.

## 1. Choose this provider when

NOAA Office for Coastal Management / BOEM MarineCadastre AIS vessel traffic archive (USCG NAIS broadcast points) as published in the noaaocm Azure blob container: one csv.zst file per day from 2015 on. Year listings pinned to a publication hash, one-day file descriptors (URL, size, Content-MD5, ETag, Last-Modified) and a bounded preview of the first rows decoded from a 1 MiB range. A file-level hand-off collector: the downstream loader downloads the 200-340 MB files itself.

## 2. Minimal request

Call `POST https://api.firecrawl.dev/v2/scrape` with `{ alexandria: { provider, capability, options } }`. For a batch, send `{ alexandria: [...] }` with up to 10 calls.

```json
{
  "provider": "marinecadastre-gov",
  "capability": "vessel-traffic/records_get",
  "options": {
    "date": "2026-06-30",
    "preview": true,
    "preview_rows": 5
  }
}
```

## 3. Add provider options

Use only the options needed for the task:

- `date` (string, required): Day of the file (YYYY-MM-DD, 2015 on). Pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}$. Example: `<date>`
- `preview` (boolean): Decode the first rows from a 1 MiB Range read (default false). Example: `false`
- `preview_rows` (number): Rows to return with preview=true (default 100). Example: `10`

## 4. Request through your preferred interface

### JavaScript

```javascript
const result = await firecrawl.scrape({
  alexandria: {
    provider: "marinecadastre-gov",
    capability: "vessel-traffic/records_get",
    options: {
      date: "2026-06-30",
      preview: true,
      preview_rows: 5,
    },
  },
});
```

### Python

```python
result = firecrawl.scrape_alexandria({
  "provider": "marinecadastre-gov",
  "capability": "vessel-traffic/records_get",
  "options": {
    "date": "2026-06-30",
    "preview": True,
    "preview_rows": 5
  }
})
```

### cURL

```sh
curl https://api.firecrawl.dev/v2/scrape \
  -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "alexandria": {
    "provider": "marinecadastre-gov",
    "capability": "vessel-traffic/records_get",
    "options": {
      "date": "2026-06-30",
      "preview": true,
      "preview_rows": 5
    }
  }
}'
```

### CLI

```sh
firecrawl scrape 'marinecadastre-gov/vessel-traffic/records_get' \
  --options '{"date":"2026-06-30","preview":true,"preview_rows":5}'
```


### MCP

Call the FCX MCP retrieve tool with this object:

```json
{
  "provider": "marinecadastre-gov",
  "capability": "vessel-traffic/records_get",
  "options": {
    "date": "2026-06-30",
    "preview": true,
    "preview_rows": 5
  }
}
```

Ask for only the returned fields needed by the task.

## 5. Full request shape

```json
{
  "provider": "marinecadastre-gov",
  "capability": "vessel-traffic/records_get",
  "options": {
    "date": "2026-06-30",
    "preview": true,
    "preview_rows": 5
  }
}
```

## 6. Response data

The response includes `success`, `provider`, `capability`, `creditsCost` and `data`. This example shows the provider payload in `data`:

```json
{
  "listing_url": "https://noaaocm.blob.core.windows.net/ais?restype=container&comp=list&prefix=csv2/csv2026/",
  "observed_at_ms": 1792357044669,
  "preview": {
    "blocks_decoded": 1,
    "byte_range": "bytes=0-1048575",
    "bytes_fetched": 1048576,
    "columns": [
      "mmsi",
      "base_date_time",
      "longitude",
      "latitude",
      "sog",
      "cog",
      "heading",
      "vessel_name",
      "imo",
      "call_sign",
      "vessel_type",
      "status",
      "length",
      "width",
      "draft",
      "cargo",
      "transceiver"
    ],
    "decoded_bytes": 131072,
    "note": "Rows from the start of the file only (the first minutes of the day); the file is one non-seekable zstd frame, so a bounded prefix is all that can be read here.",
    "row_count": 5,
    "rows": [
      {
        "base_date_time": "2026-06-30 00:00:02",
        "call_sign": "WDG7421",
        "cargo": 60,
        "cog": 345,
        "draft": 2,
        "heading": null,
        "imo": "IMO8678968",
        "latitude": 42.36017,
        "length": 25,
        "longitude": -71.02771,
        "mmsi": "367567110",
        "sog": 0.9,
        "status": 0,
        "transceiver": "A",
        "vessel_name": "CETACEA",
        "vessel_type": 60,
        "width": 9
      },
      {
        "base_date_time": "2026-06-30 00:00:00",
        "call_sign": "WDJ4094",
        "cargo": 31,
        "cog": 274,
        "draft": 6,
        "heading": 91,
        "imo": "IMO9812042",
        "latitude": 26.08248,
        "length": 23,
        "longitude": -80.11531,
        "mmsi": "367774360",
        "sog": 0,
        "status": 0,
        "transceiver": "A",
        "vessel_name": "TRITON",
        "vessel_type": 31,
        "width": 20
      },
      {
        "base_date_time": "2026-06-30 00:00:05",
        "call_sign": "9HA4401",
        "cargo": 80,
        "cog": 333.3,
        "draft": 8.6,
        "heading": 333,
        "imo": "IMO9777931",
        "latitude": 29.45479,
        "length": 250,
        "longitude": -94.8456,
        "mmsi": "249855000",
        "sog": 10.9,
        "status": 0,
        "transceiver": "A",
        "vessel_name": "RYMAN",
        "vessel_type": 80,
        "width": 44
      },
      {
        "base_date_time": "2026-06-30 00:00:04",
        "call_sign": "WDK6647",
        "cargo": 4,
        "cog": 176.9,
        "draft": 3,
        "heading": 33,
        "imo": "IMO8998100",
        "latitude": 30.27314,
        "length": 40,
        "longitude": -88.92797,
        "mmsi": "368076640",
        "sog": 0,
        "status": 0,
        "transceiver": "A",
        "vessel_name": "GO FREEDOM",
        "vessel_type": 4,
        "width": 11
      },
      {
        "base_date_time": "2026-06-30 00:00:03",
        "call_sign": "WDP5910",
        "cargo": 31,
        "cog": 32.3,
        "draft": 3,
        "heading": 34,
        "imo": null,
        "latitude": 39.71492,
        "length": 23,
        "longitude": -79.92183,
        "mmsi": "368367670",
        "sog": 2.7,
        "status": 0,
        "transceiver": "A",
        "vessel_name": "MEGAN AMES",
        "vessel_type": 31,
        "width": 10
      }
    ],
    "rows_decoded": 1228
  },
  "record": {
    "content_md5": "tI+sGM6M7AfavIFWG0Rt5Q==",
    "date": "2026-06-30",
    "etag": "0x8DF15BB86CF2EB4",
    "format": "csv.zst",
    "last_modified": "2026-09-18T19:32:07Z",
    "publication_id": "62d2396992c1c9a4b49c378d5b81acde5bb5cef5431135f4b371467caacc41b2",
    "retrieved_at": "2026-10-18T20:57:24Z",
    "size_bytes": 321337372,
    "source_record_id": "ais:2026-06-30",
    "source_url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-06-30.csv.zst",
    "url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-06-30.csv.zst",
    "year": 2026
  },
  "source_url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-06-30.csv.zst"
}
```

## API reference-derived contract

The following capability contract is generated from the same normalized Alexandria API reference exposed in the API spec.

### Records get

- Capability: `vessel-traffic/records_get`
- Description: One day's file by date: the descriptor from the year listing (URL, size_bytes, Content-MD5, ETag, Last-Modified, publication_id of the year) and, with preview=true, up to 1,000 rows decoded from the first 1 MiB of the file (one Range request; each file is a single non-seekable zstd frame, so only its prefix can be read inside the runner's limits). Rows are typed per the data dictionary: mmsi, base_date_time (UTC), longitude, latitude, sog, cog, heading, vessel_name, imo (IMO-prefixed, often blank), call_sign, vessel_type, status, length, width, draft, cargo, transceiver (A or B); blank is null and IMO is never inferred.
- Instructions: Fetch one day's descriptor before downloading it, or look at the first minutes of a day's traffic. The preview is a sample of the start of the day, not of the whole day.
- Cost: 5 credits per call
- Capability file: [Records get](https://firecrawl.dev/alexandria/agents/providers/marinecadastre-gov/vessel-traffic/records_get)

Accepted options:
- `date` (string, required): Day of the file (YYYY-MM-DD, 2015 on). Pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}$. Example: `<date>`
- `preview` (boolean): Decode the first rows from a 1 MiB Range read (default false). Example: `false`
- `preview_rows` (number): Rows to return with preview=true (default 100). Example: `10`

Response schema example:
```json
{
  "listing_url": "https://noaaocm.blob.core.windows.net/ais?restype=container&comp=list&prefix=csv2/csv2026/",
  "observed_at_ms": 1792357044669,
  "preview": {
    "blocks_decoded": 1,
    "byte_range": "bytes=0-1048575",
    "bytes_fetched": 1048576,
    "columns": [
      "mmsi",
      "base_date_time",
      "longitude",
      "latitude",
      "sog",
      "cog",
      "heading",
      "vessel_name",
      "imo",
      "call_sign",
      "vessel_type",
      "status",
      "length",
      "width",
      "draft",
      "cargo",
      "transceiver"
    ],
    "decoded_bytes": 131072,
    "note": "Rows from the start of the file only (the first minutes of the day); the file is one non-seekable zstd frame, so a bounded prefix is all that can be read here.",
    "row_count": 5,
    "rows": [
      {
        "base_date_time": "2026-06-30 00:00:02",
        "call_sign": "WDG7421",
        "cargo": 60,
        "cog": 345,
        "draft": 2,
        "heading": null,
        "imo": "IMO8678968",
        "latitude": 42.36017,
        "length": 25,
        "longitude": -71.02771,
        "mmsi": "367567110",
        "sog": 0.9,
        "status": 0,
        "transceiver": "A",
        "vessel_name": "CETACEA",
        "vessel_type": 60,
        "width": 9
      },
      {
        "base_date_time": "2026-06-30 00:00:00",
        "call_sign": "WDJ4094",
        "cargo": 31,
        "cog": 274,
        "draft": 6,
        "heading": 91,
        "imo": "IMO9812042",
        "latitude": 26.08248,
        "length": 23,
        "longitude": -80.11531,
        "mmsi": "367774360",
        "sog": 0,
        "status": 0,
        "transceiver": "A",
        "vessel_name": "TRITON",
        "vessel_type": 31,
        "width": 20
      },
      {
        "base_date_time": "2026-06-30 00:00:05",
        "call_sign": "9HA4401",
        "cargo": 80,
        "cog": 333.3,
        "draft": 8.6,
        "heading": 333,
        "imo": "IMO9777931",
        "latitude": 29.45479,
        "length": 250,
        "longitude": -94.8456,
        "mmsi": "249855000",
        "sog": 10.9,
        "status": 0,
        "transceiver": "A",
        "vessel_name": "RYMAN",
        "vessel_type": 80,
        "width": 44
      },
      {
        "base_date_time": "2026-06-30 00:00:04",
        "call_sign": "WDK6647",
        "cargo": 4,
        "cog": 176.9,
        "draft": 3,
        "heading": 33,
        "imo": "IMO8998100",
        "latitude": 30.27314,
        "length": 40,
        "longitude": -88.92797,
        "mmsi": "368076640",
        "sog": 0,
        "status": 0,
        "transceiver": "A",
        "vessel_name": "GO FREEDOM",
        "vessel_type": 4,
        "width": 11
      },
      {
        "base_date_time": "2026-06-30 00:00:03",
        "call_sign": "WDP5910",
        "cargo": 31,
        "cog": 32.3,
        "draft": 3,
        "heading": 34,
        "imo": null,
        "latitude": 39.71492,
        "length": 23,
        "longitude": -79.92183,
        "mmsi": "368367670",
        "sog": 2.7,
        "status": 0,
        "transceiver": "A",
        "vessel_name": "MEGAN AMES",
        "vessel_type": 31,
        "width": 10
      }
    ],
    "rows_decoded": 1228
  },
  "record": {
    "content_md5": "tI+sGM6M7AfavIFWG0Rt5Q==",
    "date": "2026-06-30",
    "etag": "0x8DF15BB86CF2EB4",
    "format": "csv.zst",
    "last_modified": "2026-09-18T19:32:07Z",
    "publication_id": "62d2396992c1c9a4b49c378d5b81acde5bb5cef5431135f4b371467caacc41b2",
    "retrieved_at": "2026-10-18T20:57:24Z",
    "size_bytes": 321337372,
    "source_record_id": "ais:2026-06-30",
    "source_url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-06-30.csv.zst",
    "url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-06-30.csv.zst",
    "year": 2026
  },
  "source_url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-06-30.csv.zst"
}
```

### Records list

- Capability: `vessel-traffic/records_list`
- Description: The daily files of one year as file records (source_record_id ais:<YYYY-MM-DD>, URL, size_bytes, Content-MD5, ETag, Last-Modified, format csv.zst), paged by offset with a cursor pinned to the year's publication hash. Every page re-reads the year listing (one List Blobs call, under 100 KB) and recomputes the hash; a cursor from another publication fails with invalid_input (issue code publication_changed) instead of mixing versions. Segment key: year.
- Instructions: Collect the full current list of daily files for a year, then hand the URLs and hashes to a downloader.
- Cost: 5 credits per call
- Capability file: [Records list](https://firecrawl.dev/alexandria/agents/providers/marinecadastre-gov/vessel-traffic/records_list)

Accepted options:
- `continuation` (string): Opaque cursor from the previous page's meta.page.next_cursor. It pins the publication; when the year was rewritten since, the call fails with invalid_input at /continuation (issue code publication_changed). Example: `<continuation>`
- `page_size` (number): Records per page (default 100; a year has at most 366). Example: `10`
- `year` (number, required): Year of the listing (csv2/csv<year>/). 2015 to the current archive year. Example: `2015`

Response schema example:
```json
{
  "count": 5,
  "file_count": 181,
  "has_more": true,
  "listing_url": "https://noaaocm.blob.core.windows.net/ais?restype=container&comp=list&prefix=csv2/csv2026/",
  "next_offset": 5,
  "observed_at_ms": 1792357040551,
  "offset": 0,
  "publication_id": "62d2396992c1c9a4b49c378d5b81acde5bb5cef5431135f4b371467caacc41b2",
  "published_at": "2026-09-18T19:32:18Z",
  "records": [
    {
      "content_md5": "6Vk0mPWps/kXSdc3QQUHoA==",
      "date": "2026-01-01",
      "etag": "0x8DF0376C82806C2",
      "format": "csv.zst",
      "last_modified": "2026-08-26T13:34:40Z",
      "publication_id": "62d2396992c1c9a4b49c378d5b81acde5bb5cef5431135f4b371467caacc41b2",
      "retrieved_at": "2026-10-18T20:57:20Z",
      "size_bytes": 239242075,
      "source_record_id": "ais:2026-01-01",
      "source_url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-01-01.csv.zst",
      "url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-01-01.csv.zst",
      "year": 2026
    },
    {
      "content_md5": "JRR2T15g9Ggno+avctMDsQ==",
      "date": "2026-01-02",
      "etag": "0x8DF037737444A71",
      "format": "csv.zst",
      "last_modified": "2026-08-26T13:37:47Z",
      "publication_id": "62d2396992c1c9a4b49c378d5b81acde5bb5cef5431135f4b371467caacc41b2",
      "retrieved_at": "2026-10-18T20:57:20Z",
      "size_bytes": 216686919,
      "source_record_id": "ais:2026-01-02",
      "source_url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-01-02.csv.zst",
      "url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-01-02.csv.zst",
      "year": 2026
    },
    {
      "content_md5": "0/oivOc45vHug6lCNgSs5A==",
      "date": "2026-01-03",
      "etag": "0x8DF037735397A5A",
      "format": "csv.zst",
      "last_modified": "2026-08-26T13:37:43Z",
      "publication_id": "62d2396992c1c9a4b49c378d5b81acde5bb5cef5431135f4b371467caacc41b2",
      "retrieved_at": "2026-10-18T20:57:20Z",
      "size_bytes": 236611848,
      "source_record_id": "ais:2026-01-03",
      "source_url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-01-03.csv.zst",
      "url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-01-03.csv.zst",
      "year": 2026
    },
    {
      "content_md5": "P1odLE3Q3f5GK+4D4j5Amw==",
      "date": "2026-01-04",
      "etag": "0x8DF037738501D1E",
      "format": "csv.zst",
      "last_modified": "2026-08-26T13:37:49Z",
      "publication_id": "62d2396992c1c9a4b49c378d5b81acde5bb5cef5431135f4b371467caacc41b2",
      "retrieved_at": "2026-10-18T20:57:20Z",
      "size_bytes": 231717334,
      "source_record_id": "ais:2026-01-04",
      "source_url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-01-04.csv.zst",
      "url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-01-04.csv.zst",
      "year": 2026
    },
    {
      "content_md5": "ZkuzUOALjoHARNKzfZRQ7A==",
      "date": "2026-01-05",
      "etag": "0x8DF037737F9103E",
      "format": "csv.zst",
      "last_modified": "2026-08-26T13:37:48Z",
      "publication_id": "62d2396992c1c9a4b49c378d5b81acde5bb5cef5431135f4b371467caacc41b2",
      "retrieved_at": "2026-10-18T20:57:20Z",
      "size_bytes": 232824070,
      "source_record_id": "ais:2026-01-05",
      "source_url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-01-05.csv.zst",
      "url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-01-05.csv.zst",
      "year": 2026
    }
  ],
  "source_url": "https://hub.marinecadastre.gov/pages/vesseltraffic",
  "year": 2026
}
```

### Source status

- Capability: `vessel-traffic/source_status`
- Description: Cheap version check of one year's AIS daily-file listing (default: the newest year the archive has). Returns publication_id = SHA-256 of the sorted (blob name, Content-MD5) pairs of the year's csv.zst files, published_at = the newest Last-Modified, the file count and total bytes, the earliest and latest day, the latest file's descriptor (URL, size, Content-MD5, ETag) and the years the archive holds.
- Instructions: Before records_list, to learn which years and days exist and to pin a publication; or on a cadence to detect a batch rewrite (the publisher rewrites whole years months after the fact).
- Cost: 5 credits per call
- Capability file: [Source status](https://firecrawl.dev/alexandria/agents/providers/marinecadastre-gov/vessel-traffic/source_status)

Accepted options:
- `year` (number): Year of the listing (csv2/csv<year>/). Default: the newest year prefix in the container. Example: `2015`

Response schema example:
```json
{
  "earliest_date": "2026-01-01",
  "file_count": 181,
  "hash_source": "sha256_of_sorted_name_md5_pairs",
  "index_url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/index.html",
  "latest_date": "2026-06-30",
  "latest_file": {
    "content_md5": "tI+sGM6M7AfavIFWG0Rt5Q==",
    "date": "2026-06-30",
    "etag": "0x8DF15BB86CF2EB4",
    "format": "csv.zst",
    "last_modified": "2026-09-18T19:32:07Z",
    "publication_id": "62d2396992c1c9a4b49c378d5b81acde5bb5cef5431135f4b371467caacc41b2",
    "retrieved_at": "2026-10-18T20:57:14Z",
    "size_bytes": 321337372,
    "source_record_id": "ais:2026-06-30",
    "source_url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-06-30.csv.zst",
    "url": "https://noaaocm.blob.core.windows.net/ais/csv2/csv2026/ais-2026-06-30.csv.zst",
    "year": 2026
  },
  "listing_url": "https://noaaocm.blob.core.windows.net/ais?restype=container&comp=list&prefix=csv2/csv2026/",
  "observed_at_ms": 1792357034095,
  "publication_id": "62d2396992c1c9a4b49c378d5b81acde5bb5cef5431135f4b371467caacc41b2",
  "published_at": "2026-09-18T19:32:18Z",
  "source_url": "https://hub.marinecadastre.gov/pages/vesseltraffic",
  "total_size_bytes": 44079937079,
  "year": 2026,
  "years_available": [
    2015,
    2016,
    2017,
    2018,
    2019,
    2020,
    2021,
    2022,
    2023,
    2024,
    2025,
    2026
  ]
}
```
