Живой перевод для вашего продукта
Один API для живого голосового перевода, перевода текста, синтеза речи и видео на 32 языках. Предоплата: платите только за то, что используете, без абонентской платы.
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"
}Сколько это стоит
Каждый вызов оплачивается с вашего предоплаченного баланса. Вызов, который не удался по нашей вине, не оплачивается.
Аутентификация
Каждый запрос передаёт ваш API-ключ в заголовке Authorization. Ключи создаются и отзываются в кабинете; все они расходуют один и тот же баланс.
- Бесплатно зарегистрируйтесь на sponkly.com и откройте Кабинет → API для разработчиков.
- Пополните баланс (от $10) и создайте API-ключ.
- Отправляйте запросы на https://api.sponkly.com/v1 с заголовком Authorization: Bearer <your key>.
Base URL: https://api.sponkly.com/v1
Authorization: Bearer spk_…Подписанные запросы
К каждому API-ключу прилагается секрет подписи. Если подписывать им запросы, украденный ключ сам по себе бесполезен, запрос нельзя изменить по пути, а один и тот же запрос нельзя отправить дважды. Включите «Требовать подпись запросов» для ключа в кабинете, и все неподписанные запросы будут отклоняться.
- Возьмите текущее время в секундах Unix и SHA-256 точного тела запроса, которое вы отправляете (при загрузке файла — байты файла; для GET и live-сокета — пустое тело).
- Соедините их через точку в таком порядке: метка времени, метод, путь со строкой запроса и хеш тела.
- Вычислите HMAC-SHA256 этого текста с помощью вашего секрета подписи и запишите результат в hex в нижнем регистре.
- Отправьте её в заголовке X-Sponkly-Signature: v1=<signature>, а время — в X-Sponkly-Timestamp. Подпись действительна 5 минут и только для одного запроса.
- Отправляете один и тот же запрос дважды в течение секунды (быстрый повтор или опрос)? Передавайте время в миллисекундах — это тоже принимается, и каждая подпись остаётся уникальной.
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" }));Как защитить ключи
- Вызывайте API со своего сервера. Никогда не размещайте ключ или секрет подписи на веб-странице, в мобильном приложении или в публичном репозитории.
- Требуйте подпись запросов для каждого ключа в продакшене.
- Укажите адреса своих серверов в разрешённых адресах ключа, чтобы он не работал ни с каких других адресов.
- Установите дневной лимит расходов для каждого ключа, чтобы ошибка или утечка обошлась лишь в ограниченную сумму.
- Используйте отдельный ключ для каждого приложения или окружения и отзывайте ключ, как только заподозрите, что он раскрыт. Вы также можете в любой момент создать новый секрет подписи.
- Повторные неверные ключи или подписи с одного адреса блокируют этот адрес на 15 минут.
/v1/translateПеревод текста
Переводит один текст или список до 50 текстов на любой из 32 языков. Если не указать исходный язык, он определится автоматически.
# 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"])Поля: text (строка или массив), target (код языка), source (необязательно), context (необязательно, до 1000 символов о том, о чём текст). Оплата за каждый отправленный символ.
wss://api.sponkly.com/v1/live?source=en&target=trЖивой голосовой перевод
WebSocket для живой речи: отправляйте аудио по мере того, как идёт речь, и получайте переведённые субтитры и, если нужно, переведённый голос. Тринадцать основных языков переводит речевая модель реального времени с задержкой около 1–2 секунд, остальные — наш собственный потоковый конвейер.
// 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.| Сообщение сервера | Что оно означает |
|---|---|
{"t":"ready","engine":"openai|own"} | Сеанс открыт; engine показывает, какой путь перевода обслуживает этот язык. |
{"t":"partial","text":"…"} | Речь, которая распознаётся прямо сейчас (может ещё измениться). |
{"t":"cap","id","text","done"} | Переведённая строка: показывается по мере роста и становится окончательной, когда done равно true. |
{"t":"pcm","d":"<base64>","r":24000} | Фрагмент переведённого голоса: 16-битный моно PCM с указанной частотой дискретизации, в base64. Воспроизводите фрагменты подряд. |
{"t":"problem","text":"noMinutes"} | Баланс закончился; сеанс закрывается. |
Параметры: source и target (коды языков), voice=0 — только субтитры (за полцены). Отправляйте аудио в реальном времени (быстрее — отклоняется). До 10 одновременных сеансов на аккаунт, по 2 часа каждый. Оплата за каждую секунду переведённой речи; тишина и музыка бесплатны.
/v1/speechСинтез речи
Превращает текст в естественную речь и возвращает сам аудиофайл.
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Поля: text (до 4096 символов), language, voice (female, male, neutral или alloy, ash, ballad, coral, echo, fable, onyx, nova, sage, shimmer, verse), format (mp3, wav или opus), speed (0.5–2). Стоимость указана в заголовке X-Sponkly-Cost-Usd.
/v1/transcribeРаспознавание речи
Загрузите аудио- или видеофайл (до 25 МБ и 60 минут) и получите текст с метками времени, а по запросу и его перевод.
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/videosСубтитры и дубляж видео
Отправьте видео длиной до 5 минут и получите его переведённым: с вшитыми субтитрами, переведённым голосом или и тем и другим, плюс файлы субтитров на обоих языках.
# 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" } } }Поля: target, source (необязательно), dub (true — переведённый голос), subtitles (translated, original, both или none), content_type (video/mp4 или video/quicktime), size_bytes, title (необязательно). Оплата за каждую секунду видео, как только становится известна его длина. Результаты доступны для скачивания 7 дней.
/v1/balance · /v1/usage · /v1/languagesБаланс, использование и языки
Проверяйте баланс и срок действия самых ранних пополнений, смотрите оплаченные вызовы, получайте список языков и текущие цены.
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 }Ошибки
Ошибки возвращаются в JSON с постоянным кодом и понятным сообщением.
{ "error": { "code": "insufficient_balance", "message": "…" } }| 400 | invalid_text · invalid_target · text_too_long … | В запросе чего-то не хватает или что-то недопустимо; в сообщении сказано, что именно. |
| 401 | missing_key · invalid_key | Нет API-ключа, или ключ неверный либо отозван. |
| 402 | insufficient_balance | Баланса не хватает на этот вызов. Пополните его в кабинете. |
| 429 | — | Слишком много одновременных запросов. Подождите немного и повторите. |
| 502 | translation_failed · speech_failed … | Сбой на нашей стороне или у провайдера. Деньги не списаны; повторите запрос. |
Ограничения
- Перевод текста: до 50 текстов и 20 000 символов на запрос, до 5000 на текст.
- Синтез речи: до 4096 символов на запрос.
- Распознавание речи: файлы до 25 МБ и 60 минут.
- Живой перевод: до 10 одновременных сеансов на аккаунт, по 2 часа каждый, аудио в реальном времени.
- Видео: до 5 минут и 4 ГБ, одновременно обрабатываются 3; результаты хранятся 7 дней.
- Лимиты на ключ в минуту: 300 переводов, 120 синтезов речи, 60 расшифровок и 20 новых видео.
- 32 языка: английский, турецкий, немецкий, французский, испанский, итальянский, португальский, русский, японский, корейский, китайский, арабский, хинди, нидерландский, польский, шведский, норвежский, датский, финский, греческий, чешский, румынский, венгерский, украинский, иврит, тайский, вьетнамский, индонезийский, малайский, эстонский, персидский и каталанский.
Оплата
- Предоплата: пополняйте баланс картой от $10; стоимость каждого вызова списывается с баланса.
- Комиссия за обработку карты показывается и добавляется при оплате, поэтому вся сумма пополнения остаётся вам.
- Средства можно использовать в течение 12 месяцев после пополнения. Они не возвращаются.
- Вызов, который не удался по нашей вине, не оплачивается, а деньги за неудавшееся видео возвращаются.
- Когда баланс подходит к концу, мы пишем вам на почту; при нулевом балансе вызовы отклоняются с кодом 402, пока вы не пополните баланс.