Frankfurter คือ API อัตราแลกเปลี่ยนฟรีสำหรับ 228 สกุลเงิน จาก ธนาคารกลางและแหล่งข้อมูลทางการ 106 แห่ง อัตราแลกเปลี่ยนอัปเดตทุกวันและมีข้อมูลย้อนหลังไปถึงปี 1948

API สาธารณะอยู่ที่ api.frankfurter.dev โดยไม่ต้องใช้ API key โปรเจกต์นี้เป็นโอเพนซอร์ส คุณจึงสามารถ self-host เพื่อควบคุมระบบเองได้ทั้งหมด

ใช้งานร่วมกับ AI agent อยู่หรือไม่? ชี้ไปที่ llms.txt หรือเพิ่ม เซิร์ฟเวอร์ MCP ได้เลย

อัตราแลกเปลี่ยน

ดึงอัตราแลกเปลี่ยนล่าสุด

curl https://api.frankfurter.dev/v2/rates

เปลี่ยนสกุลเงินหลักด้วย base

curl https://api.frankfurter.dev/v2/rates?base=usd

กรองสกุลเงินปลายทางด้วย quotes

curl https://api.frankfurter.dev/v2/rates?quotes=usd,gbp

อัตราแลกเปลี่ยนย้อนหลัง

ค้นหาอัตราแลกเปลี่ยนของวันที่ต้องการ

curl https://api.frankfurter.dev/v2/rates?date=1999-01-04

อนุกรมเวลา

ดึงอัตราแลกเปลี่ยนตามช่วงเวลาด้วย from และ to

curl https://api.frankfurter.dev/v2/rates?from=2026-01-01&quotes=usd

เคล็ดลับ: การกรองเฉพาะสกุลเงินที่ต้องการช่วยให้ผลลัพธ์มีขนาดเล็กลง สำหรับช่วงวันที่ขนาดใหญ่ แนะนำให้ขอข้อมูลแบบ NDJSON เพื่อสตรีมผลลัพธ์ทีละบรรทัด

การจัดกลุ่มข้อมูล

ลดความถี่ของอนุกรมเวลาด้วย group รองรับค่า week และ month

curl https://api.frankfurter.dev/v2/rates?from=2026-01-01&group=month

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

จำกัดเฉพาะแหล่งข้อมูลที่ต้องการด้วย providers

curl https://api.frankfurter.dev/v2/rates?providers=ecb

โดยค่าเริ่มต้น อัตราแลกเปลี่ยนจะคำนวณเฉลี่ยรวมจากทุกแหล่งข้อมูล ใช้ providers เพื่อดึงอัตราจากแหล่งข้อมูลที่ระบุ หรือใช้ endpoint แยกตามแหล่งข้อมูลเพื่อคิวรีจากแหล่งข้อมูลนั้นโดยตรง

การระบุแหล่งข้อมูลที่มา

เพิ่ม expand=providers เพื่อดูว่าแหล่งข้อมูลใดบ้างที่มีส่วนร่วมในการคำนวณอัตราเฉลี่ยแต่ละรายการ

curl https://api.frankfurter.dev/v2/rates?expand=providers

แต่ละแถวจะมีอาร์เรย์ providers แสดงรหัสแหล่งข้อมูลที่ใช้คำนวณ ส่วนสกุลเงินที่ผูกค่าเงินตายตัว (pegged) จะไม่มีฟิลด์นี้ เนื่องจากอัตราดังกล่าวคำนวณจากอัตราผูกค่าเงิน ไม่ใช่จากข้อมูลของแหล่งข้อมูล

ผลลัพธ์แบบ CSV

เรียกดูอัตราแลกเปลี่ยนในรูปแบบ CSV ได้เช่นกัน โดยเติม .csv ท้าย path หรือตั้งค่าเฮดเดอร์ Accept เป็น text/csv

curl https://api.frankfurter.dev/v2/rates.csv

ผลลัพธ์แบบ NDJSON

สำหรับผลลัพธ์ขนาดใหญ่ สามารถขอข้อมูลแบบ NDJSON (JSON คั่นด้วยบรรทัดใหม่) โดยตั้งค่าเฮดเดอร์ Accept เป็น application/x-ndjson แต่ละบรรทัดคือออบเจกต์ JSON อิสระ เหมาะสำหรับการสตรีมอนุกรมเวลาขนาดใหญ่โดยไม่ต้องบัฟเฟอร์ผลลัพธ์ทั้งหมดไว้ในหน่วยความจำ

curl https://api.frankfurter.dev/v2/rates?from=2026-01-01

อัตราแลกเปลี่ยนรายคู่

ดึงอัตราแลกเปลี่ยนสำหรับคู่สกุลเงินเดียว สามารถระบุ date หรือ providers เพิ่มเติมได้

curl https://api.frankfurter.dev/v2/rate/eur/usd

สกุลเงินทั้งหมด

ดึงรายการสกุลเงินที่รองรับพร้อมข้อมูลแหล่งข้อมูลที่ครอบคลุม

curl https://api.frankfurter.dev/v2/currencies

รวมสกุลเงินในอดีตที่เลิกใช้แล้วด้วย scope

curl https://api.frankfurter.dev/v2/currencies?scope=all

สกุลเงินเดี่ยว

ดึงรายละเอียดและแหล่งข้อมูลที่ครอบคลุมสำหรับสกุลเงินเดียว

curl https://api.frankfurter.dev/v2/currency/eur

แหล่งข้อมูล

แสดงรายการแหล่งข้อมูลที่อยู่เบื้องหลัง API

curl https://api.frankfurter.dev/v2/providers

ดึงรายละเอียดของแหล่งข้อมูลเดียว

curl https://api.frankfurter.dev/v2/providers/ecb

อัตราแลกเปลี่ยนแยกตามแหล่งข้อมูล

คิวรีอัตราแลกเปลี่ยนจากแหล่งข้อมูลที่ต้องการโดยตรง รองรับพารามิเตอร์ชุดเดียวกับ /v2/rates และ /v2/rate

curl https://api.frankfurter.dev/v2/providers/ecb/rates

ดึงคู่สกุลเงินเดียวจากแหล่งข้อมูลนั้น

curl https://api.frankfurter.dev/v2/providers/ecb/rate/eur/usd

ใช้งานร่วมกับ date ช่วงวันที่ (from และ to) หรือการจัดกลุ่มได้ รูปแบบอย่าง .csv และ ndjson ก็ใช้กับเส้นทางนี้ได้เช่นกัน

curl https://api.frankfurter.dev/v2/providers/ecb/rates?date=2024-05-15

การแปลงสกุลเงิน

ไม่มี endpoint สำหรับแปลงจำนวนเงินแยกต่างหาก ดึงอัตราแลกเปลี่ยนแล้วคำนวณในโค้ดเพียงไม่กี่บรรทัดได้เลย

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`)
);

ข้อผิดพลาด

API จะส่งคืนรหัสสถานะ HTTP มาตรฐานพร้อมเนื้อหาแบบ JSON

{
  "status": 422,
  "message": "invalid currency: ABC"
}
400
พารามิเตอร์ไม่ถูกต้องหรือคำขอผิดรูปแบบ
404
ไม่พบสกุลเงิน อัตราแลกเปลี่ยน หรือทรัพยากรที่ระบุ
422
เข้าใจคำขอแต่ไม่สามารถประมวลผลได้

การทำ Self-host

คุณสามารถ self-host ด้วย Docker ได้ ดูคู่มือ Deploy สำหรับการตั้งค่าใช้งานจริงและการกำหนดค่า API key

คำถามที่พบบ่อย

Frankfurter เหมาะกับใคร (และไม่เหมาะกับงานแบบไหน)?
เหมาะสำหรับระบบเรียกเก็บเงิน SaaS, อีคอมเมิร์ซ, การรายงานภาษี, ระบบ ERP และบัญชี รวมถึงงานวิจัยเชิงวิชาการที่ใช้ข้อมูลอนุกรมเวลาย้อนหลังไปถึงปี 1948 แต่ไม่ได้ออกแบบมาสำหรับการเทรดแบบเรียลไทม์ หรือสกุลเงินเฉพาะกลุ่มที่ผันผวนรุนแรงระหว่างวัน
ใช้งานเชิงพาณิชย์ได้ฟรีหรือไม่?
ฟรี อัตราแลกเปลี่ยนเฉลี่ยรวมเป็นการคำนวณของ Frankfurter เองและนำไปใช้ได้อย่างอิสระ ส่วนการคิวรีไปยัง endpoint ของแต่ละแหล่งข้อมูลโดยตรงจะอยู่ภายใต้ข้อกำหนดการใช้งานของแหล่งข้อมูลนั้น
เก็บหรือแคชอัตราแลกเปลี่ยนไว้ในฐานข้อมูลของตัวเองได้หรือไม่?
ได้ เราสนับสนุนให้เก็บข้อมูลรายวันไว้ในระบบของคุณเองเพื่อทำแคชหรือวิเคราะห์ย้อนหลัง ซึ่งช่วยลดปริมาณทราฟฟิกของ API ด้วย
มีการจำกัดจำนวนครั้งในการเรียกใช้งาน API หรือไม่?
ไม่มีโควตาจำกัด มีเพียงการจำกัดอัตราการส่งคำขอ (rate limit) เพื่อป้องกันการใช้งานที่ผิดปกติ แต่ไม่มีเพดานรายวันหรือรายเดือน หากใช้งานปริมาณมาก แนะนำให้แคชผลลัพธ์ ทำ self-host หรือดาวน์โหลดชุดข้อมูลไปคิวรีโดยตรง
รองรับ GraphQL หรือไม่?
ไม่รองรับ REST API มีโครงสร้างที่เรียบง่ายอยู่แล้ว การเพิ่ม GraphQL จึงเพิ่มความซับซ้อนโดยไม่ได้ประโยชน์มากนัก และยังทำให้ edge caching ที่ช่วยให้ API ตอบสนองได้เร็วทำงานไม่ได้ ใช้พารามิเตอร์อย่าง base, quotes และ from/to เพื่อดึงเฉพาะข้อมูลที่ต้องการได้เลย
จะยุติการให้บริการ API v1 หรือไม่?
ไม่ยุติ API v1 อยู่ในสถานะ deprecated เพื่อเปลี่ยนผ่านไปสู่ v2 แต่จะยังเปิดให้ใช้งานต่อไปโดยไม่มีกำหนดปิด ดูรายละเอียดได้ที่เอกสารประกอบ v1 สำหรับข้อมูลธนาคารกลางยุโรป แนะนำให้ใช้ /v2/providers/ecb/rates
นโยบายความเป็นส่วนตัวของ API เป็นอย่างไร?
API ไม่เก็บหรือบันทึกข้อมูลส่วนบุคคล ที่อยู่ IP หรือ URL ที่เรียกใช้งาน อินสแตนซ์สาธารณะทำงานอยู่หลัง Cloudflare เพื่อทำแคชและป้องกัน DDoS ซึ่งให้เฉพาะสถิติทราฟฟิกแบบรวมเท่านั้น
ต้องแจ้งการใช้ API นี้ในป้ายข้อมูลความเป็นส่วนตัวของ App Store หรือ Google Play หรือไม่?
ไม่จำเป็น เนื่องจากคำขอไม่ระบุตัวตนและไม่มีการเก็บล็อกของคำขอ จึงจัดอยู่ในหมวดไม่มีการเก็บข้อมูล (Data Not Collected) ตามแนวทางของ Apple และ Google Play
แจ้งบั๊กหรือสอบถามคำถามได้ที่ไหน?
เปิด issue เพื่อแจ้งบั๊ก ขอฟีเจอร์ใหม่ หรือเสนอแหล่งข้อมูลเพิ่มเติม และใช้ Discussions เพื่อถามคำถามหรือแบ่งปันไลบรารีและเครื่องมือที่คุณสร้างด้วย Frankfurter
อัตราแลกเปลี่ยนมีความแม่นยำแค่ไหน?
สำหรับงานด้านกฎระเบียบและภาษี แนะนำให้กรองตามแหล่งข้อมูลที่ต้องการเพื่อรับอัตราอ้างอิงอย่างเป็นทางการ สำหรับการใช้งานทั่วไป อัตราเฉลี่ยรวมเริ่มต้นก็เพียงพอ แต่อาจมีการขยับในตำแหน่งทศนิยมท้ายๆ เมื่อมีข้อมูลใหม่เข้ามา
อัตราแลกเปลี่ยนเป็นอัตรากลาง ราคารับซื้อ หรือราคาขาย?
API ส่งคืนอัตรากลางตลาด (mid-market rate) เมื่อแหล่งข้อมูลประกาศราคารับซื้อ (bid) และราคาขาย (ask) แทนอัตราอ้างอิงเดี่ยว Frankfurter จะบันทึกไว้ทั้งสองค่าและคำนวณค่ากึ่งกลางให้
อัตราแลกเปลี่ยนทั้งหมดเป็นข้อมูลรายวันใช่หรือไม่?
เกือบทั้งหมดเป็นรายวัน มีบางแหล่งข้อมูลที่เผยแพร่เป็นรายสัปดาห์ รายเดือน หรือรายไตรมาส ซึ่งจะไม่ถูกนำมารวมในฟีดอัตราเฉลี่ยรวม คุณสามารถคิวรีแหล่งข้อมูลเหล่านั้นโดยตรงด้วยตัวกรอง providers
มีอัตราแลกเปลี่ยนคริปโตหรือไม่?
มีอยู่ไม่กี่สกุลและข้อมูลค่อนข้างจำกัด โดย BTC, BCH, ETH, LTC และ XRP มาจากแหล่งข้อมูลเดียวคือสำนักงานภาษีกลางสวิตเซอร์แลนด์ ซึ่งประกาศวันละหนึ่งค่าในวันทำการย้อนหลังไปถึงปี 2018 สำหรับการยื่นภาษีในสวิตเซอร์แลนด์ ให้คิวรีด้วย providers=ESTV
ทำไมสกุลเงินเก่าและสกุลเงินใหม่บางสกุลจึงมีช่วงวันที่ทับซ้อนกัน?
แหล่งข้อมูลบางแห่งคำนวณข้อมูลสกุลเงินใหม่ย้อนหลังกลับไปในช่วงเวลาของสกุลเงินเดิม (เช่น TRL สิ้นสุดในปี 2010 แต่ TRY เริ่มตั้งแต่ปี 1996) เราบันทึกข้อมูลจากแหล่งข้อมูลตามจริง และจะกรองช่วงที่ทับซ้อนออกเฉพาะตอนคำนวณอัตราเฉลี่ยรวมเท่านั้น
ทำไมถึงชื่อ Frankfurter?
เพราะแหล่งข้อมูลดั้งเดิมของเราคือ
European Central Bank