Cüzdan
Son Kullanıcılar
Listeleme

Son Kullanıcıları Listeleme

Bu uçları kim çağırır?Dış API (s2s)
Taban yol
/api/v1/wallet
Kimlik
Ed25519 istek imzası — X-Key-Id, X-Date, X-Nonce, Digest (body varsa), X-Signature. Zaman penceresi ±5 dk, nonce tek kullanımlık, anahtarda IP allow-list olabilir.
Yetki
Anahtarınız cüzdan ürününü ve çağrının gerektirdiği cüzdan iznini taşımalıdır; izni olmayan çağrı 403 WALLET_INSUFFICIENT_SCOPE alır. Uç başına izinler: Anahtar izinleri.
Çapraz yüzey
Aynı liste merchant panelde de vardır. Bu uç için anahtarınızda bir cüzdan okuma izni (wallet:enduser:read) gerekir.
GET /api/v1/wallet/end-users

Size ait son kullanıcıları en yeniden eskiye (oluşturulma anına göre) listeler. Telefon ve ad yalnız maskeli döner.

Sorgu parametreleri

Tümü isteğe bağlıdır. Birden fazla süzgeç verirseniz hepsi birlikte uygulanır.

ParametreTipKural ve anlamı
programIdUUIDYalnız bu programın kullanıcıları.
accountTypestringPERSONAL ya da BUSINESS.
statusstringACTIVE, FROZEN ya da CLOSED.
corporateAccountIdUUIDYalnız bu işverene (kurumsal hesaba) bağlı çalışanlar. Kurumsal hesap size ait değilse 404 WALLET_NOT_FOUND döner; filtresiz listeye düşülmez.
merchantCategoryStatestringUNSET = kategorisi atanmamış kayıtlar, SET = kategorisi atanmış kayıtlar. Kişisel (PERSONAL) kayıtların kategorisi her zaman boştur; kategorisiz işletmeleri bulmak için accountType=BUSINESS ile birlikte kullanın.
limittam sayıSayfa boyutu, 1–100. Gönderilmezse 20.
cursorstringÖnceki yanıttaki nextCursor değeri. İlk sayfada gönderilmez. Değer opaktır; üretmeyin, değiştirmeyin.

Tanımlı değerler dışındaki bir değer ya da listede olmayan bir parametre 400 VALIDATION_ERROR ile reddedilir.

Örnek

curl "https://api-gateway.lunixi.com/api/v1/wallet/end-users?programId=5b9e2f3a-7c41-4d8e-a6f2-9e1b3c4d5f60&status=ACTIVE&limit=2" \
  -H "X-Key-Id: …" -H "X-Date: …" -H "X-Nonce: …" -H "X-Signature: …"
{
  "status": "success",
  "code": "SUCCESS",
  "message": "…",
  "data": {
    "items": [
      {
        "id": "8d4c2a1f-3b6e-4f7a-9c5d-2e8b1a0f6c34",
        "programId": "5b9e2f3a-7c41-4d8e-a6f2-9e1b3c4d5f60",
        "accountType": "PERSONAL",
        "externalCustomerId": "crm-88213",
        "corporateAccountId": null,
        "corporateOffboardedAt": null,
        "kycRef": null,
        "kycLevelCache": "LOW",
        "kycLevelRefreshedAt": "2026-10-11T10:02:44.105Z",
        "phoneMasked": "9053******67",
        "displayNameMasked": "A*** Y*****",
        "merchantCategory": null,
        "status": "ACTIVE",
        "createdAt": "2026-10-11T09:15:02.418Z",
        "updatedAt": "2026-10-11T10:02:44.105Z"
      },
      {
        "id": "3f9a6c2e-1d7b-4e5a-8c4f-6b2d9e0a1c75",
        "programId": "5b9e2f3a-7c41-4d8e-a6f2-9e1b3c4d5f60",
        "accountType": "BUSINESS",
        "externalCustomerId": "crm-77104",
        "corporateAccountId": null,
        "corporateOffboardedAt": null,
        "kycRef": null,
        "kycLevelCache": null,
        "kycLevelRefreshedAt": null,
        "phoneMasked": "9053******09",
        "displayNameMasked": "K**** K*****",
        "merchantCategory": null,
        "status": "ACTIVE",
        "createdAt": "2026-10-10T16:41:19.007Z",
        "updatedAt": "2026-10-10T16:41:19.007Z"
      }
    ],
    "nextCursor": "MjAyNi0xMC0xMCAxNjo0MToxOS4wMDcwMDArMDB8M2Y5YTZjMmU…",
    "pageInfo": { "hasMore": true, "nextCursor": "MjAyNi0xMC0xMCAxNjo0MToxOS4wMDcwMDArMDB8M2Y5YTZjMmU…", "totalCount": null }
  },
  "pageInfo": { "hasMore": true, "nextCursor": "MjAyNi0xMC0xMCAxNjo0MToxOS4wMDcwMDArMDB8M2Y5YTZjMmU…", "totalCount": null },
  "requestId": "…"
}

Her kaydın alanları Detay ve Arama sayfasındaki endUser ile aynıdır.

Sayfalama

  • Kayıtlar data.items içindedir.
  • Sonraki sayfa varsa data.nextCursor doludur ve pageInfo.hasMore true'dur; bu değeri bir sonraki istekte cursor olarak gönderin. Aynı süzgeçleri koruyun.
  • Son sayfada nextCursor null, pageInfo.hasMore false'tur.
  • Bu uç toplam kayıt sayısı döndürmez (totalCount: null).
let cursor;
do {
  const qs = new URLSearchParams({ programId, limit: '100', ...(cursor && { cursor }) });
  const res = await signedGet(`/api/v1/wallet/end-users?${qs}`); // imzalı istek
  const { data } = await res.json();
  for (const endUser of data.items) handle(endUser);
  cursor = data.nextCursor;
} while (cursor);

Listede telefonla arama yoktur. Belirli bir kullanıcıya kendi kimliğinizle ulaşmak için by-external ucunu, bir telefonun programda kayıtlı olup olmadığını öğrenmek için cüzdan sorgulamayı kullanın.

Hatalar

HTTPKodNe zaman
400VALIDATION_ERRORParametre kurallara uymuyor (örneğin limit=500, status=OPEN)
403WALLET_INSUFFICIENT_SCOPEAnahtarda cüzdan okuma izni yok
404WALLET_NOT_FOUNDcorporateAccountId size ait bir kurumsal hesap değil