yigitfy API

Siparişlerini, kargo etiketlerini ve gönderilerini kendi sistemine bağla. Sürüm 1.0.0 · kök adres https://api.yigitfy.com/v1

Başlarken

API belirtecini panelden alırsın: https://dashboard.yigitfy.com → Ayarlar → API Erişimi → Yeni belirteç. Belirteç yalnızca bir kez gösterilir; kaybedersen yenisini üretmen gerekir.

Belirteci tarayıcıya koyma. Bu API sunucudan sunucuya kullanım içindir ve bilerek hiçbir CORS başlığı göndermez — tarayıcıdan doğrudan çağrılamaz. Belirteci istemci tarafı JavaScript'e koyarsan sayfayı açan herkes onu görür. Çağrıları kendi arka ucundan yap.

İlk istek

curl -H "Authorization: Bearer yf_live_..." \
     "https://api.yigitfy.com/v1/me"

Kimlik doğrulama

Her istekte Authorization: Bearer <belirteç> başlığı gerekir. Panel oturum çerezi kabul edilmez. Belirteç yf_live_ ile başlar; bu önek sızıntı taraması ve günlükte tanımlama içindir, sırrın kendisi değildir.

Kapsamlar

Her belirteç yalnızca kendisine verilen kapsamlarda çalışır. x:yaz seçtiğinde x:oku kendiliğinden eklenir. Yetersiz kapsamda uç 403 insufficient_scope döner.

KapsamAdKapsadığı
Satış ve operasyon
panel:oku
panel:yaz
PanelÖzet satış istatistikleri, günlük grafik ve kurulum durumu
siparisler:oku
siparisler:yaz
SiparişlerSipariş listesi, arama ve sipariş detayı
etiket:oku
etiket:yaz
Kargo etiketiEtiket yazdırma, yazdırıldı işareti, kargo (MNG/Sürat) gönderi/takip senkronu ve etiket geçmişi
iade:oku
iade:yaz
İade takibiTeslim edilemeyen gönderiler, arama defteri ve iade durumu
musteriler:oku
musteriler:yaz
MüşterilerMüşteri listesi, detay ve iletişim bilgisi düzenleme
risk:oku
risk:yaz
Kontrol bekleyen siparişlerŞüpheli sipariş listesi, bağlantılı kayıtlar, kara/beyaz liste (sipariş iptali yalnız hesap sahibinde)
Katalog ve stok
urunler:oku
urunler:yaz
ÜrünlerÜrün oluşturma, düzenleme, görsel ve Trendyol stok/fiyat
stok:oku
stok:yaz
Stok yönetimiStok kartları, hareketler, kanal eşleştirme ve senkron kuyruğu
tedarik:oku
tedarik:yaz
TedarikTedarikçiler, satın alma siparişleri ve mal kabul
Finans
raporlar:oku
raporlar:yaz
Kâr raporlarıKâr/zarar raporları, ürün ve mağaza maliyet ayarları
reklamlar:oku
reklamlar:yaz
ReklamlarReklam gideri girişi ve Meta reklam hesabı senkronu
vergi:oku
vergi:yaz
Vergi takibiKDV, gelir/kurumlar ve diğer vergi kayıtları

Uçlar

YöntemYolKapsamAçıklama
GET/v1/health—Servis durumu (kimlik gerektirmez)
GET/v1/label-batchesetiket:okuEtiket basım geçmişi (partiler)
GET/v1/label-batches/{batch_id}/pdfetiket:okuPartinin etiketlerini 100x100 mm PDF olarak indirir. ?labelType=kargo ile taşıyıcının kendi (ZPL) etiketi üretilir. · ağır uç
POST/v1/label-batches/{batch_id}/undoetiket:yazPartiyi geri alır: 'yazdırıldı' işaretleri kalkar, Shopify kargo kayıtları iptal edilir; cancelShipments=true ile taşıyıcıdaki gönderiler de iptal edilip silinir (okutulmuş paketler atlanır). · ağır uç · Idempotency-Key zorunlu
POST/v1/label-jobsetiket:yazKargo etiketi basım işi başlatır. HER ZAMAN asenkrondur (202 + işId): tek etiket ortak barkod açıkken 31-64 saniye sürebilir. · ağır uç · Idempotency-Key zorunlu
GET/v1/label-jobs/{job_id}etiket:okuBasım işinin durumu. ?wait=0..30 ile uzun yoklama yapılabilir.
GET/v1/label-settingsetiket:okuVarsayılan taşıyıcı, kargo kuralları ve taşıyıcı bağlantı durumu (kimlik bilgisi DÖNMEZ)
GET/v1/me—Belirteç sahibinin hesabı, paketi ve kalan kotası
GET/v1/openapi.json—Makine okunabilir OpenAPI 3.1 şeması
GET/v1/orderssiparisler:okuSipariş listesi — imleçle sayfalanır, gönderi ve basım bilgisi dâhil · orta maliyet
GET/v1/orders/{order_id:path}siparisler:okuTek siparişin detayı · orta maliyet
GET/v1/productsurunler:okuÜrün listesi · orta maliyet
GET/v1/reports/profitraporlar:okuTarih aralığı için kâr/zarar raporu · ağır uç
GET/v1/returnsiade:okuTeslim edilemeyen ve iade sürecindeki gönderiler · orta maliyet
GET/v1/scopes—Tüm kapsamlar ve açıklamaları
GET/v1/shipments/{order_id:path}etiket:okuSiparişin kargo gönderisi: takip numarası, taşıyıcı, durum
GET/v1/storespanel:okuHesaba bağlı mağazaların listesi

Sayfalama

Liste uçları tek bir sözleşme kullanır:

{
  "data": [ ... ],
  "hasMore": true,
  "nextCursor": "djE6eyJrIjoi..."
}

Sonraki sayfa için ?cursor=<nextCursor> gönder. İmleç opaktır — içeriğini ayrıştırma, olduğu gibi geri gönder. limit varsayılan 50, tavan 200 (ürünlerde 100). Sayfa numarası yoktur: Shopify imleçleri yalnız "sonraki"yi bilir, sayfa numarası vaat etmek her istekte baştan yürümek demekti.

Hatalar

Tüm hatalar makine okunabilir bir zarfla döner:

{
  "error": {
    "code": "insufficient_scope",
    "message": "Bu uç 'etiket:yaz' kapsamı gerektiriyor.",
    "field": "orderIds",
    "requestId": "a1b2c3d4e5f60718"
  }
}
KodHTTPAnlamı
unauthorized401Belirteç yok ya da başlık biçimi yanlış
belirtec_gecersiz401Belirteç tanınmadı
belirtec_iptal401Belirteç iptal edilmiş
belirtec_suresi_doldu401Belirtecin süresi dolmuş
ip_izinli_degil401Belirteç bu IP'ye kapalı
insufficient_scope403Kapsam yetersiz
store_not_found404Mağaza yok ya da sana ait değil
batch_not_found404Basım partisi yok ya da sana ait değil
batch_undone410Parti geri alınmış; PDF üretilemez, yeniden geri alınamaz
invalid_parameter400Parametre geçersiz (field hangisi olduğunu söyler)
already_printed409Sipariş açık bir partide zaten basılmış
channel_not_supported409Bu kanal bu uçta desteklenmiyor
idempotency_conflict409Aynı anahtar farklı gövdeyle kullanıldı
idempotency_in_progress409Aynı anahtarlı istek hâlâ işleniyor
quota_exceeded402Aylık etiket kotan doldu
subscription_inactive402Abonelik aktif değil
rate_limited429Hız limiti aşıldı
upstream_error502Shopify/kargo tarafında hata

Hız limitleri

Belirteç başına, yaklaşık: normal uçlar 120/dakika, ağır uçlar (etiket basımı, rapor, PDF) 6/dakika. Yanıtlarda X-RateLimit-Limit, X-RateLimit-Remaining ve X-RateLimit-Reset başlıkları gelir; 429 aldığında Retry-After saniye bekle.

Limitler her sunucu süreci için ayrı sayılır ve sunucu iki süreçle çalışır — gerçek tavan ilan edilenin iki katına kadar çıkabilir. Buna güvenme, X-RateLimit-Remaining başlığını oku.

Tekrar koruması (Idempotency)

Yazma uçlarında Idempotency-Key başlığı zorunludur. İstek başına benzersiz bir değer üret (örneğin UUID) ve aynı isteği yeniden denerken aynı anahtarı gönder.

Bu koruma gerçek bir hatayı engelliyor: aynı basım isteği iki kez işlenirse ikinci parti açılır, siparişler ona taşınır, ilk parti boş kalır ve geri alınamaz hâle gelir — üstelik etiket kotan iki kez düşer.

Örnek akış: ERP'den sipariş çek, etiket bastır

import requests, uuid, time

KOK = "https://api.yigitfy.com/v1"
BAS = {"Authorization": "Bearer yf_live_..."}

# 1) Mağazayı bul
magaza = requests.get(f"{KOK}/stores", headers=BAS).json()["data"][0]

# 2) Basılmamış siparişleri çek (imleçle sayfala)
siparisler, imlec = [], None
while True:
    p = {"storeId": magaza["id"], "status": "unfulfilled", "limit": 100}
    if imlec:
        p["cursor"] = imlec
    y = requests.get(f"{KOK}/orders", headers=BAS, params=p).json()
    siparisler += [o for o in y["data"] if not o["printedAt"]]
    imlec = y["nextCursor"]
    if not imlec:
        break

# 3) Etiket işi başlat (ASENKRON — 202 döner)
is_ = requests.post(f"{KOK}/label-jobs", headers={**BAS,
        "Idempotency-Key": str(uuid.uuid4())},
        json={"storeId": magaza["id"],
              "orderIds": [o["id"] for o in siparisler[:50]]}).json()

# 4) Bitmesini bekle (uzun yoklama: sunucu 30 sn'ye kadar tutar)
while True:
    d = requests.get(f"{KOK}/label-jobs/{is_['jobId']}",
                     headers=BAS, params={"wait": 30}).json()
    if d["status"] != "calisiyor":
        break
# 'bitti' olsa da kargo firmasında gönderi açılamayan sipariş PARTİDEN DÜŞER:
# d["dropped"] = [{orderId, orderName, reason}], d["printedCount"] = partide kalan.
# printedCount 0 ise PDF isteği 404 batch_empty döner — düşenleri kullanıcıya göster.
for dus in d.get("dropped") or []:
    print("basılamadı:", dus["orderName"], dus["reason"])

# 5) Etiketleri PDF olarak indir
pdf = requests.get(f"{KOK}/label-batches/{is_['batchId']}/pdf",
                   headers=BAS, params={"storeId": magaza["id"]}).content
open("etiketler.pdf", "wb").write(pdf)

# 6) Takip numaralarını ERP'ye yaz
for o in siparisler[:50]:
    g = requests.get(f"{KOK}/shipments/{o['id']}", headers=BAS,
                     params={"storeId": magaza["id"]}).json()
    print(o["name"], g["trackingNumber"], g["trackingUrl"])
Etiket basımı her zaman asenkrondur. Tek bir etiket, ortak barkod açıkken 30-60 saniye sürebilir (kargo firmasının varış şubesini ataması beklenir). Bu yüzden senkron basım ucu yoktur; istemci zaman aşımını en az 60 saniye yap.

Etiket türü ve ortak barkod

POST /v1/label-jobs gövdesinde iki isteğe bağlı alan var:

Partiyi geri alma

POST /v1/label-batches/{id}/undo (etiket:yaz, Idempotency-Key zorunlu). Gövde:

{"storeId": 1, "cancelFulfillment": true, "cancelShipments": false}
{
  "restored": 12, "cancelledFulfillments": 12, "cancelledShipments": 11,
  "skipped": [{"orderId": "gid://shopify/Order/9", "reason": "Bu gönderi şubede okutulmuş, paket yolda — ..."}],
  "errors": [], "batchUndone": false
}

Zaman aşımı ve yeniden deneme

Bu sürümde olmayanlar

yigitfy · Panel · Sorular için panelden destek talebi açabilirsin.