---
name: ooni-measurements-ingestion
description: "How to get OONI Measurement Data and API data into a pandas DataFrame and Parquet: access, the request, the format, limits, quirks and terms."
---

# Load recent OONI measurement metadata into pandas and Parquet

Source entry: https://signal-lab-jet.vercel.app/datasets/ooni-measurements
Provider: https://ooni.org/data/
Checked against the provider's documentation: 2026-11-01

## Access
- No key or account is needed for the public measurement search API.
- Use the public S3 JSONL archive instead of paging through the API for bulk extraction.

## Request
```bash
curl 'https://api.ooni.io/api/v1/measurements?limit=100&order=desc'
```

## Format
JSON object with pagination metadata and result records containing measurement ID and time, probe country and ASN, test name, input, anomaly, confirmation and failure flags, scores and raw-measurement URL.

## Load into pandas and Parquet
Needs Python 3 with requests, pandas and pyarrow.
```python
"""Recent OONI measurement metadata -> pandas -> Parquet. No key."""
import requests
import pandas as pd

URL = "https://api.ooni.io/api/v1/measurements"
params = {"limit": 100, "order": "desc"}
r = requests.get(URL, params=params, timeout=60)
r.raise_for_status()
payload = r.json()
df = pd.json_normalize(payload["results"], sep="_")
df["measurement_start_time"] = pd.to_datetime(df["measurement_start_time"], utc=True)
df.to_parquet("ooni_recent_measurements.parquet", index=False)
print(len(df), "measurements", df["probe_cc"].nunique(), "countries", df["measurement_start_time"].min().isoformat(), "to", df["measurement_start_time"].max().isoformat())
```
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 measurements 2 countries 2026-11-01T17:39:06+00:00 to 2026-11-01T18:14:11+00:00

## Limits
- Rate limit: Not stated.
- A measurement API query cannot span more than 180 days.
- The API is not designed for tens of thousands of measurements or many gigabytes; use the S3 archive for bulk access.

## Quirks
- anomaly means a measurement needs attention; confirmed and failure are separate fields and should not be collapsed into one blocking label.
- Volunteer probe coverage varies sharply by country, ASN, test and date.
- Raw measurements can include tested URLs and can unintentionally include identifying content in headers or metadata.

## Terms and attribution
- Published OONI data is CC BY-NC-SA 4.0.
- Attribute OONI, keep reuse non-commercial, indicate changes and apply ShareAlike terms.
- Terms page: https://github.com/ooni/license/blob/master/data/LICENSE.md

## Sources
- https://raw.githubusercontent.com/ooni/data/main/Readme.md: "Measurements are stored temporarily and then batched together, compressed and uploaded to the S3 bucket once every hour."
- https://raw.githubusercontent.com/ooni/data/main/Readme.md: "the OONI API, is not designed for large data transfers"
- https://raw.githubusercontent.com/ooni/license/master/data/LICENSE.md: "Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License"

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