se-hari.com se-hari.com

GET /meetings/{id}/recordings

Rekaman milik satu meeting. GET /meetings/{id}/recordings — butuh scope recordings:read.

3 menit baca Diperbarui 15 Agustus 2026 Lihat sebagai Markdown

Menampilkan seluruh rekaman yang dihasilkan sebuah meeting. Satu meeting bisa punya banyak rekaman karena Se-Hari menyewakan satu ruang Zoom untuk rentang beberapa hari dan setiap sesi menghasilkan rekamannya sendiri. Karena itu jangan berasumsi satu meeting sama dengan satu rekaman — selalu telusuri seluruh daftarnya.

#Endpoint

bash
GET https://se-hari.com/api/v1/meetings/{id}/recordings

Butuh scope recordings:read. Scope ditetapkan saat key dibuat dan tidak bisa ditambahkan belakangan — kalau key Anda kurang izin, buat key baru lalu cabut yang lama. Kekakuan ini disengaja: scope yang bisa dinaikkan diam-diam berarti key yang bocor hari ini bisa menjadi lebih berbahaya besok. Beri setiap integrasi key sendiri dengan scope sesempit mungkin, supaya mencabut satu integrasi tidak pernah berarti mematikan yang lain.

#Parameter path

ParameterTipeWajibKeterangan
idstringyamin 1 karakter

#Contoh

bash
curl -X GET "https://se-hari.com/api/v1/meetings/c0ffee00-1111-2222-3333-444455556666/recordings" \
  -H "Authorization: Bearer $SEHARI_API_KEY"
javascript
const res = await fetch('https://se-hari.com/api/v1/meetings/c0ffee00-1111-2222-3333-444455556666/recordings', {
	method: 'GET',
	headers: {
			'Authorization': `Bearer ${process.env.SEHARI_API_KEY}`,
		}
});

if (!res.ok) {
	const { error } = await res.json();
	// error.code stabil dan bisa dicabang; error.message untuk manusia.
	throw new Error(`${error.code}: ${error.message}`);
}

const data = await res.json();
python
import os, requests

res = requests.get(
    "https://se-hari.com/api/v1/meetings/c0ffee00-1111-2222-3333-444455556666/recordings",
    headers={"Authorization": f"Bearer {os.environ['SEHARI_API_KEY']}"},
    timeout=30,
)

if not res.ok:
    err = res.json()["error"]
    raise RuntimeError(f"{err['code']}: {err['message']}")

data = res.json()

#Field tiap item di `data`

FieldTipeKeterangan
idstring
meeting_idstring | null
sourcestring
statusstring
size_mbnumber | null
duration_secondsnumber | null
original_file_namestring | null
has_audio_assetboolean
has_transcript_assetboolean
note_idstring | null
expires_atstring | null
created_atstring

#Kalau gagal

Setiap kegagalan memakai amplop yang sama, dan code di dalamnya stabil — cabangkan logika Anda ke sana, jangan ke message yang teksnya bisa diperbaiki sewaktu-waktu.

json
{
  "error": {
    "code": "invalid_api_key",
    "message": "Penjelasan untuk manusia.",
    "docs_url": "https://se-hari.com/docs/error/invalid-api-key",
    "request_id": "req_a1b2c3d4e5f6",
    "details": {}
  }
}
StatusKodeArtinya di endpoint ini
401invalid_api_keyKey salah, sudah dicabut, atau kedaluwarsa.
403insufficient_scopeKey valid, tapi tidak punya scope yang dibutuhkan endpoint ini.
404not_foundData tidak ada, atau ada tapi milik akun lain — keduanya dijawab sama.
429rate_limitedTerlalu banyak request. Hormati header Retry-After.
500internal_errorKesalahan di sisi kami. Sertakan request_id saat melapor.
Simpan request_id dari setiap respons gagal. Itu satu-satunya cara kami menemukan kembali request Anda di log ketika Anda melapor, dan ia juga ada di header X-Request-Id pada respons yang berhasil.

#Jangan dipanggil dalam perulangan

Rekaman baru muncul di sini setelah Zoom selesai memprosesnya dan kami selesai mengarsipkannya — bisa beberapa menit sampai puluhan menit setelah meeting berakhir, tergantung durasinya. Memanggil endpoint ini dalam perulangan selama menunggu adalah pemborosan yang bisa dihindari sepenuhnya.

Event webhook recording.ready dikirim tepat ketika rekaman siap diunduh. Kalau Anda menyusun alur arsip otomatis, picu dari event itu, bukan dari jadwal yang menebak-nebak kapan rekamannya kira-kira selesai.

#Alur khas

Rekaman disimpan 30 hari lalu dihapus otomatis. Angka itu menentukan hampir semua keputusan di sekitar endpoint rekaman: tautan unduh dibuat sesaat, arsip harus dijadwalkan, dan rekaman lama menjawab gone alih-alih menyajikan berkas yang sudah tidak ada.

  1. GET /recordings — cari rekaman yang Anda butuhkan
  2. POST /recordings/{id}/download-url — buat tautan bertanda tangan
  3. Unduh berkasnya SEGERA; tautan berlaku singkat dan tidak bisa disimpan untuk nanti
  4. Salin ke penyimpanan Anda sendiri kalau perlu disimpan lebih dari 30 hari

Tautan unduh sengaja berumur pendek karena ia memberi akses tanpa API key kepada siapa pun yang memegangnya. Menyimpannya di database atau mengirimnya lewat email sama dengan membagikan isi rekaman kepada siapa saja yang kelak membaca catatan itu.

#Yang sering keliru

  • Key disalin sebagian. API key Se-Hari panjangnya tetap: sh_live_ diikuti 43 karakter. Kalau panjangnya berbeda, yang salah adalah proses penyalinannya, bukan key-nya — dan pesan 401 tidak akan mengatakan itu.
  • Scope kurang, bukan key salah. 403 di sini berarti key-nya dikenali. Periksa scope-nya lewat GET /me, lalu buat key baru kalau memang kurang; scope tidak bisa ditambahkan ke key yang sudah jadi.
  • 404 tidak selalu berarti data tidak ada. Data milik akun lain juga dijawab 404, bukan 403 — kami tidak mengonfirmasi keberadaan id milik orang lain. Kalau Anda yakin id-nya benar, periksa apakah key yang dipakai milik akun yang sama.
  • Hormati Retry-After. Mencoba lagi lebih cepat dari yang disebutkan hanya memperpanjang masa tunggu. Kalau Anda sering menyentuhnya, kemungkinan besar Anda sedang polling sesuatu yang seharusnya ditangani webhook.

#Selanjutnya

Siap mencoba?

Buat API key gratis di dashboard — tidak ada biaya berlangganan, kredit terpakai hanya saat Anda benar-benar memproses rekaman atau membuat meeting.

Buat API Key