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.
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.
- Registrati gratis su sponkly.com e apri Dashboard → API per sviluppatori.
- Aggiungi credito (da $10) e crea una chiave API.
- 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.
- 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).
- Uniscili in quest'ordine, separati da punti: timestamp, metodo, percorso con query string e hash del body.
- Calcola l'HMAC-SHA256 di questo testo con il tuo segreto di firma, in esadecimale minuscolo.
- Invialo come X-Sponkly-Signature: v1=<signature>, con l'ora in X-Sponkly-Timestamp. Una firma vale 5 minuti e per una sola richiesta.
- 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.
/v1/translateTraduzione 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.
wss://api.sponkly.com/v1/live?source=en&target=trTraduzione 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 server | Significato |
|---|---|
{"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.
/v1/speechSintesi 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.mp3Campi: 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.
/v1/transcribeTrascrizione
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" }/v1/videosSottotitoli 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.
/v1/balance · /v1/usage · /v1/languagesSaldo, 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": "…" } }| 400 | invalid_text · invalid_target · text_too_long … | Nella richiesta manca qualcosa o c'è qualcosa di non consentito; il messaggio dice cosa. |
| 401 | missing_key · invalid_key | Nessuna chiave API, oppure una chiave errata o revocata. |
| 402 | insufficient_balance | Il saldo non copre questa chiamata. Aggiungi credito nella dashboard. |
| 429 | — | Troppe richieste contemporanee. Attendi un momento e riprova. |
| 502 | translation_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.