Geliştiriciler için API

Kendi ürününüz için canlı çeviri

32 dilde canlı sesli çeviri, metin çevirisi, metinden sese ve video için tek bir API. Ön ödemeli kredi; yalnızca kullandığınız kadar ödersiniz, aylık ücret yok.

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

Ücretler

Her çağrı ön ödemeli bakiyenizden ödenir. Bizden kaynaklanan bir nedenle başarısız olan çağrılar ücretlendirilmez.

Canlı sesli çeviri
Konuşmayı akış olarak gönderin; çevrilmiş altyazıları ve çevrilmiş sesi saniyeler içinde geri alın.
Dakika başına $0,10
Canlı altyazı
Aynı canlı akış, yalnızca çevrilmiş altyazılarla.
Dakika başına $0,05
Metin çevirisi
Tek bir metnin ya da en fazla 50 metnin bağlamı gözeten, doğal çevirisi.
1 milyon karakter başına $10,00
Metinden sese
Metin, doğal bir sesle MP3, WAV veya Opus olarak okunur.
1 milyon karakter başına $30,00
Sesten metne
Ses veya videodan zaman damgalı metin; isterseniz çevirisiyle.
Dakika başına $0,01
Video altyazısı
Çevrilmiş altyazıları videoya işlenmiş olarak geri alın; SRT dosyaları da dahil.
Dakika başına $0,20
Video seslendirmesi
Videonuz başka bir dilde seslendirilmiş olarak geri gelir; dilerseniz altyazılı.
Dakika başına $0,50

Kimlik doğrulama

Her istek, API anahtarınızı Authorization başlığında taşır. Anahtarlar panelinizde oluşturulur ve iptal edilir; hepsi aynı bakiyeyi kullanır.

  1. sponkly.com'da ücretsiz kaydolun ve Panel → Geliştiriciler için API sayfasını açın.
  2. Kredi yükleyin ($10'dan başlayarak) ve bir API anahtarı oluşturun.
  3. İsteklerinizi Authorization: Bearer <your key> ile https://api.sponkly.com/v1 adresine gönderin.
Base URL:      https://api.sponkly.com/v1
Authorization: Bearer spk_…

İmzalı istekler

Her API anahtarı bir imza gizli anahtarıyla gelir. İsteklerinizi bununla imzaladığınızda çalınan bir anahtar tek başına işe yaramaz, bir istek yolda değiştirilemez ve aynı istek iki kez gönderilemez. Panelinizde anahtar için "İmzalı istekleri zorunlu kıl" seçeneğini açın; imzasız her istek reddedilir.

  1. Geçerli zamanı Unix saniyesi olarak ve gönderdiğiniz gövdenin birebir SHA-256 değerini alın (dosya yüklemede: dosyanın baytları; GET ve canlı soket için: boş gövde).
  2. Bunları şu sırayla, aralarına nokta koyarak birleştirin: zaman damgası, yöntem, sorgu dizesiyle birlikte yol ve gövde hash'i.
  3. Bu metnin HMAC-SHA256 değerini imza gizli anahtarınızla, küçük harfli hex olarak hesaplayın.
  4. Bunu X-Sponkly-Signature: v1=<signature> olarak, zamanı da X-Sponkly-Timestamp olarak gönderin. Bir imza 5 dakika ve tek bir istek için geçerlidir.
  5. Aynı isteği bir saniye içinde iki kez mi gönderiyorsunuz (hızlı bir yeniden deneme ya da sorgulama)? Zamanı milisaniye olarak verin; bu da kabul edilir ve her imzayı benzersiz tutar.
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" }));

Anahtarlarınızı güvende tutun

  • API'yi sunucunuzdan çağırın. Bir anahtarı veya imza gizli anahtarını asla bir web sayfasına, mobil uygulamaya ya da herkese açık bir depoya koymayın.
  • Canlı ortamdaki her anahtar için imzalı istekleri zorunlu kılın.
  • Sunucularınızın adreslerini anahtarın izin verilen adreslerine ekleyin; böylece anahtar başka hiçbir yerden çalışmaz.
  • Her anahtar için günlük harcama sınırı belirleyin; böylece bir hata ya da sızıntının maliyeti sınırlı kalır.
  • Her uygulama veya ortam için ayrı bir anahtar kullanın ve açığa çıktığını düşündüğünüz anda anahtarı iptal edin. İstediğiniz zaman yeni bir imza gizli anahtarı da oluşturabilirsiniz.
  • Bir adresten art arda gelen hatalı anahtar veya imzalar, o adresi 15 dakika boyunca engeller.
POST/v1/translate

Metin çevirisi

Tek bir metni ya da en fazla 50 metinlik bir listeyi 32 dilden herhangi birine çevirir. Kaynak dili belirtmezseniz otomatik algılanır.

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

Alanlar: text (dize veya dizi), target (dil kodu), source (isteğe bağlı), context (isteğe bağlı; metnin ne hakkında olduğunu anlatan en fazla 1.000 karakter). Gönderilen karakter başına ödersiniz.

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

Canlı sesli çeviri

Canlı konuşma için bir WebSocket: sesi konuşuldukça gönderin; çevrilmiş altyazıları ve isterseniz çevrilmiş sesi alın. On üç büyük dil, yaklaşık 1–2 saniye gecikmeyle gerçek zamanlı bir konuşma modeliyle çevrilir; diğerleri kendi akış altyapımızla.

// 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.
Sunucudan gelen mesajAnlamı
{"t":"ready","engine":"openai|own"}Oturum açıldı; engine, bu dili hangi çeviri yolunun işlediğini belirtir.
{"t":"partial","text":"…"}Şu anda tanınan konuşma (hâlâ değişebilir).
{"t":"cap","id","text","done"}Çevrilmiş bir satır: uzadıkça gösterilir, done true olduğunda kesinleşir.
{"t":"pcm","d":"<base64>","r":24000}Çevrilmiş sesin bir parçası: belirtilen örnekleme hızında 16 bit mono PCM, base64. Parçaları arka arkaya çalın.
{"t":"problem","text":"noMinutes"}Bakiyeniz bitti; oturum kapanır.

Parametreler: source ve target (dil kodları), yalnızca altyazı için voice=0 (yarı fiyat). Sesi gerçek zamanlı gönderin (daha hızlısı reddedilir). Hesap başına aynı anda en fazla 10 oturum, her biri 2 saat. Çevrilen konuşmanın saniyesi başına ödersiniz; sessizlik ve müzik ücretsizdir.

POST/v1/speech

Metinden sese

Metni doğal konuşmaya dönüştürür ve ses dosyasının kendisini döndürür.

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

Alanlar: text (en fazla 4.096 karakter), language, voice (female, male, neutral ya da alloy, ash, ballad, coral, echo, fable, onyx, nova, sage, shimmer, verse), format (mp3, wav veya opus), speed (0.5–2). Ücret X-Sponkly-Cost-Usd başlığında yer alır.

POST/v1/transcribe

Sesten metne

Bir ses veya video dosyası yükleyin (en fazla 25 MB ve 60 dakika); zaman damgalı metni ve isterseniz çevirisini alın.

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

Video altyazısı ve seslendirme

En fazla 5 dakikalık bir video gönderin ve çevrilmiş olarak geri alın: videoya işlenmiş altyazılar, çevrilmiş ses ya da ikisi birden; ayrıca iki dilde altyazı dosyaları.

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

Alanlar: target, source (isteğe bağlı), dub (çevrilmiş ses için true), subtitles (translated, original, both veya none), content_type (video/mp4 veya video/quicktime), size_bytes, title (isteğe bağlı). Videonun uzunluğu belli olduğunda saniyesi başına ödersiniz. Sonuçlar 7 gün boyunca indirilebilir.

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

Bakiye, kullanım ve diller

Bakiyenizi ve en eski kredinizin ne zaman sona ereceğini görün, ücretlendirilen çağrılarınızı listeleyin, dilleri ve güncel fiyatları alın.

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 }

Hatalar

Hatalar, sabit bir kod ve okunabilir bir mesajla JSON olarak döner.

{ "error": { "code": "insufficient_balance", "message": "…" } }
400invalid_text · invalid_target · text_too_long …İstekte eksik ya da izin verilmeyen bir şey var; mesaj ne olduğunu belirtir.
401missing_key · invalid_keyAPI anahtarı yok ya da anahtar hatalı veya iptal edilmiş.
402insufficient_balanceBakiyeniz bu çağrıyı karşılamıyor. Panelden kredi yükleyin.
429—Aynı anda çok fazla istek. Biraz bekleyip tekrar deneyin.
502translation_failed · speech_failed …Bizim tarafımızda ya da bir sağlayıcıda hata oluştu. Ücret alınmadı; tekrar deneyin.

Sınırlar

  • Metin çevirisi: istek başına en fazla 50 metin ve 20.000 karakter, metin başına 5.000 karakter.
  • Metinden sese: istek başına en fazla 4.096 karakter.
  • Sesten metne: en fazla 25 MB ve 60 dakikalık dosyalar.
  • Canlı çeviri: hesap başına aynı anda en fazla 10 oturum, her biri 2 saat, ses gerçek zamanlı.
  • Videolar: en fazla 5 dakika ve 4 GB, aynı anda 3 video hazırlanır; sonuçlar 7 gün saklanır.
  • Anahtar başına dakikalık sınırlar: 300 çeviri, 120 metinden sese, 60 sesten metne ve 20 yeni video.
  • 32 dil: İngilizce, Türkçe, Almanca, Fransızca, İspanyolca, İtalyanca, Portekizce, Rusça, Japonca, Korece, Çince, Arapça, Hintçe, Felemenkçe, Lehçe, İsveççe, Norveççe, Danca, Fince, Yunanca, Çekçe, Rumence, Macarca, Ukraynaca, İbranice, Tayca, Vietnamca, Endonezce, Malayca, Estonca, Farsça ve Katalanca.

Faturalandırma

  • Ön ödemeli: $10'dan başlayarak kartla kredi yükleyin; her çağrı bakiyenizden düşülür.
  • Kart işlem ücreti ödeme sırasında gösterilir ve eklenir; böylece kredinizin tamamını kullanabilirsiniz.
  • Kredi, satın alındıktan sonra 12 ay boyunca kullanılabilir. İade edilmez.
  • Bizden kaynaklanan bir nedenle başarısız olan çağrılar ücretlendirilmez; başarısız olan videoların ücreti iade edilir.
  • Bakiyeniz azaldığında size e-posta göndeririz; sıfıra indiğinde, kredi yükleyene kadar çağrılar 402 ile reddedilir.