질문이나 문제가 있나요? GitHub Discussions에 남겨 주세요.

SDK는 필요하지 않습니다. fetch는 모든 브라우저, Node, Deno, Bun, 엣지 런타임에 내장되어 있습니다. CORS가 열려 있고 유출될 키도 없으니, 클라이언트 코드에서 바로 API를 호출할 수 있습니다.

빠른 시작

환율을 조회하고 환전합니다:

const res = await fetch("https://api.frankfurter.dev/v2/rate/usd/eur");
const data = await res.json();
const total = 100 * data.rate;

응답은 평면 객체 하나입니다: {"date": "2026-07-17", "base": "USD", "quote": "EUR", "rate": 0.8739}. fetch는 HTTP 오류에도 resolve되므로 res.ok를 확인하세요. 잘못된 통화 코드는 JSON 메시지와 함께 422를 반환합니다.

Intl로 서식 지정

통화 기호를 직접 붙이지 마세요. Intl.NumberFormat은 모든 로캘에서 각 통화의 기호, 위치, 소수 자릿수를 알고 있습니다:

const res = await fetch("https://api.frankfurter.dev/v2/rate/usd/eur");
const { rate } = await res.json();

const eur = new Intl.NumberFormat("ko-KR", {
  style: "currency",
  currency: "EUR",
});
eur.format(100 * rate); // "€87.39"

기호와 소수 자릿수

보조 단위나 기호를 위한 메타데이터 테이블을 직접 관리할 필요가 없습니다. 포매터에 물어보세요:

const yen = new Intl.NumberFormat("en", {
  style: "currency",
  currency: "JPY",
});

yen.resolvedOptions().maximumFractionDigits; // 0, 엔에는 보조 단위가 없습니다
yen.formatToParts(1).find((part) => part.type === "currency").value; // "¥"

Frankfurter가 제공하는 모든 통화를 코드와 기호와 함께 살펴보세요.

여러 환율 한 번에 조회

/v2/rates는 대상 통화별로 한 행씩 담긴 평면 배열을 반환합니다. Object.fromEntries로 조회용 객체로 바꾸세요. quotes를 생략하면 모든 통화를 반환합니다.

const api = "https://api.frankfurter.dev";
const res = await fetch(`${api}/v2/rates?base=usd&quotes=eur,gbp,jpy`);
const rows = await res.json();

const rates = Object.fromEntries(rows.map((row) => [row.quote, row.rate]));
// { EUR: 0.8739, GBP: 0.74388, JPY: 162.33 }

공식 제공 기관 고정

기본적으로 모든 제공 기관을 종합한 환율을 받습니다. providers를 추가해 특정 기관 하나를 고정하세요. EU 부가가치세용 ECB 기준 환율처럼 관할 지역이 자국 중앙은행의 공표 환율을 요구할 때 중요합니다.

const api = "https://api.frankfurter.dev";
const res = await fetch(`${api}/v2/rate/usd/eur?providers=ecb`);

모든 제공 기관을 살펴보세요. 고정한 제공 기관은 자체 공표 일정을 따르므로, 최신 환율이 종합 환율보다 하루 늦을 수 있습니다.

직접 실행해 보기

브라우저를 벗어나지 않고 Playground에서 쿼리를 구성하고 응답을 확인하세요.