se-hari.com se-hari.com

GET /notes/{id}

Ambil satu notulen. GET /notes/{id} — butuh scope notulen:read.

3 menit baca Diperbarui 15 Agustus 2026 Lihat sebagai Markdown

Mengambil satu notulen lengkap dengan ringkasan, topik, keputusan, tindak lanjut, analisis pembicara, dan daftar action item. Transkrip mentah hanya disertakan kalau parameter include=transcript diberikan, karena transkrip rapat tiga jam bisa ratusan kilobyte dan hampir tidak pernah dibutuhkan bersamaan dengan ringkasannya. Field status mencerminkan posisi pekerjaan di antrean. Kalau status bernilai failed, baca failure_code untuk tahu apakah masalahnya bisa diperbaiki dengan mencoba ulang. Notulen milik user lain menjawab 404, bukan 403 — API ini tidak mengonfirmasi keberadaan ID yang bukan milik pemanggil.

#Endpoint

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

Butuh scope notulen: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

#Parameter query

ParameterTipeWajibKeterangan
includestringtidakDaftar dipisah koma; satu-satunya nilai yang didukung: transcript

#Contoh

bash
curl -X GET "https://se-hari.com/api/v1/notes/c0ffee00-1111-2222-3333-444455556666?include=nilai" \
  -H "Authorization: Bearer $SEHARI_API_KEY"
javascript
const res = await fetch('https://se-hari.com/api/v1/notes/c0ffee00-1111-2222-3333-444455556666', {
	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/notes/c0ffee00-1111-2222-3333-444455556666",
    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 respons

FieldTipeKeterangan
idstring
titlestring
statusstring
source_typestring
job_sourcestring | null
recording_idstring | null
meeting_idstring | null
meeting_datestring
duration_minutesnumber | null
speaker_countnumber | null
word_countnumber | null
languagestring | null
transcript_sourcestring | null
processing_stagestring | null
attemptsinteger
credits_deductednumber | null
failure_codestring | null
error_messagestring | null
created_atstring
updated_atstring
summarystring | null
topicsobject | null
key_decisionsobject | null
follow_up_itemsobject | null
speakersobject | null
action_itemsarray<object>
shareobject
transcriptarray<object>

#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

Endpoint ini yang paling sering dipanggil berulang-ulang, karena pemrosesan notulen berjalan asinkron dan orang ingin tahu kapan selesai. Rekaman satu jam butuh beberapa menit; menanyakan statusnya setiap detik menghasilkan ratusan request yang semuanya menjawab hal yang sama, lalu berakhir di 429.

Cara yang benar adalah mendaftarkan webhook note.completed sekali, lalu berhenti bertanya — satu request menggantikan ratusan. Kalau Anda memang harus polling (misalnya sedang mencoba-coba di terminal), jeda 30 detik sudah lebih dari cukup, dan X-RateLimit-Remaining pada setiap respons memberi tahu kapan harus melambat.

#Alur khas

Notulen selalu berawal dari sebuah rekaman. Rekaman itu bisa datang sendiri (meeting Zoom yang direkam diarsipkan otomatis) atau Anda unggah sendiri. Setelah rekaman ada, pembuatan notulen berjalan asinkron: endpoint mengantre pekerjaan lalu langsung menjawab, dan hasilnya menyusul beberapa menit kemudian.

  1. GET /recordings?has_note=false — cari rekaman yang belum pernah diproses
  2. POST /notes dengan recording_id dari langkah 1 — antrekan pekerjaannya
  3. Tunggu webhook note.completed, atau polling GET /notes/{id} sampai status menjadi completed
  4. GET /notes/{id}?include=summary,action_items — ambil hasilnya

Polling bukan pilihan pertama. Rekaman satu jam butuh beberapa menit untuk diproses, dan menanyakan statusnya setiap detik hanya menghabiskan kuota rate limit Anda. Daftarkan webhook note.completed sekali, lalu biarkan Se-Hari yang memberi tahu.

#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