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:
| Ortam | Base URL |
|---|---|
| Production | https://{musteri-id}.prod.loyetta.com/api |
| Staging | https://{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ık | Değer | Açıklama |
|---|---|---|
Authorization | Bearer {token} | Müşteri Token'ınız (veya kimlik doğrulama endpoint'i için Süper Kullanıcı Token'ı) |
Content-Type | application/json | Gövde içeren istekler için gerekli |
Accept | application/json | JSON yanıt formatını garanti eder |
Örnek İstek
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:
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.
{
"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şen | Açıklama |
|---|---|
YYYY-MM-DD | Yıl, Ay ve Gün |
T | Tarih ve saat arasındaki ayırıcı |
HH:mm:ss | Saat, Dakika ve Saniye |
.uuuuuu | Mikrosaniye (6 hane) |
Z | Sı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ğlam | Yerel Saat (İstanbul) | API Değeri (UTC) |
|---|---|---|
| Temsil | 2025-09-01 17:38:00 | 2025-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.
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
| Parametre | Tür | Varsayılan | Açıklama |
|---|---|---|---|
page[number] | integer | 1 | Getirilecek sayfa numarası |
page[size] | integer | 15 | Sayfa başına öğe sayısı |
Örnek İstek
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:
{
"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ı
| Alan | Açıklama |
|---|---|
data | Mevcut sayfa için öğe dizisi |
links.first | İlk sayfanın URL'i |
links.last | Son sayfanın URL'i |
links.prev | Önceki sayfanın URL'i (ilk sayfadaysa null) |
links.next | Sonraki sayfanın URL'i (son sayfadaysa null) |
meta.current_page | Mevcut sayfa numarası |
meta.from | Bu sayfadaki başlangıç öğe indeksi |
meta.to | Bu sayfadaki bitiş öğe indeksi |
meta.last_page | Toplam sayfa sayısı |
meta.per_page | Sayfa başına öğe sayısı |
meta.total | Tü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ı
| Kod | Anlam | Açıklama |
|---|---|---|
200 | OK | İstek başarılı |
201 | Created | Kaynak başarıyla oluşturuldu |
401 | Unauthorized | Kimlik doğrulama token'ı eksik veya geçersiz |
404 | Not Found | İstenen kaynak mevcut değil |
422 | Unprocessable Entity | Geçersiz girdi nedeniyle istek doğrulaması başarısız oldu |
500 | Internal Server Error | Sunucu 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.
{
"message": "Unauthenticated."
}404 Not Found
İstenen kaynak (kullanıcı, ürün, sipariş vb.) mevcut olmadığında döndürülür.
{
"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.
{
"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.
{
"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.