มีคำถามหรือพบปัญหา? โพสต์ได้ที่ GitHub Discussions

ไม่จำเป็นต้องใช้ SDK เพราะ Frankfurter เป็น HTTPS มาตรฐานที่ส่งคืน JSON ชั้นเดียว จึงใช้ไลบรารี HTTP ที่คุณคุ้นเคยอยู่แล้วได้ทันที โดยไม่ต้องใช้ API key และไม่ต้องสมัครบัญชี

เริ่มต้นอย่างรวดเร็ว

ดึงอัตราแลกเปลี่ยนและคำนวณยอดเงิน:

import requests

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

ผลลัพธ์ที่ได้เป็นออบเจกต์ชั้นเดียว: {"date": "2026-07-17", "base": "USD", "quote": "EUR", "rate": 0.8739} หากรหัสสกุลเงินไม่ถูกต้อง API จะส่งคืนสถานะ 422 พร้อมข้อความ JSON

การคำนวณตัวเลขทางการเงินอย่างแม่นยำ

ชนิดข้อมูล float เหมาะสำหรับการแสดงผลทั่วไปแต่ไม่ควรใช้กับงานบัญชี แนะนำให้แปลงอัตราแลกเปลี่ยนเป็น Decimal โดยส่ง parse_float ต่อไปยัง 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"]

ดึงหลายสกุลเงินพร้อมกัน

/v2/rates ส่งคืนอาร์เรย์ชั้นเดียวที่มีหนึ่งแถวต่อหนึ่งสกุลเงินปลายทาง แปลงเป็น dictionary สำหรับค้นหาค่าด้วย comprehension ได้เลย หากไม่ระบุ quotes จะได้รับข้อมูลทุกสกุลเงิน

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()}

แคชข้อมูลที่ไม่เปลี่ยนแปลง

อัตราแลกเปลี่ยนย้อนหลังของแหล่งข้อมูลที่ล็อกไว้จะไม่เปลี่ยนแปลง จึงแคชไว้นานเท่าใดก็ได้ ส่วนอัตราเฉลี่ยรวมอาจขยับเมื่อมีข้อมูลใหม่เข้ามา และอัตราล่าสุดจะเปลี่ยนเมื่อแหล่งข้อมูลประกาศอัตราใหม่ไม่กี่ครั้งต่อวันทำการ จึงควรตั้งค่า TTL สั้นๆ เมื่อใช้ requests-cache การทำแคชทำได้ในบรรทัดเดียว:

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

ในเว็บแอปแบบอะซิงโครนัส ให้ใช้ 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"]

การล็อกแหล่งข้อมูลทางการ

โดยค่าเริ่มต้นคุณจะได้รับอัตราเฉลี่ยรวมจากทุกแหล่งข้อมูล เพิ่ม providers เพื่อล็อกหน่วยงานที่ต้องการ เช่น อัตราอ้างอิง ECB สำหรับภาษีมูลค่าเพิ่มในสหภาพยุโรป เมื่อกฎหมายกำหนดให้ใช้อัตราที่ประกาศโดยธนาคารกลางของเขตอำนาจศาลนั้น

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

ดูแหล่งข้อมูลทั้งหมด แหล่งข้อมูลที่ล็อกไว้จะอัปเดตตามตารางเวลาประกาศของหน่วยงานนั้นเอง อัตราล่าสุดจึงอาจตามหลังอัตราเฉลี่ยรวมอยู่หนึ่งวัน

ต้องการวิเคราะห์อนุกรมเวลา?

สำหรับช่วงวันที่ การจัดกลุ่มรายเดือน และการสร้างกราฟ สามารถโหลด CSV endpoint เข้าสู่ DataFrame ได้โดยตรง ดูรายละเอียดได้ที่หน้า pandas