--- title: "JPMorgan PricingDirect" slug: "jpmorgan-pricing-direct" updated: 2026-09-10T10:01:26Z published: 2026-09-10T10:01:26Z 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](/v1/docs/how-do-i-use-the-support-centre) 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?sv=2026-02-06&spr=https&st=2026-11-09T07%3A08%3A22Z&se=2026-11-09T08%3A08%3A22Z&sr=c&sp=r&sig=Gk5K2opbsAPLh7ov3eTg9ogH3iN%2FsDsN6HvdztocRqY%3D) 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?sv=2026-02-06&spr=https&st=2026-11-09T07%3A08%3A22Z&se=2026-11-09T08%3A08%3A22Z&sr=c&sp=r&sig=Gk5K2opbsAPLh7ov3eTg9ogH3iN%2FsDsN6HvdztocRqY%3D) - **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?sv=2026-02-06&spr=https&st=2026-11-09T07%3A08%3A22Z&se=2026-11-09T08%3A08%3A22Z&sr=c&sp=r&sig=Gk5K2opbsAPLh7ov3eTg9ogH3iN%2FsDsN6HvdztocRqY%3D) - 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?sv=2026-02-06&spr=https&st=2026-11-09T07%3A08%3A22Z&se=2026-11-09T08%3A08%3A22Z&sr=c&sp=r&sig=Gk5K2opbsAPLh7ov3eTg9ogH3iN%2FsDsN6HvdztocRqY%3D) 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?sv=2026-02-06&spr=https&st=2026-11-09T07%3A08%3A22Z&se=2026-11-09T08%3A08%3A22Z&sr=c&sp=r&sig=Gk5K2opbsAPLh7ov3eTg9ogH3iN%2FsDsN6HvdztocRqY%3D) > [!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?sv=2026-02-06&spr=https&st=2026-11-09T07%3A08%3A22Z&se=2026-11-09T08%3A08%3A22Z&sr=c&sp=r&sig=Gk5K2opbsAPLh7ov3eTg9ogH3iN%2FsDsN6HvdztocRqY%3D) 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?sv=2026-02-06&spr=https&st=2026-11-09T07%3A08%3A22Z&se=2026-11-09T08%3A08%3A22Z&sr=c&sp=r&sig=Gk5K2opbsAPLh7ov3eTg9ogH3iN%2FsDsN6HvdztocRqY%3D) 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?sv=2026-02-06&spr=https&st=2026-11-09T07%3A08%3A22Z&se=2026-11-09T08%3A08%3A22Z&sr=c&sp=r&sig=Gk5K2opbsAPLh7ov3eTg9ogH3iN%2FsDsN6HvdztocRqY%3D) --- ### 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?sv=2026-02-06&spr=https&st=2026-11-09T07%3A08%3A22Z&se=2026-11-09T08%3A08%3A22Z&sr=c&sp=r&sig=Gk5K2opbsAPLh7ov3eTg9ogH3iN%2FsDsN6HvdztocRqY%3D) 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?sv=2026-02-06&spr=https&st=2026-11-09T07%3A08%3A22Z&se=2026-11-09T08%3A08%3A22Z&sr=c&sp=r&sig=Gk5K2opbsAPLh7ov3eTg9ogH3iN%2FsDsN6HvdztocRqY%3D) 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 ‘<your-scope>‘` . 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.