Başlarken
Değişiklik günlüğü
Genel storefront API'sindeki her değişikliğin tarihli, en yeniden eskiye kaydı. Bir entegrasyonu yükseltmeden önce bunu okuyun.
Markdown olarak görüntüleStorefront API'si URL öneki (/v1) ile sürümlenir. v1 içinde her değişiklik eklemelidir: alanlar, endpoint'ler, isteğe bağlı parametreler ve enum değerleri yalnızca eklenir. Aşağıdaki her kayıt yayınlandığı tarihi, neyin değiştiğini ve bu referansın hangi sayfalarının güncellendiğini belirtir. Aynı kayıtlar depo değişiklik günlüğünde de yer alır.
2026-10-29
Eklendi
GET /v1/api/commerce/productsveGET /v1/api/commerce/products/{id}üzerindevariants[].image_id(uuid veya null) vevariants[].image(görsel nesnesi veya null): bir varyantın kendi görseli, ürünün medya öğelerinden biri; bu nedenleimage_id, detay endpoint'indekiimagesiçindeki bir öğeyle eşleşir. Shopify'dan içe aktarılan ürünler bunuVariant Imagesütunundan alır. Bkz. Varyant nesnesi.
2026-10-24
Notlar
- Dokümantasyon düzeltmesi, API'de hiçbir şey değişmedi. Webhook olay kataloğu artık
WebhookDispatcher'ın sales modülünden beri izin verdiği sekiz abone olunabilir sales olayını belgeliyor:quote.offered,quote.accepted,quote.declined,quote.expired({id, number, status, origin, total_amount, currency, email, valid_until, signed_at}) veinvoice.sent,invoice.paid,invoice.overdue,credit_note.sent({id, number, kind, status, total_amount, paid_amount, open_amount, currency, email, issue_date, due_date}), her birinin ne zaman gönderildiğiyle birlikte. Bkz. Webhook'lar. - Scope tablosu artık verilebilir her scope'u ve onu denetleyen rotaları listeliyor:
catalog:read(vecatalog:write,configurator:*çifti), eski adlarıcustomers:*olancontacts:read/contacts:write,sales:read/sales:writeve verilebilir olup henüz hiçbir/v1/apirotasının kullanmadığı scope'lar. Bkz. Kimlik doğrulama.
2026-10-18
Eklendi
GET /v1/api/forms/address-lookup(scopeforms:read):country=NL,postal_code,house_numberve isteğe bağlıaddition,200 {street, city, postal_code, lat, lon}döndürür (dataiçine sarılmaz). Hatalar:404(No address found.),country,postal_codeveyahouse_numberüzerinde422,503(Address lookup is temporarily unavailable.). Mağaza başına dakikada 60 istek, sonrasında429. Bkz. Adres arama.- Formlarda
addressalan türü.configşu biçimdedir:{country, lookup?, service_area?}; yanıt{postal_code, house_number, addition?, street, city, lat?, lon?}olur ve geçersiz bir değeranswers.{key}üzerindeMust be a valid address.hatasını verir.service_areaşudur:{origin: {lat, lon, label?}, radius_km, mode: notice | block, message}. Bkz. Alan türleri. - Saklanan bir başvuruda
meta.address: hizmet bölgesi olan heraddressalanı için{distance_km, in_area}.mode: "block"ile adresi kesin olarak bölge dışında olan bir başvuru,answers.{key}üzerinde alanınmessagemetniyle422verir. Bkz. Adres alanları ve hizmet bölgesi. choicealanlarındaoptions_source:{object_type, label, description?, sort?, limit?}.GET /v1/api/forms/{key}her istekteconfig.optionsdeğerini koleksiyonun herkese açık görünen kayıtlarından doldurur ve başvuru bunlara göre kontrol edilir. Bkz. Alan türleri.- Bir
addressyanıtının parçaları için kırpmadan sonraki uzunluk sınırları:postal_code12 karakter,house_number20,addition10,streetvecity255'er. Daha uzun bir parça,@borkol/formspaketinincheck()işlevinde de,answers.{key}üzerindeMust be a valid address.hatasını verir. Bkz. Alan türleri. @borkol/forms0.2.0:BorkolFormveuseBorkolFormüzerindekipersistKeyseçeneği ziyaretçinin taslağını 30 güne kadarlocalStorageiçinde tutar;formatAddress,normaliseAddressvedistanceKmdışa aktarılır. Bkz. @borkol/forms paketi.
Değiştirildi
- Bir formda artık 150 girdi alanı olabilir (önceden 60).
headingveparagraphsayılmaz. Adımlar 20'de kalır. Bkz. Tanım: adımlar ve alanlar.
Notlar
addressyeni bir alan türüdür: bileşenikinddeğerine göre seçen bir renderer'ın bunun için bir bileşene ihtiyacı vardır. Bilinmeyen bir türü,/v1içinde her zaman olduğu gibi eklemeli bir değişiklik sayın.GET /v1/api/forms/{key}yanıtında biraddressalanınınconfig.service_area.messagedeğeri, tanımdaki diğer tüm metinler gibi istenen dilde bir metindir (her zamanki yedek dil kuralıyla). Bkz. Alan türleri.
2026-10-16
Eklendi
- Modül-devre-dışı hata gövdesinde, hem
403hem404varyantındacode: "module_disabled"vemodule(modül anahtarı).errordeğişmez, bu nedenle mevcut kontroller çalışmaya devam eder. Bkz. Modül etkin değil.
2026-10-13
Eklendi
- Formlar. Yeni bir
formsmodülü ve bölümü.GET /v1/api/forms/{key}?locale=(scopeforms:read), etkin bir formun yayınlanmış sürümünüdataiçinde döndürür:{key, version, name, steps, settings: {thank_you: {message, redirect_url}}}; her metin tek bir dile indirgenir ve mağazanın varsayılan diline geri döner. Adımlar ve alanlarshow_ifkuralları taşır (equals,not_equals,contains,filled,empty, tek seviyeallveyaany); alan türleritext,textarea,number,email,phone,date,select,link,choice,consent,hidden,file,headingveparagraph'tır. Bkz. Formlar ve Form yükleme. POST /v1/api/forms/{key}/submissions(scopeforms:write) yanıtları aynı kurallarla yayınlanmış sürüme göre kontrol eder, gizli alanlara verilen yanıtları atar, başvuruyu saklar ve201 {"data": {"number", "thank_you": {message, redirect_url}}}döndürür. Hatalaranswers.{key}vefiles.{key}anahtarlı422zarfını kullanır; boş bir string veyanulldışında bir değer taşıyanhoneypot,number: nullile201döndürür ve hiçbir şey saklamaz. Bkz. Başvurular.- Form route'larında
X-Borkol-Visitor-Ipheader'ı: form başına saatlik sınır (ziyaretçi başına 1 ile 100, varsayılan 5)422ile başarısız olanlar dahil ziyaretçi adresi başına sayılır ve429 {"message": "Too many submissions. Try again later."}döndürür. Geçerli bir header yoksa bağlantının adresi kullanılır. Bkz. Ziyaretçi IP'si ve saatlik sınır. forms:readveforms:writescope'ları ve403 {"error": "Module not enabled: forms"}içinde modül anahtarı olarakforms.forms:writeanahtarlarını sunucunuzda tutun. Bkz. Kimlik Doğrulama.- Webhook olayları
form.published({key, version}) veform_submission.created({id, number, form_key, status, locale, name, email, created_at}, asla yanıtlar değil). Bkz. Webhook'lar. POST /v1/api/forms/{key}/uploads(scopeforms:write, multipartfieldvefile) birfilealanı için tek bir dosyayı gizli olarak saklar ve201 {"data": {"token", "name", "size"}}döndürür. Tür içeriğe göre (image: JPEG, PNG, WebP, HEIC/HEIF;pdf: PDF), boyut alanınmax_mbdeğerine göre (en fazla 20 MB) kontrol edilir; hatalarfieldveyafileüzerinde422'dir. Form ve ziyaretçi başına saatte 30 yükleme, sonrasında429 {"message": "Too many uploads. Try again later."}. Token'lar tek kullanımlıktır, forma ve alana bağlıdır ve 24 saat sonra süresi dolar. Bkz. Yüklemeler.POST /v1/api/forms/{key}/submissionsüzerindefiles: alan anahtarından yükleme token'ları listesine, başvuruyla birlikte talep edilir; bilinmeyen, başka bir forma veya alana ait, kullanılmış ya da süresi dolmuş bir tokenfiles.{key}üzerinde422döndürür (This upload is invalid or has expired. Upload the file again.). Bkz. Başvurular.- Formlarda Cloudflare Turnstile: formda Turnstile açıksa ve mağaza iki anahtarı da ayarladıysa
GET /v1/api/forms/{key}üzerindesettings.turnstile_site_key, başvuruda ise saatlik sınırdan sonra ve yanıtlardan önce doğrulananturnstile_token. Başarısız bir kontrolturnstileüzerinde422döndürür; token'lar tek kullanımlıktır, bu yüzden her422sonrasında widget'ı sıfırlayın. Bkz. Turnstile ve Form yükleme. @borkol/formspaketi: türler, görünürlük ve yanıt kuralları (visible,check,prefill) veupload,turnstileToken,onServerErrorsile birformErrorbileşeni içeren headless bir React render aracı (@borkol/forms/react). Bkz. @borkol/forms paketi.
Notlar
- Turnstile açık bir form, mağaza iki Turnstile anahtarını da ayarlayana kadar kontrol edilmez: bu durumda
turnstile_site_keyyoktur ve başvurular kontrol olmadan kabul edilir.
2026-10-12
Eklendi
tags,record_ref_listveyarecord_refözelliğindefilter[{propertyKey}]ile filtreleme: saklanan listenin içerdiği bir etiket veya kayıt kimliği (bir referans eşitlikle eşleşir). Bkz. Kayıtlar.GET /v1/api/objects/typesiçindeki her nesne türündesettings:{publishable, slug?};slug{source, prefixes}biçimindedir ve yalnızca tür kayıtlarına adres veriyorsa bulunur. Her özellik tanımındalocalized(boolean) veconfig(object veya null). Bkz. Türler.- Nesne özellikleri için
richtext,datetime,media,media_list,link,icon,token_variant,color,email,phone,tags,record_ref,record_ref_listözellik türleri ve bir düzey iç içe geçebilenrepeater; mevcut türlere ek olarak. Özellikler yerelleştirilebilir (number, money, boolean, date, datetime, customer, color, media_list, kayıt referansları, repeater ve sections hariç;media_listbunun yerinealtvecaptiondeğerlerini locale haritası olarak taşır). Bkz. Nesneler. - Her kayıtta
published_at, adresi olan bir türün kayıtlarında iseslugs(dil etiketinden adrese); mağazada etkin dillerle sınırlıdır. Bkz. Kayıtlar. GET /v1/api/objects/types/{key}/records/by-slug/{slug}?locale=, yayınlanmış tek bir kaydı bir dildeki adresiyle getirir (localevarsayılan olarak mağazanın varsayılan dilidir; etkin değilselocaleüzerinde422, görünür bir eşleşme yoksa404). Bkz. Kayıtlar.object_record.published,object_record.updated,object_record.unpublishedveobject_record.deletedwebhook olayları; payload{id, type_key, slugs, published_at}. Yalnızca gerçek geçişlerde gönderilirler; zamanlanmış bir kaydın zamanı gelmesi bir şey göndermez. Bkz. Webhook'lar.GET /v1/api/redirectsartıktenant:readveobjects:readscope'larını da kabul eder ve kayıt adreslerini ürünleri ve kategorileri yönlendirdiği gibi yönlendirir (bir kayıt adresi değişikliği yalnızca türün o dil için boş olmayan bir adres öneki varsa yönlendirme kaydeder). Bkz. Yönlendirmeler ve site haritası.GET /v1/api/objects/types/{key}/records,GET /v1/api/objects/records/{id}ve by-slug endpoint'indeinclude=refs(veyainclude[]=refs),record_refverecord_ref_listdeğerlerini bir düzey derinliğinde{id, type_key, values, slugs?, published_at}olarak açar. Herkese açık görünmeyen hedefler atlanır (referans içinnull, listeden çıkarılır); bilinmeyenincludetoken'ları yok sayılır. Bkz. Kayıtlar.GET /v1/api/objects/types/{key}/recordsüzerindelocalesorgu parametresi: yerelleştirilmişfilter[...],sortveqo dili kullanır. Etkili olması için etkin bir dil etiketi gerekir; başka her değer mağazanın varsayılan diline döner. Bkz. Kayıtlar.GET /v1/api/sitemapiçinde nesne kayıtları: herkese açık görünen her kayıt, dil ve adres için bir tane olmak üzere, boş olmayan adres önekine sahip türlerde{type: "object_record", object_type, locale, path, lastmod, alternates}girdileri. Bkz. Yönlendirmeler ve site haritası.GET /v1/api/business(kapsamtenant:read) herkese açık işletme profilini döndürür: ticari ve yasal ad, iletişim bilgileri, adres, sicil ve KDV numaraları,social_links({platform, url, label}, 23 platform), varsayılanlocalevecontent_locales. Banka, imzalayan, gönderici ve koşul alanları asla açılmaz; profili olmayan bir mağaza200ile null değerler döndürür. Bkz. İşletme profili.
Değişti
- Medya değerleri nesnedir. Bir
mediadeğeri (bir özellik veya bir section ya da repeater satırındaki alan) artık{id, url, alt, width, height, mime_type}biçimindedir; öğe eksikse veya özelsenull. Eskiden string olarak medya id'siydi. Birmedia_listdeğeri aynı nesnelerin listesidir, her biri bircaptiontaşır; eksik veya özel öğeler listeden çıkarılır. Medya id'sini kendiniz getirmeniz artık gerekmez. Bkz. Nesneler. - Taslaklar ve zamanlanmış kayıtlar gizlidir.
settings.publishable: trueolan bir türde taslaklar ve gelecektepublished_atdeğeri olan kayıtlar kayıt listesinden çıkarılır;GET /v1/api/objects/records/{id}ve slug ile getirmede404döndürür.filter[status]public olarak kabul edilmez (filterüzerinde422). Yayınlanabilir olmayan türler değişmez. Bkz. Kayıtlar ve Yayınlama ve görünürlük. - Yerelleştirilmiş değerler etkin dillere indirgenir. Yerelleştirilmiş bir özellik veya alan, yalnızca mağazada etkin dilleri içeren, dil etiketinden değere bir harita döndürür. Boş olarak saklanmış bir
sectionsdeğeri[]olarak döner; artık var olmayan bir türün section'ları çıkarılır. Bkz. Nesneler. GET /v1/api/redirectsveGET /v1/api/sitemapplatform tarafından sunulur. Aynı yollar, aynı yanıtlar. Artık catalog modülünü gerektirmezler (artık403 Module not enabled: catalogyok),catalog:read,commerce:read,tenant:readveyaobjects:readscope'larından herhangi birini kabul ederler ve site haritası yalnızca etkin modüllerin girdilerini listeler (catalog modülü olmayan bir mağaza boş bir liste alır). Referans sayfası Katalog'dan Başlarken bölümüne taşındı. Bkz. Yönlendirmeler ve site haritası.- Yerelleştirilmiş filtre, sıralama ve arama
localedeğerini izler. Yerelleştirilmiş bir özelliğe göre filtreleme veya sıralama ve yerelleştirilmiş bir metin özelliğindeq, artık ham saklanan harita yerine istenen dildeki değeri (localeyoksa mağazanın varsayılan dilini) okur. Bkz. Kayıtlar. - Varsayılan dili olmayan çeviriler saklanır. Zorunlu olmayan ve mağazanın varsayılan dili için girdisi bulunmayan çevrilebilir bir özellik veya alan, örneğin varsayılan
nliken{"en": "Dusk"}, atılmak yerine yazıldığı gibi saklanır; yalnızca tüm girdileri boş olan bir map boş sayılır. Zorunlu olan hâlâ422döner.richtextizin listesine ayrıca yalnızcasrcvealtileimgeklendi (https://veya kök göreli/kaynaklar; diğer herimgkaldırılır). Bkz. Objects.
Notlar
- Kayıt şekline
published_at(her zaman) veslugs(adresi olan türler) eklendi. Bilinmeyen alanları,/v1içinde her zaman olduğu gibi, eklemeli kabul edin.
2026-10-11
Eklendi
GET /v1/api/commerce/productsveGET /v1/api/commerce/products/{id}ürün nesnesindecapability(standardveyamade_to_measure) vecapability_active(boolean).capability, ürünün sepete nasıl ekleneceğini söyler;capability_active, ürünü satan modül (standardiçin commerce,made_to_measureiçin configurator) devre dışı olduğu sürecefalseolur. Bkz. Ürünler.- Ürün nesnesinde (
piece,kg,g,l,m,m2,m3,hour) ve her sipariş satırındaunit(lines[].unit, sipariş anında ürünün birimi). Bkz. Ürünler ve Siparişler. compare_at_amount,barcode,weight_grams,requires_shipping,track_stock,returnable,lead_time_days,tagsvesocial_imageürün alanları ilebarcodeveweight_gramsvaryant alanları. Bkz. Ürünler.GET /v1/api/redirects?path=, slug'ı değişen bir ürün veya kategori yolu için{data: {from_path, to_path, status}}döndürür (yoksa 404) veGET /v1/api/sitemap, tüm aktif ürün ve kategori yollarını{data: [{type, path, lastmod}]}olarak listeler. Her ikisi decatalog:readveyacommerce:readve catalog modülü gerektirir. Bkz. Yönlendirmeler ve site haritası.- Sepete eklemenin bir satırı reddettiği 422 yanıtında (
POST /v1/api/commerce/carts/{id}/lines), değişmeyenmessageveerrorsalanlarının yanında en üst düzeyde bircode:CAPABILITY_INACTIVE,INVALID_CONFIGURATIONveyaNOT_PURCHASABLE. Bkz. Sepet satırları ve Hatalar ve Rate Limit'ler. - Checkout veya kabul edilen bir teklif üzerinden verilen her sipariş satırında
attributes.returnableveattributes.lead_time_days; made-to-measure bir satır asla iade edilemez. Bkz. Siparişler.
Değişti
- Geriye dönük uyumsuz:
typeürün nesnesinden kaldırıldı. Bunun yerinecapabilityile birlikterequires_shippingvetrack_stockkullanın: eskisimplevevariableürünlerstandard;configurableürünlermade_to_measure(ve iade edilemez);digital,licensevesubscriptionürünlerrequires_shipping: falsevetrack_stock: falseilestandardolur. Bkz. Ürünler. - Geriye dönük uyumsuz: adetler ondalıklıdır. Sepet, sipariş ve teklif satırlarındaki
quantity, stok durumundakiavailable, checkout ve teklif kabulündekiout_of_stock[].requestedile.available, vestock.adjustedwebhook'undakiquantityondalıklı olabilen JSON sayılarıdır (0.75,12).POST /v1/api/commerce/carts/{id}/linesvePATCH .../lines/{lineId}üzerindekiquantityen fazla üç ondalık basamak kabul eder;unitdeğeripieceolan bir ürün hâlâ yalnızca tam sayı alır (quantityüzerinde 422). Bkz. Sepet satırları, Sepetler, Siparişler, Stok durumu ve Webhook'lar. - Geriye dönük uyumsuz: configurator endpoint'leri (
GET /v1/api/commerce/configurator/products/{id}/schema,POST .../quote) configurator modülüne bağlıdır: modül yoksa403 {"error":"Module not enabled: configurator"}döndürürler (öncedencatalog).capabilitydeğerimade_to_measureolmayan bir ürün için 404 döndürürler. Bkz. Yapılandırma şeması, Fiyat teklifi ve Konfigüratör nasıl çalışır. - Configurator boyutları tam sayı olmalıdır; ondalıklı bir değer önceden kırpılıyordu, artık reddedilir. Quote endpoint'i, en üst düzeyde
codeolmadan düz doğrulama zarfındadimensions.{key}üzerinde 422 ({Label} must be a whole number.) döndürür; sepete ekleme aynı hatayıcodeINVALID_CONFIGURATIONile döndürür. Bkz. Fiyat teklifi ve Sepet satırları. - Geriye dönük uyumsuz: sepet ve sipariş satırlarındaki yapılandırma anlık görüntüsünde
components[].qtykesin bir ondalık string'dir ("2.16"), önceden integer'dı. Bkz. Sepetler ve Siparişler. - Geriye dönük uyumsuz:
POST /v1/api/commerce/carts/{id}/quote-requestsales modülüne aittir ve mağazada sales devre dışıysa404 {"error":"Module not enabled: sales"}döndürür. Teklif tetikleyicileri yalnızca sales etkin ve teklif talepleri açıkken devreye girer; aksi halderequires_quoteher zaman false olur ve checkout hiçbir zamanQUOTE_REQUIREDile reddetmez. Bkz. Teklif talepleri, Checkout ve Hatalar ve Rate Limit'ler. purchasabilitysales modülü tarafından belirlenir ve satıcı hiçbir şey ayarlamadıysadirectolur; sales devre dışı olsa bile raporlanır.quoteürün sepete eklenebilir: sepetproduct_purchasabilitynedeniylerequires_quote: truebildirir, checkout409 {"code": "QUOTE_REQUIRED", "reasons": [...]}ile reddeder ve sepet bunun yerine teklif talebinden geçer. Bir kişi grubunun her zaman teklif ayarı artık bir sales ayarıdır;customer_groupnedeni değişmedi. Bkz. Ürünler ve Teklif talepleri.stock_status,track_stock: falseolan bir ürün ve tüm varyantları için, stok satırları olsa bile, ürün nesnesinde veGET /v1/api/stock/availabilityileGET /v1/api/stock/products/{productId}üzerindeuntrackedolur (tracked: false). Bkz. Ürünler ve Stok durumu.- Checkout, sepette ürünü
requires_shipping: trueolan bir satır varsashipping_method_idister (önceden:simple,variableveyaconfigurabletipinde bir ürün). Bkz. Checkout ve Kargo yöntemleri. - Sepetten oluşturulan teklif satırları, adet olarak satılan bir ürün için
unitpcs, aksi halde ürünün birimini taşır (öncedennull). Bkz. Teklif talepleri ve Teklif token'ları. - Sipariş modunda bir teklifi kabul etmek, stoğu her ürünün line handler'ı üzerinden teklif edilen fiyattan rezerve eder; böylece made-to-measure bir satır bileşenlerini düşer. Yalnızca gerçek bir yetersizlik
OUT_OF_STOCKile reddedilir; ürünü artık satılamayan bir satır stok hareketi olmadan dönüştürülür. Bkz. Teklif token'ları.
Kullanımdan kaldırıldı
POST /v1/api/sales/quotes/by-token/{token}/acceptvePOST /v1/api/commerce/quotes/by-token/{token}/acceptüzerindekiQUOTE_NOT_ORDERABLE(422) artık döndürülmez: kesirli satır miktarlarına sahip bir teklif, bu miktarlarla bir siparişe dönüştürülür. Kodu tolere etmeye devam edin ama artık görmeyi beklemeyin. Bkz. Teklif token'ları.
Notlar
/v1yüzeyi, herhangi bir üretim tüketicisi ona bağımlı olmadan önce yeniden yapılandırıldı; bu nedenle yukarıdaki geriye dönük uyumsuz değişiklikler yeni bir URL sürümü yerine/v1içinde yayınlanıyor. Bu sürümden itibaren/v1içindeki değişiklikler yeniden yalnızca eklemelidir.- Belgeleme düzeltmeleri, API'de hiçbir şey değişmedi: ürün ve kategori endpoint'leri
catalog:readveyacommerce:readkabul eder ve catalog modülüne bağlıdır (referanscommerce:readvecommercediyordu); sipariş nesnesindekiinvoice_idve teklif talebi yanıtının tamamı (origin,intro,terms,acceptance_mode,pdf_url,signed_at,signed_pdf_urlve satır alanlarıkind,unit,description,tax_rate,unit_price) artık belgelenmiştir. Bkz. Ürünler, Kategoriler, Siparişler ve Teklif talepleri.
2026-09-17
Eklendi
POST /v1/api/commerce/carts/{id}/checkout,GET /v1/api/commerce/orders/{id}veGET /v1/api/commerce/my/orderstarafından döndürülen sipariş nesnesindediscount_total(money) vediscount_breakdown(array veya null).discount_total.amount, ödeme sırasında uygulanan ürün indirimidir (indirim yoksa0);discount_breakdownuygulanan her indirim için bir{discount_id, name, code, kind, amount}kaydı listeler ve indirim yoksanullolur. Her ikisi de eklemelidir; mevcut hiçbir alan değişmedi. Bkz. Siparişler ve Ödeme.POST /v1/api/commerce/quotes/by-token/{token}/acceptüzerindekiOUT_OF_STOCKreddindemessage(yalnızca sipariş modu). 409 gövdesi artık{"code": "OUT_OF_STOCK", "message": "Insufficient stock.", "out_of_stock": [...]}şeklindedir;out_of_stocksatırları değişmedi. Eklemelidir ve zarf artık endpoint'teki diğer tüm retlerle (code+message) aynı biçimdedir. Bkz. Teklif token'ları.
Değişti
POST /v1/api/commerce/carts/{id}/claimartık müşterinin sahip olduğu her diğeractivesepeti sahiplenilen sepete birleştiriyor, yalnızca bulunan ilkini değil. Birleştirilen her sepet eskisi gibimergeddurumuna geçer ve stok rezervasyonlarını serbest bırakır; yalnızca geride sahipsiz bir aktif sepet kalmaz. Bkz. Sepet sahiplenme ve Storefront rehberi.- Sahiplenme birleştirmesi kimliği de taşır: sahiplenilen sepet, ayarlıysa kendi
emailvemetadatadeğerlerini korur, aksi halde birleştirilen sepetin değerini alır; böylece giriş yapılmadan önce yakalanan bir misafir e-postası artık kaybolmaz. Sepet zarfına alan eklenmedi veya tipi değiştirilmedi. Bkz. Sepet sahiplenme.
Notlar
POST /v1/api/commerce/carts/{id}/lines: aynı anda gönderilen iki özdeş ekleme (aynı ürün, varyant ve yapılandırma) eskiden kaybeden isteğin 500 ile başarısız olmasına yol açıyordu. Kaybeden istek artık miktarını kazanan satıra katlar ve eskisiyle aynı 201 zarfını döndürür;max_quantity_per_linesınırı korunur. Bkz. Sepet satırları.X-Customer-Tokenişleme artık belgelenen "bir müşteriye çözümlenmeli, aksi halde 401" kuralıyla tutarlıdır:expires_atsüresi geçmiş veya platformun oturum penceresinden eski bir token artık çözümlenmez, dolayısıyla müşteriye bağlı bir sepeti sahiplenemez veya ödemeye taşıyamaz. Yeni bir token için tekrar giriş yapın. Bkz. Sepet sahiplenme ve Ödeme.POST /v1/api/customers/forgot-passwordbilinen ve bilinmeyen adresler için hâlâ aynı gövdeyle 202 döndürür; artık her iki yolda da aynı miktarda kuyruk işi yapar, böylece yanıt süresi bir hesabın var olup olmadığını ele vermez. Bkz. Parolalar.- Bir
bogoindirimi artık kazanılan adedini sepet başına bir kez değil, her hak ediş için bir kez verir: indirimli birim sayısıget_quantity × floor(uygun satın alma adedi ÷ minimum satın alma adedi)olup en ucuz kazanılan satırın adediyle sınırlıdır. Sepettekidiscounts[].amountve siparişindiscount_totaldeğeri buna göre büyür; hiçbir alan veya enum değeri değişmedi. Bkz. Sepet indirimleri. configurabletipindeki ürünler yalnızca konfigüratör motoruyla fiyatlanır; tip değişikliğinden kalan müşteri grubu ve kademe fiyat satırları artık böyle bir ürününprice,quantity_tiersveya sepet satırı fiyatında görünmez. Basit ürünler etkilenmez. Bkz. Ürünler.POST /v1/api/commerce/quotes/by-token/{token}/accept: sipariş oluşturulurken ortaya çıkanQUOTE_NOT_OFFEREDreddi (aynı teklifin başka bir kabulüyle yarış durumu) artıkQuote cannot be accepted in its current status (...)yerine belgelenmişQuote is not awaiting a response (status: ...)mesajını taşır. Kod ve durum değişmedi. Bkz. Teklif token'ları.
2026-09-04
Değişti
requireskuralı yayınlanan diğer seçimlerle karşılanamayan bir konfigüratör seçimi, artık yayınlanıp quote sırasında reddedilmek yerineGET /v1/api/commerce/configurator/products/{id}/schemayanıtından çıkarılıyor. Filtreleme yayıldığı için şemanın sunduğu her seçim seçilebilir ve fiyatlandırılabilir. Bkz. Yapılandırma şeması ve Konfigüratör nasıl çalışır.POST /v1/api/commerce/configurator/products/{id}/quoteaynı kullanılabilirlik kuralını uygular: şemanın artık yayımlamadığı bir seçimi seçmek mevcut genelchoicesmesajıyla başarısız olur vechoices.{choiceId}mesajları artık yalnızca hâlâ kullanılabilir olan seçimlerin adını verir, böylece pasife alınmış bir seçim hiçbir hata mesajında açığa çıkmaz. Bkz. Fiyat teklifi.- Kullanılabilir olmayan bir seçime koşullanmış fiyat matrisi, kısaltılmış bir
conditionsdizisiyle listelenmek yerine artıkprice_matricesiçinden çıkarılıyor. Böyle bir matris hiçbir zaman uygun hâle gelemeyeceği için motor, ona geri düşmek yerine yapılandırmayınot_priceableolarak değerlendirir. Bkz. Yapılandırma şeması.
Notlar
- Her iki konfigüratör endpoint'i için dokümantasyon düzeltmesi: bu endpoint'ler
catalog:readveyacommerce:readscope'unu taşıyan bir API anahtarını kabul eder (2026-08-25'ten beri değişmedi) ve modül kapıları catalog modülüdür, dolayısıyla 403 gövdesi{"error":"Module not enabled: catalog"}şeklindedir. Referans her ikisi için decommerce:readvecommercediyordu. API'de hiçbir şey değişmedi. Bkz. Fiyat teklifi, Yapılandırma şeması ve Konfigüratör nasıl çalışır.
2026-08-26
Eklendi
- Customer endpoint'leri artık
/v1/api/contacts/*üzerinde de sunuluyor; önceki/v1/api/customers/*path'leri, aynı request ve response şekilleriyle kalıcı bir alias olarak kalıyor. Yeni API-key scope'larıcontacts:readvecontacts:writekullanılabilir; mevcutcustomers:read/customers:writeanahtarları değişmeden çalışmaya devam eder. Bkz. Kişi hesapları. - Kişi profili (
GET/PATCH /v1/api/contacts/me, ayrıca.../customers/me) artıkkind(personveyacompany),company_name,registration_number,vat_id,external_idvedisplay_namealanlarını içeriyor. Bu alanlar storefront API üzerinden salt okunurdur.emailartık satıcı tarafından oluşturulan herhangi bir kişi içinnullolabilir; storefront kaydı bunu hâlâ gerektirir. Bkz. Profil. - Adres
typealanı,shippingvebillingyanında yeni bir değer olanwork'ü kabul ediyor. Bkz. Adresler. - Sipariş ve satıcı teklifi nesnelerinde
contact_id:customer_idile aynı değer, bundan sonraki kanonik ad altında.customer_iddeğişmedi ve kalıyor. Token ile erişilen teklif nesnesinde ikisi de bulunmaz. Bkz. Siparişler ve Checkout. - Teklif token endpoint'leri artık
/v1/api/sales/quotes/by-token/{token}(GET,/accept,/decline) üzerinde de sunuluyor./v1/api/commerce/quotes/by-token/*aynı şekilde ve kalıcı olarak çalışmaya devam ediyor; her iki yol dasales:read/sales:writeveyacommerce:read/commerce:writetaşıyan bir anahtarı kabul eder. Bkz. Teklif token'ları. GET /v1/api/{sales,commerce}/quotes/by-token/{token},origin,intro,terms,scope_items[],acceptance_mode,pdf_url,signed_atvesigned_pdf_urldöner;lines[]içindeki her girişkind,unit,descriptionvetax_ratekazanır. Bkz. Teklif token'ları.POST /v1/api/{sales,commerce}/quotes/by-token/{token}/accept, isteğe bağlı birsignaturebody parametresi kabul eder — mağazanınacceptance_mode'usignatureolduğunda zorunlu, en fazla 2 MB'lık bir PNG veri URL'si — vesigned_pdf_urldöner. Yeni hata kodları:SIGNATURE_REQUIRED(422),SIGNATURE_INVALID(422),QUOTE_NOT_ORDERABLE(422),ALREADY_CONVERTED(409) veQUOTE_EXPIRED(410). Bkz. Teklif token'ları.- Yeni scope'lar
sales:readvesales:write, teklif token endpoint'lerindecommerce:read/commerce:write'ın kabul edildiği her yerde kabul edilir. Bkz. Kimlik doğrulama. - Bir teklifin
status'u artıkdraftolabilir: satıcının yazdığı teklifler gönderilmeden önce var olur. Bir draft'ın numarası yoktur ve token ile hiçbir zaman erişilemez.
Değişti
- Customer endpoint'leri artık bir modülün etkin olmasını gerektirmiyor; 403
Module not enabled: customersyanıtı artık oluşamaz. Bkz. Müşteri hesapları ve Hatalar ve rate limit'ler. - Teklif satırı
quantityalanı (satıcı teklifleri ve token ile erişilen teklif nesnesi) artıkintegeryerinenumberolarak belgelenir: ürün satırları hâlâ her zaman tam sayı bildirir, ancak hizmet ve malzeme satırları artık kesirli bir miktar taşıyabilir (saat, metre). Daha önce tam sayı olan her değer tam olarak aynı şekilde serileştirilmeye devam eder. Bkz. Teklif talepleri ve Teklif token'ları. - Teklif token endpoint'lerinde accept ve decline, çağıranın IP'siyle anahtarlanarak dakikada 30 istek ile sınırlandırıldı. Bkz. Hatalar ve rate limit'ler.
Notlar
- Teklif token endpoint'lerinde
lines[].quantityher zaman bir JSON sayısıydı ve hâlâ öyle; artık kesirli olabilir (iki ondalık). Hiçbir alan kaldırılmadı, yeniden adlandırılmadı veya türü değiştirilmedi.
2026-08-25
Değişti
- Genel katalog rotaları (
/v1/api/commerce/products,/v1/api/commerce/categories,/v1/api/commerce/configurator/*) artıkcatalog:readveyacommerce:readscope'unu taşıyan bir API anahtarını kabul eder. Mevcut anahtarlar değişmeden çalışmaya devam eder. Bkz. Kimlik doğrulama. - Catalog modülü etkin mağazalar için yeni
catalog:readvecatalog:writeAPI anahtarı scope'ları kullanılabilir. Diğer tüm modüllerin scope adları değişmedi.
Notlar
- Bu sürümde hiçbir istek parametresi, yanıt alanı, durum değeri veya hata zarfı değişmedi.