v1.0.0

Referensi API

Integrasikan terjemahan dan transkripsi Morlivo ke dalam aplikasi Anda dengan beberapa baris kode.

URL Dasar: https://api.morlivo.ai Autentikasi: Authorization: Bearer mrl_...

Autentikasi

Semua permintaan API memerlukan token Bearer. Dapatkan kunci API Anda dari dasbor di bagian Pengaturan.

Header
Authorization: Bearer mrl_your_api_key_here

Kunci API dimulai dengan mrl_. Jaga kerahasiaannya. Rotasi dari dasbor jika terkompromi.

POST

/v1/translate

Terjemahkan teks dari satu bahasa ke bahasa lain. Bahasa sumber terdeteksi otomatis jika tidak diisi.

Badan permintaan JSON

FieldTipeWajibDeskripsi
textstringyaTeks untuk diterjemahkan
target_languagestringyaKode ISO 639-1 (mis. es, fr, de)
source_languagestringtidakTerdeteksi otomatis jika tidak diisi
project_idintegertidakTerapkan glosarium dan gaya proyek
formalitystringtidakRegister: formal, informal, or default

Respons 200

FieldTipeDeskripsi
translated_textstringTeks terjemahan
source_languagestringBahasa sumber yang terdeteksi atau disediakan
target_languagestringKode bahasa target
confidencefloatSkor kualitas 0,0 - 1,0
validationobjectHasil validasi kualitas

Contoh

curl
curl -X POST https://api.morlivo.ai/api/v1/translate \
  -H "Authorization: Bearer mrl_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Hello, world!",
    "target_language": "es"
  }'
Python
import httpx

resp = httpx.post(
    "https://api.morlivo.ai/api/v1/translate",
    headers={"Authorization": "Bearer mrl_your_key"},
    json={
        "text": "Hello, world!",
        "target_language": "es",
    },
)
data = resp.json()
print(data["translated_text"])
# → "¡Hola, mundo!"
JavaScript
const resp = await fetch(
  "https://api.morlivo.ai/api/v1/translate",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer mrl_your_key",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      text: "Hello, world!",
      target_language: "es",
    }),
  }
);
const data = await resp.json();
console.log(data.translated_text);
// → "¡Hola, mundo!"
Respons
{
  "translated_text": "¡Hola, mundo!",
  "source_language": "en",
  "target_language": "es",
  "confidence": 0.98,
  "validation": {
    "length_ratio": 1.08,
    "language_match": true,
    "passed": true
  }
}
POST

/v1/transcribe

Transkripsikan file audio atau video ke teks. Mendukung hingga 100 MB.

Badan permintaan multipart/form-data

FieldTipeWajibDeskripsi
filefileyaFile audio/video (mp3, wav, mp4, webm, dll.)
languagestringtidakKode ISO, terdeteksi otomatis jika tidak diisi
project_idintegertidakTautkan ke proyek untuk pelacakan
response_formatstringtidakOutput format: json, verbose_json, text, srt, vtt
punctuatebooleantidakInclude punctuation (default true)

Respons 200

FieldTipeDeskripsi
textstringTeks transkripsi lengkap
languagestringBahasa terdeteksi
duration_secondsfloatDurasi audio
confidencefloatSkor kualitas 0,0 - 1,0
language_confidencefloatConfidence of auto-detected language (null if language was specified)
segmentsarraySegmen bertanda waktu
validationobjectPemeriksaan kualitas

Contoh

curl
curl -X POST https://api.morlivo.ai/api/v1/transcribe \
  -H "Authorization: Bearer mrl_your_key" \
  -F "file=@meeting.mp3" \
  -F "language=en"
Python
import httpx

with open("meeting.mp3", "rb") as f:
    resp = httpx.post(
        "https://api.morlivo.ai/api/v1/transcribe",
        headers={"Authorization": "Bearer mrl_your_key"},
        files={"file": ("meeting.mp3", f, "audio/mpeg")},
        data={"language": "en"},
    )
data = resp.json()
print(data["text"])
Respons
{
  "text": "Welcome everyone to today's meeting...",
  "language": "en",
  "duration_seconds": 342.5,
  "confidence": 0.95,
  "language_confidence": 0.95,
  "segments": [
    {"start": 0.0, "end": 3.2, "text": "Welcome everyone"},
    {"start": 3.2, "end": 6.8, "text": "to today's meeting."}
  ],
  "validation": {
    "words_per_minute": 148,
    "repetition_detected": false,
    "passed": true
  }
}
WebSocket

/v1/live/transcribe

Streaming audio secara real-time dan terima hasil transkripsi langsung.

Koneksi

ParameterTipeWajibDeskripsi
tokenstringyaKunci API sebagai parameter kueri
languagestringtidakPetunjuk bahasa sumber (mis. en, fr). Terdeteksi otomatis jika dihilangkan.

Protokol

Kirim

Frame audio PCM biner (16-bit, 16kHz mono)

Terima

Pesan JSON dengan field type: transcript (teks parsial/final), status (peristiwa sesi), error

Pesan diterima

FieldTipeDeskripsi
typestring"transcript" | "status" | "error"
textstringTeks yang ditranskripsikan (pada pesan transkrip)
is_finalbooleanBernilai benar saat segmen selesai
languagestringKode bahasa yang terdeteksi

Contoh

JavaScript
const ws = new WebSocket(
  "wss://live.morlivo.ai/v1/live/transcribe?token=mrl_your_key&language=en"
);

navigator.mediaDevices.getUserMedia({ audio: true })
  .then(stream => {
    const ctx = new AudioContext({ sampleRate: 16000 });
    const source = ctx.createMediaStreamSource(stream);
    const processor = ctx.createScriptProcessor(4096, 1, 1);

    source.connect(processor);
    processor.connect(ctx.destination);
    processor.onaudioprocess = (e) => {
      const pcm = e.inputBuffer.getChannelData(0);
      const int16 = new Int16Array(pcm.length);
      for (let i = 0; i < pcm.length; i++)
        int16[i] = Math.max(-1, Math.min(1, pcm[i])) * 0x7FFF;
      ws.send(int16.buffer);
    };
  });

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type === "transcript") {
    console.log(msg.is_final ? "FINAL:" : "partial:", msg.text);
  }
};
Python
import asyncio, json, websockets

async def live_transcribe():
    uri = "wss://live.morlivo.ai/v1/live/transcribe?token=mrl_your_key"
    async with websockets.connect(uri) as ws:
        # Send audio chunks (PCM 16-bit 16kHz mono)
        with open("audio.pcm", "rb") as f:
            while chunk := f.read(4096):
                await ws.send(chunk)
                msg = json.loads(await ws.recv())
                if msg["type"] == "transcript":
                    print(msg["text"], end="\r" if not msg["is_final"] else "\n")

asyncio.run(live_transcribe())
Contoh pesan
// Session started
{"type": "status", "message": "session_started"}

// Partial transcript (still speaking)
{"type": "transcript", "text": "Hello every", "is_final": false}

// Final transcript (segment complete)
{"type": "transcript", "text": "Hello everyone, welcome to the meeting.",
 "is_final": true, "language": "en"}

// Session ended
{"type": "status", "message": "session_ended",
 "duration_seconds": 45.2}
WebSocket

/v1/live/translate

Streaming audio dalam satu bahasa dan terima teks terjemahan dalam bahasa lain secara real-time. Mendukung terjemahan ucapan-ke-teks dengan deteksi bahasa otomatis.

Koneksi

ParameterTipeWajibDeskripsi
tokenstringyaKunci API sebagai parameter kueri
target_languagestringyaBahasa untuk teks output (mis. en, es, fr)
source_languagestringtidakBahasa audio sumber. Terdeteksi otomatis jika dihilangkan.

Protokol

Kirim

Frame audio PCM biner (16-bit, 16kHz mono)

Terima

Pesan JSON dengan teks terjemahan dalam target_language. Mencakup transkrip ucapan asli dan output terjemahan.

Pesan diterima

FieldTipeDeskripsi
typestring"transcript" | "status" | "error"
textstringTeks terjemahan dalam bahasa target
is_finalbooleanBernilai benar saat segmen selesai
source_languagestringBahasa sumber yang terdeteksi
target_languagestringKode bahasa target

Contoh

JavaScript
const ws = new WebSocket(
  "wss://live.morlivo.ai/v1/live/translate" +
  "?token=mrl_your_key&target_language=es&source_language=en"
);

// Stream microphone audio (same setup as live transcribe)
// ...

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type === "transcript" && msg.is_final) {
    console.log(`[${msg.source_language} → ${msg.target_language}]`);
    console.log(msg.text);
  }
};
Python
import asyncio, json, websockets

async def live_translate():
    uri = (
        "wss://live.morlivo.ai/v1/live/translate"
        "?token=mrl_your_key"
        "&source_language=fr&target_language=en"
    )
    async with websockets.connect(uri) as ws:
        with open("french_audio.pcm", "rb") as f:
            while chunk := f.read(4096):
                await ws.send(chunk)
                msg = json.loads(await ws.recv())
                if msg["type"] == "transcript" and msg["is_final"]:
                    print(f"Translation: {msg['text']}")

asyncio.run(live_translate())
Contoh pesan
// Partial translation
{"type": "transcript", "text": "Hello every",
 "is_final": false, "source_language": "fr", "target_language": "en"}

// Final translated segment
{"type": "transcript",
 "text": "Hello everyone, welcome to the meeting.",
 "is_final": true,
 "source_language": "fr", "target_language": "en"}

// Session summary
{"type": "status", "message": "session_ended",
 "duration_seconds": 120.5}
POST

/v1/live/rooms

Create a multi-participant translation room. Each participant speaks their own language and receives translated text from other participants.

Badan permintaan JSON

FieldTipeWajibDeskripsi
languagesobjectyaParticipant ID to language mapping
bridge_languagestringtidakHub language, default en
max_participantsinttidakMax participants 2-10, default 10
modestringtidakinterpreter or inline

Respons 200

FieldTipeDeskripsi
room_idstringUnique room identifier
statusstringRoom status
languagesobjectParticipant ID to language mapping
bridge_languagestringHub language used for translation
modestringTranslation mode
max_participantsintMaximum number of participants

Contoh

curl
curl -X POST https://api.morlivo.ai/api/v1/live/rooms \
  -H "Authorization: Bearer mrl_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "languages": {"alice": "en", "bob": "fr", "carlos": "es"},
    "bridge_language": "en",
    "mode": "interpreter"
  }'
Respons
{
  "room_id": "room_abc123",
  "status": "active",
  "languages": {"alice": "en", "bob": "fr", "carlos": "es"},
  "bridge_language": "en",
  "mode": "interpreter",
  "max_participants": 10
}
WebSocket

/v1/live/speech/{room_id}

Connect a participant to a room for real-time speech translation.

Koneksi

ParameterTipeWajibDeskripsi
room_idstringyaRoom ID from create room response (path param)
participantstringyaParticipant ID (query param)
tokenstringyaKunci API sebagai parameter kueri

Contoh

JavaScript
const ws = new WebSocket(
  "wss://live.morlivo.ai/v1/live/speech/room_abc123" +
  "?token=mrl_your_key&participant=alice"
);

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type === "transcript" && msg.is_final) {
    console.log(`[${msg.source_language} → ${msg.target_language}]`);
    console.log(msg.text);
  }
};
POST

/v1/live/rooms/{room_id}/participants

Add a participant to an existing room after creation.

Badan permintaan JSON

FieldTipeWajibDeskripsi
participant_idstringyaUnique participant identifier
languagestringyaParticipant's language code

Contoh

curl
curl -X POST https://api.morlivo.ai/api/v1/live/rooms/room_abc123/participants \
  -H "Authorization: Bearer mrl_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "participant_id": "diana",
    "language": "de"
  }'
GET

/v1/languages

List all supported languages with locale, name, and availability status.

Respons 200

FieldTipeDeskripsi
languagesarrayList of supported languages
languages[].localestringLocale code e.g. fr-CA
languages[].namestringEnglish name
languages[].native_namestringNative name
languages[].countrystringCountry/region
languages[].statusstringga or beta

Contoh

curl
curl https://api.morlivo.ai/api/v1/languages \
  -H "Authorization: Bearer mrl_your_key"
Respons
{
  "languages": [
    {"locale": "en-US", "name": "English", "native_name": "English", "country": "United States", "status": "ga"},
    {"locale": "fr-CA", "name": "French", "native_name": "Français", "country": "Canada", "status": "ga"},
    {"locale": "sw-KE", "name": "Swahili", "native_name": "Kiswahili", "country": "Kenya", "status": "beta"}
  ]
}
GET

/v1/health

Check API status and database health. No authentication required.

Respons 200

FieldTipeDeskripsi
statusstringsehat atau terdegradasi

Contoh

curl
curl https://api.morlivo.ai/api/v1/health
Respons
{
  "status": "healthy"
}

Endpoint Kompatibilitas

Sudah menggunakan penyedia lain? Ubah satu URL dan pertahankan kode Anda yang ada. Endpoint ini mencerminkan format permintaan dan respons dari API terjemahan dan transkripsi utama.

DL

DeepL

Terjemahan
POST /api/compat/deepl/v2/translate

Pengganti langsung untuk api-free.deepl.com

G

Google Cloud Translation

Terjemahan
POST /api/compat/google/v3/projects/{"{p}"}/locations/{"{l}"}:translateText

Pengganti langsung untuk translation.googleapis.com

A

AWS Translate

Terjemahan
POST /api/compat/aws/translate

Pengganti langsung untuk translate.amazonaws.com

OA

OpenAI Whisper

Transkripsi
POST /api/compat/openai/v1/audio/transcriptions

Pengganti langsung untuk api.openai.com

DG

Deepgram

Transkripsi
POST /api/compat/deepgram/v1/listen

Pengganti langsung untuk api.deepgram.com

Endpoint kompatibilitas menerima format permintaan yang sama dan mengembalikan struktur respons yang sama seperti penyedia asli. Lihat dokumentasi masing-masing penyedia untuk skema permintaan/respons mereka.

Error

Semua error mengembalikan objek JSON dengan field detail.

KodeMaknaKapan hal itu terjadi
400 Permintaan Tidak Valid Field wajib tidak diisi, teks kosong, tipe file tidak didukung
401 Tidak Sah Kunci API hilang atau tidak valid
403 Terlarang Kunci API valid tetapi izin tidak mencukupi atau kuota terlampaui
413 Payload Terlalu Besar File melebihi batas unggah 100 MB
429 Batas Laju Terlalu banyak permintaan. Coba lagi dengan exponential backoff.
500 Error Internal Error server tidak terduga. Hubungi dukungan jika masalah berlanjut.
503 Layanan Tidak Tersedia Model AI sementara tidak tersedia (circuit breaker terbuka). Coba lagi segera.
Format respons error
{
  "detail": "Field 'text' must not be empty."
}
POST

Redaksi PII

Tambahkan redaksi PII ke permintaan terjemahan atau transkripsi mana pun. Tentukan jenis entitas yang akan dideteksi dan diredaksi.

POST /v1/translate POST /v1/transcribe

Badan permintaan JSON

FieldTipeWajibDeskripsi
textstringyaTeks untuk diterjemahkan
source_languagestringtidakTerdeteksi otomatis jika tidak diisi
target_languagestringyaKode ISO 639-1 (mis. es, fr, de)
redactstring[]tidakJenis entitas yang akan diredaksi (mis. email, telepon, nama)

Respons 200

FieldTipeDeskripsi
translated_textstringTeks terjemahan dengan PII yang diredaksi
source_languagestringBahasa sumber yang terdeteksi atau disediakan
target_languagestringKode bahasa target
confidencefloatSkor kualitas 0,0 - 1,0
redactionsarrayDaftar redaksi yang diterapkan (jenis dan penggantian)

Contoh

curl
curl -X POST https://api.morlivo.ai/api/v1/translate \
  -H "Authorization: Bearer mrl_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Contact John Smith at john@example.com or 555-123-4567",
    "source_language": "en",
    "target_language": "fr",
    "redact": ["email", "phone", "name"]
  }'
Python
import httpx

resp = httpx.post(
    "https://api.morlivo.ai/api/v1/translate",
    headers={"Authorization": "Bearer mrl_your_key"},
    json={
        "text": "Contact John Smith at john@example.com or 555-123-4567",
        "source_language": "en",
        "target_language": "fr",
        "redact": ["email", "phone", "name"],
    },
)
data = resp.json()
print(data["translated_text"])
# → "Contactez [NAME_REDACTED] à [EMAIL_REDACTED] ou [PHONE_REDACTED]"
JavaScript
const resp = await fetch(
  "https://api.morlivo.ai/api/v1/translate",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer mrl_your_key",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      text: "Contact John Smith at john@example.com or 555-123-4567",
      source_language: "en",
      target_language: "fr",
      redact: ["email", "phone", "name"],
    }),
  }
);
const data = await resp.json();
console.log(data.translated_text);
// → "Contactez [NAME_REDACTED] à [EMAIL_REDACTED] ou [PHONE_REDACTED]"
Respons
{
  "translated_text": "Contactez [NAME_REDACTED] à [EMAIL_REDACTED] ou [PHONE_REDACTED]",
  "source_language": "en",
  "target_language": "fr",
  "confidence": 0.95,
  "redactions": [
    {"type": "name", "replacement": "[NAME_REDACTED]"},
    {"type": "email", "replacement": "[EMAIL_REDACTED]"},
    {"type": "phone", "replacement": "[PHONE_REDACTED]"}
  ]
}

Jenis Entitas yang Didukung

EntitasDeskripsiDeteksi
email Alamat email Berbasis pola (termasuk)
phone Nomor telepon Berbasis pola (termasuk)
ssn Nomor Jaminan Sosial Berbasis pola (termasuk)
credit_card Nomor kartu kredit Berbasis pola (termasuk)
ip_address Alamat IP Berbasis pola (termasuk)
name Nama orang Berbasis AI (biaya tambahan)
address Alamat fisik Berbasis AI (biaya tambahan)
medical Informasi medis Berbasis AI (biaya tambahan)

Entitas berbasis format (email, telepon, SSN, kartu kredit, IP) dideteksi menggunakan pencocokan pola tanpa biaya tambahan. Entitas kontekstual (nama, alamat, medis) menggunakan deteksi berbasis AI dan dikenakan biaya tambahan kecil per permintaan.

Siap untuk mengintegrasikan?

Buat akun gratis untuk mendapatkan kunci API Anda dan mulai menerjemahkan.