API referansı
Taban: https://cloud.restroid.com/api/public/partner/v1 — her istekte Api-Key. Liste uçları ?limit= kabul eder (1–200, varsayılan 50). Satış nasıl kapanır sorusunun adım adım anlatımı referans değil, satış sayfasındadır.
Yollar
| Yöntem | Yol | Kapsam | Ne işe yarar |
|---|---|---|---|
| GET | /me | — | Ortak adı, durum, kapsamlar, bağlı restoran id’leri. |
| GET | /restaurants | — | Bağlı restoranlar: id, name, code. |
| GET | /restaurants/{id} | — | Tek restoran: id, name, code. |
| GET | /restaurants/{id}/products | products | Menü + fiyat. id, plu, priceAmount… Alan sözlüğü ürün sayfasında. |
| GET | /restaurants/{id}/categories | products | Kategori: id, parentId, name, sortOrder. |
| GET | /restaurants/{id}/stock | stock | Depo bazlı stok bakiyesi. |
| GET | /restaurants/{id}/personnel | personnel | Personel listesi (PIN, IBAN, telefon, e-posta yok). |
| GET | /restaurants/{id}/cash | cash | Nakit hesapları ve bakiye. |
| GET | /restaurants/{id}/z-reports | cash | Alınmış Z özeti. Alanlar kasa sayfasında. |
| GET | /restaurants/{id}/cash-shifts | cash | Nakit vardiya geçmişi. |
| GET | /restaurants/{id}/accounting | accounting | Son muhasebe hareketleri. |
| POST | /hooks/product-upsert | products_inbound | Kendi menünüzü yaz / güncelle. Eşdeğer: /hooks/products |
| POST | /hooks/sale-created | sales_inbound | Kapanan fişi bildir. Eşdeğer: /hooks/sale.created |
| POST | /hooks/sale-cancelled | sales_inbound | Kabul edilmiş fişi iptal et. Eşdeğer: /hooks/sale.cancelled |
| POST | /hooks/z-report-created | cash | Gün sonu Z. Eşdeğer: /hooks/z-report, /hooks/z.created |
| POST | /hooks/cash-in | cash veya accounting | Para girişi. Eşdeğer: /hooks/cash.in |
| POST | /hooks/cash-out | cash veya accounting | Para çıkışı. Eşdeğer: /hooks/cash.out |
| POST | /hooks/cash-shift-closed | cash | Öğle nakit vardiya. Eşdeğer: /hooks/shift-closed |
| POST | /hooks/expense-created | accounting | Gider. Eşdeğer: /hooks/expense |
GET /me
{
"partner": {
"id": "…",
"name": "Örnek POS",
"slug": "ornek-pos",
"status": "active",
"scopes": ["sales_inbound", "stock", "accounting"],
"restaurantIds": ["3f2a1c0e-1111-4222-a333-444455556666"],
"webhookEnabled": true,
"webhookEvents": ["stock.changed", "accounting.posted"]
}
}GET /restaurants
{
"restaurants": [
{ "id": "3f2a1c0e-1111-4222-a333-444455556666", "name": "Başak Kafe", "code": "BSK" }
]
}Liste boşsa süper admin henüz işletme bağlamamıştır. Satışta kullanacağınız restaurantId buradaki id’dir.
Okuma örnekleri
Ürünler
Alanların tek tek anlamı: Ürün listesi ve ayarlar.
GET /restaurants/{restaurantId}/products?limit=50&offset=0
{
"restaurantId": "…",
"total": 86,
"limit": 50,
"offset": 0,
"products": [
{
"id": "…",
"branchId": "…",
"plu": "101",
"name": "Adana",
"categoryId": "cat-izgara",
"categoryName": "Izgara",
"status": "Aktif",
"isHidden": false,
"productType": "item",
"sortOrder": 1,
"price": "185,50",
"priceAmount": 185.5,
"barcode": "8690123456789",
"updatedAt": "2026-08-28T08:00:00.000Z"
}
]
}| Alan | Ne işe yarar |
|---|---|
| id | Restroid ürün UUID. Satışta items[].productId. Sizin iç kodunuz değil; eşleme anahtarı. |
| plu | Restroid ürün kodu. Satışta items[].plu. Stok satırının kodu. |
| name | Ürün adı. Satışta items[].name. |
| price | Gösterim metni ("185,50"). Hesap için değil. |
| priceAmount | Fiyatın sayısı (185.5). Kendi listenize bunu yazın. |
| barcode | Barkod / sku. Boş olabilir. Sizin kodunuzla eşlemek için. |
| categoryId / categoryName | Kategori. Ağaç için id; etiket için ad. GET /categories. |
| status | Aktif / Pasif / Gizli. Satılabilir: Aktif. |
| isHidden | true ise menüde gizli. Satış ekranından eleyin. |
| productType | item = tek ürün, menu = paket. |
| sortOrder | Panel sırası. |
| branchId | Şube UUID. Satış gövdesine konmaz. |
| updatedAt | Son değişim. Cache / product.updated sonrası. |
| total, limit, offset | Sayfalama. total > limit ise offset artırın. |
Kategoriler
GET /restaurants/{restaurantId}/categories
{
"restaurantId": "…",
"categories": [
{ "id": "cat-izgara", "parentId": null, "name": "Izgara", "sortOrder": 1 }
]
}id = ürünlerdeki categoryId. parentId null ise kök kategori.
Stok
{
"restaurantId": "…",
"stock": [
{ "warehouseId": "…", "itemCode": "101", "itemName": "Adana", "quantity": "42" }
]
}Personel
{
"restaurantId": "…",
"personnel": [
{
"id": "…",
"branchId": "…",
"fullName": "Ayşe Yılmaz",
"roleName": "Kasiyer",
"isActive": true,
"posTerminalAccess": true,
"hireDate": "2024-03-01"
}
]
}PIN, IBAN, telefon ve e-posta dönmez. Personel oluşturma / PIN yazma yok.
Muhasebe
{
"restaurantId": "…",
"transactions": [
{
"id": "…",
"branchId": "…",
"type": "POS_SALE",
"amount": "185.50",
"occurredAt": "2026-08-28T11:05:00.000Z",
"description": "FIS-20260828-00412"
}
]
}Kasa
Alanlar ve gün sonu Z: Z raporu ve kasa.
{
"restaurantId": "…",
"cashAccounts": [
{ "id": "…", "name": "Ana kasa", "type": "cash", "currencyCode": "TRY", "balance": "1200.00", "showOnPos": true }
]
}Z raporları
GET /restaurants/{restaurantId}/z-reports
{
"restaurantId": "…",
"reports": [
{
"id": "…",
"reportNumber": 4,
"occurredAt": "2026-08-28T20:05:00.000Z",
"cashierName": "Ayşe",
"totalSales": 1850.5,
"discountAmount": 20,
"canceledAmount": 0,
"complimentaryAmount": 0,
"wasteAmount": 0,
"branchCode": "BSK"
}
]
}POST /hooks/product-upsert
Kendi menünüz master ise. Alanlar: Ürün listesi ve ayarlar.
POST /hooks/product-upsert
{
"restaurantId": "…",
"items": [
{ "name": "Adana", "plu": "101", "sku": "ADANA-101", "categoryName": "Izgara", "price": 185.5 }
]
}POST /hooks/sale-created
Fiş kapandıktan sonra bir kez, sizin sunucunuzdan. Alanların tek tek açıklaması satış sayfasında.
POST /hooks/sale-created
Content-Type: application/json
Api-Key: rkp_...
{
"restaurantId": "restoran-uuid",
"externalId": "sizin-fis-no",
"occurredAt": "2026-08-28T12:30:00+03:00",
"currency": "TRY",
"total": 185.5,
"items": [
{ "productId": "…", "plu": "101", "name": "Adana", "qty": 1, "amount": 185.5 }
],
"payments": [
{ "method": "cash", "amount": 185.5 }
]
}202 — kabul
{
"accepted": true,
"event": "sale.created",
"restaurantId": "…",
"externalId": "sizin-fis-no",
"posted": { "stock": 1, "accounting": true, "inbox": true }
}202 — aynı externalId tekrar
{
"accepted": true,
"duplicate": true,
"event": "sale.created",
"restaurantId": "…",
"externalId": "sizin-fis-no"
}POST /hooks/sale-cancelled
POST /hooks/sale-cancelled
{ "restaurantId": "…", "externalId": "sizin-fis-no" }Önce sale-created kabul edilmiş olmalı. Yoksa 404.
POST /hooks/z-report-created
Kasiyer Z alınca bir kez. Çekmece, öğle vardiya ve gider ayrı uçlardır: Z raporu ve kasa.
POST /hooks/z-report-created
{
"restaurantId": "…",
"externalId": "Z-20260828-004",
"occurredAt": "2026-08-28T23:05:00+03:00",
"cashierName": "Ayşe",
"reportNumber": 4,
"totalSales": 1850.5,
"cashAmount": 800,
"payments": [{ "method": "cash", "amount": 800, "count": 10 }]
}202 — kabul
{
"accepted": true,
"event": "z.created",
"restaurantId": "…",
"externalId": "Z-20260828-004",
"sourceEventId": "partner-z:…:Z-20260828-004"
}POST /hooks/cash-in ve cash-out
POST /hooks/cash-in
{
"restaurantId": "…",
"externalId": "IN-20260828-01",
"amount": 200,
"description": "Bozuk para"
}Çıkış: POST /hooks/cash-out, aynı gövde. Kapsam cash veya accounting.
POST /hooks/cash-shift-closed
POST /hooks/cash-shift-closed
{
"restaurantId": "…",
"externalId": "V-20260828-2",
"countedAmount": 790,
"expectedAmount": 800
}Kapsam cash. Z değildir.
POST /hooks/expense-created
POST /hooks/expense-created
{
"restaurantId": "…",
"externalId": "G-20260828-04",
"amount": 45.5,
"description": "Su",
"categoryName": "Mutfak"
}Kapsam accounting. description zorunlu.
Hata kodları
| HTTP | Ne zaman |
|---|---|
| 400 | Gövde eksik veya geçersiz: restaurantId, items, externalId, total / totalSales. |
| 401 | Api-Key yok, geçersiz veya döndürülmüş (aynı metin). |
| 403 | Durum active değil, kapsam yok veya restoran bağlı değil. |
| 404 | Bilinmeyen yol veya iptal edilecek satış bulunamadı. |
| 409 | Aynı externalId şu anda işleniyor; kısa süre sonra tekrar. |
| 413 | Gövde 256 KB üstü. |
| 415 | Content-Type application/json değil. |
| 429 | Hız sınırı. Retry-After kadar bekleyin. |
