---
name: smithsonian-gvp-ingestion
description: "How to get Smithsonian Global Volcanism Program data into a pandas DataFrame and Parquet: access, the request, the format, limits, quirks and terms."
---

# Load a Smithsonian GVP volcano sample into pandas and Parquet

Source entry: https://signal-lab-jet.vercel.app/datasets/smithsonian-gvp
Provider: https://volcano.si.edu/database/webservices.cfm
Checked against the provider's documentation: 2026-11-01

## Access
- No account or key. The public WFS supports platform-independent GetFeature requests.
- The provider permits personal, educational and other non-commercial use; commercial use requires prior written permission.

## Request
```bash
curl 'https://webservices.volcano.si.edu/geoserver/GVP-VOTW/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=GVP-VOTW%3ASmithsonian_VOTW_Holocene_Volcanoes&maxFeatures=100&outputFormat=application%2Fjson'
```

## Format
GeoJSON FeatureCollection with point geometry and volcano number, name, landform, type, last eruption year, country, region, summary, coordinates, elevation, tectonic setting and rock type.

## Load into pandas and Parquet
Needs Python 3 with requests, pandas and pyarrow.
```python
"""Smithsonian GVP sample of 100 Holocene volcanoes -> pandas -> Parquet. No key."""
import requests
import pandas as pd

URL = "https://webservices.volcano.si.edu/geoserver/GVP-VOTW/ows"
PARAMS = {
    "service": "WFS",
    "version": "1.0.0",
    "request": "GetFeature",
    "typeName": "GVP-VOTW:Smithsonian_VOTW_Holocene_Volcanoes",
    "maxFeatures": 100,
    "outputFormat": "application/json",
}
r = requests.get(URL, params=PARAMS, timeout=60)
r.raise_for_status()
features = r.json()["features"]
df = pd.DataFrame([feature["properties"] for feature in features])
df["geometry_type"] = [feature["geometry"]["type"] for feature in features]
df["geometry_coordinates"] = [str(feature["geometry"]["coordinates"]) for feature in features]
df.to_parquet("smithsonian_gvp_holocene_volcanoes.parquet", index=False)
print(len(df), "volcanoes", df["Country"].nunique(), "countries",
      "last eruption years", int(df["Last_Eruption_Year"].min()), "to",
      int(df["Last_Eruption_Year"].max()))
```
Run by us on 2026-11-01 (python 3.13.5 | pandas 3.1.0 | pyarrow 26.0.0 | requests 2.34.2). Result: 100 volcanoes 20 countries last eruption years -8300 to 2026

## Limits
- Rate limit: Not stated.
- The example deliberately sets maxFeatures to 100; this is the sample size, not a stated service cap.
- Previous database versions are not available.

## Quirks
- The service exposes separate layers for Holocene volcanoes, Pleistocene volcanoes and Holocene eruptions.
- GeoJSON coordinates are geometry fields; the response also repeats latitude and longitude in feature properties.
- Store the database version and retrieval date because records are revised and old versions are unavailable.

## Terms and attribution
- Personal, educational and other non-commercial use is permitted with the provider's citation and notices preserved.
- Commercial use requires prior written permission from the Smithsonian or the applicable content owner.
- Terms page: https://volcano.si.edu/gvp_termsofuse.cfm

## Sources
- https://volcano.si.edu/database/webservices.cfm: "GVP is using GeoServer software to provide WFS webservices"
- https://volcano.si.edu/database/webservices.cfm: "the WFS options do allow retrieval using CSV, GML, GeoJSON, KML, and Shapefile formats."
- https://volcano.si.edu/gvp_termsofuse.cfm: "You may not use the Content for commercial purposes."
- https://volcano.si.edu/gvp_termsofuse.cfm: "The database compilation is a product of employees of the United States"

## 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.
