今日油价涨跌幅怎么查?查询行情接入点的调价日与涨跌率用法
约 13 分钟 进阶今日油价涨跌幅调价日查询行情
# 今日油价涨跌幅怎么查?查询行情接入点的调价日与涨跌率用法
接口/接入点:今日油价(apiCode=138)· 查询行情(138-49) · 免费 · POST/GET · JSON · 适用人群:车主产品开发者、公众号运营 · 阅读时间:约 6 分钟 · 最后实测核对:2026-09-18
查询油价(138-46)只给当前价格,不带涨跌。想知道「这次涨了多少」「下次什么时候调」,要用查询行情(138-49)。这个接入点的 `prov` 是必填。
## 核心要点
- 查询行情(138-49)返回全部 8 个标号的涨跌对象,不只 `p0`(2026-09-18 实测返回 `p0`、`p89`、`p90`、`p92`、`p93`、`p95`、`p97`、`p98`)。
- `next_change_time` 与 `before_change_time` 是 `yyyyMMdd` 格式的字符串,实测北京、广西、重庆、吉林四省取值一致。
- 标号对象里 `change` 不带单位,`change_percent` 带 `%` 后缀,两者都需要转换后才能计算。
## 接口速览
| 项 | 说明 |
|---|---|
| 接入点 | 查询行情(138-49) |
| 请求地址 | `https://route.showapi.com/138-49` |
| 请求方式 | POST / GET |
| 业务参数 | `prov`(省名,必填) |
| 返回重点 | 8 个标号的涨跌对象 + 最近一次与下一次调价日 |
| 计费 | 免费服务,按平台档位限制调用量,`prov` 缺失时不产生计费 |
## 返回结构
2026-09-18 实测(`prov=北京`,省略了部分标号):
```json
{
"showapi_res_code": 0,
"showapi_fee_num": 1,
"showapi_res_body": {
"ret_code": 0,
"prov": "北京",
"p0": { "change_before_price": "7.81", "price": "8.02", "change": "0.21", "change_percent": "2.689%" },
"p89": { "change_before_price": "7.57", "price": "7.76", "change": "0.19", "change_percent": "2.51%" },
"p92": { "change_before_price": "8.09", "price": "8.29", "change": "0.2", "change_percent": "2.472%" },
"p95": { "change_before_price": "8.61", "price": "8.83", "change": "0.22", "change_percent": "2.555%" },
"p98": { "change_before_price": "10.11", "price": "10.33", "change": "0.22", "change_percent": "2.176%" },
"before_change_time": "20260912",
"next_change_time": "20260925"
}
}
```
| 字段 | 类型 | 含义 |
|---|---|---|
| `prov` | String | 省份名称 |
| `ret_code` | Number | 业务层状态码,0 成功 |
| `<标号>.price` | String | 当前价格 |
| `<标号>.change_before_price` | String | 上一次价格 |
| `<标号>.change` | String | 涨跌值,不带单位 |
| `<标号>.change_percent` | String | 涨跌率,带 `%` 后缀 |
| `before_change_time` | String | 最近一次调价日,`yyyyMMdd` |
| `next_change_time` | String | 下一次调价日,`yyyyMMdd` |
`change` 为负表示下调。当前这批数据 8 个标号的 `change` 都是正数,页面文案按符号分支处理即可。
## 调价日怎么用
两个日期字段的格式是 `yyyyMMdd`,没有分隔符,直接交给日期库解析容易失败,先切片再拼。
Python(requests):
```python
import requests
from datetime import date, datetime
resp = requests.post(
"https://route.showapi.com/138-49",
data={"appKey": "YOUR_APPKEY", "prov": "北京"},
timeout=5,
).json()
if resp.get("showapi_res_code") != 0:
raise RuntimeError(resp.get("showapi_res_error"))
body = resp["showapi_res_body"]
if body.get("ret_code") != 0:
raise RuntimeError(body.get("remark"))
def parse_ymd(raw):
"""yyyyMMdd -> date"""
return datetime.strptime(raw, "%Y%m%d").date()
before = parse_ymd(body["before_change_time"])
nxt = parse_ymd(body["next_change_time"])
print(f"最近调价:{before},下次调价:{nxt},还有 {(nxt - date.today()).days} 天")
p0 = body["p0"]
delta = float(p0["change"])
arrow = "上调" if delta > 0 else ("下调" if delta < 0 else "持平")
print(f"0号柴油 {p0['price']} 元/升,{arrow} {abs(delta)},涨跌率 {p0['change_percent']}")
# 遍历全部标号,跳过没有数据的
for code in ["p89", "p92", "p95", "p98"]:
item = body[code]
if not item["price"]:
continue
print(f"{code} 当前 {item['price']},涨跌 {item['change']}({item['change_percent']})")
```
cURL:
```bash
curl -X POST "https://route.showapi.com/138-49?appKey=YOUR_APPKEY" \
-H "content-type: application/x-www-form-urlencoded" \
-d "prov=%E5%8C%97%E4%BA%AC"
```
Node.js(fetch):
```javascript
const resp = await fetch("https://route.showapi.com/138-49", {
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({ appKey: "YOUR_APPKEY", prov: "北京" }),
signal: AbortSignal.timeout(5000),
});
const body = (await resp.json()).showapi_res_body;
if (body.ret_code !== 0) throw new Error(body.remark);
const parseYmd = (raw) => new Date(+raw.slice(0, 4), +raw.slice(4, 6) - 1, +raw.slice(6, 8));
const next = parseYmd(body.next_change_time);
const days = Math.ceil((next - Date.now()) / 86400000);
console.log(`下次调价:${next.toLocaleDateString()},还有 ${days} 天`);
const pct = (raw) => parseFloat(raw.replace("%", "")); // 去掉 % 再转数值
console.log(`0号柴油 ${body.p0.price} 元/升,涨跌率 ${pct(body.p0.change_percent)}%`);
```
## 适用条件与注意事项
- `prov` 必填。不传时平台层返回 `showapi_res_code=-1` 与 `showapi_res_error="must input prov field"`,`showapi_fee_num=0`。
- 8 个标号都会返回对象,没有数据的标号四个子字段都是空字符串,取值前判空。
- `change_percent` 带 `%` 后缀,`change` 不带单位,两者都要转换后再参与计算。
- `before_change_time` 与 `next_change_time` 反映的是全国统一的调价窗口,2026-09-18 实测四个省份取值一致。需要省份维度差异时用标号价格字段。
- 涨跌数据仅供展示参考,对外文案建议标注以官方公布为准。
## FAQ
**Q1:查询行情和查询油价的区别是什么?**
查询油价(138-46)返回各标号当前价格;查询行情(138-49)返回各标号的涨跌信息与调价日,`prov` 必填。
**Q2:只有 `p0` 有涨跌数据吗?**
不是。2026-09-18 实测返回了 `p0`、`p89`、`p90`、`p92`、`p93`、`p95`、`p97`、`p98` 共 8 个标号对象。其中 `p90`、`p93`、`p97` 四个子字段全为空字符串。
**Q3:`change_percent` 能直接相加吗?**
不能直接相加,它是带 `%` 的字符串。去掉后缀转数值后再计算。
**Q4:`next_change_time` 怎么解析成日期?**
它是 `yyyyMMdd` 格式,先按 4-2-2 切片再交给日期库,或直接用 `datetime.strptime(raw, "%Y%m%d")`。
**Q5:为什么查出来只有一个省的数据?**
查询行情按 `prov` 精确查询单省,没有全量返回。需要全国数据时用查询油价(138-46)不传 `prov`,见《今日油价:一次调用取回全国 31 省油价的做法》。
## 相关能力 / 下一步阅读
- [今日油价 prov 参数怎么传?查询油价与查询行情的必填差异](https://www.showapi.com/guides/oilprice-prov-param-138)
- [今日油价数据什么时候刷新?用 ct 字段判断缓存是否过期](https://www.showapi.com/guides/oilprice-schedule-138)
- [今日油价返回字段对照:p89/p92/p0 与 ct 的含义与空值处理](https://www.showapi.com/guides/oilprice-fields-138)
- **本系列共 13 篇**:查看[今日油价指南总目录](https://www.showapi.com/guides/oilprice-guides-138)





