Ada pertanyaan atau kendala? Tulis di GitHub Discussions.

Anda tidak memerlukan SDK. Frankfurter adalah layanan HTTPS biasa yang mengembalikan JSON datar, sehingga pustaka HTTP yang sudah Anda gunakan sudah cukup. Tanpa kunci API, tanpa akun.

Mulai Cepat

Ambil kurs lalu konversi:

import requests

res = requests.get("https://api.frankfurter.dev/v2/rate/usd/eur")
data = res.json()
total = 100 * data["rate"]

Responsnya berupa satu objek datar: {"date": "2026-07-17", "base": "USD", "quote": "EUR", "rate": 0.8739}. Kode mata uang yang tidak valid mengembalikan status 422 beserta pesan JSON.

Perhitungan Finansial yang Presisi

Tipe float cukup untuk tampilan, tetapi tidak tepat untuk akuntansi. Parsing kurs sebagai Decimal dengan meneruskan parse_float ke json.loads:

from decimal import Decimal

import requests

res = requests.get("https://api.frankfurter.dev/v2/rate/usd/eur")
data = res.json(parse_float=Decimal)
total = Decimal("100") * data["rate"]

Beberapa Mata Uang Sekaligus

/v2/rates mengembalikan array datar, satu baris per mata uang tujuan. Ubah menjadi dictionary pencarian dengan comprehension. Hapus quotes untuk mengambil seluruh mata uang.

res = requests.get(
    "https://api.frankfurter.dev/v2/rates",
    params={"base": "usd", "quotes": "eur,gbp,jpy"},
)
rates = {row["quote"]: row["rate"] for row in res.json()}

Cache Data yang Tidak Berubah

Kurs historis dari penyedia yang dikunci tidak akan berubah, jadi simpan di cache selama yang Anda inginkan. Kurs gabungan dapat bergeser saat data baru masuk, dan kurs terbaru berubah saat penyedia menerbitkan pembaruan, paling banyak beberapa kali dalam satu hari kerja, jadi berikan TTL singkat. Dengan requests-cache, caching cukup satu baris:

import requests_cache

session = requests_cache.CachedSession("frankfurter", expire_after=3600)
res = session.get("https://api.frankfurter.dev/v2/rate/usd/eur")
data = res.json()

Async

Pada aplikasi web async, gunakan httpx:

import httpx

API = "https://api.frankfurter.dev"


async def rate(base, quote):
    async with httpx.AsyncClient(base_url=API) as client:
        res = await client.get(f"/v2/rate/{base}/{quote}")
        res.raise_for_status()
        return res.json()["rate"]

Kunci Penyedia Resmi

Secara default Anda mendapatkan kurs gabungan dari seluruh penyedia. Tambahkan providers untuk mengunci satu otoritas resmi, yang penting saat suatu yurisdiksi mewajibkan kurs resmi terbitan bank sentralnya, seperti kurs referensi ECB untuk PPN Uni Eropa.

res = requests.get(
    "https://api.frankfurter.dev/v2/rate/usd/eur",
    params={"providers": "ecb"},
)
data = res.json()

Jelajahi semua penyedia. Penyedia yang dikunci mengikuti jadwal penerbitannya sendiri, sehingga kurs terbarunya bisa tertinggal satu hari dibanding kurs gabungan terbaru.

Menganalisis Deret Waktu?

Untuk rentang tanggal, pengelompokan bulanan, dan grafik, endpoint CSV dapat dimuat langsung ke dalam DataFrame. Lihat pandas.