Frankfurter API อัตราแลกเปลี่ยนและสกุลเงิน
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"es=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?
- เพราะแหล่งข้อมูลดั้งเดิมของเราคือ