LUME EXCHANGE RATES / API REFERENCE

API docs

We use External exchange-rate provider as the configured source. Each latest-rate response identifies its source and publication time. Available currency symbols are updated from the latest provider data.

Base URLhttps://lumeexchangerates.com

Overview

Lume Exchange Rates brings exchange-rate comparison, conversion and historical charts into one place. Choose the currencies that matter to you, whether you are planning a trip, comparing an international price or building a product.

We use External exchange-rate provider as the configured source. Each latest-rate response identifies its source and publication time. Available currency symbols are updated from the latest provider data.

HTTPSJSONUTF-8GET / POSTUTC

Quick start

Read the currency catalog first, then select an anchor and targets. Field names and currency codes are identical in every interface language.

cURL
curl --request GET 'https://lumeexchangerates.com/v1/quotes?anchor=USD&targets=EUR,JPY'
JavaScript · browser
const response = await fetch('/v1/quotes?anchor=USD&targets=EUR,JPY', {
  credentials: 'same-origin'
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const { meta, anchor, data } = await response.json();
console.log(anchor, meta.as_of, data);

The browser example runs on the same origin. cURL and server requests to a private site require authorized site access; the URL does not bypass its login policy.

Access & authentication

The hosted preview uses the site’s access policy and browser session. Customer API keys, Bearer-token authentication for customers and a public cross-origin API are not currently provided. Keep the provider App ID on the server; do not send it to Lume Exchange Rates endpoints.

ParameterTypeDescription
Base URLURLhttps://lumeexchangerates.com
Content-Typeheaderapplication/json
Customer API key—This hosted preview uses the signed-in browser session. It does not yet issue per-customer API keys.
Provider App IDserver secretOPEN_EXCHANGE_RATES_APP_ID
CORSsame-originNo cross-origin allow headers are currently provided.

Authorization: Token is used only by the Lume Exchange Rates server when contacting External exchange-rate provider. It is not customer authentication. Access-control failures may be HTML or redirects from the hosting gateway: check status and Content-Type first.

Endpoints

MethodPathDescription
GET/v1/currenciesAll symbols with current rates, with provider names. Includes available alternatives and metals.
GET/v1/quotesBase symbol; defaults to USD. Any current provider symbol is accepted.
GET/v1/exchangeNon-negative numeric amount to convert.
GET/v1/historyDaily history and date-range series are available through /v1/history and /v1/series.
GET/v1/seriesDaily history and date-range series are available through /v1/history and /v1/series.
GET/v1/candlesOHLC
GET/v1/capabilitiesAvailability
GET/api/rates/latestLatest published rate
GET/api/currenciesCurrency
GET/api/rates/historyCharts
GET/api/rates/previousPrevious UTC day
POST/api/convertConverter

/v1 provides a compact query API. /api supplies the website’s latest-rate, history and conversion contracts. Their defaults and response shapes differ; do not interchange them.

GET /v1/currencies

All symbols with current rates, with provider names. Includes available alternatives and metals.

Parameter: —

cURL
curl --request GET 'https://lumeexchangerates.com/v1/currencies'

The values and dates below illustrate response structure; they are not live rates. Arrays may show only a subset. Use the API explorer for current data.

JSON
{
  "meta": {
    "mode": "provider",
    "source": "External exchange-rate provider",
    "source_url": "https://openexchangerates.org/",
    "as_of": "2026-01-01T00:00:00.000Z",
    "fetched_at": "2026-01-01T00:00:05.000Z",
    "currency_count": 3,
    "includes_alternative": true,
    "refresh_interval_seconds": 300,
    "provider_plan": "Unlimited",
    "notice": "Illustrative response; not live rates."
  },
  "data": [
    {
      "code": "USD",
      "name": "United States Dollar"
    },
    {
      "code": "EUR",
      "name": "Euro"
    },
    {
      "code": "JPY",
      "name": "Japanese Yen"
    }
  ]
}
ParameterTypeDescription
data[].codestringUppercase symbol. Alternative assets can exceed three characters or include underscores.
data[].namestringProvider name, or the code itself when no name is available.

GET /v1/quotes

Base symbol; defaults to USD. Any current provider symbol is accepted.

ParameterTypeRequiredDefaultDescription
anchorstringOptionalUSDBase symbol; defaults to USD. Any current provider symbol is accepted.
targetsstringOptionalallComma-separated target symbols. Omit to return all available symbols.
cURL
curl --request GET 'https://lumeexchangerates.com/v1/quotes?anchor=USD&targets=EUR,JPY'

The values and dates below illustrate response structure; they are not live rates. Arrays may show only a subset. Use the API explorer for current data.

JSON
{
  "meta": {
    "mode": "provider",
    "source": "External exchange-rate provider",
    "source_url": "https://openexchangerates.org/",
    "as_of": "2026-01-01T00:00:00.000Z",
    "fetched_at": "2026-01-01T00:00:05.000Z",
    "currency_count": 3,
    "includes_alternative": true,
    "refresh_interval_seconds": 300,
    "provider_plan": "Unlimited",
    "notice": "Illustrative response; not live rates."
  },
  "anchor": "USD",
  "data": [
    {
      "currency": "EUR",
      "value": 0.9
    },
    {
      "currency": "JPY",
      "value": 150
    }
  ]
}

Example: /v1/quotes?anchor=EUR&targets=USD,JPY. value is target units per one anchor unit. Duplicate targets are removed. Empty, lowercase or unavailable symbols return 400.

ParameterTypeDescription
anchorstringBase symbol; defaults to USD. Any current provider symbol is accepted.
data[].currencystringTo
data[].valuenumberrates[currency] / rates[anchor]

GET /v1/exchange

Non-negative numeric amount to convert.

ParameterTypeRequiredDefaultDescription
fromstringOptionalUSDSource currency symbol; defaults to USD.
tostringOptionalKRWTarget currency symbol; defaults to KRW.
quantitynumberOptional1Non-negative numeric amount to convert.
cURL
curl --request GET 'https://lumeexchangerates.com/v1/exchange?from=USD&to=EUR&quantity=100'

The values and dates below illustrate response structure; they are not live rates. Arrays may show only a subset. Use the API explorer for current data.

JSON
{
  "meta": {
    "mode": "provider",
    "source": "External exchange-rate provider",
    "source_url": "https://openexchangerates.org/",
    "as_of": "2026-01-01T00:00:00.000Z",
    "fetched_at": "2026-01-01T00:00:05.000Z",
    "currency_count": 3,
    "includes_alternative": true,
    "refresh_interval_seconds": 300,
    "provider_plan": "Unlimited",
    "notice": "Illustrative response; not live rates."
  },
  "data": {
    "from": "USD",
    "to": "EUR",
    "quantity": 100,
    "rate": 0.9,
    "result": 90
  }
}

Example: /v1/exchange?from=USD&to=EUR&quantity=100. Always specify from and to in global integrations. This legacy GET route defaults to KRW. Empty values, negatives, NaN, infinity and result overflow return 400.

ParameterTypeDescription
data.ratenumberrates[to] / rates[from]
data.resultnumberquantity × rate

GET /api/rates/latest

Latest published rate

Parameter: —

cURL
curl --request GET 'https://lumeexchangerates.com/api/rates/latest'

The values and dates below illustrate response structure; they are not live rates. Arrays may show only a subset. Use the API explorer for current data.

JSON
{
  "meta": {
    "provider": "External exchange-rate provider",
    "kind": "latest_published",
    "provider_timestamp": 1767225600,
    "published_at": "2026-01-01T00:00:00.000Z",
    "expected_interval_seconds": 300,
    "lag_seconds": 5,
    "stale": false,
    "timezone": "Asia/Seoul",
    "fetched_at": "2026-01-01T00:00:05.000Z",
    "persistent_storage": false
  },
  "data": {
    "base": "USD",
    "rates": {
      "USD": 1,
      "EUR": 0.9,
      "JPY": 150
    }
  }
}
ParameterTypeDescription
data.basestringUSD
data.ratesobjectAll available USD-relative rates; validate availability against the latest response.
meta.provider_timestampintegerUTC · UNIX seconds
meta.published_atstringISO 8601 · UTC
meta.fetched_atstringServer retrieval time, distinct from provider publication time.
meta.expected_interval_secondsintegerseconds
meta.stalebooleanTrue when age exceeds max(3 × expected interval, 900 seconds).
meta.lag_secondsintegerSeconds since provider publication.
meta.persistent_storagebooleanWhether the persistent collection service is connected.
meta.kindstringlatest_published | utc_daily

GET /api/currencies

Currency

ParameterTypeRequiredDefaultDescription
langstringOptionalenen / ko / ja / zh / es / hi / bn / de / fr / nl / pt / it / ru / vi / th / ar / id / ur
cURL
curl --request GET 'https://lumeexchangerates.com/api/currencies?lang=en'

The values and dates below illustrate response structure; they are not live rates. Arrays may show only a subset. Use the API explorer for current data.

JSON
{
  "meta": {
    "provider": "External exchange-rate provider",
    "kind": "latest_published",
    "provider_timestamp": 1767225600,
    "published_at": "2026-01-01T00:00:00.000Z",
    "expected_interval_seconds": 300,
    "lag_seconds": 5,
    "stale": false,
    "timezone": "Asia/Seoul",
    "fetched_at": "2026-01-01T00:00:05.000Z",
    "persistent_storage": false
  },
  "data": [
    {
      "code": "USD",
      "name": "US Dollar"
    },
    {
      "code": "EUR",
      "name": "Euro"
    }
  ]
}

Currency names use Intl.DisplayNames. Unrecognized assets retain their codes. Only symbols present in the latest data are returned.

GET /api/rates/history

Daily history and date-range series are available through /v1/history and /v1/series.

ParameterTypeRequiredDefaultDescription
fromstringOptionalUSDFrom
tostringOptionalEURTo
periodenumOptional1M1D | 1W | 1M | 3M | 1Y
cURL
curl --request GET 'https://lumeexchangerates.com/api/rates/history?from=USD&to=EUR&period=1W'

The values and dates below illustrate response structure; they are not live rates. Arrays may show only a subset. Use the API explorer for current data.

JSON
{
  "meta": {
    "kind": "utc_daily",
    "from": "USD",
    "to": "EUR",
    "period": "1W",
    "provider": "External exchange-rate provider",
    "persistent_storage": false
  },
  "data": [
    {
      "time": "2026-01-01",
      "value": 0.9
    },
    {
      "time": "2026-01-02",
      "value": 0.91
    }
  ]
}

1W starts seven days ago; 1M, 3M and 1Y use calendar periods. All daily ranges end yesterday, excluding the unfinished current UTC day. Month-end and leap-year boundaries are clamped. Longer ranges are split by calendar month, merged chronologically and deduplicated.

ParameterTypeDescription
data[].timestring | integerDaily: YYYY-MM-DD (UTC). Intraday: UNIX seconds.
data[].valuenumberrates[to] / rates[from]
meta.kindstringutc_daily | intraday
JSON
{
  "meta": {
    "kind": "intraday",
    "persistent_storage": false
  },
  "data": []
}

Without the collection service, 1D returns HTTP 200 and an empty data array as above. This is not fabricated minute data or an error. Symbols unavailable in a historical period can fail lookup.

GET /api/rates/previous

Previous UTC day

ParameterTypeRequiredDefaultDescription
fromstringOptionalUSDFrom
tostringOptionalEURTo
cURL
curl --request GET 'https://lumeexchangerates.com/api/rates/previous?from=USD&to=EUR'

The values and dates below illustrate response structure; they are not live rates. Arrays may show only a subset. Use the API explorer for current data.

JSON
{
  "meta": {
    "kind": "utc_daily",
    "reference_date": "2026-01-01",
    "reference_timestamp": "2026-01-01T23:59:59Z"
  },
  "data": {
    "from": "USD",
    "to": "EUR",
    "rate": 0.9,
    "rates": {
      "USD": 1,
      "EUR": 0.9
    }
  }
}

The comparison uses the previous UTC day’s provider reference. reference_timestamp is the logical day-end boundary, not a quote’s actual publication time. Percentage change is (current − reference) / reference × 100.

POST /api/convert

Converter

ParameterTypeRequiredDefaultDescription
Content-TypeheaderRequiredapplication/jsonapplication/json
amountnumberRequired—0 ≤ amount ≤ 1e15; finite
fromstringRequired—From
tostringRequired—To
cURL
curl --request POST 'https://lumeexchangerates.com/api/convert' \
  --header 'Content-Type: application/json' \
  --data '{"amount":100,"from":"USD","to":"EUR"}'

The values and dates below illustrate response structure; they are not live rates. Arrays may show only a subset. Use the API explorer for current data.

JSON
{
  "meta": {
    "provider": "External exchange-rate provider",
    "kind": "latest_published",
    "provider_timestamp": 1767225600,
    "published_at": "2026-01-01T00:00:00.000Z",
    "expected_interval_seconds": 300,
    "lag_seconds": 5,
    "stale": false,
    "timezone": "Asia/Seoul",
    "fetched_at": "2026-01-01T00:00:05.000Z",
    "persistent_storage": false
  },
  "data": {
    "amount": 100,
    "from": "USD",
    "to": "EUR",
    "rate": 0.9,
    "result": 90
  }
}

Send amount as a JSON number: "100" as a string returns 400. Symbols must exist in the latest snapshot. This endpoint calculates a value; it does not execute a transfer or trade.

GET /v1/history

Daily history and date-range series are available through /v1/history and /v1/series.

ParameterTypeRequiredDefaultDescription
dateYYYY-MM-DDRequired—1999-01-01 ≤ date ≤ UTC today
anchorstringOptionalUSDFrom
targetsCSVOptionalallTo
cURL
curl --request GET 'https://lumeexchangerates.com/v1/history?date=2026-01-01&anchor=EUR&targets=USD,JPY'

The values and dates below illustrate response structure; they are not live rates. Arrays may show only a subset. Use the API explorer for current data.

JSON
{
  "meta": {
    "date": "2026-01-01",
    "published_at": "2026-01-01T23:00:00Z",
    "partial_day": false
  },
  "anchor": "EUR",
  "data": [
    {
      "currency": "USD",
      "value": 1.1
    }
  ]
}
ParameterTypeDescription
meta.partial_daybooleanUTC daily reference
meta.published_atISO 8601 UTCLatest published rate

GET /v1/series

Daily history and date-range series are available through /v1/history and /v1/series.

ParameterTypeRequiredDefaultDescription
start / endYYYY-MM-DDRequired—1999-01-01 ≤ start ≤ end < UTC today; ≤ 366 days inclusive
anchor / targetsstring / CSVOptionalUSD / allsame as /v1/quotes
cURL
curl --request GET 'https://lumeexchangerates.com/v1/series?start=2026-01-01&end=2026-01-07&anchor=USD&targets=EUR'

The values and dates below illustrate response structure; they are not live rates. Arrays may show only a subset. Use the API explorer for current data.

JSON
{
  "meta": {
    "start": "2026-01-01",
    "end": "2026-01-02",
    "timezone": "UTC",
    "count": 2
  },
  "anchor": "USD",
  "data": [
    {
      "date": "2026-01-01",
      "rates": [
        {
          "currency": "EUR",
          "value": 0.9
        }
      ]
    },
    {
      "date": "2026-01-02",
      "rates": [
        {
          "currency": "EUR",
          "value": 0.91
        }
      ]
    }
  ]
}

OHLC via /v1/candles requires provider entitlement. Check /v1/capabilities; availability follows the configured plan.

JSON
{
  "timezone": "UTC",
  "date_bounds": "inclusive",
  "max_days": 366,
  "upstream_chunk": "calendar_month"
}

GET /v1/candles

OHLC via /v1/candles requires provider entitlement. Check /v1/capabilities; availability follows the configured plan.

ParameterTypeRequiredDefaultDescription
startYYYY-MM-DDTHH:mm:00ZRequired—UTC; completed period only; ≥ 2016-12-19
periodenumRequired—1m | 5m | 15m | 30m | 1h | 12h | 1d | 1w | 1mo
anchor / targetsstring / CSVOptionalUSD / allprovider base / symbols
cURL
curl --request GET 'https://lumeexchangerates.com/v1/candles?start=2026-01-01T00%3A00%3A00Z&period=1d&anchor=USD&targets=EUR'

The values and dates below illustrate response structure; they are not live rates. Arrays may show only a subset. Use the API explorer for current data.

JSON
{
  "meta": {
    "start": "2026-01-01T00:00:00Z",
    "end": "2026-01-01T23:59:59Z",
    "period": "1d"
  },
  "anchor": "USD",
  "data": [
    {
      "currency": "EUR",
      "open": 0.9,
      "high": 0.92,
      "low": 0.89,
      "close": 0.91,
      "average": 0.905
    }
  ]
}
JSON
{
  "source": "provider_ohlc",
  "synthetic": false,
  "cross_rate_ohlc": false,
  "max_age": {
    "1m": "1h",
    "5m": "24h",
    "15m": "24h",
    "30m": "32d",
    "1h": "32d"
  },
  "alignment_minutes": {
    "5m": 5,
    "15m": 15,
    "30m": 30,
    "1h": 30,
    "12h": 30,
    "1d": 30
  },
  "calendar_alignment": {
    "1w": "00:00 UTC",
    "1mo": "YYYY-MM-01T00:00:00Z"
  }
}

GET /v1/capabilities

Availability

Parameter: —

cURL
curl --request GET 'https://lumeexchangerates.com/v1/capabilities'

The values and dates below illustrate response structure; they are not live rates. Arrays may show only a subset. Use the API explorer for current data.

JSON
{
  "data": {
    "latest": true,
    "currencies": true,
    "conversion": "latest_snapshot",
    "historical": "verified_on_request",
    "time_series": true,
    "ohlc": false,
    "refresh_interval_seconds": 300,
    "customer_api_keys": false
  }
}

OHLC via /v1/candles requires provider entitlement. Check /v1/capabilities; availability follows the configured plan.

Data & precision

An exchange rate is useful only when its meaning is clear. Our rates are indicative references, not a bank offer or a guaranteed transaction price. Currency conversion uses a shared rate snapshot; rounding belongs at the display or settlement stage.

Formula
rate = rates[to] / rates[from]
result = amount * rate

Rates preserve floating-point precision without fixed decimal truncation. Round only for display or your accounting policy.

All rates use one source unit, including JPY. Multiply by 100 only at the display layer if needed. Account for JavaScript binary floating-point error and apply an explicit decimal and rounding policy for settlement.

Timestamps

UNIX timestamps are UTC seconds and ISO timestamps use Z. Daily UTC dates may differ from local calendar dates. The website displays latest publication time in the browser’s timezone. meta.timezone is a server display hint; it does not alter timestamp semantics.

ParameterTypeDescription
/v1 meta.as_ofISO 8601 | YYYY-MM-DDProvider timestamp
/v1 meta.refresh_interval_secondsintegerCache
/v1 meta.currency_countinteger… currencies available
/v1 meta.modeprovider | dailyData source
/api meta.published_atISO 8601 UTCLatest published rate
history data[].timeYYYY-MM-DD UTC | UNIX secondsUTC daily reference

Errors

HTTPcodeDescription
400INVALID_CURRENCY / INVALID_INPUT / INVALID_CONVERSION / INVALID_JSON / INVALID_PERIODEnter a non-negative amount
405METHOD_NOT_ALLOWEDGET: /v1/*, /api/rates/*, /api/currencies; POST: /api/convert
404NOT_FOUND/api/rates/*
422HISTORY_NOT_IN_PLAN / DATA_UNAVAILABLEAvailability
429RATE_LIMITED/api/* · 90 / IP / minute
404NOT_FOUNDUnknown /v1 endpoint
422FEATURE_NOT_IN_PLAN / HISTORY_NOT_IN_PLAN / OHLC_NOT_IN_PLANAvailability
400INVALID_DATE / INVALID_DATE_RANGE / INVALID_PERIOD / INCOMPLETE_PERIODEnter a non-negative amount
503PROVIDER_UNAVAILABLE / DATA_UNAVAILABLE / SERVICE_UNAVAILABLERates are unavailable. Please try again shortly.
JSON
{
  "error": {
    "code": "INVALID_CURRENCY",
    "message": "Symbol not available in latest provider data"
  }
}

message can be omitted. Branch on HTTP status and error.code. Correct invalid input before retrying. For 429 or transient 503, use bounded exponential backoff with jitter. Retry-After is not currently guaranteed.

Limits & caching

Latest data is cached rather than fetched again for every keystroke. The configured feed currently targets five-minute updates. The /api routes allow 90 requests per minute per client IP; the direct Worker limit is isolate-local, while a connected Redis service enforces it across instances. /v1 does not currently enforce the advertised future plan quotas.

Responses use Cache-Control: no-store. Browser response caching differs from the server’s provider cache. Reuse snapshots by publication time in your application. An available last-good snapshot can be returned during provider outages: inspect stale or as_of. Direct Worker caches are not persistent storage.

JSON
{
  "endpoints": [
    "/v1/history",
    "/v1/series",
    "/v1/candles",
    "/v1/capabilities"
  ],
  "requests_per_ip_per_minute": 60,
  "cache": "in_process",
  "completed_history_cache_seconds": 3600,
  "current_day_cache_seconds": 60
}

Availability

OHLC via /v1/candles requires provider entitlement. Check /v1/capabilities; availability follows the configured plan.

OHLC via /v1/candles requires provider entitlement. Check /v1/capabilities; availability follows the configured plan.

API explorer

Call the API on this site. Your provider key stays on the server.

REQUEST / cURL
RESPONSE / JSON
Run the request to view the real JSON response.
WELCOME TO LUME EXCHANGE RATES

Start building with Lume Exchange Rates

Explore actual provider rates without a card. Free API access is currently a preview; no account purchase or charge is created.

Actual rates · No payment required

SUBSCRIPTION / USD

Review your subscription

Recurring subscription in USD. Review the final taxes and total in the secure payment window before you confirm.

Applicable taxes are shown at checkout. You can manage renewal and cancel in the billing portal.

Paddle

ACCOUNT / BILLING

Your subscription