Next free-source hunt
We check for new free data every weekday.
Datasets / OSINT
docs.openaq.org/

OpenAQ API v3

Freemiumauth: free API keyCustom#osint#air-quality#environmental-monitoring#sensors#api✓ verified Nov 6, 2026

OpenAQ API v3

OpenAQ API v3 is OpenAQ's REST API for global air-quality data, reached at api.openaq.org with endpoints such as /v3/locations. Access needs a free API key (sign up at explore.openaq.org/register) sent in the X-API-Key header; OpenAQ's earlier v1 and v2 APIs were retired on 2025-01-31 (now HTTP 410). OpenAQ's terms say attribution to OpenAQ as the source data is also required, and that because the underlying measurements come from many different data providers under their own licences, users must review and comply with each provider's own terms.

Required Attribution:

Attribution to OpenAQ as the source is required when using OpenAQ services for accessing the data; per-source data-provider attribution/licence terms may also apply. Do not use the official hosted API to build products or services that substantially duplicate or directly compete with OpenAQ's core offerings (restriction applies to the hosted API, not self-hosted or modified open-source instances).

Coverage

Not stated as a country, station or sensor count on the checked pages; v3 is the only live API version after the 2025-01-31 retirement of v1/v2. Querying api.openaq.org/v3/locations without a key returned HTTP 401 on 2026-11-05 (expected; v3 requires a key), while the documentation pages returned HTTP 200.

Verdict

This is a free global air-quality API for agents that need station-level measurements, but only through v3: OpenAQ retired its older v1 and v2 APIs on 2025-01-31, so integrations need the free API key (sign up at explore.openaq.org/register, sent as the X-API-Key header; one key per individual). OpenAQ's terms require attribution to OpenAQ as the source, but the underlying measurements come from many different data providers under their own licences (for example Creative Commons or open-government terms), so users must review and comply with each upstream source's licence rather than treat the dataset as uniformly free; OpenAQ's terms add that it gives no assurance the data is free of third-party claims. OpenAQ's terms also prohibit utilizing the official hosted API "to develop products or services that substantially duplicate or directly compete with OpenAQ’s core offerings"; that restriction "applies specifically to the use of our hosted API service, not to self-hosted instances or modified versions of the open-source code." The free "General use" key is rate-limited to 60 requests a minute and 2,000 an hour, with a custom paid tier for higher-volume use.

Get the free weekly email

Free weekly email of newly verified free data. Unsubscribe by emailing us.

Use in your agent

Query OpenAQ v3 locations with a free API key. Checked against the provider's documentation on Nov 6, 2026.

Raw skill file (/skills/openaq-api.md)Also in our MCP server: call get_ingestion_skill with {"slug": "openaq-api"}.

Access

  • Needs a free API key (sign up at explore.openaq.org/register), read from the OPENAQ_API_KEY environment variable and sent in the X-API-Key header; never hardcode it.
  • v1 and v2 were retired 2025-01-31 (now HTTP 410); only v3 at api.openaq.org is live.

Request

bash
curl -H "X-API-Key: $OPENAQ_API_KEY" 'https://api.openaq.org/v3/locations?limit=100'

Format

JSON response from v3 endpoints (for example /v3/locations); exact result-object schema was not confirmed here since the endpoint was probed without a key.

Load into pandas and Parquet

Needs Python 3 with requests, pandas and pyarrow.

python
"""OpenAQ API v3 locations -> pandas -> Parquet. Needs a free API key in OPENAQ_API_KEY; v1/v2 are retired."""
import os
import requests
import pandas as pd

API_KEY = os.environ["OPENAQ_API_KEY"]
URL = "https://api.openaq.org/v3/locations"
params = {"limit": 100}
r = requests.get(URL, params=params, headers={"X-API-Key": API_KEY}, timeout=60)
r.raise_for_status()
results = r.json().get("results", [])
df = pd.json_normalize(results, sep=".")
df.to_parquet("openaq_locations.parquet", index=False)
print(len(df), "OpenAQ locations")

Needs a personal API key (OPENAQ_API_KEY); not run here.

Limits

  • Free "General use" key: 60 requests/minute, 2,000/hour (from OpenAQ rate-limits plan table); a custom paid tier covers higher use.
  • One API key per individual (terms).

Quirks

  • v1 and v2 are retired (HTTP 410 since 2025-01-31); only v3 is live and it always requires a key.
  • Key goes in the X-API-Key header, read from OPENAQ_API_KEY; never embed a key in code or commit it.

Terms and attribution

  • "Attribution to OpenAQ as the source data is also required when using OpenAQ services for accessing the data."
  • Users "must therefore review and comply with any terms published by data providers" since per-source licences vary (CC, open-government, bespoke).
  • "we provide no assurance that the data provided may be used free of any third-party claims."
  • "However, utilizing our official, hosted API implementation to develop products or services that substantially duplicate or directly compete with OpenAQ’s core offerings is prohibited." "This restriction applies specifically to the use of our hosted API service, not to self-hosted instances or modified versions of the open-source code."
  • "An individual is permitted to register for only one API key."

Sources

Information and education only. Not financial, investment, legal or tax advice. Listings can be inaccurate, incomplete or out of date and are provided "as is". Free tiers, limits and licenses belong to each provider and can change, so check the provider's own terms before you rely on them. Terms & Disclaimer