Dönem istatistikleri

Önceden hesaplanmış 1w / 2w / 1m / 3m / 6m / 1y pencereleri — en yüksek, en düşük, başlangıç fiyatı ve değişim — BIST ve ABD hisseleri, fonlar ve emtialar için; ayrıca BIST endeksleri ve Portfoy sektörleri. Hesap üst kaynakta yapılır; bir yıllık mum verisi yerine tek bir satır okursunuz.

Uç noktalar

Uç noktaKapsamAçıklama
GET/v1/periodic/{id}historyTek enstrüman, altı pencerenin tamamı
GET/v1/periodic?ids=historyVirgülle ayrılmış en fazla 100 kimlik, karışık piyasalar
GET/v1/indices/{code}/periodichistoryTek bir BIST endeksi (XU100, XBANK, …), kodla
GET/v1/sectors/{code}/periodichistoryTek bir sektör: birleşik + ayrı TR ve US ayakları

Deneme Alanı'nda deneyin →

Kapsam

Kimlikler her zamanki kanonik biçimdedir. Hangi üst-kaynak varlık tipinin yanıtladığı sizin için çözülür ve yanıt bunu açıkça söyler:

Bir sembol iki enstrüman olabilir — 195 fon kodu, ABD sembolleriyle çakışır. Burada bunlar tek değil, ayrı enstrümanlardır: us:IBM ve fund:IBM farklı satırlar döner ve yanıttaki asset_type hangisinin yanıtladığını söyler. Bu verileri saklıyorsanız, çıplak sembole değil enstrüman kimliğine göre saklayın.
Kapsam dışı: fx ve dünya endeksleri — Bir index:SPX500 kimliği 404 döner; bir fx kimliği de öyle. Bu bilinçlidir. Üst kaynak bu pencereleri 30 BIST endeksi için — yukarıdaki /v1/indices/{code}/periodic ile sunulur — ve bizim kur paritelerimizden farklı bir kaynaktan, farklı fiyat ve farklı zaman damgalarıyla gelen bir TL kur kodu kümesi için hesaplar. Hiçbiri bizim dünya endeksi ve fx piyasalarımızla aynı sembol uzayı değildir; bu yüzden neredeyse doğru sayılar döndürmek yerine hiçbir şey döndürmüyoruz.

Null'lar, sıfırlar ve tazelik

Null, sıfır değildir. Üst kaynak hesaplayamadığı bir değeri 0 yazmak yerine hiç yazmaz; biz de bunu null olarak geçiririz — yani null “değer yok”, 0 ise sayının gerçekten sıfır olduğu anlamına gelir.

Her zaman calculated_at alanını okuyun. Bu satırlar borsa zaman damgası taşımaz, yalnızca yazıcının kendi damgasını taşır; dolayısıyla taze bir satırı donmuş bir satırdan ayıran tek sinyal budur. Hisseler ve endeksler yaklaşık 15 dakikada bir, fonlar 6 saatte bir, sektörler saatlik yeniden hesaplanır.

Eksik bir satır 404'tür, uydurulmuş bir tahmin değil. Bir fiyat akışı bir tur boş döndüğünde enstrümanlar geçici olarak satırsız kalabilir; bu yüzden 404'ü “hiçbir zaman” değil “şu anda değil” olarak yorumlayın.

veri ve tazelik politikası

Yanıt alanları

AlanTürNotlar
instrument_idstringİstediğiniz kimlik, kanonik biçimde geri döner (bist:GLDTR veya bist:GLDTR.F olarak istenen BIST BYF'si bist:GLDTRF olarak yanıtlanır)
asset_typestringHangi üst-kaynak satırı yanıtladı — US_STOCK, FUND, STOCK, BYF (BIST borsa yatırım fonları, ör. bist:ZPX30F; istisna bist:GMSTRF, üst kaynak onu hisse olarak kayıtladığı için STOCK döner), GOLD, EMTIA
current_pricestring | nullPencerelerin ölçüldüğü fiyat
calculation_datedate | nullHesabın kapsadığı iş günü
calculated_atdatetime | nullYazıcının bu satırı en son hesapladığı an — tazelik sinyaliniz
periodsobject1w, 2w, 1m, 3m, 6m, 1y anahtarlarıyla
periods[].high / .lowstring | nullPencere içindeki en yüksek / en düşük fiyat
periods[].start_pricestring | nullPencerenin başındaki fiyat — değişim buradan ölçülür
periods[].change_pct / .change_nominalstring | nullPencere boyunca değişim, yüzde ve mutlak
currencystring | nullFiyat alanlarının para birimi (bist/fon TRY, us USD, emtia katalogdaki gibi); dürüstçe söylenemiyorsa null
fx_rate / fx_as_ofstring / datetime | nullYalnızca ?currency= yanıtı çevirdiğinde dolu: kullanılan spot kur ve gözlem zamanı

Tüm sayısal değerler JSON string tipindedir; böylece size ulaşana kadar hassasiyet kaybolmaz. Float değil, ondalık (decimal) olarak ayrıştırın.

Örnek — bir ABD hissesi

curl
curl -H "X-API-Key: $PORTGATE_KEY" \
  "https://api.theportfoy.com/portgate/v1/periodic/us:IBM"
response
{
  "instrument_id": "us:IBM",
  "asset_type": "US_STOCK",
  "currency": "USD",
  "current_price": "231.835",
  "calculation_date": "2026-08-25",
  "calculated_at": "2026-08-25T14:11:41.780419",
  "periods": {
    "1w": {"high": "237.36", "low": "231.01", "start_price": "232.685",
           "change_pct": "-0.3653007284526266", "change_nominal": "-0.8499999999999943"},
    "2w": {"high": "238.67", "low": "228.32", "start_price": "238.48",
           "change_pct": "-2.786397182153632", "change_nominal": "-6.644999999999982"},
    "1m": {"high": "238.67", "low": "215.82", "start_price": "215.98",
           "change_pct": "7.34095749606446", "change_nominal": "15.855000000000018"},
    "3m": {"high": "330.08", "low": "205.86", "start_price": "257.055",
           "change_pct": "-9.81112991383167", "change_nominal": "-25.22"},
    "6m": {"high": "330.08", "low": "205.86", "start_price": "243.215",
           "change_pct": "-4.6789877269082885", "change_nominal": "-11.379999999999995"},
    "1y": {"high": "330.08", "low": "205.86", "start_price": "239.43",
           "change_pct": "-3.1721171114730815", "change_nominal": "-7.594999999999999"}
  }
}

?currency= ile çevirme

Her yanıt artık currency alanını taşır: current_price ile her pencerenin high, low, start_price ve change_nominal alanlarının para birimi. Bu alanları güncel spot kurla çevirmek için ?currency=TRY, USD veya EUR ekleyin (tekli ya da toplu); kullanılan kur fx_rate ve fx_as_of ile bildirilir. change_pct bir yüzdedir ve asla çevrilmez. Toplu istekte her yerel para birimi için bir kur alınır.

curl — THYAO windows in USD (scope: history)
curl -H "X-API-Key: $PORTGATE_KEY" \
  "https://api.theportfoy.com/portgate/v1/periodic/bist:THYAO?currency=USD"
# → {"instrument_id": "bist:THYAO", "currency": "USD", "current_price": "…",
#    "periods": {…high/low/start_price/change_nominal in USD, change_pct unchanged…},
#    "fx_rate": "…", "fx_as_of": "…"}
Katalogda source_fields: raw olan yurt dışında fiyatlanan emtialar istisnadır, çünkü üst kaynak bunların pencerelerini TRY'ye çevrilmiş fiyattan hesaplar: USD fiyatlananlar bu yüzden currency: TRY bildirir, ABD senti (USX) ile fiyatlananlar (ör. cmdty:CORN) ise currency: null bildirir ve çevirmeyi 422 ile reddeder — üst kaynaktaki TRY çevirileri güvenilir değildir. Toplu istekte böyle tek bir kimlik, quotes toplu isteğinde olduğu gibi tüm çağrıyı 422 ile düşürür.

Toplu okuma

En fazla 100 kimliği /v1/periodic?ids= uç noktasına verin. Piyasalar karışık olabilir. Satırı olmayan kimlikler, çağrının tamamını başarısız kılmak yerine not_found dizisinde döner; böylece kotasyondan çıkmış tek bir sembol diğer 99'una mal olmaz. Toplu istekler istek başına değil, enstrüman başına ölçülür.

curl
curl -H "X-API-Key: $PORTGATE_KEY" \
  "https://api.theportfoy.com/portgate/v1/periodic?ids=us:IBM,fund:IBM,bist:ZPX30F"
response
{
  "stats": [
    { "instrument_id": "us:IBM",   "asset_type": "US_STOCK",
      "current_price": "231.835",  "periods": { /* as above */ } },
    { "instrument_id": "fund:IBM", "asset_type": "FUND",
      "current_price": "3.905547", "periods": { /* a different row */ } }
  ],
  "not_found": ["bist:ZPX30F"]
}

Sektörler: iki uç nokta, iki farklı sayı

Bu, şununla aynı değer değildir: /v1/sectors/{code}/returns. O uç nokta, sektör endeks değerlerinden bir oran olarak burada hesaplanır ve 1w/1m/3m/6m/ytd/1y döneminde çalışır. Bu uç nokta ise üst kaynağın sektör bileşenlerinin ortalamasıdır; 1w/2w/1m/3m/6m/1y döneminde ve Türkiye ile ABD ayakları ayrı ayrı. İki farklı yöntem, aynı sayının iki görünümü değil — farklı çıkmalarını bekleyin ve yöntemi size uyanı seçin.

combined bloğunda bilinçli olarak fiyat alanı yoktur. Bir sektörün fiyatı olmaz; bu yüzden üst kaynağın oraya yazdığı yer tutucu sıfırlar yerine, pencerenin en iyi ve en kötü bileşen getirisini alırsınız.

Her ayak, getirisinin yanında bir sample_count gönderir: 40'ta 2'lik bir örneklem ile 40'ta 40'lık bir örneklem aynı iddia değildir. Aşağıdaki örnekte ABD ayağının 21 bildirdiğine dikkat edin; sektörün 22 ABD bileşeni var — birinin o pencere için kullanılabilir fiyatı yoktu.

response
{
  "code": "kimya", "name_tr": "Kimya", "sector_id": 21,
  "tr_constituent_count": 44, "us_constituent_count": 22,
  "calculation_date": "2026-08-25",
  "calculated_at": "2026-08-25T13:34:35.679277",
  "combined": {
    "1w": {"change_pct": "2.3122871174622417",
           "best_constituent_pct": "20.889748549323013",
           "worst_constituent_pct": "-12.90613718411552"}
  },
  "tr": {"1w": {"change_pct": "2.7418678795640044", "sample_count": 44}},
  "us": {"1w": {"change_pct": "1.4122131397252147", "sample_count": 21}}
}

Ayrıca bakınız: /docs/sectors · /docs/indices