使用 apiKey 查询 OpenAI 服务可用余额

subscription & usage 接口

  • ❌ 2023-07-26 该方法已经失效subscriptionusage 接口已无法使用,在线查吧。
  • ❌ 2023-07-21 该方法已经失效subscription 接口还能使用(只能查询到 apiKey 所对应的总额度),但 usage 接口已无法使用,查不到使用量了。登录账号去官网页面在线查询吧,或者去提取一个 sessionKey 进行查询,但就没必要了。
目录

前言

使用 apiKey 查询 OpenAI 余额的方法,官方 API 接口使用文档其实并没有介绍关于余额查询的方法,都是网友们自己探索出来的(当然也是 OpenAI 开发了这个接口,只是没有对外公开说明)。在之前,向 credit_grants 接口构建一个 HTTP 请求,就可以得到该 apiKey 所对应账户的余额相关信息,但是现在官方取消了该接口使用,只能使用浏览器登录账号在相关页面进行查询。

以前的办法

import requests
url = 'https://api.openai.com/dashboard/billing/credit_grants'
api_key = "Your_apiKey"
headers = {
"Authorization": "Bearer " + api_key,
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
print(response.text)

简单来说就是构造一个请求,请求头带着自己的 apiKey 就可以返回余额相关信息,具体返回的信息包括总额度、已使用额度、可用额度。但是现在使用(2023-04-20,至少今天开始不行了),会返回下面的信息:

{
"error": {
"message": "Your request to GET /dashboard/billing/credit_grants must be made with a session key (that is, it can only be made from the browser). You made it with the following key type: secret.",
"type": "server_error",
"param": null,
"code": null
}
}

大概意思就是 OpenAI 对于之前查询余额的接口:credit_grants 进行了限制,只能使用浏览器 token 访问,如果使用 apiKey 则不行,也就是还是只能通过访问此页面进行余额的查询。

现在的办法

/dashboard/billing/credit_grants 被限制,但是 /dashboard/billing/ 下的其他接口还可以使用,具体来说是使用 subscriptionusage 接口,分别获取总额度 hard_limit_usd 和使用量 total_usage ,然后进行作差进而求出余额。

但是值得注意的是:

  • /dashboard/billing/subscription 构建的请求只能查询到总订阅额度(免费的总额度),准确来说该接口查询到的信息顾名思义是订阅 ChatGPT 相关服务的信息,包括是否为付费用户、总额度、订阅日期等等。所以如果还要知道可用额度还需要借助 usage 接口来实现;
  • 如果查询某个过期的账号,也能显示余额,因为 OpenAI 并没有将过期账号的余额进行清零,而是在/dashboard/billing/subscription 接口下使用 access_until 值来表示该免费账号的有效期限;
  • /dashboard/billing/usage 构建的请求需要传达两个参数:start_dateend_date,返回的结果除了有在这段时间内所使用的总额度total_usage,还有 start_dateend_date 的这段时间里,每一天使用的额度(具体到每一天某时刻使用的额度),此外下面代码中的 total_usage / 100 的原因是计算单位为美分,这里转换成美元。(“这段时间” 范围不能超过 100 天,否则会报错 " You can only request a maximum of 100 days per request " );
  • 当然,所有的请求需要你的网络环境能够正常访问 OpenAI 的 api 地址,否则也是会查询不到。

使用下面的代码,并在提示处替换自己的 apiKey 即可查询到余额以及账户的免费额度有效期限:

import datetime
import requests
def get_usage(api_key):
headers = {
# 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
"Authorization": "Bearer " + api_key,
"Content-Type": "application/json"
}
# Get subscription info and total hard limit
resp_sub = requests.get("https://api.openai.com/v1/dashboard/billing/subscription", headers=headers)
if not resp_sub.ok:
return resp_sub.text
sub_data = resp_sub.json()
total = sub_data.get("hard_limit_usd")
now_time = datetime.datetime.now().timestamp()
access_time = sub_data.get("access_until")
if access_time > now_time:
print("\n该账户可用 ✔,有效期至:", datetime.datetime.fromtimestamp(access_time).date())
else:
print("\n该账户已过期,不可用 ❌")
# print(access_time)
# Get recent usage info
start_date = (datetime.datetime.now() - datetime.timedelta(days=99)).strftime("%Y-%m-%d")
end_date = (datetime.datetime.now() + datetime.timedelta(days=1)).strftime("%Y-%m-%d")
resp_billing = requests.get(f"https://api.openai.com/v1/dashboard/billing/usage?start_date={start_date}&end_date={end_date}", headers=headers)
if not resp_billing.ok:
return resp_billing.text
billing_data = resp_billing.json()
total_usage = billing_data.get("total_usage") / 100
print(f"\n总额度:{total:.4f} $ \n已使用额度:{total_usage:.4f} $ \n剩余额度:{total-total_usage:.4f} $ \n")
if __name__ == '__main__':
apiKey = "Your_apiKey" # 填写 apiKey
get_usage(apiKey)

效果

不太推荐网上一些搭建好的可自助查询余额的网页,有可能会泄露自己的 apiKey