API для разработчиков

Живой перевод для вашего продукта

Один 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"
}

Сколько это стоит

Каждый вызов оплачивается с вашего предоплаченного баланса. Вызов, который не удался по нашей вине, не оплачивается.

Живой голосовой перевод
Передавайте речь потоком и через несколько секунд получайте переведённые субтитры и переведённый голос.
0,10 $ за минуту
Живые субтитры
Тот же живой поток, только переведённые субтитры.
0,05 $ за минуту
Перевод текста
Естественный перевод с учётом контекста — одного текста или до 50.
10,00 $ за 1 млн символов
Синтез речи
Текст, озвученный естественным голосом, в MP3, WAV или Opus.
30,00 $ за 1 млн символов
Распознавание речи
Аудио или видео в текст с метками времени, при желании с переводом.
0,01 $ за минуту
Субтитры для видео
Видео с вшитыми переведёнными субтитрами, а также файлы SRT.
0,20 $ за минуту
Дубляж видео
Видео, озвученное на другом языке, при желании с субтитрами.
0,50 $ за минуту

Аутентификация

Каждый запрос передаёт ваш API-ключ в заголовке Authorization. Ключи создаются и отзываются в кабинете; все они расходуют один и тот же баланс.

  1. Бесплатно зарегистрируйтесь на sponkly.com и откройте Кабинет → API для разработчиков.
  2. Пополните баланс (от $10) и создайте API-ключ.
  3. Отправляйте запросы на https://api.sponkly.com/v1 с заголовком Authorization: Bearer <your key>.
Base URL:      https://api.sponkly.com/v1
Authorization: Bearer spk_…

Подписанные запросы

К каждому API-ключу прилагается секрет подписи. Если подписывать им запросы, украденный ключ сам по себе бесполезен, запрос нельзя изменить по пути, а один и тот же запрос нельзя отправить дважды. Включите «Требовать подпись запросов» для ключа в кабинете, и все неподписанные запросы будут отклоняться.

  1. Возьмите текущее время в секундах Unix и SHA-256 точного тела запроса, которое вы отправляете (при загрузке файла — байты файла; для GET и live-сокета — пустое тело).
  2. Соедините их через точку в таком порядке: метка времени, метод, путь со строкой запроса и хеш тела.
  3. Вычислите HMAC-SHA256 этого текста с помощью вашего секрета подписи и запишите результат в hex в нижнем регистре.
  4. Отправьте её в заголовке X-Sponkly-Signature: v1=<signature>, а время — в X-Sponkly-Timestamp. Подпись действительна 5 минут и только для одного запроса.
  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 минут.
POST/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 символов о том, о чём текст). Оплата за каждый отправленный символ.

WSwss://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 часа каждый. Оплата за каждую секунду переведённой речи; тишина и музыка бесплатны.

POST/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.

POST/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" }
POST/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 дней.

GET/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": "…" } }
400invalid_text · invalid_target · text_too_long …В запросе чего-то не хватает или что-то недопустимо; в сообщении сказано, что именно.
401missing_key · invalid_keyНет API-ключа, или ключ неверный либо отозван.
402insufficient_balanceБаланса не хватает на этот вызов. Пополните его в кабинете.
429—Слишком много одновременных запросов. Подождите немного и повторите.
502translation_failed · speech_failed …Сбой на нашей стороне или у провайдера. Деньги не списаны; повторите запрос.

Ограничения

  • Перевод текста: до 50 текстов и 20 000 символов на запрос, до 5000 на текст.
  • Синтез речи: до 4096 символов на запрос.
  • Распознавание речи: файлы до 25 МБ и 60 минут.
  • Живой перевод: до 10 одновременных сеансов на аккаунт, по 2 часа каждый, аудио в реальном времени.
  • Видео: до 5 минут и 4 ГБ, одновременно обрабатываются 3; результаты хранятся 7 дней.
  • Лимиты на ключ в минуту: 300 переводов, 120 синтезов речи, 60 расшифровок и 20 новых видео.
  • 32 языка: английский, турецкий, немецкий, французский, испанский, итальянский, португальский, русский, японский, корейский, китайский, арабский, хинди, нидерландский, польский, шведский, норвежский, датский, финский, греческий, чешский, румынский, венгерский, украинский, иврит, тайский, вьетнамский, индонезийский, малайский, эстонский, персидский и каталанский.

Оплата

  • Предоплата: пополняйте баланс картой от $10; стоимость каждого вызова списывается с баланса.
  • Комиссия за обработку карты показывается и добавляется при оплате, поэтому вся сумма пополнения остаётся вам.
  • Средства можно использовать в течение 12 месяцев после пополнения. Они не возвращаются.
  • Вызов, который не удался по нашей вине, не оплачивается, а деньги за неудавшееся видео возвращаются.
  • Когда баланс подходит к концу, мы пишем вам на почту; при нулевом балансе вызовы отклоняются с кодом 402, пока вы не пополните баланс.