---
title: "JPMorgan PricingDirect"
slug: "jpmorgan-pricing-direct"
updated: 2025-10-30T11:10:56Z
published: 2025-10-30T11:10:56Z
canonical: "support.lusid.com/jpmorgan-pricing-direct"
---

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

# JPMorgan PricingDirect

FINBOURNE’s [JPMorgan PricingDirect](https://www.pricing-direct.com) integration allows you to seamlessly deliver Fixed Income pricing data into LUSID.

> [!NOTE]
> Prerequisites
> 
> Before getting started, ensure you have:
> 
> - [x] An active contract with JP Morgan for PricingDirect services
> - [x] A technical account username and password issued by JP Morgan to access PricingDirect services
> - [x] Contacted your FINBOURNE representative to enable the integration in your LUSID domain

## Supported data types

The integration provides quote data for Fixed Income instruments with a valid CUSIP identifier.

## Setting up the integration

### Step 1: Create an integration instance

An integration instance configures the snapshot timing, price types, and instruments for your quote import:

1. Navigate to **Integrations > Dashboard**.
2. Select **Create instance** and choose **JPM PricingDirect**. ![](https://cdn.document360.io/d575ad81-c0ed-4980-bbd1-d59ac5c3de82/Images/Documentation/image-PLIOQ73H.png)
3. Specify a friendly **Name** and **Description** for the integration instance.
4. Specify the following in the **Integration settings** tab:

![](https://cdn.document360.io/d575ad81-c0ed-4980-bbd1-d59ac5c3de82/Images/Documentation/image-3COH9YBC.png)
  - **Base URL:** The base URL for the JPM PricingDirect API
  - **Username:** Your JPM PricingDirect technical account username
  - **Password:** Your JPM PricingDirect technical account password
  - **Pricing configuration**:
    - **Pricing category**: `FixedIncome`; support for `Derivatives` is coming soon
    - **Close type:** Defines the snapshot time (`effectiveAt`) for a quote; note that there is a delay between the price snapshot capture time and the data becoming available via API, see [appendix A](/v1/docs/jpmorgan-pricing-direct#appendix-a-close-types) for more details on the available close types
    - **Price type:** Choose whether to retrieve `BID`, `MEAN`, `OFFER`, or all three quotes for each instrument
    - **Instrument scopes:** Import quotes for LUSID instruments with the `Instrument/LUSIDConfig-JPM-PricingDirect/RefreshQuoteData` property in the specified scopes
    - **Quote instrument identifier types:** By default, quotes are stored with CUSIP identifiers; optionally specify additional identifier types to duplicate quotes against those identifiers
  - **Debug configuration**:
    - **Request/response output Drive folder path:** Optionally, specify a [Drive](/v1/docs/drive) path starting with `LUSID-Horizon/` to log request and response payloads for debugging
5. Specify the following in the **Execution settings** tab:

For example, to schedule runs for **Close type** `NY15 | NY Bond 3PM` (snapshot at 15:00 ET, data available at 16:30 ET), you could specify the cron expression `0 35 16 ? * MON-FRI` with timezone `America/New_York`; this runs on weekdays at 16:35, allowing for a 5-minute error margin. ![](https://cdn.document360.io/d575ad81-c0ed-4980-bbd1-d59ac5c3de82/Images/Documentation/image-GKS0C0Y9.png)
  - A cron **Schedule** to trigger the integration instance at
  - A **Schedule timezone** for LUSID to use with the cron **Schedule**
  - Whether the schedule should be **Enabled** upon saving; if enabled, the integration instance will subsequently run according to your specified schedule
6. Click **Save** to create the integration instance. Note the **Instance ID**, which you need for the next step.

### Step 2: Select the instruments to import quotes for

LUSID selects instruments for quote imports using the `Instrument/LUSIDConfig-JPM-PricingDirect/RefreshQuoteData` property. To include instruments in imports:

1. Ensure each Fixed Income instrument has a CUSIP [identifier](/v1/docs/understanding-instrument-identifiers) value.
2. [Follow these steps](/v1/docs/how-do-i-add-a-property-to-an-entity#using-the-lusid-web-app) to add the instrument property with **Scope** `LUSIDConfig-JPM-PricingDirect` and **Code** `RefreshQuoteData` to the instruments you want to include in the JPM PricingDirect integration instance import. ![](https://cdn.document360.io/d575ad81-c0ed-4980-bbd1-d59ac5c3de82/Images/Documentation/image-NKAYGAPI.png)
3. Set the property value to your integration **Instance ID** from [step 1](/v1/docs/jpmorgan-pricing-direct#step-1-create-an-integration-instance). You can enter more than one ID if you want to include the instrument in multiple integration instances. ![](https://cdn.document360.io/d575ad81-c0ed-4980-bbd1-d59ac5c3de82/Images/Documentation/image-BRA1LEYQ.png)

> [!NOTE]
> Bulk updates
> 
> You can use Luminesce to schedule a query to populate the property for all relevant instruments daily before the scheduled integration instance run; see [appendix B](/v1/docs/jpmorgan-pricing-direct#appendix-b-populating-the-refreshquotedata-property-on-instruments-in-bulk).

## Monitoring and troubleshooting integration runs

[See how to monitor integrations and troubleshoot general issues.](/v1/docs/setting-up-an-integration#monitoring-integration-runs)

LUSID stores JPMorgan PricingDirect data as [quotes](/v1/docs/retrieving-data-from-the-quote-store) in the `LUSID-JPM-PricingDirect` scope.

#### Understanding JPM PricingDirect run logs

You can use the **Source Primary ID Value** column in the logs to view the instruments fetched for processing in an integration run.

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

The `ApiIdentifier` **Source Primary ID Type** and **Value** displays the file used (if one is specified in the integration instance **Request / Response Output Drive Folder Path**) for the request and response.

LUSID logs the status of rows as follows:

- **ResourceSkipped**: LUSID was unable to retrieve a price for the specified instrument
- **ResourceExtracted** and **ResourceMapped**: LUSID was able to retrieve a price for the specified instrument; if your instance is configured to retrieve all price types, you should expect three quotes per instrument identifier type

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

The final **Log ID** rows show the details of the quotes loaded by LUSID:

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

---

### Troubleshooting

#### `PayloadFailed` with `Exception occurred when calling JPM PricingDirect API: 'HTTP Unauthorized'`

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

If you experience this error message, verify the **Username** and **Password** values [you entered in your integration instance](/v1/docs/jpmorgan-pricing-direct#step-1-create-an-integration-instance) are correct.

#### No quotes loaded for all instruments

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

If you experience this error, validate your instruments were in scope for the run via the logs. Expand the initial log and check the **Description** column for a message containing `with 0 instrument(s) for instrument scope ‘&lt;your-scope&gt;‘` .

If no instruments were in scope, verify:

- The `Instrument/LUSIDConfig-JPM-PricingDirect/RefreshQuoteData` property is set on at least one instrument, and the value matches the [integration **Instance ID**](/v1/docs/jpmorgan-pricing-direct#step-1-create-an-integration-instance)
- Each instrument has a value for the CUSIP [identifier](/v1/docs/understanding-instrument-identifiers)
- The relevant instrument scopes have been added as values for **Instrument scopes** [in the integration instance](/v1/docs/jpmorgan-pricing-direct#step-1-create-an-integration-instance)

## Appendix A: Close types

Until the delivery time associated with the quote, the system retrieves quotes for T-1. The following table contains indicative snapshot and delivery times for each **Close type**:

> [!NOTE]
> Note
> 
> For the latest definitive guide on snapshot and delivery times, see the Product Delivery Matrix from JPM PricingDirect.

| Close Type | Snapshot | Delivery |
| --- | --- | --- |
| AP18 \| APAC 6PM | 18:00 JST | 19:00 JST |
| AP19 \| APAC 7PM | 19:00 JST | 20:00 JST |
| LN12 \| London 12PM | 12:00 BST | 12:30 BST |
| CE15 \| Continental Europe 3PM | 15:00 CET | 15:45 CET |
| CE16 \| Continental Europe 4PM | 16:00 CET | 16:45 CET |
| LN16 \| London 4PM | 16:15 BST | 17:15 BST |
| NY13 \| NY 1PM | 13:00 ET | 13:45 ET |
| NY15 \| NY Bond 3PM | 15:00 ET | 16:30 ET |
| NY16 \| NY Stock 4PM | 16:00 ET | 16:45 ET |
| NY17 \| NY EOD 5PM | 17:00 ET | 17:30 ET |
| Index \| JPM Index | 17:00 ET | 17:15 ET |

## Appendix B: Populating the `RefreshQuoteData` property on instruments in bulk

You can schedule a [Luminesce query](/v1/docs/understanding-the-luminesce-sql-query-syntax) to populate the `Instrument/LUSIDConfig-JPM-PricingDirect/RefreshQuoteData` property for all relevant instruments daily, before the integration instance runs.

*****Click to expand Luminesce query*****

For example, to add the `RefreshQuoteData` property to all new Fixed Income instruments in the `default` scope to include them in the `NY15 | NY Bond 3PM` daily quote import:

```sql
--Close type = NY15 | NY Bond 3PM

-- Define the integration instance ID:
@@integrationInstanceId =
select [InstanceId] from Integration.Dashboard
where [Type] = 'jpm-pricing-direct'
  and [Name] = 'JPM PricingDirect FI NY15'
limit 1;

-- Specify which instrument scope(s) to include. Note this scope must also be specified in the integration instance config.
@instrumentScopes = select 'default' as Scope;

-- Specify which Product types are in scope. Note each instrument must have a valid CUSIP for JPM PricingDirect.
@instruments=
select  i.Scope as EntityScope,
  'LusidInstrumentId' as 'EntityIdType',
  i.[LusidInstrumentId] as 'EntityId',
  i.Scope || '/LusidInstrumentId/' || i.[LusidInstrumentId] as InstrumentKey
from [Lusid.Instrument.Bond] i
  join @instrumentScopes s
    on i.[Scope] = s.[Scope]
where i.[State] = 'Active'
  and i.[Cusip] is not null
  and LENGTH(i.Cusip) = 9
UNION
select i.Scope as EntityScope,
  'LusidInstrumentId' as 'EntityIdType',
  i.[LusidInstrumentId] as 'EntityId',
  i.Scope || '/LusidInstrumentId/' || i.[LusidInstrumentId] as InstrumentKey
from [Lusid.Instrument.ComplexBond] i
  join @instrumentScopes s
    on i.[Scope] = s.[Scope]
where i.[State] = 'Active'
  and i.[Cusip] is not null
  and LENGTH(i.CUSIP) = 9
UNION
select i.Scope as EntityScope,
  'LusidInstrumentId' as 'EntityIdType',
  i.[LusidInstrumentId] as 'EntityId',
  i.Scope || '/LusidInstrumentId/' || i.[LusidInstrumentId] as InstrumentKey
from [Lusid.Instrument.SimpleInstrument] i
  join @instrumentScopes s
    on i.[Scope] = s.[Scope]
where i.[State] = 'Active'
  and i.[Cusip] is not null
  and LENGTH(i.CUSIP) = 9
  and i.[SimpleInstrumentType] = 'TBA'
;

-- Fetch the current Instrument/LUSIDConfig-JPM-PricingDirect/RefreshQuoteData settings
@existing=
select p.Domain, p.EntityScope, p.EntityIdType, p.EntityId, p.PropertyDomain, p.PropertyScope, p.PropertyCode, p.Value, 
  p.EntityScope || '/' || p.EntityIdType || '/' || p.EntityId as InstrumentKey
from [Lusid.Property] p
where p.Domain = 'Instrument'
  and p.PropertyDomain = 'Instrument'
  and p.PropertyScope = 'LUSIDConfig-JPM-PricingDirect'
  and p.PropertyCode = 'RefreshQuoteData';
        
-- Add this integration instance ID to instruments that are already included in a different JPM PricingDirect instance:
@updates =
select p.Domain, p.EntityScope, p.EntityIdType, p.EntityId, p.PropertyDomain, p.PropertyScope, p.PropertyCode, p.InstrumentKey,
  p.Value || ',' || @@integrationInstanceId as Value, 'Upsert' as WriteAction
from @existing p
  join @instruments i 
    on p.InstrumentKey = i.InstrumentKey
where p.Value not like '%' || @@integrationInstanceId || '%';

-- Add the instance ID to instruments that are not in the @updates set or @existing set
@inserts =
select 'Instrument' as Domain, i.EntityScope, i.EntityIdType, i.EntityId, 'Instrument' as PropertyDomain,
  'LUSIDConfig-JPM-PricingDirect' as PropertyScope, 'RefreshQuoteData' as PropertyCode,
  @@integrationInstanceId as Value, 'Upsert' As WriteAction
from @instruments i 
where i.InstrumentKey not in (select InstrumentKey from @existing where Value like '%' || @@integrationInstanceId || '%')
  and i.InstrumentKey not in (select InstrumentKey from @updates)
;

-- Define the changes to write to the instruments
@toWrite=
select Domain, EntityScope, EntityIdType, EntityId, PropertyDomain, PropertyScope, PropertyCode, Value, WriteAction 
from @updates 
UNION
select Domain, EntityScope, EntityIdType, EntityId, PropertyDomain, PropertyScope, PropertyCode, Value, WriteAction 
from @inserts
;

-- Upsert the changes
@response =
select WriteErrorCode, WriteError, WriteErrorDetail, Domain, EntityScope, EntityIdType, EntityId, PropertyDomain, PropertyScope, PropertyCode, Value
from Lusid.Property.Writer
where ToWrite = @toWrite;

-- Return the response
select WriteErrorCode, WriteError, WriteErrorDetail, Domain, EntityScope, EntityIdType, EntityId, PropertyDomain, PropertyScope, PropertyCode, Value
from @response;

-- Handle any errors
@@numErrors = select COUNT(*) from @response where WriteErrorCode <> 0;
@@errorMsg = select 'LUSIDConfig-JPM-PricingDirect/RefreshQuoteData not updated on ' ||  @@numErrors || ' instruments';

select IIF(@@numErrors>0,throw(@@errorMsg),'') 
where @@numErrors>0;
```

For bitemporal data, the **effectiveAt** timestamp reflects the point in time at which a data item becomes valid in LUSID from a business perspective. You can specify the field when you make a read or update request to LUSID, indicating that you want to retrieve or update data that is effective at the specified date.
