npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

tcmb-xml-rates

v1.1.0

Published

A modern, type-safe TCMB (Central Bank of Turkey) XML exchange rates client for Node.js and Next.js with built-in caching and last business day fallback.

Downloads

24

Readme

tcmb-xml-rates (Türkçe)

npm version License: MIT

tcmb-xml-rates, TCMB'nin (Türkiye Cumhuriyet Merkez Bankası) yayınladığı XML döviz kurlarını Node.js ve Next.js projelerinde modern, güvenilir ve TypeScript destekli bir yapıyla kullanmanı sağlar.

  • Altın (XAU) ve Gümüş (XAS) fiyatları - TCMB Reeskont endpoint'inden
  • Saatlik kurlar - Gün içi saat başı güncellemeler (10:00-15:00)
  • Dahili önbellekleme (in-memory cache)
  • Otomatik son iş günü fallback (hafta sonu / resmi tatil)
  • Promise tabanlı, TypeScript tipleri hazır bir API

Neden bu paket?

Piyasada TCMB için yazılmış bazı npm paketleri var; ancak çoğu:

  • çok eski (callback veya sadece CommonJS),
  • TypeScript tipi sunmuyor,
  • hafta sonu / resmi tatil mantığını ya hiç düşünmüyor ya da zayıf uyguluyor,
  • altın ve gümüş fiyatlarını desteklemiyor.

tcmb-xml-rates ile amaç:

  • Modern (ESM + CJS, TS-first),
  • Güvenilir (iş günü fallback + cache),
  • Tam kapsamlı (günlük kurlar + saatlik kurlar + altın + gümüş),
  • Kolay entegre edilebilir (Next.js route handler, server component, cron script) bir çözüm sunmak.

Özellikler

  • Modern & Hafif Promise tabanlı API, ESM + CJS desteği, minimum bağımlılık.

  • TypeScript Dostu Tam tip tanımları ile geliyor.

  • Altın & Gümüş Fiyatları TCMB Reeskont endpoint'inden XAU (altın) ve XAS (gümüş) fiyatları.

  • Saatlik Kurlar 10:00-15:00 arası her saat güncellenen kurlar.

  • Güvenilir İstenilen tarihte veri yoksa (hafta sonu / resmi tatil), otomatik olarak bir önceki iş gününün kurlarını getirir (isteğe bağlı kapatılabilir).

  • Hızlı Aynı URL için gereksiz istekleri engelleyen dahili in-memory cache.

  • Kullanışlı yardımcılar Kolay kur dönüştürme (convert) ve döviz listesi alma (listCurrencies) fonksiyonları.


Kurulum

npm install tcmb-xml-rates
# veya
yarn add tcmb-xml-rates
# veya
pnpm add tcmb-xml-rates

Hızlı Başlangıç

Günlük Döviz Kurları

import { getRate, convert } from 'tcmb-xml-rates';

// Bugünkü USD kurunu al (gerekirse son iş gününe fallback yapar)
const usd = await getRate('USD');

console.log('USD Alış:', usd?.forexBuying);
console.log('USD Satış:', usd?.forexSelling);

// 100 USD'yi TL'ye çevir
const tryAmount = await convert(100, 'USD', 'TRY');
console.log(`100 USD = ${tryAmount.toFixed(2)} TL`);

Altın ve Gümüş Fiyatları

import { getGold, getSilver, getPreciousMetals } from 'tcmb-xml-rates';

// Altın fiyatı
const gold = await getGold();
console.log(`Altın: ${gold?.buying} TRY/gram (${gold?.hour})`);

// Gümüş fiyatı
const silver = await getSilver();
console.log(`Gümüş: ${silver?.buying} TRY/gram`);

// İkisini birden al
const metals = await getPreciousMetals();
console.log(`Altın: ${metals.gold?.buying}, Gümüş: ${metals.silver?.buying}`);

Saatlik Kurlar

import { getHourlyRates, getHourlyRate } from 'tcmb-xml-rates';

// Tüm saatlik kurlar
const rates = await getHourlyRates();
// [{ code: 'USD', buying: 35.12, hour: '14:00', ... }, ...]

// Tek bir döviz
const usd = await getHourlyRate('USD');
console.log(`USD: ${usd?.buying} TRY (${usd?.hour})`);

API Referansı

Günlük Kurlar (Mevcut)

getRates(options?)

Tüm döviz kurlarını getirir.

const rates = await getRates();
// veya belirli bir tarih için
const rates = await getRates({ date: '2026-01-03' });

getRate(currencyCode, options?)

Tek bir döviz kurunu getirir.

const usd = await getRate('USD');
const eur = await getRate('EUR', { date: '2026-01-03' });

convert(amount, from, to, options?)

Para birimi dönüştürme yapar.

// USD → TRY
const tryAmount = await convert(100, 'USD', 'TRY');

// TRY → EUR
const eurAmount = await convert(1000, 'TRY', 'EUR');

// EUR → USD (çapraz kur, TRY üzerinden)
const usdAmount = await convert(100, 'EUR', 'USD');

listCurrencies(options?)

Mevcut döviz kodlarını listeler.

const codes = await listCurrencies();
// ['USD', 'AUD', 'DKK', 'EUR', 'GBP', ...]

getRawXml(options?)

Ham XML'i döndürür.

const xml = await getRawXml({ date: '2026-01-03' });

Saatlik Kurlar (v1.1.0+)

getHourlyRates(options?)

Saatlik kurları getirir (USD, EUR, GBP, CHF, XAU, XAS).

// En son yayınlanan saatin kurları
const rates = await getHourlyRates();

// Belirli saat için
const rates = await getHourlyRates({ hour: '14:00' });

// Belirli tarih ve saat için
const rates = await getHourlyRates({
  date: '2026-01-03',
  hour: '15:00'
});

Opsiyonlar:

| Parametre | Tip | Varsayılan | Açıklama | |-----------|-----|------------|----------| | date | Date \| string | bugün | Tarih (YYYY-MM-DD) | | hour | TcmbHour \| 'latest' | 'latest' | Saat (10:00-15:00) | | fallbackToLastBusinessDay | boolean | true | Hafta sonu → önceki iş günü | | fallbackToPreviousHour | boolean | true | Saat yoksa → önceki saat | | cache | boolean | true | Önbellekleme |

getHourlyRate(currencyCode, options?)

Tek bir dövizin saatlik kurunu getirir.

const usd = await getHourlyRate('USD');
const eur = await getHourlyRate('EUR', { hour: '11:00' });

getGold(options?)

Altın (XAU) fiyatını getirir.

// En son fiyat
const gold = await getGold();
console.log(`Altın: ${gold?.buying} TRY/gram`);

// Belirli saat
const gold14 = await getGold({ hour: '14:00' });

// Belirli tarih
const goldYesterday = await getGold({ date: '2026-01-04' });

Dönen tip:

interface TcmbPreciousMetalRate {
  code: 'XAU' | 'XAS';
  name: string;       // 'Altın' veya 'Gümüş'
  nameEn: string;     // 'Gold' veya 'Silver'
  unit: number;       // 1
  buying: number;     // TRY cinsinden fiyat
  date: string;       // '2026-01-05'
  hour: TcmbHour;     // '14:00'
  timestamp: string;  // ISO timestamp
}

getSilver(options?)

Gümüş (XAS) fiyatını getirir.

const silver = await getSilver();
console.log(`Gümüş: ${silver?.buying} TRY/gram`);

getPreciousMetals(options?)

Altın ve gümüşü birlikte getirir.

const metals = await getPreciousMetals();

if (metals.gold) {
  console.log(`Altın: ${metals.gold.buying} TRY/gram`);
}
if (metals.silver) {
  console.log(`Gümüş: ${metals.silver.buying} TRY/gram`);
}

listHourlyCurrencies(options?)

Saatlik kurlardaki döviz kodlarını listeler.

const codes = await listHourlyCurrencies();
// ['USD', 'EUR', 'GBP', 'CHF', 'XAU', 'XAS']

getHourlyRawXml(options?)

Saatlik kurların ham XML'ini döndürür.

const xml = await getHourlyRawXml({ hour: '14:00' });

Kullanım Örnekleri

1. Bugünkü Kurları Getir

import { getRates } from 'tcmb-xml-rates';

const rates = await getRates();
console.log(rates);
// Örnek: [{ code: 'USD', forexBuying: 35.12, ... }, ...]
  • Bugün veri yoksa (örneğin Pazar günü) otomatik olarak bir önceki iş günü kullanılır.

2. Tek Bir Dövizin Kurunu Getir

import { getRate } from 'tcmb-xml-rates';

const eur = await getRate('EUR');

console.log('EUR Alış:', eur?.forexBuying);
console.log('EUR Satış:', eur?.forexSelling);

3. Kur Dönüştürme

import { convert } from 'tcmb-xml-rates';

// 100 EUR → TL
const tryAmount = await convert(100, 'EUR', 'TRY');

// 500 TL → USD
const usdAmount = await convert(500, 'TRY', 'USD');

// 200 EUR → USD (önce TL, sonra USD üzerinden çapraz kur)
const eurToUsd = await convert(200, 'EUR', 'USD');

console.log({ tryAmount, usdAmount, eurToUsd });

İstersen hangi alanı kullanacağını (forexSelling, banknoteBuying vs.) opsiyonlarla belirleyebilirsin:

// Efektif satış kuru kullan
const amount = await convert(100, 'USD', 'TRY', { use: 'banknoteSelling' });

4. Tarihli Veri & İş Günü Fallback

import { getRates } from 'tcmb-xml-rates';

const istediginTarih = '2025-11-16'; // Pazar diyelim

const rates = await getRates({ date: istediginTarih });

const actualDate = rates[0].date; // Örn: '2025-11-14' (Cuma)

if (actualDate !== istediginTarih) {
  console.log(
    `${istediginTarih} için veri yok. Son iş günü ${actualDate} kullanıldı.`
  );
}

Fallback'i kapatmak istersen:

const rates = await getRates({
  date: '2025-11-16',
  fallbackToLastBusinessDay: false,
}); // Veri yoksa hata fırlatır

5. Saatlik Kurları Kullanma

import { getHourlyRates, getHourlyRate } from 'tcmb-xml-rates';

// En son yayınlanan saatin tüm kurları
const rates = await getHourlyRates();
for (const rate of rates) {
  console.log(`${rate.code}: ${rate.buying} TRY (${rate.hour})`);
}

// Sadece USD
const usd = await getHourlyRate('USD');
console.log(`USD: ${usd?.buying} TRY`);

// Belirli bir saat için
const rates14 = await getHourlyRates({ hour: '14:00' });

6. Altın Fiyatını Takip Etme

import { getGold } from 'tcmb-xml-rates';

// En güncel altın fiyatı
const gold = await getGold();

if (gold) {
  console.log(`Altın Fiyatı: ${gold.buying} TRY/gram`);
  console.log(`Tarih: ${gold.date}`);
  console.log(`Saat: ${gold.hour}`);
} else {
  console.log('Altın fiyatı alınamadı');
}

// Dünkü kapanış fiyatı (15:00)
const goldYesterday = await getGold({
  date: new Date(Date.now() - 86400000) // 1 gün önce
});

7. Gün İçi Altın Değişimini Takip Etme

import { getGold, TcmbHour } from 'tcmb-xml-rates';

const today = new Date().toISOString().split('T')[0];
const hours: TcmbHour[] = ['10:00', '11:00', '12:00', '13:00', '14:00', '15:00'];

console.log(`${today} Altın Fiyat Değişimi:`);
console.log('='.repeat(40));

for (const hour of hours) {
  const gold = await getGold({
    date: today,
    hour,
    fallbackToPreviousHour: false // Sadece tam o saat
  });

  if (gold) {
    console.log(`${hour}: ${gold.buying.toFixed(2)} TRY/gram`);
  } else {
    console.log(`${hour}: Veri yok`);
  }
}

8. Altın ve Gümüşü Birlikte Kullanma

import { getPreciousMetals } from 'tcmb-xml-rates';

const metals = await getPreciousMetals();

console.log('Kıymetli Madenler:');
console.log('-'.repeat(30));

if (metals.gold) {
  console.log(`Altın (XAU): ${metals.gold.buying.toFixed(2)} TRY/gram`);
}

if (metals.silver) {
  console.log(`Gümüş (XAS): ${metals.silver.buying.toFixed(2)} TRY/gram`);
}

// Altın/Gümüş oranı
if (metals.gold && metals.silver) {
  const ratio = metals.gold.buying / metals.silver.buying;
  console.log(`Altın/Gümüş Oranı: ${ratio.toFixed(2)}`);
}

9. Hata Yönetimi

import {
  getGold,
  getRate,
  TcmbError,
  RateNotFoundError
} from 'tcmb-xml-rates';

try {
  const gold = await getGold();
  const usd = await getRate('USD');

  console.log(`Altın: ${gold?.buying}`);
  console.log(`USD: ${usd?.forexBuying}`);
} catch (error) {
  if (error instanceof RateNotFoundError) {
    console.error('İstenen kur bulunamadı:', error.message);
  } else if (error instanceof TcmbError) {
    console.error('TCMB hatası:', error.message);
  } else {
    console.error('Beklenmeyen hata:', error);
  }
}

10. Önbellekleme Kontrolü

import { getGold, getHourlyRates } from 'tcmb-xml-rates';

// Cache'i kullanarak (varsayılan)
const gold1 = await getGold(); // İlk çağrı: TCMB'ye HTTP isteği
const gold2 = await getGold(); // İkinci çağrı: Cache'den gelir (hızlı)

// Cache'i devre dışı bırak (her seferinde yeni istek)
const freshRates = await getHourlyRates({ cache: false });

11. İstek İptali (AbortController)

import { getGold } from 'tcmb-xml-rates';

const controller = new AbortController();

// 5 saniye sonra iptal et
setTimeout(() => controller.abort(), 5000);

try {
  const gold = await getGold({ signal: controller.signal });
  console.log(`Altın: ${gold?.buying}`);
} catch (error) {
  if (error instanceof Error && error.name === 'AbortError') {
    console.log('İstek iptal edildi');
  }
}

12. TypeScript Tipleri

import type {
  TcmbRate,
  TcmbHourlyRate,
  TcmbPreciousMetalRate,
  TcmbHour,
  GetRatesOptions,
  GetHourlyRatesOptions,
  GetGoldOptions
} from 'tcmb-xml-rates';

// Tip güvenli kullanım
const hour: TcmbHour = '14:00'; // Sadece geçerli saatler: 10:00-15:00

const options: GetHourlyRatesOptions = {
  date: '2026-01-03',
  hour: '14:00',
  fallbackToLastBusinessDay: true,
  cache: true
};

// Fonksiyon dönen tipleri
async function getGoldPrice(): Promise<TcmbPreciousMetalRate | null> {
  return await getGold();
}

Opsiyonlar

Günlük Kurlar

export interface GetRatesOptions {
  date?: Date | string;          // Belirli gün. Örn: '2025-11-19'
  rateType?: 'forex' | 'banknote' | 'all';
  fallbackToLastBusinessDay?: boolean; // Varsayılan: true
  cache?: boolean;               // Varsayılan: true
}

Saatlik Kurlar

export interface GetHourlyRatesOptions {
  date?: Date | string;
  hour?: TcmbHour | 'latest';    // Varsayılan: 'latest'
  fallbackToLastBusinessDay?: boolean; // Varsayılan: true
  fallbackToPreviousHour?: boolean;    // Varsayılan: true
  cache?: boolean;               // Varsayılan: true
  signal?: AbortSignal;          // İstek iptali için
}

Next.js ile Kullanım (App Router)

Bu paket, Next.js içinde server-side kullanım için tasarlanmıştır (Server Components, Route Handlers, Server Actions). Böylece:

  • CORS problemleri yaşamazsın,
  • iç ağ mantığını / config'ini client tarafına sızdırmamış olursun.

Server Component Örneği

// app/page.tsx
import { getRate, getGold } from 'tcmb-xml-rates';

export default async function Page() {
  const usd = await getRate('USD');
  const gold = await getGold();

  return (
    <main>
      <h1>Piyasa Verileri</h1>
      <p>1 USD = {usd?.forexSelling?.toFixed(2)} TL</p>
      <p>Altın: {gold?.buying?.toFixed(2)} TL/gram</p>
    </main>
  );
}

Route Handler Örneği

// app/api/rates/route.ts
import { getRates, getGold, getSilver } from 'tcmb-xml-rates';
import { NextResponse } from 'next/server';

export async function GET() {
  try {
    const [rates, gold, silver] = await Promise.all([
      getRates(),
      getGold(),
      getSilver()
    ]);

    return NextResponse.json({
      currencies: rates,
      gold: gold ? { price: gold.buying, hour: gold.hour } : null,
      silver: silver ? { price: silver.buying, hour: silver.hour } : null,
      timestamp: new Date().toISOString()
    });
  } catch (error) {
    console.error(error);
    return NextResponse.json(
      { error: 'Kurlar alınırken bir hata oluştu' },
      { status: 500 }
    );
  }
}

Server Action Örneği

// app/actions.ts
'use server';

import { getGold, convert } from 'tcmb-xml-rates';

export async function getGoldPrice() {
  const gold = await getGold();
  return gold ? {
    price: gold.buying,
    date: gold.date,
    hour: gold.hour
  } : null;
}

export async function convertCurrency(
  amount: number,
  from: string,
  to: string
) {
  const result = await convert(amount, from, to);
  return { amount, from, to, result };
}

Client Component Örneği

// app/components/GoldPrice.tsx
'use client';

import { useState, useEffect } from 'react';

// Server action'ı kullan
import { getGoldPrice } from '../actions';

export function GoldPrice() {
  const [gold, setGold] = useState<{
    price: number;
    date: string;
    hour: string;
  } | null>(null);

  useEffect(() => {
    getGoldPrice().then(setGold);
  }, []);

  if (!gold) return <p>Yükleniyor...</p>;

  return (
    <div>
      <p>Altın: {gold.price.toFixed(2)} TL/gram</p>
      <small>{gold.date} {gold.hour}</small>
    </div>
  );
}

Günlük ve Saatlik Kurlar Karşılaştırması

| Özellik | Günlük Kurlar | Saatlik Kurlar | |---------|--------------|----------------| | Fonksiyonlar | getRates, getRate, convert | getHourlyRates, getHourlyRate, getGold, getSilver | | Endpoint | /kurlar/ | /reeskontkur/ | | Güncelleme | Günde 1 kez | Saatte 1 kez (10:00-15:00) | | Döviz Sayısı | 22+ | 6 (USD, EUR, GBP, CHF, XAU, XAS) | | Altın/Gümüş | Yok | Var | | Alış/Satış | Her ikisi | Sadece alış |


En İyi Pratikler

  • Her istekte TCMB'ye gitme. Dahili cache'i ve/veya kendi cache katmanını (Redis, KV, veritabanı) kullan.

  • Server-side kullan. Tarayıcıdan doğrudan TCMB endpoint'ine çağrı yapmak yerine, backend veya Next.js API route üzerinden çağır.

  • TCMB güncellemelerini gerçek zamanlı değil, günlük/saatlik düşün. Bu veri daha çok günlük raporlama ve fiyatlama için uygundur, high-frequency trading için değil.

  • Saatlik kurlar için doğru saati seç. Eğer tarihi veri çekiyorsan, hour: 'latest' yerine belirli bir saat belirt.


Uyarı & Teşekkür

Bu paket resmi değildir ve TCMB (Türkiye Cumhuriyet Merkez Bankası) ile hiçbir bağlantısı yoktur.

  • Veri kaynağı: Tüm kurlar doğrudan TCMB'nin resmi XML servisinden çekilir.
  • Kullanım koşulları: Lütfen TCMB'nin sitesindeki resmi şartları ve yasal uyarıları inceleyin.
  • Teşekkür: Bu veriyi kamuya açık sunduğu için TCMB'ye teşekkürler.

Lisans

MIT