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://staging.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

Production external JSON APIs are currently disabled. Examples below require an enabled environment and a valid paid API key. Browser login alone does not authorize API calls. The website calculator remains available.

cURL
export LUME_API_URL='https://lumeexchangerates.com'
export LUME_API_KEY='YOUR_API_KEY'
curl --fail-with-body -H "Authorization: Bearer $LUME_API_KEY" "$LUME_API_URL/v1/quotes?anchor=USD&targets=EUR,JPY"
JavaScript · server
const response = await fetch(process.env.LUME_API_URL + '/v1/quotes?anchor=USD&targets=EUR,JPY', {
  headers: { Authorization: 'Bearer ' + process.env.LUME_API_KEY }
});
const body = await response.json();
if (!response.ok) throw new Error(body.error?.code || 'HTTP_' + response.status);
console.log(body.anchor, body.meta.timestamp, body.data);

Access & authentication

Manage customer keys in /account. Key issuance and rate access require an active paid subscription and server-confirmed payment. Unsubscribed accounts have no free API allowance. Provider credentials remain server-side.

Authentication
Authorization: Bearer lume_…
PermissionAccess
rates:read/v1/currencies, /v1/quotes, /v1/exchange, /v1/history, /v1/series, /v1/candles, /v1/capabilities
usage:read/v1/usage?range=today|7d|30d
Owner session/api/usage, account and support management

Keep secret keys on servers. Configured IP/domain restrictions must all match. CORS is opt-in for explicitly allowed HTTPS origins and never replaces authentication.

Endpoints

GET endpointParameters
/v1/currencies—
/v1/quotesanchor, targets
/v1/exchangefrom, to, quantity
/v1/historydate, anchor, targets
/v1/seriesstart, end, anchor, targets
/v1/candlesstart, period, anchor, targets, source
/v1/capabilities—
/v1/usagerange=today|7d|30d

GET /v1/currencies

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

Parameter: —

cURL
curl --request GET 'https://staging.lumeexchangerates.com/v1/currencies' --header 'Authorization: Bearer YOUR_API_KEY'

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://staging.lumeexchangerates.com/v1/quotes?anchor=USD&targets=EUR,JPY' --header 'Authorization: Bearer YOUR_API_KEY'

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.
tostringOptionalEURTarget currency symbol; defaults to EUR.
quantitynumberOptional1Non-negative numeric amount to convert.
cURL
curl --request GET 'https://staging.lumeexchangerates.com/v1/exchange?from=USD&to=EUR&quantity=100' --header 'Authorization: Bearer YOUR_API_KEY'

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 EUR. 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://staging.lumeexchangerates.com/api/rates/latest' --header 'Authorization: Bearer YOUR_API_KEY'

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": true
  },
  "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://staging.lumeexchangerates.com/api/currencies?lang=en' --header 'Authorization: Bearer YOUR_API_KEY'

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": true
  },
  "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

Website-internal chart route. Accepts from/to currencies and period=1D|1W|1M|3M|1Y. 1D returns collected minute observations from the last 24 hours; other periods return UTC daily rates through yesterday. Missing minutes are not fabricated. No observations returns 503 HISTORY_NOT_COLLECTED.

Data is persisted in S3 and meta.persistent_storage is true. Historical symbol availability and provider permissions may restrict results.

GET /api/rates/previous

Previous UTC day

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

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://staging.lumeexchangerates.com/api/convert' --header 'Authorization: Bearer YOUR_API_KEY' \
  --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": true
  },
  "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://staging.lumeexchangerates.com/v1/history?date=2026-01-01&anchor=EUR&targets=USD,JPY' --header 'Authorization: Bearer YOUR_API_KEY'

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

start/end are inclusive UTC YYYY-MM-DD dates. Require start ≤ end < today UTC, with at most 366 days. anchor/targets match /v1/quotes. data[].time is the date and data[].rates maps target codes to rates. Values below illustrate the response shape.

JSON
{
  "request_id": "server-generated-uuid",
  "meta": {
    "source": "Open Exchange Rates",
    "kind": "utc_daily",
    "start": "2026-01-01",
    "end": "2026-01-02",
    "day_count": 2
  },
  "anchor": "USD",
  "data": [
    {
      "time": "2026-01-01",
      "rates": {
        "EUR": 0.9
      }
    },
    {
      "time": "2026-01-02",
      "rates": {
        "EUR": 0.91
      }
    }
  ]
}

GET /v1/candles

GET /v1/candles accepts start (a completed UTC minute), period, anchor, targets and source. Default source=observations returns collected-minute OHLC and arithmetic mean; inspect meta.samples, expected_samples and complete for gaps. Repeated publications and missing minutes are not provider tick data. source=provider requires upstream OHLC permission; otherwise 422 OHLC_NOT_IN_PLAN. Cross-currency extrema are requested from the provider, never formed by dividing independent highs/lows.

GET
/v1/candles?start=2026-11-09T06:00:00Z&period=1h&anchor=EUR&targets=JPY&source=observations
SourcePeriods
observations1m, 5m, 15m, 30m, 1h, 12h, 1d
provider1m, 5m, 15m, 30m, 1h, 12h, 1d, 1w, 1mo; provider history/alignment limits apply

GET /v1/capabilities

GET /v1/capabilities distinguishes implemented features from upstream availability. It describes daily-series limits, intraday observations and source-specific candle periods. It never changes the external API gate; normal key authentication and scope checks still apply.

GET
/v1/capabilities

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

HTTPerror.code
400INVALID_PARAMETER / INVALID_CURRENCY / INVALID_CONVERSION / INVALID_JSON / INVALID_DATE / INVALID_DATE_RANGE
401INVALID_API_KEY / AUTH_REQUIRED
403SUBSCRIPTION_REQUIRED / SCOPE_NOT_ALLOWED / IP_NOT_ALLOWED / DOMAIN_NOT_ALLOWED
404NOT_FOUND / OBSERVATIONS_NOT_COLLECTED
422OHLC_NOT_IN_PLAN / CANDLE_HISTORY_UNAVAILABLE / FEATURE_UNAVAILABLE
405METHOD_NOT_ALLOWED
429RATE_LIMIT_EXCEEDED / MONTHLY_LIMIT_EXCEEDED
503API_NOT_AVAILABLE / PROVIDER_UNAVAILABLE / SERVICE_UNAVAILABLE

Branch on HTTP status and error.code. Include X-Request-Id/request_id when contacting support, never keys or passwords. For 429, honor Retry-After in seconds with bounded backoff and jitter.

Limits & caching

PlanMonthly UTCPer secondPer minute
Launch10000560
Scale10000020300
UnlimitedUnlimited501200

All keys share account quotas. Second/minute windows are fixed UTC windows; monthly quota resets at 00:00 UTC on the first. Admitted requests count once, including cache hits, input errors and provider errors. Authentication/quota/preflight rejections do not count. /v1/usage reads consume no API quota.

Responses are private, no-store. Provider caching defaults to 300 seconds; publication values may repeat according to the upstream interval. X-RateLimit-*, X-Monthly-* and RateLimit headers expose limits and remaining counts. timestamp/source/stale describe the data; response_timestamp is response creation time.

Availability

Production external JSON APIs are currently disabled. Examples below require an enabled environment and a valid paid API key. Browser login alone does not authorize API calls. The website calculator remains available.

/v1/currencies, /v1/quotes, /v1/exchange, /v1/history, /v1/series, /v1/candles, /v1/capabilities, /v1/usage

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.
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