se-hari.com se-hari.com

GET /webhooks/{id}/deliveries

Riwayat pengiriman. GET /webhooks/{id}/deliveries — butuh scope webhooks:read.

3 menit baca Diperbarui 15 Agustus 2026 Lihat sebagai Markdown

Menampilkan riwayat pengiriman untuk sebuah endpoint, terbaru lebih dulu. Status pending berarti masih akan dicoba lagi — next_retry_at menyebutkan kapan. Jadwal percobaan ulangnya 1 menit, 5 menit, 30 menit, 2 jam, lalu 6 jam — lima jeda, enam percobaan. Setelah percobaan terakhir gagal, status menjadi failed dan tidak dicoba lagi. Riwayat disimpan 30 hari.

#Endpoint

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

Butuh scope webhooks: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.

#Parameter path

ParameterTipeWajibKeterangan
idstringyamin 1 karakter

#Parameter query

ParameterTipeWajibKeterangan
limitintegeryaJumlah baris per halaman (1-100). min 1, maks 100
starting_afterstringtidak
statuspending | delivered | failedtidak

#Contoh

bash
curl -X GET "https://se-hari.com/api/v1/webhooks/c0ffee00-1111-2222-3333-444455556666/deliveries?limit=10&starting_after=nilai" \
  -H "Authorization: Bearer $SEHARI_API_KEY"
javascript
const res = await fetch('https://se-hari.com/api/v1/webhooks/c0ffee00-1111-2222-3333-444455556666/deliveries', {
	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/webhooks/c0ffee00-1111-2222-3333-444455556666/deliveries",
    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
event_idstring
event_typestring
statusstring
attemptsinteger
last_status_codeinteger | null
last_errorstring | null
next_retry_atstring | null
delivered_atstring | null
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/webhooks/{id}/deliveries?${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_cursor",
    "message": "Penjelasan untuk manusia.",
    "docs_url": "https://se-hari.com/docs/error/invalid-cursor",
    "request_id": "req_a1b2c3d4e5f6",
    "details": {}
  }
}
StatusKodeArtinya di endpoint ini
400invalid_cursorNilai starting_after bukan cursor yang pernah kami keluarkan.
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.

#Alur khas

Webhook membalik arah komunikasi: alih-alih Anda menanyakan status berulang kali, Se-Hari yang memanggil endpoint Anda begitu ada kabar. Ini satu-satunya cara yang masuk akal untuk mengetahui notulen selesai, karena pemrosesannya bisa memakan beberapa menit.

  1. POST /webhooks dengan URL https publik Anda dan daftar event — simpan secret dari respons
  2. Verifikasi header X-Sehari-Signature di setiap kiriman yang masuk
  3. Jawab 2xx secepatnya; kerjakan proses beratnya setelah membalas
  4. GET /webhooks/{id}/deliveries kalau ada yang tampak tidak sampai

secret hanya ditampilkan sekali, saat endpoint dibuat. Kalau hilang, pakai POST /webhooks/{id}/rotate-secret untuk mendapatkan yang baru — dan ingat bahwa kiriman yang sedang dalam antrean retry akan ditandatangani dengan secret baru itu.

#Yang sering keliru

  • Cursor tidak boleh dibuat sendiri. Ia adalah nilai buram; kirim kembali persis seperti yang kami berikan di next_cursor, tanpa dipotong atau di-decode.
  • 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.

#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