se-hari.com se-hari.com

GET /meetings

Daftar meeting. GET /meetings — butuh scope meetings:read.

3 menit baca Diperbarui 15 Agustus 2026 Lihat sebagai Markdown

Menelusuri meeting Zoom milik pemilik API key, terbaru lebih dulu, dengan paginasi cursor. Field status bernilai pending untuk meeting yang belum dimulai, running saat sedang berlangsung, dan done setelah selesai. Waktu dikembalikan dalam dua bentuk: start_at sebagai ISO-8601 UTC untuk diproses mesin, dan start_at_wib sebagai teks WIB untuk ditampilkan ke pengguna Indonesia tanpa risiko salah konversi. Password dan host key ikut dikembalikan karena keduanya dibutuhkan untuk membagikan undangan — perlakukan sebagai data sensitif.

#Endpoint

bash
GET https://se-hari.com/api/v1/meetings

Butuh scope meetings: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. Daftar ini memakai paginasi cursor, bukan offset. Ambil next_cursor dari respons lalu kirim kembali sebagai starting_after untuk halaman berikutnya, dan berhenti saat has_more bernilai false. Cursor dipilih karena offset melewatkan baris begitu ada data baru masuk di tengah penelusuran — pada daftar yang bertambah setiap hari itu bukan kasus langka melainkan kejadian harian, dan gejalanya adalah baris yang hilang tanpa satu pun error. Filter tanggal menerima ISO-8601. Perlu diingat seluruh jadwal Se-Hari memakai zona WIB (UTC+7): meeting yang tampil pukul 09:00 di dashboard adalah 02:00 UTC, dan menyaring dengan tanggal UTC polos akan memotong tujuh jam pertama setiap hari tanpa memberi tahu Anda.

#Parameter query

ParameterTipeWajibKeterangan
limitintegeryaJumlah baris per halaman (1-100). min 1, maks 100
starting_afterstringtidak
statuspending | running | donetidak
fromstringtidakTimestamp ISO-8601, contoh 2026-08-01T00:00:00Z
tostringtidakTimestamp ISO-8601, contoh 2026-08-01T00:00:00Z

#Contoh

bash
curl -X GET "https://se-hari.com/api/v1/meetings?limit=10&starting_after=nilai" \
  -H "Authorization: Bearer $SEHARI_API_KEY"
javascript
const res = await fetch('https://se-hari.com/api/v1/meetings', {
	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",
    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
titlestring
statusstring
start_atstring
start_at_wibstring
end_atstring | null
durationnumber | null
duration_unitstring | null
capacitynumber | null
join_urlstring | null
passwordstring | null
host_keystring | null
zoom_meeting_idstring | null
auto_notulenboolean
created_atstring

#Menelusuri semua halaman

Satu request hanya mengembalikan maksimum 100 baris. Untuk mengambil semuanya, ikuti next_cursor sampai has_more bernilai false — jangan menghitung sendiri posisinya.

javascript
async function ambilSemua() {
	const semua = [];
	let cursor = null;

	do {
		const qs = new URLSearchParams({ limit: "100" });
		if (cursor) qs.set("starting_after", cursor);

		const res = await fetch(`https://se-hari.com/api/v1/meetings?${qs}`, {
			headers: { Authorization: `Bearer ${process.env.SEHARI_API_KEY}` }
		});
		const page = await res.json();

		semua.push(...page.data);
		cursor = page.has_more ? page.next_cursor : null;
	} while (cursor);

	return semua;
}

#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_parameter",
    "message": "Penjelasan untuk manusia.",
    "docs_url": "https://se-hari.com/docs/error/invalid-parameter",
    "request_id": "req_a1b2c3d4e5f6",
    "details": {}
  }
}
StatusKodeArtinya di endpoint ini
400invalid_parameterAda parameter query yang salah bentuk atau di luar rentang.
401invalid_api_keyKey salah, sudah dicabut, atau kedaluwarsa.
403insufficient_scopeKey valid, tapi tidak punya scope yang dibutuhkan endpoint ini.
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.

#Alur khas

Meeting dibuat dari sebuah paket harga, bukan dari durasi dan kapasitas lepas. Paket menentukan berapa peserta yang muat, berapa lama meeting boleh berjalan, dan berapa kredit yang dipotong — jadi langkah pertama selalu melihat katalognya.

  1. GET /pricing-tiers — lihat paket yang tersedia beserta biayanya
  2. POST /credits/estimate dengan type: "meeting" — pastikan saldo cukup sebelum memotong apa pun
  3. POST /meetings — buat meetingnya; kredit terpotong saat ini juga
  4. Bagikan join_url dari respons ke peserta

Membatalkan meeting yang belum dimulai mengembalikan kreditnya. Yang sudah berjalan tidak — waktu host Zoom sudah terpakai dan tidak bisa ditarik kembali. Karena itu DELETE /meetings/{id} menjawab berbeda tergantung status, dan bukan karena kesalahan Anda.

#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.
  • 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