工具 API 概览
用一把密钥调用工具市场中已接通的工具(GitHub、npm、PyPI、Crossref、World Bank 等),按次从账户余额结算,失败不收费。
工具 API 让你的应用或 Agent 调用工具市场中已接通的工具操作。每个操作有固定的价格与输入结构,调用前预留费用,成功后扣费,失败释放预留、不收费。费用与模型调用共用同一个账户余额。
前提:一把工具密钥或全能密钥(我的 Key),调用付费操作时账户可用余额不低于操作价格。示例中的环境变量 TOKENTOSEA_TOOL_KEY 可以是任意一种。
基础地址#
https://tokentosea.com/api/v1/tool-api| 方法 | 路径 | 用途 |
|---|---|---|
GET | /catalog | 搜索工具目录 |
GET | /actions/{toolId} | 列出工具的可调用操作、价格与输入结构 |
GET | /wallet | 查询账户余额 |
POST | /invoke | 调用一个操作 |
GET | /runs | 调用记录列表 |
GET | /runs/{id} | 单次调用的完整结果 |
工具 API 与模型 API 是两个独立的入口:模型请求发往 api.tokentosea.com,工具请求发往 tokentosea.com/api。
鉴权#
Authorization: Bearer tts_tool_xxxxxxxx…| 密钥 | 能否调用工具 API |
|---|---|
工具密钥 tts_tool_ + 64 位十六进制 | 可以,只能用于工具 API |
全能密钥 sk-relay_…(模型 + 工具) | 可以;同一把密钥也能调用模型。工具费用计入这把密钥的费用限额 |
模型密钥 sk-relay_…(不含工具权限) | 不可以,返回 403 tool_access_not_allowed |
| OAuth 访问令牌 | 不可以,使用委托接口 |
只接受 Authorization: Bearer。密钥在 控制台 → 我的 Key 创建:选择「工具密钥」或「全能密钥」。明文只显示一次;每个账号最多保留 20 个有效的工具密钥。每次调用都会校验密钥未撤销、未删除,账号状态正常并已绑定手机号;撤销或删除立即生效。
请从服务端调用:主站 API 只允许 TokenToSea 自己的页面跨域访问。
一次完整的调用#
- 找到工具
GET /catalog?connected=1&q=github只返回已接通的工具,取得工具id(例如public_github)。 - 读取操作
GET /actions/public_github返回每个操作的id、priceUsd、priceVersion和inputSchema。 - 调用
POST /invoke,带上操作 ID、输入、你生成的requestKey、刚读到的priceVersion,以及你愿意支付的上限maxCostUsd(不低于priceUsd)。 - 检查结果
响应中的
status为succeeded时读取output;为failed时查看errorCode,未扣费。
export TOKENTOSEA_TOOL_KEY="tts_tool_…"
API=https://tokentosea.com/api/v1/tool-api
# 读取 GitHub 工具的操作与价格
curl "$API/actions/public_github" -H "Authorization: Bearer $TOKENTOSEA_TOOL_KEY"
# 调用 github.search
curl "$API/invoke" \
-H "Authorization: Bearer $TOKENTOSEA_TOOL_KEY" \
-H "Content-Type: application/json" \
-d '{
"actionId": "github.search",
"input": {"query": "typescript", "limit": 3},
"requestKey": "'"$(uuidgen)"'",
"priceVersion": "public-20261010-v1",
"maxCostUsd": "0.001000"
}'import os
import uuid
import requests
API = "https://tokentosea.com/api/v1/tool-api"
HEADERS = {"Authorization": "Bearer " + os.environ["TOKENTOSEA_TOOL_KEY"]}
actions = requests.get(f"{API}/actions/public_github", headers=HEADERS, timeout=30)
actions.raise_for_status()
action = next(a for a in actions.json() if a["id"] == "github.search")
run = requests.post(
f"{API}/invoke",
headers=HEADERS,
json={
"actionId": action["id"],
"input": {"query": "typescript", "limit": 3},
"requestKey": str(uuid.uuid4()), # 网络重试时沿用同一个值
"priceVersion": action["priceVersion"],
"maxCostUsd": action["priceUsd"],
},
timeout=60,
)
run.raise_for_status()
result = run.json()
if result["status"] == "succeeded":
print(result["chargedUsd"], result["output"]["data"]["total_count"])
else:
print("failed:", result["errorCode"]) # 失败不扣费import { randomUUID } from 'node:crypto';
const API = 'https://tokentosea.com/api/v1/tool-api';
const headers = { Authorization: `Bearer ${process.env.TOKENTOSEA_TOOL_KEY}`, 'Content-Type': 'application/json' };
const actions = await (await fetch(`${API}/actions/public_github`, { headers })).json();
const action = actions.find((a) => a.id === 'github.search');
const response = await fetch(`${API}/invoke`, {
method: 'POST',
headers,
body: JSON.stringify({
actionId: action.id,
input: { query: 'typescript', limit: 3 },
requestKey: randomUUID(), // 网络重试时沿用同一个值
priceVersion: action.priceVersion,
maxCostUsd: action.priceUsd,
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const run = await response.json();
console.log(run.status, run.chargedUsd, run.errorCode ?? '');计费#
- 每个操作的价格固定,以
GET /actions/{toolId}返回的priceUsd(美元,6 位小数)与priceVersion为准。当前公开数据查询类操作为 USD 0.001 / 次,TokenToSea 数据工具(JSON、Base64、SHA-256、UUID 等)免费。 - 调用时平台校验
priceVersion与当前版本一致、priceUsd不超过maxCostUsd,否则返回409 tool_price_changed,不会扣费。 - 成功时扣除
priceUsd;失败(包括外部数据源出错或超时)不扣费。 - 余额与模型调用共用,在 控制台 → 充值 充值,扣费记录在账单中。
幂等#
工具 API 用请求体中的 requestKey(16–128 个字符)实现幂等,不使用 Idempotency-Key 请求头。requestKey 在你的账号内唯一:
- 同一个
requestKey与完全相同的请求再次提交,返回原来的调用记录,不会再次调用外部数据源,也不会再次扣费; - 同一个
requestKey搭配不同的输入、价格版本或上限,返回409 tool_request_key_reused。
每个新的业务调用生成新的 requestKey;网络重试时沿用原来的 requestKey 和原来的全部参数。
限制#
| 限制 | 值 | 超出时 |
|---|---|---|
| 每个账号同时执行 | 3 个 | 409 tool_rate_limited |
| 每个账号每分钟 | 30 次 | 409 tool_rate_limited |
| 每个外部数据源(全站) | 每分钟 10 次;GitHub 另有每小时 40 次 | 409 tool_rate_limited |
| 输入大小 | 16 KiB | 400 tool_input_too_large |
| 外部响应大小 | 1.5 MB | 调用失败(tool_result_too_large),不扣费 |
| 外部请求超时 | 12 秒 | 调用失败,不扣费 |
被限流时请稍后再试;限流不会产生调用记录。超过 2 分钟仍未完成的调用会被标记为失败(tool_interrupted),不会自动重试。
错误格式#
工具 API 的错误体与模型 API 不同:
{ "statusCode": 409, "message": "tool_insufficient_balance", "error": "Conflict" }message 是稳定的错误码。完整列表见工具 API 参考。