API cho nhà phát triển

Dịch trực tiếp cho sản phẩm của bạn

Một API cho dịch giọng nói trực tiếp, dịch văn bản, giọng nói và video trong 32 ngôn ngữ. Nạp tiền trước, chỉ trả cho phần bạn dùng, không phí hằng tháng.

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"
}

Chi phí

Mọi lệnh gọi đều được trừ vào số dư nạp trước của bạn. Lệnh gọi bị lỗi do phía chúng tôi sẽ không bị tính phí.

Dịch giọng nói trực tiếp
Truyền giọng nói lên, nhận lại phụ đề đã dịch và giọng nói đã dịch chỉ trong vài giây.
0,10 US$ mỗi phút
Phụ đề trực tiếp
Cùng luồng trực tiếp đó, chỉ nhận phụ đề đã dịch.
0,05 US$ mỗi phút
Dịch văn bản
Bản dịch tự nhiên, hiểu ngữ cảnh cho một văn bản hoặc tối đa 50 văn bản.
10,00 US$ mỗi 1 triệu ký tự
Chuyển văn bản thành giọng nói
Đọc văn bản thành tiếng bằng giọng tự nhiên, dạng MP3, WAV hoặc Opus.
30,00 US$ mỗi 1 triệu ký tự
Chuyển giọng nói thành văn bản
Chuyển âm thanh hoặc video thành văn bản có mốc thời gian, có thể kèm bản dịch.
0,01 US$ mỗi phút
Phụ đề video
Nhận lại video có phụ đề đã dịch gắn cứng, kèm tệp SRT.
0,20 US$ mỗi phút
Lồng tiếng video
Nhận lại video được lồng tiếng sang ngôn ngữ khác, kèm phụ đề nếu bạn muốn.
0,50 US$ mỗi phút

Xác thực

Mọi yêu cầu đều gửi khóa API của bạn trong header Authorization. Khóa được tạo và thu hồi trong bảng điều khiển; mọi khóa dùng chung một số dư.

  1. Đăng ký miễn phí trên sponkly.com và mở Bảng điều khiển → API cho nhà phát triển.
  2. Nạp tiền (từ $10) và tạo khóa API.
  3. Gửi yêu cầu đến https://api.sponkly.com/v1 với Authorization: Bearer <your key>.
Base URL:      https://api.sponkly.com/v1
Authorization: Bearer spk_…

Yêu cầu có chữ ký

Mỗi khóa API đi kèm một mã bí mật ký. Khi bạn ký yêu cầu bằng mã này, chỉ riêng khóa bị đánh cắp sẽ vô dụng, yêu cầu không thể bị sửa trên đường truyền và cùng một yêu cầu không thể gửi hai lần. Bật "Bắt buộc yêu cầu có chữ ký" cho khóa trong bảng điều khiển, mọi yêu cầu không có chữ ký sẽ bị từ chối.

  1. Lấy thời gian hiện tại theo giây Unix và SHA-256 của chính xác phần body bạn gửi (khi tải tệp lên: các byte của tệp; với GET và socket trực tiếp: body rỗng).
  2. Nối chúng bằng dấu chấm theo thứ tự: timestamp, phương thức, đường dẫn kèm query string và hash của body.
  3. Tạo HMAC-SHA256 của chuỗi đó bằng mã bí mật ký của bạn, ở dạng hex chữ thường.
  4. Gửi giá trị đó dưới dạng X-Sponkly-Signature: v1=<signature>, kèm thời gian trong X-Sponkly-Timestamp. Mỗi chữ ký có hiệu lực 5 phút và chỉ cho một yêu cầu.
  5. Gửi cùng một yêu cầu hai lần trong vòng một giây (thử lại nhanh hoặc thăm dò)? Hãy ghi thời gian bằng mili giây; cách này cũng được chấp nhận và giữ mỗi chữ ký là duy nhất.
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" }));

Giữ an toàn cho khóa của bạn

  • Gọi API từ máy chủ của bạn. Không bao giờ đặt khóa hay mã bí mật ký trong trang web, ứng dụng di động hoặc kho mã công khai.
  • Bắt buộc yêu cầu có chữ ký cho mọi khóa trong môi trường production.
  • Thêm địa chỉ máy chủ của bạn vào địa chỉ được phép của khóa để khóa không hoạt động từ nơi nào khác.
  • Đặt hạn mức chi tiêu hằng ngày cho từng khóa để một sai sót hay rò rỉ chỉ gây tốn kém có giới hạn.
  • Dùng một khóa cho mỗi ứng dụng hoặc môi trường, và thu hồi khóa ngay khi bạn nghĩ nó đã bị lộ. Bạn cũng có thể tạo mã bí mật ký mới bất cứ lúc nào.
  • Dùng sai khóa hoặc chữ ký nhiều lần từ một địa chỉ sẽ khiến địa chỉ đó bị khóa trong 15 phút.
POST/v1/translate

Dịch văn bản

Dịch một văn bản hoặc danh sách tối đa 50 văn bản sang bất kỳ ngôn ngữ nào trong 32 ngôn ngữ. Bỏ trống ngôn ngữ nguồn để hệ thống tự nhận diện.

# 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"])

Trường: text (chuỗi hoặc mảng), target (mã ngôn ngữ), source (tùy chọn), context (tùy chọn, tối đa 1.000 ký tự cho biết văn bản nói về điều gì). Bạn trả tiền theo số ký tự gửi đi.

WSwss://api.sponkly.com/v1/live?source=en&target=tr

Dịch giọng nói trực tiếp

WebSocket cho giọng nói trực tiếp: gửi âm thanh ngay khi nói và nhận phụ đề đã dịch, cùng giọng nói đã dịch nếu bạn yêu cầu. 13 ngôn ngữ chính được dịch bằng mô hình giọng nói thời gian thực với độ trễ khoảng 1–2 giây; các ngôn ngữ còn lại qua hệ thống streaming của riêng chúng tôi.

// 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.
Tin nhắn từ máy chủÝ nghĩa
{"t":"ready","engine":"openai|own"}Phiên đã mở; engine cho biết ngôn ngữ này được dịch theo đường nào.
{"t":"partial","text":"…"}Lời nói đang được nhận dạng (có thể vẫn thay đổi).
{"t":"cap","id","text","done"}Một dòng đã dịch: hiển thị dần khi dài ra, là bản cuối khi done là true.
{"t":"pcm","d":"<base64>","r":24000}Một phần giọng nói đã dịch: PCM mono 16-bit ở tần số đã cho, dạng base64. Phát các phần nối tiếp nhau.
{"t":"problem","text":"noMinutes"}Số dư đã hết; phiên sẽ đóng.

Tham số: source và target (mã ngôn ngữ), voice=0 để chỉ nhận phụ đề (nửa giá). Gửi âm thanh theo thời gian thực (gửi nhanh hơn sẽ bị từ chối). Tối đa 10 phiên cùng lúc mỗi tài khoản, mỗi phiên 2 giờ. Bạn trả tiền theo từng giây lời nói được dịch; khoảng lặng và nhạc được miễn phí.

POST/v1/speech

Chuyển văn bản thành giọng nói

Chuyển văn bản thành giọng nói tự nhiên và trả về chính tệp âm thanh.

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

Trường: text (tối đa 4.096 ký tự), language, voice (female, male, neutral, hoặc alloy, ash, ballad, coral, echo, fable, onyx, nova, sage, shimmer, verse), format (mp3, wav hoặc opus), speed (0.5–2). Chi phí nằm trong header X-Sponkly-Cost-Usd.

POST/v1/transcribe

Chuyển giọng nói thành văn bản

Tải lên tệp âm thanh hoặc video (tối đa 25 MB và 60 phút); nhận văn bản có mốc thời gian, kèm bản dịch nếu bạn yêu cầu.

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" }
POST/v1/videos

Phụ đề và lồng tiếng video

Gửi video dài tối đa 5 phút và nhận lại bản đã dịch: phụ đề gắn cứng, giọng nói đã dịch hoặc cả hai, kèm tệp phụ đề bằng cả hai ngôn ngữ.

# 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" } } }

Trường: target, source (tùy chọn), dub (true để có giọng nói đã dịch), subtitles (translated, original, both hoặc none), content_type (video/mp4 hoặc video/quicktime), size_bytes, title (tùy chọn). Bạn trả tiền theo từng giây video khi đã biết độ dài. Kết quả có thể tải xuống trong 7 ngày.

GET/v1/balance · /v1/usage · /v1/languages

Số dư, mức sử dụng và ngôn ngữ

Kiểm tra số dư và thời điểm khoản nạp cũ nhất hết hạn, liệt kê các lệnh gọi đã tính phí, và lấy danh sách ngôn ngữ cùng giá hiện tại.

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 }

Lỗi

Lỗi được trả về dạng JSON với mã cố định và thông báo dễ đọc.

{ "error": { "code": "insufficient_balance", "message": "…" } }
400invalid_text · invalid_target · text_too_long …Yêu cầu thiếu thông tin hoặc có nội dung không được phép; thông báo sẽ nói rõ.
401missing_key · invalid_keyKhông có khóa API, hoặc khóa sai hay đã bị thu hồi.
402insufficient_balanceSố dư không đủ cho lệnh gọi này. Hãy nạp tiền trong bảng điều khiển.
429—Quá nhiều yêu cầu cùng lúc. Chờ một chút rồi thử lại.
502translation_failed · speech_failed …Lỗi xảy ra ở phía chúng tôi hoặc ở nhà cung cấp. Bạn không bị tính phí; hãy thử lại.

Giới hạn

  • Dịch văn bản: tối đa 50 văn bản và 20.000 ký tự mỗi yêu cầu, 5.000 ký tự mỗi văn bản.
  • Chuyển văn bản thành giọng nói: tối đa 4.096 ký tự mỗi yêu cầu.
  • Chuyển giọng nói thành văn bản: tệp tối đa 25 MB và 60 phút.
  • Dịch trực tiếp: tối đa 10 phiên cùng lúc mỗi tài khoản, mỗi phiên 2 giờ, âm thanh theo thời gian thực.
  • Video: tối đa 5 phút và 4 GB, xử lý 3 video cùng lúc; kết quả lưu 7 ngày.
  • Giới hạn mỗi khóa mỗi phút: 300 lượt dịch, 120 lượt giọng nói, 60 lượt chép lời và 20 video mới.
  • 32 ngôn ngữ: tiếng Anh, tiếng Thổ Nhĩ Kỳ, tiếng Đức, tiếng Pháp, tiếng Tây Ban Nha, tiếng Ý, tiếng Bồ Đào Nha, tiếng Nga, tiếng Nhật, tiếng Hàn, tiếng Trung, tiếng Ả Rập, tiếng Hindi, tiếng Hà Lan, tiếng Ba Lan, tiếng Thụy Điển, tiếng Na Uy, tiếng Đan Mạch, tiếng Phần Lan, tiếng Hy Lạp, tiếng Séc, tiếng Romania, tiếng Hungary, tiếng Ukraina, tiếng Do Thái, tiếng Thái, tiếng Việt, tiếng Indonesia, tiếng Mã Lai, tiếng Estonia, tiếng Ba Tư và tiếng Catalan.

Thanh toán

  • Trả trước: nạp tiền bằng thẻ từ $10; mỗi lệnh gọi được trừ vào số dư.
  • Phí xử lý thẻ được hiển thị và cộng thêm khi thanh toán, để bạn dùng trọn số tiền nạp.
  • Số tiền nạp dùng được trong 12 tháng kể từ khi mua và không được hoàn lại.
  • Lệnh gọi bị lỗi do phía chúng tôi không bị tính phí, và video bị lỗi sẽ được hoàn tiền.
  • Khi số dư sắp hết, chúng tôi sẽ gửi email cho bạn; khi về 0, các lệnh gọi bị từ chối với mã 402 cho đến khi bạn nạp tiền.