curl https://api.sponkly.com/v1/translate \
-H "Authorization: Bearer $SPONKLY_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "Merhaba dünya", "target": "en"}'
{
"translation": "Hello world",
"target": "en",
"characters": 13,
"cost_usd": "0.000130"
}价格
每次调用都从你的预付余额中扣费。因我们一方原因失败的调用不收费。
身份验证
每个请求都在 Authorization 请求头中携带你的 API 密钥。密钥在控制台中创建和撤销;所有密钥共用同一余额。
- 在 sponkly.com 免费注册,然后打开 控制台 → 开发者 API。
- 充值($10 起)并创建 API 密钥。
- 向 https://api.sponkly.com/v1 发送请求,并携带 Authorization: Bearer <your key>。
Base URL: https://api.sponkly.com/v1
Authorization: Bearer spk_…签名请求
每个 API 密钥都附带一个签名密钥。用它为请求签名后,仅凭被盗的 API 密钥无法调用,请求在传输途中无法被篡改,同一请求也无法被重复发送。在控制台中为该密钥开启“要求签名请求”,所有未签名的请求都将被拒绝。
- 获取以 Unix 秒表示的当前时间,以及你所发送请求体原文的 SHA-256(上传文件时:文件的字节;GET 请求和实时 socket:空请求体)。
- 按以下顺序用点号连接:时间戳、请求方法、含查询字符串的路径、请求体哈希。
- 用你的签名密钥计算该文本的 HMAC-SHA256,并以小写十六进制表示。
- 将其作为 X-Sponkly-Signature: v1=<signature> 发送,并将时间作为 X-Sponkly-Timestamp 发送。签名有效期为 5 分钟,且只能用于一个请求。
- 需要在一秒内两次发送同一请求(例如快速重试或轮询)?请改用毫秒表示时间;毫秒同样有效,并能让每个签名保持唯一。
X-Sponkly-Timestamp: 1792693200
X-Sponkly-Signature: v1=hex( HMAC-SHA256( signing_secret,
"1792693200" + "." + "POST" + "." + "/v1/translate" + "." + hex(SHA-256(body)) ) )// Node.js 18+
import crypto from "node:crypto";
async function sponkly(method, path, body) {
const raw = body === undefined ? "" : JSON.stringify(body);
const ts = Math.floor(Date.now() / 1000).toString();
const hash = crypto.createHash("sha256").update(raw).digest("hex");
const sig = crypto.createHmac("sha256", process.env.SPONKLY_SIGNING_SECRET)
.update(`${ts}.${method}.${path}.${hash}`).digest("hex");
const res = await fetch("https://api.sponkly.com" + path, {
method,
headers: {
Authorization: `Bearer ${process.env.SPONKLY_KEY}`,
"Content-Type": "application/json",
"X-Sponkly-Timestamp": ts,
"X-Sponkly-Signature": `v1=${sig}`,
},
body: raw || undefined,
});
return res.json();
}
console.log(await sponkly("POST", "/v1/translate", { text: "Merhaba dünya", target: "en" }));保护好你的密钥
- 请从你的服务器调用 API。切勿将 API 密钥或签名密钥放在网页、移动应用或公开代码仓库中。
- 生产环境中的每个密钥都应要求签名请求。
- 将你的服务器地址加入密钥的允许地址,这样密钥在其他任何地方都无法使用。
- 为每个密钥设置每日消费上限,这样即使出错或泄露,损失也有限。
- 每个应用或环境使用一个密钥,一旦怀疑密钥泄露,立即将其撤销。你也可以随时生成新的签名密钥。
- 同一地址多次使用错误的密钥或签名,该地址将被锁定 15 分钟。
/v1/translate文本翻译
将单条文本或最多 50 条文本的列表翻译成 32 种语言中的任意一种。不填写源语言即可自动检测。
# One text, or up to 50: "text": ["Good morning", "Thank you"]
curl https://api.sponkly.com/v1/translate \
-H "Authorization: Bearer $SPONKLY_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "Bugün hava çok güzel.", "target": "en", "source": "tr"}'// JavaScript (Node 18+, Deno, Bun)
const res = await fetch("https://api.sponkly.com/v1/translate", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.SPONKLY_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ text: ["Good morning", "Thank you"], target: "de" }),
});
const { translations } = await res.json(); // [{ text: "Guten Morgen" }, { text: "Danke" }]# Python
import os, requests
r = requests.post("https://api.sponkly.com/v1/translate",
headers={"Authorization": f"Bearer {os.environ['SPONKLY_KEY']}"},
json={"text": "How are you?", "target": "ja", "context": "A message to a hotel guest"})
print(r.json()["translation"])字段:text(字符串或数组)、target(语言代码)、source(可选)、context(可选,最多 1,000 个字符,说明文本的内容)。按发送的字符数计费。
wss://api.sponkly.com/v1/live?source=en&target=tr实时语音翻译
用于实时语音的 WebSocket:边说边发送音频,即可收到翻译后的字幕,如有需要还可收到翻译后的语音。13 种主要语言由实时语音模型翻译,延迟约 1–2 秒;其他语言由我们自己的流式管道翻译。
// Node.js (npm i ws). Send 16 kHz mono 16-bit PCM in ~100 ms frames, in real time.
import WebSocket from "ws";
const ws = new WebSocket("wss://api.sponkly.com/v1/live?source=en&target=tr&voice=1", {
headers: { Authorization: `Bearer ${process.env.SPONKLY_KEY}` },
});
ws.on("message", (raw) => {
const e = JSON.parse(raw);
if (e.t === "cap" && e.done) console.log("caption:", e.text); // a translated line
if (e.t === "pcm") play(Buffer.from(e.d, "base64"), e.r); // translated voice, 24 kHz PCM
});
microphone.on("data", (frame) => ws.send(frame)); // binary frames
// Browsers cannot set headers: new WebSocket(url, ["sponkly-key", key]). Never put your key in a public page —
// open the socket from your server, or from an app only your own team uses.| 服务器消息 | 含义 |
|---|---|
{"t":"ready","engine":"openai|own"} | 会话已开启;engine 表示该语言使用哪条翻译路径。 |
{"t":"partial","text":"…"} | 正在识别的语音(可能还会变化)。 |
{"t":"cap","id","text","done"} | 一行译文:随内容增加而显示,done 为 true 时即为最终结果。 |
{"t":"pcm","d":"<base64>","r":24000} | 一段翻译后的语音:指定采样率的 16 位单声道 PCM,base64 编码。请依次连续播放各段。 |
{"t":"problem","text":"noMinutes"} | 你的余额已用完;会话将关闭。 |
参数:source 和 target(语言代码),voice=0 表示只要字幕(半价)。请实时发送音频(发送过快会被拒绝)。每个账号最多同时 10 个会话,每个最长 2 小时。按翻译语音的秒数计费;静音和音乐免费。
/v1/speech文本转语音
将文本转为自然的语音,并直接返回音频文件。
curl https://api.sponkly.com/v1/speech \
-H "Authorization: Bearer $SPONKLY_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "Merhaba, hoş geldiniz.", "language": "tr", "voice": "female", "format": "mp3"}' \
--output welcome.mp3字段:text(最多 4,096 个字符)、language、voice(female、male、neutral,或 alloy、ash、ballad、coral、echo、fable、onyx、nova、sage、shimmer、verse)、format(mp3、wav 或 opus)、speed(0.5–2)。费用见 X-Sponkly-Cost-Usd 响应头。
/v1/transcribe语音转文本
上传音频或视频文件(最大 25 MB、60 分钟);获取带时间戳的文本,如有需要还可获取译文。
curl https://api.sponkly.com/v1/transcribe \
-H "Authorization: Bearer $SPONKLY_KEY" \
-F [email protected] \
-F language=tr \
-F translate_to=en
{ "text": "…", "language": "tr", "duration_seconds": 182.4,
"segments": [{ "start": 0.0, "end": 4.2, "text": "…" }],
"translation": { "text": "…", "target": "en" }, "cost_usd": "0.030430" }/v1/videos视频字幕和配音
发送最长 5 分钟的视频,即可取回翻译版本:烧录字幕、翻译配音或两者兼有,并附双语字幕文件。
# 1. Ask for a video: dubbed into Turkish, with Turkish subtitles
curl https://api.sponkly.com/v1/videos -H "Authorization: Bearer $SPONKLY_KEY" -H "Content-Type: application/json" \
-d '{"target": "tr", "dub": true, "subtitles": "translated", "content_type": "video/mp4", "size_bytes": 48211022}'
# → { "id": "…", "upload": { "method": "PUT", "url": "https://…", "headers": { "Content-Type": "video/mp4" } } }
# 2. Upload the file to that link
curl -X PUT -H "Content-Type: video/mp4" --data-binary @talk.mp4 "<upload.url>"
# 3. Start it, then poll until "status": "ready"
curl -X POST https://api.sponkly.com/v1/videos/<id>/start -H "Authorization: Bearer $SPONKLY_KEY"
curl https://api.sponkly.com/v1/videos/<id> -H "Authorization: Bearer $SPONKLY_KEY"
# → { "status": "ready", "cost_usd": "0.500000",
# "result": { "video_url": "https://…", "subtitles": { "tr": "https://…srt", "en": "https://…srt" } } }字段:target、source(可选)、dub(true 表示翻译配音)、subtitles(translated、original、both 或 none)、content_type(video/mp4 或 video/quicktime)、size_bytes、title(可选)。视频时长确定后按秒计费。结果可在 7 天内下载。
/v1/balance · /v1/usage · /v1/languages余额、用量和语言
查询余额及最早一笔额度的到期时间,列出已计费的调用,并获取支持的语言和当前价格。
curl https://api.sponkly.com/v1/balance -H "Authorization: Bearer $SPONKLY_KEY"
# → { "balance_usd": "48.213400", "next_expiry": "2027-10-22T09:12:00.000Z" }
curl "https://api.sponkly.com/v1/usage?limit=20" -H "Authorization: Bearer $SPONKLY_KEY"
# → { "data": [{ "product": "live", "units": 312.5, "unit": "second", "cost_usd": "0.520834", … }], "has_more": false }错误
错误以 JSON 形式返回,包含固定的错误代码和易读的说明。
{ "error": { "code": "insufficient_balance", "message": "…" } }| 400 | invalid_text · invalid_target · text_too_long … | 请求中缺少某些内容或包含不允许的内容;说明中会指出具体问题。 |
| 401 | missing_key · invalid_key | 缺少 API 密钥,或密钥错误或已被撤销。 |
| 402 | insufficient_balance | 你的余额不足以支付此次调用。请在控制台中充值。 |
| 429 | — | 同时发出的请求过多。请稍候再试。 |
| 502 | translation_failed · speech_failed … | 我们这边或服务商出现故障。不会向你收费;请重试。 |
限制
- 文本翻译:每个请求最多 50 条文本、20,000 个字符,每条文本最多 5,000 个字符。
- 文本转语音:每个请求最多 4,096 个字符。
- 语音转文本:文件最大 25 MB、60 分钟。
- 实时翻译:每个账号最多同时 10 个会话,每个最长 2 小时,音频需实时发送。
- 视频:最长 5 分钟、最大 4 GB,最多同时处理 3 个;结果保留 7 天。
- 每个密钥每分钟上限:300 次翻译、120 次语音、60 次转写和 20 个新视频。
- 32 种语言:英语、土耳其语、德语、法语、西班牙语、意大利语、葡萄牙语、俄语、日语、韩语、中文、阿拉伯语、印地语、荷兰语、波兰语、瑞典语、挪威语、丹麦语、芬兰语、希腊语、捷克语、罗马尼亚语、匈牙利语、乌克兰语、希伯来语、泰语、越南语、印尼语、马来语、爱沙尼亚语、波斯语和加泰罗尼亚语。
计费
- 预付:用银行卡充值,$10 起;每次调用都从余额中扣除。
- 银行卡手续费会在结账时显示并加收,因此充值的额度可全部使用。
- 额度自购买之日起 12 个月内有效,不予退款。
- 因我们一方原因失败的调用不收费,失败的视频会退还费用。
- 余额不足时我们会发邮件提醒你;余额为零时,调用将以 402 被拒绝,直到你充值为止。