调用Coinbase addresses接口返回数据大多为空的问题求解
问题原因
- 缺少必填的CB-VERSION请求头:返回结果里的警告已经明确提示需要传该参数,Coinbase v2 API强制要求携带格式为YYYY-MM-DD的版本头,不同版本对各币种地址的读取逻辑存在差异,XLM能正常返回是因为旧默认版本对其适配支持,其他币种未适配所以返回空数据。
- 未生成对应币种的收款地址:Coinbase不会为用户的所有币种默认预生成链上地址,只有你主动为某一币种创建过至少一次收款地址后,
addresses端点才会返回对应数据,XLM应该是你之前已经生成过地址所以能正常返回。 - 权限配置缺失:如果你的OAuth授权流程中没有申请
wallet:addresses:read权限,也会导致大部分币种地址读取失败,部分公开信息多的币种(如XLM)可能不受限。 - 账户本身无链上地址:拉取的账户列表中包含法币账户、奖励账户、托管账户等非链上钱包类型,这类账户本身没有对应链地址,请求自然返回空数组。
解决思路
- 第一步:添加CB-VERSION请求头,在所有请求的headers中添加参数
'CB-VERSION': '2023-01-01'(可替换为任意近12个月内的公开稳定版本),修复版本警告问题。 - 第二步:先判断账户类型,过滤掉法币账户、奖励账户等非加密币种的链上钱包,不需要对这类账户发起地址查询请求。
- 第三步:针对返回空数据的正常加密币种账户,先调用POST
/v2/accounts/${account.id}/addresses接口生成一个新的收款地址,后续再调用查询接口即可获取到数据。 - 第四步:检查OAuth授权的scope配置,确保已经添加
wallet:addresses:read权限,若缺失需要重新走授权流程申请对应权限。
修改后可参考的代码如下:
const getAccounts = async (auth) => { const options = { headers: { 'Authorization': 'Bearer ' + auth.access_token, // 新增必填的版本头 'CB-VERSION': '2023-01-01' } }; let response = await axios.get('https://api.coinbase.com/v2/accounts', options); await getWallets(auth, response.data.data); } const getWallets = async (auth, accounts) => { const options = { headers: { 'Authorization': 'Bearer ' + auth.access_token, 'CB-VERSION': '2023-01-01' } }; for (const account of accounts) { // 过滤非链上账户,可根据实际需要调整过滤规则 if (account.type === 'fiat' || account.type === 'vault') continue; console.log('查询账户地址:', account.name); const url = `https://api.coinbase.com/v2/accounts/${account.id}/addresses`; try { let response = await axios.get(url, options); // 地址为空则先创建 if (response.data.data.length === 0) { await axios.post(url, {}, options); response = await axios.get(url, options); } console.log('地址数据:', response.data.data); } catch (e) { console.log('请求失败:', e.response?.data || e.message); } } }
内容的提问来源于stack exchange,提问作者Buddy
相关产品推荐
相关产品推荐

