API توسعه‌دهندگان

ترجمهٔ زنده برای محصول خودتان

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

هزینه‌ها

هزینهٔ هر فراخوانی از موجودی پیش‌پرداخت شما کم می‌شود. فراخوانی‌ای که به خاطر خطای ما ناموفق باشد، هزینه‌ای ندارد.

ترجمهٔ صوتی زنده
گفتار را به‌صورت جریانی بفرستید و در چند ثانیه زیرنویس ترجمه‌شده و صدای ترجمه‌شده تحویل بگیرید.
‎$۰٫۱۰ برای هر دقیقه
زیرنویس زنده
همان جریان زنده، فقط با زیرنویس ترجمه‌شده.
‎$۰٫۰۵ برای هر دقیقه
ترجمهٔ متن
ترجمهٔ طبیعی و آگاه از بافت، برای یک متن یا حداکثر ۵۰ متن.
‎$۱۰٫۰۰ برای هر ۱ میلیون نویسه
تبدیل متن به گفتار
خواندن متن با صدایی طبیعی، در قالب MP3، WAV یا Opus.
‎$۳۰٫۰۰ برای هر ۱ میلیون نویسه
تبدیل گفتار به متن
تبدیل صوت یا ویدئو به متن با زمان‌بندی، در صورت تمایل همراه با ترجمه.
‎$۰٫۰۱ برای هر دقیقه
زیرنویس ویدئو
ویدئو با زیرنویس ترجمه‌شدهٔ نشسته روی تصویر برمی‌گردد، به‌علاوهٔ فایل‌های SRT.
‎$۰٫۲۰ برای هر دقیقه
دوبلهٔ ویدئو
ویدئو با گفتار به زبانی دیگر برمی‌گردد، و اگر بخواهید با زیرنویس.
‎$۰٫۵۰ برای هر دقیقه

احراز هویت

هر درخواست کلید API شما را در سرآیند Authorization همراه دارد. کلیدها در داشبورد ساخته و باطل می‌شوند و همه از یک موجودی خرج می‌کنند.

  1. در sponkly.com رایگان ثبت‌نام کنید و داشبورد ← API توسعه‌دهندگان را باز کنید.
  2. اعتبار اضافه کنید (از $10) و یک کلید API بسازید.
  3. درخواست‌ها را با Authorization: Bearer <your key> به https://api.sponkly.com/v1 بفرستید.
Base URL:      https://api.sponkly.com/v1
Authorization: Bearer spk_…

درخواست‌های امضاشده

هر کلید API یک رمز امضا دارد. وقتی درخواست‌هایتان را با آن امضا کنید، کلید دزدیده‌شده به‌تنهایی بی‌فایده است، درخواست در مسیر قابل تغییر نیست و همان درخواست را نمی‌توان دو بار فرستاد. گزینهٔ «الزام درخواست‌های امضاشده» را برای کلید در داشبورد روشن کنید تا هر درخواست امضانشده رد شود.

  1. زمان فعلی را به ثانیهٔ Unix و SHA-256 دقیقاً همان بدنه‌ای را که می‌فرستید بگیرید (برای بارگذاری فایل: بایت‌های فایل؛ برای GET و سوکت زنده: بدنهٔ خالی).
  2. آن‌ها را به این ترتیب پشت هم بگذارید و با نقطه از هم جدا کنید: مهر زمانی، متد، مسیر همراه با رشتهٔ پرس‌وجو و هش بدنه.
  3. با رمز امضای خود از این متن یک HMAC-SHA256 بسازید، به صورت هگز با حروف کوچک.
  4. آن را به صورت 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 را از سرور خود فراخوانی کنید. هرگز کلید یا رمز امضا را در صفحهٔ وب، برنامهٔ موبایل یا مخزن عمومی قرار ندهید.
  • در محیط عملیاتی، برای همهٔ کلیدها درخواست امضاشده را الزامی کنید.
  • نشانی سرورهای خود را در نشانی‌های مجاز کلید وارد کنید تا کلید از هیچ جای دیگری کار نکند.
  • برای هر کلید سقف هزینهٔ روزانه تعیین کنید تا یک اشتباه یا نشت فقط هزینهٔ محدودی داشته باشد.
  • برای هر برنامه یا محیط یک کلید جدا به کار ببرید و به محض اینکه گمان کردید کلیدی لو رفته، آن را باطل کنید. هر زمان هم می‌توانید رمز امضای جدیدی بسازید.
  • کلیدها یا امضاهای نادرست مکرر از یک نشانی، آن نشانی را به مدت ۱۵ دقیقه مسدود می‌کند.
POST/v1/translate

ترجمهٔ متن

یک متن یا فهرستی تا ۵۰ متن را به هر یک از ۳۲ زبان ترجمه می‌کند. اگر زبان مبدأ را مشخص نکنید، خودکار تشخیص داده می‌شود.

# 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 (اختیاری، تا ۱٬۰۰۰ نویسه که می‌گوید متن دربارهٔ چیست). هزینه بر اساس تعداد نویسه‌های ارسالی است.

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

ترجمهٔ صوتی زنده

یک WebSocket برای گفتار زنده: صدا را همزمان با صحبت بفرستید و زیرنویس ترجمه‌شده و در صورت درخواست، صدای ترجمه‌شده دریافت کنید. سیزده زبان اصلی با یک مدل گفتار بلادرنگ و حدود ۱ تا ۲ ثانیه تأخیر ترجمه می‌شوند؛ بقیه با زنجیرهٔ پردازش جریانی خود ما.

// 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 تک‌کاناله ۱۶ بیتی با نرخ داده‌شده، به‌صورت base64. تکه‌ها را پشت سر هم پخش کنید.
{"t":"problem","text":"noMinutes"}موجودی شما تمام شد؛ نشست بسته می‌شود.

پارامترها: source و target (کد زبان)، voice=0 فقط برای زیرنویس (نصف قیمت). صدا را بلادرنگ بفرستید (ارسال سریع‌تر پذیرفته نمی‌شود). حداکثر ۱۰ نشست همزمان برای هر حساب، هر کدام ۲ ساعت. هزینه بر اساس ثانیه‌های گفتار ترجمه‌شده است؛ سکوت و موسیقی رایگان است.

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 (تا ۴٬۰۹۶ نویسه)، 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

تبدیل گفتار به متن

یک فایل صوتی یا ویدئویی بارگذاری کنید (تا ۲۵ MB و ۶۰ دقیقه)؛ متن را با زمان‌بندی و در صورت درخواست، ترجمه‌اش را دریافت کنید.

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

زیرنویس و دوبلهٔ ویدئو

ویدئویی تا ۵ دقیقه بفرستید و ترجمه‌شده تحویل بگیرید: زیرنویس روی تصویر، صدای ترجمه‌شده یا هر دو، به‌علاوهٔ فایل‌های زیرنویس به هر دو زبان.

# 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 (اختیاری). هزینه پس از مشخص شدن طول ویدئو، به ازای هر ثانیه محاسبه می‌شود. نتایج تا ۷ روز قابل دانلود است.

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 …خطا از سمت ما یا یک ارائه‌دهنده بود. هزینه‌ای از شما کم نشد؛ دوباره تلاش کنید.

محدودیت‌ها

  • ترجمهٔ متن: تا ۵۰ متن و ۲۰٬۰۰۰ نویسه در هر درخواست، ۵٬۰۰۰ نویسه برای هر متن.
  • تبدیل متن به گفتار: تا ۴٬۰۹۶ نویسه در هر درخواست.
  • تبدیل گفتار به متن: فایل‌ها تا ۲۵ MB و ۶۰ دقیقه.
  • ترجمهٔ زنده: تا ۱۰ نشست همزمان برای هر حساب، هر کدام ۲ ساعت، صدا به‌صورت بلادرنگ.
  • ویدئوها: تا ۵ دقیقه و ۴ GB، ساخت همزمان ۳ ویدئو؛ نتایج ۷ روز نگه داشته می‌شوند.
  • سقف هر کلید در دقیقه: ۳۰۰ ترجمه، ۱۲۰ گفتار، ۶۰ رونویسی و ۲۰ ویدئوی جدید.
  • ۳۲ زبان: انگلیسی، ترکی، آلمانی، فرانسوی، اسپانیایی، ایتالیایی، پرتغالی، روسی، ژاپنی، کره‌ای، چینی، عربی، هندی، هلندی، لهستانی، سوئدی، نروژی، دانمارکی، فنلاندی، یونانی، چکی، رومانیایی، مجاری، اوکراینی، عبری، تایلندی، ویتنامی، اندونزیایی، مالایی، استونیایی، فارسی و کاتالان.

صورت‌حساب

  • پیش‌پرداخت: با کارت از $10 اعتبار اضافه کنید؛ هزینهٔ هر فراخوانی از موجودی‌تان کم می‌شود.
  • کارمزد پردازش کارت هنگام پرداخت نمایش داده و اضافه می‌شود، تا کل اعتبار برای خودتان بماند.
  • اعتبار تا ۱۲ ماه پس از خرید قابل استفاده است و قابل بازپرداخت نیست.
  • فراخوانی‌ای که به خاطر خطای ما ناموفق باشد هزینه‌ای ندارد، و هزینهٔ ویدئوی ناموفق بازگردانده می‌شود.
  • وقتی موجودی‌تان کم شود به شما ایمیل می‌زنیم؛ در صفر، فراخوانی‌ها تا افزودن اعتبار با 402 رد می‌شوند.