Delivery Partner API

Kurye firmaları ŞimdiSöyle restoranlarından teslimat işi alır. İşleri kendi yazılımınla API ve webhook üzerinden yönetebilirsin. Yazılımın yoksa firma paneli yeterli.

Başlangıç

  1. Firma olarak kaydol; yönetici onayından sonra panele girersin.
  2. Panelde Entegrasyon bölümünden API anahtarı üret. Anahtar yalnızca bir kez gösterilir.
  3. Restoranlar sana çalışma isteği gönderir, sen onaylarsın. Onaylı restoranlar “Kurye çağır” der ve iş sana gelir.

Her istekte anahtarı gönder. Adres: https://simdisoyle.com/api/partner/v1

curl https://simdisoyle.com/api/partner/v1/me \
  -H "Authorization: Bearer ssk_live_..."

İş akışı

offered ──► accepted ──► assigned ──► picked_up ──► delivered
   │            │             │              └──► (failed bildirilir)
   ├─► rejected └──► cancelled
   └─► expired (5 dk içinde yanıt yoksa)

İstekler

İstekNe yapar
GET /meAnahtarın hangi firmaya ait olduğunu gösterir.
GET /jobs?status=openopen, offered, closed ya da all.
GET /jobs/{id}Tek işi getirir.
POST /jobs/{id}/acceptKabul eder. İsteğe bağlı fee_cents.
POST /jobs/{id}/rejectReddeder. İsteğe bağlı reason.
POST /jobs/{id}/assigncourier_name (zorunlu), courier_phone. Henüz kabul edilmediyse önce kabul eder.
POST /jobs/{id}/picked-upKurye siparişi aldı.
POST /jobs/{id}/deliveredTeslim edildi.
POST /jobs/{id}/failedTeslim edilemedi. reason gönder.
POST /jobs/{id}/cancelKurye almadan önce işi bırakır. reason gönder.
POST /jobs/{id}/locationlat, lng gönderir.
POST /webhook/testWebhook adresine test olayı yollar.

Örnek: kurye ata

curl -X POST https://simdisoyle.com/api/partner/v1/jobs/job_8f3a2c19d04e7b61/assign \
  -H "Authorization: Bearer ssk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"courier_name":"Mehmet Yılmaz","courier_phone":"05321234567"}'

İş nesnesi

{
  "job": {
    "id": "job_8f3a2c19d04e7b61",
    "status": "accepted",
    "reference": "1042",
    "created_at": "2026-10-17T09:12:03.000Z",
    "expires_at": null,
    "pickup": {
      "name": "Lezzet Sofrası",
      "address": "Atatürk Cd. No:12, Moda Mah., Kadıköy, İstanbul",
      "phone": "02161234567",
      "latitude": 40.9871,
      "longitude": 29.0253,
      "ready": false
    },
    "dropoff": {
      "address": "Bahariye Cd. 45/3 Kadıköy",
      "customer_name": "Ayşe K.",
      "customer_phone": "05551112233",
      "note": "Zili çalmayın, arayın"
    },
    "payment": { "method": "cash_on_delivery", "collect_cents": 18500 },
    "order": { "total_cents": 18500, "items_count": 3, "scheduled_for": null },
    "courier": null,
    "fee_cents": null,
    "accepted_at": "2026-10-17T09:13:10.000Z",
    "assigned_at": null,
    "picked_up_at": null,
    "delivered_at": null,
    "closed_at": null,
    "close_reason": null,
    "issue": null
  }
}

Tutarlar kuruş cinsindendir. payment.method: prepaid (tahsilat yok), cash_on_delivery, card_on_delivery.

Webhook

Panelde bir https adresi kaydedersen olaylar oraya POST edilir. Kaydederken bir imza anahtarı (whsec_…) bir kez gösterilir.

POST https://firmaniz.com/webhooks/simdisoyle
Content-Type: application/json
X-SimdiSoyle-Event: job.offered
X-SimdiSoyle-Delivery: evt_a1b2c3d4e5f6a7b8c9d0
X-SimdiSoyle-Signature: t=1760692323,v1=5b1e...

{
  "id": "evt_a1b2c3d4e5f6a7b8c9d0",
  "type": "job.offered",
  "created": "2026-10-17T09:12:03.000Z",
  "data": { "job": { ... } }
}
job.offeredRestoran sana yeni bir iş teklif etti. Süre dolmadan kabul et ya da reddet.
job.acceptedİş kabul edildi. Müşteri adı ve telefonu artık işte görünür.
job.rejectedİş reddedildi.
job.assignedBir kurye atandı.
job.readyMutfak siparişi hazırladı; kurye alabilir.
job.picked_upKurye siparişi aldı.
job.deliveredSipariş teslim edildi.
job.failedTeslim edilemedi. Sonraki adıma restoran karar verir.
job.cancelledİş iptal edildi (restoran ya da sen).
order.amount_changedTeslimatta ürün reddi nedeniyle sipariş tutarı değişti. job.payment.collect_cents yeni tahsilat tutarıdır; change alanında çıkarılan ürünler ve yeni toplam vardır.
job.expiredTeklife süresinde yanıt verilmedi.
pingPanelden gönderilen test olayı.

İmzayı doğrula

İmza, t + "." + ham_gövde metninin HMAC-SHA256 değeridir (anahtar: imza anahtarın). Ham gövdeyi değiştirmeden kullan; zaman damgası 5 dakikadan eskiyse reddet.

import crypto from "crypto";

function verify(rawBody, header, secret) {
  const p = Object.fromEntries(header.split(",").map((x) => x.split("=")));
  if (Math.abs(Date.now() / 1000 - Number(p.t)) > 300) return false;
  const mac = crypto.createHmac("sha256", secret).update(p.t + "." + rawBody).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(mac), Buffer.from(p.v1));
}

Hatalar ve limitler

{ "error": { "code": "order_not_ready", "message": "Sipariş henüz hazır değil." } }