---
title: GET /notes/{id}/action-items
source: https://se-hari.com/docs/api/api-notes-list-action-items
updated: 2026-08-15T18:52:40.995466+00:00
---

> Daftar action item sebuah notulen. GET /notes/{id}/action-items — butuh scope notulen:read.

Mengambil seluruh action item yang diekstrak AI dari sebuah rapat, terurut menurut penanda waktu kemunculannya. Setiap item memuat judul tugas, nama penanggung jawab kalau disebut, tenggat kalau disebut, penanda waktu di rekaman, dan skor keyakinan ekstraksi. Skor keyakinan rendah biasanya berarti kalimatnya ambigu di rekaman — berguna untuk memutuskan mana yang perlu dikonfirmasi manusia sebelum dikirim ke sistem tugas.
## Endpoint
```bash
GET https://se-hari.com/api/v1/notes/{id}/action-items
```
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

| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
| `id` | `string` | ya | min 1 karakter |

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

| Field | Tipe | Keterangan |
|---|---|---|
| `id` | `string` | — |
| `title` | `string` | — |
| `assignee_name` | `string` \| `null` | — |
| `assignee_email` | `string` \| `null` | — |
| `due_date_mentioned` | `string` \| `null` | — |
| `timestamp_seconds` | `number` \| `null` | — |
| `confidence` | `number` \| `null` | — |
| `is_completed` | `boolean` | — |

## 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": {}
  }
}
```
| Status | Kode | Artinya di endpoint ini |
|---|---|---|
| 401 | [`invalid_api_key`](/docs/error/invalid-api-key) | Key salah, sudah dicabut, atau kedaluwarsa. |
| 403 | [`insufficient_scope`](/docs/error/insufficient-scope) | Key valid, tapi tidak punya scope yang dibutuhkan endpoint ini. |
| 404 | [`not_found`](/docs/error/not-found) | Data tidak ada, atau ada tapi milik akun lain — keduanya dijawab sama. |
| 429 | [`rate_limited`](/docs/error/rate-limited) | Terlalu banyak request. Hormati header `Retry-After`. |
| 500 | [`internal_error`](/docs/error/internal-error) | Kesalahan 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

Action item ikut dalam `GET /notes/{id}?include=action_items`, jadi endpoint terpisah ini hanya masuk akal kalau Anda memang hanya membutuhkan daftarnya — misalnya saat menyinkronkan ulang status penyelesaian tanpa perlu mengambil ringkasan rapatnya lagi.

Kalau Anda memanggil keduanya untuk notulen yang sama, gabungkan menjadi satu permintaan dengan `include`. Dua request yang bisa jadi satu adalah dua kali beban rate limit untuk data yang sama.

## 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
- [Autentikasi dan API key](/docs/autentikasi) — cara membuat key dan memilih scope
- [Kode error](/docs/error) — arti setiap kode dan cara memperbaikinya
- [Idempotency](/docs/idempotency) — kenapa retry aman kalau dilakukan dengan benar
- [Spesifikasi OpenAPI](https://se-hari.com/api/v1/openapi.json) — kontrak mesin, cocok untuk men-generate klien