Panduan Praktis

Dokumentasi API dan SDK ScreenApp

API ScreenApps memungkinkan Anda untuk secara otomatis mentranskripsi, meringkas, dan menganalisis konten video dan audio

Dokumentasi ScreenApp API v2.0.0

API ScreenApp memungkinkan Anda untuk secara otomatis mentranskripsikan, meringkas, dan menganalisis konten video dan audio. Sempurna untuk bisnis yang ingin memproses panggilan pelanggan, video pelatihan, dan rekaman rapat dalam skala besar.

Kasus Penggunaan Utama

  • Transkripsi & Ringkasan Otomatis: Ubah video atau audio apa pun menjadi teks yang dapat dicari dan ringkasan yang ringkas. Ideal untuk tim layanan pelanggan, lembaga pendidikan, dan pembuat konten.
  • Manajemen Pengetahuan: Bangun repositori konten video yang dapat dicari dengan transkrip otomatis, ringkasan, dan wawasan bertenaga AI. Sempurna untuk materi pelatihan dan basis pengetahuan perusahaan.
  • Pemrosesan Waktu Nyata: Terima transkrip dan ringkasan melalui webhook segera setelah rekaman diproses. Cocok untuk berintegrasi dengan sistem CRM dan platform layanan pelanggan.
  • Perekaman Tersemat: Tambahkan kemampuan perekaman kelas profesional ke aplikasi Anda dengan perekam tersemat kami yang menangani pengambilan layar dan audio.

✨ Kasus Penggunaan Populer: Tim layanan pelanggan menggunakan API kami untuk secara otomatis mentranskripsikan panggilan dukungan dan menghasilkan ringkasan, yang kemudian disinkronkan ke CRM mereka melalui webhook.

Dapatkan Kredensial API di Dasbor →

Persyaratan Paket & Akses API

Untuk menggunakan ScreenApp API, Anda memerlukan:

  1. Langganan paket Bisnis yang aktif
  2. Kredensial API dari dasbor ScreenApp Anda

Mendapatkan Kredensial API Anda

  1. Masuk ke akun ScreenApp Anda
  2. Arahkan ke Pengaturan → Integrasi
  3. Di sini Anda akan menemukan:
    • Token API
    • ID Tim

Jaga keamanan kredensial ini dan jangan pernah membagikannya secara publik.

Mulai Cepat

Ingin segera memulai? Ikuti langkah-langkah ini untuk mengintegrasikan ScreenApp ke situs web Anda:

1. Instal Plugin

Tambahkan kode ini ke HTML situs web Anda:

<script>
  // Kode instalasi plugin di sini
</script>

2. Tambahkan Tombol Pemicu

Tambahkan tombol atau elemen pemicu ke halaman Anda:

<button onclick="loadScreenApp()">Mulai Merekam</button>

3. Konfigurasikan Callback

Sesuaikan fungsi callback untuk menangani penyelesaian perekaman:

function callback({ id, url }) {
  // Contoh: Kirim ke backend Anda
  fetch('/api/recordings', {
    method: 'POST',
    body: JSON.stringify({ recordingId: id, recordingUrl: url })
  });
  
  // Contoh: Perbarui UI
  document.getElementById('status').innerHTML = 
    `Rekaman disimpan! Lihat di ${url}`;
}

Otentikasi

Semua permintaan API memerlukan otentikasi. ScreenApp menggunakan otentikasi berbasis token bersama dengan pengidentifikasi khusus tim.

Kredensial yang Anda Butuhkan

  • Token API: Kunci API rahasia Anda
  • ID Tim: Pengidentifikasi tim unik Anda

Contoh Otentikasi

curl -X POST "https://api.screenapp.io/v2/files/upload" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "X-Team-ID: YOUR_TEAM_ID"

Titik Akhir Otentikasi

GET /auth/google

Alihkan ke Google untuk otentikasi

Parameter Kueri:

  • redirectUrl - URL Terenkripsi untuk mengalihkan pengguna setelah otentikasi berhasil
  • referrerUrl - URL Perujuk Terenkripsi
  • intent - Niat untuk pengguna (mis., “signup”)

GET /auth/facebook

Alihkan ke Facebook untuk otentikasi

Parameter Kueri:

  • redirectUrl - URL Terenkripsi untuk mengalihkan pengguna setelah otentikasi berhasil
  • referrerUrl - URL Perujuk Terenkripsi
  • intent - Niat untuk pengguna (mis., “signup”)

Konsep Inti

Sebelum menyelami titik akhir tertentu, mari pahami konsep-konsep utama di ScreenApp:

  1. Rekaman: Pengambilan video dan audio yang dapat diunggah dan diproses
  2. Tim: Grup yang dapat berbagi dan mengelola rekaman
  3. Webhook: Notifikasi waktu nyata untuk peristiwa perekaman dan hasil pemrosesan
  4. Tag: Metadata yang dapat dilampirkan ke rekaman, tim, atau profil pengguna

Referensi API

Manajemen Tim

POST /team/{teamId}/tag

Tambahkan tag ke tim

Parameter Jalur:

  • teamId - ID tim

Isi Permintaan:

{
  "key": "color",
  "value": "red"
}

DELETE /team/{teamId}/tag

Hapus tag dari tim

Parameter Jalur:

  • teamId - ID tim

Isi Permintaan:

{
  "key": "color"
}

Integrasi Webhook Tim

POST /team/{teamId}/integrations/webhook

Daftarkan URL webhook baru untuk tim

Parameter Jalur:

  • teamId - ID tim

Isi Permintaan:

{
  "url": "https://example.com/webhook",
  "name": "Webhook Saya"
}

Respons:

  • 200 - Webhook berhasil didaftarkan
  • 400 - Isi permintaan tidak valid
  • 500 - Kesalahan server internal

DELETE /team/{teamId}/integrations/webhook

Batalkan pendaftaran URL webhook untuk tim

Parameter Jalur:

  • teamId - ID tim

Parameter Kueri:

  • url - URL webhook yang akan dibatalkan pendaftarannya

Respons:

  • 200 - Webhook berhasil dibatalkan pendaftarannya
  • 400 - Permintaan tidak valid
  • 404 - URL Webhook tidak ditemukan
  • 500 - Kesalahan server internal

GET /team/{teamId}/integrations/zapier/sample/list

Dapatkan data sampel untuk Zapier sebagai array

Parameter Jalur:

  • teamId - ID tim

Respons:

  • 200 - Data sampel berhasil diambil
  • 404 - File sampel tidak ditemukan

Integrasi Pengguna

POST /integrations/webhook

Daftarkan webhook baru untuk pengguna

Isi Permintaan:

{
  "url": "https://example.com/webhook",
  "name": "Webhook Saya"
}

Respons:

  • 200 - Webhook berhasil didaftarkan
  • 400 - Isi permintaan tidak valid

DELETE /integrations/webhook

Batalkan pendaftaran webhook untuk pengguna

Parameter Kueri:

  • url - URL webhook yang akan dibatalkan pendaftarannya

Respons:

  • 200 - Webhook berhasil dibatalkan pendaftarannya
  • 400 - Permintaan tidak valid
  • 404 - URL Webhook tidak ditemukan

Peristiwa Webhook

Titik akhir webhook Anda akan menerima peristiwa dalam format ini:

{
  "event": "recording.completed",
  "fileId": "file789",
  "teamId": "team123",
  "data": {
    "url": "https://screenapp.io/recording/file789",
    "duration": 300,
    "status": "processed"
  }
}

Peristiwa umum meliputi:

  • recording.started
  • recording.completed
  • recording.processed
  • recording.failed

Manajemen File

POST /files/{fileId}/tag

Tambahkan tag ke file

Parameter Jalur:

  • fileId - ID file

Isi Permintaan:

{
  "key": "color",
  "value": "red"
}

DELETE /files/{fileId}/tag

Hapus tag dari file

Parameter Jalur:

  • fileId - ID file

Isi Permintaan:

{
  "key": "color"
}

POST /files/{fileId}/ask/multimodal

Ajukan pertanyaan tentang file menggunakan beberapa model AI

Parameter Jalur:

  • fileId - ID file yang akan dianalisis

Isi Permintaan:

{
  "promptText": "Apa poin-poin penting yang dibahas?",
  "mediaAnalysisOptions": {
    "transcript": {
      "segments": [
        {
          "start": 0,
          "end": 120
        }
      ]
    },
    "video": {
      "segments": [
        {
          "start": 0,
          "end": 120
        }
      ]
    },
    "screenshots": {
      "timestamps": [30, 60, 90]
    }
  }
}

Respons:

  • 200 - Pertanyaan berhasil diproses
  • 403 - Batas penggunaan AI terlampaui
  • 500 - Kesalahan server

Unggah File

POST /files/upload/{teamId}/{folderId}/url

Hasilkan URL pra-tandatangan untuk unggahan file

Parameter Jalur:

  • teamId - ID tim
  • folderId - ID folder

Isi Permintaan:

{
  "files": [
    {
      "contentType": "video/mp4",
      "name": "meeting-recording.mp4"
    }
  ]
}

Respons:

  • 200 - URL unggah berhasil dihasilkan
  • 400 - Parameter permintaan tidak valid
  • 500 - Kesalahan server

POST /files/upload/{teamId}/{folderId}/finalize

Selesaikan unggahan file

Parameter Jalur:

  • teamId - ID tim
  • folderId - ID folder

Isi Permintaan:

{
  "file": {
    "fileId": "file123",
    "contentType": "video/mp4",
    "name": "Panggilan Penjualan",
    "description": "Panggilan penjualan mingguan dengan pelanggan",
    "recorderName": "John Doe",
    "recorderEmail": "[email protected]"
  }
}

Respons:

  • 200 - Unggahan file berhasil diselesaikan
  • 400 - Parameter permintaan tidak valid
  • 403 - Batas unggah terlampaui
  • 500 - Kesalahan server

Unggahan Multipart (untuk file besar)

PUT /files/upload/multipart/init/{teamId}/{folderId}

Inisialisasi unggahan multipart untuk file besar

Parameter Jalur:

  • teamId - ID tim
  • folderId - ID folder

Isi Permintaan:

{
  "contentType": "video/mp4"
}

Respons:

  • 200 - Unggahan berhasil diinisialisasi
  • 400 - Parameter permintaan tidak valid
  • 500 - Kesalahan server

Contoh Respons:

{
  "success": true,
  "data": {
    "fileId": "file789",
    "uploadId": "upload123"
  }
}

PUT /files/upload/multipart/url/{teamId}/{folderId}/{fileId}/{uploadId}/{partNumber}

Dapatkan URL unggah untuk bagian tertentu

Parameter Jalur:

  • teamId - ID tim
  • folderId - ID folder
  • fileId - ID file yang sedang diunggah
  • uploadId - ID sesi unggahan multipart
  • partNumber - Nomor bagian (1-10000)

Isi Permintaan:

{
  "contentType": "video/mp4"
}

Respons:

  • 200 - URL unggah berhasil dihasilkan
  • 400 - Parameter permintaan tidak valid
  • 500 - Kesalahan server

Contoh Respons:

{
  "success": true,
  "data": {
    "uploadUrl": "https://presigned-s3-url.com/part1"
  }
}

PUT /files/upload/multipart/finalize/{teamId}/{folderId}/{fileId}/{uploadId}

Selesaikan unggahan multipart

Parameter Jalur:

  • teamId - ID tim
  • folderId - ID folder
  • fileId - ID file yang sedang diunggah
  • uploadId - ID sesi unggahan multipart

Isi Permintaan:

{
  "file": {
    "contentType": "video/mp4",
    "recorderName": "John Doe",
    "recorderEmail": "[email protected]",
    "name": "Rekaman Saya",
    "description": "Sesi video yang direkam",
    "notes": [
      {
        "text": "Poin penting dibahas",
        "timestamp": 1234567890
      }
    ]
  }
}

Respons:

  • 200 - Unggahan berhasil diselesaikan
  • 400 - Parameter permintaan tidak valid
  • 404 - Unggahan aktif tidak ditemukan
  • 500 - Kesalahan server

PUT /files/upload/multipart/fallback/{teamId}/{folderId}/{fileId}/{partNumber}

Unggah bagian file melalui backend (fallback)

Parameter Jalur:

  • teamId - ID tim
  • folderId - ID folder
  • fileId - ID file yang sedang diunggah
  • partNumber - Nomor bagian (1-10000)

Data Formulir:

  • file - Bagian file yang akan diunggah
  • contentType - Tipe MIME dari file yang sedang diunggah

Respons:

  • 200 - Bagian berhasil diunggah
  • 400 - Parameter permintaan tidak valid
  • 500 - Kesalahan server

Manajemen Akun

POST /v2/account/tag

Tambahkan tag ke pengguna yang diautentikasi

Isi Permintaan:

{
  "key": "color",
  "value": "red"
}

Respons:

  • 200 - Tag berhasil ditambahkan
  • 400 - Parameter permintaan tidak valid

PUT /account/profile

Perbarui profil pengguna yang diautentikasi

Isi Permintaan:

{
  "firstName": "John",
  "lastName": "Doe",
  "name": "John Doe",
  "gender": "male",
  "userType": "user",
  "company": "Acme Inc",
  "role": "Developer",
  "goals": "Pelajari teknologi baru",
  "phoneNumber": "+1234567890",
  "location": "San Francisco, CA",
  "website": "https://example.com",
  "picture": "https://example.com/avatar.jpg",
  "provider": "local",
  "providerId": "12345",
  "primaryField": "development"
}

Respons:

  • 200 - Profil berhasil diperbarui
  • 400 - Parameter permintaan tidak valid

Fitur Lanjutan

Analisis AI

Gunakan AI untuk menganalisis rekaman Anda untuk mendapatkan wawasan:

// Minta analisis AI dari rekaman
const analysis = await fetch(`/v2/files/${fileId}/ask/multimodal`, {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    promptText: "Apa poin-poin diskusi utama?",
    mediaAnalysisOptions: {
      transcript: {
        segments: [{ start: 0, end: 300 }]
      },
      video: {
        segments: [{ start: 0, end: 300 }]
      }
    }
  })
});

Operasi Batch

Kelola beberapa rekaman secara efisien:

// Tandai beberapa rekaman
async function batchTag(fileIds, tag) {
  const promises = fileIds.map(fileId => 
    fetch(`/v2/files/${fileId}/tag`, {
      method: 'POST',
      headers: {
        'Authorization': 'Bearer YOUR_API_TOKEN',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(tag)
    })
  );
  await Promise.all(promises);
}

Penanganan Kesalahan

Kode Kesalahan Umum

  • 400: Parameter permintaan tidak valid
  • 403: Batas penggunaan AI terlampaui atau akses tidak sah
  • 404: Sumber daya tidak ditemukan
  • 500: Kesalahan server

Format Respons Kesalahan

Respons kesalahan biasanya mengikuti format ini:

{
  "success": false,
  "message": "Pesan kesalahan terperinci"
}

Contoh

Menyiapkan Webhook Tim

Webhook memungkinkan Anda menerima pembaruan waktu nyata saat rekaman diproses:

// Daftarkan webhook baru untuk tim Anda
async function registerTeamWebhook(teamId, webhookUrl, webhookName) {
  const response = await fetch(`/v2/team/${teamId}/integrations/webhook`, {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer YOUR_API_TOKEN',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      url: webhookUrl,
      name: webhookName
    })
  });
  return await response.json();
}

// Contoh penggunaan
const result = await registerTeamWebhook(
  'team123',
  'https://your-domain.com/webhooks/screenapp',
  'Pembaruan Rekaman'
);

Mengunggah dan Memproses File Besar

Untuk file yang lebih besar dari 100MB, gunakan alur unggahan multipart:

// 1. Inisialisasi unggahan
const initResponse = await fetch(`/v2/files/upload/multipart/init/${teamId}/${folderId}`, {
  method: 'PUT',
  headers: {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    contentType: 'video/mp4'
  })
});

const { data: { fileId, uploadId } } = await initResponse.json();

// 2. Bagi file menjadi beberapa bagian dan unggah setiap bagian
const CHUNK_SIZE = 5 * 1024 * 1024; // Potongan 5MB
const totalParts = Math.ceil(file.size / CHUNK_SIZE);

for (let partNumber = 1; partNumber <= totalParts; partNumber++) {
  // Dapatkan URL unggah untuk bagian ini
  const urlResponse = await fetch(
    `/v2/files/upload/multipart/url/${teamId}/${folderId}/${fileId}/${uploadId}/${partNumber}`,
    {
      method: 'PUT',
      headers: {
        'Authorization': 'Bearer YOUR_API_TOKEN',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        contentType: 'video/mp4'
      })
    }
  );
  
  const { data: { uploadUrl } } = await urlResponse.json();
  
  // Buat potongan dari file
  const start = (partNumber - 1) * CHUNK_SIZE;
  const end = Math.min(start + CHUNK_SIZE, file.size);
  const chunk = file.slice(start, end);
  
  // Unggah potongan langsung ke S3
  await fetch(uploadUrl, {
    method: 'PUT',
    body: chunk,
    headers: {
      'Content-Type': 'video/mp4'
    }
  });
}

// 3. Selesaikan unggahan
const finalizeResponse = await fetch(
  `/v2/files/upload/multipart/finalize/${teamId}/${folderId}/${fileId}/${uploadId}`,
  {
    method: 'PUT',
    headers: {
      'Authorization': 'Bearer YOUR_API_TOKEN',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      file: {
        contentType: 'video/mp4',
        name: 'Rekaman Rapat Pelanggan',
        description: 'Tinjauan triwulanan dengan klien',
        recorderName: 'Jane Smith',
        recorderEmail: '[email protected]'
      }
    })
  }
);

Dapatkan Kredensial API di Dasbor →