Frankfurter API kurs dan mata uang
Frankfurter adalah API kurs gratis untuk 228 mata uang dari 106 bank sentral dan sumber resmi. Kurs diperbarui setiap hari dan tersedia sejak tahun 1948.
API publik tersedia di api.frankfurter.dev tanpa memerlukan kunci API. Proyek ini bersifat open source, sehingga Anda juga dapat melakukan hosting mandiri untuk kendali penuh.
Menggunakan agen AI? Arahkan ke llms.txt, atau tambahkan server MCP.
Kurs
Ambil nilai tukar terbaru.
curl https://api.frankfurter.dev/v2/ratesUbah mata uang dasar dengan base.
curl https://api.frankfurter.dev/v2/rates?base=usdFilter mata uang tujuan dengan quotes.
curl https://api.frankfurter.dev/v2/rates?quotes=usd,gbpKurs Historis
Cari kurs untuk tanggal tertentu.
curl https://api.frankfurter.dev/v2/rates?date=1999-01-04Deret Waktu
Ambil kurs selama rentang waktu dengan from dan to.
curl https://api.frankfurter.dev/v2/rates?from=2026-01-01"es=usdTips: Membatasi mata uang menjaga ukuran respons tetap kecil. Untuk rentang tanggal yang panjang, minta NDJSON agar hasil dialirkan baris demi baris.
Pengelompokan
Ringkas deret waktu dengan group. Mendukung week dan month.
curl https://api.frankfurter.dev/v2/rates?from=2026-01-01&group=monthFilter berdasarkan Penyedia
Batasi ke penyedia tertentu dengan providers.
curl https://api.frankfurter.dev/v2/rates?providers=ecb Secara default, kurs digabungkan dari semua penyedia. Gunakan providers untuk mengambil kurs dari penyedia tertentu, atau gunakan endpoint penyedia untuk melakukan kueri langsung ke penyedia tersebut.
Atribusi Penyedia
Tambahkan expand=providers untuk melihat penyedia mana saja yang berkontribusi pada setiap kurs gabungan.
curl https://api.frankfurter.dev/v2/rates?expand=providers Setiap baris akan memiliki array providers berisi kunci penyedia yang berkontribusi. Baris mata uang berpatok (pegged) tidak menyertakan kolom ini karena kursnya dihitung dari patokan, bukan data penyedia.
Output CSV
Kurs juga tersedia dalam format CSV. Tambahkan .csv pada path atau atur header Accept ke text/csv.
curl https://api.frankfurter.dev/v2/rates.csvOutput NDJSON
Untuk respons berukuran besar, minta NDJSON (newline-delimited JSON) dengan mengatur header Accept ke application/x-ndjson. Setiap baris adalah objek JSON independen, berguna untuk melakukan streaming deret waktu panjang tanpa menampung seluruh respons di memori.
curl https://api.frankfurter.dev/v2/rates?from=2026-01-01Kurs Tunggal
Ambil kurs untuk satu pasangan mata uang. Opsional tambahkan date atau providers.
curl https://api.frankfurter.dev/v2/rate/eur/usdMata Uang
Lihat daftar mata uang yang tersedia beserta cakupan penyedianya.
curl https://api.frankfurter.dev/v2/currenciesSertakan mata uang historis dengan scope.
curl https://api.frankfurter.dev/v2/currencies?scope=allDetail Mata Uang
Lihat detail dan cakupan penyedia untuk satu mata uang.
curl https://api.frankfurter.dev/v2/currency/eurPenyedia
Lihat daftar penyedia data di balik API.
curl https://api.frankfurter.dev/v2/providersLihat detail untuk satu penyedia.
curl https://api.frankfurter.dev/v2/providers/ecbKurs per Penyedia
Ambil kurs langsung dari penyedia tertentu. Mendukung parameter yang sama seperti /v2/rates dan /v2/rate.
curl https://api.frankfurter.dev/v2/providers/ecb/ratesAmbil satu pasangan mata uang dari penyedia tersebut.
curl https://api.frankfurter.dev/v2/providers/ecb/rate/eur/usd Padukan dengan date, rentang tanggal (from dan to), atau pengelompokan. Format seperti .csv dan ndjson juga berlaku di sini.
curl https://api.frankfurter.dev/v2/providers/ecb/rates?date=2024-05-15Konversi
Tidak ada endpoint khusus konversi. Ambil kursnya lalu hitung dalam beberapa baris kode.
function convert(base, quote, amount) {
const api = "https://api.frankfurter.dev";
return fetch(`${api}/v2/rate/${base}/${quote}`)
.then((r) => r.json())
.then((d) => (amount * d.rate).toFixed(2));
}
convert("eur", "usd", 10).then((result) =>
alert(`10 EUR = ${result} USD`)
);Error
API mengembalikan kode status HTTP standar dengan body JSON.
{
"status": 422,
"message": "invalid currency: ABC"
}400- Parameter tidak valid atau format permintaan salah.
404- Mata uang, kurs, atau resource tidak ditemukan.
422- Permintaan dipahami tetapi tidak dapat diproses.
Hosting Mandiri
Anda dapat melakukan hosting mandiri dengan Docker. Lihat panduan deploy untuk penyiapan produksi dan konfigurasi kunci API.
FAQ
- Untuk siapa Frankfurter dibuat (dan untuk siapa tidak cocok)?
- Cocok untuk penagihan SaaS, e-commerce, pelaporan pajak, sistem ERP dan akuntansi, serta riset akademik menggunakan deret waktu historis sejak 1948. Tidak dirancang untuk trading real-time atau mata uang eksotis dengan fluktuasi intraday yang tajam.
- Apakah API ini gratis untuk penggunaan komersial?
- Ya. Kurs gabungan merupakan perhitungan Frankfurter sendiri dan bebas digunakan. Kueri langsung ke endpoint masing-masing penyedia tetap tunduk pada ketentuan penyedia terkait.
- Bolehkah saya menyimpan atau melakukan cache kurs di database sendiri?
- Ya. Menyimpan observasi harian secara lokal untuk caching atau analitik historis justru dianjurkan agar trafik API tetap ringan.
- Apakah API ini memiliki batas pemanggilan?
- Tidak ada kuota. Permintaan dibatasi lajunya (rate limit) untuk mencegah penyalahgunaan, tetapi tidak ada batas harian atau bulanan. Untuk volume tinggi, pertimbangkan caching respons, hosting mandiri, atau mengunduh dataset secara langsung.
- Apakah API mendukung GraphQL?
- Tidak. REST API ini sudah cukup sederhana sehingga GraphQL hanya akan menambah kompleksitas tanpa banyak manfaat. GraphQL juga akan merusak edge caching yang menjaga API tetap cepat. Gunakan parameter kueri seperti
base,quotes, danfrom/tountuk mengambil data yang Anda butuhkan secara presisi. - Apakah API v1 akan dihentikan?
- Tidak. API v1 berstatus deprecated karena digantikan oleh v2, tetapi tetap tersedia tanpa batas waktu. Lihat dokumentasi v1. Untuk data Bank Sentral Eropa, gunakan /v2/providers/ecb/rates.
- Bagaimana kebijakan privasi API ini?
- API tidak mengumpulkan atau mencatat data pribadi, alamat IP, maupun URL permintaan. Instance publik berjalan di balik Cloudflare untuk caching dan proteksi DDoS, yang hanya menyajikan statistik trafik agregat.
- Apakah saya perlu mencantumkan API ini pada label privasi App Store atau Google Play?
- Tidak. Karena kueri bersifat anonim dan tidak ada log permintaan yang disimpan, permintaan memenuhi kategori Data Tidak Dikumpulkan (Data Not Collected) menurut pedoman Apple dan Google Play.
- Di mana saya bisa melaporkan bug atau mengajukan pertanyaan?
- Buka issue untuk melaporkan bug, meminta fitur, atau mengusulkan penyedia baru. Gunakan Discussions untuk bertanya atau membagikan pustaka dan alat yang Anda bangun dengan Frankfurter.
- Seberapa akurat kursnya?
- Untuk keperluan kepatuhan, filter berdasarkan penyedia tertentu guna mendapatkan kurs referensi resmi. Untuk penggunaan umum, kurs gabungan default sudah memadai, meskipun digit desimal terakhir dapat sedikit bergeser saat data baru masuk.
- Apakah kurs yang ditampilkan adalah kurs tengah, beli, atau jual?
- API mengembalikan kurs tengah (mid-market). Saat penyedia menerbitkan kuotasi kurs beli (bid) dan jual (ask) alih-alih kurs referensi, Frankfurter menyimpan keduanya lalu menghitung nilai tengahnya.
- Apakah semua kurs bersifat harian?
- Hampir semuanya harian. Beberapa sumber menyediakan observasi mingguan, bulanan, atau kuartalan. Sumber tersebut dikecualikan dari feed gabungan. Kueri secara langsung menggunakan filter
providers. - Apakah tersedia kurs kripto?
- Beberapa saja, dengan cakupan terbatas.
BTC,BCH,ETH,LTC, danXRPberasal dari satu sumber, yaitu Administrasi Pajak Federal Swiss, yang menerbitkan satu nilai per hari kerja sejak 2018. Untuk pelaporan pajak Swiss, kueri denganproviders=ESTV. - Mengapa beberapa mata uang lama dan baru memiliki rentang tanggal yang tumpang tindih?
- Beberapa penyedia menerapkan tanggal berlaku surut pada mata uang pengganti hingga ke periode mata uang lama (misalnya,
TRLberakhir pada 2010 sementaraTRYdimulai pada 1996). Kami mencatat data penyedia apa adanya dan hanya menyaring tumpang tindih saat menggabungkan kurs. - Mengapa dinamai Frankfurter?
- Karena sumber data awal kami adalah