La traduction en direct dans votre propre produit
Une seule API pour la traduction vocale en direct, la traduction de texte, la synthèse vocale et la vidéo, dans 32 langues. Crédit prépayé, vous ne payez que ce que vous utilisez, sans frais mensuels.
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"
}Combien ça coûte
Chaque appel est payé depuis votre solde prépayé. Un appel qui échoue de notre côté n'est pas facturé.
Authentification
Chaque requête transmet votre clé API dans l'en-tête Authorization. Les clés se créent et se révoquent dans votre tableau de bord ; toutes utilisent le même solde.
- Inscrivez-vous gratuitement sur sponkly.com et ouvrez Tableau de bord → API développeur.
- Ajoutez du crédit (à partir de $10) et créez une clé API.
- Envoyez vos requêtes à https://api.sponkly.com/v1 avec Authorization: Bearer <your key>.
Base URL: https://api.sponkly.com/v1
Authorization: Bearer spk_…Requêtes signées
Chaque clé API est fournie avec un secret de signature. Si vous signez vos requêtes avec ce secret, une clé volée seule est inutile, une requête ne peut pas être modifiée en chemin et la même requête ne peut pas être envoyée deux fois. Activez « Exiger des requêtes signées » pour la clé dans votre tableau de bord : toute requête non signée sera refusée.
- Prenez l'heure actuelle en secondes Unix et le SHA-256 du corps exact que vous envoyez (pour un envoi de fichier : les octets du fichier ; pour GET et le socket en direct : un corps vide).
- Assemblez-les dans cet ordre, séparés par des points : horodatage, méthode, chemin avec la chaîne de requête et le hash du corps.
- Calculez le HMAC-SHA256 de ce texte avec votre secret de signature, en hexadécimal minuscule.
- Envoyez-le sous la forme X-Sponkly-Signature: v1=<signature>, avec l'heure dans X-Sponkly-Timestamp. Une signature est valable 5 minutes et pour une seule requête.
- Vous envoyez la même requête deux fois en moins d'une seconde (une nouvelle tentative rapide ou une interrogation) ? Indiquez l'heure en millisecondes ; elle est aussi acceptée et garde chaque signature unique.
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" }));Protégez vos clés
- Appelez l'API depuis votre serveur. Ne placez jamais une clé ou un secret de signature dans une page web, une application mobile ou un dépôt public.
- Exigez des requêtes signées pour chaque clé en production.
- Indiquez les adresses de vos serveurs dans les adresses autorisées de la clé, pour qu'elle ne fonctionne nulle part ailleurs.
- Fixez un plafond de dépenses quotidien par clé, pour qu'une erreur ou une fuite ne puisse coûter qu'un montant limité.
- Utilisez une clé par application ou environnement, et révoquez une clé dès que vous pensez qu'elle a été exposée. Vous pouvez aussi créer un nouveau secret de signature à tout moment.
- Des clés ou signatures erronées répétées depuis une même adresse bloquent cette adresse pendant 15 minutes.
/v1/translateTraduction de texte
Traduit un texte ou une liste de 50 textes maximum dans l'une des 32 langues. Omettez la langue source pour qu'elle soit détectée automatiquement.
# 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"])Champs : text (chaîne ou tableau), target (code de langue), source (facultatif), context (facultatif, jusqu'à 1 000 caractères qui indiquent le sujet du texte). Vous payez par caractère envoyé.
wss://api.sponkly.com/v1/live?source=en&target=trTraduction vocale en direct
Un WebSocket pour la parole en direct : envoyez l'audio au fil de la parole et recevez des sous-titres traduits et, si vous le demandez, une voix traduite. Treize grandes langues sont traduites par un modèle vocal en temps réel avec environ 1 à 2 secondes de délai ; les autres par notre propre pipeline de 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.| Message du serveur | Signification |
|---|---|
{"t":"ready","engine":"openai|own"} | La session est ouverte ; engine indique quel circuit de traduction prend en charge cette langue. |
{"t":"partial","text":"…"} | La parole en cours de reconnaissance (elle peut encore changer). |
{"t":"cap","id","text","done"} | Une ligne traduite : affichée au fur et à mesure, définitive quand done vaut true. |
{"t":"pcm","d":"<base64>","r":24000} | Un morceau de la voix traduite : PCM mono 16 bits à la fréquence indiquée, en base64. Jouez les morceaux à la suite. |
{"t":"problem","text":"noMinutes"} | Votre solde est épuisé ; la session se ferme. |
Paramètres : source et target (codes de langue), voice=0 pour les sous-titres seuls (moitié prix). Envoyez l'audio en temps réel (un envoi plus rapide est refusé). Jusqu'à 10 sessions simultanées par compte, de 2 heures chacune. Vous payez par seconde de parole traduite ; les silences et la musique sont gratuits.
/v1/speechSynthèse vocale
Transforme un texte en parole naturelle et renvoie directement le fichier 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.mp3Champs : text (jusqu'à 4 096 caractères), language, voice (female, male, neutral, ou alloy, ash, ballad, coral, echo, fable, onyx, nova, sage, shimmer, verse), format (mp3, wav ou opus), speed (0.5–2). Le coût figure dans l'en-tête X-Sponkly-Cost-Usd.
/v1/transcribeTranscription
Envoyez un fichier audio ou vidéo (jusqu'à 25 Mo et 60 minutes) ; recevez le texte horodaté, et sa traduction si vous la demandez.
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/videosSous-titres et doublage vidéo
Envoyez une vidéo de 5 minutes maximum et recevez-la traduite : sous-titres incrustés, voix traduite ou les deux, plus des fichiers de sous-titres dans les deux langues.
# 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" } } }Champs : target, source (facultatif), dub (true pour une voix traduite), subtitles (translated, original, both ou none), content_type (video/mp4 ou video/quicktime), size_bytes, title (facultatif). Vous payez par seconde de vidéo une fois sa durée connue. Les résultats restent téléchargeables 7 jours.
/v1/balance · /v1/usage · /v1/languagesSolde, utilisation et langues
Consultez votre solde et la date d'expiration de votre crédit le plus ancien, listez vos appels facturés et obtenez les langues et les tarifs en vigueur.
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 }Erreurs
Les erreurs sont renvoyées en JSON avec un code stable et un message lisible.
{ "error": { "code": "insufficient_balance", "message": "…" } }| 400 | invalid_text · invalid_target · text_too_long … | Un élément de la requête manque ou n'est pas autorisé ; le message précise lequel. |
| 401 | missing_key · invalid_key | Aucune clé API, ou une clé incorrecte ou révoquée. |
| 402 | insufficient_balance | Votre solde ne couvre pas cet appel. Ajoutez du crédit dans le tableau de bord. |
| 429 | — | Trop de requêtes simultanées. Patientez un instant et réessayez. |
| 502 | translation_failed · speech_failed … | L'échec vient de notre côté ou d'un fournisseur. Rien ne vous a été facturé ; réessayez. |
Limites
- Traduction de texte : jusqu'à 50 textes et 20 000 caractères par requête, 5 000 par texte.
- Synthèse vocale : jusqu'à 4 096 caractères par requête.
- Transcription : fichiers jusqu'à 25 Mo et 60 minutes.
- Traduction en direct : jusqu'à 10 sessions simultanées par compte, de 2 heures chacune, audio en temps réel.
- Vidéos : jusqu'à 5 minutes et 4 Go, 3 en préparation à la fois ; résultats conservés 7 jours.
- Débit par clé et par minute : 300 traductions, 120 synthèses vocales, 60 transcriptions et 20 nouvelles vidéos.
- 32 langues : anglais, turc, allemand, français, espagnol, italien, portugais, russe, japonais, coréen, chinois, arabe, hindi, néerlandais, polonais, suédois, norvégien, danois, finnois, grec, tchèque, roumain, hongrois, ukrainien, hébreu, thaï, vietnamien, indonésien, malais, estonien, persan et catalan.
Facturation
- Prépayé : ajoutez du crédit par carte à partir de $10 ; chaque appel est déduit de votre solde.
- Les frais de traitement de la carte sont affichés et ajoutés au paiement, pour que vous puissiez utiliser la totalité de votre crédit.
- Le crédit est utilisable pendant 12 mois après l'achat. Il n'est pas remboursable.
- Un appel qui échoue de notre côté n'est pas facturé, et une vidéo qui échoue est remboursée.
- Quand votre solde devient faible, nous vous envoyons un e-mail ; à zéro, les appels sont refusés avec 402 jusqu'à ce que vous ajoutiez du crédit.