Sheets'e çek: =IMPORTDATA("https://fonfiyat.com.tr/fiyat/AFA";";") Fon kodunu değiştir, hücreye yapıştır. Kayıt yok, key yok.
fonfiyat › Blog › TEFAS'tan veri çekmek neden artık çalışmıyor? (2026)

TEFAS'tan veri çekmek neden artık çalışmıyor? (2026)

2026-09-30

Yıllardır çalışan formül bir sabah boş dönmeye başladıysa yalnız değilsin. Bu yazı ne olduğunu, neden olduğunu ve bugün ne yapılabileceğini anlatıyor.

Kısa cevap

TEFAS Nisan 2026'da sitesini baştan yazdı. Eski sayfalar ve /api/DB/BindHistoryInfo ucu kaldırıldı; yeni site tarayıcıda JavaScript ile çalışan bir uygulama ve önünde bot koruması var. Google Sheets'in IMPORTHTML / IMPORTXML fonksiyonları JavaScript çalıştırmaz, koruma da tarayıcı olmayan istekleri boş yanıtla geçiştirir. Sonuç: eski formüller, tefas-crawler paketi ve requests ile yazılmış Python scriptleri aynı anda çalışmaz oldu.

Eskiden nasıl çalışıyordu?

Eski TEFAS, klasik sunucu taraflı bir siteydi: fon sayfasını istediğinde HTML içinde tablo hazır gelirdi. Google Sheets bu HTML'i indirip tabloyu ayrıştırabiliyordu. Aynı şekilde BindHistoryInfo adlı bir uç, basit bir POST isteğiyle fiyat geçmişini JSON olarak veriyordu; tefas-crawler ve benzeri kütüphanelerin hepsi bunu kullanıyordu.

Bu yöntemlerin ortak varsayımı şuydu: veri, sayfanın ilk yanıtında düz HTML ya da JSON olarak var. Nisan 2026'da bu varsayım bozuldu.

Ne değişti?

  • Site JavaScript uygulamasına dönüştü. İlk yanıtta tablo yok; tarayıcı sayfayı açtıktan sonra veriyi ayrı isteklerle çekiyor. Sheets bu adımı yapamaz.
  • Eski uçlar kapandı. BindHistoryInfo ve diğer /api/DB/ yolları kalıcı olarak kaldırıldı. Yeni uçlar farklı adreslerde, farklı parametrelerle.
  • Bot koruması geldi. Site, isteğin gerçek bir tarayıcıdan gelip gelmediğini TLS düzeyinde ayırt eden bir koruma katmanının arkasında. Python'un requests kütüphanesi ya da Google'ın import botu bu testten geçemiyor; genelde hata bile almıyorsun, 200 OK ile boş gövde dönüyor. Formülün "İçerik boş" demesinin sebebi bu.

"Bir şekilde" çalıştıran var mı?

Var. Gerçek bir tarayıcının TLS imzasını taklit eden kütüphanelerle (Python'da curl_cffi gibi) yeni JSON uçlarına ulaşmak mümkün; TEFAS'ın dakikada yaklaşık 6 istek sınırına da uymak gerekiyor. Bu, kendi sunucusu olan ve bakım yapabilecek biri için yapılabilir bir iş. Google Sheets içinden ise yapılamaz: Sheets'in isteklerinin nasıl gönderildiğini değiştiremezsin.

Apps Script ile UrlFetchApp kullanmak da çare değil; o da tarayıcı değil, aynı korumaya takılıyor.

Bugün ne yapılabilir?

Sheets'in yapamadığı kısmı arada bir sunucunun yapması gerekiyor: veriyi TEFAS'tan bir kez alıp Google'ın okuyabileceği düz biçimde sunmak. fonfiyat tam olarak bu. Her iş günü sabah tüm fonların fiyatını, dönemsel getirilerini, büyüklüğünü ve portföy dağılımını alıyor; sayfaları JavaScript'siz, düz HTML tablo ve CSV olarak veriyor. Formül tekrar tek satır:

=IMPORTDATA("https://fonfiyat.com.tr/fiyat/AFA";";")

Fiyat ve getirileri birlikte istersen:

=IMPORTHTML("https://fonfiyat.com.tr/fon/AFA";"table";1)

Ayrıntılı formüller, portföy şablonu ve sık hatalar için Google Sheets rehberi. Excel kullananlar için Power Query.

Python'da ne yapmalı?

Kendi scraper'ını yazacak vaktin yoksa aynı veriyi JSON olarak al:

import requests
funds = requests.get("https://fonfiyat.com.tr/v1/funds.json").json()
print(funds[0])

Kayıt yok, anahtar yok, limit yok; cache 1 saat, veri günde bir değiştiği için daha sık sormanın anlamı yok. Uç noktalar API sayfasında.

Sık sorulan üç şey

TEFAS geri açar mı? Bilinmiyor. Yeni site bilinçli olarak bu şekilde tasarlandı; eski uçların dönmesi beklenmiyor.

Veri resmi mi? Kaynak tefas.gov.tr'nin halka açık verisi; fiyatlar TEFAS'ın açıkladığı birim pay fiyatı. fonfiyat hesaplama eklemez, olduğu gibi aktarır.

Neden günde bir kez? Fon fiyatları zaten iş günlerinde günde bir açıklanıyor. Saat başı çekmek daha güncel veri vermez, sadece TEFAS'ı yorar.