API สำหรับนักพัฒนา

การแปลสดสำหรับผลิตภัณฑ์ของคุณ

API เดียวสำหรับการแปลเสียงสด การแปลข้อความ เสียงพูด และวิดีโอใน 32 ภาษา เครดิตแบบเติมเงินล่วงหน้า จ่ายเฉพาะที่ใช้ ไม่มีค่ารายเดือน

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

ค่าใช้จ่าย

ทุกการเรียกจะหักจากยอดเงินที่เติมไว้ล่วงหน้า การเรียกที่ล้มเหลวจากฝั่งเราจะไม่ถูกคิดเงิน

การแปลเสียงสด
ส่งเสียงพูดเข้ามาแบบสตรีม แล้วรับคำบรรยายที่แปลและเสียงที่แปลกลับไปภายในไม่กี่วินาที
US$0.10 ต่อนาที
คำบรรยายสด
สตรีมสดแบบเดียวกัน แต่รับเฉพาะคำบรรยายที่แปล
US$0.05 ต่อนาที
การแปลข้อความ
แปลอย่างเป็นธรรมชาติและเข้าใจบริบท ครั้งละหนึ่งข้อความหรือสูงสุด 50 ข้อความ
US$10.00 ต่อ 1 ล้านอักขระ
แปลงข้อความเป็นเสียงพูด
อ่านข้อความออกเสียงด้วยเสียงที่เป็นธรรมชาติ ในรูปแบบ MP3, WAV หรือ Opus
US$30.00 ต่อ 1 ล้านอักขระ
แปลงเสียงพูดเป็นข้อความ
แปลงเสียงหรือวิดีโอเป็นข้อความพร้อมเวลากำกับ และแปลได้ตามต้องการ
US$0.01 ต่อนาที
คำบรรยายวิดีโอ
ได้วิดีโอกลับมาพร้อมคำบรรยายแปลที่ฝังในวิดีโอ และไฟล์ SRT
US$0.20 ต่อนาที
พากย์เสียงวิดีโอ
ได้วิดีโอกลับมาพากย์เป็นภาษาอื่น พร้อมคำบรรยายหากต้องการ
US$0.50 ต่อนาที

การยืนยันตัวตน

ทุกคำขอต้องมีคีย์ API ของคุณในส่วนหัว Authorization สร้างและเพิกถอนคีย์ได้ในแดชบอร์ด ทุกคีย์ใช้ยอดคงเหลือเดียวกัน

  1. สมัครฟรีที่ sponkly.com แล้วเปิด แดชบอร์ด → API สำหรับนักพัฒนา
  2. เติมเครดิต (เริ่มต้น $10) แล้วสร้างคีย์ API
  3. ส่งคำขอไปที่ https://api.sponkly.com/v1 พร้อม Authorization: Bearer <your key>
Base URL:      https://api.sponkly.com/v1
Authorization: Bearer spk_…

คำขอที่ลงนาม

คีย์ API ทุกคีย์มาพร้อมรหัสลับสำหรับลงนาม เมื่อคุณลงนามคำขอด้วยรหัสนี้ คีย์ที่ถูกขโมยไปเพียงอย่างเดียวจะใช้ไม่ได้ คำขอจะถูกแก้ไขระหว่างทางไม่ได้ และส่งคำขอเดิมซ้ำไม่ได้ เปิด "บังคับให้คำขอต้องลงนาม" สำหรับคีย์ในแดชบอร์ด แล้วคำขอที่ไม่ได้ลงนามทั้งหมดจะถูกปฏิเสธ

  1. ใช้เวลาปัจจุบันเป็นวินาที Unix และค่า SHA-256 ของ body ที่คุณส่งจริงแบบตรงทุกไบต์ (สำหรับการอัปโหลดไฟล์: ไบต์ของไฟล์ สำหรับ GET และ live socket: body ว่าง)
  2. ต่อค่าเหล่านี้โดยคั่นด้วยจุดตามลำดับ: timestamp, เมธอด, พาธพร้อม query string และค่าแฮชของ body
  3. สร้าง HMAC-SHA256 ของข้อความนั้นด้วยรหัสลับสำหรับลงนามของคุณ ในรูปเลขฐานสิบหกตัวพิมพ์เล็ก
  4. ส่งเป็น X-Sponkly-Signature: v1=<signature> พร้อมเวลาใน X-Sponkly-Timestamp ลายเซ็นหนึ่งรายการใช้ได้ 5 นาทีและสำหรับคำขอเดียวเท่านั้น
  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 จากเซิร์ฟเวอร์ของคุณ ห้ามใส่คีย์หรือรหัสลับสำหรับลงนามไว้ในหน้าเว็บ แอปมือถือ หรือรีโพสิทอรีสาธารณะ
  • บังคับให้ทุกคีย์ใน production ต้องใช้คำขอที่ลงนาม
  • ระบุที่อยู่ของเซิร์ฟเวอร์ของคุณในที่อยู่ที่อนุญาตของคีย์ เพื่อไม่ให้คีย์ใช้งานได้จากที่อื่น
  • ตั้งวงเงินใช้จ่ายรายวันให้แต่ละคีย์ เพื่อให้ความผิดพลาดหรือการรั่วไหลเสียเงินได้ไม่เกินจำนวนที่จำกัด
  • ใช้หนึ่งคีย์ต่อหนึ่งแอปหรือหนึ่งสภาพแวดล้อม และเพิกถอนคีย์ทันทีที่คิดว่าคีย์อาจรั่วไหล คุณยังสร้างรหัสลับสำหรับลงนามใหม่ได้ทุกเมื่อ
  • หากมีคีย์หรือลายเซ็นที่ผิดซ้ำๆ จากที่อยู่เดียว ที่อยู่นั้นจะถูกล็อกเป็นเวลา 15 นาที
POST/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 อักขระที่บอกว่าข้อความเกี่ยวกับอะไร) คิดเงินตามจำนวนอักขระที่ส่ง

WSwss://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}ส่วนหนึ่งของเสียงที่แปล: PCM โมโน 16 บิตตามอัตราที่ระบุ เข้ารหัส base64 เล่นแต่ละส่วนต่อกัน
{"t":"problem","text":"noMinutes"}ยอดคงเหลือหมดแล้ว เซสชันจะปิด

พารามิเตอร์: source และ target (รหัสภาษา), voice=0 สำหรับคำบรรยายอย่างเดียว (ราคาครึ่งหนึ่ง) ส่งเสียงแบบเรียลไทม์ (ส่งเร็วกว่านั้นจะถูกปฏิเสธ) สูงสุด 10 เซสชันพร้อมกันต่อบัญชี เซสชันละ 2 ชั่วโมง คิดเงินตามวินาทีของเสียงพูดที่แปล ช่วงเงียบและเพลงไม่คิดเงิน

POST/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

POST/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" }
POST/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 วัน

GET/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": "…" } }
400invalid_text · invalid_target · text_too_long …คำขอขาดข้อมูลบางอย่างหรือมีค่าที่ไม่อนุญาต ข้อความจะบอกว่าเป็นอะไร
401missing_key · invalid_keyไม่มีคีย์ API หรือคีย์ไม่ถูกต้องหรือถูกเพิกถอนแล้ว
402insufficient_balanceยอดคงเหลือไม่พอสำหรับการเรียกนี้ เติมเครดิตได้ในแดชบอร์ด
429—มีคำขอพร้อมกันมากเกินไป รอสักครู่แล้วลองใหม่
502translation_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 จนกว่าคุณจะเติมเครดิต