İçeriğe atla

GELİŞTİRİCİLER · API v1

DigiMenu için eklenti geliştirin

API erişimi için kullanım amacınızı açıklayarak başvurun. DigiMenu onayından sonra işletmenin izniyle bağlantı kurabilirsiniz. Başvuru, kurulum ve teknik ayrıntılar bu rehberde.

Son kontrol: 27 Eylül 202617 işlem

Eklenti nasıl çalışır?

API erişimi başvuru ve DigiMenu onayına bağlıdır. Her uygulama için kullanım amacınızı, API’ye neden ihtiyaç duyduğunuzu ve kullanacağınız verileri açıklamalısınız. Onay gelmeden test dahil kurulum, token alma ve webhook kullanımı mümkün değildir. Paket veya geliştirici paneli erişimi bu onayın yerine geçmez.

Eklentiniz kendi sunucunuzda çalışır. İşletme yöneticisi DigiMenu’de izin verir; uygulamanız o işletmenin verilerine OAuth token’ıyla erişir. Değişiklikleri webhook üzerinden alabilirsiniz. DigiMenu sunucusuna kod veya ZIP yüklemezsiniz.

API adresi: https://api.digimenu.us/api/v1. TEST ve LIVE uygulamalar aynı adresi kullanır. TEST modu yalnızca uygulamayı geliştirici kuruluşun kendi işletmelerine kurmayı sınırlar; ayrı veya sahte bir veri tabanı değildir. Denemeler için ayrı bir test işletmesi kullanın.

  • Menü ve masa bilgilerini okuyabilir, siparişleri listeleyebilir ve teslimat entegrasyonu geliştirebilirsiniz.
  • Bu API’de ürün/menü yazma, sipariş oluşturma, stok/CRM yönetimi, ödeme alma veya iade uç noktası yoktur. DigiMenu’nün kendi uygulamalarındaki her özellik dış API’ye açık değildir.
  • Başlangıç örneği Node.js 22.18+ ile ek paket kurmadan çalışır: OAuth bağlantısı, menü okuma, token yenileme ve imzalı webhook kaydı içerir.

Bağımsız geliştirici hesabı

developers.digimenu.us adresinden restoran hesabı veya abonelik olmadan başvurabilirsiniz. E-postanızı doğrulayın; kişi/şirket bilgilerinizi, uygulamanın amacını ve veri ihtiyacını açıklayın. Geliştirici hesabı onaylandıktan sonra uygulama başvurusu oluşturabilirsiniz. Her uygulama ayrıca incelenir. Hesap onayı tek başına API erişimi sağlamaz.

Onaylı uygulamanın ayarlarından ayrı test ortamı oluşturabilirsiniz. Bu ortam müşteri tablolarını kullanmaz; örnek menü, masa, sipariş okuma ve sipariş teslimat durumu değişikliklerini destekler. OAuth, kurye ve webhook akışlarını taklit etmez. sandbox_ anahtarı 24 saat geçerlidir ve canlı /api/v1 adresinde kullanılamaz. Ortamı sıfırlamak verileri başlangıç durumuna getirir ve eski anahtarı iptal eder.

HTTP · sandbox
GET https://api.digimenu.us/api/admin/developer-sandbox/v1/menu
Authorization: Bearer SANDBOX_TOKEN

Canlı kullanım için onaylı uygulamanızı LIVE moduna alın. İşletme yöneticisi aşağıdaki OAuth akışıyla ayrıca izin vermelidir. Bağımsız geliştirici hesabı size restoran paneli erişimi vermez. Geliştirici hesabınız askıya alınırsa mevcut uygulama ve test anahtarlarının erişimi de durur.

Uygulama kaydı ve test

Onaylı bağımsız hesabınızla developers.digimenu.us adresini açın. İşletme hesabıyla geliştirenler panel.digimenu.us/gelistirici adresini kullanmaya devam edebilir; bu yol için kuruluşta Geliştirici & Platform uygulaması etkin olmalıdır. Aşağıdaki uygulama ayarları iki panelde de geçerlidir.

  • API erişim başvurusu taslağı oluşturun. Kullanım amacını ve veri ihtiyacını 40–2000 karakterle açıklayın. Oluşan clientId tek başına erişim sağlamaz.
  • Dönüş adresini tam HTTPS URL olarak ekleyin: https://eklenti.example/callback. Joker karakter, kullanıcı adı/parola ve #fragment kabul edilmez. Sondaki / dahil adres aynı olmalıdır.
  • Örnek için menu:read, orders:read ve webhooks:manage izinlerini seçin. Her kurulumda işletmenin onayladığı izinleri token yanıtından kontrol edin.
  • Açıklamayı, dönüş adreslerini ve izinleri kaydedip incelemeye gönderin. DigiMenu onayından sonra isteğe bağlı client_secret oluşturabilirsiniz. Oluşturduysanız kod değişiminde ve token yenilemede göndermek zorunludur; yalnızca bir kez gösterilir.
  • Başvurunuz onaylandıktan sonra TEST modunda kendi kuruluşunuzdaki test işletmesiyle yetkilendirin. HTTPS dönüş ve webhook adresleri için kendi test alan adınızı veya HTTPS tünelinizi kullanın; localhost HTTP dönüş adresi kayıt edilemez.
starter.env
APP_ORIGIN=https://eklenti.example
CLIENT_ID=YOUR_CLIENT_ID
SCOPES="menu:read orders:read webhooks:manage"
# Only if a secret was created:
# CLIENT_SECRET=YOUR_CLIENT_SECRET
# Set after registering the webhook receiver:
# WEBHOOK_SECRET=YOUR_WEBHOOK_SECRET
PORT=8787
INBOX_DIR=./webhook-inbox
Terminal
node --env-file=starter.env digimenu-starter.mjs
# HTTPS proxy/tunnel → http://127.0.0.1:8787
# Open https://eklenti.example/connect

Örnek geliştirme içindir: oturum ve token’lar bellekte tutulur, yeniden başlatınca tekrar izin almanız gerekir. Webhook’lar yerel diske kaydedilir. Canlıya geçerken kullanıcı girişi, şifreli ve kalıcı token deposu, kuruluş/kurulum eşleştirmesi, kalıcı iş kuyruğu ve saklama politikası ekleyin. starter.env dosyasını Git’e eklemeyin.

OAuth ve PKCE

PKCE S256 tüm istemcilerde zorunludur. Her bağlantı girişimi için yeni code_verifier ve state üretin; bunları kullanıcının sunucu oturumuna bağlayın. code_verifier 43–128 karakter olmalıdır. Dönüşte state değerini doğrulamadan kodu değiştirmeyin. Yetkilendirme kodu tek kullanımlıktır ve 60 saniye geçerlidir.

Node.js
import { randomBytes, createHash } from 'node:crypto';
const verifier = randomBytes(32).toString('base64url');
const state = randomBytes(32).toString('base64url');
const challenge = createHash('sha256').update(verifier).digest('base64url');
// Store verifier + state in this user's server session before redirecting.
const url = new URL('https://panel.digimenu.us/yetkilendir');
url.search = new URLSearchParams({
  client_id: process.env.CLIENT_ID,
  redirect_uri: 'https://eklenti.example/callback',
  scope: 'menu:read orders:read webhooks:manage',
  code_challenge: challenge,
  code_challenge_method: 'S256',
  state,
}).toString();

İşletme yöneticisi izin verdiğinde dönüş adresine code ve state gelir. Reddederse error=access_denied ve state gelir. Yönetici giriş token’ını toplamayın; uygulama token’ı yalnızca aşağıdaki değişimle alınır. client_credentials akışı desteklenmez.

HTTP
POST https://api.digimenu.us/api/v1/oauth/token
Content-Type: application/json

{
  "grant_type": "authorization_code",
  "client_id": "YOUR_CLIENT_ID",
  "code": "CODE_FROM_CALLBACK",
  "redirect_uri": "https://eklenti.example/callback",
  "code_verifier": "ORIGINAL_VERIFIER"
}
200 · JSON
{
  "access_token": "ACCESS_TOKEN",
  "refresh_token": "REFRESH_TOKEN",
  "token_type": "Bearer",
  "expires_in": 3600,
  "scope": "menu:read orders:read webhooks:manage"
}

Token yenileme ve kaldırma

Erişim token’ı 1 saat, yenileme token’ı 60 gün geçerlidir. expires_in değerini esas alın. Her yenilemede access_token ve refresh_token birlikte değişir; ikisini atomik olarak saklayın. Aynı kurulum için paralel yenileme yapmayın. Eski refresh_token’ı yeniden kullanmak o kuruluma ait yenileme token ailesini iptal eder.

HTTP
POST https://api.digimenu.us/api/v1/oauth/token
Content-Type: application/json

{
  "grant_type": "refresh_token",
  "client_id": "YOUR_CLIENT_ID",
  "refresh_token": "LATEST_REFRESH_TOKEN"
}

client_secret tanımlıysa bu isteğe de ekleyin. Yenileme yanıtı ağda kaybolursa eski token ile körlemesine tekrar denemeyin; yeniden OAuth bağlantısı kurun. invalid_grant için aynı token’ı döngüde göndermeyin.

İşletme uygulamayı panelden kaldırdığında API erişimi kapanır. APP_REVOKED veya APP_NOT_INSTALLED alırsanız eşitlemeyi durdurun ve işletmenin yeniden izin vermesini isteyin. SUBSCRIPTION_REQUIRED durumunda işletme kendi abonelik sorununu panelden çözmelidir; token yenilemek bunu çözmez.

İzinler ve veri kapsamı

Her access token tek bir işletme ve kuruluma bağlıdır. Birden fazla işletme için ayrı izin ve token saklayın; kayıtlarınızı installationId ve restaurantId ile ayırın. İzinlerde hiyerarşi yoktur: orders:write, orders:read iznini içermez.

  • menu:read — Aktif kategoriler ve ürünler. Menü yazma yetkisi vermez.
  • orders:read — Sipariş listesi ve ayrıntısı. Fiyat, ödeme ve müşteri tablosunu döndürmez.
  • orders:write — Yalnızca teslimat aşaması durum geçişleri. Ödeme, mutfak ve iptal işlemlerini kapsamaz.
  • tables:read — Aktif masa kimliği, adı ve numarası; QR anahtarı veya doluluk bilgisi yoktur.
  • deliveries:read / deliveries:write — Kurulumunuza atanmış kurye seferlerini okuma/yürütme. write izni verildiğinde kurulum için bir kurye kaydı oluşturulur.
  • customers:read — Genel bir /customers uç noktası açmaz. Sipariş yanıtında ayrıntılı adres için bu izin ve siparişin uygulamanızın kuryesine atanmış olması birlikte gerekir.
  • webhooks:manage — Uygulamanın alıcı adreslerini ve teslimat kayıtlarını yönetir. Olayları almak için ayrıca orders:read veya deliveries:read gerekir.

İstekler, sayfalama ve tekrarlar

cURL
curl 'https://api.digimenu.us/api/v1/orders?channel=DELIVERY&limit=25' \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H 'Accept: application/json'

Sipariş ve webhook teslimat listelerinde limit varsayılan 25, aralık 1–100’dür. Yanıttaki nextCursor değerini sonraki istekte cursor olarak gönderin; null olduğunda durun. /tables ve /webhooks doğrudan dizi döndürür. /menu tek bir restaurant/categories nesnesidir; tüm yanıtları data içine sarılmış kabul etmeyin.

Tarihler ISO 8601 biçimindedir. Menüde price ana para birimindedir (149.90); deliveryFeeMinor alt birimdedir (14990). Bu yanıtlarda para birimi alanı yoktur; işletmenin para birimini ayrıca belirleyin. null, alanın bulunmadığı veya uygulanmadığı anlamına gelebilir.

Idempotency-Key yalnızca /orders/{id}/transitions için uygulanır: kurulum başına, 5 dakikalık ve işlem belleğinde tutulan bir yanıttır. Her sipariş/işlem/gövde için farklı anahtar üretin. Sunucu yeniden başlamasında kalıcılık veya tüm POST isteklerinde tekrar koruması vaat edilmez. Diğer yazma isteklerinde belirsiz ağ hatasından sonra önce mevcut durumu okuyun.

Webhook kurulumu ve imza

Alıcılar uygulama düzeyindedir; her işletme için yeniden alıcı oluşturmayın. URL herkese açık HTTPS olmalı ve standart 443 portunu kullanmalıdır. Yerel/özel adresler ve yönlendirmeler kabul edilmez. İstek gövdesini JSON’a çevirmeden önce ham baytlarıyla imzayı doğrulayın.

HTTP
POST https://api.digimenu.us/api/v1/webhooks
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json

{
  "url": "https://eklenti.example/webhooks",
  "events": ["order.created", "order.paid"]
}

201 yanıtındaki secret yalnızca oluşturma sırasında gösterilir. Güvenli depoya alın. Alıcı oluşturma isteği tekrar korumalı değildir; yanıt kaybolursa önce GET /webhooks ile kontrol edin. Gizli anahtar kaybolursa eski alıcıyı devre dışı bırakıp yenisini oluşturun.

Headers
X-Digimenu-Signature: t=1790467200,v1=<64-character-hex-hmac>
X-Digimenu-Event-Id: <event-uuid>
X-Digimenu-Event-Type: order.created

HMAC-SHA256(secret, timestamp + "." + rawBody)
JSON · example
{
  "id": "00000000-0000-4000-8000-000000000001",
  "type": "order.created",
  "createdAt": "2026-09-27T00:00:00.000Z",
  "restaurantId": "restaurant_example",
  "installationId": "installation_example",
  "data": { "orderId": "order_example", "channel": "TAKEAWAY" }
}

İmza karşılaştırmasını sabit sürede yapın; zaman damgası ±300 saniye dışında ise reddedin. İmzası doğrulanmış gövdedeki id ile X-Digimenu-Event-Id aynı olmalıdır. Yinelenen olayları bu kimlikle kalıcı olarak ayıklayın; restaurantId/installationId değerlerini kendi kurulum kayıtlarınızla eşleştirin.

Alıcı 10 saniye içinde 2xx döndürmelidir. Önce olayı kalıcı kuyruğa veya depoya kaydedin; sonra yanıt verin. Başarısız teslimatta toplam 6 deneme vardır; sonraki denemeler 30, 120, 600, 1.800 ve 7.200 saniye bekler. Zamanlar işçinin çalışmasına bağlı olarak gecikebilir. Alıcıdaki toplam 20 FAILED kaydı otomatik devre dışı bırakmaya yol açar.

Sıralama ve tek sefer teslim garantisi yoktur. Siparişin son durumunu GET /orders/{id} ile okuyun. Kayıtları GET /webhooks/{id}/deliveries üzerinden inceleyin. Kamuya açık yeniden gönderim veya yeniden etkinleştirme uç noktası yoktur.

Olay listesi

  • order.created — Gel-al veya paket servis siparişi oluşturuldu. data: orderId, channel. orders:read gerekir; tüm masa siparişleri için olay garantisi yoktur.
  • order.paid — Kanal siparişinin ödeme kaydı tamamlandı. data: orderId. orders:read gerekir.
  • delivery.ready — Dış kurye ağına atama yapıldı. data: orderId, runId ve teslimat ayrıntıları. deliveries:read gerekir. runId ile seferinizi API’den doğrulayın; hassas teslimat verilerini günlük dosyalarına yazmayın.
  • delivery.picked_up / delivery.delivered / delivery.failed — data: orderId, runId, status. deliveries:read gerekir.
  • delivery.assigned — Kayıt sırasında kabul edilen ayrılmış bir olay adıdır; mevcut sürümde bunu üreten bir akış yoktur. İş akışınızı bu olayı bekleyerek kurmayın.

Kurye entegrasyonu

deliveries:read, deliveries:write ve webhooks:manage izinleriyle kurulum yapın; sipariş ayrıntısı için orders:read, atanmış siparişin açık adresi için customers:read ekleyin. İşletme kurye ağınıza bir sipariş atadıktan sonra delivery.ready içindeki runId ile seferi okuyun.

HTTP · sequence
GET /api/v1/deliveries/{runId}
POST /api/v1/deliveries/{runId}/depart
POST /api/v1/deliveries/{runId}/pings
{ "lat": 41.01, "lng": 28.97 }

POST /api/v1/deliveries/orders/{orderId}/delivered
{ "code": "CUSTOMER_DELIVERY_CODE" }

# Alternative when delivery fails:
POST /api/v1/deliveries/orders/{orderId}/failed
{ "reason": "CUSTOMER_ABSENT" }

Teslim edildi bildirimi güncel konum, adrese yakınlık ve işletmenin seçtiği teslim kanıtını denetler. CODE modu müşteri kodunu ister. PHOTO/SIGNATURE için DigiMenu’nün ürettiği yükleme kaydı gerekir; v1’de dış uygulamalar için kanıt yükleme uç noktası henüz yoktur. Bu iki modu yalnızca v1 ile tamamlanabilir gibi değerlendirmeyin.

Kurye uygulamalarında /deliveries yolunu kullanın. Genel /orders/{id}/transitions yolu GPS ve teslim kanıtı kontrollerini çalıştırmaz. pings yolunda sefer, kimliği doğrulanmış kuryeden belirlenir; URL’deki runId başka bir seferi seçmek için kullanılamaz.

Panel içinde ekran

Geliştirici panelinde embeddedUrl ve embeddedOrigin alanları vardır. Ekran bir sandbox iframe içinde açılır; çerez, oturum ve üst sayfa DOM erişimine güvenmeyin. Token iframe mesajıyla aktarılmaz. İlk sürümünüzü ayrı HTTPS uygulaması olarak hazırlayın.

Gömülü ekran köprüsü henüz kararlı bir entegrasyon sözleşmesi değildir: mevcut iframe sandbox ayarı ile origin hedefli mesajlaşma birlikte uçtan uca doğrulanmalıdır. restaurantId/locale/theme bilgisinin veya otomatik yükseklik mesajlarının geleceğini varsaymayın. Canlıya almadan önce destek ekibiyle bu akışı test edin.

Hatalar ve sınırlar

Kurulum başına 10 saniyede 30 ve UTC saat penceresi başına 5.000 istek sınırı vardır. Ayrıca IP başına dakikada 600 genel sınır, token uç noktasında dakikada 30 sınırı uygulanır. 429 sonrasında artan bekleme ve rastgele gecikme kullanın; Retry-After başlığının her yanıtta bulunacağını varsaymayın.

API · 403
{ "code": "insufficient_scope", "requiredScope": "orders:read", "message": "..." }
OAuth · 400
{ "error": "invalid_grant", "error_description": "..." }
  • 400 — Alan türünü, izin verilen durumları ve zorunlu alanları kontrol edin. Bilinmeyen gövde alanları reddedilir. Doğrulama hataları statusCode/message/error biçiminde de gelebilir.
  • 401 — APP_UNAUTHENTICATED için süresi dolan token’ı yenileyin. APP_REVOKED / APP_NOT_INSTALLED için yeniden izin gerekir. OAuth invalid_client için client_id ve varsa client_secret değerini kontrol edin.
  • 403 — insufficient_scope, SUBSCRIPTION_REQUIRED veya kurye/teslim kanıtı kısıtı. İzin hatası sürekli tekrar göndererek düzelmez.
  • 404 — Kaynak yok veya token’ın işletme/kurye kapsamı dışında.
  • 409 — INVALID_TRANSITION: siparişin mevcut durumunu okuyun, istenen geçişi buna göre seçin.
  • 429 — rate_limited / quota_exceeded veya genel istek sınırı. Kuyruğunuzu yavaşlatın; saatlik kota için yeni UTC saat penceresini bekleyin.
  • 5xx veya ağ hatası — Okumaları sınırlı sayıda tekrar deneyin. Yazmalarda önce sonucun uygulanıp uygulanmadığını sorgulayın.

İnceleme ve canlıya geçiş

Uygulama DRAFT ve TEST olarak oluşturulur. DRAFT veya REJECTED durumunda dönüş adresleri, izinler ve açıklama düzenlenebilir. En az bir dönüş adresi ve izin kaydettikten sonra incelemeye gönderin: IN_REVIEW. Onaydan sonra APPROVED olur; ardından “Canlıya al” işlemiyle LIVE moduna geçin. Onaylı uygulamanın yapılandırmasını sonradan düzenlemek için destek ekibiyle görüşün.

  • İzin verme/reddetme, hatalı state ve süresi geçmiş kodu deneyin.
  • İki test işletmesinin token ve kayıtlarının karışmadığını doğrulayın.
  • Token yenileme, bağlantı kesilmesi ve panelden uygulama kaldırma senaryolarını çalıştırın.
  • Ham gövdesi değiştirilmiş, süresi geçmiş, tekrar gönderilmiş ve sırası değişmiş webhook’ları deneyin.
  • 429 ve geçici hatalarda sınırlı tekrar; yazmalarda yinelenen işlem kontrolü ekleyin.
  • Destek ekibine uygulamanın amacı, istediği izinler, test adımları, HTTPS adresleri ve iletişim bilgilerini iletin. Gizli anahtar veya kullanıcı token’ı göndermeyin.

Referans 27 Eylül 2026’da mevcut v1 koduyla karşılaştırılmıştır. Yeni uç noktaları ve alanları kullanmadan önce güncel OpenAPI dosyasını kontrol edin. Bilinmeyen yanıt alanlarını kabul edin; yeni bir olay adıyla karşılaşırsanız uygulamanızı durdurmadan kayda alın.

Uç nokta referansı

Her işlemi açarak parametrelerini, gövdesini, yanıt alanlarını ve HTTP durumlarını inceleyin. Şema açıklamaları OpenAPI ile ortak teknik dil olarak İngilizcedir. Örnek yanıtlar veri biçimini gösterir; gerçek işletme verisi değildir.

17 / 17 işlem

GET/healthServis durumu

İzin: Herkese açık

Başarılı yanıt · 200

Yanıt örneği
{
  "status": "ok",
  "service": "api-v1",
  "ts": "2026-09-27T00:00:00.000Z"
}
Tüm yanıt alanları ve türleri
JSON Schema
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "ok"
      ]
    },
    "service": {
      "type": "string",
      "enum": [
        "api-v1"
      ]
    },
    "ts": {
      "type": "string",
      "format": "date-time"
    }
  },
  "required": [
    "status",
    "service",
    "ts"
  ]
}

200 Success

POST/oauth/tokenKod değişimi / token yenileme

İzin: Herkese açık

JSON only in these examples. No client_credentials grant. PKCE S256 is mandatory, even for confidential clients. Serialize refresh operations per installation; old refresh-token reuse revokes the refresh family.

İstek gövdesi · application/json

JSON Schema
{
  "type": "object",
  "properties": {
    "grant_type": {
      "type": "string",
      "enum": [
        "authorization_code",
        "refresh_token"
      ]
    },
    "client_id": {
      "type": "string",
      "maxLength": 200
    },
    "client_secret": {
      "type": "string",
      "description": "Required if a client secret has been configured.",
      "maxLength": 200
    },
    "code": {
      "type": "string",
      "description": "Required for authorization_code; single use, valid for 60 seconds.",
      "maxLength": 200
    },
    "redirect_uri": {
      "type": "string",
      "description": "Required for authorization_code. Exact registered URL.",
      "maxLength": 500,
      "format": "uri"
    },
    "code_verifier": {
      "type": "string",
      "description": "Required for authorization_code. Original PKCE verifier.",
      "minLength": 43,
      "maxLength": 128
    },
    "refresh_token": {
      "type": "string",
      "description": "Required for refresh_token grant.",
      "maxLength": 200
    }
  },
  "required": [
    "grant_type",
    "client_id"
  ]
}

Başarılı yanıt · 200

Yanıt örneği
{
  "access_token": "example",
  "refresh_token": "example",
  "token_type": "Bearer",
  "expires_in": 3600,
  "scope": "example"
}
Tüm yanıt alanları ve türleri
JSON Schema
{
  "type": "object",
  "properties": {
    "access_token": {
      "type": "string"
    },
    "refresh_token": {
      "type": "string"
    },
    "token_type": {
      "type": "string",
      "enum": [
        "Bearer"
      ]
    },
    "expires_in": {
      "type": "integer",
      "example": 3600
    },
    "scope": {
      "type": "string",
      "description": "Space-separated granted permissions."
    }
  },
  "required": [
    "access_token",
    "refresh_token",
    "token_type",
    "expires_in",
    "scope"
  ]
}

200 Success400 invalid_request / invalid_grant401 invalid_client403 access_denied: app application requires DigiMenu approval, including TEST mode429 30 requests per minute per IP

GET/meKurulum bilgileri

İzin: Geçerli uygulama token’ı

Başarılı yanıt · 200

Yanıt örneği
{
  "installationId": "example",
  "appId": "example",
  "restaurantId": "example",
  "scopes": [
    "menu:read"
  ],
  "mode": "TEST",
  "restaurant": {
    "slug": "example",
    "name": "example"
  }
}
Tüm yanıt alanları ve türleri
JSON Schema
{
  "type": "object",
  "properties": {
    "installationId": {
      "type": "string"
    },
    "appId": {
      "type": "string"
    },
    "restaurantId": {
      "type": "string"
    },
    "scopes": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "menu:read",
          "orders:read",
          "orders:write",
          "tables:read",
          "deliveries:read",
          "deliveries:write",
          "customers:read",
          "webhooks:manage"
        ]
      }
    },
    "mode": {
      "type": "string",
      "enum": [
        "TEST",
        "LIVE"
      ]
    },
    "restaurant": {
      "type": "object",
      "properties": {
        "slug": {
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      },
      "required": [
        "slug",
        "name"
      ],
      "nullable": true
    }
  },
  "required": [
    "installationId",
    "appId",
    "restaurantId",
    "scopes",
    "mode",
    "restaurant"
  ]
}

200 Success400 Invalid request or resource state401 Missing/expired token, revoked installation, or app removed403 APP_APPROVAL_REQUIRED (including TEST), missing scope, inactive subscription or delivery restriction404 Resource not found within the installation429 Rate or hourly quota exceeded

GET/menuMenüyü oku

İzin: menu:read

No pagination. Does not expose recipe cost, inventory, variants or internal preparation data.

Başarılı yanıt · 200

Yanıt örneği
{
  "restaurant": {
    "slug": "example",
    "name": "example"
  },
  "categories": [
    {
      "id": "example",
      "name": "example",
      "order": 0,
      "products": [
        {
          "id": "example",
          "name": "example",
          "description": null,
          "price": 0,
          "isActive": true,
          "order": 0,
          "allergens": null
        }
      ]
    }
  ]
}
Tüm yanıt alanları ve türleri
JSON Schema
{
  "type": "object",
  "properties": {
    "restaurant": {
      "type": "object",
      "properties": {
        "slug": {
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      },
      "required": [
        "slug",
        "name"
      ]
    },
    "categories": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "order": {
            "type": "integer"
          },
          "products": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "description": {
                  "type": "string",
                  "nullable": true
                },
                "price": {
                  "type": "number",
                  "description": "Major currency units, not minor units. Currency is not included in this response."
                },
                "isActive": {
                  "type": "boolean"
                },
                "order": {
                  "type": "integer"
                },
                "allergens": {
                  "type": "string",
                  "nullable": true
                }
              },
              "required": [
                "id",
                "name",
                "description",
                "price",
                "isActive",
                "order",
                "allergens"
              ]
            }
          }
        },
        "required": [
          "id",
          "name",
          "order",
          "products"
        ]
      }
    }
  },
  "required": [
    "restaurant",
    "categories"
  ]
}

200 Success400 Invalid request or resource state401 Missing/expired token, revoked installation, or app removed403 APP_APPROVAL_REQUIRED (including TEST), missing scope, inactive subscription or delivery restriction404 Resource not found within the installation429 Rate or hourly quota exceeded

GET/tablesMasaları listele

İzin: tables:read

Returns a bare array. Does not expose QR secrets, sessions or occupancy.

Başarılı yanıt · 200

Yanıt örneği
[
  {
    "id": "example",
    "name": "example",
    "tableNumber": 0
  }
]
Tüm yanıt alanları ve türleri
JSON Schema
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string"
      },
      "name": {
        "type": "string"
      },
      "tableNumber": {
        "type": "integer"
      }
    },
    "required": [
      "id",
      "name",
      "tableNumber"
    ]
  }
}

200 Success400 Invalid request or resource state401 Missing/expired token, revoked installation, or app removed403 APP_APPROVAL_REQUIRED (including TEST), missing scope, inactive subscription or delivery restriction404 Resource not found within the installation429 Rate or hourly quota exceeded

GET/ordersSiparişleri listele

İzin: orders:read

ParametreKonum / türAçıklama
limitquery / integerPage size.
{"type":"integer","minimum":1,"maximum":100,"default":25}
cursorquery / stringPass the previous nextCursor unchanged. Stop when null.
{"type":"string","maxLength":64}
channelquery / stringOrder channel.
{"type":"string","enum":["TABLE","TAKEAWAY","DELIVERY"]}
statusquery / stringUse a known order status, e.g. OUT_FOR_DELIVERY; omit for all statuses.
{"type":"string","maxLength":40}

Başarılı yanıt · 200

Yanıt örneği
{
  "data": [
    {
      "id": "example",
      "shortId": "example",
      "channel": "TABLE",
      "status": "example",
      "createdAt": "2026-09-27T00:00:00.000Z",
      "scheduledFor": null,
      "deliveryAddress": {},
      "deliveryFeeMinor": null,
      "items": [
        {
          "name": "example",
          "quantity": 0,
          "note": null
        }
      ],
      "courierRef": null
    }
  ],
  "nextCursor": null
}
Tüm yanıt alanları ve türleri
JSON Schema
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "shortId": {
            "type": "string"
          },
          "channel": {
            "type": "string",
            "enum": [
              "TABLE",
              "TAKEAWAY",
              "DELIVERY"
            ]
          },
          "status": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "scheduledFor": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "deliveryAddress": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Coarse locality with contactRedacted=true by default. Exact address/contact is returned only with customers:read AND assignment to this app’s courier."
          },
          "deliveryFeeMinor": {
            "type": "integer",
            "description": "Minor currency units; currency not included.",
            "nullable": true
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "quantity": {
                  "type": "integer"
                },
                "note": {
                  "type": "string",
                  "nullable": true
                }
              },
              "required": [
                "name",
                "quantity",
                "note"
              ]
            }
          },
          "courierRef": {
            "type": "string",
            "nullable": true
          }
        },
        "required": [
          "id",
          "shortId",
          "channel",
          "status",
          "createdAt",
          "scheduledFor",
          "deliveryAddress",
          "deliveryFeeMinor",
          "items",
          "courierRef"
        ]
      }
    },
    "nextCursor": {
      "type": "string",
      "nullable": true
    }
  },
  "required": [
    "data",
    "nextCursor"
  ]
}

200 Success400 Invalid request or resource state401 Missing/expired token, revoked installation, or app removed403 APP_APPROVAL_REQUIRED (including TEST), missing scope, inactive subscription or delivery restriction404 Resource not found within the installation429 Rate or hourly quota exceeded

GET/orders/{id}Sipariş ayrıntısı

İzin: orders:read

ParametreKonum / türAçıklama
id *path / stringResource identifier.
{"type":"string"}

Başarılı yanıt · 200

Yanıt örneği
{
  "id": "example",
  "shortId": "example",
  "channel": "TABLE",
  "status": "example",
  "createdAt": "2026-09-27T00:00:00.000Z",
  "scheduledFor": null,
  "deliveryAddress": {},
  "deliveryFeeMinor": null,
  "items": [
    {
      "name": "example",
      "quantity": 0,
      "note": null
    }
  ],
  "courierRef": null
}
Tüm yanıt alanları ve türleri
JSON Schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "shortId": {
      "type": "string"
    },
    "channel": {
      "type": "string",
      "enum": [
        "TABLE",
        "TAKEAWAY",
        "DELIVERY"
      ]
    },
    "status": {
      "type": "string"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "scheduledFor": {
      "type": "string",
      "format": "date-time",
      "nullable": true
    },
    "deliveryAddress": {
      "type": "object",
      "nullable": true,
      "additionalProperties": true,
      "description": "Coarse locality with contactRedacted=true by default. Exact address/contact is returned only with customers:read AND assignment to this app’s courier."
    },
    "deliveryFeeMinor": {
      "type": "integer",
      "description": "Minor currency units; currency not included.",
      "nullable": true
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "quantity": {
            "type": "integer"
          },
          "note": {
            "type": "string",
            "nullable": true
          }
        },
        "required": [
          "name",
          "quantity",
          "note"
        ]
      }
    },
    "courierRef": {
      "type": "string",
      "nullable": true
    }
  },
  "required": [
    "id",
    "shortId",
    "channel",
    "status",
    "createdAt",
    "scheduledFor",
    "deliveryAddress",
    "deliveryFeeMinor",
    "items",
    "courierRef"
  ]
}

200 Success400 Invalid request or resource state401 Missing/expired token, revoked installation, or app removed403 APP_APPROVAL_REQUIRED (including TEST), missing scope, inactive subscription or delivery restriction404 Resource not found within the installation429 Rate or hourly quota exceeded

POST/orders/{id}/transitionsTeslimat aşamasını güncelle

İzin: orders:write

ASSIGNED_TO_COURIER → OUT_FOR_DELIVERY → DELIVERED or DELIVERY_FAILED. Same status is a no-op. This generic route does not run courier GPS/proof checks: courier apps should use /deliveries. No payment, kitchen, cancel, create-order or refund operation is exposed.

ParametreKonum / türAçıklama
id *path / stringResource identifier.
{"type":"string"}
Idempotency-Keyheader / stringOptional. Unique per installation AND operation. A response is cached for 5 minutes in one process; not durable across restarts. Never reuse for another order or body.
{"type":"string"}

İstek gövdesi · application/json

JSON Schema
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "OUT_FOR_DELIVERY",
        "DELIVERED",
        "DELIVERY_FAILED"
      ]
    }
  },
  "required": [
    "status"
  ]
}

Başarılı yanıt · 201

Yanıt örneği
{
  "id": "example",
  "shortId": "example",
  "channel": "TABLE",
  "status": "example",
  "createdAt": "2026-09-27T00:00:00.000Z",
  "scheduledFor": null,
  "deliveryAddress": {},
  "deliveryFeeMinor": null,
  "items": [
    {
      "name": "example",
      "quantity": 0,
      "note": null
    }
  ],
  "courierRef": null
}
Tüm yanıt alanları ve türleri
JSON Schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "shortId": {
      "type": "string"
    },
    "channel": {
      "type": "string",
      "enum": [
        "TABLE",
        "TAKEAWAY",
        "DELIVERY"
      ]
    },
    "status": {
      "type": "string"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "scheduledFor": {
      "type": "string",
      "format": "date-time",
      "nullable": true
    },
    "deliveryAddress": {
      "type": "object",
      "nullable": true,
      "additionalProperties": true,
      "description": "Coarse locality with contactRedacted=true by default. Exact address/contact is returned only with customers:read AND assignment to this app’s courier."
    },
    "deliveryFeeMinor": {
      "type": "integer",
      "description": "Minor currency units; currency not included.",
      "nullable": true
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "quantity": {
            "type": "integer"
          },
          "note": {
            "type": "string",
            "nullable": true
          }
        },
        "required": [
          "name",
          "quantity",
          "note"
        ]
      }
    },
    "courierRef": {
      "type": "string",
      "nullable": true
    }
  },
  "required": [
    "id",
    "shortId",
    "channel",
    "status",
    "createdAt",
    "scheduledFor",
    "deliveryAddress",
    "deliveryFeeMinor",
    "items",
    "courierRef"
  ]
}

201 Success400 Invalid request or resource state401 Missing/expired token, revoked installation, or app removed403 APP_APPROVAL_REQUIRED (including TEST), missing scope, inactive subscription or delivery restriction404 Resource not found within the installation409 INVALID_TRANSITION429 Rate or hourly quota exceeded

GET/webhooksWebhook alıcılarını listele

İzin: webhooks:manage

App-wide, not restaurant-specific. Register once per app, not once per installation.

Başarılı yanıt · 200

Yanıt örneği
[
  {
    "id": "example",
    "url": "https://eklenti.example/webhooks",
    "events": [
      "order.created"
    ],
    "active": true,
    "disabledAt": null,
    "createdAt": "2026-09-27T00:00:00.000Z"
  }
]
Tüm yanıt alanları ve türleri
JSON Schema
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string"
      },
      "url": {
        "type": "string",
        "format": "uri"
      },
      "events": {
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "order.created",
            "order.paid",
            "delivery.ready",
            "delivery.assigned",
            "delivery.picked_up",
            "delivery.delivered",
            "delivery.failed"
          ]
        }
      },
      "active": {
        "type": "boolean"
      },
      "disabledAt": {
        "type": "string",
        "format": "date-time",
        "nullable": true
      },
      "createdAt": {
        "type": "string",
        "format": "date-time"
      }
    },
    "required": [
      "id",
      "url",
      "events",
      "active",
      "disabledAt",
      "createdAt"
    ]
  }
}

200 Success400 Invalid request or resource state401 Missing/expired token, revoked installation, or app removed403 APP_APPROVAL_REQUIRED (including TEST), missing scope, inactive subscription or delivery restriction404 Resource not found within the installation429 Rate or hourly quota exceeded

POST/webhooksWebhook alıcısı oluştur

İzin: webhooks:manage

No idempotency-key support. Check GET /webhooks before retrying a create after a network timeout; a duplicate request creates another endpoint. Secret is returned once.

İstek gövdesi · application/json

JSON Schema
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Public HTTPS URL on port 443; credentials, redirects and private hosts are rejected.",
      "format": "uri",
      "maxLength": 2048
    },
    "events": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "order.created",
          "order.paid",
          "delivery.ready",
          "delivery.assigned",
          "delivery.picked_up",
          "delivery.delivered",
          "delivery.failed"
        ],
        "maxLength": 64
      },
      "minItems": 1
    }
  },
  "required": [
    "url",
    "events"
  ]
}

Başarılı yanıt · 201

Yanıt örneği
{
  "id": "example",
  "url": "https://eklenti.example/webhooks",
  "events": [
    "order.created"
  ],
  "active": true,
  "disabledAt": null,
  "createdAt": "2026-09-27T00:00:00.000Z",
  "secret": "example"
}
Tüm yanıt alanları ve türleri
JSON Schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "url": {
      "type": "string",
      "format": "uri"
    },
    "events": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "order.created",
          "order.paid",
          "delivery.ready",
          "delivery.assigned",
          "delivery.picked_up",
          "delivery.delivered",
          "delivery.failed"
        ]
      }
    },
    "active": {
      "type": "boolean"
    },
    "disabledAt": {
      "type": "string",
      "format": "date-time",
      "nullable": true
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "secret": {
      "type": "string",
      "description": "Signing secret; returned once at creation."
    }
  },
  "required": [
    "id",
    "url",
    "events",
    "active",
    "disabledAt",
    "createdAt",
    "secret"
  ]
}

201 Success400 Invalid request or resource state401 Missing/expired token, revoked installation, or app removed403 APP_APPROVAL_REQUIRED (including TEST), missing scope, inactive subscription or delivery restriction404 Resource not found within the installation429 Rate or hourly quota exceeded

DELETE/webhooks/{id}Webhook alıcısını kapat

İzin: webhooks:manage

Soft disable; repeating for your already-disabled endpoint succeeds. No public re-enable endpoint: register a new endpoint and store its new secret.

ParametreKonum / türAçıklama
id *path / stringResource identifier.
{"type":"string"}

Başarılı yanıt · 200

Yanıt örneği
{
  "id": "example",
  "active": false
}
Tüm yanıt alanları ve türleri
JSON Schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "active": {
      "type": "boolean",
      "enum": [
        false
      ]
    }
  },
  "required": [
    "id",
    "active"
  ]
}

200 Success400 Invalid request or resource state401 Missing/expired token, revoked installation, or app removed403 APP_APPROVAL_REQUIRED (including TEST), missing scope, inactive subscription or delivery restriction404 Resource not found within the installation429 Rate or hourly quota exceeded

GET/webhooks/{id}/deliveriesWebhook teslimat kayıtları

İzin: webhooks:manage

ParametreKonum / türAçıklama
id *path / stringResource identifier.
{"type":"string"}
limitquery / integerPage size.
{"type":"integer","minimum":1,"maximum":100,"default":25}
cursorquery / stringPass the previous nextCursor unchanged. Stop when null.
{"type":"string","maxLength":64}

Başarılı yanıt · 200

Yanıt örneği
{
  "data": [
    {
      "id": "example",
      "eventType": "example",
      "status": "PENDING",
      "attempts": 0,
      "responseCode": null,
      "lastError": null,
      "createdAt": "2026-09-27T00:00:00.000Z"
    }
  ],
  "nextCursor": null
}
Tüm yanıt alanları ve türleri
JSON Schema
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "eventType": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "PENDING",
              "DELIVERED",
              "FAILED"
            ]
          },
          "attempts": {
            "type": "integer"
          },
          "responseCode": {
            "type": "integer",
            "nullable": true
          },
          "lastError": {
            "type": "string",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "eventType",
          "status",
          "attempts",
          "responseCode",
          "lastError",
          "createdAt"
        ]
      }
    },
    "nextCursor": {
      "type": "string",
      "nullable": true
    }
  },
  "required": [
    "data",
    "nextCursor"
  ]
}

200 Success400 Invalid request or resource state401 Missing/expired token, revoked installation, or app removed403 APP_APPROVAL_REQUIRED (including TEST), missing scope, inactive subscription or delivery restriction404 Resource not found within the installation429 Rate or hourly quota exceeded

GET/deliveries/{runId}Kurye seferi

İzin: deliveries:read

Requires a courier installation created by granting deliveries:write. Reads only that installation’s courier runs.

ParametreKonum / türAçıklama
runId *path / stringResource identifier.
{"type":"string"}

Başarılı yanıt · 200

Yanıt örneği
{
  "id": "example",
  "status": "example",
  "startedAt": null,
  "completedAt": null,
  "routeDistanceMeters": null,
  "routeDurationSeconds": null,
  "orders": [
    {
      "id": "example",
      "status": "example"
    }
  ],
  "location": {
    "lat": 0,
    "lng": 0,
    "at": "2026-09-27T00:00:00.000Z"
  }
}
Tüm yanıt alanları ve türleri
JSON Schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "status": {
      "type": "string"
    },
    "startedAt": {
      "type": "string",
      "format": "date-time",
      "nullable": true
    },
    "completedAt": {
      "type": "string",
      "format": "date-time",
      "nullable": true
    },
    "routeDistanceMeters": {
      "type": "integer",
      "nullable": true
    },
    "routeDurationSeconds": {
      "type": "integer",
      "nullable": true
    },
    "orders": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "status"
        ]
      }
    },
    "location": {
      "type": "object",
      "properties": {
        "lat": {
          "type": "number"
        },
        "lng": {
          "type": "number"
        },
        "at": {
          "type": "string",
          "format": "date-time"
        }
      },
      "required": [
        "lat",
        "lng",
        "at"
      ],
      "nullable": true
    }
  },
  "required": [
    "id",
    "status",
    "startedAt",
    "completedAt",
    "routeDistanceMeters",
    "routeDurationSeconds",
    "orders",
    "location"
  ]
}

200 Success400 Invalid request or resource state401 Missing/expired token, revoked installation, or app removed403 APP_APPROVAL_REQUIRED (including TEST), missing scope, inactive subscription or delivery restriction404 Resource not found within the installation429 Rate or hourly quota exceeded

POST/deliveries/{runId}/departYola çıkış

İzin: deliveries:write

ASSIGNED → ON_ROUTE. Moves assigned orders to OUT_FOR_DELIVERY. A second depart fails with INVALID_RUN_STATE; reconcile GET before retrying.

ParametreKonum / türAçıklama
runId *path / stringResource identifier.
{"type":"string"}

Başarılı yanıt · 201

Yanıt örneği
{
  "ok": true,
  "orders": 0
}
Tüm yanıt alanları ve türleri
JSON Schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean"
    },
    "orders": {
      "type": "integer"
    }
  },
  "required": [
    "ok",
    "orders"
  ]
}

201 Success400 Invalid request or resource state401 Missing/expired token, revoked installation, or app removed403 APP_APPROVAL_REQUIRED (including TEST), missing scope, inactive subscription or delivery restriction404 Resource not found within the installation429 Rate or hourly quota exceeded

POST/deliveries/{runId}/pingsKonum gönder

İzin: deliveries:write

The implementation resolves the active run from the authenticated courier and does not use runId to select a run. Send your assigned active run ID. Pings may be dropped with stored=false / THROTTLED; do not immediately retry.

ParametreKonum / türAçıklama
runId *path / stringResource identifier.
{"type":"string"}

İstek gövdesi · application/json

JSON Schema
{
  "type": "object",
  "properties": {
    "lat": {
      "type": "number",
      "minimum": -90,
      "maximum": 90
    },
    "lng": {
      "type": "number",
      "minimum": -180,
      "maximum": 180
    },
    "accuracyM": {
      "type": "number"
    },
    "headingDeg": {
      "type": "number"
    },
    "speedMps": {
      "type": "number"
    },
    "recordedAt": {
      "type": "string",
      "format": "date-time"
    }
  },
  "required": [
    "lat",
    "lng"
  ]
}

Başarılı yanıt · 201

Yanıt örneği
{
  "stored": true,
  "requeried": true
}
Tüm yanıt alanları ve türleri
JSON Schema
{
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "stored": {
          "type": "boolean",
          "enum": [
            true
          ]
        },
        "requeried": {
          "type": "boolean"
        }
      },
      "required": [
        "stored",
        "requeried"
      ]
    },
    {
      "type": "object",
      "properties": {
        "stored": {
          "type": "boolean",
          "enum": [
            false
          ]
        },
        "reason": {
          "type": "string",
          "enum": [
            "THROTTLED"
          ]
        }
      },
      "required": [
        "stored",
        "reason"
      ]
    }
  ]
}

201 Success400 Invalid request or resource state401 Missing/expired token, revoked installation, or app removed403 APP_APPROVAL_REQUIRED (including TEST), missing scope, inactive subscription or delivery restriction404 Resource not found within the installation429 Rate or hourly quota exceeded

POST/deliveries/orders/{orderId}/deliveredTeslim edildi bildirimi

İzin: deliveries:write

Requires assigned order OUT_FOR_DELIVERY, fresh GPS near drop-off, and restaurant-selected proof. CODE requires code; PHOTO/SIGNATURE require a platform-issued upload unavailable through public v1. Do not treat these modes as a complete external-only integration.

ParametreKonum / türAçıklama
orderId *path / stringResource identifier.
{"type":"string"}

İstek gövdesi · application/json

JSON Schema
{
  "type": "object",
  "properties": {
    "code": {
      "type": "string",
      "description": "Required when the restaurant uses CODE proof mode.",
      "maxLength": 16
    },
    "proofRef": {
      "type": "string",
      "description": "PHOTO/SIGNATURE require a platform-issued upload. The public v1 API has no proof-upload endpoint; do not submit an arbitrary URL.",
      "maxLength": 500
    }
  },
  "required": []
}

Başarılı yanıt · 201

Yanıt örneği
{
  "ok": true
}
Tüm yanıt alanları ve türleri
JSON Schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean"
    }
  },
  "required": [
    "ok"
  ]
}

201 Success400 Invalid request or resource state401 Missing/expired token, revoked installation, or app removed403 APP_APPROVAL_REQUIRED (including TEST), missing scope, inactive subscription or delivery restriction404 Resource not found within the installation429 Rate or hourly quota exceeded

POST/deliveries/orders/{orderId}/failedTeslim edilemedi bildirimi

İzin: deliveries:write

Requires an assigned OUT_FOR_DELIVERY order. No general idempotency header support; reconcile order state after an ambiguous response.

ParametreKonum / türAçıklama
orderId *path / stringResource identifier.
{"type":"string"}

İstek gövdesi · application/json

JSON Schema
{
  "type": "object",
  "properties": {
    "reason": {
      "type": "string",
      "enum": [
        "CUSTOMER_ABSENT",
        "WRONG_ADDRESS",
        "CUSTOMER_REJECTED",
        "OTHER"
      ]
    },
    "note": {
      "type": "string",
      "description": "Accepted by validation; currently not persisted by the delivery service.",
      "maxLength": 200
    }
  },
  "required": [
    "reason"
  ]
}

Başarılı yanıt · 201

Yanıt örneği
{
  "ok": true
}
Tüm yanıt alanları ve türleri
JSON Schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean"
    }
  },
  "required": [
    "ok"
  ]
}

201 Success400 Invalid request or resource state401 Missing/expired token, revoked installation, or app removed403 APP_APPROVAL_REQUIRED (including TEST), missing scope, inactive subscription or delivery restriction404 Resource not found within the installation429 Rate or hourly quota exceeded

Entegrasyon desteği

Uygulama kimliğinizi, uç noktayı ve hata kodunu iletin. Token veya gizli anahtar göndermeyin.

support@digimenu.us