---
title: "API Pelanggan (Members)"
summary: "Endpoint /members: profil pelanggan, level member, saldo dan mutasi poin, serta riwayat belanja per pelanggan."
slug: developer-api-pelanggan
product: LENSIRO
source: https://lensiro.com/dokumentasi/developer-api-pelanggan
updated: 2026-08-23
---

# API Pelanggan (Members)

> Endpoint /members: profil pelanggan, level member, saldo dan mutasi poin, serta riwayat belanja per pelanggan.

> **Data pelanggan berisi informasi pribadi** — nama, alamat, nomor telepon, nomor identitas, tanggal lahir. Perlakukan sesuai kebijakan privasi toko Anda: simpan hanya yang perlu, batasi siapa yang bisa membacanya, dan jangan teruskan ke pihak ketiga tanpa dasar yang jelas.

## `GET /members`

```bash
curl -H "Authorization: Bearer $KEY" \
  "$BASE/members?updated_since=2026-08-01T00:00:00Z&include_deleted=true"
```

```json
{
  "id": 511,
  "branch": { "id": 2, "code": "PST", "name": "Cabang Pusat" },
  "name": "Budi Santoso",
  "identity_number": "3173xxxxxxxxxxxx",
  "telephone_number": "0812xxxxxxx",
  "address": "Jl. Merdeka 1",
  "birthday": "17-08-1990",
  "gender": "MALE",
  "email": "budi@example.com",
  "member_level": { "id": 1, "name": "Gold" },
  "point_balance": 1200,
  "memo": null,
  "created_at": "2025-01-10T03:00:00.000Z",
  "updated_at": "2026-08-13T05:30:12.000Z",
  "deleted_at": null
}
```

| Field | Tipe | Catatan |
|---|---|---|
| `id` | int | Kunci upsert |
| `branch` | objek / null | Cabang tempat pelanggan didaftarkan |
| `name` | string | Nama pelanggan |
| `identity_number` | string / null | Nomor KTP atau identitas lain, apa adanya |
| `telephone_number` | string / null | Nomor telepon, apa adanya — belum dinormalkan |
| `address` | string / null | Alamat |
| `birthday` | string / null | **String `DD-MM-YYYY`**, bukan tanggal ISO |
| `gender` | enum / null | `MALE`, `FEMALE`, atau `null` |
| `email` | string / null | Surel |
| `member_level` | objek / null | Level keanggotaan, misalnya Gold |
| `point_balance` | int | Saldo poin saat request dijalankan |
| `memo` | string / null | Catatan bebas |

Dua field yang sering bikin bingung:

- **`birthday` adalah teks, bukan tanggal.** Di database memang tersimpan sebagai string `DD-MM-YYYY`, dan API meneruskannya apa adanya alih-alih berpura-pura itu tanggal. Kalau Anda butuh pengingat ulang tahun, urai sendiri formatnya dan siapkan penanganan untuk nilai yang tidak lengkap.
- **`telephone_number` belum dinormalkan.** Bisa berbentuk `0812...`, `+62812...`, atau mengandung spasi dan tanda hubung, tergantung cara staf mengetiknya. Normalkan di sisi Anda sebelum dipakai untuk WhatsApp blast.

### Peringatan penting soal saldo poin

`point_balance` dihitung ulang setiap request dari penjumlahan mutasi poin — tidak ada kolom saldo di database.

Konsekuensinya: **perubahan poin tidak mengubah `updated_at` pelanggan.** Polling `updated_since` tidak akan mengirim ulang pelanggan yang hanya berubah poinnya. Kalau Anda melacak poin, pilih salah satu:

- poll `/members/{id}/point-logs` untuk pelanggan yang Anda pantau, atau
- lakukan *full refresh* `/members` secara berkala, misalnya mingguan, atau
- jangan simpan saldo poin sama sekali — ambil langsung saat dibutuhkan.

## `GET /members/{id}`

Satu pelanggan, bentuk sama persis. `404 not_found` kalau tidak ada atau sudah dihapus.

## `GET /members/{id}/sales`

Riwayat belanja pelanggan tersebut. Bentuk objek, parameter, dan paginasinya **sama persis** dengan `/sales` — ini memang `/sales` yang sudah disaring ke satu pelanggan.

Berguna untuk halaman profil pelanggan di CRM Anda. Untuk analitik massal, lebih hemat menarik `/sales` sekali lalu mengelompokkan sendiri berdasarkan `customer.id`.

## `GET /members/{id}/point-logs`

Riwayat mutasi poin. Saldo pelanggan sama dengan jumlah seluruh baris ini.

```json
{
  "id": 8801,
  "amount": 150,
  "is_manual": false,
  "memo": null,
  "sale_payment_id": 44211,
  "branch": { "id": 2, "code": "PST", "name": "Cabang Pusat" },
  "created_at": "2026-08-13T05:30:12.000Z",
  "updated_at": "2026-08-13T05:30:12.000Z",
  "deleted_at": null
}
```

| Field | Arti |
|---|---|
| `amount` | Positif berarti poin bertambah, negatif berarti poin dipakai atau dikurangi |
| `is_manual` | `true` bila disesuaikan manual oleh staf, `false` bila otomatis dari transaksi |
| `sale_payment_id` | Pembayaran yang memicu mutasi; `null` untuk penyesuaian manual |
| `memo` | Alasan penyesuaian manual |

## Yang tidak tersedia di v1

Riwayat pemeriksaan mata, resep kacamata, dan rekam medis pelanggan **tidak** diekspos — itu data kesehatan, kelas paling sensitif dalam sistem, dan menunggu dukungan *scoped key*. Begitu juga riwayat pesan WhatsApp atau email dan umpan balik pelanggan. Detailnya di **Batasan, Versi & Rencana**.


---

Dokumentasi Lensiro · https://lensiro.com/dokumentasi/developer-api-pelanggan · diperbarui 23 Agustus 2026
