2026년 10월 10일 토요일 날짜의 송장에는 2026년 10월 9일 금요일의 EUR/USD 환율 1.1206을 씁니다. EUR 12,500은 USD 14,007.50으로 환산됩니다. 주말에는 환율이 없으므로 직전 7일을 요청해 송장 날짜 이전의 마지막 행을 사용하세요.
API 사용 방법
- API 키 설정 무료 키를 받아 환경 변수
NARWHAL_API_KEY에 보관하세요. 스크립트는 이 변수를 읽어Authorization: Bearer YOUR_KEY헤더로 키를 보냅니다. Narwhal의 REST API와 MCP에는 같은 키를 쓰며, 여기서의 요청은 REST API로 보냅니다. - 송장 날짜와 그 이전 날짜 요청하기
GET /v1/fx/rates/EUR/observations에currencies=USD,start_date,end_date를 붙여 사용합니다. 스크립트처럼 종료일은 송장 날짜로, 시작일은 거기서 7일을 뺀 날로 설정하세요. 이 범위라면 송장이 주말이나 공휴일이어도 환율이 있는 이전 날짜가 응답에 포함됩니다. - 마지막 관측값 읽기 송장 날짜, 기준 통화, 상대 통화를 넣어 Python 스크립트를 실행합니다. 함수는
observations의 마지막 행을 가져와 그 날짜와 환율을 함께 반환합니다. 이 둘은 함께 보관하세요. 송장 날짜는 확인하려는 날짜이고, 반환된 날짜는 환산에 쓴 관측값의 날짜입니다.import os from datetime import date, timedelta import requests def rate_on(invoice: date, base: str, quote: str) -> tuple[str, float]: """The rate for the invoice date, or for the last day with a rate before it (weekends, holidays).""" start = invoice - timedelta(days=7) r = requests.get( f"https://api.narwhalapi.com/v1/fx/rates/{base}/observations", params={ "currencies": quote, "start_date": start.isoformat(), "end_date": invoice.isoformat(), "limit": 100, }, headers={"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"}, timeout=10, ) r.raise_for_status() last = r.json()["observations"][-1] return last["date"], float(last["rates"][0]["rate"]) day, rate = rate_on(date(2026, 10, 10), "EUR", "USD") # 10 October 2026 is a Saturday print(day, rate, "-> EUR 12,500 =", round(12500 * rate, 2), "USD") - 송장 금액에 환율 곱하기 반환된 환율로 송장 금액을 환산합니다. 2026년 10월 10일자 송장에서는 스크립트가 2026년 10월 9일과 환율 1.1206을 반환합니다. 출력에는 관측 날짜와 환산 금액이 함께 표시됩니다. 송장이 수백 건이면 7일 구간을 캐시하는 스크립트를 쓰세요.
스프레드시트 또는 코드 없이 계산
송장이 몇 건 안 된다면, 가져온 환율 시트에 날짜 열과 환율 열을 두고 쓰세요. 조회를 적용하기 전에 날짜를 오름차순으로 정렬하세요. 송장 날짜는 A2에 넣고, 수식에서는 해당 열에 dates와 rates를 사용합니다.
=LOOKUP(A2, dates, rates)근사 일치는 A2 이전 날짜 중 가장 최근 날짜의 환율을 반환합니다. 그래서 토요일 송장에는 별도의 주말용 수식 없이 환율이 있는 직전 날짜가 쓰입니다. 반환된 환율을 송장 금액에 곱하되, 필요한 통화 방향의 환율을 쓰세요. 시트 방식도 스크립트와 같은 규칙으로, 송장 날짜까지 사용할 수 있는 마지막 관측값을 고릅니다. 이 주말과 공휴일 규칙은 회계 정책에 명시해 두세요.
상황별 계산 방법
| 상황 | 적합한 방법 | 이유 |
|---|---|---|
| 몇 건의 송장 | 가져온 환율 시트에서 조회하기 | 날짜 근사 일치로 주말 처리하기 |
| 수백 건의 송장 | 7일 구간을 캐시하는 스크립트 | 모든 송장에 날짜 조회 적용하기 |
| 법정 환율 | 당국이 공표한 환율 | Narwhal은 시장의 일별 관측 환율을 제공합니다 |
어떤 환율을 세무 당국이나 감사인이 인정하는지는 회계 정책에 달려 있습니다. 정책에 따라 송장 날짜, 지급일, 월 평균, 중앙은행 환율이 요구될 수 있습니다. 날짜 조회를 쓰기 전에 어느 것이 해당하는지 확인하세요. Narwhal은 시장의 일별 관측 환율을 제공합니다. 정책이 법정 환율을 요구하면 당국이 공표한 환율을 쓰세요. 여기서의 송장 날짜 계산은 정책이 그 날짜와 이러한 시장 관측값을 요구할 때 적용됩니다.
어느 통화쌍 방향으로 요청해야 하나요?
송장 통화를 기준 통화로, 환산하려는 통화를 상대 통화로 요청하세요. EUR로 된 송장을 USD로 환산한다면 EUR을 기준 통화, USD를 상대 통화로 요청합니다. 반환되는 환율은 EUR당 USD이므로 EUR 송장 금액에 그 환율을 곱하세요.
기준 통화는 observations 엔드포인트의 경로에 들어가고, 상대 통화는 currencies 매개변수에 지정합니다. Python 호출에서는 송장 날짜 뒤에 오는 기준 통화와 상대 통화 인수가 이 같은 선택입니다. 시트에 환율을 넣을 때도 이 방향을 유지하면, EUR 송장의 조회 결과가 EUR당 USD가 됩니다.
송장 날짜에 convert 엔드포인트를 쓸 수 있나요?
과거 송장 날짜에는 observations를 쓰세요. convert 엔드포인트에는 날짜 매개변수가 없기 때문입니다. GET /v1/fx/convert?from=EUR&to=USD&amount=12500은 현재 환율로만 환산하며, 송장 날짜에 적용되던 관측값을 고르지 않습니다. 날짜가 있는 송장은 observations 범위를 요청해 그 날짜 이전의 마지막 환율을 금액에 곱하세요.
응답이 요청한 날짜보다 늦게 시작하는 이유는 무엇인가요?
청구서 기준으로 조회할 때는 범위에 청구서 날짜와, 그 날짜에 환율이 없는 경우를 위한 이전 관측값이 포함되어야 합니다. 모든 계정이 전체 이력을 조회할 수 있습니다.
오류는 status, code, detail, request_id를 담은 application/problem+json 형식을 사용합니다. 요청이 실패하면 오류 상세 내용을 확인하세요.
실제 예시: 2026년 10월 10일자 EUR 12,500 송장
2026년 10월 10일 토요일의 송장 날짜와 금액 EUR 12,500으로 시작합니다. 그 날짜까지의 7일 구간을 요청하세요. 송장이 주말이므로 그 이전의 마지막 관측값인 2026년 10월 9일 금요일을 사용합니다. 그날의 EUR/USD 환율은 EUR당 USD 1.1206입니다.
2026년 10월 9일의 환율로 EUR 12,500에 1.1206을 곱하면 2026년 10월 10일자 송장은 USD 14,007.50이 됩니다. 스크립트는 관측 날짜를 2026-10-09, 환산 금액을 14007.5 USD로 출력합니다.
| 단계 | 값 |
|---|---|
| 송장 날짜 | 2026년 10월 10일, 토요일 |
| 관측 날짜 | 2026년 10월 9일, 금요일 |
| 2026년 10월 9일 EUR/USD 환율 | EUR당 USD 1.1206 |
| 2026년 10월 10일자 송장 환산하기 | 결과: EUR 12,500 × 1.1206 = USD 14,007.50 |
에 게시되었습니다.