---
title: "How do I load FX spot rates into the Quote Store?"
slug: "how-do-i-load-fx-spot-rates-into-the-quote-store"
updated: 2026-05-07T11:33:16Z
published: 2026-05-07T11:33:16Z
canonical: "support.lusid.com/how-do-i-load-fx-spot-rates-into-the-quote-store"
---

> ## Documentation Index
> Fetch the complete documentation index at: https://support.lusid.com/llms.txt
> Use this file to discover all available pages before exploring further.

# How do I load FX spot rates into the Quote Store?

You can load a quote representing a FX spot rate between two currencies on a given day, for example 1.3592 for GBPUSD on 6 May 2026.

Note the following:

- FX spot rates are required items of market data when valuing certain instruments, and may be required for any instrument held in a portfolio with a different base currency.
- Choices you make when uploading market data impact the composition of the [recipe](/v1/docs/what-is-a-recipe) you must create in order to use that data.

**See also**: [Market prices](/v1/docs/how-do-i-upload-a-market-price-or-fx-spot-rate-to-the-quote-store) | [Inflation fixings](/v1/docs/how-do-i-upload-an-inflation-fixing-to-the-lusid-quote-store) | [Interest rate fixings](/v1/docs/how-do-i-load-an-interest-rate-fixing-into-the-lusid-quote-store)

## Methods

LUSID web appLUSID APILuminesce

Call the [UpsertQuotes](https://www.lusid.com/docs/api#operation/UpsertQuotes) API to load up to 2000 quotes in a single request. You must:

- Encapsulate all the quotes in a single `scope` (namespace) in the URL.
- For each quote, specify an ephemeral ID (to track errors in the response).

```json
curl -X POST "https://<your-domain>.lusid.com/api/api/quotes/MyAPPLPrices"
  -H "Authorization: Bearer <your-API-access-token>"
  -H "Content-Type: application/json-patch+json"
  -d '{
  "Quote-0001": {
    "quoteId": {
      "quoteSeriesId": {
        "provider": "LSEG",
        "instrumentIdType": "CurrencyPair",
        "instrumentId": "GBP/USD",
        "quoteType": "Rate",
        "field": "MID_PRICE"
      },
      "effectiveAt": "2026-05-06T00:00:00Z"
    },
    "metricValue": {
      "value": 1.3592, "unit": "GBP/USD"
    }
  },
  "Quote-0002": {
    "quoteId": {
      "quoteSeriesId": {
        "provider": "LSEG",
        "instrumentIdType": "CurrencyPair",
        "instrumentId": "GBP/USD",
        "quoteType": "Rate",
        "field": "MID_PRICE"
      },
      "effectiveAt": "2026-05-05T00:00:00Z"
    },
    "metricValue": {
      "value": 1.3568, "unit": "GBP/USD"
    }
  }
}'
```

Navigate to **Data Management > Quotes** and click the **Create quote** button:

![](https://cdn.document360.io/d575ad81-c0ed-4980-bbd1-d59ac5c3de82/Images/Documentation/image-E82JYJRK.png)

Write a Luminesce SQL query using the [Lusid.Instrument.Quote.Writer](/v1/docs/lusidinstrumentquotewriter) provider and execute it using a tool such as the LUSID web app:

![](https://cdn.document360.io/d575ad81-c0ed-4980-bbd1-d59ac5c3de82/Images/Documentation/image-PBTBB9JQ.png)

## Data fields

This section supplements the [API documentation](https://www.lusid.com/docs/api/lusid/endpoints/quotes/UpsertQuotes/) and on-screen help text in the LUSID web app.

| Mandatory field or parameter | Allowed values | Must be matched in recipe? |
| --- | --- | --- |
| `scope` | Any, for example `MyGBPUSDRates` | ✅ [dataScope field](/v1/docs/recipes-locating-market-data#summary-of-fields-in-a-market-data-rule) |
| `provider` | [Any valid](/v1/docs/understanding-valid-market-data-provider-and-field-combinations) | ✅ [supplier field](/v1/docs/recipes-locating-market-data#summary-of-fields-in-a-market-data-rule) |
| `field` | [Any valid for provider](/v1/docs/understanding-valid-market-data-provider-and-field-combinations) | ✅ [field field](/v1/docs/recipes-locating-market-data#summary-of-fields-in-a-market-data-rule) |
| `instrumentIdType` | `CurrencyPair` | ✅ [key field](/v1/docs/recipes-locating-market-data#more-information-on-the-key-field), for example `Fx.GBP.USD` or `Fx.*.*` |
| `instrumentId` | Must match the syntax `&lt;DomCcy&gt;/&lt;FgnCcy&gt;`, for example `GBP/USD` (note forward slash) |
| `quoteType` | `Rate` | ✅ [quoteType field](/v1/docs/recipes-locating-market-data#summary-of-fields-in-a-market-data-rule) |
| `effectiveAt` | A UTC datetime, or date and [cut label](/v1/docs/what-is-a-cut-label) | ❌ [but must be within quoteInterval](/v1/docs/recipes-locating-market-data#more-information-on-the-quoteinterval-field) |
| `metricValue.value` | The quoted rate, for example `1.36206` | ❌ |
| `metricValue.unit` | Same as `instrumentId`, for example `GBP/USD` | ❌ |

The following fields are optional:

- A `priceSource` indicating a sub-supplier to the `provider`, for example Tradeweb or RRPS for Refinitiv DataScope. [**Match this using the priceSource field in a recipe**](/v1/docs/recipes-locating-market-data#summary-of-fields-in-a-market-data-rule). Note that if omitted, your recipe must also omit its `priceSource` field.
- A `lineage` providing additional information.
- We recommend *not* setting a `scaleFactor` for a FX spot rate.

## Subsequent updates

You can change the `metricValue` of an existing quote. Any other update constitutes a new quote in the time series.
