Dokumentasi Developer Se-Hari
Panduan lengkap API, webhook, MCP, dan n8n untuk menghubungkan Se-Hari ke sistem Anda. Notulensi AI, meeting Zoom, dan kredit — semuanya bisa dipanggil dari kode.
Mulai dalam 60 detik Buat API key, jalankan satu perintah curl, lihat hasilnya.Referensi API Semua endpoint v1 dengan contoh request dan respons.Resep n8n Workflow siap impor — notulen otomatis ke Slack, Notion, Sheets.MCP untuk asisten AI Tanya notulen Anda langsung dari Claude atau ChatGPT.
Memulai
Konsep Inti
- Rate limit Batas frekuensi request dihitung per API key, bukan per IP. Cara membaca headernya dan cara melambat sebelum ditolak.
- Idempotency Cara mengulang request yang gagal tanpa risiko membuat meeting ganda atau membayar dua kali untuk pekerjaan yang sama.
- Paginasi Semua daftar memakai cursor, bukan offset. Cara menelusuri seluruh halaman tanpa melewatkan atau menggandakan baris.
- Menangani error Semua error memakai satu amplop yang sama. Cara membacanya, mana yang layak diulang, dan mana yang tidak akan pernah berhasil.
- Kredit dan penagihan Kredit adalah satuan penagihan Se-Hari. Kapan dipotong, bagaimana menghitungnya di depan, dan kenapa notulen ditagih belakangan.
Panduan
- Webhook Berhenti polling. Daftarkan endpoint sekali, dan Se-Hari yang memberi tahu Anda saat notulen selesai atau kredit menipis.
- MCP untuk asisten AI Pasang Se-Hari sebagai MCP server, lalu tanya notulen rapat Anda langsung dari Claude, Cursor, atau ChatGPT.
- n8n Pasang community node Se-Hari, rangkai notulen otomatis ke Slack atau Notion tanpa menulis satu baris kode.
- Batasan Semua batas keras yang berlaku: ukuran berkas, retensi rekaman, jumlah key dan webhook, panjang daftar.
- Changelog Riwayat perubahan Se-Hari API, kebijakan versi, dan apa yang kami anggap perubahan yang merusak.
Referensi API
- GET /me Info akun dan saldo kredit. GET /me — tanpa scope khusus.
- GET /credits Cek saldo kredit. GET /credits — butuh scope credits:read.
- GET /credits/usage Riwayat pemakaian kredit. GET /credits/usage — butuh scope credits:read.
- POST /credits/estimate Estimasi biaya sebelum eksekusi. POST /credits/estimate — butuh scope credits:read.
- GET /pricing-tiers Katalog paket meeting. GET /pricing-tiers — tanpa scope khusus.
- GET /notes Daftar notulen. GET /notes — butuh scope notulen:read.
- POST /notes Buat notulen dari rekaman yang sudah ada. POST /notes — butuh scope notulen:write.
- GET /notes/{id} Ambil satu notulen. GET /notes/{id} — butuh scope notulen:read.
- GET /notes/{id}/transcript Ambil transkrip notulen. GET /notes/{id}/transcript — butuh scope notulen:read.
- POST /notes/uploads Siapkan unggahan rekaman. POST /notes/uploads — butuh scope notulen:write.
- POST /notes/uploads/{recording_id}/complete Konfirmasi unggahan selesai. POST /notes/uploads/{recording_id}/complete — butuh scope notulen:write.
- POST /notes/{id}/retry Jalankan ulang notulen yang gagal. POST /notes/{id}/retry — butuh scope notulen:write.
- GET /notes/{id}/action-items Daftar action item sebuah notulen. GET /notes/{id}/action-items — butuh scope notulen:read.
- PATCH /notes/{id}/action-items/{item_id} Ubah status action item. PATCH /notes/{id}/action-items/{item_id} — butuh scope notulen:write.
- POST /notes/{id}/share Aktifkan tautan publik notulen. POST /notes/{id}/share — butuh scope notulen:write.
- DELETE /notes/{id}/share Matikan tautan publik notulen. DELETE /notes/{id}/share — butuh scope notulen:write.
- GET /meetings Daftar meeting. GET /meetings — butuh scope meetings:read.
- POST /meetings Buat meeting Zoom. POST /meetings — butuh scope meetings:write.
- GET /meetings/{id} Ambil satu meeting. GET /meetings/{id} — butuh scope meetings:read.
- DELETE /meetings/{id} Batalkan meeting. DELETE /meetings/{id} — butuh scope meetings:write.
- GET /recordings Daftar rekaman. GET /recordings — butuh scope recordings:read.
- POST /recordings/{id}/download-url Buat tautan unduh rekaman. POST /recordings/{id}/download-url — butuh scope recordings:read.
- GET /meetings/{id}/recordings Rekaman milik satu meeting. GET /meetings/{id}/recordings — butuh scope recordings:read.
- GET /webhooks Daftar endpoint webhook. GET /webhooks — butuh scope webhooks:read.
- POST /webhooks Daftarkan endpoint webhook. POST /webhooks — butuh scope webhooks:write.
- GET /webhooks/{id} Detail endpoint webhook. GET /webhooks/{id} — butuh scope webhooks:read.
- PATCH /webhooks/{id} Ubah endpoint webhook. PATCH /webhooks/{id} — butuh scope webhooks:write.
- DELETE /webhooks/{id} Hapus endpoint webhook. DELETE /webhooks/{id} — butuh scope webhooks:write.
- POST /webhooks/{id}/rotate-secret Ganti secret webhook. POST /webhooks/{id}/rotate-secret — butuh scope webhooks:write.
- POST /webhooks/{id}/test Kirim event uji. POST /webhooks/{id}/test — butuh scope webhooks:write.
- GET /webhooks/{id}/deliveries Riwayat pengiriman. GET /webhooks/{id}/deliveries — butuh scope webhooks:read.
- POST /webhooks/{id}/deliveries/{delivery_id}/retry Kirim ulang pengiriman. POST /webhooks/{id}/deliveries/{delivery_id}/retry — butuh scope webhooks:write.
Integrasi
- Integrasi Slack Kirim ringkasan rapat dan action item ke channel Slack segera setelah notulen selesai diproses. Tidak ada yang perlu disalin, dan orang yang tidak hadir…
- Integrasi Notion Setiap rapat menjadi satu halaman Notion, lengkap dengan ringkasan dan action item, di database yang Anda tentukan.
- Integrasi Google Sheets Satu baris spreadsheet per rapat: tanggal, judul, durasi, ringkasan, jumlah action item. Bentuk paling sederhana untuk melacak ke mana waktu tim Anda…
Resep
- Notulen otomatis ke Slack Setiap kali notulen selesai diproses, ringkasan dan action item-nya masuk ke channel Slack yang Anda tentukan. Tidak ada yang perlu diingat, tidak ada…
- Notulen otomatis ke Notion Setiap rapat jadi satu halaman Notion, lengkap dengan ringkasan dan action item. Cocok untuk tim yang sudah menjadikan Notion sebagai arsip pengetahuan.
- Notulen otomatis ke Google Sheets Satu baris spreadsheet per rapat: tanggal, judul, durasi, ringkasan. Bentuk paling sederhana untuk melacak berapa banyak waktu tim Anda dihabiskan di…
- Kirim notulen lewat email Ringkasan rapat dikirim otomatis ke peserta segera setelah notulen selesai. Berguna untuk tim yang belum memakai Slack atau Notion, dan untuk peserta…
- Notulen ke WhatsApp Ringkasan rapat dikirim ke grup atau nomor WhatsApp. Untuk banyak tim di Indonesia, ini kanal yang benar-benar dibaca orang.
- Notulen ke Telegram Ringkasan rapat masuk ke grup Telegram. Paling mudah disiapkan di antara semua kanal pesan, karena bot Telegram tidak butuh persetujuan apa pun.
- Transkrip lengkap ke Google Docs Transkrip penuh dengan penanda penutur disimpan sebagai dokumen Google Docs. Untuk rapat yang isinya perlu dikutip persis — wawancara, sesi klien, rapat…
- Action item jadi kartu Trello Setiap action item hasil rapat otomatis menjadi kartu Trello. Ini yang mengubah notulen dari catatan menjadi pekerjaan yang benar-benar dikerjakan.
- Action item jadi task Asana Setiap action item hasil rapat menjadi task Asana di project yang Anda pilih, lengkap dengan konteks rapat asalnya.
- Meeting Zoom otomatis dari Google Calendar Setiap event kalender baru menjadi meeting Zoom berlisensi, lengkap dengan rekaman dan notulen otomatis. Anda tetap menjadwalkan seperti biasa; Zoom-nya…
- Proses semua rekaman lama sekaligus Menyapu seluruh rekaman yang belum pernah dibuatkan notulen, lalu mengantrekannya satu per satu. Ini resep dengan hasil paling langsung terasa: arsip…
- Rekap rapat mingguan ke spreadsheet Setiap Jumat sore, semua rapat minggu itu masuk ke satu spreadsheet. Berguna untuk melihat pola: berapa jam tim habiskan di rapat, dan rapat mana yang…
- Peringatan saat kredit menipis Dua jalur sekaligus: event `credit.low` dari Se-Hari, dan pemeriksaan terjadwal sebagai jaring pengaman. Supaya workflow otomatis Anda tidak berhenti…
- Arsipkan rekaman ke Google Drive Rekaman Se-Hari disimpan 30 hari lalu dihapus otomatis. Workflow ini menyalinnya ke Google Drive sebelum itu terjadi.
- Tangani notulen yang gagal Tidak semua kegagalan sama. Yang gagal karena kredit habis cukup diulang setelah top up; yang gagal karena rekaman tanpa audio tidak akan pernah…
Kode Error
- invalid_request — Body request tidak lolos validasi HTTP 400. Request Anda sampai ke endpoint yang benar dengan kredensial yang benar, tapi isinya tidak sesuai bentuk yang diharapkan. Validasi terjadi…
- invalid_parameter — Parameter query tidak valid HTTP 400. Salah satu parameter di query string tidak bisa dibaca atau berada di luar rentang yang diizinkan. Seperti `invalid_request`, ini terjadi…
- invalid_cursor — Cursor paginasi tidak bisa dibaca HTTP 400. Nilai `starting_after` yang Anda kirim bukan cursor yang pernah kami keluarkan. Cursor bersifat buram: ia menyandikan posisi baris terakhir dan…
- malformed_json — Body bukan JSON yang valid HTTP 400. Kami tidak berhasil mem-parse body request sebagai JSON. Ini terjadi sebelum validasi field, jadi tidak ada informasi tentang field mana yang…
- missing_authorization — Header Authorization tidak dikirim HTTP 401. Request sampai tanpa header `Authorization` sama sekali. Ini berbeda dari `invalid_api_key`, yang berarti header ada tapi isinya ditolak.
- invalid_api_key — API key ditolak HTTP 401. Header `Authorization` ada, tapi key di dalamnya tidak kami kenali, sudah dicabut, atau sudah lewat masa berlakunya. Ketiga kondisi itu sengaja…
- insufficient_scope — API key kurang izin HTTP 403. Key Anda valid dan dikenali, tapi tidak punya scope yang dibutuhkan endpoint ini. Perbedaan antara 401 dan 403 di sini bermakna: 401 berarti…
- insufficient_credits — Kredit tidak cukup HTTP 403. Operasi ini membutuhkan lebih banyak kredit daripada yang tersisa di akun Anda. Tidak ada yang dikerjakan dan tidak ada yang terpotong —…
- credit_cap_exceeded — Batas kredit harian API key tercapai HTTP 403. Saldo Anda masih ada, tapi API key yang dipakai sudah menyentuh batas kredit hariannya. Batas ini Anda sendiri yang menetapkannya di dashboard…
- forbidden — Operasi tidak diizinkan HTTP 403. Anda punya izin secara scope, tapi operasinya tidak sah pada kondisi data saat ini. Berbeda dari `insufficient_scope`, yang bisa diperbaiki…
- not_found — Data tidak ditemukan HTTP 404. Tidak ada data dengan id tersebut yang bisa Anda akses. Perhatikan kalimat itu: data milik akun lain juga dijawab 404, bukan 403. Menjawab 403…
- method_not_allowed — Method HTTP tidak didukung HTTP 405. Path-nya benar, tapi method yang Anda pakai tidak tersedia di sana. Header `Allow` pada respons menyebutkan method apa saja yang bisa dipakai.
- conflict — Bentrok dengan kondisi data saat ini HTTP 409. Permintaan Anda sah, tapi ada sesuatu yang sudah menempati posisi itu. Ini bukan kegagalan — di banyak kasus, `details` justru berisi id data…
- idempotency_key_reused — Idempotency-Key dipakai untuk isi yang berbeda HTTP 409. Anda mengirim `Idempotency-Key` yang sudah pernah dipakai, tapi dengan body yang berbeda. Kami menolaknya alih-alih menebak mana yang Anda…
- gone — Data sudah tidak tersedia HTTP 410. Data ini pernah ada, tapi masa simpannya sudah lewat. Berbeda dari 404 yang berarti "tidak pernah ada atau bukan milik Anda", 410 adalah…
- file_too_large — Berkas melebihi batas ukuran HTTP 413. Ukuran berkas yang Anda sebutkan melebihi batas yang bisa kami proses. Pemeriksaan terjadi saat meminta URL unggah, sebelum satu byte pun…
- unsupported_media_type — Content-Type tidak didukung HTTP 415. Endpoint ini mengharapkan `Content-Type` tertentu dan menerima yang lain. Untuk seluruh endpoint JSON, nilainya harus `application/json`.
- unprocessable_entity — Bentuk benar, isinya tidak bisa diproses HTTP 422. Body Anda lolos validasi bentuk, tapi isinya tidak masuk akal untuk dikerjakan. Ini lapisan pemeriksaan setelah validasi skema — yang memeriksa…
- rate_limited — Terlalu banyak request HTTP 429. Anda melewati batas jumlah request dalam satu jendela waktu. Batas dihitung **per API key**, bukan per alamat IP — di Indonesia banyak pengguna…
- internal_error — Kesalahan di sisi kami HTTP 500. Sesuatu gagal di dalam sistem kami. Request Anda mungkin sudah sebagian dikerjakan atau tidak sama sekali — itulah kenapa `Idempotency-Key`…
- upstream_error — Layanan pihak ketiga menolak HTTP 502. Kami meneruskan permintaan Anda ke layanan lain — Zoom untuk meeting, penyedia AI untuk transkripsi — dan layanan itu yang gagal. Masalahnya…
- service_unavailable — Layanan sedang tidak tersedia HTTP 503. Kami sedang tidak bisa melayani permintaan ini untuk sementara. Berbeda dari 500 yang berarti sesuatu rusak, 503 berarti sesuatu sedang tidak…