ご自身のプロダクトにリアルタイム翻訳を
リアルタイム音声翻訳、テキスト翻訳、音声合成、動画翻訳を32言語で提供する1つのAPI。前払いクレジットで使った分だけのお支払い、月額料金はありません。
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キーを作成します。
- Authorization: Bearer <your key> を付けて https://api.sponkly.com/v1 にリクエストを送ります。
Base URL: https://api.sponkly.com/v1
Authorization: Bearer spk_…署名付きリクエスト
すべてのAPIキーには署名シークレットが付いています。これでリクエストに署名すれば、キーが盗まれてもキーだけでは使えず、送信途中でリクエストを改ざんされることも、同じリクエストを再送されることもありません。ダッシュボードでキーの「署名付きリクエストを必須にする」を有効にすると、署名のないリクエストはすべて拒否されます。
- 現在時刻をUnix秒で取得し、送信する本文そのもののSHA-256を計算します(ファイルのアップロードではファイルのバイト列、GETとライブソケットでは空の本文)。
- タイムスタンプ、メソッド、クエリ文字列を含むパス、本文のハッシュの順に、ドットで区切って連結します。
- そのテキストのHMAC-SHA256を署名シークレットで計算し、小文字の16進数にします。
- X-Sponkly-Signature: v1=<signature> として送信し、時刻は X-Sponkly-Timestamp で送ります。署名の有効期間は5分で、1回のリクエストにのみ使えます。
- 同じリクエストを1秒以内に2回送りますか(すぐの再試行やポーリングなど)? その場合は時刻をミリ秒で指定してください。ミリ秒も受け付けられ、署名がそれぞれ一意になります。
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はサーバーから呼び出してください。キーや署名シークレットを、Webページ、モバイルアプリ、公開リポジトリに絶対に含めないでください。
- 本番環境では、すべてのキーで署名付きリクエストを必須にしてください。
- キーの許可するアドレスにサーバーのアドレスを登録すれば、ほかの場所からはキーを使えなくなります。
- キーごとに1日の利用上限額を設定すれば、ミスや漏えいがあっても損失を一定額に抑えられます。
- アプリや環境ごとに別のキーを使い、漏えいの疑いがあればすぐにキーを無効にしてください。署名シークレットはいつでも新しく作成できます。
- 同じアドレスから間違ったキーや署名が繰り返されると、そのアドレスは15分間ブロックされます。
/v1/translateテキスト翻訳
1つのテキスト、または最大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"} | 翻訳された1行です。伸びるにつれて表示され、doneがtrueになると確定します。 |
{"t":"pcm","d":"<base64>","r":24000} | 翻訳音声の断片です。指定されたサンプルレートの16ビット・モノラルPCM(base64)。断片を続けて再生してください。 |
{"t":"problem","text":"noMinutes"} | 残高がなくなったため、セッションを終了します。 |
パラメーター:source と target(言語コード)、字幕のみの場合は voice=0(半額)。音声はリアルタイムで送信してください(それより速い送信は拒否されます)。1アカウントにつき同時に最大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 … | 当社側またはプロバイダー側で失敗しました。課金はされていません。再試行してください。 |
制限
- テキスト翻訳:1リクエストあたり最大50テキスト・20,000文字、1テキストあたり5,000文字まで。
- 音声合成:1リクエストあたり最大4,096文字。
- 文字起こし:ファイルは最大25 MB・60分まで。
- リアルタイム翻訳:1アカウントにつき同時に最大10セッション、各2時間まで。音声はリアルタイムで送信。
- 動画:最大5分・4 GBまで、同時に3本まで処理。結果は7日間保存されます。
- キーごとの1分あたりの上限:翻訳300回、音声合成120回、文字起こし60回、新規動画20本。
- 32言語:英語、トルコ語、ドイツ語、フランス語、スペイン語、イタリア語、ポルトガル語、ロシア語、日本語、韓国語、中国語、アラビア語、ヒンディー語、オランダ語、ポーランド語、スウェーデン語、ノルウェー語、デンマーク語、フィンランド語、ギリシャ語、チェコ語、ルーマニア語、ハンガリー語、ウクライナ語、ヘブライ語、タイ語、ベトナム語、インドネシア語、マレー語、エストニア語、ペルシャ語、カタルーニャ語。
請求
- 前払い制:カードで$10からクレジットを追加でき、各呼び出しの料金は残高から差し引かれます。
- カード決済手数料は支払い時に表示・加算されるため、クレジット全額をご利用いただけます。
- クレジットは購入後12か月間ご利用いただけます。返金はできません。
- 当社側の原因で失敗した呼び出しは課金されず、失敗した動画の料金は返金されます。
- 残高が少なくなるとメールでお知らせします。残高がゼロになると、クレジットを追加するまで呼び出しは402で拒否されます。