API per sviluppatori

Traduzione in diretta per il tuo prodotto

Un'unica API per traduzione vocale in diretta, traduzione di testi, sintesi vocale e video in 32 lingue. Credito prepagato, paghi solo ciò che usi, nessun canone mensile.

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

Quanto costa

Ogni chiamata viene pagata dal tuo saldo prepagato. Una chiamata che fallisce per un problema nostro non viene addebitata.

Traduzione vocale in diretta
Invia il parlato in streaming e ricevi in pochi secondi sottotitoli tradotti e una voce tradotta.
0,10 USD al minuto
Sottotitoli in diretta
Lo stesso streaming in diretta, solo con sottotitoli tradotti.
0,05 USD al minuto
Traduzione di testi
Traduzione naturale e attenta al contesto di un testo o fino a 50.
10,00 USD per 1 milione di caratteri
Sintesi vocale
Testo letto ad alta voce con una voce naturale, in MP3, WAV o Opus.
30,00 USD per 1 milione di caratteri
Trascrizione
Da audio o video a testo con timestamp, anche tradotto se vuoi.
0,01 USD al minuto
Sottotitoli video
Il video ti torna con i sottotitoli tradotti impressi, più i file SRT.
0,20 USD al minuto
Doppiaggio video
Il video ti torna parlato in un'altra lingua, con i sottotitoli se vuoi.
0,50 USD al minuto

Autenticazione

Ogni richiesta porta la tua chiave API nell'header Authorization. Le chiavi si creano e si revocano nella dashboard; tutte usano lo stesso saldo.

  1. Registrati gratis su sponkly.com e apri Dashboard → API per sviluppatori.
  2. Aggiungi credito (da $10) e crea una chiave API.
  3. Invia le richieste a https://api.sponkly.com/v1 con Authorization: Bearer <your key>.
Base URL:      https://api.sponkly.com/v1
Authorization: Bearer spk_…

Richieste firmate

Ogni chiave API ha un segreto di firma. Se firmi le richieste con questo segreto, una chiave rubata da sola è inutile, una richiesta non può essere modificata lungo il percorso e la stessa richiesta non può essere inviata due volte. Attiva «Accetta solo richieste firmate» per la chiave nella dashboard e ogni richiesta non firmata verrà rifiutata.

  1. Prendi l'ora attuale in secondi Unix e lo SHA-256 del body esatto che invii (per il caricamento di un file: i byte del file; per GET e il socket live: un body vuoto).
  2. Uniscili in quest'ordine, separati da punti: timestamp, metodo, percorso con query string e hash del body.
  3. Calcola l'HMAC-SHA256 di questo testo con il tuo segreto di firma, in esadecimale minuscolo.
  4. Invialo come X-Sponkly-Signature: v1=<signature>, con l'ora in X-Sponkly-Timestamp. Una firma vale 5 minuti e per una sola richiesta.
  5. Invii la stessa richiesta due volte entro un secondo (un nuovo tentativo rapido o un polling)? Indica l'ora in millisecondi; è accettata anche così e ogni firma resta unica.
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" }));

Proteggi le tue chiavi

  • Chiama l'API dal tuo server. Non mettere mai una chiave o un segreto di firma in una pagina web, in un'app mobile o in un repository pubblico.
  • In produzione, accetta solo richieste firmate per ogni chiave.
  • Inserisci gli indirizzi dei tuoi server tra gli indirizzi consentiti della chiave, così la chiave non funziona da nessun'altra parte.
  • Imposta un limite di spesa giornaliero per ogni chiave, così un errore o una fuga di dati può costare solo fino a un certo punto.
  • Usa una chiave per app o ambiente e revoca una chiave appena pensi che sia stata esposta. Puoi anche creare un nuovo segreto di firma in qualsiasi momento.
  • Chiavi o firme errate ripetute da uno stesso indirizzo bloccano quell'indirizzo per 15 minuti.
POST/v1/translate

Traduzione di testi

Traduce un testo o un elenco di massimo 50 testi in una qualsiasi delle 32 lingue. Ometti la lingua di origine per farla rilevare automaticamente.

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

Campi: text (stringa o array), target (codice lingua), source (facoltativo), context (facoltativo, fino a 1.000 caratteri che spiegano di cosa parla il testo). Paghi per ogni carattere inviato.

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

Traduzione vocale in diretta

Un WebSocket per il parlato in diretta: invia l'audio mentre si parla e ricevi sottotitoli tradotti e, se lo chiedi, una voce tradotta. Tredici lingue principali sono tradotte da un modello vocale in tempo reale con circa 1–2 secondi di ritardo; le altre dalla nostra pipeline di streaming.

// 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.
Messaggio dal serverSignificato
{"t":"ready","engine":"openai|own"}La sessione è aperta; engine indica quale percorso di traduzione gestisce questa lingua.
{"t":"partial","text":"…"}Il parlato in fase di riconoscimento (può ancora cambiare).
{"t":"cap","id","text","done"}Una riga tradotta: mostrata mentre cresce, definitiva quando done è true.
{"t":"pcm","d":"<base64>","r":24000}Un pezzo della voce tradotta: PCM mono a 16 bit alla frequenza indicata, in base64. Riproduci i pezzi uno dopo l'altro.
{"t":"problem","text":"noMinutes"}Il saldo è esaurito; la sessione si chiude.

Parametri: source e target (codici lingua), voice=0 per i soli sottotitoli (metà prezzo). Invia l'audio in tempo reale (più veloce viene rifiutato). Fino a 10 sessioni contemporanee per account, di 2 ore ciascuna. Paghi per secondo di parlato tradotto; silenzio e musica sono gratuiti.

POST/v1/speech

Sintesi vocale

Trasforma il testo in parlato naturale e restituisce direttamente il file 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

Campi: text (fino a 4.096 caratteri), language, voice (female, male, neutral oppure alloy, ash, ballad, coral, echo, fable, onyx, nova, sage, shimmer, verse), format (mp3, wav o opus), speed (0.5–2). Il costo è nell'header X-Sponkly-Cost-Usd.

POST/v1/transcribe

Trascrizione

Carica un file audio o video (fino a 25 MB e 60 minuti); ricevi il testo con timestamp e, se la chiedi, la sua traduzione.

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

Sottotitoli e doppiaggio video

Invia un video fino a 5 minuti e ricevilo tradotto: sottotitoli impressi, una voce tradotta o entrambi, più i file dei sottotitoli in entrambe le lingue.

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

Campi: target, source (facoltativo), dub (true per una voce tradotta), subtitles (translated, original, both o none), content_type (video/mp4 o video/quicktime), size_bytes, title (facoltativo). Paghi per secondo di video quando se ne conosce la durata. I risultati restano scaricabili per 7 giorni.

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

Saldo, utilizzo e lingue

Controlla il saldo e quando scade il credito più vecchio, elenca le chiamate addebitate e ottieni le lingue e i prezzi attuali.

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 }

Errori

Gli errori tornano come JSON con un codice stabile e un messaggio leggibile.

{ "error": { "code": "insufficient_balance", "message": "…" } }
400invalid_text · invalid_target · text_too_long …Nella richiesta manca qualcosa o c'è qualcosa di non consentito; il messaggio dice cosa.
401missing_key · invalid_keyNessuna chiave API, oppure una chiave errata o revocata.
402insufficient_balanceIl saldo non copre questa chiamata. Aggiungi credito nella dashboard.
429—Troppe richieste contemporanee. Attendi un momento e riprova.
502translation_failed · speech_failed …Errore da parte nostra o di un fornitore. Non ti è stato addebitato nulla; riprova.

Limiti

  • Traduzione di testi: fino a 50 testi e 20.000 caratteri per richiesta, 5.000 per testo.
  • Sintesi vocale: fino a 4.096 caratteri per richiesta.
  • Trascrizione: file fino a 25 MB e 60 minuti.
  • Traduzione in diretta: fino a 10 sessioni contemporanee per account, di 2 ore ciascuna, audio in tempo reale.
  • Video: fino a 5 minuti e 4 GB, 3 in lavorazione contemporaneamente; risultati conservati 7 giorni.
  • Limiti per chiave al minuto: 300 traduzioni, 120 sintesi vocali, 60 trascrizioni e 20 nuovi video.
  • 32 lingue: inglese, turco, tedesco, francese, spagnolo, italiano, portoghese, russo, giapponese, coreano, cinese, arabo, hindi, olandese, polacco, svedese, norvegese, danese, finlandese, greco, ceco, rumeno, ungherese, ucraino, ebraico, thailandese, vietnamita, indonesiano, malese, estone, persiano e catalano.

Fatturazione

  • Prepagato: aggiungi credito con carta da $10; ogni chiamata viene scalata dal saldo.
  • La commissione della carta viene mostrata e aggiunta al pagamento, così puoi usare tutto il tuo credito.
  • Il credito si può usare per 12 mesi dall'acquisto. Non è rimborsabile.
  • Una chiamata che fallisce per un problema nostro non viene addebitata e un video non riuscito viene rimborsato.
  • Quando il saldo è basso ti avvisiamo via email; a zero, le chiamate vengono rifiutate con 402 finché non aggiungi credito.