개발자 API

내 제품을 위한 실시간 번역

32개 언어의 실시간 음성 번역, 텍스트 번역, 음성, 동영상을 하나의 API로. 선불 크레딧으로 사용한 만큼만 결제하고, 월 요금은 없어요.

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

요금

모든 호출은 선불 잔액에서 결제돼요. 저희 쪽 문제로 실패한 호출은 청구되지 않아요.

실시간 음성 번역
음성을 스트리밍하면 몇 초 안에 번역된 자막과 번역된 음성을 돌려받아요.
분당 US$0.10
실시간 자막
같은 실시간 스트림에서 번역된 자막만 받아요.
분당 US$0.05
텍스트 번역
텍스트 하나 또는 최대 50개를 문맥에 맞게 자연스럽게 번역해요.
100만 자당 US$10.00
텍스트 음성 변환
텍스트를 자연스러운 목소리로 읽어 MP3, WAV 또는 Opus로 제공해요.
100만 자당 US$30.00
음성 텍스트 변환
오디오나 동영상을 타임스탬프가 있는 텍스트로 바꾸고, 원하면 번역도 해요.
분당 US$0.01
동영상 자막
번역된 자막이 입혀진 동영상과 SRT 파일을 돌려받아요.
분당 US$0.20
동영상 더빙
다른 언어로 말하는 동영상을 돌려받아요. 원하면 자막도 함께 넣을 수 있어요.
분당 US$0.50

인증

모든 요청은 Authorization 헤더에 API 키를 담아 보내요. 키는 대시보드에서 만들고 해지하며, 모든 키는 같은 잔액을 사용해요.

  1. sponkly.com에서 무료로 가입하고 대시보드 → 개발자 API를 여세요.
  2. 크레딧을 충전하고($10부터) API 키를 만드세요.
  3. Authorization: Bearer <your key>를 넣어 https://api.sponkly.com/v1로 요청을 보내세요.
Base URL:      https://api.sponkly.com/v1
Authorization: Bearer spk_…

서명된 요청

모든 API 키에는 서명 시크릿이 함께 제공돼요. 이 시크릿으로 요청에 서명하면 도난당한 키만으로는 쓸 수 없고, 전송 중에 요청을 바꿀 수 없으며, 같은 요청을 두 번 보낼 수도 없어요. 대시보드에서 키의 '서명된 요청 필수'를 켜면 서명 없는 요청은 모두 거부돼요.

  1. 현재 시간을 Unix 초 단위로 구하고, 보내는 본문 그대로의 SHA-256을 구하세요(파일 업로드는 파일 바이트, GET과 실시간 소켓은 빈 본문).
  2. 타임스탬프, 메서드, 쿼리 문자열을 포함한 경로, 본문 해시 순서로 점으로 구분해 이어 붙이세요.
  3. 그 텍스트의 HMAC-SHA256을 서명 시크릿으로 계산해 소문자 16진수로 만드세요.
  4. X-Sponkly-Signature: v1=<signature> 형식으로 보내고, 시간은 X-Sponkly-Timestamp로 보내세요. 서명은 5분 동안, 요청 한 번에만 유효해요.
  5. 같은 요청을 1초 안에 두 번 보내나요(빠른 재시도나 폴링)? 시간을 밀리초로 보내세요. 밀리초도 허용되며 모든 서명이 고유하게 유지됩니다.
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(선택, 텍스트가 무엇에 관한 것인지 알려 주는 최대 1,000자). 보낸 글자 수만큼 결제해요.

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

실시간 음성 번역

실시간 음성용 WebSocket: 말하는 대로 오디오를 보내면 번역된 자막과, 요청하면 번역된 음성까지 받아요. 13개 주요 언어는 약 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(최대 4,096자), 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

음성 텍스트 변환

오디오나 동영상 파일(최대 25MB, 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_keyAPI 키가 없거나, 키가 잘못됐거나 해지됐어요.
402insufficient_balance잔액이 이 호출 비용보다 부족해요. 대시보드에서 크레딧을 충전하세요.
429—동시 요청이 너무 많아요. 잠시 기다린 후 다시 시도하세요.
502translation_failed · speech_failed …저희 쪽이나 제공업체에서 실패했어요. 청구되지 않았으니 다시 시도하세요.

제한

  • 텍스트 번역: 요청당 최대 50개 텍스트와 20,000자, 텍스트당 5,000자.
  • 텍스트 음성 변환: 요청당 최대 4,096자.
  • 음성 텍스트 변환: 파일당 최대 25MB, 60분.
  • 실시간 번역: 계정당 동시에 최대 10개 세션, 세션당 2시간, 오디오는 실시간으로.
  • 동영상: 최대 5분, 4GB, 동시에 3개까지 처리, 결과는 7일 보관.
  • 키당 분당 한도: 번역 300회, 음성 120회, 전사 60회, 새 동영상 20개.
  • 32개 언어: 영어, 터키어, 독일어, 프랑스어, 스페인어, 이탈리아어, 포르투갈어, 러시아어, 일본어, 한국어, 중국어, 아랍어, 힌디어, 네덜란드어, 폴란드어, 스웨덴어, 노르웨이어, 덴마크어, 핀란드어, 그리스어, 체코어, 루마니아어, 헝가리어, 우크라이나어, 히브리어, 태국어, 베트남어, 인도네시아어, 말레이어, 에스토니아어, 페르시아어, 카탈루냐어.

결제

  • 선불: 카드로 $10부터 크레딧을 충전하고, 모든 호출은 잔액에서 차감돼요.
  • 카드 결제 수수료는 결제 단계에서 표시되고 추가되므로, 충전한 크레딧은 전액 사용할 수 있어요.
  • 크레딧은 구매 후 12개월 동안 사용할 수 있어요. 환불되지 않아요.
  • 저희 쪽 문제로 실패한 호출은 청구되지 않으며, 실패한 동영상은 환불돼요.
  • 잔액이 얼마 남지 않으면 이메일로 알려 드려요. 0이 되면 크레딧을 충전할 때까지 호출이 402로 거부돼요.