Tradução em direto para o seu próprio produto
Uma só API para tradução de voz em direto, tradução de texto, síntese de voz e vídeo em 32 idiomas. Crédito pré-pago, paga apenas o que usa, sem mensalidade.
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 custa
Cada chamada é paga a partir do seu saldo pré-pago. Uma chamada que falhe do nosso lado não é cobrada.
Autenticação
Cada pedido leva a sua chave de API no cabeçalho Authorization. As chaves são criadas e revogadas no seu painel; todas gastam o mesmo saldo.
- Registe-se gratuitamente em sponkly.com e abra Painel → API para programadores.
- Adicione crédito (a partir de $10) e crie uma chave de API.
- Envie os pedidos para https://api.sponkly.com/v1 com Authorization: Bearer <your key>.
Base URL: https://api.sponkly.com/v1
Authorization: Bearer spk_…Pedidos assinados
Cada chave de API vem com um segredo de assinatura. Se assinar os seus pedidos com ele, uma chave roubada, por si só, não serve de nada, um pedido não pode ser alterado pelo caminho e o mesmo pedido não pode ser enviado duas vezes. Ative «Exigir pedidos assinados» para a chave no seu painel e todos os pedidos não assinados serão recusados.
- Obtenha a hora atual em segundos Unix e o SHA-256 do corpo exato que envia (num carregamento de ficheiro: os bytes do ficheiro; para GET e o socket em direto: um corpo vazio).
- Junte-os por esta ordem, separados por pontos: carimbo de data/hora, método, caminho com a query string e o hash do corpo.
- Calcule o HMAC-SHA256 desse texto com o seu segredo de assinatura, em hexadecimal minúsculo.
- Envie-o como X-Sponkly-Signature: v1=<signature>, com a hora em X-Sponkly-Timestamp. Uma assinatura é válida durante 5 minutos e para um único pedido.
- Envia a mesma solicitação duas vezes em menos de um segundo (uma nova tentativa rápida ou uma consulta periódica)? Informe o horário em milissegundos; também é aceito e mantém cada assinatura ú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" }));Proteja as suas chaves
- Chame a API a partir do seu servidor. Nunca coloque uma chave ou um segredo de assinatura numa página web, numa aplicação móvel ou num repositório público.
- Exija pedidos assinados para todas as chaves em produção.
- Indique os endereços dos seus servidores nos endereços permitidos da chave, para que esta não funcione a partir de mais nenhum lado.
- Defina um limite de gastos diário por chave, para que um erro ou uma fuga só possa custar até certo ponto.
- Use uma chave por aplicação ou ambiente e revogue uma chave assim que achar que foi exposta. Também pode criar um novo segredo de assinatura a qualquer momento.
- Chaves ou assinaturas erradas repetidas a partir de um endereço bloqueiam esse endereço durante 15 minutos.
/v1/translateTradução de texto
Traduz um texto ou uma lista de até 50 para qualquer um dos 32 idiomas. Omita o idioma de origem para que seja detetado 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"])Campos: text (string ou array), target (código de idioma), source (opcional), context (opcional, até 1000 caracteres que indicam o assunto do texto). Paga por cada carácter enviado.
wss://api.sponkly.com/v1/live?source=en&target=trTradução de voz em direto
Um WebSocket para fala em direto: envie o áudio à medida que é falado e receba legendas traduzidas e, se pedir, uma voz traduzida. Treze idiomas principais são traduzidos por um modelo de voz em tempo real com cerca de 1–2 segundos de atraso; os restantes pelo nosso próprio 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.| Mensagem do servidor | O que significa |
|---|---|
{"t":"ready","engine":"openai|own"} | A sessão está aberta; engine indica que via de tradução serve este idioma. |
{"t":"partial","text":"…"} | A fala que está a ser reconhecida neste momento (ainda pode mudar). |
{"t":"cap","id","text","done"} | Uma linha traduzida: mostrada à medida que cresce, final quando done é true. |
{"t":"pcm","d":"<base64>","r":24000} | Um pedaço da voz traduzida: PCM mono de 16 bits à taxa indicada, em base64. Reproduza os pedaços seguidos. |
{"t":"problem","text":"noMinutes"} | O seu saldo esgotou-se; a sessão fecha. |
Parâmetros: source e target (códigos de idioma), voice=0 só para legendas (metade do preço). Envie o áudio em tempo real (mais rápido é recusado). Até 10 sessões em simultâneo por conta, de 2 horas cada. Paga por segundo de fala traduzida; silêncio e música são grátis.
/v1/speechTexto para voz
Converte texto em fala natural e devolve o próprio ficheiro de áudio.
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.mp3Campos: text (até 4096 caracteres), 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). O custo vem no cabeçalho X-Sponkly-Cost-Usd.
/v1/transcribeVoz para texto
Carregue um ficheiro de áudio ou vídeo (até 25 MB e 60 minutos); receba o texto com marcas de tempo e, se pedir, a respetiva tradução.
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/videosLegendas e dobragem de vídeo
Envie um vídeo de até 5 minutos e receba-o traduzido: legendas incorporadas, uma voz traduzida ou ambas, além de ficheiros de legendas nos dois 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 uma voz traduzida), subtitles (translated, original, both ou none), content_type (video/mp4 ou video/quicktime), size_bytes, title (opcional). Paga por segundo de vídeo assim que a duração é conhecida. Os resultados podem ser transferidos durante 7 dias.
/v1/balance · /v1/usage · /v1/languagesSaldo, utilização e idiomas
Consulte o seu saldo e quando expira o seu crédito mais antigo, liste as chamadas cobradas e obtenha os idiomas e os preços atuais.
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 }Erros
Os erros são devolvidos em JSON com um código estável e uma mensagem legível.
{ "error": { "code": "insufficient_balance", "message": "…" } }| 400 | invalid_text · invalid_target · text_too_long … | Falta algo no pedido ou algo não é permitido; a mensagem diz o quê. |
| 401 | missing_key · invalid_key | Sem chave de API, ou uma chave errada ou revogada. |
| 402 | insufficient_balance | O seu saldo não cobre esta chamada. Adicione crédito no painel. |
| 429 | — | Demasiados pedidos em simultâneo. Aguarde um momento e tente novamente. |
| 502 | translation_failed · speech_failed … | Falhou do nosso lado ou num fornecedor. Não foi cobrado; tente novamente. |
Limites
- Tradução de texto: até 50 textos e 20 000 caracteres por pedido, 5000 por texto.
- Texto para voz: até 4096 caracteres por pedido.
- Voz para texto: ficheiros até 25 MB e 60 minutos.
- Tradução em direto: até 10 sessões em simultâneo por conta, de 2 horas cada, áudio em tempo real.
- Vídeos: até 5 minutos e 4 GB, 3 em processamento em simultâneo; resultados guardados 7 dias.
- Por chave e por minuto: 300 traduções, 120 de texto para voz, 60 transcrições e 20 vídeos novos.
- 32 idiomas: inglês, turco, alemão, francês, espanhol, italiano, português, russo, japonês, coreano, chinês, árabe, hindi, neerlandês, polaco, sueco, norueguês, dinamarquês, finlandês, grego, checo, romeno, húngaro, ucraniano, hebraico, tailandês, vietnamita, indonésio, malaio, estónio, persa e catalão.
Faturação
- Pré-pago: adicione crédito com cartão a partir de $10; cada chamada é descontada do seu saldo.
- A taxa de processamento do cartão é mostrada e acrescentada no pagamento, para que possa usar todo o seu crédito.
- O crédito pode ser usado durante 12 meses após a compra. Não é reembolsável.
- Uma chamada que falhe do nosso lado não é cobrada, e um vídeo que falhe é reembolsado.
- Quando o seu saldo estiver baixo, enviamos-lhe um email; a zero, as chamadas são recusadas com 402 até adicionar crédito.