İnfudex E-Ticaret Otomasyon

Geliştiriciler

İnfudex E-Ticaret Otomasyon API

Siparişlerinizi, ürünlerinizi ve stoklarınızı kendi yazılımınızdan (ERP, depo, muhasebe, kendi siteniz) okuyun ve güncelleyin. Bütün kanallardaki veriler tek API’de; takip numarası ve stok değişiklikleri pazaryerlerine kendiliğinden iletilir.

https://infudex.com/api/v1
OpenAPI 3.1 Ücretsiz hesap aç

Başlarken

API erişimi şu paketlerde: İnfudex Prime. Paketleri karşılaştır

  1. Panelde Ayarlar → API sayfasından bir anahtar oluşturun. Yalnızca ihtiyacınız olan izinleri seçin.
  2. Anahtar yalnızca bir kez gösterilir; parola yöneticinize ya da sunucunuzun gizli değişkenlerine (ör. INFUDEX_API_KEY) kaydedin.
  3. İlk isteği /me ucuna atın: anahtar doğruysa çalışma alanınızın adı ve anahtarın izinleri döner.
curl "https://infudex.com/api/v1/me" \
  -H "Authorization: Bearer $INFUDEX_API_KEY"
$ch = curl_init('https://infudex.com/api/v1/orders?status=paid&per_page=50');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer '.getenv('INFUDEX_API_KEY'), 'Accept: application/json'],
]);
$orders = json_decode(curl_exec($ch), true);
foreach ($orders['data'] as $order) {
    echo $order['number'], ' ', $order['total'] / 100, ' ', $order['currency'], PHP_EOL;
}
const res = await fetch('https://infudex.com/api/v1/orders?status=paid&per_page=50', {
  headers: { Authorization: `Bearer ${process.env.INFUDEX_API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error.message);
const { data, links } = await res.json();
data.forEach(o => console.log(o.number, o.total / 100, o.currency));
import os, requests

r = requests.get(
    'https://infudex.com/api/v1/orders',
    params={'status': 'paid', 'per_page': 50},
    headers={'Authorization': f"Bearer {os.environ['INFUDEX_API_KEY']}"},
    timeout=30,
)
r.raise_for_status()
for o in r.json()['data']:
    print(o['number'], o['total'] / 100, o['currency'])

Sık kullanılan akışlar

Kendi sitenizin siparişlerini panele aktarın

  1. Kanallar → Kanal ekle → Özel kanal (ör. “Web sitem”). Siparişler pazaryerleri gibi bu kanalın adıyla görünür; raporlar ve filtreler kanal bazında çalışır.
  2. Sitenizde sipariş oluşunca POST /orders gönderin; external_id olarak kendi sipariş numaranızı verin.
  3. Kargoya verince POST /orders/{id}/shipments, iptal / teslimde POST /orders/{id}/status.
POST /orders →

Pazaryeri siparişlerini sisteminize alın

  1. Panel bağlı pazaryerlerini düzenli senkronlar; beklemek istemezseniz POST /shops/{id}/sync ile hemen çektirin.
  2. GET /orders?updated_since=…&sort=updated_at ile yeni ve değişen siparişleri sisteminize (ERP, depo) alın.
  3. Takip numarasını POST /orders/{id}/shipments ile ekleyin; pazaryerine de iletilir.
POST /shops/{id}/sync →

Stoğu tek yerden yönetin

Ürünlerinizi POST /products ile açın ya da GET /products ile eşleyin; depo yazılımınızdaki değişikliği PUT /products/{id}/stock ile gönderin. Stok senkronu açıksa yeni adet bütün pazaryerlerine kendiliğinden iletilir.

Kimlik doğrulama

Her istekte anahtarı Authorization başlığında Bearer olarak gönderin. Adreste (?key=) ya da gövdede gönderilen anahtar kabul edilmez; bu sayede anahtar sunucu günlüklerine ve tarayıcı geçmişine düşmez.

Authorization: Bearer ifx_••••••••••••••••••••••••••••••••••••••••••••••••
  • Yalnızca HTTPS kabul edilir. Şifresiz (http) bağlantıyla gelen istek, anahtar doğru olsa bile reddedilir; böyle bir istek gönderdiyseniz anahtarı iptal edip yenisini oluşturun.
  • Anahtarlar sunucuda yalnızca özet (SHA-256) olarak saklanır; biz de dahil kimse anahtarınızı sonradan göremez. Kaybederseniz iptal edip yenisini oluşturun.
  • Anahtara son kullanma tarihi ve izinli IP listesi (tek IP ya da CIDR, ör. 203.0.113.0/24) tanımlayabilirsiniz.
  • Anahtar, onu oluşturan kullanıcının yetkisiyle çalışır: kullanıcı çalışma alanından çıkarılırsa anahtar da çalışmaz; rolü Görüntüleyici yapılırsa anahtar yalnızca okuyabilir.
  • Bir IP’den dakikada 20 hatalı anahtar denemesi yapılırsa o IP bir dakika bekletilir.

İzinler

Her anahtar yalnızca seçilen izinlerle çalışır. İzni olmayan bir uca istek 403 insufficient_scope döner.

İzinNe sağlar
shops:readSatış kanallarını görüntüleme
shops:syncPazaryeri senkronunu başlatma (siparişleri panele çekme)
orders:readSiparişleri görüntüleme
orders:writeSipariş oluşturma (kendi sitenizden), durum değiştirme, kargo takip numarası ekleme
products:readÜrünleri ve stokları görüntüleme
products:writeÜrün oluşturma, güncelleme ve stok değiştirme

İstek ve yanıt biçimi

  • Gövdeler JSON’dur (Content-Type: application/json); yanıtlar her zaman JSON döner, hatalar dahil.
  • Kimlikler (id) UUID’dir. Siparişin pazaryerindeki numarası number, pazaryeri kimliği external_id alanındadır.
  • Tutarlar küçük birimde tam sayıdır (kuruş / cent): 31000 = 310,00 TRY. Para birimi currency alanındadır. Kayan nokta yuvarlama hatası olmaz.
  • Tarihler saat dilimiyle ISO 8601’dir (2026-10-10T14:05:00+03:00). Boş değerler null döner, alan kaybolmaz.
  • v1 boyunca var olan alanlar kaldırılmaz ve anlamı değişmez; yeni alanlar eklenebilir. İstemcinizin tanımadığı alanları yok sayın.
  • Her yanıtta X-Request-Id başlığı vardır; destek isterken bu değeri iletin.

Sayfalama ve senkron

Liste uçları page ve per_page (en çok 100) alır; yanıt data, meta ve links içerir. Sonraki sayfa links.next’tedir, son sayfada null olur.

{
    "data": [
        "…"
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 142,
        "last_page": 6
    },
    "links": {
        "next": "https://infudex.com/api/v1/orders?page=2",
        "prev": null
    }
}

Değişiklikleri kaçırmadan senkron tutmak için: /orders?updated_since=<son aldığınız updated_at>&sort=updated_at ile çekin, her sayfayı işledikten sonra son kaydın updated_at değerini saklayın. Aynı kaydı iki kez almak mümkündür; id ile tekilleştirin.

Hatalar

Hatalar her zaman aynı biçimde döner. Programınızda error.code’a göre karar verin; message insan içindir ve değişebilir.

{
    "error": {
        "code": "validation_failed",
        "message": "Geçersiz istek parametreleri.",
        "details": {
            "tracking_number": [
                "Takip numarası alanı zorunludur."
            ]
        },
        "request_id": "0199c3f3-…"
    }
}
HTTPcodeAnlamı
401missing_tokenAuthorization başlığı yok ya da "Bearer <anahtar>" biçiminde değil.
401invalid_tokenAnahtar tanınmadı.
401token_revokedAnahtar iptal edilmiş.
401token_expiredAnahtarın süresi dolmuş.
401token_owner_inactiveAnahtarı oluşturan kullanıcı çalışma alanından çıkarılmış ya da askıya alınmış.
403https_requiredİstek HTTPS ile gönderilmedi.
403ip_not_allowedİstek, anahtarın izinli IP listesi dışından geldi.
403insufficient_scopeAnahtarda bu uç noktanın gerektirdiği izin yok (details.required_scope).
403insufficient_roleAnahtarı oluşturan kullanıcının rolü değişiklik yapmaya yetmiyor.
403workspace_suspendedÇalışma alanı askıya alınmış.
403plan_feature_missingPaketiniz API erişimini içermiyor.
403order_limit_reachedBu ayki sipariş limitine ulaşıldı.
404not_foundKayıt ya da adres bulunamadı (başka çalışma alanının kayıtları da 404 döner).
405method_not_allowedBu adres bu HTTP yöntemini desteklemiyor.
409order_not_shippableSipariş iptal ya da iade edilmiş.
409order_existsBu external_id ile sipariş kanalda zaten var (details.id).
409order_in_progressAynı sipariş şu an başka bir istekte kaydediliyor.
409status_managed_by_channelPazaryeri siparişinin durumu pazaryerinden gelir.
409invalid_status_transitionSipariş bu durumdan istenen duruma geçirilemez (details.current_status).
409shop_not_syncableKanal pazaryerinden senkronlanmaz (özel, manuel, CSV, demo ya da bağlantısı kesik).
409shop_disconnectedKanalın bağlantısı kesilmiş.
409sku_existsBu SKU ile ürün zaten var (details.id).
409duplicate_tracking_numberTakip numarası bu siparişte zaten var.
409product_is_groupGrup ürünün kendi stoğu yok.
409idempotency_in_progressAynı Idempotency-Key ile gönderilen istek hâlâ işleniyor.
422validation_failedParametreler geçersiz; details alan başına hata mesajlarını içerir.
422invalid_idempotency_keyIdempotency-Key biçimi geçersiz.
422idempotency_key_reusedIdempotency-Key farklı bir istekle kullanılmış.
422shipment_failedGönderi kaydedilemedi (ör. aylık etiket limiti); message nedeni yazar.
422stock_would_be_negativeadjust sonrası stok eksiye düşüyor.
422no_custom_channelSiparişin gideceği özel kanal yok; önce Kanallar sayfasından ekleyin.
429rate_limitedDakikalık istek sınırı aşıldı; Retry-After saniye bekleyin.
429too_many_failed_attemptsBu IP’den çok sayıda hatalı anahtar denemesi.
429sync_too_soonKanal 5 dakikadan kısa süre önce senkronlandı; Retry-After saniye bekleyin.
500server_errorBeklenmeyen hata. request_id ile destek ekibine bildirin.

Yeniden deneme: 429 ve 5xx yanıtlarında üstel bekleme ile (1, 2, 4… saniye) yeniden deneyin; 4xx hatalarını (429 hariç) düzeltmeden tekrar göndermeyin.

İstek sınırı

Her anahtar dakikada 120 istek atabilir. Yanıttaki X-RateLimit-Limit ve X-RateLimit-Remaining başlıkları kalan hakkı gösterir; sınır aşılınca 429 rate_limited ve Retry-After (saniye) döner.

Tekrarlanan istekler

Yazma isteklerinde (POST, PUT) Idempotency-Key başlığına işlem başına benzersiz bir değer (ör. UUID) koyun. Bağlantı koptuğu için aynı isteği yeniden gönderirseniz işlem ikinci kez yapılmaz, ilk yanıt aynen döner (Idempotent-Replayed: true). Değer 24 saat saklanır; aynı değeri farklı bir istekle kullanmak 422 idempotency_key_reused döner.

Webhook bildirimleri

Ayarlar → Bildirim hedefleri → Özel Webhook ile yeni sipariş, kargo, teslimat gibi olaylarda adresinize anında JSON POST gelir: event, title, body, url, workspace, sent_at. Gelen bildirimden sonra ayrıntıyı API’den (updated_since) çekmeniz önerilir.

İmza anahtarı girdiyseniz her istekte X-Infudex-Signature başlığı gelir: gövdenin, imza anahtarıyla HMAC-SHA256 özeti (hex). Gövdeyi işlemeden önce doğrulayın:

$body = file_get_contents('php://input');
$expected = hash_hmac('sha256', $body, getenv('INFUDEX_WEBHOOK_SECRET'));
if (! hash_equals($expected, $_SERVER['HTTP_X_INFUDEX_SIGNATURE'] ?? '')) {
    http_response_code(401);
    exit;
}
import crypto from 'node:crypto';
// rawBody: isteğin işlenmemiş gövdesi (Buffer)
const expected = crypto.createHmac('sha256', process.env.INFUDEX_WEBHOOK_SECRET).update(rawBody).digest('hex');
const given = req.get('X-Infudex-Signature') || '';
if (given.length !== expected.length || !crypto.timingSafeEqual(Buffer.from(given), Buffer.from(expected))) {
  return res.sendStatus(401);
}
import hmac, hashlib, os

expected = hmac.new(os.environ['INFUDEX_WEBHOOK_SECRET'].encode(), request.get_data(), hashlib.sha256).hexdigest()
if not hmac.compare_digest(expected, request.headers.get('X-Infudex-Signature', '')):
    abort(401)

Yapay zekâ asistanları (MCP)

Claude, Cursor, VS Code gibi MCP (Model Context Protocol) destekleyen yapay zekâ asistanlarını panelinize bağlayın; “bu hafta en çok satan ürünler ve kârı?”, “48 saati geçip kargolanmayan siparişler hangileri?”, “stoğu azalanları listele” gibi soruları konuşarak sorun. Aynı API anahtarı kullanılır: asistan yalnızca anahtara verdiğiniz izinlerle çalışır, değişiklik yapan araçlar yazma izni ister ve etkinlik günlüğüne kaydedilir.

MCP adresi:https://infudex.com/api/mcp
1. Claude.ai → Ayarlar → Bağlayıcılar → “Özel bağlayıcı ekle”
2. Uzak MCP sunucu adresi: https://infudex.com/api/mcp
3. “Bağlan”a tıklayın; Infudex giriş ve izin ekranı açılır, izinleri seçip onaylayın.

Anahtar kopyalamanız gerekmez (OAuth). Erişimi Ayarlar → API → Bağlı uygulamalar’dan kaldırabilirsiniz.
claude mcp add --transport http infudex https://infudex.com/api/mcp \
  --header "Authorization: Bearer $INFUDEX_API_KEY"
{
    "mcpServers": {
        "infudex": {
            "command": "npx",
            "args": [
                "-y",
                "mcp-remote",
                "https://infudex.com/api/mcp",
                "--header",
                "Authorization:${AUTH_HEADER}"
            ],
            "env": {
                "AUTH_HEADER": "Bearer ifx_…"
            }
        }
    }
}
{
    "mcpServers": {
        "infudex": {
            "url": "https://infudex.com/api/mcp",
            "headers": {
                "Authorization": "Bearer ifx_…"
            }
        }
    }
}
{
    "servers": {
        "infudex": {
            "type": "http",
            "url": "https://infudex.com/api/mcp",
            "headers": {
                "Authorization": "Bearer ${input:infudex-key}"
            }
        }
    },
    "inputs": [
        {
            "type": "promptString",
            "id": "infudex-key",
            "description": "Infudex API key",
            "password": true
        }
    ]
}

Claude.ai web bağlayıcısı OAuth ile bağlanır (anahtar gerekmez). Diğerlerinde ifx_… yerine Ayarlar → API sayfasında oluşturduğunuz anahtarı yazın; Claude Desktop yerel köprü (mcp-remote) kullanır, bilgisayarınızda Node.js kurulu olmalıdır.

AraçNe yaparİzin
get_account Bağlı çalışma alanının adı, para birimi, saat dilimi ve bu anahtarın izinleri. —
list_shops Bağlı pazaryeri ve mağazalar: ad, platform, durum, son senkron zamanı, senkron hatası. shops:read
search_orders Siparişleri süzerek listeler (yeniden eskiye). Her sipariş için kısa özet döner; ayrıntı için get_order. orders:read
get_order Tek siparişin tamamı: alıcı, adres, kalemler, tutarlar, gönderiler ve takip numaraları. orders:read
list_unshipped_orders Ödenmiş ya da hazırlanan ama henüz kargoya verilmemiş siparişler; older_than_hours ile geciken siparişler. orders:read
sales_summary Bir dönemin sipariş sayısı, ciro, (paketinizde varsa) maliyet ve net kâr; kanal kırılımı, en çok satan ürünler, iptal/iade sayıları. Tutarlar çalışma alanının ana para biriminde. orders:read
search_products Ürünleri ad ya da SKU ile arar; stok, maliyet ve kanal sayısıyla kısa özet döner. products:read
get_product Tek ürün: stok, maliyet ve her kanaldaki ilanı (fiyat, adet, durum). products:read
low_stock_products Stok takibi açık ve stoğu az stok eşiğinin altına düşmüş (ya da tükenmiş) ürünler, en azdan başlayarak. products:read
list_carriers add_tracking aracında kullanılabilecek kargo firması anahtarları. —
add_trackingyazma Siparişe kargo takip numarası ekler, siparişi kargoda yapar ve numarayı pazaryerine iletir. Kullanıcıdan açık onay almadan çağırmayın. orders:write
update_stockyazma Ürün stoğunu verilen adede ayarlar (stock) ya da artırır/azaltır (adjust); stok senkronu açıksa pazaryerlerine de gider. Kullanıcıdan açık onay almadan çağırmayın. products:write
sync_shopyazma Kanalın yeni siparişlerini ve ürünlerini pazaryerinden panele çekmeyi arka planda başlatır (aynı kanalda 5 dakikada bir). shops:sync

Teknik ayrıntı: Streamable HTTP taşıması, JSON-RPC 2.0, durumsuz (oturum yok); initialize, ping, tools/list, tools/call. Desteklenen protokol sürümleri: 2025-06-18, 2025-03-26, 2024-11-05. İstek sınırı REST API ile ortaktır. Kimlik: Bearer API anahtarı ya da OAuth 2.1 (yetki kodu + PKCE S256, dinamik istemci kaydı; keşif: /.well-known/oauth-protected-resource ve /.well-known/oauth-authorization-server). OAuth erişim anahtarı 1 saat, yenileme anahtarı 30 gün geçerlidir ve her kullanımda yenilenir.

Güvenlik önerileri

  • Anahtarı yalnızca sunucu tarafında kullanın; tarayıcıda çalışan koda, mobil uygulamaya ya da Git deposuna koymayın.
  • Her entegrasyon için ayrı anahtar ve yalnızca gereken izinler: biri sızarsa yalnızca onu iptal edersiniz.
  • Sabit IP’den çalışıyorsanız izinli IP listesi tanımlayın; anahtarlara son kullanma tarihi verip düzenli yenileyin.
  • Ayarlar → API sayfasında her anahtarın son kullanım zamanını ve IP’sini görebilirsiniz; beklemediğiniz bir kullanım görürseniz anahtarı hemen iptal edin.

Hesap

GET /me

Bağlantıyı doğrula

Anahtarın bağlı olduğu çalışma alanını, anahtarın izinlerini ve istek sınırını döner. Entegrasyonunuzu kurarken ilk bu uçla deneyin.

İstek

curl -X GET "https://infudex.com/api/v1/me" \
  -H "Authorization: Bearer $INFUDEX_API_KEY" \
  -H "Accept: application/json"

Yanıt · 200

{
    "data": {
        "workspace": {
            "name": "Atölye Nar",
            "currency": "TRY",
            "timezone": "Europe/Istanbul"
        },
        "key": {
            "name": "ERP entegrasyonu",
            "prefix": "ifx_AbCdEfGhIjKl…",
            "scopes": [
                "orders:read",
                "orders:write"
            ],
            "expires_at": null
        },
        "rate_limit": {
            "requests_per_minute": 120
        }
    }
}
GET /shops shops:read

Satış kanallarını listele

Çalışma alanına bağlı pazaryeri ve mağazalar. Sipariş listesini kanala göre süzmek için buradaki id kullanılır.

Sorgu parametreleri
page integer Sayfa numarası (varsayılan 1).
per_page integer Sayfa başına kayıt, 1-100 (varsayılan 25).

İstek

curl -X GET "https://infudex.com/api/v1/shops" \
  -H "Authorization: Bearer $INFUDEX_API_KEY" \
  -H "Accept: application/json"

Yanıt · 200

{
    "data": [
        {
            "id": "0199c3f2-0000-7000-8000-00000000a001",
            "name": "Trendyol mağazam",
            "platform": "trendyol",
            "platform_name": "Trendyol",
            "status": "connected",
            "currency": "TRY",
            "is_demo": false,
            "last_synced_at": "2026-10-10T09:55:00+03:00",
            "syncable": true,
            "sync": {
                "queued": false,
                "error": null
            }
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 1,
        "last_page": 1
    },
    "links": {
        "next": null,
        "prev": null
    }
}
GET /shops/{id} shops:read

Kanal ayrıntısı ve senkron durumu

sync.queued true ise senkron sırada ya da çalışıyor; bitince last_synced_at güncellenir. sync.error son senkron hatasıdır.

İstek

curl -X GET "https://infudex.com/api/v1/shops/0199c3f2-7b1a-7c3e-9f10-2a4b6c8d0e12" \
  -H "Authorization: Bearer $INFUDEX_API_KEY" \
  -H "Accept: application/json"

Yanıt · 200

{
    "data": {
        "id": "0199c3f2-0000-7000-8000-00000000a001",
        "name": "Trendyol mağazam",
        "platform": "trendyol",
        "platform_name": "Trendyol",
        "status": "connected",
        "currency": "TRY",
        "is_demo": false,
        "last_synced_at": "2026-10-10T09:55:00+03:00",
        "syncable": true,
        "sync": {
            "queued": false,
            "error": null
        }
    }
}

Olası hata kodları: not_found

POST /shops/{id}/sync shops:sync

Pazaryerinden siparişleri çek (senkron başlat)

Kanalın yeni siparişlerini, durum değişikliklerini ve ürünlerini pazaryerinden panele çekmeyi arka planda başlatır; panelin düzenli otomatik senkronunu beklemeden. Yanıt hemen 202 döner; bitişini GET /shops/{id} ile izleyin. Aynı kanalda son senkrondan 5 dakika geçmeden yenisi başlatılamaz (429 sync_too_soon). Özel, manuel ve CSV kanallar senkronlanmaz.

İstek

curl -X POST "https://infudex.com/api/v1/shops/0199c3f2-7b1a-7c3e-9f10-2a4b6c8d0e12/sync" \
  -H "Authorization: Bearer $INFUDEX_API_KEY" \
  -H "Accept: application/json"

Yanıt · 202

{
    "data": {
        "queued": true,
        "already_queued": false,
        "shop": {
            "id": "0199c3f2-0000-7000-8000-00000000a001",
            "name": "Trendyol mağazam",
            "platform": "trendyol",
            "platform_name": "Trendyol",
            "status": "connected",
            "currency": "TRY",
            "is_demo": false,
            "last_synced_at": "2026-10-10T09:55:00+03:00",
            "syncable": true,
            "sync": {
                "queued": true,
                "error": null
            }
        }
    }
}

Olası hata kodları: not_found, shop_not_syncable, sync_too_soon

GET /carriers

Kargo firmalarını listele

Gönderi eklerken carrier alanında kullanılabilecek kargo firması anahtarları.

İstek

curl -X GET "https://infudex.com/api/v1/carriers" \
  -H "Authorization: Bearer $INFUDEX_API_KEY" \
  -H "Accept: application/json"

Yanıt · 200

{
    "data": [
        {
            "key": "yurtici",
            "name": "Yurtiçi Kargo"
        },
        {
            "key": "aras",
            "name": "Aras Kargo"
        }
    ]
}

Siparişler

GET /orders orders:read

Siparişleri listele

Bütün kanallardaki siparişler, kalemleri ve gönderileriyle. Değişenleri düzenli çekmek için updated_since ve sort=updated_at birlikte kullanın; son aldığınız kaydın updated_at değerini bir sonraki istekte gönderin.

Sorgu parametreleri
status string Virgülle ayrılmış durumlar: paid, processing, shipped, delivered, completed, canceled, refunded.
shop_id uuid Yalnızca bu kanalın siparişleri (/shops).
ordered_since datetime Bu tarihten (dahil) sonra verilen siparişler. ISO 8601, ör. 2026-10-01T00:00:00+03:00.
ordered_until datetime Bu tarihe (dahil) kadar verilen siparişler.
updated_since datetime Bu tarihten sonra değişen siparişler (durum, kargo, adres…).
sort string -ordered_at (varsayılan, yeniden eskiye), ordered_at, updated_at, -updated_at.
page integer Sayfa numarası (varsayılan 1).
per_page integer Sayfa başına kayıt, 1-100 (varsayılan 25).

İstek

curl -X GET "https://infudex.com/api/v1/orders" \
  -H "Authorization: Bearer $INFUDEX_API_KEY" \
  -H "Accept: application/json"

Yanıt · 200

{
    "data": [
        {
            "id": "0199c3f2-7b1a-7c3e-9f10-2a4b6c8d0e12",
            "number": "283534307",
            "external_id": "3099b7db-6a35-498d",
            "shop": {
                "id": "0199c3f2-0000-7000-8000-00000000a001",
                "name": "Trendyol mağazam",
                "platform": "trendyol"
            },
            "status": "paid",
            "is_paid": true,
            "is_gift": false,
            "gift_message": null,
            "buyer_note": null,
            "buyer": {
                "name": "Ayşe Yılmaz",
                "email": "[email protected]"
            },
            "shipping_address": {
                "name": "Ayşe Yılmaz",
                "line1": "Moda Cad. 5",
                "line2": null,
                "city": "İstanbul",
                "state": "Kadıköy",
                "zip": "34710",
                "country": "TR",
                "phone": "05551112233"
            },
            "currency": "TRY",
            "subtotal": 30000,
            "shipping_cost": 3000,
            "tax": 0,
            "discount": 2000,
            "total": 31000,
            "items": [
                {
                    "external_id": "9001",
                    "title": "Keten gömlek",
                    "sku": "GML-M",
                    "quantity": 2,
                    "price": 15000,
                    "tax_rate": 20,
                    "variations": {
                        "Beden": "M"
                    },
                    "product_id": "0199c3f2-0000-7000-8000-00000000b001"
                }
            ],
            "shipments": [],
            "ordered_at": "2026-10-09T14:05:00+03:00",
            "shipped_at": null,
            "delivered_at": null,
            "created_at": "2026-10-09T14:06:12+03:00",
            "updated_at": "2026-10-09T14:06:12+03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 1,
        "last_page": 1
    },
    "links": {
        "next": null,
        "prev": null
    }
}

Olası hata kodları: validation_failed

GET /orders/{id} orders:read

Sipariş ayrıntısı

Tek sipariş; id, listede dönen UUID’dir.

İstek

curl -X GET "https://infudex.com/api/v1/orders/0199c3f2-7b1a-7c3e-9f10-2a4b6c8d0e12" \
  -H "Authorization: Bearer $INFUDEX_API_KEY" \
  -H "Accept: application/json"

Yanıt · 200

{
    "data": {
        "id": "0199c3f2-7b1a-7c3e-9f10-2a4b6c8d0e12",
        "number": "283534307",
        "external_id": "3099b7db-6a35-498d",
        "shop": {
            "id": "0199c3f2-0000-7000-8000-00000000a001",
            "name": "Trendyol mağazam",
            "platform": "trendyol"
        },
        "status": "paid",
        "is_paid": true,
        "is_gift": false,
        "gift_message": null,
        "buyer_note": null,
        "buyer": {
            "name": "Ayşe Yılmaz",
            "email": "[email protected]"
        },
        "shipping_address": {
            "name": "Ayşe Yılmaz",
            "line1": "Moda Cad. 5",
            "line2": null,
            "city": "İstanbul",
            "state": "Kadıköy",
            "zip": "34710",
            "country": "TR",
            "phone": "05551112233"
        },
        "currency": "TRY",
        "subtotal": 30000,
        "shipping_cost": 3000,
        "tax": 0,
        "discount": 2000,
        "total": 31000,
        "items": [
            {
                "external_id": "9001",
                "title": "Keten gömlek",
                "sku": "GML-M",
                "quantity": 2,
                "price": 15000,
                "tax_rate": 20,
                "variations": {
                    "Beden": "M"
                },
                "product_id": "0199c3f2-0000-7000-8000-00000000b001"
            }
        ],
        "shipments": [],
        "ordered_at": "2026-10-09T14:05:00+03:00",
        "shipped_at": null,
        "delivered_at": null,
        "created_at": "2026-10-09T14:06:12+03:00",
        "updated_at": "2026-10-09T14:06:12+03:00"
    }
}

Olası hata kodları: not_found

POST /orders orders:write

Siparişi panele aktar (kendi sitenizden)

Kendi sitenizde, mağazanızda ya da yazılımınızda oluşan siparişi bir özel kanala kaydeder (Kanallar → Kanal ekle → Özel kanal). Sipariş pazaryeri siparişleriyle aynı şekilde işlenir: SKU ya da product_id ile eşleşen ürünlerin stoğu düşer (stok senkronu açıksa), otomatik fatura ve yeni sipariş bildirimi çalışır, aylık sipariş limitine sayılır. external_id sizin sisteminizdeki sipariş numarasıdır; aynı kanalda tekrar gönderilirse 409 order_exists ve mevcut siparişin id’si döner, böylece tekrar denemelerde çift kayıt oluşmaz.

Gövde (JSON)
external_id * string Sizin sisteminizdeki sipariş kimliği (kanal içinde benzersiz), en çok 100 karakter.
shop_id uuid Özel kanalın id’si (kanal sayfasında yazar). Tek özel kanalınız varsa gönderilmeyebilir.
number string Panelde görünecek sipariş numarası (varsayılan external_id).
status string paid (varsayılan), processing, shipped, delivered.
ordered_at datetime Sipariş zamanı (varsayılan şimdi).
currency string Para birimi, ör. TRY (varsayılan kanalın para birimi).
buyer.name * string Alıcı adı.
buyer.email string Alıcı e-postası.
shipping_address object name, line1, line2, city, state (ilçe), zip, country (ISO 2 harf), phone.
items * array 1-200 kalem: product_id ya da sku (stok kalemiyle eşleşme), title (product_id yoksa zorunlu), quantity, price (küçük birim, birim fiyat), tax_rate, variations (ör. {"Beden": "M"}).
shipping_cost integer Kargo ücreti (küçük birim).
discount integer Toplam indirim (küçük birim).
tax integer Fiyatlara dahil değilse vergi tutarı (küçük birim).
buyer_note string Alıcı notu.
is_paid boolean Ödendi mi (varsayılan true).

İstek

curl -X POST "https://infudex.com/api/v1/orders" \
  -H "Authorization: Bearer $INFUDEX_API_KEY" \
  -H "Accept: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"external_id":"WEB-10045","buyer":{"name":"Ayşe Yılmaz","email":"[email protected]"},"shipping_address":{"line1":"Moda Cad. 5","city":"İstanbul","state":"Kadıköy","zip":"34710","country":"TR","phone":"05551112233"},"items":[{"sku":"GML-M","title":"Keten gömlek","quantity":2,"price":15000,"variations":{"Beden":"M"}}],"shipping_cost":3000,"discount":2000}'

Yanıt · 201

{
    "data": {
        "id": "0199c3f2-7b1a-7c3e-9f10-2a4b6c8d0e12",
        "number": "WEB-10045",
        "external_id": "WEB-10045",
        "shop": {
            "id": "0199c3f2-0000-7000-8000-00000000a009",
            "name": "Web sitem",
            "platform": "custom"
        },
        "status": "paid",
        "is_paid": true,
        "is_gift": false,
        "gift_message": null,
        "buyer_note": null,
        "buyer": {
            "name": "Ayşe Yılmaz",
            "email": "[email protected]"
        },
        "shipping_address": {
            "name": "Ayşe Yılmaz",
            "line1": "Moda Cad. 5",
            "line2": null,
            "city": "İstanbul",
            "state": "Kadıköy",
            "zip": "34710",
            "country": "TR",
            "phone": "05551112233"
        },
        "currency": "TRY",
        "subtotal": 30000,
        "shipping_cost": 3000,
        "tax": 0,
        "discount": 2000,
        "total": 31000,
        "items": [
            {
                "external_id": "9001",
                "title": "Keten gömlek",
                "sku": "GML-M",
                "quantity": 2,
                "price": 15000,
                "tax_rate": 20,
                "variations": {
                    "Beden": "M"
                },
                "product_id": "0199c3f2-0000-7000-8000-00000000b001"
            }
        ],
        "shipments": [],
        "ordered_at": "2026-10-09T14:05:00+03:00",
        "shipped_at": null,
        "delivered_at": null,
        "created_at": "2026-10-09T14:06:12+03:00",
        "updated_at": "2026-10-09T14:06:12+03:00"
    }
}

Olası hata kodları: validation_failed, no_custom_channel, order_exists, order_in_progress, order_limit_reached, shop_disconnected

POST /orders/{id}/status orders:write

Sipariş durumunu değiştir

Özel kanal siparişinin durumunu günceller: processing, shipped, delivered, canceled, refunded. İptal ve iadede düşülen stok geri eklenir; kargoya verilince otomatik fatura çalışır. Pazaryeri siparişlerinin durumu pazaryerinden gelir, bu uçla değiştirilemez (409 status_managed_by_channel). İptal / iade edilmiş sipariş yeniden açılamaz; teslim edilmiş sipariş yalnızca iptal ya da iade edilebilir.

Gövde (JSON)
status * string processing, shipped, delivered, canceled ya da refunded.

İstek

curl -X POST "https://infudex.com/api/v1/orders/0199c3f2-7b1a-7c3e-9f10-2a4b6c8d0e12/status" \
  -H "Authorization: Bearer $INFUDEX_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"status":"canceled"}'

Yanıt · 200

{
    "data": {
        "id": "0199c3f2-7b1a-7c3e-9f10-2a4b6c8d0e12",
        "number": "283534307",
        "external_id": "3099b7db-6a35-498d",
        "shop": {
            "id": "0199c3f2-0000-7000-8000-00000000a001",
            "name": "Trendyol mağazam",
            "platform": "trendyol"
        },
        "status": "canceled",
        "is_paid": true,
        "is_gift": false,
        "gift_message": null,
        "buyer_note": null,
        "buyer": {
            "name": "Ayşe Yılmaz",
            "email": "[email protected]"
        },
        "shipping_address": {
            "name": "Ayşe Yılmaz",
            "line1": "Moda Cad. 5",
            "line2": null,
            "city": "İstanbul",
            "state": "Kadıköy",
            "zip": "34710",
            "country": "TR",
            "phone": "05551112233"
        },
        "currency": "TRY",
        "subtotal": 30000,
        "shipping_cost": 3000,
        "tax": 0,
        "discount": 2000,
        "total": 31000,
        "items": [
            {
                "external_id": "9001",
                "title": "Keten gömlek",
                "sku": "GML-M",
                "quantity": 2,
                "price": 15000,
                "tax_rate": 20,
                "variations": {
                    "Beden": "M"
                },
                "product_id": "0199c3f2-0000-7000-8000-00000000b001"
            }
        ],
        "shipments": [],
        "ordered_at": "2026-10-09T14:05:00+03:00",
        "shipped_at": null,
        "delivered_at": null,
        "created_at": "2026-10-09T14:06:12+03:00",
        "updated_at": "2026-10-09T14:06:12+03:00"
    }
}

Olası hata kodları: not_found, validation_failed, status_managed_by_channel, invalid_status_transition

POST /orders/{id}/shipments orders:write

Siparişe kargo takip numarası ekle

Gönderiyi kaydeder, siparişi kargoda yapar ve takip numarasını siparişin geldiği pazaryerine iletir (kanal destekliyorsa). Aynı takip numarası aynı siparişe iki kez eklenemez. Yeniden deneme ihtimaline karşı Idempotency-Key başlığı gönderin.

Gövde (JSON)
carrier * string Kargo firması anahtarı (/carriers), ör. yurtici.
tracking_number * string Takip numarası, 4-64 karakter; harf, rakam, boşluk ve - _ . / içerebilir.
notify_buyer boolean Alıcıya kargo e-postası gönderilsin mi (varsayılan false).

İstek

curl -X POST "https://infudex.com/api/v1/orders/0199c3f2-7b1a-7c3e-9f10-2a4b6c8d0e12/shipments" \
  -H "Authorization: Bearer $INFUDEX_API_KEY" \
  -H "Accept: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"carrier":"yurtici","tracking_number":"YK123456789","notify_buyer":false}'

Yanıt · 201

{
    "data": {
        "id": "0199c3f2-0000-7000-8000-00000000c001",
        "carrier": "yurtici",
        "carrier_name": "Yurtiçi Kargo",
        "service": null,
        "tracking_number": "YK123456789",
        "tracking_url": "https://www.yurticikargo.com/tr/online-servisler/gonderi-sorgula?code=YK123456789",
        "status": "in_transit",
        "shipped_at": "2026-10-10T10:00:00+03:00",
        "delivered_at": null,
        "pushed_to_channel_at": "2026-10-10T10:00:02+03:00",
        "created_at": "2026-10-10T10:00:00+03:00"
    }
}

Olası hata kodları: not_found, validation_failed, order_not_shippable, duplicate_tracking_number, shipment_failed

Ürünler ve stok

GET /products products:read

Ürünleri listele

Merkezi stok kalemleri ve her birinin kanallardaki ilanları. stock, stok takibi kapalı üründe null döner.

Sorgu parametreleri
sku string Tam SKU eşleşmesi.
updated_since datetime Bu tarihten sonra değişen ürünler.
include_archived boolean Arşivlenmiş ürünler de gelsin (varsayılan false).
page integer Sayfa numarası (varsayılan 1).
per_page integer Sayfa başına kayıt, 1-100 (varsayılan 25).

İstek

curl -X GET "https://infudex.com/api/v1/products" \
  -H "Authorization: Bearer $INFUDEX_API_KEY" \
  -H "Accept: application/json"

Yanıt · 200

{
    "data": [
        {
            "id": "0199c3f2-0000-7000-8000-00000000b001",
            "sku": "GML-M",
            "title": "Keten gömlek — M",
            "kind": "physical",
            "image_url": "https://…/gomlek.jpg",
            "track_stock": true,
            "stock": 12,
            "low_stock_threshold": 3,
            "is_group": false,
            "is_archived": false,
            "weight_grams": 250,
            "tax_rate": 20,
            "listings": [
                {
                    "id": "0199c3f2-0000-7000-8000-00000000d001",
                    "shop": {
                        "id": "0199c3f2-0000-7000-8000-00000000a001",
                        "name": "Trendyol mağazam",
                        "platform": "trendyol"
                    },
                    "external_id": "8680001112223",
                    "title": "Keten gömlek",
                    "state": "active",
                    "price": 15000,
                    "currency": "TRY",
                    "quantity": 12,
                    "url": null
                }
            ],
            "created_at": "2026-09-01T09:00:00+03:00",
            "updated_at": "2026-10-10T10:00:00+03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 1,
        "last_page": 1
    },
    "links": {
        "next": null,
        "prev": null
    }
}

Olası hata kodları: validation_failed

GET /products/{id} products:read

Ürün ayrıntısı

Tek ürün ve ilanları.

İstek

curl -X GET "https://infudex.com/api/v1/products/0199c3f2-7b1a-7c3e-9f10-2a4b6c8d0e12" \
  -H "Authorization: Bearer $INFUDEX_API_KEY" \
  -H "Accept: application/json"

Yanıt · 200

{
    "data": {
        "id": "0199c3f2-0000-7000-8000-00000000b001",
        "sku": "GML-M",
        "title": "Keten gömlek — M",
        "kind": "physical",
        "image_url": "https://…/gomlek.jpg",
        "track_stock": true,
        "stock": 12,
        "low_stock_threshold": 3,
        "is_group": false,
        "is_archived": false,
        "weight_grams": 250,
        "tax_rate": 20,
        "listings": [
            {
                "id": "0199c3f2-0000-7000-8000-00000000d001",
                "shop": {
                    "id": "0199c3f2-0000-7000-8000-00000000a001",
                    "name": "Trendyol mağazam",
                    "platform": "trendyol"
                },
                "external_id": "8680001112223",
                "title": "Keten gömlek",
                "state": "active",
                "price": 15000,
                "currency": "TRY",
                "quantity": 12,
                "url": null
            }
        ],
        "created_at": "2026-09-01T09:00:00+03:00",
        "updated_at": "2026-10-10T10:00:00+03:00"
    }
}

Olası hata kodları: not_found

POST /products products:write

Ürün oluştur

Yeni stok kalemi açar. SKU çalışma alanında benzersizdir (büyük-küçük harf farkı gözetilmez); varsa 409 sku_exists ve mevcut ürünün id’si döner. Pazaryeri ilanları senkronda SKU ile bu ürüne bağlanır.

Gövde (JSON)
sku * string Stok kodu, en çok 80 karakter.
title * string Ürün adı.
stock integer Başlangıç stoğu (varsayılan 0).
track_stock boolean Stok takibi (varsayılan true).
low_stock_threshold integer Az stok uyarı eşiği (varsayılan 3).
cost integer Birim maliyet (küçük birim); kâr hesabında kullanılır.
packaging_cost integer Paketleme maliyeti (küçük birim).
cost_currency string Maliyet para birimi (varsayılan çalışma alanınınki).
weight_grams integer Ağırlık (gram).
tax_rate number KDV oranı (%).
image_url string Görsel adresi (https).

İstek

curl -X POST "https://infudex.com/api/v1/products" \
  -H "Authorization: Bearer $INFUDEX_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"sku":"GML-L","title":"Keten gömlek — L","stock":8,"cost":6500,"weight_grams":260}'

Yanıt · 201

{
    "data": {
        "id": "0199c3f2-0000-7000-8000-00000000b001",
        "sku": "GML-L",
        "title": "Keten gömlek — L",
        "kind": "physical",
        "image_url": "https://…/gomlek.jpg",
        "track_stock": true,
        "stock": 8,
        "low_stock_threshold": 3,
        "is_group": false,
        "is_archived": false,
        "weight_grams": 250,
        "tax_rate": 20,
        "listings": [],
        "created_at": "2026-09-01T09:00:00+03:00",
        "updated_at": "2026-10-10T10:00:00+03:00"
    }
}

Olası hata kodları: validation_failed, sku_exists

PATCH /products/{id} products:write

Ürünü güncelle

Yalnızca gönderdiğiniz alanlar değişir: sku, title, cost, packaging_cost, cost_currency, weight_grams, tax_rate, low_stock_threshold, track_stock, image_url, is_archived. Stok bu uçla değişmez; PUT /products/{id}/stock kullanın.

Gövde (JSON)
title string Ürün adı.
cost integer Birim maliyet (küçük birim).
is_archived boolean Arşive al / çıkar.

İstek

curl -X PATCH "https://infudex.com/api/v1/products/0199c3f2-7b1a-7c3e-9f10-2a4b6c8d0e12" \
  -H "Authorization: Bearer $INFUDEX_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"cost":7000,"low_stock_threshold":5}'

Yanıt · 200

{
    "data": {
        "id": "0199c3f2-0000-7000-8000-00000000b001",
        "sku": "GML-M",
        "title": "Keten gömlek — M",
        "kind": "physical",
        "image_url": "https://…/gomlek.jpg",
        "track_stock": true,
        "stock": 12,
        "low_stock_threshold": 3,
        "is_group": false,
        "is_archived": false,
        "weight_grams": 250,
        "tax_rate": 20,
        "listings": [
            {
                "id": "0199c3f2-0000-7000-8000-00000000d001",
                "shop": {
                    "id": "0199c3f2-0000-7000-8000-00000000a001",
                    "name": "Trendyol mağazam",
                    "platform": "trendyol"
                },
                "external_id": "8680001112223",
                "title": "Keten gömlek",
                "state": "active",
                "price": 15000,
                "currency": "TRY",
                "quantity": 12,
                "url": null
            }
        ],
        "created_at": "2026-09-01T09:00:00+03:00",
        "updated_at": "2026-10-10T10:00:00+03:00"
    }
}

Olası hata kodları: not_found, validation_failed, sku_exists

PUT /products/{id}/stock products:write

Stoğu güncelle

Stoğu verilen adede ayarlar (stock) ya da verilen miktar kadar artırır / azaltır (adjust). İkisinden yalnızca biri gönderilir. adjust eşzamanlı isteklerde güvenlidir (satır kilitlenir). Değişiklik, stok gönderimi açık olan kanallara kendiliğinden iletilir.

Gövde (JSON)
stock integer Yeni stok adedi (0 ya da pozitif).
adjust integer Değişim miktarı, ör. -2 ya da 10 (0 olamaz). Sonuç eksiye düşerse istek reddedilir.

İstek

curl -X PUT "https://infudex.com/api/v1/products/0199c3f2-7b1a-7c3e-9f10-2a4b6c8d0e12/stock" \
  -H "Authorization: Bearer $INFUDEX_API_KEY" \
  -H "Accept: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"adjust":-2}'

Yanıt · 200

{
    "data": {
        "id": "0199c3f2-0000-7000-8000-00000000b001",
        "sku": "GML-M",
        "title": "Keten gömlek — M",
        "kind": "physical",
        "image_url": "https://…/gomlek.jpg",
        "track_stock": true,
        "stock": 10,
        "low_stock_threshold": 3,
        "is_group": false,
        "is_archived": false,
        "weight_grams": 250,
        "tax_rate": 20,
        "listings": [
            {
                "id": "0199c3f2-0000-7000-8000-00000000d001",
                "shop": {
                    "id": "0199c3f2-0000-7000-8000-00000000a001",
                    "name": "Trendyol mağazam",
                    "platform": "trendyol"
                },
                "external_id": "8680001112223",
                "title": "Keten gömlek",
                "state": "active",
                "price": 15000,
                "currency": "TRY",
                "quantity": 12,
                "url": null
            }
        ],
        "created_at": "2026-09-01T09:00:00+03:00",
        "updated_at": "2026-10-10T10:00:00+03:00"
    }
}

Olası hata kodları: not_found, validation_failed, product_is_group, stock_would_be_negative