Loyetta

API Genel Bakış

Loyetta API, JSON formatında istek gövdesi kabul eden ve JSON formatında yanıt döndüren RESTful bir API'dir.


Base URL

Tüm API istekleri, size özel tenant domain'ine yapılmalıdır:

OrtamBase URL
Productionhttps://{musteri-id}.prod.loyetta.com/api
Staginghttps://{musteri-id}.stag.loyetta.com/api

Örneğin, subdomain'iniz marka ise, production base URL'iniz şöyle olur:

https://marka.prod.loyetta.com/api

İstek Formatı

Başlıklar (Headers)

Tüm istekler aşağıdaki başlıkları içermelidir:

BaşlıkDeğerAçıklama
AuthorizationBearer {token}Müşteri Token'ınız (veya kimlik doğrulama endpoint'i için Süper Kullanıcı Token'ı)
Content-Typeapplication/jsonGövde içeren istekler için gerekli
Acceptapplication/jsonJSON yanıt formatını garanti eder

Örnek İstek

bash
curl -X GET https://acme.prod.loyetta.com/api/v1/user/profile \
  -H "Authorization: Bearer {musteri-tokeni}" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json"

İstek Gövdesi

POST, PUT ve PATCH istekleri için verileri JSON nesnesi olarak gönderin:

bash
curl -X POST https://acme.prod.loyetta.com/api/v1/example \
  -H "Authorization: Bearer {musteri-tokeni}" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "field": "value",
    "another_field": 123
  }'

Yanıt Formatı

Tüm başarılı yanıtlar bir JSON nesnesi döndürür. Yapı endpoint'e göre değişir, ancak genellikle istenen veriyi doğrudan veya data anahtarı içinde sarar.

json
{
  "success": true,
  "data": {
    "id": 1,
    "name": "Örnek"
  }
}

Tarih ve Saat Formatı

API içindeki tüm tarih ve saat alanları kesinlikle Coordinated Universal Time (UTC) cinsinden temsil edilir ve ISO 8601 standardına göre formatlanır.

API, yerel saat dilimi farklarını (örneğin +03:00) saklamaz veya döndürmez. İstemci uygulamalar (client), istek gönderirken yerel saati UTC'ye çevirmekten ve yanıtları görüntülerken UTC'yi tekrar yerel saate dönüştürmekten sorumludur.

Kullanılan format YYYY-MM-DDTHH:mm:ss.uuuuuuZ şeklindedir:

BileşenAçıklama
YYYY-MM-DDYıl, Ay ve Gün
TTarih ve saat arasındaki ayırıcı
HH:mm:ssSaat, Dakika ve Saniye
.uuuuuuMikrosaniye (6 hane)
ZSıfır ofset göstergesi (UTC)

Saat Dilimi Dönüşüm Örneği

Eğer bir olay İstanbul (GMT+3) saatine göre 17:38:00'da gerçekleşiyorsa, API ile etkileşime geçmeden önce bu saatin 14:38:00 UTC'ye (3 saat çıkarılarak) dönüştürülmesi gerekir.

BağlamYerel Saat (İstanbul)API Değeri (UTC)
Temsil2025-09-01 17:38:002025-09-01T14:38:00.000000Z

Veri Gönderme (Request)

API'ye veri gönderirken yerel saatinizi mutlaka UTC'ye çevirmelisiniz. Örnek: İstanbul saatiyle 17:38 için bir randevu oluşturma.

bash
curl -X POST [https://acme.prod.loyetta.com/api/v1/appointments](https://acme.prod.loyetta.com/api/v1/appointments) \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "customer_id": 123,
    "appointment_time": "2025-09-01T14:38:00.000000Z"
  }'

---

Sayfalama (Pagination)

Liste döndüren endpoint'ler sayfalamayı destekler. Sayfa numarasını ve sayfa boyutunu kontrol etmek için query parametrelerini kullanın.

Query Parametreleri

ParametreTürVarsayılanAçıklama
page[number]integer1Getirilecek sayfa numarası
page[size]integer15Sayfa başına öğe sayısı

Örnek İstek

bash
curl -X GET "https://marka.prod.loyetta.com/api/v1/products?page[number]=2&page[size]=10" \
  -H "Authorization: Bearer {musteri-tokeni}" \
  -H "Accept: application/json"

Sayfalanmış Yanıt

Sayfalanmış endpoint'ler data, links ve meta nesneleri içeren bir yanıt döndürür:

json
{
  "data": [
    { "id": 1, "name": "Öğe 1" },
    { "id": 2, "name": "Öğe 2" }
  ],
  "links": {
    "first": "https://marka.prod.loyetta.com/api/v1/products?page[number]=1",
    "last": "https://marka.prod.loyetta.com/api/v1/products?page[number]=5",
    "prev": "https://marka.prod.loyetta.com/api/v1/products?page[number]=1",
    "next": "https://marka.prod.loyetta.com/api/v1/products?page[number]=3"
  },
  "meta": {
    "current_page": 2,
    "from": 11,
    "last_page": 5,
    "path": "https://marka.prod.loyetta.com/api/v1/products",
    "per_page": 10,
    "to": 20,
    "total": 50
  }
}

Yanıt Alanları

AlanAçıklama
dataMevcut sayfa için öğe dizisi
links.firstİlk sayfanın URL'i
links.lastSon sayfanın URL'i
links.prevÖnceki sayfanın URL'i (ilk sayfadaysa null)
links.nextSonraki sayfanın URL'i (son sayfadaysa null)
meta.current_pageMevcut sayfa numarası
meta.fromBu sayfadaki başlangıç öğe indeksi
meta.toBu sayfadaki bitiş öğe indeksi
meta.last_pageToplam sayfa sayısı
meta.per_pageSayfa başına öğe sayısı
meta.totalTüm sayfalardaki toplam öğe sayısı

Hata Yönetimi

Bir hata oluştuğunda, API uygun bir HTTP durum kodu ve message alanı içeren bir JSON yanıtı döndürür.

HTTP Durum Kodları

KodAnlamAçıklama
200OKİstek başarılı
201CreatedKaynak başarıyla oluşturuldu
401UnauthorizedKimlik doğrulama token'ı eksik veya geçersiz
404Not Foundİstenen kaynak mevcut değil
422Unprocessable EntityGeçersiz girdi nedeniyle istek doğrulaması başarısız oldu
500Internal Server ErrorSunucu tarafında bir hata oluştu

401 Unauthorized

Authorization başlığı eksik olduğunda veya sağlanan token geçersiz olduğunda döndürülür.

json
{
  "message": "Unauthenticated."
}

404 Not Found

İstenen kaynak (kullanıcı, ürün, sipariş vb.) mevcut olmadığında döndürülür.

json
{
  "message": "Not found."
}

422 Validation Error

İstek gövdesi doğrulamayı geçemediğinde döndürülür. Yanıt, hangi alanların neden başarısız olduğuna dair detaylı bilgi içerir.

json
{
  "message": "The given data was invalid.",
  "errors": {
    "email": [
      "The email field is required."
    ],
    "points": [
      "The points field must be an integer.",
      "The points field must be at least 0."
    ]
  }
}

errors nesnesi, alan adlarını anahtar olarak içerir ve her değer, o alan için doğrulama hata mesajlarının bir dizisidir.

500 Internal Server Error

Sunucuda beklenmeyen bir hata oluştuğunda döndürülür. Bunu sürekli alıyorsanız, lütfen destek ile iletişime geçin.

json
{
  "message": "Server Error."
}

500 hatası alırsanız, sorun bizim tarafımızdadır. Lütfen kısa bir süre sonra isteği tekrar deneyin. Sorun devam ederse, istek detaylarıyla birlikte destek ile iletişime geçin.