API voor ontwikkelaars

Live vertaling voor je eigen product

Eén API voor live spraakvertaling, tekstvertaling, spraak en video in 32 talen. Vooraf betaald tegoed, je betaalt alleen wat je gebruikt, geen maandelijkse kosten.

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

Wat het kost

Elke aanroep wordt betaald uit je vooraf betaalde saldo. Een aanroep die aan onze kant mislukt, wordt niet in rekening gebracht.

Live spraakvertaling
Stream spraak en krijg binnen enkele seconden vertaalde ondertiteling en een vertaalde stem terug.
US$ 0,10 per minuut
Live ondertiteling
Dezelfde live stream, alleen met vertaalde ondertiteling.
US$ 0,05 per minuut
Tekstvertaling
Natuurlijke vertaling die rekening houdt met de context, van één tekst of tot 50.
US$ 10,00 per 1 mln. tekens
Tekst naar spraak
Tekst voorgelezen met een natuurlijke stem, als MP3, WAV of Opus.
US$ 30,00 per 1 mln. tekens
Spraak naar tekst
Audio of video naar tekst met tijdcodes, desgewenst vertaald.
US$ 0,01 per minuut
Video-ondertiteling
Je video terug met ingebrande vertaalde ondertiteling, plus SRT-bestanden.
US$ 0,20 per minuut
Video-nasynchronisatie
Je video terug, ingesproken in een andere taal, met ondertiteling als je wilt.
US$ 0,50 per minuut

Authenticatie

Elk verzoek bevat je API-sleutel in de Authorization-header. Sleutels maak je en trek je in via je dashboard; ze besteden allemaal hetzelfde saldo.

  1. Meld je gratis aan op sponkly.com en open Dashboard → API voor ontwikkelaars.
  2. Waardeer tegoed op (vanaf $10) en maak een API-sleutel.
  3. Stuur verzoeken naar https://api.sponkly.com/v1 met Authorization: Bearer <your key>.
Base URL:      https://api.sponkly.com/v1
Authorization: Bearer spk_…

Ondertekende verzoeken

Bij elke API-sleutel hoort een ondertekeningsgeheim. Als je je verzoeken daarmee ondertekent, is een gestolen sleutel alleen nutteloos, kan een verzoek onderweg niet worden gewijzigd en kan hetzelfde verzoek niet twee keer worden verstuurd. Zet ‘Ondertekende verzoeken vereisen’ aan voor de sleutel in je dashboard en elk niet-ondertekend verzoek wordt geweigerd.

  1. Neem de huidige tijd in Unix-seconden en de SHA-256 van de exacte body die je verstuurt (bij een bestandsupload: de bytes van het bestand; bij GET en de live socket: een lege body).
  2. Voeg ze in deze volgorde samen, gescheiden door punten: tijdstempel, methode, pad met querystring en de body-hash.
  3. Maak met je ondertekeningsgeheim een HMAC-SHA256 van die tekst, in hex met kleine letters.
  4. Stuur die mee als X-Sponkly-Signature: v1=<signature>, met de tijd als X-Sponkly-Timestamp. Een handtekening is 5 minuten en voor één verzoek geldig.
  5. Stuurt u hetzelfde verzoek twee keer binnen één seconde (een snelle nieuwe poging of polling)? Geef de tijd dan in milliseconden; dat wordt ook geaccepteerd en houdt elke handtekening uniek.
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" }));

Houd je sleutels veilig

  • Roep de API aan vanaf je server. Zet nooit een sleutel of ondertekeningsgeheim in een webpagina, een mobiele app of een openbare repository.
  • Vereis ondertekende verzoeken voor elke sleutel in productie.
  • Zet de adressen van je servers bij de toegestane adressen van de sleutel, zodat de sleutel nergens anders werkt.
  • Stel per sleutel een dagelijkse bestedingslimiet in, zodat een fout of lek maar beperkt geld kan kosten.
  • Gebruik één sleutel per app of omgeving en trek een sleutel in zodra je denkt dat hij is uitgelekt. Je kunt ook op elk moment een nieuw ondertekeningsgeheim maken.
  • Herhaaldelijk verkeerde sleutels of handtekeningen vanaf één adres blokkeren dat adres 15 minuten.
POST/v1/translate

Tekstvertaling

Vertaalt één tekst of een lijst van maximaal 50 naar een van de 32 talen. Laat de brontaal weg om die automatisch te laten herkennen.

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

Velden: text (string of array), target (taalcode), source (optioneel), context (optioneel, tot 1.000 tekens die aangeven waar de tekst over gaat). Je betaalt per verzonden teken.

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

Live spraakvertaling

Een WebSocket voor live spraak: stuur de audio terwijl er gesproken wordt en ontvang vertaalde ondertiteling en, als je daarom vraagt, een vertaalde stem. Dertien grote talen worden vertaald door een realtime spraakmodel met ongeveer 1–2 seconden vertraging; de andere door onze eigen streamingpipeline.

// 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.
Bericht van de serverBetekenis
{"t":"ready","engine":"openai|own"}De sessie is geopend; engine geeft aan welk vertaalpad deze taal bedient.
{"t":"partial","text":"…"}De spraak die nu wordt herkend (kan nog veranderen).
{"t":"cap","id","text","done"}Een vertaalde regel: getoond terwijl hij groeit, definitief als done true is.
{"t":"pcm","d":"<base64>","r":24000}Een stukje van de vertaalde stem: 16-bit mono PCM op de opgegeven samplerate, in base64. Speel de stukjes direct na elkaar af.
{"t":"problem","text":"noMinutes"}Je saldo is op; de sessie wordt gesloten.

Parameters: source en target (taalcodes), voice=0 voor alleen ondertiteling (halve prijs). Stuur audio in realtime (sneller wordt geweigerd). Maximaal 10 sessies tegelijk per account, elk 2 uur. Je betaalt per seconde vertaalde spraak; stilte en muziek zijn gratis.

POST/v1/speech

Tekst naar spraak

Zet tekst om in natuurlijke spraak en geeft het audiobestand zelf terug.

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

Velden: text (tot 4.096 tekens), language, voice (female, male, neutral, of alloy, ash, ballad, coral, echo, fable, onyx, nova, sage, shimmer, verse), format (mp3, wav of opus), speed (0.5–2). De kosten staan in de X-Sponkly-Cost-Usd-header.

POST/v1/transcribe

Spraak naar tekst

Upload een audio- of videobestand (tot 25 MB en 60 minuten); je krijgt de tekst met tijdcodes, en de vertaling als je daarom vraagt.

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-ondertiteling en nasynchronisatie

Stuur een video van maximaal 5 minuten en krijg hem vertaald terug: ingebrande ondertiteling, een vertaalde stem of allebei, plus ondertitelbestanden in beide talen.

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

Velden: target, source (optioneel), dub (true voor een vertaalde stem), subtitles (translated, original, both of none), content_type (video/mp4 of video/quicktime), size_bytes, title (optioneel). Je betaalt per seconde video zodra de lengte bekend is. Resultaten blijven 7 dagen te downloaden.

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

Saldo, gebruik en talen

Bekijk je saldo en wanneer je oudste tegoed verloopt, toon je gefactureerde aanroepen en haal de talen en actuele prijzen op.

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 }

Fouten

Fouten komen terug als JSON met een vaste code en een leesbaar bericht.

{ "error": { "code": "insufficient_balance", "message": "…" } }
400invalid_text · invalid_target · text_too_long …Er ontbreekt iets in het verzoek of iets is niet toegestaan; het bericht zegt wat.
401missing_key · invalid_keyGeen API-sleutel, of een sleutel die onjuist of ingetrokken is.
402insufficient_balanceJe saldo dekt deze aanroep niet. Waardeer tegoed op in het dashboard.
429—Te veel verzoeken tegelijk. Wacht even en probeer het opnieuw.
502translation_failed · speech_failed …Het ging mis aan onze kant of bij een provider. Er is niets in rekening gebracht; probeer het opnieuw.

Limieten

  • Tekstvertaling: maximaal 50 teksten en 20.000 tekens per verzoek, 5.000 per tekst.
  • Tekst naar spraak: maximaal 4.096 tekens per verzoek.
  • Spraak naar tekst: bestanden tot 25 MB en 60 minuten.
  • Live vertaling: maximaal 10 sessies tegelijk per account, elk 2 uur, audio in realtime.
  • Video's: tot 5 minuten en 4 GB, 3 tegelijk in verwerking; resultaten 7 dagen bewaard.
  • Limieten per sleutel per minuut: 300 vertalingen, 120 spraak, 60 transcripties en 20 nieuwe video's.
  • 32 talen: Engels, Turks, Duits, Frans, Spaans, Italiaans, Portugees, Russisch, Japans, Koreaans, Chinees, Arabisch, Hindi, Nederlands, Pools, Zweeds, Noors, Deens, Fins, Grieks, Tsjechisch, Roemeens, Hongaars, Oekraïens, Hebreeuws, Thai, Vietnamees, Indonesisch, Maleis, Estisch, Perzisch en Catalaans.

Facturering

  • Vooraf betaald: waardeer tegoed op met je kaart vanaf $10; elke aanroep gaat van je saldo af.
  • De transactiekosten van de kaart worden bij het afrekenen getoond en opgeteld, zodat je je hele tegoed kunt gebruiken.
  • Tegoed is 12 maanden na aankoop te gebruiken. Het wordt niet terugbetaald.
  • Een aanroep die aan onze kant mislukt, wordt niet in rekening gebracht, en een mislukte video wordt terugbetaald.
  • Als je saldo bijna op is, sturen we je een e-mail; bij nul worden aanroepen geweigerd met 402 tot je tegoed opwaardeert.