Heyşirket · Geliştiriciler

Heyşirket Senkron API v1

Heyşirket Senkron API; e-ticaret sitenizin, pazaryeri yazılımınızın, ERP ya da ön muhasebe sisteminizin cari, ürün (renk/beden varyantları ve görselleriyle), stok, satış faturası, gider/gelen e-fatura, kasa-banka hareketi ve e-ticaret siparişlerini Heyşirket'teki firmanıza otomatik aktarmasını; Heyşirket'te yapılan değişiklikleri (stok, fiyat, yeni varyant, tahsilat, sipariş işlemi…) de geri okumasını sağlar.


Yapay zekâ ile entegrasyon (hazır prompt)

Aşağıdaki metni olduğu gibi kopyalayıp kullandığınız yapay zekâ kodlama asistanına (Claude, ChatGPT, Cursor vb.) verin. Köşeli parantezli yerleri kendi bilgilerinizle doldurun. API anahtarını prompta yazmayın; asistandan anahtarı ortam değişkeninden (HEYSIRKET_API_KEY) okumasını isteyin.

Sen kıdemli bir entegrasyon mühendisisin. Görevin: [SİSTEM ADI — ör. WooCommerce mağazam / kendi
e-ticaret yazılımım / ERP'm] ile Heyşirket arasında kesintisiz, çift yönlü ve güvenli bir senkron kurmak.

Kaynaklar (önce tamamını oku, varsayım yapma):
- Rehber: https://heysirket.com/gelistiriciler/senkron-api.md
- OpenAPI: https://portal.heysirket.com/api/v1/openapi.json
- Sınırlar/sabitler: https://portal.heysirket.com/api/v1/meta

Bağlam:
- Heyşirket firmamın API anahtarı HEYSIRKET_API_KEY ortam değişkeninde. Anahtarı asla loglama, koda,
  depoya veya hata mesajına yazma.
- Kaynak sistemim: [dil/çatı, veritabanı, barındırma — ör. PHP 8 + WordPress/WooCommerce, MySQL, cPanel cron].
- Sistemimdeki kalıcı kod (source): [ör. magazam] — küçük harf, rakam, tire.
- Satış kanallarım: [ör. kendi sitem (woocommerce), trendyol, hepsiburada].
- E-fatura sağlayıcım: [ör. Trendyol E-Faturam / yok].

Yapacakların (sırayla, her adımı test ederek):
1. Veri eşlemesi çıkar: sistemimdeki her varlığı (müşteri, tedarikçi, ürün + varyant + görsel, stok, sipariş,
   fatura, iade/iptal, gider, gelen e-fatura, ödeme/tahsilat) rehberdeki alanlara eşle. Kalıcı ve
   değişmeyen kimlikleri externalId yap. Tutarları ana para biriminde ondalık, KDV'yi yüzde gönder.
   Varyantlı ürünlerde yalnız satılabilir varyantları products[] olarak, ana ürünü family ile gönder;
   attributes'a renk/beden gibi özellikleri insan okunur adlarla yaz. Görselleri https adresleriyle gönder.
2. Değişiklik takibi kur: her varlık için "son değişiklik zamanı/sürümü" imleci ve gönderilen kaydın
   parmak izini sakla; yalnız değişenleri gönder. Hiçbir şey değişmediyse istek atma.
3. Gönderimi kur: POST /sync ile sayfalı gönder (istek başına ≤400 kayıt, fatura+gider+sipariş ≤150,
   gövde ≤2 MB). Sıra: business → customers → products(+family) → stock → orders → invoices → expenses
   → transactions → deleted (tedarikçiler suppliers[] ile, customers'tan önce ya da aynı sayfada).
   Önce aynı veriyi ?dryRun=1 ile gönderip errors boşalana kadar eşlemeyi düzelt.
4. Hata yönetimi: 200 yanıtındaki errors[] kayıt bazlıdır; ilgili kaydı düzeltip tekrar gönder
   (aynı sayfayı tekrar göndermek güvenlidir, idempotenttir). 429'da Retry-After kadar bekle
   (DAILY_QUOTA: ertesi UTC gününe kadar, kalan kayıtları sıraya koy). 5xx ve ağ hatasında üstel geri
   çekilme uygula; 401/402/423'te dur ve yöneticiyi uyar.
5. Geri akışı kur: her turda ÖNCE GET /changes?after=<son seq> ile Heyşirket'teki değişiklikleri oku ve
   kendi sistemine uygula (stok için quantity'yi FARK olarak uygula, IN +, OUT −, ADJUSTMENT işaretli),
   sonra kendi değişikliklerini gönder. Uygulanan son seq'i kalıcı sakla. Heyşirket'te yeni açılan
   ürün/varyant/ailede kendi kaydını oluştur ve bir sonraki gönderimde heysirketId ile eşle.
6. Zamanlama: değişiklik akışı ve gönderim için 15 dakikada bir çalışan tek, kilitli bir görev kur.
   İlk tam aktarımı elle başlatılabilir ve kaldığı yerden devam edebilir yap; günlük kotayı aşarsa ertesi
   gün devam etsin.
7. Gözlemlenebilirlik: son çalışma zamanı, gönderilen/hatalı kayıt sayıları ve son hataları sisteminin
   yönetim ekranında göster. GET /sync/runs ile Heyşirket tarafındaki sonucu karşılaştır.
8. Test: eşleme fonksiyonları için birim testleri yaz (tutar yuvarlama, satır toplamlarının fatura
   toplamına eşitliği, varyant/aile eşlemesi, silinen kayıtlar, akış olaylarının uygulanması). Önce
   ?dryRun=1, sonra küçük bir gerçek sayfa ile uçtan uca doğrula; GET /ping ile anahtarı kontrol et.

Kurallar: Para hesaplarında kuruşa dikkat et; aynı parayı iki kez sayma (bir tahsilat ya fatura ödemesi
ya da kasa hareketi olarak gelsin). Faturaları silme, iptali status: "CANCELLED" ile bildir. Kişisel
verileri yalnız rehberdeki alanlarla gönder. Bitince yaptığın eşlemeyi ve çalıştırma talimatını kısa bir
README olarak yaz.

Hızlı başlangıç

  1. Anahtar oluşturun. Heyşirket → Ayarlar → API ve senkron → Anahtar oluştur. Anahtar (hsk_live_…) yalnız bir kez gösterilir; güvenli bir yerde saklayın. Her sistem için ayrı anahtar açın.
  2. Bağlantıyı test edin.
    curl -s https://portal.heysirket.com/api/v1/ping -H "Authorization: Bearer $HEYSIRKET_API_KEY"
  3. Önce doğrulayın, sonra yazın. Aynı gövdeyi ?dryRun=1 ile gönderin; errors boşsa parametreyi kaldırın.
    curl -s -X POST "https://portal.heysirket.com/api/v1/sync?dryRun=1" \
      -H "Authorization: Bearer $HEYSIRKET_API_KEY" -H "Content-Type: application/json" \
      -d '{"source":"magazam","customers":[{"externalId":"c-1","title":"Ayşe Yılmaz"}]}'
  4. Sonucu görün. Heyşirket'te Ayarlar → API ve senkron ekranında her aktarımın sayıları ve kayıt bazlı hataları görünür.

Kimlik doğrulama ve sınırlar

Authorization: Bearer hsk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
UçAnahtarAçıklama
GET /api/v1/metagerekmezsınırlar, sabit değerler, sürüm
GET /api/v1/openapi.jsongerekmezOpenAPI 3.1 tanımı
GET /api/v1/pinggerekiranahtarın bağlı olduğu firma
POST /api/v1/syncgerekirtoplu, idempotent aktarım (?dryRun=1 yalnız doğrular)
GET /api/v1/changes?after=0&limit=200gerekirHeyşirket'teki değişikliklerin akışı
GET /api/v1/sync/runs?limit=20gerekirson aktarımlar
SınırDeğer
Bir istekteki kayıten fazla 400 (fatura + gider + sipariş toplamı en fazla 150)
Gövde boyutuen fazla 2 MB
Aktarım isteğianahtar başına dakikada 30 (429 RATE_LIMITED, Retry-After: 60)
Günlük kayıt kotasıfirma başına UTC gününde 5.000 kayıt (429 DAILY_QUOTA; büyük ilk aktarım ertesi günlere yayılır)
Değişiklik akışı saklama30 gün (en az günde bir okuyun)

Genel kurallar

Gövde

{
  "source": "magazam",
  "business": { "title": "…", "taxId": "…", "taxOffice": "…", "address": "…", "district": "…", "city": "…", "phone": "…", "email": "…",
                "bankAccounts": [ { "bankName": "Ziraat Bankası", "branchName": "Merkez", "accountName": "…", "iban": "TR…", "currency": "TRY", "isDefault": true } ] },
  "customers": [ /* Cari */ ],
  "suppliers": [ /* Tedarikçi */ ],
  "products": [ /* Ürün / varyant */ ],
  "stock": [ /* Stok seviyesi */ ],
  "orders": [ /* E-ticaret siparişi */ ],
  "invoices": [ /* Satış faturası */ ],
  "expenses": [ /* Gider / gelen fatura */ ],
  "transactions": [ /* Kasa-banka hareketi */ ],
  "deleted": { "customers": [], "suppliers": [], "products": [], "expenses": [], "transactions": [] }
}

Firma (business)

Yalnız dolu alanlar yazılır. bankAccounts[] (en fazla 10): IBAN ile eşlenir; hesap hem faturalarda gösterilen banka hesaplarına hem de Nakit ve bankalar takibine eklenir. isDefault: true olan hesap faturalarda ilk sırada gösterilir.

Cari (customers[])

AlanTürNot
externalIdmetinzorunlu
titlemetinzorunlu; şahıs için ad soyad
taxIdmetinVKN (10) veya TCKN (11)
taxOffice, address, district, city, country, postalCode, phone, emailmetin
contactTypecustomer | supplier | bothvarsayılan customer
heysirketIdmetinHeyşirket'te açılmış cariyi (akıştaki customer.created) bu externalId ile eşler
metadatanesneserbest

Tedarikçi (suppliers[])

AlanTürNot
externalId, titlemetinzorunlu
taxIdmetinVKN/TCKN — eşleştirmede önceliklidir
contactName, email, phone, address, websitemetin
isActivedoğru/yanlışfalse pasife alır
heysirketIdmetinHeyşirket'te açılmış tedarikçiyi (akıştaki supplier.created) eşler
metadatanesneserbest

Heyşirket'te aynı vergi numaralı ya da aynı unvanlı (büyük/küçük harf, Türkçe karakter duyarsız) bir tedarikçi zaten varsa yenisi açılmaz, mevcut kart eşlenir. customers[] içinde contactType: "supplier" ya da "both" olan kayıtlar da tedarikçi kartı olarak yazılır. Her gider (expenses[]) tedarikçisine supplierExternalId → supplierTaxId → supplierName sırasıyla bağlanır; bulunamazsa tedarikçi kartı otomatik açılır. Böylece tedarikçi ekstreleri ve borç bakiyeleri Heyşirket'te kendiliğinden oluşur.

Ürün ve varyant (products[])

AlanTürNot
externalId, namemetinzorunlu
sku, barcodemetinfirma içinde benzersiz
description, brand, category, unitmetinunit varsayılan Adet
vatRatesayıyüzde, varsayılan 20
pricesayıKDV dahil satış fiyatı
currencymetinvarsayılan TRY
isActive, tracksInventorydoğru/yanlışisActive: false satışa kapatır
imageUrl, images[]metinhttps görseller (ilki ana görsel, en fazla 10)
familynesnevaryantlı ürünün ana ürünü: externalId, name (zorunlu), description, brand, category, imageUrl, images[], isActive, heysirketId
attributesnesnevaryant özellikleri: { "Renk": "Pembe", "Beden": "3-6 Ay" }
heysirketIdmetinHeyşirket'te açılmış ürünü/varyantı eşler; kopya oluşmaz
metadatanesneserbest

Varyantlı ürünlerde yalnız satılabilir varyantlar products[] olarak gönderilir; ana ürün family ile tanımlanır. Heyşirket'te aile tek satırda görünür, varyantlar tek pencerede düzenlenir.

Stok seviyesi (stock[])

{ "productExternalId": "123", "quantity": 7, "warehouse": { "code": "ANA", "name": "Ana depo" } } — mutlak miktar gönderilir; Heyşirket farkı sayım düzeltmesi olarak stok defterine yazar. warehouse gönderilmezse varsayılan depo (yoksa ANA) kullanılır.

Satış faturası (invoices[])

AlanTürNot
externalId, issueDate, totalzorunlu
numbermetinfatura numarası
dueDatetarihvade; pazaryeri satışlarında beklenen hakediş tarihi. Yoksa issueDate
documentTypeE_INVOICE | E_ARCHIVE | PAPER | OTHER
statusAPPROVED | SUBMITTED | REJECTED | CANCELLED | DRAFT | ERRORiptalde CANCELLED
isCreditNotedoğru/yanlışiade faturası
currency, subtotal, vat
customerExternalId / customeralıcı (fatura anındaki bilgi)
einvoicenesne{ "provider": "trendyol-efaturam", "uuid": "ETTN" } — firmanın e-belge bağlantısı varsa orijinal PDF otomatik arşivlenir
ordernesne{ "channel": "trendyol", "externalOrderId": "…" } — siparişin fatura durumu INVOICED olur
lines[]name zorunlu; quantity, unit, unitPrice (KDV hariç), vatRate, discount, vat, total (KDV dahil), sku, productExternalId
payments[]externalId, amount, paidAt, method, note — ödeme durumu buradan hesaplanır; listede olmayan önceki ödemeler kaldırılır

Gider / gelen fatura (expenses[])

AlanTürNot
externalId, issueDate, total, supplierNamezorunlu
kindEXPENSE | RECEIPT | INCOMING_E_INVOICE | OTHER
number, dueDate, currency, subtotal, vat, supplierTaxId, supplierExternalId
categorymetinör. KARGO, REKLAM, KOMISYON, YAZILIM
paymentStatus, paidUNKNOWN | UNPAID | PARTIAL | PAID
einvoiceUuidmetingelen e-faturanın ETTN'i; Heyşirket'in sağlayıcıdan otomatik aldığı belgeyle tek kayıtta birleşir
lines[], note, metadata

Kasa-banka hareketi (transactions[])

{ "externalId": "…", "direction": "INFLOW"|"OUTFLOW", "amount": 120.5, "currency": "TRY", "date": "2026-10-01", "description": "…", "counterparty": "…", "account": { "externalId": "iyzico", "name": "iyzico", "type": "BANK"|"CASH" }, "expenseExternalId": "…" } — fatura tahsilatlarını burada tekrar göndermeyin (invoices[].payments yeterlidir).

E-ticaret siparişi (orders[])

AlanTürNot
channelmetintrendyol, hepsiburada, pazarama, n11, idefix, amazon-tr, woocommerce, shopify, ticimax, ideasoft, tiktok ya da kendi kodunuz
externalOrderIdmetinzorunlu; Trendyol için paket numarası (shipmentPackageId)
orderNumber, orderDateorderDate zorunlu
orderStatusNEW | PENDING_APPROVAL | APPROVED | COMPLETED | CANCELLED | RETURNED
fulfillmentStatusUNFULFILLED | READY_TO_SHIP | SHIPPED | DELIVERED
billingStatusNOT_READY | READY | INVOICED | NOT_REQUIRED
currency, subtotal, shipping, discount, commission, total
customer, shippingAddress, summarynesne
items[]externalLineId, sku, name, quantity, unitPrice, discount, vatRate
shipments[]carrier, trackingNumber, status, shippedAt, deliveredAt, trackingUrl

Silme (deleted)

externalId listeleriyle bildirilir: cari, tedarikçi ve ürün pasife alınır (geçmiş korunur); bu kaynaktan gelen gider ve kasa-banka hareketi silinir. Faturalar silinmez; status: "CANCELLED" gönderin.

Yanıt ve hata kodları

{
  "ok": true,
  "runId": "…",
  "stats": { "customers": { "created": 3, "updated": 10 }, "products": { "created": 2, "updated": 40 } },
  "errors": [ { "type": "products", "externalId": "55", "code": "DUPLICATE_SKU", "message": "Bu stok kodu (SKU) firmada başka bir ürüne ait." } ]
}

Bir kaydın hatası diğerlerini durdurmaz. Mesajlar Türkçedir ve kullanıcıya gösterilebilir.

Kayıt codeAnlamıNe yapmalı
VALIDATIONalan eksik/geçersizmesajdaki alanı düzeltip tekrar gönderin
DUPLICATE_SKU, DUPLICATE_BARCODESKU/barkod başka üründebenzersiz kod gönderin ya da barkodu boş bırakın
DUPLICATEbenzersizlik çakışmasıkimlikleri kontrol edin
REFERENCEbağlı kayıt nedeniyle yazılamadıönce bağlı kaydı gönderin
NOT_FOUNDstok için ürün yokönce products[] gönderin
WRITE_FAILEDgeçici yazma hatasıaynı sayfayı tekrar gönderin
HTTPcodeNe yapmalı
401API_KEY_INVALIDanahtarı kontrol edin / yenisini oluşturun
402SUBSCRIPTION_PAYMENT_REQUIREDfirma aboneliği ödeme bekliyor; durun
413sayfayı küçültün
422INVALID_BODYgövdeyi düzeltin (source, sayfa sınırları)
423BUSINESS_SUSPENDEDfirma erişimi durdurulmuş; durun
429RATE_LIMITED / DAILY_QUOTARetry-After kadar bekleyin
5xxWRITE_FAILEDüstel geri çekilmeyle tekrar deneyin

Değişiklik akışı (Heyşirket → sizin sisteminiz)

GET /api/v1/changes?after=<seq>&limit=200[&types=inventory.movement,product.updated]

{ "events": [ { "seq": 41, "type": "inventory.movement", "entityType": "inventory_movement", "entityId": "…", "createdAt": "2026-10-13 09:12:00",
    "data": { "productExternalProvider": "api:magazam", "productExternalId": "123", "sku": "S1", "direction": "IN", "quantity": 5, "warehouseCode": "ANA" } } ],
  "next": 41, "hasMore": false }

Akışa yalnız Heyşirket'te yapılan değişiklikler düşer; bu API ile yazılanlar geri yansıtılmaz (döngü oluşmaz). next değerini saklayın ve sonraki çağrıda after olarak gönderin; hasMore: true ise hemen tekrar çağırın. Kendi kayıtlarınızı externalProvider = api:<source> olanlarla eşleyin.

TürNe zamanÖnemli alanlar
inventory.movementstok girişi/çıkışı/sayım (fatura ile düşen stok dahil)direction (IN +, OUT −, ADJUSTMENT işaretli, RESERVE/RELEASE bilgi), quantity, productExternalId, sku
product.created / product.updatedürün/varyant eklendi/değişti (yeni beden, fiyat, satışa kapatma/açma)id, externalId (yoksa Heyşirket'te açılmış), ad, SKU, barkod, fiyat, KDV, isActive, attributes, familyExternalId, imageUrl
family.created / family.updatedürün ailesi eklendi/değişti/pasife alındıid, externalId, ad, açıklama, marka, kategori, görsel, isActive
customer.created / customer.updatedcari eklendi/değiştiid, externalId, unvan, vergi no, iletişim
supplier.created / supplier.updatedtedarikçi eklendi/değiştiid, externalId, unvan, vergi no, iletişim, web adresi, isActive
invoice.created / invoice.updatedHeyşirket'te fatura kesildi / durum, numara, ödeme durumu değiştiid, externalId, number, status, providerId (ETTN), paymentStatus, tutarlar
payment.created / payment.voidedtahsilat kaydı / iptaliinvoiceExternalId, amount, paidAt, method
expense.created / expense.updatedgider eklendi/değiştiid, apiExternalId, tutarlar, tedarikçi, kategori, ödeme durumu
order.updatede-ticaret siparişinde onay/kargo/tamamlamachannel, externalOrderId, action, durumlar, trackingNumber

Uygulama sırası: her turda önce akışı okuyup uygulayın, sonra kendi değişikliklerinizi gönderin. Heyşirket'te açılan ürün/varyant/aile için kendi kaydınızı oluşturun ve bir sonraki gönderimde heysirketId ile eşleyin. Stok olaylarını fark olarak uygulayın; sonra mutlak stok gönderdiğinizde Heyşirket sıfır fark görür.

Entegrasyon kontrol listesi

Sık sorulanlar

Aynı kaydı iki kez gönderirsem ne olur? Güncellenir; kopya oluşmaz.

Pazaryeri faturalarım gecikmiş görünüyor. dueDate olarak beklenen hakediş tarihini, ödendiğinde de payments[] ile tahsilatı gönderin.

Ürünlerim Heyşirket'te tek tek görünüyor. Varyantları family ve attributes ile gönderin; aile tek satırda toplanır.

Heyşirket'te stok girdim, sistemime nasıl gelir? GET /changes akışındaki inventory.movement olayını fark olarak uygulayın.

Büyük kataloğum var. İlk aktarım günlük kotaya göre birkaç güne yayılır; DAILY_QUOTA aldığınızda kalan kayıtları ertesi gün gönderin.