Şu anda beş farklı servise EUR/USD kurunu sorun, birbirinden hafifçe farklı beş sayı alırsınız. Uçurum kadar farklı değil — ama dördüncü ondalık basamakta, bazen üçüncüde farklı. Ödeme sayfanız 1,0847 gösterirken banka ekstresi 1,0821 dediği için finans ekibiniz daha önce bir talep açtıysa, bunun akademik bir soru olmadığını zaten biliyorsunuz.
Peki, döviz kuru API'leri verilerini nereden alır? Dürüst cevap şu: hiçbir API döviz kurunu "bilmez", çünkü bilinecek tek bir döviz kuru yoktur. Döviz piyasası merkezi bir borsası ve kapanış zili olmayan tezgâh üstü bir piyasadır — dünya genelinde birbirine fiyat kote eden binlerce kurumdan ibarettir. Çağırabileceğiniz her API, bu piyasadan örnek alan, temizleyen ve size tek bir sayı veren bir boru hattıdır. Bu rehber o boru hattını katman katman geziyor, iki sağlayıcının neden farklı sonuç verdiğini tam olarak açıklıyor ve üzerine faturalama mantığı kurmadan önce bir veri kaynağını nasıl denetleyeceğinizi gösteriyor.
Kısa cevap: piyasa ile JSON'unuz arasındaki üç katman
Her döviz kuru API'si — ücretsiz ya da ücretli, bizimki dahil — aynı üç katman üzerine kuruludur:
- Toplama. Ham fiyatlar yukarı akış kaynaklarından çekilir: kurumsal FX beslemeleri, merkez bankası yayınları ve aracı kurum ya da perakende kotasyonları.
- Normalleştirme. Bu ham fiyatlar doğrulanır, aykırı değerler atılır, birden çok kaynak harmanlanır ve her parite için tek bir referans kur türetilir.
- Dağıtım. Türetilen kur belirli bir sıklıkta anlık görüntü olarak alınır, önbelleğe konur ve bir zaman damgasıyla HTTP üzerinden sunulur.
Bu üç katmandan herhangi birindeki farklılık, yanıt gövdenizde farklı bir sayı üretir. Çoğu geliştirici uyuşmazlığın 1. katmandan geldiğini varsayar. Pratikte 2. ve 3. katmanlar da en az o kadarına yol açar.
Katman 1 — Ham fiyatlar gerçekte nereden gelir
Bankalararası ve kurumsal beslemeler
"Gerçek" bir döviz kuruna en yakın şey bankalararası piyasadır: büyük bankaların ve likidite sağlayıcılarının birbirleriyle işlem yaptığı fiyatlar. Bu fiyatlar, işlem platformlarından, prime broker'lardan ve piyasa verisi sağlayıcılarından sürekli bid ve ask akışları olarak gelir.
Bu tür beslemeler mevcut en yüksek doğrulukta kaynaktır. Aynı zamanda en pahalısıdır ve ücretsiz API'lerin bunları birincil kaynak olarak nadiren kullanmasının temel nedeni budur. Bir sağlayıcı "gerçek zamanlı" ya da "dakika altı" kur sunduğunu söylüyorsa, bu neredeyse her zaman boru hattının tepesinde kurumsal beslemeler olduğu içindir.
Bankalararası beslemenin size bir değil iki fiyat verdiğini unutmayın — bir bid ve bir ask. Bir API yanıtında gördüğünüz tek kur genellikle bu ikisinin orta noktasıdır. Bu ayrım sizin için yeniyse, döviz alım-satımında bid-ask spreadi rehberimiz konuyu ayrıntılı ele alıyor.
Merkez bankası referans kurları
İkinci büyük kaynak resmi merkez bankası yayınlarıdır. En bilinen örnek, her TARGET iş gününde 16:00 CET civarında, Avrupa merkez bankaları arasındaki bir konsültasyon prosedürüne dayanarak euro döviz kuru referans kurlarını yayımlayan Avrupa Merkez Bankası'dır. Onlarca başka merkez bankası da kendi para birimleri için eşdeğer günlük kurlar yayımlar.
Merkez bankası kurlarının iki büyük avantajı vardır: ücretsizdirler ve otoritedirler. Birçok vergi idaresi ve muhasebe standardı bunları raporlama için açıkça kabul eder. Ücretsiz API ekosisteminin büyük bölümünün bunların üzerine kurulmasının nedeni budur. Bu alanda yaygın kullanılan açık kaynaklı bir proje olan Frankfurter, 84 merkez bankasından 201 para birimini kapsayan günlük kurları, 1948'e uzanan geçmişle birlikte izler — tamamı yeniden dağıtılan kamuya açık veridir.
Ancak iki ciddi sınırlamaları da vardır:
- Bunlar günlük anlık görüntülerdir, canlı fiyat değildir. 16:00 CET referans kuru, saat 09:00'da veya 22:00'de ne olduğu hakkında size hiçbir şey söylemez.
- Hafta sonları ve tatillerde dururlar. API'niz bir cumartesi için veri döndürmüyorsa ya da cuma günkü sayıyı tekrarlıyorsa, ECB türevi bir kaynak bunun olağan açıklamasıdır.
Perakende ve aracı kurum kotasyonları
Üçüncü kaynak son kullanıcıya dönük fiyatlamadır: bir bankanın, kart ağının, ödeme kuruluşunun ya da para transfer servisinin müşteriye gerçekte vereceği fiyat. Bu kurlar zaten bir kâr marjı içerir — piyasa kurunun üzerine fiyata gömülmüş bir pay.
Tüketici karşılaştırma sitesinde gördüğünüz kurun banka ekstrenizdekiyle uyuşmamasının nedeni budur. İkisinde de hata yoktur; farklı şeyleri ölçüyorlardır. Tüketici siteleri genellikle orta piyasa kurunu gösterirken bankanız size orta piyasa kuru artı kendi spreadini kote eder. Çoğu yazılım senaryosunda orta piyasa sayısını istersiniz ve kendi marjınızı, görebileceğiniz ve denetleyebileceğiniz şekilde açıkça uygulamak istersiniz.
Katman 2 — Sağlayıcılar beslemeleri tek bir kura nasıl dönüştürür
Ham fiyatlar geldikten sonra sağlayıcının hangi sayıyı yayımlayacağına karar vermesi gerekir. Burada dört karar alınır ve her biri sağlayıcıların ayrıştığı bir noktadır.
Harmanlama. Çoğu ticari API tek bir yukarı akış kaynağına dayanmaz. Örneğin Open Exchange Rates, verisini birden çok sağlayıcıdan toplanıp algoritmik olarak harmanlanmış şeklinde tanımlar. Harmanlama tek bir hatalı tick'i yumuşatır, ancak harman ağırlıkları tescillidir — iki harmanlanmış beslemenin asla tam olarak örtüşmemesinin nedeni tam da budur.
Aykırı değer eleme. Bir platformdan gelen hatalı bir kotasyon bir büyüklük mertebesi sapabilir. Sağlayıcılar, mutabakat etrafındaki bir tolerans bandının dışındaki fiyatları eleyen filtreler uygular. Agresif filtreleme istikrarlı kurlar ama gerçek hareketlere daha yavaş tepki demektir. Gevşek filtreleme hızlı tepki ama ara sıra gürültü demektir.
Orta değer türetme. Yukarı akış beslemesi bid/ask ise sağlayıcı bir orta değer yayımlar. Basit orta nokta (bid + ask) / 2 standarttır, ancak hacim ağırlıklı yaklaşımlar biraz farklı sonuç verir.
Çapraz kur üçgenlemesi. Hiçbir sağlayıcı olası 30.000'den fazla paritenin tamamını doğrudan temin etmez. Bunun yerine çoğu parite bir pivot para birimi üzerinden hesaplanır — genellikle USD veya EUR:
GBP/JPY = (USD/JPY) / (USD/GBP)Bu, egzotik bir parite için aldığınız kurun başka iki pariteden yuvarlama ve zamanlama devraldığı anlamına gelir. USD üzerinden pivotlayan sağlayıcılarla EUR üzerinden pivotlayanlar aynı çapraz için farklı sayılara ulaşır. Mekaniği çapraz döviz kurları açıklaması yazımızda ele alıyoruz.
Katman 3 — Kur kodunuza nasıl ulaşır
Son katman, geliştiricilerin en çok kontrol ettiği ve en az düşündüğü katmandır.
Güncelleme sıklığı, sağlayıcılar ve fiyat kademeleri arasındaki en büyük tek farklılaştırıcıdır. Ücretsiz planlar genelde günde bir veya iki kez yeniler. Ücretli kademeler saatlik, on dakikada bir veya 60 saniyede bir yeniler. Aynı veriyi kullanan iki API, sırf biri 14:00'te diğeri 14:47'de anlık görüntü aldığı için farklı sonuç verir.
Önbellekleme bunu katlar. Çoğu API bir CDN arkasındadır ve iyi kurgulanmış çoğu istemci bunun üzerine yerel önbellek ekler. 10 dakikalık bir yenileme süresine 15 dakikalık bir edge önbelleği eklerseniz uygulamanız potansiyel olarak 25 dakika eski bir kurla çalışır. Fiyat göstermek için sorun değil, bir işlemi kapatmak için kabul edilemez — pratik soru daima bu işlem için ne kadar eski fazla eski sorusudur. Döviz API'lerinde önbellekleme ve hata yönetimi rehberimiz bu pencereleri nasıl boyutlandıracağınızı anlatıyor.
Zaman damgaları savunmanızdır. Ciddi her API, kurun yakalandığı anı döndürür. Onu okuyun. Yanıtı aldığınız anın, kurun geçerli olduğu an olduğunu varsaymayın:
const MAX_AGE_SECONDS = 900; // 15 minutes
async function getRate(base, symbol) {
const res = await fetch(
`https://api.finexly.com/v1/latest?base=${base}&symbols=${symbol}`,
{ headers: { Authorization: `Bearer ${process.env.FINEXLY_API_KEY}` } }
);
const data = await res.json();
const ageSeconds = Math.floor(Date.now() / 1000) - data.timestamp;
if (ageSeconds > MAX_AGE_SECONDS) {
throw new Error(`Rate is ${ageSeconds}s old — refusing to price on stale data`);
}
return { rate: data.rates[symbol], ageSeconds };
}İşte temeldeki istek ve temsili bir yanıt yapısı:
curl "https://api.finexly.com/v1/latest?base=USD&symbols=EUR,GBP,JPY" \
-H "Authorization: Bearer YOUR_API_KEY"{
"success": true,
"base": "USD",
"timestamp": 1755244800,
"rates": {
"EUR": 0.9241,
"GBP": 0.7863,
"JPY": 147.2150
}
}Tüm parametre ve uç nokta ayrıntıları Finexly API dokümantasyonunda yer alıyor.
İki API neden aynı parite için farklı sayılar döndürür
Üç katmanı bir araya getirdiğimizde, kabaca yol açtıkları hasara göre sıralanmış altı uyuşmazlık nedeni şunlardır:
- Farklı anlık görüntü zamanları. Açık ara en yaygın neden. İki beslemede de bir sorun yoktur; sadece farklı anlara bakmışlardır.
- Farklı kaynak karışımları. Merkez bankası türevi bir kur ile bankalararası türevi bir kur, tanımı gereği iki farklı şeyi ölçer.
- Orta piyasa ile marjlı kur. Bir sağlayıcı size piyasa orta noktasını, bir diğeri spreadi zaten içeren bir müşteri fiyatını verir.
- Çaprazlarda farklı pivot para birimleri. USD pivotlu ve EUR pivotlu üçgenleme, aynı USD dışı parite için farklı sonuçlar üretir.
- Hassasiyet ve yuvarlama. Altı ondalığın dörde kırpılması ya da ters parite olarak yayımlanıp yeniden ters çevrilen kurlar, ikisi de sapma yaratır.
- Unuttuğunuz önbellek katmanları. CDN'iniz, framework'ünüzün HTTP önbelleği ve kendi Redis katmanınız yaş ekler.
Faydalı bir pratik kural: ana paritelerde, iki saygın orta piyasa kaynağı arasında birkaç baz puanlık (%0,01 = 1 bp) fark normaldir ve beklenir. 50 bp veya daha fazla fark, ikisinden birinin eski, marjlı ya da bozuk olduğu anlamına gelir — yayına almadan önce hangisi olduğunu bulmalısınız.
Bir döviz kuru API'sine güvenmeden önce nasıl denetlersiniz
Bir sağlayıcının doğruluk iddialarını olduğu gibi kabul etmeyin. Bu kontrolü bir hafta boyunca finans ekibinizin otorite saydığı kaynağa karşı çalıştırın:
import os
import requests
from datetime import datetime, timezone
FINEXLY_URL = "https://api.finexly.com/v1/latest"
HEADERS = {"Authorization": f"Bearer {os.environ['FINEXLY_API_KEY']}"}
def get_rate(base: str, symbol: str) -> dict:
r = requests.get(
FINEXLY_URL,
headers=HEADERS,
params={"base": base, "symbols": symbol},
timeout=5,
)
r.raise_for_status()
data = r.json()
return {
"rate": data["rates"][symbol],
"captured_at": datetime.fromtimestamp(data["timestamp"], tz=timezone.utc),
}
def basis_points(a: float, b: float) -> float:
"""Difference between two rates, in basis points."""
return abs(a - b) / ((a + b) / 2) * 10_000
primary = get_rate("EUR", "USD")
reference = 1.0839 # whatever your accounting source published
diff = basis_points(primary["rate"], reference)
print(f"Finexly: {primary['rate']} captured {primary['captured_at']:%H:%M UTC}")
print(f"Reference: {reference}")
print(f"Delta: {diff:.1f} bp -> {'OK' if diff < 25 else 'INVESTIGATE'}")Sonuçlarda bakılacak üç şey:
- Fark sabit mi, yoksa kayıyor mu? Sabit bir sapma sistematik bir marja işaret eder. Rastgele olan zamanlamaya işaret eder.
- Fark belirli saatlerde sıçrıyor mu? Bu, genellikle bir merkez bankası yayın penceresi civarındaki anlık görüntü zamanlamasına işaret eder.
- Hafta sonları ne oluyor? Kaynağınız cuma öğleden sonra donup pazartesi devam ediyorsa merkez bankası türevidir — pazartesi mutabakatınızı buna göre planlayın.
Üçgenlemeyi de bir çaprazı doğrudan çekip USD üzerinden hesaplayarak sınayabilirsiniz; ikisi bir iki baz puan içinde uyuşmalıdır.
Kullanım senaryonuza göre veri kaynağı seçimi
Evrensel olarak "en iyi" kaynak yoktur — yalnızca inşa ettiğiniz şey için doğru kaynak vardır.
| Kullanım senaryosu | İhtiyacınız olan | Kabul edilebilir gecikme |
|---|---|---|
| Alıcılara fiyat gösterme | Orta piyasa kuru, üzerine kendi marjınız | Saatler |
| SaaS abonelik faturalama | Orta piyasa, faturalama başına tek anlık görüntü, faturayla saklanır | Saatler, ama kayıt altına alınmalı |
| Muhasebe ve vergi raporlaması | İlgili tarih için merkez bankası referans kuru | Tanımı gereği günlük |
| Analitik ve panolar | Tek kaynaktan tutarlı geçmiş zaman serisi | Günlük |
| Ödemeler ve havaleler | Açık tolerans bandıyla taze orta piyasa kuru | Dakikalar |
| İşlem ve riskten korunma | Kurumsal beslemeden gerçek bid/ask | Saniyeler |
Hâlâ seçenekleri değerlendiriyorsanız, ücretsiz ve ücretli döviz API'leri karşılaştırmamız kademe yükseldikçe nelerin değiştiğini ayrıştırıyor; fiyatlandırma planları sayfası ise yenileme sıklığı ve istek limitlerinin nerede durduğunu gösteriyor. Herhangi bir paritede hızlı manuel kontrol için döviz çevirici API ile aynı temeldeki beslemeyi kullanır.
Sıkça Sorulan Sorular
Ücretsiz döviz API'leri verilerini nereden alır?
Neredeyse her zaman merkez bankası yayınlarından, en yaygın olarak Avrupa Merkez Bankası'nın günlük euro referans kurlarından, bazen birkaç başka kamusal kaynakla harmanlanarak. Ücretsiz kademelerin genelde günde bir kez yenilemesinin, hafta sonlarını atlamasının ve ücretlilere göre daha az egzotik para birimi kapsamasının nedeni budur.
API'mdeki döviz kuru neden Google'dakinden farklı?
Google, sürekli canlı bir fiyat değil anlık görüntü olan bir orta piyasa referans kuru gösterir ve bu, API çağrınızla aynı anda örneklenmiş olmak zorunda değildir. Küçük bir fark normaldir. Büyük bir fark genellikle ikisinden birinin orta piyasa kuru değil, marjlı bir perakende kuru olduğu anlamına gelir.
Muhasebe ve vergi raporlaması için hangi kuru kullanmalıyım?
İşlem tarihi için ilgili merkez bankasının yayımladığı resmi referans kurunu kullanın — çoğu vergi idaresinin beklediği budur. Canlı bir kuru yeniden kullanmak yerine açık tarihli bir geçmiş uç noktasından çekin ve işlem kaydıyla birlikte saklayın.
Gerçek zamanlı bir döviz kuru API'si gerçekten gerçek zamanlı mı?
Kelimenin tam anlamıyla nadiren. "Gerçek zamanlı" genellikle sağlayıcının kısa aralıklarla yenilediği anlamına gelir — en üst kademede 60 saniye yaygındır — tick tick akış sağladığı anlamına gelmez. Pazarlama metnine değil, yanıttaki zaman damgasına ve belgelenen yenileme aralığına bakın.
API kullanmak yerine döviz kurlarını kazıyabilir miyim?
Kazıyabilirsiniz, ama kazıdığınız sayfanın tüm arıza modlarını devralırsınız: düzen değişiklikleri, hız sınırlaması, zaman damgası yokluğu, geçmiş veri yokluğu ve sıklıkla hizmet şartlarının ihlali. Tam dengeyi döviz API'si ile web scraping karşılaştırması yazımızda ele aldık.
Denetleyebileceğiniz bir besleme üzerine inşa edin
Döviz kuru verinizin nereden geldiğini bilmek, bir cümleyle açıklayabildiğiniz bir para birimi hatası ile bir haftalık mühendislik yiyen bir hata arasındaki farktır. Entegre etmeden önce her sağlayıcıya üç soru sorun: kaynaklar neler, ne sıklıkta yeniliyor ve her yanıt bir yakalama zaman damgası taşıyor mu?
Gerçekten denetleyebileceğiniz döviz kurlarını entegre etmeye hazır mısınız? Ücretsiz Finexly API anahtarınızı alın — kredi kartı gerekmez. 170'ten fazla para biriminde ayda 1.000 ücretsiz istekle başlayın; ilk günden itibaren zaman damgalı yanıtlar ve geçmiş veriyle.
Explore More
Vlado Grigirov
Senior Currency Markets Analyst & Financial Strategist
Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...
View full profile →