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
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.
curl -H "Authorization: Bearer yf_live_..." \
"https://api.yigitfy.com/v1/me"
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.
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.
| Kapsam | Ad | Kapsadığı |
|---|---|---|
| Satış ve operasyon | ||
| panel:oku panel:yaz | Panel | Özet satış istatistikleri, günlük grafik ve kurulum durumu |
| siparisler:oku siparisler:yaz | Siparişler | Sipariş listesi, arama ve sipariş detayı |
| etiket:oku etiket:yaz | Kargo etiketi | Etiket 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 takibi | Teslim edilemeyen gönderiler, arama defteri ve iade durumu |
| musteriler:oku musteriler:yaz | Müşteriler | Müş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önetimi | Stok kartları, hareketler, kanal eşleştirme ve senkron kuyruğu |
| tedarik:oku tedarik:yaz | Tedarik | Tedarikç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 | Reklamlar | Reklam gideri girişi ve Meta reklam hesabı senkronu |
| vergi:oku vergi:yaz | Vergi takibi | KDV, gelir/kurumlar ve diğer vergi kayıtları |
| Yöntem | Yol | Kapsam | Açıklama |
|---|---|---|---|
| GET | /v1/health | — | Servis durumu (kimlik gerektirmez) |
| GET | /v1/label-batches | etiket:oku | Etiket basım geçmişi (partiler) |
| GET | /v1/label-batches/{batch_id}/pdf | etiket:oku | Partinin 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}/undo | etiket:yaz | Partiyi 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-jobs | etiket:yaz | Kargo 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:oku | Basım işinin durumu. ?wait=0..30 ile uzun yoklama yapılabilir. |
| GET | /v1/label-settings | etiket:oku | Varsayı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/orders | siparisler:oku | Sipariş listesi — imleçle sayfalanır, gönderi ve basım bilgisi dâhil · orta maliyet |
| GET | /v1/orders/{order_id:path} | siparisler:oku | Tek siparişin detayı · orta maliyet |
| GET | /v1/products | urunler:oku | Ürün listesi · orta maliyet |
| GET | /v1/reports/profit | raporlar:oku | Tarih aralığı için kâr/zarar raporu · ağır uç |
| GET | /v1/returns | iade:oku | Teslim 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:oku | Siparişin kargo gönderisi: takip numarası, taşıyıcı, durum |
| GET | /v1/stores | panel:oku | Hesaba bağlı mağazaların listesi |
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.
Tüm hatalar makine okunabilir bir zarfla döner:
{
"error": {
"code": "insufficient_scope",
"message": "Bu uç 'etiket:yaz' kapsamı gerektiriyor.",
"field": "orderIds",
"requestId": "a1b2c3d4e5f60718"
}
}
| Kod | HTTP | Anlamı |
|---|---|---|
| unauthorized | 401 | Belirteç yok ya da başlık biçimi yanlış |
| belirtec_gecersiz | 401 | Belirteç tanınmadı |
| belirtec_iptal | 401 | Belirteç iptal edilmiş |
| belirtec_suresi_doldu | 401 | Belirtecin süresi dolmuş |
| ip_izinli_degil | 401 | Belirteç bu IP'ye kapalı |
| insufficient_scope | 403 | Kapsam yetersiz |
| store_not_found | 404 | Mağaza yok ya da sana ait değil |
| batch_not_found | 404 | Basım partisi yok ya da sana ait değil |
| batch_undone | 410 | Parti geri alınmış; PDF üretilemez, yeniden geri alınamaz |
| invalid_parameter | 400 | Parametre geçersiz (field hangisi olduğunu söyler) |
| already_printed | 409 | Sipariş açık bir partide zaten basılmış |
| channel_not_supported | 409 | Bu kanal bu uçta desteklenmiyor |
| idempotency_conflict | 409 | Aynı anahtar farklı gövdeyle kullanıldı |
| idempotency_in_progress | 409 | Aynı anahtarlı istek hâlâ işleniyor |
| quota_exceeded | 402 | Aylık etiket kotan doldu |
| subscription_inactive | 402 | Abonelik aktif değil |
| rate_limited | 429 | Hız limiti aşıldı |
| upstream_error | 502 | Shopify/kargo tarafında hata |
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.
X-RateLimit-Remaining başlığını oku.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.
Idempotency-Replayed: true), iş tekrar yapılmaz.409 idempotency_conflict.409 idempotency_in_progress.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"])
POST /v1/label-jobs gövdesinde iki isteğe bağlı alan var:
commonBarcode (true / false / yok):
MNG'de gerçek gönderi barkodu üretilsin mi. Gönderilmezse mağaza ayarı
geçerlidir (GET /v1/label-settings → mng.commonBarcode).
Açıkça gönderilen değer, paneldeki gibi mağaza ayarına da yazılır.
true iken tek etiket 30-60 saniye sürebilir; false
beklemeden referans etiketi basar, şube okutup gönderiye çevirir. Sürat'ı
etkilemez.labelType (boş / panel / kargo): yalnız
doğrulanır, iş kaydında saklanmaz. Etiket türü PDF indirilirken seçilir:
GET /v1/label-batches/{id}/pdf?labelType=kargo taşıyıcının kendi
(ZPL) etiketini verir, boş ya da panel yigitfy'nin 100x100 etiketini.
Aynı parti iki türde de indirilebilir.POST /v1/label-batches/{id}/undo (etiket:yaz,
Idempotency-Key zorunlu). Gövde:
{"storeId": 1, "cancelFulfillment": true, "cancelShipments": false}
cancelShipments: false — paneldeki "geri al" ile aynı: 'yazdırıldı'
işaretleri kalkar, parti kapanır, cancelFulfillment açıksa Shopify
kargo kayıtları iptal edilir. Taşıyıcıdaki gönderiye dokunulmaz (barkod
açık kalır; yeniden basım aynı barkodu kullanmaz).cancelShipments: true — partideki her sipariş için sırayla:
taşıyıcıda iptal (MNG ya da Sürat, kaydın taşıyıcısına göre), Shopify kargo
kaydı iptali, 'yazdırıldı' kaldırma ve gönderi kaydının silinmesi. Şubede
okutulmuş / yoldaki paket geri çağrılamaz: o sipariş skipped'a
düşer ve basılmış kalır; parti ancak içinde sipariş kalmayınca kapanır
(batchUndone). Taşıyıcı reddederse sipariş errors'a
düşer, hiçbir şey silinmez; aynı anahtarla yeniden denenebilir.{
"restored": 12, "cancelledFulfillments": 12, "cancelledShipments": 11,
"skipped": [{"orderId": "gid://shopify/Order/9", "reason": "Bu gönderi şubede okutulmuş, paket yolda — ..."}],
"errors": [], "batchUndone": false
}
429 ve 502'de üstel geri çekilme + rastgele
sapma (jitter) kullan.Idempotency-Key
değerini gönder.hata durumuna düşer.