Bicops Partner APIv1

Satıcı ve kurumsal iş ortakları için entegrasyon arayüzü.

Genel bakış

Ürün, stok ve fiyat verisi bu API ile Bicops’a gönderilir. Sipariş ve finans verisi aynı API üzerinden alınır. Toplu istekler kuyrukta işlenir; yanıt 202 ve bir iş kimliğidir (batchId).

Sürüm: /v1. Alan adları değişmez. Yanıt mesajları İngilizcedir; code alanı sabittir.

  • JSON, UTF-8, ISO-8601 (UTC)
  • Her yanıtta X-Request-Id başlığı bulunur
  • Hatalı satırlar reddedilir, geçerli satırlar işlenir
  • Aynı sourceId ile gönderilen kayıt güncellenir
GET /v1/me
POST /v1/catalog/products
PATCH /v1/catalog/stock · /v1/catalog/prices
DELETE /v1/catalog/products/{sourceId}
POST /v1/catalog/imports → /{batchId}/complete
GET /v1/catalog/products · /v1/catalog/batches/{id} · /v1/logs/requests

Kimlik doğrulama

Her istekte X-Api-Key ve X-Api-Secret başlıkları gönderilir. Anahtar Bicops tarafından tanımlanır; gizli anahtar yalnızca oluşturulurken görüntülenir.

Satıcı kimliği anahtardan alınır. Gövdede satıcı kimliği gönderilmez. Anahtar yalnızca kendi hesabının verisine erişir. Yetkiler kapsam ile belirlenir (catalog:read, catalog:write, orders:read).

IP izin listesi ve son kullanma tarihi tanımlanabilir. Yenileme sırasında iki anahtar birlikte aktif olabilir.

X-Api-Key: 2c1d5c7e-2a1b-4c1e-9d7a-2b6f0e3c9a11
X-Api-Secret: 4Qb…(base64url, 43 chars)
Content-Type: application/json
X-Request-Id: optional-your-correlation-id

Bağlantı testi: GET /v1/me. Yanıtta anahtarın kapsamları ve limitleri yer alır.

Anahtar tipleri

İki tip anahtar vardır ve kapsamları farklıdır. Yanlış tiple çağrılan servis 403 döner.

Satıcı anahtarıKatalog, siparişler, iadeler, faturalar, finans, raporlar, iş kayıtları, webhook. Satıcı hesabına bağlıdır.
Kurum anahtarıCari hesaplar, ekstre, tahsilat makbuzları, satış faturaları, plasiyer atamaları. Şirket şubesine bağlıdır.
Her ikisiGET /v1/me, GET /v1/logs/requests, webhook abonelikleri ve GET /v1/events.

Başlangıç

1. Bağlantı testi

curl -s https://partner.bicops.tr/v1/me \
  -H "X-Api-Key: 2c1d5c7e-2a1b-4c1e-9d7a-2b6f0e3c9a11" \
  -H "X-Api-Secret: <your-secret>"

2. Ürün gönderimi (en fazla 1.000 kayıt). Yanıt: 202 ve batchId.

curl -s -X POST https://partner.bicops.tr/v1/catalog/products \
  -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [{
      "sourceId": "SACHS 317 572",
      "name": "AMORTISOR ON AUDI A3 / GOLF V",
      "brand": "SACHS",
      "producerCode": "317 572",
      "oemCodes": ["1T0413031CN", "1T0413031CK"],
      "equivalentCodes": ["FEBI 106124"],
      "price": 3869.60, "currency": "TRY", "pricesIncludeVat": false,
      "stock": 12,
      "warehouses": [{ "code": "ANK", "stock": 8 }, { "code": "IZM", "stock": 4 }],
      "minOrder": 1, "packageAmount": 1, "unit": "AD", "desi": 3.2,
      "images": ["https://cdn.example.com/317572.jpg"],
      "status": 1
    }]
  }'
HTTP/1.1 202 Accepted
X-Request-Id: 7c0e1c5a-…
{
  "batchId": 1042, "status": "queued",
  "received": 1, "accepted": 1, "rejected": 0, "warnings": 0,
  "chunks": 1, "dryRun": false, "issues": [], "requestId": "7c0e1c5a-…"
}

3. İş kaydı sorgusu: durum, sayılar, satır hataları.

curl -s https://partner.bicops.tr/v1/catalog/batches/1042 -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>"
curl -s https://partner.bicops.tr/v1/catalog/batches/1042/errors.csv -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>" -o errors.csv

4. Stok ve fiyat güncellemesi (en fazla 5.000 kayıt).

curl -s -X PATCH https://partner.bicops.tr/v1/catalog/stock \
  -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>" -H "Content-Type: application/json" \
  -d '{"items":[{"sourceId":"SACHS 317 572","stock":9,"warehouses":[{"code":"ANK","stock":5},{"code":"IZM","stock":4}]}]}'

Katalog

POST /v1/catalog/products kayıtları sourceId ile ekler veya günceller. Yalnızca değişen kayıtlar işlenir.

Alanlar

AlanTipAçıklama
sourceIdstring (≤200)Zorunlu. Satıcı stok kodu. En fazla 200 karakter.
namestring (≤4000)Aktif ürün için zorunlu.
brandstring (≤200)Marka adı.
producerCode, previousCodestring (≤200)Üretici parça numarası ve önceki numara.
oemCodes[]string[] (≤200 items, each ≤100)OEM numaraları, dizi olarak. Numaralar birleştirilmez.
equivalentCodes[]string[] (≤200 items)Muadil numaralar ("MARKA NUMARA").
price, currency, pricesIncludeVatdecimal · string(3) · booleanListe fiyatı. TRY, USD veya EUR.
stock, warehouses[]decimal · object[] {code: string, stock: decimal}Toplam stok ve depo kırılımı [{code, stock}].
minOrder, packageAmount, boxAmount, unitinteger · integer · integer · string(≤16)Sipariş kuralları.
desi, weightdecimal · decimalDesi ve ağırlık (kg).
images[]string[] (URL, ≤10)Görsel adresleri (https).
statusinteger (0 | 1)1 aktif, 0 pasif.

PATCH /v1/catalog/stock ve PATCH /v1/catalog/prices yalnızca stok ve fiyat günceller. Öncelikli kuyrukta işlenir.

Pasife alma: DELETE /v1/catalog/products/{sourceId} veya POST /v1/catalog/products/deactivate.

GET /v1/catalog/products kayıtların Bicops tarafındaki durumunu döner.

Dosya ile aktarım

Tam katalog için NDJSON dosyası kullanılır (her satırda bir kayıt). gzip önerilir. Dosya doğrudan depolama alanına yüklenir.

  1. POST /v1/catalog/imports: uploadUrl ve batchId alınır
  2. Dosya HTTP PUT ile uploadUrl adresine yüklenir
  3. POST /v1/catalog/imports/{batchId}/complete: işleme başlar
  4. GET /v1/catalog/batches/{batchId}: ilerleme izlenir
# 1
curl -s -X POST https://partner.bicops.tr/v1/catalog/imports -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>" \
  -H "Content-Type: application/json" -d '{"format":"ndjson","gzip":true}'
# → {"batchId":1043,"uploadUrl":"https://files.bicops.tr/partner-raw/…","expiresInSec":900}
# 2
curl -s -X PUT "<uploadUrl>" -H "Content-Type: application/octet-stream" --data-binary @catalog.ndjson.gz
# 3
curl -s -X POST https://partner.bicops.tr/v1/catalog/imports/1043/complete -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>"

Dosya biçimi

  • Her satır bağımsız bir JSON nesnesidir. Satırlar arasında virgül ve köşeli parantez yoktur.
  • Dosya UTF-8 kodlanır, satır sonu \n olmalıdır. Boş satırlar atlanır.
  • Zorunlu tek alan sourceId (sizin stok kodunuz). Gönderilmeyen alan mevcut değerini korur.
  • Bozuk satır yalnız kendisi reddedilir, dosyanın kalanı işlenir. Nedenler GET /v1/catalog/batches/{id}/errors ucunda listelenir.
  • stock ve warehouses birlikte gönderilirse stock, depo stoklarının toplamına eşit olmalıdır.
  • Dosyada olmayan ürün silinmez. Pasife almak için o ürünü status: 0 ile gönderin.

Örnek dosya

{"sourceId":"SACHS 317 572","name":"AMORTISOR ON AUDI A3 / GOLF V","brand":"SACHS","producerCode":"317 572","previousCode":"317 571","oemCodes":["1T0413031CN","1T0413031CK"],"equivalentCodes":["FEBI 106124"],"barcodes":["4054228012345"],"price":3869.6,"currency":"TRY","pricesIncludeVat":false,"stock":12,"warehouses":[{"code":"ANK","stock":8},{"code":"IST","stock":4}],"minOrder":1,"packageAmount":1,"boxAmount":2,"unit":"AD","desi":3.2,"weight":1.25,"images":["https://cdn.satici.com/317572.jpg"],"categoryHint":"Amortisor","vehicleHint":"VW Golf V 2003-2008","status":1}
{"sourceId":"MANN W 712/95","name":"YAG FILTRESI","brand":"MANN","oemCodes":["W 712/95","1109AY"],"price":210.5,"currency":"TRY","stock":0,"status":1}
{"sourceId":"BOSCH 0986495255","name":"FREN BALATASI ON","brand":"BOSCH","oemCodes":["0986495255"],"price":1250,"currency":"TRY","stock":6,"warehouses":[{"code":"IZM","stock":6}],"status":1}
{"sourceId":"SACHS 317 571","status":0}

Örnek NDJSON dosyasını indir

dryRun=true dosyayı yazmadan doğrular. 1.000.000 kayıt için ilk aktarım yaklaşık 15 dakikadır.

İş kayıtları

Her toplu istek bir iş kaydı oluşturur. GET /v1/catalog/batches/{id} durum, sayı ve süreleri döner. /errors satır hatalarını, /errors.csv aynı listeyi CSV olarak verir.

queuedKuyrukta
awaiting_uploadDosya yüklemesi bekleniyor
processingİşleniyor
syncingKatalog ve arama dizini güncelleniyor
doneTamamlandı
partialTamamlandı, bazı kayıtlar reddedildi
failedBaşarısız

Sayılar: received, accepted, rejected, changed. Aynı veri tekrar gönderilirse changed = 0 olur.

API Servisleri

Tüm servisler /v1 altındadır. Yazma servisleri için ilgili kapsam gerekir.

Siparişler

ServisAçıklama
GET /ordersSipariş listesi (status, updatedSince)
GET /orders/{id}Sipariş detayı
POST /orders/{id}/approveSiparişi onayla
POST /orders/{id}/statusDurum güncelle {status}
POST /orders/{id}/erp-referenceERP referansı kaydet {reference}
GET /orders/{id}/messagesSipariş mesajları
GET /orders/{id}/documentsSipariş belgeleri

Kargo

ServisAçıklama
POST /orders/{id}/shipmentsKendi kargonuzu bildirin {trackNumber, cargoId?}
POST /orders/{id}/shipments/createBicops taşıyıcısıyla gönderi oluştur
GET /orders/{id}/shipments/labelKargo etiketi (PDF, base64)
GET /orders/carriersTaşıyıcı listesi

İade ve iptal

ServisAçıklama
GET /returnsİade talepleri
GET /returns/{id}İade detayı
POST /returns/{id}/decisionİade kararı {action: approve|reject}
GET /cancellationsİptal edilen siparişler

Fatura

ServisAçıklama
GET /orders/{id}/invoicesSiparişe bağlı fatura dosyaları
POST /orders/{id}/invoiceKendi faturanızı ekleyin {fileBase64|fileUrl}
GET /invoicesBicops’un size kestiği belgeler

Finans

ServisAçıklama
GET /finance/settlementsSipariş bazlı hakediş
GET /finance/statementAylık ekstre
GET /finance/paymentsKart tahsilatları

Webhook ve olaylar

ServisAçıklama
GET /webhooksWebhook listesi
POST /webhooksWebhook kaydı {url, events[]}
DELETE /webhooks/{id}Webhook iptali
POST /webhooks/{id}/testTest olayı gönder
GET /webhooks/deliveriesTeslim günlüğü
GET /eventsOlay kuyruğu (cursor)

Raporlar

ServisAçıklama
GET /reports/salesSatış raporu (groupBy=day|month|product|brand)
GET /reports/returnsİade oranı
GET /reports/catalogKatalog sağlığı
GET /reports/demandTalep ve stoksuz ürünler

Kurumsal (şube anahtarı)

ServisAçıklama
GET /customersCari kartları
GET /customers/{id}/statementCari ekstre ve bakiye
GET /accounting/receiptsTahsilat makbuzları
GET /accounting/invoicesŞube satış faturaları
GET /salesmenSatış temsilcisi atamaları

Hata kodları

Hata yanıtı: { code, message, details[], requestId }. code sabittir; message İngilizce açıklamadır.

{
  "code": "VALIDATION_FAILED",
  "message": "Request body validation failed",
  "details": [{ "field": "items.0.price", "code": "INVALID_FIELD", "message": "price must not be less than 0" }],
  "requestId": "7c0e1c5a-…"
}

HTTP durum kodları

UNAUTHORIZED (401)Anahtar geçersiz veya eksik
FORBIDDEN_SCOPE (403)Kapsam yetersiz
SELLER_KEY_REQUIRED (403)Servis satıcı anahtarı ister; kurum anahtarı kullanılmış
CORPORATE_KEY_REQUIRED (403)Servis kurum anahtarı ister; satıcı anahtarı kullanılmış
SANDBOX_READ_ONLY (403)Sandbox anahtarı sipariş, iade ve fatura değiştiremez; katalog istekleri yalnız doğrulanır
IP_NOT_ALLOWED (403)IP izin listesinde değil
VALIDATION_FAILED (422)Gövde şeması geçersiz
PAYLOAD_TOO_LARGE (413)Kayıt sınırı aşıldı
QUEUE_BUSY (429)Bekleyen iş sınırı aşıldı; Retry-After başlığına bakın
RATE_LIMITED (429)İstek sıklığı aşıldı
NOT_FOUND (404)Kayıt bulunamadı
STORAGE_UNAVAILABLE (503)Depolama alanı geçici olarak kapalı

Kayıt kodları (iş hata raporu)

SOURCEID_REQUIREDsourceId boş
NAME_REQUIREDAktif ürün için ad eksik
PRICE_NEGATIVE, STOCK_NEGATIVENegatif veya sayısal olmayan değer
CURRENCY_INVALIDPara birimi TRY, USD veya EUR değil
STATUS_INVALIDstatus 0 veya 1 değil
UNKNOWN_SOURCEIDÜrün tanımlı değil
INVALID_JSONSatır geçerli JSON değil
OEM_TOO_SHORT (uyarı)Üç karakterden kısa numara atlandı
WAREHOUSE_STOCK_MISMATCH (uyarı)Depo toplamı kullanıldı
DUPLICATE_SOURCEID (uyarı)Son kayıt kullanıldı

Limitler

  • Ürün: 1.000 kayıt / istek. Stok ve fiyat: 5.000 kayıt / istek. Gövde: 6 MB.
  • İstek sıklığı: anahtar başına 600 istek / dakika. Aşımda 429.
  • Bekleyen iş: satıcı başına 10. Aşımda 429.
  • Dosya: kayıt sınırı yok, en fazla 2 GB (gzip).
  • Yükleme adresi 15 dakika geçerlidir.

İstek günlüğü

GET /v1/logs/requests son 30 günün isteklerini döner: uç, durum, süre, requestId, batchId.

Referans