Saha POS Arayüzü (SPI) Spesifikasyonu
Genel SPI Sağlayıcısı aracılığıyla Saha ile entegre olan harici POS sağlayıcıları için REST API spesifikasyonu.
Bu belge, Genel SPI Sağlayıcısı aracılığıyla Saha sistemi ile entegre olan harici POS sağlayıcıları için REST API spesifikasyonunu açıklamaktadır.
Genel Bakış
SPI sağlayıcısı, POS sisteminizin API'si ile iletişim kuran bir istemci olarak çalışır. Ürünlerin, siparişlerin ve konumların senkronizasyonunu sağlamak için API'nizin aşağıda açıklanan uç noktaları uygulaması gerekmektedir.
Örnekler
.NET Örneği
Minimal API'ler ve Native AOT ile .NET 9
Go Örneği
net/http ile standart Go kütüphaneleri
Java Spring Boot
Spring Boot 3.4 ile Java 17
Node.js/TypeScript
TypeScript ile native http modülü
Python Örneği
Type hints ile standart kütüphane
Postman Koleksiyonu
API'yi test etmek için Postman koleksiyonunu indirin
Kimlik Doğrulama
Saha sistemi, entegrasyon kurulumu sırasında yapılandırılan özel başlıklar kullanarak API'nize yapılan istekleri doğrulayacaktır.
- Auth Header: Başlık adını (örn.
Authorization,X-API-Key) ve gizli değeri siz sağlarsınız. - Client ID Header (İsteğe bağlı): Tarafınızda ek kimlik doğrulama için isteğe bağlı olarak bir client ID başlığı talep edebilirsiniz.
Örnek İstek Başlıkları:
Authorization: Bearer <your-secret-token>
X-Client-ID: <your-client-id>
X-Project-ID: <project-id>
X-Timestamp: <unix-timestamp>
Content-Type: application/json
Accept: application/jsonVeri Tipleri
Çevrilebilir Alanlar: name, description, ingredients, unit ve label seçeneği gibi alanlar şu şekillerde sağlanabilir:
- Dil kodlarından stringlere bir Map (örn.
{"en": "Burger", "tr": "Burger"}). - Bir String (örn.
"Burger"), yapılandırılmışdefault_language'e atanacaktır.
Para Birimi: Ürün nesnesindeki currency alanı isteğe bağlıdır. Atlanırsa, entegrasyonun default_currency değeri kullanılacaktır.
Uç Noktalar
1. Ürünleri Senkronize Et
Ürün listesini alır. Cursor aracılığıyla artımlı senkronizasyonu destekler.
- Metod:
GET - Yol:
/products - Sorgu Parametreleri:
cursor(isteğe bağlı): Bir sonraki grubu veya son senkronizasyondan bu yana yapılan güncellemeleri almak için API'niz tarafından önceki yanıtta sağlanan opak bir string.
Yanıt:
{
"products": [
{
"id": "prod-101",
"name": "Simple Burger",
"description": "Classic burger",
"price": 120.0,
"category": {
"id": "cat-1",
"name": "Burgers"
}
},
{
"id": "prod-102",
"name": {
"en": "Cheeseburger",
"tr": "Peynirli Burger"
},
"description": {
"en": "Delicious burger with cheese",
"tr": "Peynirli lezzetli burger"
},
"price": 150.0,
"currency": "TRY",
"category": {
"id": "cat-1",
"name": { "en": "Burgers", "tr": "Burgerler" }
},
"options": [
{
"name": "opt-sauce",
"label": { "en": "Sauce", "tr": "Sos" },
"options": [
{
"value": "val-ketchup",
"label": { "en": "Ketchup", "tr": "Ketçap" },
"additional_price": 0
},
{
"value": "val-mayo",
"label": "Mayonnaise",
"additional_price": 5.0
}
]
}
]
}
],
"next_cursor": "token-for-next-page"
}2. Sipariş Oluştur
POS sisteminizde yeni bir sipariş oluşturur.
- Metod:
POST - Yol:
/orders
İstek:
{
"items": [
{
"product_id": "prod-102",
"quantity": 2,
"note": "No onions",
"options": [
{
"name": "opt-sauce",
"values": ["val-ketchup"]
}
]
}
],
"location": "loc-1",
"note": "Allergy: Peanuts",
"number_of_people": 4,
"existing_order_id": "order-999"
}Not: existing_order_id, açık bir hesaba ürün ekleniyorsa gönderilir.
Yanıt:
{
"id": "order-1001",
"status": "accepted",
"is_addition": false
}3. Sipariş Durumunu Al
Bir siparişin mevcut durumunu alır.
- Metod:
GET - Yol:
/orders/{id}
Yanıt:
{
"id": "order-1001",
"status": "ready"
}4. Siparişi İptal Et
Mevcut bir siparişi iptal eder.
- Metod:
POST - Yol:
/orders/{id}/cancel
İstek:
{
"reason": "Customer changed mind"
}Yanıt:
{
"status": "cancelled"
}5. Konumları Al
Mevcut konumları (masalar, odalar vb.) alır.
- Metod:
GET - Yol:
/locations
Yanıt:
[
{
"id": "loc-1",
"name": "Table 1"
},
{
"id": "loc-2",
"name": "Table 2"
}
]]
Veri Modelleri
Product Nesnesi
| Alan | Tip | Açıklama |
|---|---|---|
id | string | Zorunlu. Benzersiz harici ID. |
name | string/map | Zorunlu. Çevrilebilir ad. |
description | string/map | İsteğe bağlı. Çevrilebilir açıklama. |
ingredients | string/map | İsteğe bağlı. Çevrilebilir içerikler. |
unit | string/map | İsteğe bağlı. Çevrilebilir birim (örn. "adet", "kg"). |
image_url | string | İsteğe bağlı. Görsel URL'i (maks 800x800). |
price | number | Zorunlu. Ondalık formatta fiyat. |
currency | string | İsteğe bağlı. ISO 4217 para birimi kodu. Varsayılan yapılandırmadan alınır. |
category | object | Zorunlu. Ürün kategorisi. |
options | array | İsteğe bağlı. Ürün seçenekleri listesi. |
cross_sell_ids | array | İsteğe bağlı. Önerilecek ürün ID'leri listesi. |
Category Nesnesi
| Alan | Tip | Açıklama |
|---|---|---|
id | string | Zorunlu. Benzersiz dahili ID. |
name | string/map | Zorunlu. Çevrilebilir ad. |
image_url | string | İsteğe bağlı. Görsel URL'i. |
Product Option Nesnesi
| Alan | Tip | Açıklama |
|---|---|---|
name | string | Zorunlu. Seçeneğin benzersiz harici ID'si. |
label | string/map | Zorunlu. Çevrilebilir etiket. |
description | string/map | İsteğe bağlı. Çevrilebilir açıklama. |
default | string | İsteğe bağlı. Varsayılan seçenek değeri ID'si. |
options | array | Zorunlu. Seçenek değerleri listesi. |
multiple | boolean | İsteğe bağlı. Çoklu seçime izin ver. |
required | boolean | İsteğe bağlı. Seçim zorunlu mu. |
Product Option Value Nesnesi
| Alan | Tip | Açıklama |
|---|---|---|
value | string | Zorunlu. Değerin benzersiz harici ID'si. |
label | string/map | Zorunlu. Çevrilebilir etiket. |
ingredients | string/map | İsteğe bağlı. Çevrilebilir içerikler. |
additional_price | number | İsteğe bağlı. Seçildiğinde fiyat ayarlaması. |
Create Order İsteği
| Alan | Tip | Açıklama |
|---|---|---|
items | array | Zorunlu. Sipariş edilecek ürünler listesi. |
location | string | İsteğe bağlı. Konum ID'si (örn. masa). |
note | string | İsteğe bağlı. Sipariş notu. |
number_of_people | integer | İsteğe bağlı. Misafir sayısı. |
existing_order_id | string | İsteğe bağlı. Eklenecek mevcut sipariş ID'si. |
Order Item Nesnesi
| Alan | Tip | Açıklama |
|---|---|---|
product_id | string | Zorunlu. Ürün ID'si. |
quantity | integer | Zorunlu. Miktar. |
note | string | İsteğe bağlı. Ürün notu. |
options | array | İsteğe bağlı. Seçilen seçenekler. |
Order Item Option Nesnesi
| Alan | Tip | Açıklama |
|---|---|---|
name | string | Zorunlu. Seçenek ID'si. |
values | array | Zorunlu. Seçilen değer ID'leri listesi. |
Create Order Yanıtı
| Alan | Tip | Açıklama |
|---|---|---|
id | string | Zorunlu. Sipariş ID'si. |
status | string | Zorunlu. Başlangıç durumu. |
is_addition | boolean | Zorunlu. Ürünler mevcut siparişe eklendiyse true. |
Sipariş Durumları
API'niz aşağıdaki durum stringlerinden birini döndürmelidir (büyük/küçük harf duyarsız):
| Durum | Açıklama |
|---|---|
accepted | Sipariş POS tarafından alındı ve kabul edildi. |
ready | Sipariş hazırlandı ve servis/teslim için hazır. Robot gönderimini tetikler. |
completed | Sipariş kapatıldı/ödendi. Son durum. |
cancelled | Sipariş iptal edildi veya başarısız oldu. Son durum. |
pending | Sipariş alındı ancak henüz kabul edilmedi. |
in_progress | Sipariş hazırlanıyor. |
failed | Sipariş oluşturma başarısız oldu. |
Yapılandırma
Entegrasyon için şunları sağlamanız gerekmektedir:
- Base URL: API'nizin kök URL'i (örn.
https://api.pos-provider.com/saha/v1). - Auth Header Name: Kimlik doğrulama için başlık anahtarı.
- Auth Header Secret: Başlık değeri (
Bearergibi herhangi bir ön ek dahil). - Default Language (İsteğe bağlı): Çevrilebilir alanlar string olarak sağlandığında kullanılacak dil kodu (varsayılan:
en). - Default Currency (İsteğe bağlı): Ürün para birimi atlandığında kullanılacak para birimi kodu (varsayılan:
TRY).