Geliştiriciler

Ristivo API

Kurye, sipariş platformu, muhasebe, tedarikçi ve rezervasyon yazılımları Ristivo kullanan işletmelere bu API ile bağlanır. İşletmeler de kendi yazılımları için anahtar alır.

Taban adreshttps://ristivo.com/api/v1
  • REST ve JSON
  • OAuth 2.0
  • İmzalı webhook
  • Test ortamı
  • v1 · erken erişim
İçindekiler

Genel bakış

Ristivo; kasa, QR menü, stok, rezervasyon ve misafir mesajlarını tek sistemde tutar. API bu verinin işletmenin izin verdiği kısmını dışarı açar ve dışarıdan gelen bilgiyi kasaya, menüye ya da stoğa yazar.

  1. İşletme bağlarİşletme sahibi Ristivo girişiyle onay verir, hangi bilgilere erişileceğini görür.
  2. Olay gelirSipariş hazır, gün sonu alındı, rezervasyon açıldı: webhook adresinize anında gönderilir.
  3. Geri yazarsınızKurye durumu, ödeme, alış faturası, rezervasyon. İşletme panelinde görünür.

API v1 iş ortaklarıyla birlikte açılıyor. İlk açılan bölüm teslimat (kurye); "Yakında" işaretli uçlar sırayla açılacak. İş ortağı uygulamasını ekibimiz açar, başvuru bölümüne bakın.

Kimler bağlanır

Her iş ortağı yalnız işine yarayan kapsamı ister. Kurye firması satış raporunu, muhasebe yazılımı misafir telefonunu göremez.

Kurye firmaları

Paket sipariş hazır olunca bildirim alır, kuryeyi atar, yolda ve teslim edildi bilgisini kasaya geri yazar.

delivery:readdelivery:write

Sipariş platformları

Menüyü ve fiyatları çeker, gelen siparişi doğrudan kasaya düşürür, biten ürünü platformda kapatır.

menu:readorders:write

Muhasebe ve mali müşavir

Günlük satışı, KDV kırılımını, ödeme tiplerini, gün sonunu ve kesilen e-belgeleri okur. Misafir bilgisi görmez.

sales:readinvoices:readpurchases:read

Tedarikçi ve toptancı

Siparişi alır ve onaylar, alış faturasını gönderir. Fatura işletme onaylayınca stoğa işlenir.

purchases:readpurchases:write

Rezervasyon ve otel yazılımı

Boş masayı sorgular, rezervasyon açar ve iptal eder. Otel programı misafirin restoran harcamasını görebilir.

reservations:readreservations:write

Ödeme ve yemek kartı

Masadaki hesabı okur, alınan ödemeyi adisyona işler. Yazarkasa fişi kasada kesilir.

orders:readpayments:write

Sadakat, SMS ve CRM

Kapanan adisyonu ve misafir kartını alır, puan yükler. Kişisel veri için işletmeden ayrıca onay istenir.

orders:readcustomers:read

İşletmenin kendi yazılımı

Kendi web siteniz, uygulamanız, zincir merkez raporunuz ya da n8n akışınız. Anahtarı işletme kendisi alır.

Paketinizdeki her kapsam

Kimlik doğrulama

Her istek Authorization: Bearer başlığıyla gelir. Anahtar tek bir işletmeye bağlıdır; işletme kimliğini ayrıca göndermezsiniz.

İşletme anahtarı

İşletmenin kendi web sitesi, uygulaması ya da otomasyonu için. İşletme sahibi panelde Entegrasyonlar › API bağlantıları'ndan oluşturur; paketindeki kapsamlarla sınırlıdır, 2 yıl geçerlidir, istediği an siler. Test ortamında rsk_test_ ile başlar.

rsk_live_4fJ2…

İş ortağı uygulaması

Kurye, muhasebe, platform gibi birden çok işletmeye hizmet veren firmalar için. Uygulamanızı başvurunuz üzerine ekibimiz açar; kendiniz kayıt olamazsınız. OAuth 2.0 yetki kodu akışı (PKCE), her işletme ayrı onay verir.

client_id · client_secret

OAuth akışı

  1. İşletmeyi https://ristivo.com/entegrasyon/baglan adresine yönlendirin: response_type=code, client_id, redirect_uri (uygulamanıza kayıtlı olan), scope (boşlukla ayrılmış), state, code_challenge, code_challenge_method=S256.
  2. İşletme sahibi Ristivo hesabıyla girer, hangi işletmesini bağlayacağını seçer ve kapsamları onaylar. Misafir bilgisi açan kapsamları ayrıca işaretler; işaretlemezse verilmez. Yalnız işletme sahibi onay verebilir.
  3. Dönen code'u 10 dakika içinde sunucunuzdan POST https://ristivo.com/api/v1/oauth/token ile erişim anahtarına çevirin. client_secret tarayıcıya ya da mobil uygulamaya konmaz. Erişim anahtarı 1 saat, yenileme anahtarı 90 gün geçerlidir; her yenilemede yeni yenileme anahtarı döner. Yanıttaki scope işletmenin gerçekten verdiği kapsamlardır.
cURL
curl -X POST https://ristivo.com/api/v1/oauth/token \
  -u "$CLIENT_ID:$CLIENT_SECRET" \
  -d grant_type=authorization_code \
  -d code=$CODE \
  -d redirect_uri=https://kurye.example.com/ristivo/donus \
  -d code_verifier=$VERIFIER

# Yanıt
# {"access_token":"rsk_at_…","token_type":"Bearer","expires_in":3600,
#  "refresh_token":"rsk_rt_…","scope":"business:read delivery:read delivery:write",
#  "business_id":"biz_3f9a1c07d2e4b658"}

# Yenileme
curl -X POST https://ristivo.com/api/v1/oauth/token \
  -u "$CLIENT_ID:$CLIENT_SECRET" \
  -d grant_type=refresh_token \
  -d refresh_token=$REFRESH_TOKEN

Kapsamlar

Onay ekranında işletme sahibi bu listeyi düz Türkçeyle görür. Kişisel veri içeren kapsamlar ayrı onay kutusuyla istenir.

KapsamNe verir
business:readİşletme adı, adres, çalışma saatleri, şubeler
menu:readKategoriler, ürünler, fiyatlar, seçenekler
menu:writeFiyat ve satışta olma durumu
orders:readAdisyon ve siparişler, kalemler
orders:writeDış kanaldan sipariş açma ve iptal
payments:writeAdisyona ödeme işleme
delivery:readTeslimata hazır paket siparişlerKişisel veri
delivery:writeKurye atama, durum ve konum
sales:readGünlük satış, ödeme tipleri, gün sonu
invoices:readE-fatura, e-arşiv ve e-adisyon kayıtları
purchases:readAlış faturaları, tedarikçi siparişleri
purchases:writeAlış faturası gönderme, sipariş onayı
stock:readStok kartları ve depo miktarları
reservations:readRezervasyonlar ve boş masa
reservations:writeRezervasyon açma, değiştirme, iptalKişisel veri
customers:readMisafir kartı; telefon ve e-posta maskeliKişisel veri
webhooks:manageWebhook adresi ekleme ve silme

Veri ve gizlilik

Misafir verisinin sahibi işletmedir; Ristivo onu işletmenin talimatıyla işler. API bu ilişkiyi bozmaz.

Müşteri listesi kapalı

İş ortağı Ristivo kullanan işletmeleri listeleyemez. Yalnız kendisini bağlayan işletmenin verisini görür.

İzin işletmede

İşletme bağlantıyı panelden (Entegrasyonlar › API bağlantıları) kaldırır; anahtar o anda geçersiz olur.

Kurye yalnız kendi paketini

Alıcının adı, telefonu ve adresi yalnız üstlenilen teslimatta açılır; teslimden 24 saat sonra maskelenir.

Muhasebede kişisel veri yok

Satış, gün sonu ve e-belge yanıtlarında misafir adı, telefonu ya da adresi dönmez.

Her istek kayıtlı

Hangi uygulamanın neyi okuyup yazdığı işletmenin bağlantı günlüğünde görünür.

Sözleşmeyle

İş ortağı KVKK kapsamında veri işleme sözleşmesi imzalar; veriyi yalnız sunduğu hizmet için kullanır.

Biçim

  • İstek ve yanıt gövdesi JSON, karakter seti UTF-8.
  • Para alanları ondalık metindir: "1250.00". Para birimi TRY, tutarlar KDV dahildir.
  • Tarihler ISO 8601, Türkiye saatiyle: 2026-10-26T12:32:00+03:00.
  • Kimlikler önekli metindir: ord_, prd_, dlv_, rsv_.
  • Kayıt açan her POST isteğinde Idempotency-Key gönderin. Aynı anahtarla gelen ikinci istek ilk yanıtı döner, ikinci kayıt açmaz. Anahtar 24 saat saklanır.
  • Yanıttaki Request-Id başlığını destek isterken iletin.

Sayfalama

Liste uçları en fazla limit kadar kayıt ve next_cursor döner. Sonraki sayfa için cursor parametresine bu değeri verin; null geldiyse liste bitmiştir. Eşitleme yaparken updated_since ile yalnız değişenleri çekin.

Yanıt
{
  "data": [
    "…"
  ],
  "next_cursor": "eyJpZCI6MTA0Mn0"
}

Hatalar

Hata yanıtı her zaman aynı biçimdedir. Programınız error.code'a bakmalı; message Türkçe ve insan içindir.

422 Yanıt
{
  "error": {
    "code": "validation_failed",
    "message": "Ürün bulunamadı.",
    "errors": {
      "items.0.product_id": [
        "prd_9999 bu işletmede yok."
      ]
    },
    "request_id": "req_6b1f0e2a"
  }
}
HTTPKodAnlamı
400invalid_requestİstek biçimi hatalı
401unauthenticatedAnahtar yok, geçersiz ya da işletme bağlantıyı kaldırmış
402module_requiredİşletmenin paketinde bu bölüm yok
403insufficient_scopeAnahtara bu kapsam verilmemiş
404not_foundKayıt yok ya da bu işletmeye ait değil
409conflictKayıt başka biri tarafından değiştirildi ya da üstlenildi
422validation_failedAlan hatası; errors içinde alan adıyla döner
429rate_limitedDakikalık sınır aşıldı; Retry-After kadar bekleyin
500server_errorBizdeki hata; request_id ile bildirin

Sınırlar

Her anahtar dakikada 120 istek yapabilir. Kalan hak X-RateLimit-Limit ve X-RateLimit-Remaining başlıklarında döner. Sınır aşılınca 429 ve Retry-After (saniye) gelir. Sık değişen veriyi sorgulamak yerine webhook kullanın.

İşletme

Her paket

Anahtarın bağlı olduğu işletme. Bir iş ortağı yalnız kendisini bağlayan işletmeyi görür; Ristivo müşteri listesine erişim yoktur.

GET/business

Bağlı işletme

Kapsam business:read

curl -X GET https://ristivo.com/api/v1/business \
  -H "Authorization: Bearer $RISTIVO_KEY"
Yanıt
{
  "id": "biz_3f9a1c07d2e4b658",
  "name": "Örnek Lokanta",
  "address": "Kemalpaşa Mah. Çarşı Cad. No:12, Çanakkale",
  "phone": "+90 286 000 00 00",
  "timezone": "Europe/Istanbul",
  "currency": "TRY",
  "modules": [
    "pos",
    "reservation",
    "customers"
  ],
  "connection": {
    "type": "partner",
    "scopes": [
      "business:read",
      "delivery:read",
      "delivery:write"
    ],
    "created_at": "2026-10-26T14:05:00+03:00"
  }
}

Siparişler

Kasa ve RestoranYakında

Masa, gel-al ve paket siparişleri. Dış kanaldan açılan sipariş kasaya düşer, mutfak fişi basılır; yazarkasa fişi kasada kesilir.

GET/ordersYakında

Sipariş listesi

Kapsam orders:read

Sorgu parametreleri

statusmetin
open, closed, cancelled
channelmetin
table, takeaway, delivery, qr, platform
created_sincetarih
Bu tarihten sonra açılanlar
cursormetin
Sayfalama
curl -X GET https://ristivo.com/api/v1/orders \
  -H "Authorization: Bearer $RISTIVO_KEY"
Yanıt
{
  "data": [
    {
      "id": "ord_58213",
      "channel": "delivery",
      "status": "open",
      "table": null,
      "items": [
        {
          "product_id": "prd_1042",
          "name": "Lahmacun",
          "quantity": 3,
          "unit_price": "120.00",
          "total": "360.00"
        }
      ],
      "total": "360.00",
      "created_at": "2026-10-26T12:10:02+03:00"
    }
  ],
  "next_cursor": null
}
GET/orders/{id}Yakında

Tek sipariş

Kapsam orders:read

curl -X GET https://ristivo.com/api/v1/orders/ord_58213 \
  -H "Authorization: Bearer $RISTIVO_KEY"
Yanıt
{
  "id": "ord_58213",
  "channel": "delivery",
  "status": "closed",
  "total": "360.00",
  "payments": [
    {
      "method": "card",
      "amount": "360.00"
    }
  ],
  "closed_at": "2026-10-26T12:41:19+03:00"
}
POST/ordersYakında

Dış kanaldan sipariş aç

Sipariş kasada ilgili kanalın listesine düşer. Aynı Idempotency-Key ile tekrar gönderilen istek ikinci sipariş açmaz.

Kapsam orders:write

Gövde

external_idmetinzorunlu
Sizin sistemizdeki sipariş numarası
channelmetinzorunlu
takeaway ya da delivery
itemsdizizorunlu
product_id, quantity, note
customernesne
name, phone, address. Yalnız delivery için.
paidmantıksal
Online ödendiyse true
notemetin
Mutfak notu
curl -X POST https://ristivo.com/api/v1/orders \
  -H "Authorization: Bearer $RISTIVO_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "external_id": "WEB-20931",
    "channel": "delivery",
    "items": [
      {
        "product_id": "prd_1042",
        "quantity": 3,
        "note": "Acısız"
      }
    ],
    "customer": {
      "name": "Elif K.",
      "phone": "+905321112233",
      "address": "Barbaros Mah. 1. Sok. No:4 D:2"
    },
    "paid": true
  }'
Yanıt
{
  "id": "ord_58214",
  "status": "open",
  "total": "360.00",
  "created_at": "2026-10-26T12:14:40+03:00"
}
POST/orders/{id}/paymentsYakında

Adisyona ödeme işle

Yemek kartı ya da banka POS ödemesini adisyona yazar. Tutar kalan bakiyeyi aşamaz.

Kapsam payments:write

Gövde

methodmetinzorunlu
card, meal_card, transfer, other
amountparazorunlu
Ödenen tutar
referencemetin
Provizyon ya da işlem numarası
curl -X POST https://ristivo.com/api/v1/orders/ord_58213/payments \
  -H "Authorization: Bearer $RISTIVO_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "method": "meal_card",
    "amount": "360.00",
    "reference": "MLT-88120"
  }'
Yanıt
{
  "order_id": "ord_58213",
  "paid": "360.00",
  "remaining": "0.00"
}

Teslimat (kurye)

Kasa ve Restoran

Yemeksepeti ya da Trendyol Go siparişini işletme kendi kuryesiyle gönderiyorsa kasa "Hazır" deyince teslimat açılır ve delivery.ready gönderilir. İşletme panelden "Kurye çağır" ile ya da kendi sisteminden POST /deliveries ile de açabilir. Kurye firması teslimatı üstlenir, durumu ve konumu geri yazar; işletme panelde izler. Üstlenmeden önce alıcının adı, telefonu ve adresi görünmez; yalnız bölge ve yaklaşık konum.

GET/deliveries

Teslimat listesi

Kimsenin üstlenmediği hazır teslimatlar ile sizin üstlendikleriniz. Başka firmanın üstlendiği teslimat listede ve tek kayıt ucunda görünmez.

Kapsam delivery:read

Sorgu parametreleri

statusmetin
Virgülle birden çok: ready, assigned, picked_up, on_the_way, delivered, failed, cancelled
limitsayı
1–200, varsayılan 50
cursormetin
Önceki yanıttaki next_cursor
curl -X GET https://ristivo.com/api/v1/deliveries \
  -H "Authorization: Bearer $RISTIVO_KEY"
Yanıt
{
  "data": [
    {
      "id": "dlv_k2m8q4x1v7n3p9r5",
      "status": "ready",
      "source": "yemeksepeti",
      "order_ref": "1042",
      "pickup": {
        "name": "Örnek Lokanta",
        "address": "Çarşı Cad. No:12, Çanakkale",
        "phone": "+90 286 000 00 00"
      },
      "dropoff": {
        "area": "Barbaros, Merkez",
        "lat": 40.14,
        "lng": 26.41
      },
      "order_total": "360.00",
      "collect_on_delivery": "0.00",
      "payment_method": "online",
      "assigned_to_you": false,
      "ready_at": "2026-10-26T12:32:00+03:00"
    }
  ],
  "next_cursor": null
}
GET/deliveries/{id}

Tek teslimat

Kapsam delivery:read

curl -X GET https://ristivo.com/api/v1/deliveries/dlv_k2m8q4x1v7n3p9r5 \
  -H "Authorization: Bearer $RISTIVO_KEY"
Yanıt
{
  "id": "dlv_k2m8q4x1v7n3p9r5",
  "status": "on_the_way",
  "courier": {
    "name": "Mert Y.",
    "company": "Hızlı Kurye"
  },
  "eta_minutes": 6
}
POST/deliveries/{id}/accept

Teslimatı üstlen

İlk üstlenen firma alır, ikinci istek 409 döner. Üstlenince alıcının adı, telefonu ve adresi yalnız size açılır.

Kapsam delivery:write

Gövde

couriernesnezorunlu
name, phone, plate
eta_minutessayı
Restorana varış süresi
tracking_urlmetin
Misafirin izleyebileceği https adres
curl -X POST https://ristivo.com/api/v1/deliveries/dlv_k2m8q4x1v7n3p9r5/accept \
  -H "Authorization: Bearer $RISTIVO_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "courier": {
      "name": "Mert Y.",
      "phone": "+905339998877",
      "plate": "17 ABC 123"
    },
    "eta_minutes": 6
  }'
Yanıt
{
  "id": "dlv_k2m8q4x1v7n3p9r5",
  "status": "assigned",
  "assigned_to_you": true,
  "dropoff": {
    "name": "Elif K.",
    "phone": "+905321112233",
    "address": "Barbaros Mah. 1. Sok. No:4 D:2",
    "note": "Zili çalmayın",
    "area": "Barbaros, Merkez",
    "lat": 40.139123,
    "lng": 26.412234
  },
  "courier": {
    "name": "Mert Y.",
    "phone": "+905339998877",
    "plate": "17 ABC 123",
    "company": "Hızlı Kurye"
  },
  "accepted_at": "2026-10-26T12:33:10+03:00"
}
POST/deliveries/{id}/status

Durum ve konum bildir

Yalnız üstlenen firma yazar; durum geri gitmez. Aynı durumu konumla tekrar göndermek yalnız konumu günceller.

Kapsam delivery:write

Gövde

statusmetinzorunlu
picked_up, on_the_way, delivered, failed
latsayı
Kurye enlemi (lng ile birlikte)
lngsayı
Kurye boylamı
reasonmetin
failed ise zorunlu
curl -X POST https://ristivo.com/api/v1/deliveries/dlv_k2m8q4x1v7n3p9r5/status \
  -H "Authorization: Bearer $RISTIVO_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "status": "delivered",
    "lat": 40.1391,
    "lng": 26.4122
  }'
Yanıt
{
  "id": "dlv_k2m8q4x1v7n3p9r5",
  "status": "delivered",
  "delivered_at": "2026-10-26T12:51:47+03:00"
}
POST/deliveries

Teslimat aç

İşletmenin kendi sitesinden ya da telefondan aldığı paket siparişi bağlı kurye firmalarına açar. Aynı external_id ikinci teslimat açmaz.

Kapsam orders:write

Gövde

external_idmetinzorunlu
Sizin sisteminizdeki sipariş numarası
recipientnesnezorunlu
name, phone, address zorunlu; note, area, lat, lng
order_totalpara
Sipariş tutarı
collect_on_deliverypara
Kapıda alınacak tutar; önceden ödendiyse 0
payment_methodmetin
cash, card, online, meal_card, other
order_refmetin
Fişteki kısa numara
curl -X POST https://ristivo.com/api/v1/deliveries \
  -H "Authorization: Bearer $RISTIVO_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "external_id": "WEB-20931",
    "recipient": {
      "name": "Elif K.",
      "phone": "+905321112233",
      "address": "Barbaros Mah. 1. Sok. No:4 D:2",
      "area": "Barbaros, Merkez"
    },
    "order_total": "360.00",
    "collect_on_delivery": "0.00",
    "payment_method": "online"
  }'
Yanıt
{
  "id": "dlv_a7c3e9g1k5m2p8s4",
  "status": "ready",
  "external_id": "WEB-20931"
}
POST/deliveries/{id}/cancel

Teslimatı iptal et

Yalnız teslimatı açan taraf. Üstlenen kurye firmasına delivery.cancelled gider.

Kapsam orders:write

Gövde

reasonmetin
İptal sebebi
curl -X POST https://ristivo.com/api/v1/deliveries/dlv_a7c3e9g1k5m2p8s4/cancel \
  -H "Authorization: Bearer $RISTIVO_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "reason": "Müşteri vazgeçti"
  }'
Yanıt
{
  "id": "dlv_a7c3e9g1k5m2p8s4",
  "status": "cancelled"
}

Satış ve muhasebe

Kasa ve RestoranYakında

Mali müşavir ve ön muhasebe yazılımları için. Yanıtlarda misafir adı, telefonu ya da adresi yer almaz.

GET/sales/dailyYakında

Günlük satış özeti

İş günü, gün sonu saatine göre hesaplanır (gece 03:00 kapanan işletmede satış önceki güne yazılır).

Kapsam sales:read

Sorgu parametreleri

fromtarihzorunlu
YYYY-MM-DD
totarihzorunlu
En fazla 92 gün
curl -X GET https://ristivo.com/api/v1/sales/daily \
  -H "Authorization: Bearer $RISTIVO_KEY"
Yanıt
{
  "data": [
    {
      "date": "2026-10-25",
      "gross": "48250.00",
      "discounts": "1200.00",
      "complimentary": "350.00",
      "cancelled": "180.00",
      "net": "46520.00",
      "vat": [
        {
          "rate": 10,
          "base": "38654.55",
          "amount": "3865.45"
        },
        {
          "rate": 20,
          "base": "3333.33",
          "amount": "666.67"
        }
      ],
      "payments": [
        {
          "method": "cash",
          "amount": "9820.00"
        },
        {
          "method": "card",
          "amount": "33100.00"
        },
        {
          "method": "meal_card",
          "amount": "3600.00"
        }
      ],
      "covers": 214
    }
  ]
}
GET/sales/end-of-day/{date}Yakında

Gün sonu

Kasa ve yazarkasa bazında gün sonu: Z numarası, fiş adedi, kasa farkı.

Kapsam sales:read

curl -X GET https://ristivo.com/api/v1/sales/end-of-day/2026-10-25 \
  -H "Authorization: Bearer $RISTIVO_KEY"
Yanıt
{
  "date": "2026-10-25",
  "registers": [
    {
      "name": "Kasa 1",
      "okc_serial": "PAV0000123",
      "z_number": 412,
      "receipts": 186,
      "total": "41210.00",
      "cash_difference": "0.00"
    }
  ]
}
GET/invoicesYakında

Kesilen e-belgeler

Kapsam invoices:read

Sorgu parametreleri

typemetin
e_invoice, e_archive, e_receipt
fromtarih
Başlangıç
totarih
Bitiş
curl -X GET https://ristivo.com/api/v1/invoices \
  -H "Authorization: Bearer $RISTIVO_KEY"
Yanıt
{
  "data": [
    {
      "id": "inv_3301",
      "type": "e_invoice",
      "number": "RST2026000000412",
      "uuid": "5f0c2e7a-1d4b-4c8e-9a51-7c2b1e0d9f33",
      "buyer_tax_id": "1234567890",
      "total": "6000.00",
      "vat": "1000.00",
      "status": "accepted",
      "pdf_url": "https://ristivo.com/api/v1/invoices/inv_3301/pdf",
      "issued_at": "2026-10-25T21:14:00+03:00"
    }
  ]
}

Alış ve stok

RestoranYakında

Tedarikçi ve muhasebe yazılımları için. Gönderilen alış faturası doğrudan stoğa yazılmaz; işletmenin onayına düşer, onaylanınca stoğa ve tedarikçi carisine işlenir.

GET/purchasesYakında

Alış faturaları

Kapsam purchases:read

Sorgu parametreleri

fromtarih
Başlangıç
supplier_tax_idmetin
Tedarikçi VKN
curl -X GET https://ristivo.com/api/v1/purchases \
  -H "Authorization: Bearer $RISTIVO_KEY"
Yanıt
{
  "data": [
    {
      "id": "pur_771",
      "supplier": {
        "name": "Ege Gıda",
        "tax_id": "9876543210"
      },
      "number": "EGE2026000001187",
      "total": "14400.00",
      "status": "approved",
      "date": "2026-10-24"
    }
  ]
}
POST/purchasesYakında

Alış faturası gönder

Kapsam purchases:write

Gövde

supplier_tax_idmetinzorunlu
Gönderen tedarikçinin VKN ya da TCKN
numbermetinzorunlu
Fatura numarası
datetarihzorunlu
Fatura tarihi
linesdizizorunlu
name, barcode, quantity, unit, unit_price, vat_rate
uuidmetin
e-Fatura ETTN; aynı ETTN ikinci kez alınmaz
curl -X POST https://ristivo.com/api/v1/purchases \
  -H "Authorization: Bearer $RISTIVO_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "supplier_tax_id": "9876543210",
    "number": "EGE2026000001190",
    "date": "2026-10-26",
    "lines": [
      {
        "name": "Kıyma (dana)",
        "quantity": 10,
        "unit": "kg",
        "unit_price": "640.00",
        "vat_rate": 1
      }
    ]
  }'
Yanıt
{
  "id": "pur_772",
  "status": "pending_approval",
  "total": "6464.00"
}
GET/stock/levelsYakında

Depo miktarları

Kapsam stock:read

Sorgu parametreleri

below_minimummantıksal
Yalnız kritik seviyenin altındakiler
curl -X GET https://ristivo.com/api/v1/stock/levels \
  -H "Authorization: Bearer $RISTIVO_KEY"
Yanıt
{
  "data": [
    {
      "item_id": "stk_208",
      "name": "Kıyma (dana)",
      "unit": "kg",
      "quantity": "3.200",
      "minimum": "5.000",
      "warehouse": "Mutfak"
    }
  ]
}

Rezervasyon

Restoran ve OtelYakında

Rezervasyon platformları ve otel programları için. Açılan rezervasyon işletmenin kurallarına (kapasite, saat aralığı, onay gereksinimi) uyar.

GET/availabilityYakında

Boş saatler

Kapsam reservations:read

Sorgu parametreleri

datetarihzorunlu
YYYY-MM-DD
party_sizesayızorunlu
Kişi sayısı
curl -X GET https://ristivo.com/api/v1/availability \
  -H "Authorization: Bearer $RISTIVO_KEY"
Yanıt
{
  "date": "2026-10-31",
  "party_size": 4,
  "slots": [
    "19:00",
    "19:30",
    "21:30"
  ]
}
POST/reservationsYakında

Rezervasyon aç

Kapsam reservations:write

Gövde

datetarihzorunlu
YYYY-MM-DD
timemetinzorunlu
SS:DD
party_sizesayızorunlu
Kişi sayısı
guestnesnezorunlu
name, phone, email
notemetin
Doğum günü, alerji, masa isteği
external_idmetin
Sizin sistemizdeki numara
curl -X POST https://ristivo.com/api/v1/reservations \
  -H "Authorization: Bearer $RISTIVO_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "date": "2026-10-31",
    "time": "19:30",
    "party_size": 4,
    "guest": {
      "name": "Can D.",
      "phone": "+905441234567"
    },
    "note": "Cam kenarı"
  }'
Yanıt
{
  "id": "rsv_4410",
  "status": "pending",
  "date": "2026-10-31",
  "time": "19:30",
  "party_size": 4
}
POST/reservations/{id}/cancelYakında

Rezervasyonu iptal et

Kapsam reservations:write

curl -X POST https://ristivo.com/api/v1/reservations/rsv_4410/cancel \
  -H "Authorization: Bearer $RISTIVO_KEY"
Yanıt
{
  "id": "rsv_4410",
  "status": "cancelled"
}

Misafirler

Restoran ve OtelYakında

Misafir kartı kişisel veridir. İşletme bu kapsamı ayrı bir onayla verir; telefon ve e-posta maskeli döner. Tam hâli yalnız işletmenin kendi anahtarıyla alınır.

GET/customersYakında

Misafir kartları

Kapsam customers:read

Sorgu parametreleri

updated_sincetarih
Bu tarihten sonra değişenler
curl -X GET https://ristivo.com/api/v1/customers \
  -H "Authorization: Bearer $RISTIVO_KEY"
Yanıt
{
  "data": [
    {
      "id": "cus_1209",
      "name": "Can D.",
      "phone": "+90 544 *** ** 67",
      "email": "c***@gmail.com",
      "visits": 7,
      "last_visit": "2026-10-18",
      "marketing_consent": true
    }
  ]
}

Olaylar

Kayıtlı adresinize POST ile gönderilir. 10 saniye içinde 2xx dönmezseniz 1 dk, 5 dk, 30 dk, 2 sa, 6 sa ve 24 sa sonra tekrar denenir. Aynı olay birden fazla gelebilir; id ile tekrarı ayıklayın.

OlayNe zaman
order.createdYeni adisyon ya da sipariş açıldıYakında
order.updatedKalem eklendi, çıkarıldı ya da masa değiştiYakında
order.closedHesap kapandı, ödeme tamamYakında
order.cancelledSipariş iptal edildiYakında
delivery.readyPaket yola hazır, kurye bekleniyor (alıcı bilgisi yok, yalnız bölge)
delivery.updatedTeslimat üstlenildi ya da kurye durumu değişti
delivery.cancelledTeslimat iptal edildi
product.updatedFiyat ya da satış durumu değiştiYakında
menu.updatedKategori ya da ürün eklendi, silindiYakında
day.closedGün sonu alındıYakında
invoice.issuedE-fatura, e-arşiv ya da e-adisyon kesildiYakında
purchase.approvedGönderilen alış faturası onaylandıYakında
reservation.createdYeni rezervasyonYakında
reservation.updatedOnaylandı, değişti, iptal edildi ya da gelmediYakında
delivery.ready
{
  "id": "evt_q1w2e3r4t5y6u7i8",
  "type": "delivery.ready",
  "created_at": "2026-10-26T12:32:00+03:00",
  "business_id": "biz_3f9a1c07d2e4b658",
  "data": {
    "delivery_id": "dlv_k2m8q4x1v7n3p9r5",
    "area": "Barbaros, Merkez",
    "ready_at": "2026-10-26T12:32:00+03:00",
    "collect_on_delivery": "0.00"
  }
}

Webhook adresleri

Olayları almak istediğiniz adresi kaydedin (bağlantı başına en fazla 5). Yanıttaki secret yalnız bir kez gösterilir; imzayı doğrulamak için saklayın. Adres https olmalı ve herkese açık bir sunucuya gitmeli.

GET/webhooks

Kayıtlı adresler

Kapsam webhooks:manage

curl -X GET https://ristivo.com/api/v1/webhooks \
  -H "Authorization: Bearer $RISTIVO_KEY"
Yanıt
{
  "data": [
    {
      "id": "whk_r4t8y2u6i0o3p7a1",
      "url": "https://kurye.example.com/ristivo",
      "events": [
        "delivery.ready"
      ],
      "status": "active",
      "last_success_at": "2026-10-26T12:32:01+03:00",
      "last_error": null
    }
  ]
}
POST/webhooks

Adres kaydet

Kapsam webhooks:manage

Gövde

urlmetinzorunlu
https adres
eventsdizizorunlu
Dinlenecek olaylar; her olayın kapsamı anahtarda olmalı
curl -X POST https://ristivo.com/api/v1/webhooks \
  -H "Authorization: Bearer $RISTIVO_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "url": "https://kurye.example.com/ristivo",
    "events": [
      "delivery.ready",
      "delivery.cancelled"
    ]
  }'
Yanıt
{
  "id": "whk_r4t8y2u6i0o3p7a1",
  "url": "https://kurye.example.com/ristivo",
  "events": [
    "delivery.ready",
    "delivery.cancelled"
  ],
  "status": "active",
  "secret": "whsec_3Jx9…"
}
DELETE/webhooks/{id}

Adresi sil

Kapsam webhooks:manage

curl -X DELETE https://ristivo.com/api/v1/webhooks/whk_r4t8y2u6i0o3p7a1 \
  -H "Authorization: Bearer $RISTIVO_KEY"
Yanıt
{
  "id": "whk_r4t8y2u6i0o3p7a1",
  "deleted": true
}

İmza doğrulama

Her olayda Ristivo-Signature: t=…,v1=… başlığı gelir. v1, t + "." + ham gövde metninin webhook secret'ıyla alınmış HMAC-SHA256 özetidir. Gövdeyi JSON olarak çözmeden önce doğrulayın; 5 dakikadan eski zaman damgasını reddedin.

import crypto from 'node:crypto'

// Express: app.post('/ristivo', express.raw({ type: 'application/json' }), dogrula)
function dogrula(req, res) {
  const baslik = req.get('Ristivo-Signature') // t=1761471120,v1=5f2b…
  const { t, v1 } = Object.fromEntries(baslik.split(',').map((p) => p.split('=')))
  const beklenen = crypto
    .createHmac('sha256', process.env.RISTIVO_WEBHOOK_SECRET)
    .update(`${t}.${req.body}`)
    .digest('hex')

  const gecerli = crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(beklenen))
  const taze = Math.abs(Date.now() / 1000 - Number(t)) < 300
  if (!gecerli || !taze) return res.sendStatus(400)

  const olay = JSON.parse(req.body)
  // olay.id ile daha önce işlenip işlenmediğine bakın
  res.sendStatus(200)
}

Test ortamı

Geliştirmeyi https://dev.ristivo.com/api/v1 üzerinde yapın. Test ortamının veritabanı canlıdan ayrıdır; size örnek menü, masa ve siparişleri olan bir deneme işletmesi açarız. Canlıya geçerken yalnız taban adres ve anahtar değişir.

Başvuru

Firmanızı, hangi işletmelere hizmet verdiğinizi ve ihtiyacınız olan kapsamları yazın. Test anahtarını ve deneme işletmesini aynı hafta açarız. İşletmeyseniz panel kullanıcı adınızı ekleyin.