---
name: global-fishing-watch-api-ingestion
description: "How to get Global Fishing Watch APIs data into a pandas DataFrame and Parquet: access, the request, the format, limits, quirks and terms."
---

# Load Global Fishing Watch vessel identity records into pandas and Parquet

Source entry: https://signal-lab-jet.vercel.app/datasets/global-fishing-watch-api
Provider: https://globalfishingwatch.org/our-apis/documentation
Checked against the provider's documentation: 2026-11-04

## Access
- Register for a free non-commercial API token at globalfishingwatch.org/our-apis/tokens.
- Send it as an Authorization: Bearer header; the snippet reads GFW_API_TOKEN.

## Request
```bash
curl -H "Authorization: Bearer $GFW_API_TOKEN" -g 'https://gateway.api.globalfishingwatch.org/v3/vessels/search?query=7831410&datasets[0]=public-global-vessel-identity:latest'
```

## Format
JSON with an entries array of vessel-identity records (ssvid, imo, shipname, flag, geartype, registry matches) and metadata on which registries matched.

## Load into pandas and Parquet
Needs Python 3 with requests, pandas and pyarrow.
```python
"""Global Fishing Watch vessel identity search -> pandas -> Parquet. Needs a free non-commercial API token."""
import os
import requests
import pandas as pd

TOKEN = os.environ["GFW_API_TOKEN"]
URL = "https://gateway.api.globalfishingwatch.org/v3/vessels/search"
params = {"query": "7831410", "datasets[0]": "public-global-vessel-identity:latest"}
r = requests.get(URL, params=params, headers={"Authorization": f"Bearer {TOKEN}"}, timeout=60)
r.raise_for_status()
entries = r.json().get("entries", [])
df = pd.json_normalize(entries, sep=".")
df.to_parquet("gfw_vessel_search.parquet", index=False)
print(len(df), "matching vessel-identity records")
```
Needs a personal API key; not run.

## Limits
- 50,000 requests per day and 1,500,000 per month per user, enforced across all of that user's tokens.
- Exceeding a limit returns HTTP 429 and blocks access for 24 hours (daily) or 30 days (monthly).

## Quirks
- Every v3 endpoint needs the Bearer token, including search and public datasets.
- datasets[] and includes[] use repeated bracketed query parameters, which need an unencoded [ ] request (curl -g).
- Dark-vessel and encounter endpoints are separate from vessel identity search.

## Terms and attribution
- "The Services are available for noncommercial use only in accordance with the CC BY-NC 4.0 license, including complying with the attribution requirements set forth in Section 3 below."
- Attribute as "Powered by Global Fishing Watch." linked to globalfishingwatch.org, or the documented full citation.
- Terms page: https://creativecommons.org/licenses/by-nc/4.0/

## Sources
- https://globalfishingwatch.org/our-apis/documentation/docs/license-rate-limits: "The Services are available for noncommercial use only in accordance with the CC BY-NC 4.0 license, including complying with the attribution requirements set forth in Section 3 below."
- https://globalfishingwatch.org/our-apis/documentation/docs/license-rate-limits: "50,000 requests per day"
- https://globalfishingwatch.org/faqs/can-i-use-global-fishing-watch-apis-for-commercial-purposes/: "At this time, we do not have commercial license and pricing terms available to the general public."

## Help improve this skill
Missing a source, or see something to improve? Call the MCP tool suggest_source or feedback (or POST /api/suggest or /api/feedback). Reviewed ideas: https://signal-lab-jet.vercel.app/agent-suggestions

Information for educational purposes only. Free tiers, limits and licenses belong to the providers and may change; check the provider's own terms before using the data.
