调用价格
2 匠币/次
快速接入
保持统一返回结构,直接通过服务端发起请求即可接入。
https://openapi.toolkk.com/v1/exchange-rate-historycURL 示例
curl --request POST \
--url 'https://openapi.toolkk.com/v1/exchange-rate-history' \
--header 'Content-Type: application/json' \
--header 'X-API-Key: YOUR_API_KEY' \
--data '{\n "code": "货币编号,货币编号或货币名称必须输入其中一个",\n "name": "货币名称,货币编号或货币名称必须输入其中一个",\n "month": "查询年月(yyyyMM),month和startDate、endDate不能同时为空",\n "startDate": "查询起始时间yyyyMMdd,month和startDate、endDate不能同时为空",\n "endDate": "查询结束时间yyyyMMdd,month和startDate、endDate不能同时为空"\n}'Python 示例
import os
import requests
url = "https://openapi.toolkk.com/v1/exchange-rate-history"
payload = {
"code": "货币编号,货币编号或货币名称必须输入其中一个",
"name": "货币名称,货币编号或货币名称必须输入其中一个",
"month": "查询年月(yyyyMM),month和startDate、endDate不能同时为空",
"startDate": "查询起始时间yyyyMMdd,month和startDate、endDate不能同时为空",
"endDate": "查询结束时间yyyyMMdd,month和startDate、endDate不能同时为空"
}
headers = {
"Content-Type": "application/json",
"X-API-Key": os.getenv("TOOLKK_API_KEY", "YOUR_API_KEY"),
}
response = requests.request("POST", url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
print(response.json())Go 示例
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
endpoint := "https://openapi.toolkk.com/v1/exchange-rate-history"
payload := []byte("{\n \"code\": \"货币编号,货币编号或货币名称必须输入其中一个\",\n \"name\": \"货币名称,货币编号或货币名称必须输入其中一个\",\n \"month\": \"查询年月(yyyyMM),month和startDate、endDate不能同时为空\",\n \"startDate\": \"查询起始时间yyyyMMdd,month和startDate、endDate不能同时为空\",\n \"endDate\": \"查询结束时间yyyyMMdd,month和startDate、endDate不能同时为空\"\n}")
req, err := http.NewRequest("POST", endpoint, bytes.NewBuffer(payload))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-API-Key", "YOUR_API_KEY")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(body))
}Java 示例
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ToolkkExample {
public static void main(String[] args) throws Exception {
String payload = "{\n \"code\": \"货币编号,货币编号或货币名称必须输入其中一个\",\n \"name\": \"货币名称,货币编号或货币名称必须输入其中一个\",\n \"month\": \"查询年月(yyyyMM),month和startDate、endDate不能同时为空\",\n \"startDate\": \"查询起始时间yyyyMMdd,month和startDate、endDate不能同时为空\",\n \"endDate\": \"查询结束时间yyyyMMdd,month和startDate、endDate不能同时为空\"\n}";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://openapi.toolkk.com/v1/exchange-rate-history"))
.method("POST", HttpRequest.BodyPublishers.ofString(payload))
.header("Content-Type", "application/json")
.header("X-API-Key", "YOUR_API_KEY")
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}PHP 示例
<?php
$endpoint = 'https://openapi.toolkk.com/v1/exchange-rate-history';
$payload = "{\n \"code\": \"货币编号,货币编号或货币名称必须输入其中一个\",\n \"name\": \"货币名称,货币编号或货币名称必须输入其中一个\",\n \"month\": \"查询年月(yyyyMM),month和startDate、endDate不能同时为空\",\n \"startDate\": \"查询起始时间yyyyMMdd,month和startDate、endDate不能同时为空\",\n \"endDate\": \"查询结束时间yyyyMMdd,month和startDate、endDate不能同时为空\"\n}";
$ch = curl_init($endpoint);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-API-Key: YOUR_API_KEY',
],
CURLOPT_POSTFIELDS => $payload,
]);
$response = curl_exec($ch);
if ($response === false) {
throw new RuntimeException(curl_error($ch));
}
curl_close($ch);
echo $response;响应示例
{
"msg": "成功",
"code": 200,
"taskNo": "687882815162227863699691",
"data": {
"currencyCode": "USD",
"currencyName": "美元",
"startDate": "20191001",
"endDate": "20191101",
"month": "201910",
"list": [
{
"middle_rate": "705.33",
"selling_rate": "705.55",
"cash_buying_rate": "696.86",
"buying_rate": "702.58",
"cash_selling_rate": "705.55",
"publish_time": "2019-10-31"
},
{
"middle_rate": "705.82",
"selling_rate": "707.26",
"cash_buying_rate": "698.54",
"buying_rate": "704.27",
"cash_selling_rate": "707.26",
"publish_time": "2019-10-30"
}
]
}
}示例用于理解返回结构,实际结果以接口返回为准。
- 鉴权方式
- 请求头传入 X-API-Key
- 默认限流
- 600 次/分钟
- 超时时间
- 10000 ms
服务端调用时,将 API Key 放在 X-API-Key 请求头中。
建议按 response code 与业务字段双重判断调用结果。
高频调用场景请结合速率限制与重试策略使用。
请求字段
从服务端发起请求,并在 X-API-Key 请求头中传入密钥。
请求字段
字段来自接口结构定义。未提供的说明和示例会标为未标注。
| 字段路径 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
| code | string | 否 | 货币编号,货币编号或货币名称必须输入其中一个 | 未标注 |
| name | string | 否 | 货币名称,货币编号或货币名称必须输入其中一个 | 未标注 |
| month | string | 否 | 查询年月(yyyyMM),month和startDate、endDate不能同时为空 | 未标注 |
| startDate | string | 否 | 查询起始时间yyyyMMdd,month和startDate、endDate不能同时为空 | 未标注 |
| endDate | string | 否 | 查询结束时间yyyyMMdd,month和startDate、endDate不能同时为空 | 未标注 |
请求示例
{
"code": "货币编号,货币编号或货币名称必须输入其中一个",
"name": "货币名称,货币编号或货币名称必须输入其中一个",
"month": "查询年月(yyyyMM),month和startDate、endDate不能同时为空",
"startDate": "查询起始时间yyyyMMdd,month和startDate、endDate不能同时为空",
"endDate": "查询结束时间yyyyMMdd,month和startDate、endDate不能同时为空"
}- 鉴权方式
- 请求头传入 X-API-Key
- 默认限流
- 600 次/分钟
- 超时时间
- 10000 ms
响应字段
示例用于理解返回结构,实际结果以接口返回为准。
响应字段
字段来自接口结构定义。未提供的说明和示例会标为未标注。
| 字段路径 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
| msg | string | 否 | code对应的描述 | 成功 |
| code | number | 否 | 返回码,详见code返回码说明 | 200 |
| taskNo | string | 否 | 本次唯一请求号 | 687882815162227863699691 |
| data | object | 否 | 未标注 | 未标注 |
| data.currencyCode | string | 否 | 货币编号 | USD |
| data.currencyName | string | 否 | 货币名称 | 美元 |
| data.startDate | string | 否 | 开始日期 | 20191001 |
| data.endDate | string | 否 | 结束日期 | 20191101 |
| data.month | string | 否 | 结束日期 | 201910 |
| data.list | array | 否 | 未标注 | [{"middle_rate":"705.33","selling_rate":"705.55","cash_buying_rate":"696.86","buying_rate":"702.58","cash_selling_rate":"705.55","publish_time":"2019-10-31"},{"middle_rate":"705.82","selling_rate":"707.26","cash_buying_rate":"698.54","buying_rate":"704.27","cash_selling_rate":"707.26","publish_time":"2019-10-30"}] |
| data.list[] | object | 未标注 | 未标注 | 未标注 |
响应示例
{
"msg": "成功",
"code": 200,
"taskNo": "687882815162227863699691",
"data": {
"currencyCode": "USD",
"currencyName": "美元",
"startDate": "20191001",
"endDate": "20191101",
"month": "201910",
"list": [
{
"middle_rate": "705.33",
"selling_rate": "705.55",
"cash_buying_rate": "696.86",
"buying_rate": "702.58",
"cash_selling_rate": "705.55",
"publish_time": "2019-10-31"
},
{
"middle_rate": "705.82",
"selling_rate": "707.26",
"cash_buying_rate": "698.54",
"buying_rate": "704.27",
"cash_selling_rate": "707.26",
"publish_time": "2019-10-30"
}
]
}
}接入文档
功能说明、使用场景与注意事项。
接口能力
按货币编号或名称查询历史牌价,可使用查询年月或起止日期范围。记录区分现汇买入、现汇卖出、现钞买入、现钞卖出和中行折算价,并给出发布日期。适合查看同一币种、同一价类在不同日期的变化。中行折算价是独立报价类别,不能直接称为人民币官方中间价,也不能按现汇买卖价的平均数解释。
应用场景
历史观察页可展示某币种的现汇卖出价趋势,参考表可把同一天的现汇与现钞报价并列,后台服务也可保存查询区间与返回记录供复核。比较前先统一币种、价类和日期,避免把现钞买入价与现汇卖出价混成一条曲线。图表绘制、排序和缺失标记由调用方完成,接口没有承诺自动补齐每个自然日或提供交易结算结果。
从输入到结果
货币编号或名称至少填写一个;按月查询使用yyyyMM,按区间查询使用yyyyMMdd格式的起止日期,查询月份与日期范围不能同时为空。接收结果后检查状态、货币回显和记录日期,再逐条读取所需价类。价格字段是字符串,先识别空值再解析;发布日期不等于精确报价时间。记录日期如需排序可由应用处理,但应保留原记录供对照,不自动补造缺失日期的牌价。
范围与限制
当前没有明确两种日期模式同时填写时的优先级、历史可用范围、同日多次报价规则及每一或每百外币的计价单位。确认报价方向和单位前,不应直接把牌价乘以外币金额计算应收应付。历史参考不能代替银行实际成交价,缺失记录也不能解释为当日汇率零或未交易。税务、会计或结算用途还需另行确认适用的日期、价类和业务规则。
常见问题
货币编号和名称必须都填吗?
至少填写其中一个。若同时填写,应保持指向同一币种,避免条件冲突。
查询某个月怎样填写?
使用yyyyMM格式的month;按区间查询则填写yyyyMMdd格式的起止日期。
中行折算价就是官方中间价吗?
不能这样解释。当前返回定义明确写中行折算价,应与四类买卖牌价分别处理。
可以直接计算换汇金额吗?
先确认报价方向及计价单位,再选择适用的现汇或现钞价类;历史牌价不保证实际交易价格。