Müşteri Detayı — GET /plugin-api/customers/get ✓ CanlıPII

Tek bir müşteriyi ID ile getirir (CRM/sadakat). Şekil customers/list öğesiyle birebir aynıdır. PII alanları (name/phone/address) yalnız customers:read + tenant consent birlikte varken döner; total (finansal) de consent yoksa düşer — aksi halde yalnız {id} (region varsa, non-PII). Tutarlar ondalık TL.

← API Uçları · Liste: customers/list · ortak kurallar (base, auth, hata zarfı) API Uçları'nda.

İstek

GET {RESTOMENUM_BASE}/plugin-api/customers/get?customerId=abc123
Authorization: Bearer {serverId}.{pluginId}.{secret}     // install API key (token exchange)
  • Base ({RESTOMENUM_BASE}): Sandbox https://sandbox.plugins.restomenum.app, Production https://plugins.restomenum.app.
  • Query: customerId (zorunlu) — müşteri doc id'si. Maks. 200 karakter, '/' içeremez (aksi halde 400 plugin.customers.missingParams). Ayrı bir /detail yolu yoktur (get = detay; products/get, categories/get ile aynı konvansiyon).
  • Auth: Authorization: Bearer <apiKey>token exchange'teki install API key (serverId.pluginId.secret).
  • Scope: customers:read (PII) zorunlu (yoksa 403 plugin.scope.denied; scope var ama consent yoksa yalnız { id }, region varsa eklenir).

Yanıt

PII consent VAR — tüm alanlar dolu:

{ "success": true, "data": {
  "id": "iBe5oEvD4wcXF3sQc042",
  "name": "Joe",
  "phone": "90431212312",
  "address": "Hürriyet Mah, Koçak Sokak 12-14 Aslan Apt Daire 1",
  "total": 22.61
} }

Consent YOK — yalnız id (PII + total gizli; region varsa eklenir):

// PII consent YOKSA → PII (name/phone/address) + total düşer; yalnız id (+ region varsa, non-PII)
{ "success": true, "data": { "id": "abc123" } }

Alanlar (allowlist)

İç/finansal alanlar (bakiye, log, açık hesap…) sızmaz — yalnız aşağıdakiler döner:

AlanTipAçıklamaPII
idstringMüşteri ID'si — her zaman gelir, asla null
regionstring|nullKaba bölge/şube etiketi — PII değil, consent'siz akar. Opsiyonel: müşteride tanımlıysa gelir, aksi halde alan hiç gelmez (canlı örnekte yoktu)
namestring|nullMüşteri adı (nullable)evet
phonestring|nullTelefon (nullable)evet
addressstring|nullAdres (nullable). Kaynakta adress (typo) ya da address olabilir; çıktıda her zaman address olarak gelirevet
totalnumberÖmür boyu toplam harcama — ONDALIK TL (kuruş değil; ör. 22.61). Finansal, PII değil; varsayılan 0, asla null. Yine de consent yoksa düşer
Asla dönmeyen iç alanlar: kalan, paid, log, closed, beforeClosed, group*, category, new — allowlist gereği bu iç/finansal alanlar consent'le bile dönmez. Yeni eklenen herhangi bir alan da varsayılan olarak düşer (fail-safe).

PII consent kuralı (ZORUNLU davranış)

PII alanları (name, phone, address) yalnız customers:read scope'u VE kullanıcı consent'i (dataConsent.piiShared === true, katı boolean; 1/"true"/"yes" reddedilir) birlikte varsa döner.total (finansal, PII değil) yine de consent yoksa düşer — consent'siz öğe yalnızca { id } içerir (region varsa eklenir; alanları undefined varsay, name ?? "—"). Bu, webhook customer redaction'ı ile birebir aynı kuraldır.

Hatalar

DurumHTTPmessage
customerId eksik / NULL / boş string / 200+ karakter / '/' içeriyor400plugin.customers.missingParams
Müşteri bulunamadı404plugin.customers.notFound
Scope yok403plugin.scope.denied
Geçersiz/eksik key401unauthorized
Rate limit aşıldı (+ Retry-After header)429plugin.rateLimited
Sunucu hatası500internal
Her yanıt X-RateLimit-Limit / X-RateLimit-Remaining / X-RateLimit-Reset header'larını taşır; 429'da ayrıca Retry-After gelir. Ayrıntı: Rate Limit'ler.