历史空气质量 API 接入文档air-history
按城市 + 年月查询历史空气质量档案:逐日 AQI 与六项污染物(PM2.5/PM10/SO₂/NO₂/CO/O₃)浓度、空气质量等级、首要污染物、全国排名,并给出月度汇总(均值、最佳/最差日、优良天数分布)。 可查范围 2013 年 1 月至当前月,覆盖全国主要城市。首要污染物按国标 HJ 633-2012 IAQI 分指数计算。数据仅供参考。
1. 基本信息
| 接口地址 | https://v1.apizero.cn/api/air-history |
|---|---|
| 请求方法 | POST |
| 分类 | life |
| 提供方 | 极数本源 |
| 计费模式 | 免费试用 |
| 单次消耗 | 0 积分 |
| 起步价 | — |
| QPS 限制 | 5 req/s |
| 每日免费额度 | 50 次(已认证用户) |
| 匿名每日额度 | 5 次(无 API Key) |
| VIP 免费 | 是 |
| 调用次数 |
2. 认证
匿名可调用(每日 5 次);登录后每日 50 次免费,超出按 ¥0.01/次 从余额扣费,开通会员可免费不限量。
获取 API Key:登录 https://apizero.cn/account/keys
3. 请求参数
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
city | string | 是 | 城市中文名 | 北京 |
month | string | 是 | 年月,格式 YYYYMM,可查 2013-01 至当前月 | 202503 |
4. 请求头
| Header | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
Authorization | string | 否 | Bearer <你的 API Key>(登录调用可提升额度/享会员免费;匿名可不传) | — |
Content-Type | string | 否 | 请求体格式 | — |
5. 请求示例
以下 5 种语言示例都是可直接运行的,只需把 YOUR_API_KEY 替换为实际 Key。
cURL
curl -X POST "https://v1.apizero.cn/api/air-history" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"city": "北京",
"month": "202503"
}'Python
import requests
resp = requests.request(
"POST",
"https://v1.apizero.cn/api/air-history",
headers={"X-Api-Key": "YOUR_API_KEY", "Content-Type": "application/json"},
json={
"city": "北京",
"month": "202503",
},
timeout=15,
)
resp.raise_for_status()
print(resp.json())JavaScript (Node.js)
// Node.js 18+ / 浏览器原生 fetch
const res = await fetch("https://v1.apizero.cn/api/air-history", {
method: "POST",
headers: {
"X-Api-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"city": "北京",
"month": "202503"
}),
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
console.log(data);Go
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
body := []byte(`{"city":"北京","month":"202503"}`)
req, _ := http.NewRequest("POST", "https://v1.apizero.cn/api/air-history", bytes.NewBuffer(body))
req.Header.Set("X-Api-Key", "YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil { panic(err) }
defer resp.Body.Close()
out, _ := io.ReadAll(resp.Body)
fmt.Println(string(out))
}PHP
<?php
$payload = json_encode([
"city" => "北京",
"month" => "202503",
], JSON_UNESCAPED_UNICODE);
$ch = curl_init("https://v1.apizero.cn/api/air-history");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => [
"X-Api-Key: YOUR_API_KEY",
"Content-Type: application/json",
],
CURLOPT_TIMEOUT => 15,
]);
$body = curl_exec($ch);
curl_close($ch);
$data = json_decode($body, true);
print_r($data);6. 响应字段
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
meta.city | string | 城市名称 | — |
meta.month | string | 查询年月(YYYYMM) | — |
meta.month_format | string | 年月中文格式 | — |
meta.total_days | number | 当月有效监测天数 | — |
units | object | 各指标单位说明 | — |
summary.aqi_avg | number | 月度平均 AQI | — |
summary.aqi_avg_level | string | 平均 AQI 对应等级 | — |
summary.pm2_5_avg | number | PM2.5 月均值(其余污染物同理) | — |
summary.best_day | object | 空气最佳日 {date, aqi, level} | — |
summary.worst_day | object | 空气最差日 {date, aqi, level} | — |
summary.days_distribution | object | 优/良/轻度/中度/重度/严重 天数分布 | — |
summary.overall_text | string | 月度概览文字 | — |
daily | array | 逐日明细列表 | — |
daily[].date | string | 日期 | — |
daily[].aqi | number | 当日 AQI | — |
daily[].level | string | 空气质量等级 | — |
daily[].primary_pollutant | string | 首要污染物(AQI≤50 为「无」) | — |
daily[].rank | number | 当日全国城市排名(无则 null) | — |
daily[].pollutants | object | 六项污染物浓度 {pm2_5,pm10,so2,no2,co,o3} | — |
7. 响应示例
{
"code": 0,
"msg": "成功",
"data": {
"meta": {"city": "北京", "month": "202412", "month_format": "2024年12月", "total_days": 31},
"summary": {"aqi_avg": 58.3, "aqi_avg_level": "良", "best_day": {"date": "2024-12-05", "aqi": 28, "level": "优"}, "worst_day": {"date": "2024-12-20", "aqi": 168, "level": "中度污染"}, "days_distribution": {"excellent": 8, "good": 18, "light": 3, "medium": 2, "heavy": 0, "severe": 0}},
"daily": [{"date": "2024-12-01", "aqi": 53, "level": "良", "primary_pollutant": "细颗粒物(PM2.5)", "rank": 123, "pollutants": {"pm2_5": 26, "pm10": 55, "so2": 4, "no2": 35, "co": 0.5, "o3": 52}}]
},
"request_id": "abc123"
}8. 错误码
| code | status | 说明 |
|---|---|---|
4000 | VALIDATION_ERROR | 参数缺失/格式错误,或该城市·月份无数据 |
4022 | INSUFFICIENT_BALANCE | 余额不足(登录用户超免费额度后) |
5020 | UPSTREAM_ERROR | 空气质量数据服务暂不可用 |
5021 | UPSTREAM_INVALID | 空气质量数据解析失败 |
9. 变更日志
- v1.0(2026-07-02)
- 首次上线:逐日 AQI 与六项污染物、首要污染物(国标 IAQI)、全国排名、月度汇总。
常见问题
历史空气质量 接口怎么免费使用?
未登录用户每个 IP 每天 5 次免费。登录用户创建 API Key 后每天 50 次免费,超额部分按点数计费(0 点/次)。
历史空气质量 支持哪些调用方式?
接口使用 POST 请求。文档提供 cURL、Python、JavaScript (Node.js)、Go、PHP 五种语言的可运行示例。也可以下载 /openapi.json 导入 Postman / Insomnia / Apifox 反向生成 SDK。
调用不限额么? QPS 是多少?
本接口 QPS 限制 5 req/s,每个 API Key 每日免费 50 次。需要更高额度可升级 VIP 套餐或联系售后提高 QPS。
这个接口跟自己直连上游有什么区别?
极数本源 作为中间层提供:统一鉴权(一个 Key 调所有接口)、统一计费(点数制)、统一限流、统一错误码、多上游自动切换。免去逐个对接上游、维护 Key、统计调用量的运维成本。