API para desarrolladores

Traducción en vivo para tu propio producto

Una sola API para traducción de voz en vivo, traducción de texto, síntesis de voz y video en 32 idiomas. Crédito prepago, pagas solo lo que usas y sin cuota mensual.

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

Cuánto cuesta

Cada llamada se paga desde tu saldo prepago. Una llamada que falla por nuestra parte no se cobra.

Traducción de voz en vivo
Envía voz en streaming y recibe en segundos subtítulos traducidos y una voz traducida.
0,10 US$ por minuto
Subtítulos en vivo
La misma transmisión en vivo, solo con subtítulos traducidos.
0,05 US$ por minuto
Traducción de texto
Traducción natural y atenta al contexto de un texto o de hasta 50.
10,00 US$ por millón de caracteres
Texto a voz
Texto leído en voz alta con una voz natural, en MP3, WAV u Opus.
30,00 US$ por millón de caracteres
Voz a texto
Audio o video a texto con marcas de tiempo y, si quieres, traducido.
0,01 US$ por minuto
Subtítulos de video
Tu video de vuelta con subtítulos traducidos incrustados, además de archivos SRT.
0,20 US$ por minuto
Doblaje de video
Tu video de vuelta hablado en otro idioma, con subtítulos si quieres.
0,50 US$ por minuto

Autenticación

Cada solicitud lleva tu clave de API en el encabezado Authorization. Las claves se crean y revocan en tu panel; todas gastan el mismo saldo.

  1. Regístrate gratis en sponkly.com y abre Panel → API para desarrolladores.
  2. Añade crédito (desde $10) y crea una clave de API.
  3. Envía las solicitudes a https://api.sponkly.com/v1 con Authorization: Bearer <your key>.
Base URL:      https://api.sponkly.com/v1
Authorization: Bearer spk_…

Solicitudes firmadas

Cada clave de API incluye un secreto de firma. Si firmas tus solicitudes con él, una clave robada por sí sola no sirve de nada, una solicitud no se puede modificar por el camino y la misma solicitud no se puede enviar dos veces. Activa «Exigir solicitudes firmadas» para la clave en tu panel y se rechazará toda solicitud sin firmar.

  1. Toma la hora actual en segundos Unix y el SHA-256 del cuerpo exacto que envías (al subir un archivo: los bytes del archivo; para GET y el socket en vivo: un cuerpo vacío).
  2. Únelos en este orden, separados por puntos: marca de tiempo, método, ruta con la cadena de consulta y el hash del cuerpo.
  3. Calcula el HMAC-SHA256 de ese texto con tu secreto de firma, en hexadecimal en minúsculas.
  4. Envíalo como X-Sponkly-Signature: v1=<signature>, con la hora en X-Sponkly-Timestamp. Una firma es válida durante 5 minutos y para una sola solicitud.
  5. ¿Envías la misma solicitud dos veces en menos de un segundo (un reintento rápido o un sondeo)? Indica la hora en milisegundos; también se acepta y mantiene cada firma única.
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" }));

Protege tus claves

  • Llama a la API desde tu servidor. Nunca pongas una clave ni un secreto de firma en una página web, una app móvil o un repositorio público.
  • Exige solicitudes firmadas para cada clave en producción.
  • Añade las direcciones de tus servidores a las direcciones permitidas de la clave, para que no funcione desde ningún otro sitio.
  • Fija un límite de gasto diario por clave, para que un error o una filtración solo pueda costar una cantidad limitada.
  • Usa una clave por app o entorno, y revoca una clave en cuanto creas que ha quedado expuesta. También puedes crear un nuevo secreto de firma en cualquier momento.
  • Los intentos repetidos con claves o firmas incorrectas desde una misma dirección bloquean esa dirección durante 15 minutos.
POST/v1/translate

Traducción de texto

Traduce un texto o una lista de hasta 50 a cualquiera de los 32 idiomas. Si omites el idioma de origen, se detecta automáticamente.

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

Campos: text (cadena o array), target (código de idioma), source (opcional), context (opcional, hasta 1000 caracteres que indican de qué trata el texto). Pagas por cada carácter enviado.

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

Traducción de voz en vivo

Un WebSocket para voz en vivo: envía el audio mientras se habla y recibe subtítulos traducidos y, si lo pides, una voz traducida. Trece idiomas principales los traduce un modelo de voz en tiempo real con 1–2 segundos de retraso aproximadamente; los demás, nuestro propio 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.
Mensaje del servidorQué significa
{"t":"ready","engine":"openai|own"}La sesión está abierta; engine indica qué vía de traducción atiende este idioma.
{"t":"partial","text":"…"}La voz que se está reconociendo en este momento (todavía puede cambiar).
{"t":"cap","id","text","done"}Una línea traducida: se muestra mientras crece y es definitiva cuando done es true.
{"t":"pcm","d":"<base64>","r":24000}Un fragmento de la voz traducida: PCM mono de 16 bits a la frecuencia indicada, en base64. Reproduce los fragmentos uno tras otro.
{"t":"problem","text":"noMinutes"}Tu saldo se agotó; la sesión se cierra.

Parámetros: source y target (códigos de idioma), voice=0 solo para subtítulos (mitad de precio). Envía el audio en tiempo real (más rápido se rechaza). Hasta 10 sesiones a la vez por cuenta, de 2 horas cada una. Pagas por segundo de voz traducida; el silencio y la música son gratis.

POST/v1/speech

Texto a voz

Convierte texto en voz natural y devuelve directamente el archivo de 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

Campos: text (hasta 4096 caracteres), language, voice (female, male, neutral, o alloy, ash, ballad, coral, echo, fable, onyx, nova, sage, shimmer, verse), format (mp3, wav u opus), speed (0.5–2). El costo viene en el encabezado X-Sponkly-Cost-Usd.

POST/v1/transcribe

Voz a texto

Sube un archivo de audio o video (hasta 25 MB y 60 minutos) y recibe el texto con marcas de tiempo y, si la pides, su traducción.

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

Subtítulos y doblaje de video

Envía un video de hasta 5 minutos y recíbelo traducido: con subtítulos incrustados, una voz traducida o ambos, además de archivos de subtítulos en los dos idiomas.

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

Campos: target, source (opcional), dub (true para una voz traducida), subtitles (translated, original, both o none), content_type (video/mp4 o video/quicktime), size_bytes, title (opcional). Pagas por segundo de video una vez que se conoce su duración. Los resultados se pueden descargar durante 7 días.

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

Saldo, uso e idiomas

Consulta tu saldo y cuándo caduca tu crédito más antiguo, lista tus llamadas cobradas y obtén los idiomas y los precios actuales.

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 }

Errores

Los errores se devuelven en JSON con un código estable y un mensaje legible.

{ "error": { "code": "insufficient_balance", "message": "…" } }
400invalid_text · invalid_target · text_too_long …Falta algo en la solicitud o algo no está permitido; el mensaje indica qué.
401missing_key · invalid_keyNo hay clave de API, o la clave es incorrecta o está revocada.
402insufficient_balanceTu saldo no cubre esta llamada. Añade crédito en el panel.
429—Demasiadas solicitudes a la vez. Espera un momento y vuelve a intentarlo.
502translation_failed · speech_failed …Falló por nuestra parte o en un proveedor. No se te ha cobrado; vuelve a intentarlo.

Límites

  • Traducción de texto: hasta 50 textos y 20.000 caracteres por solicitud, 5000 por texto.
  • Texto a voz: hasta 4096 caracteres por solicitud.
  • Voz a texto: archivos de hasta 25 MB y 60 minutos.
  • Traducción en vivo: hasta 10 sesiones a la vez por cuenta, de 2 horas cada una, audio en tiempo real.
  • Videos: hasta 5 minutos y 4 GB, 3 en proceso a la vez; los resultados se guardan 7 días.
  • Límites por clave y minuto: 300 traducciones, 120 de texto a voz, 60 transcripciones y 20 videos nuevos.
  • 32 idiomas: inglés, turco, alemán, francés, español, italiano, portugués, ruso, japonés, coreano, chino, árabe, hindi, neerlandés, polaco, sueco, noruego, danés, finés, griego, checo, rumano, húngaro, ucraniano, hebreo, tailandés, vietnamita, indonesio, malayo, estonio, persa y catalán.

Facturación

  • Prepago: añade crédito con tarjeta desde $10; cada llamada se descuenta de tu saldo.
  • La comisión de procesamiento de la tarjeta se muestra y se añade al pagar, para que puedas usar todo tu crédito.
  • El crédito se puede usar durante 12 meses desde la compra. No es reembolsable.
  • Una llamada que falla por nuestra parte no se cobra, y un video que falla se reembolsa.
  • Cuando tu saldo esté bajo, te enviaremos un correo; al llegar a cero, las llamadas se rechazan con 402 hasta que añadas crédito.