---
name: govinfo-api-ingestion
description: "How to get U.S. GPO GovInfo API data into a pandas DataFrame and Parquet: access, the request, the format, limits, quirks and terms."
---

# Load updated GovInfo Federal Register packages into Parquet

Source entry: https://signal-lab-jet.vercel.app/datasets/govinfo-api
Provider: https://www.govinfo.gov/developers
Checked against the provider's documentation: 2026-11-02

## Access
- Create a free API.data.gov key through the GovInfo signup page.
- Set GOVINFO_API_KEY in the environment; do not put the key in source code.

## Request
```bash
curl --get --data-urlencode 'offsetMark=*' --data-urlencode 'pageSize=100' --data-urlencode "api_key=$GOVINFO_API_KEY" 'https://api.govinfo.gov/collections/FR/2026-10-01T00:00:00Z'
```

## Format
JSON package listings with packageId, title, docClass, dateIssued, lastModified, packageLink, count and cursor-style nextPage metadata.

## Load into pandas and Parquet
Needs Python 3 with requests, pandas and pyarrow.
```python
"""Recently updated GovInfo Federal Register packages -> pandas -> Parquet."""
import os
import requests
import pandas as pd

URL = "https://api.govinfo.gov/collections/FR/2026-10-01T00:00:00Z"
params = {
    "offsetMark": "*",
    "pageSize": 100,
    "api_key": os.environ["GOVINFO_API_KEY"],
}
response = requests.get(URL, params=params, timeout=60)
response.raise_for_status()
payload = response.json()
df = pd.json_normalize(payload["packages"])
for column in ["dateIssued", "lastModified"]:
    df[column] = pd.to_datetime(df[column], utc=True, errors="coerce")
df.to_parquet("govinfo_federal_register_updates.parquet", index=False)
print(len(df), "packages", df["lastModified"].min().isoformat(), "to",
      df["lastModified"].max().isoformat())
```
Not run: it needs a free API key.

## Limits
- Rate limit: 36,000 requests per hour, 1,200 requests per minute and 40 requests per second.
- pageSize has a maximum of 1,000 records.
- Start offsetMark with * and follow the nextPage cursor returned by the API.

## Quirks
- dateIssued is the publication's issue date; lastModified tracks when GovInfo added or updated the package.
- Package and granule schemas vary by collection, and not every package exposes every download format.
- Some ZIP files are generated on request and can return HTTP 503 with a Retry-After header.

## Terms and attribution
- U.S. government works are generally public domain within the United States, but publications can include protected third-party material.
- The API project's CC0 licence applies to the project itself and is not treated here as a blanket licence for every publication exposed through GovInfo.
- Terms page: https://www.govinfo.gov/about/policies#copyright

## Sources
- https://www.govinfo.gov/developers: "Our API is intended to provide data users with a simple means to programmatically access GovInfo content and metadata, which is stored in self-describing packages."
- https://raw.githubusercontent.com/usgpo/api/main/README.md: "36,000 requests per hour (Primary Rate limit)"
- https://raw.githubusercontent.com/usgpo/api/main/README.md: "`pageSize` is limited to **1000** results."
- https://www.govinfo.gov/about/policies: "Government publications may contain copyrighted material which was used with permission of the copyright owner."

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