API dla deweloperów

Tłumaczenie na żywo we własnym produkcie

Jedno API do tłumaczenia mowy na żywo, tłumaczenia tekstu, mowy i wideo w 32 językach. Przedpłacone środki, płacisz tylko za to, czego używasz, bez opłaty miesięcznej.

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

Ile to kosztuje

Każde wywołanie jest opłacane z przedpłaconego salda. Wywołanie, które nie powiedzie się z naszej winy, nie jest naliczane.

Tłumaczenie mowy na żywo
Przesyłasz strumień mowy, a w kilka sekund otrzymujesz przetłumaczone napisy i przetłumaczony głos.
0,10 USD za minutę
Napisy na żywo
Ten sam strumień na żywo, tylko z przetłumaczonymi napisami.
0,05 USD za minutę
Tłumaczenie tekstu
Naturalne tłumaczenie z uwzględnieniem kontekstu, jednego tekstu lub do 50.
10,00 USD za 1 mln znaków
Zamiana tekstu na mowę
Tekst czytany naturalnym głosem, w formacie MP3, WAV lub Opus.
30,00 USD za 1 mln znaków
Zamiana mowy na tekst
Dźwięk lub wideo zamienione na tekst ze znacznikami czasu, opcjonalnie przetłumaczony.
0,01 USD za minutę
Napisy do wideo
Wideo z wtopionymi przetłumaczonymi napisami oraz pliki SRT.
0,20 USD za minutę
Dubbing wideo
Wideo z mową w innym języku, z napisami, jeśli chcesz.
0,50 USD za minutę

Uwierzytelnianie

Każde żądanie zawiera klucz API w nagłówku Authorization. Klucze tworzy się i unieważnia w panelu; każdy z nich korzysta z tego samego salda.

  1. Zarejestruj się bezpłatnie na sponkly.com i otwórz Panel → API dla deweloperów.
  2. Doładuj środki (od $10) i utwórz klucz API.
  3. Wysyłaj żądania na https://api.sponkly.com/v1 z nagłówkiem Authorization: Bearer <your key>.
Base URL:      https://api.sponkly.com/v1
Authorization: Bearer spk_…

Podpisane żądania

Każdy klucz API ma swój sekret podpisu. Jeśli podpisujesz nim żądania, sam skradziony klucz jest bezużyteczny, żądania nie da się zmienić po drodze, a tego samego żądania nie można wysłać dwa razy. Włącz „Wymagaj podpisanych żądań” dla klucza w panelu, a każde niepodpisane żądanie zostanie odrzucone.

  1. Weź bieżący czas w sekundach Unix oraz SHA-256 dokładnie tej treści, którą wysyłasz (przy przesyłaniu pliku: bajty pliku; dla GET i gniazda na żywo: pusta treść).
  2. Połącz je w tej kolejności, rozdzielając kropkami: znacznik czasu, metoda, ścieżka z ciągiem zapytania i hash treści.
  3. Oblicz HMAC-SHA256 tego tekstu za pomocą sekretu podpisu i zapisz go jako hex małymi literami.
  4. Wyślij go jako X-Sponkly-Signature: v1=<signature>, a czas jako X-Sponkly-Timestamp. Podpis jest ważny przez 5 minut i tylko dla jednego żądania.
  5. Wysyłasz to samo żądanie dwa razy w ciągu sekundy (szybka ponowna próba lub odpytywanie)? Podaj czas w milisekundach; to również jest akceptowane i każdy podpis pozostaje unikalny.
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" }));

Chroń swoje klucze

  • Wywołuj API ze swojego serwera. Nigdy nie umieszczaj klucza ani sekretu podpisu na stronie internetowej, w aplikacji mobilnej ani w publicznym repozytorium.
  • Wymagaj podpisanych żądań dla każdego klucza w środowisku produkcyjnym.
  • Dodaj adresy swoich serwerów do dozwolonych adresów klucza, aby klucz nie działał z żadnego innego miejsca.
  • Ustaw dzienny limit wydatków dla każdego klucza, aby błąd lub wyciek mógł kosztować tylko ograniczoną kwotę.
  • Używaj jednego klucza na aplikację lub środowisko i unieważnij klucz, gdy tylko podejrzewasz, że wyciekł. W każdej chwili możesz też utworzyć nowy sekret podpisu.
  • Powtarzające się błędne klucze lub podpisy z jednego adresu blokują ten adres na 15 minut.
POST/v1/translate

Tłumaczenie tekstu

Tłumaczy jeden tekst lub listę do 50 tekstów na dowolny z 32 języków. Pomiń język źródłowy, aby został wykryty automatycznie.

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

Pola: text (ciąg znaków lub tablica), target (kod języka), source (opcjonalne), context (opcjonalne, do 1000 znaków opisujących, czego dotyczy tekst). Płacisz za każdy wysłany znak.

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

Tłumaczenie mowy na żywo

WebSocket do mowy na żywo: wysyłaj dźwięk w trakcie mówienia i odbieraj przetłumaczone napisy oraz, na życzenie, przetłumaczony głos. Trzynaście głównych języków tłumaczy model mowy w czasie rzeczywistym z opóźnieniem ok. 1–2 sekund; pozostałe nasz własny potok strumieniowy.

// 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.
Wiadomość z serweraCo oznacza
{"t":"ready","engine":"openai|own"}Sesja jest otwarta; engine wskazuje, która ścieżka tłumaczenia obsługuje ten język.
{"t":"partial","text":"…"}Mowa rozpoznawana w tej chwili (może się jeszcze zmienić).
{"t":"cap","id","text","done"}Przetłumaczony wiersz: pokazywany w miarę narastania, ostateczny, gdy done ma wartość true.
{"t":"pcm","d":"<base64>","r":24000}Fragment przetłumaczonego głosu: 16-bitowy mono PCM z podaną częstotliwością, w base64. Odtwarzaj fragmenty jeden po drugim.
{"t":"problem","text":"noMinutes"}Saldo się wyczerpało; sesja zostaje zamknięta.

Parametry: source i target (kody języków), voice=0 tylko dla napisów (za pół ceny). Wysyłaj dźwięk w czasie rzeczywistym (szybsze przesyłanie jest odrzucane). Do 10 jednoczesnych sesji na konto, każda do 2 godzin. Płacisz za każdą sekundę przetłumaczonej mowy; cisza i muzyka są bezpłatne.

POST/v1/speech

Zamiana tekstu na mowę

Zamienia tekst na naturalną mowę i zwraca sam plik audio.

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

Pola: text (do 4096 znaków), language, voice (female, male, neutral lub alloy, ash, ballad, coral, echo, fable, onyx, nova, sage, shimmer, verse), format (mp3, wav lub opus), speed (0.5–2). Koszt znajduje się w nagłówku X-Sponkly-Cost-Usd.

POST/v1/transcribe

Zamiana mowy na tekst

Prześlij plik audio lub wideo (do 25 MB i 60 minut); otrzymasz tekst ze znacznikami czasu i, na życzenie, jego tłumaczenie.

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

Napisy do wideo i dubbing

Wyślij wideo trwające do 5 minut i odbierz je przetłumaczone: z wtopionymi napisami, przetłumaczonym głosem lub jednym i drugim, a także z plikami napisów w obu językach.

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

Pola: target, source (opcjonalne), dub (true dla przetłumaczonego głosu), subtitles (translated, original, both lub none), content_type (video/mp4 lub video/quicktime), size_bytes, title (opcjonalne). Płacisz za każdą sekundę wideo, gdy znana jest jego długość. Wyniki można pobierać przez 7 dni.

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

Saldo, użycie i języki

Sprawdź saldo i termin wygaśnięcia najstarszych środków, wyświetl listę naliczonych wywołań oraz pobierz języki i aktualne ceny.

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 }

Błędy

Błędy są zwracane jako JSON ze stałym kodem i czytelnym komunikatem.

{ "error": { "code": "insufficient_balance", "message": "…" } }
400invalid_text · invalid_target · text_too_long …W żądaniu czegoś brakuje lub coś jest niedozwolone; komunikat wskazuje co.
401missing_key · invalid_keyBrak klucza API albo klucz jest błędny lub unieważniony.
402insufficient_balanceSaldo nie pokrywa tego wywołania. Doładuj środki w panelu.
429—Zbyt wiele żądań naraz. Poczekaj chwilę i spróbuj ponownie.
502translation_failed · speech_failed …Błąd po naszej stronie lub u dostawcy. Nic nie zostało pobrane; spróbuj ponownie.

Limity

  • Tłumaczenie tekstu: do 50 tekstów i 20 000 znaków na żądanie, 5000 na tekst.
  • Zamiana tekstu na mowę: do 4096 znaków na żądanie.
  • Zamiana mowy na tekst: pliki do 25 MB i 60 minut.
  • Tłumaczenie na żywo: do 10 jednoczesnych sesji na konto, każda do 2 godzin, dźwięk w czasie rzeczywistym.
  • Wideo: do 5 minut i 4 GB, 3 przetwarzane jednocześnie; wyniki przechowywane przez 7 dni.
  • Limity na klucz na minutę: 300 tłumaczeń, 120 syntez mowy, 60 transkrypcji i 20 nowych filmów.
  • 32 języki: angielski, turecki, niemiecki, francuski, hiszpański, włoski, portugalski, rosyjski, japoński, koreański, chiński, arabski, hindi, niderlandzki, polski, szwedzki, norweski, duński, fiński, grecki, czeski, rumuński, węgierski, ukraiński, hebrajski, tajski, wietnamski, indonezyjski, malajski, estoński, perski i kataloński.

Rozliczenia

  • Przedpłata: doładuj środki kartą od $10; każde wywołanie jest pobierane z salda.
  • Opłata za obsługę karty jest pokazywana i doliczana przy płatności, dzięki czemu całe doładowanie pozostaje do Twojej dyspozycji.
  • Środki można wykorzystać przez 12 miesięcy od zakupu. Nie podlegają zwrotowi.
  • Wywołanie, które nie powiedzie się z naszej winy, nie jest naliczane, a za nieudane wideo zwracamy środki.
  • Gdy saldo się kończy, wysyłamy e-mail; przy zerowym saldzie wywołania są odrzucane z kodem 402, dopóki nie doładujesz środków.