For a deeper look into our DataScope Select REST API, look into:

Overview |  Quickstart |  Documentation |  Downloads |  Tutorials

question

Upvotes
Accepted
3 1 1 4

DSS REST API extraction automatically flips the last character of my CUSIP code

I am trying to extract an instrument via REST API using the following request body:

{
    "ExtractionRequest": {
        "@odata.type": "#ThomsonReuters.Dss.Api.Extractions.ExtractionRequests.CompositeExtractionRequest",
        "ContentFieldNames": [
            "Instrument ID Type",
            "Instrument ID",
            "CUSIP",
            "CIN Code",
            "SEDOL",
            "OCC Code",
            "ISIN",
            "Ticker",
            "RIC",
            "Security Description",
            "Currency Code Scaled",
            "Country of Issuance",
            "Domicile",
            "Asset Type",
            "Asset Type Description",
            "Asset SubType",
            "Asset SubType Description",
            "Organizational SubType Code",
            "Organizational SubType Description",
            "Refinitiv Classification Scheme",
            "Refinitiv Classification Scheme Description",
            "Structured Security Flag",
            "Market Capitalization",
            "Issue Date",
            "Maturity Date",
            "Coupon Rate",
            "Next Pay Date",
            "Coupon Frequency",
            "Coupon Frequency Description",
            "Callable Flag",
            "Next Call Date",
            "Next Call Price",
            "Accrual Date",
            "Annualized Dividend Adjusted Gross Amount",
            "Day Count Code Description",
            "Underlying CUSIP",
            "Dividend 1 Ex Date",
            "Dividend 1 Record Date",
            "Exchange Description",
            "Exchange Code",
            "Put Call Flag",
            "Dividend Yield",
            "Trading Status"
        ],
        "IdentifierList": {
            "@odata.type": "#ThomsonReuters.Dss.Api.Extractions.ExtractionRequests.InstrumentIdentifierList",
            "InstrumentIdentifiers": [
                {
                    "Identifier": "99QAUBI8I",
                    "IdentifierType": "Cusip"
                }
            ],
            "ValidationOptions": null,
            "UseUserPreferencesForValidationOptions": true
        }
    }
}

However the response shows me a different CUSIP code:

{
"@odata.context": "https://hosted.datascopeapi.reuters.com/RestApi/v1/$metadata#ThomsonReuters.Dss.Api.Extractions.ExtractionRequests.ExtractionResult",
    "Contents": [
        {
            "IdentifierType": "Cusip",
            "Identifier": "99QAUBI89",
            "Error": "Not found"
        }
    ],
    "Notes": [
        "All identifiers were invalid.  No extraction performed."
    ]
}

The last character in my original CUSIP is "I" but the CUSIP in the response is "9". Any idea why this happens? Thanks!

dss-rest-apidatascope-selectdss
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

@cabissi

Hi,

Thank you for your participation in the forum.

Are any of the replies below satisfactory in resolving your query?

If yes please click the 'Accept' text next to the most appropriate reply. This will guide all community members who have a similar question.

Otherwise please post again offering further insight into your question.

Thanks,

AHS

@cabissi

Hi,

Please be informed that a reply has been verified as correct in answering the question, and has been marked as such.

Thanks,

AHS

Upvotes
Accepted
78.8k 250 52 74

@cabissi

It may relate to settings in the DSS User Preferences.

If I check only Allow Import of Unsupported Instruments into Instrument Lists,it returns:

{
    "@odata.context": "https://hosted.datascopeapi.reuters.com/RestApi/v1/$metadata#ThomsonReuters.Dss.Api.Extractions.ExtractionRequests.ExtractionResult",
    "Contents": [
        {
            "IdentifierType": "Cusip",
            "Identifier": "99QAUBI89",
            "Error": "Not found"
        }
    ],
    "Notes": [
        "All identifiers were invalid.  No extraction performed."
    ]
}

If I check both Allow Import of Unsupported Instruments into Instrument Lists and Allow Import of Historical Instruments,it returns:

{
    "@odata.context": "https://hosted.datascopeapi.reuters.com/RestApi/v1/$metadata#ThomsonReuters.Dss.Api.Extractions.ExtractionRequests.ExtractionResult",
    "Contents": [
        {
            "IdentifierType": "Cusip",
            "Identifier": "99QAUBI8I",
            "Error": "Not found"
        }
    ],
    "Notes": [
        "All identifiers were invalid.  No extraction performed."
    ]
}

Please verify your User Preferences in DSS.


1611886240500.png (146.7 KiB)
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Hi @jirapongse.phuriphanvichai,

<This is a private comment>

Very interesting.

I have both options checked in my preferences.

In Postman I get "correct" invalid instrument in response, but in .Net SDK, still get the invalid instrument in response, same as the client. Is this consistent with what you see?

Thanks

@zoya.farberov

Have you set useUserPreferencesForValidationOptions to True when creating the InstrumentIdentifierList?

IdentifierList = InstrumentIdentifierList.Create(
        new[] { new InstrumentIdentifier { Identifier = "99QAUBI8I", IdentifierType = IdentifierType.Cusip } }, null, true),


You are absolutely correct @jirapongse.phuriphanvichai. I was running the DSS example app composite request as is, only replacing the identifier, i.e. with useUserPreferencesForValidationOptions set to false, which likely is the same that the client is using it.

Upvotes
32.2k 40 11 20

Hello @cabissi,

Does not sound right.

Just tried running the same request, the result for me was:

{
    "@odata.context": "https://hosted.datascopeapi.reuters.com/RestApi/v1/$metadata#ThomsonReuters.Dss.Api.Extractions.ExtractionRequests.ExtractionResult",
    "Contents": [
        {
            "IdentifierType": "Cusip",
            "Identifier": "99QAUBI8I",
            "Error": "Not found"
        }
    ],
    "Notes": [
        "All identifiers were invalid.  No extraction performed."
    ]
}

Could you please re-run the request on your side (would it make sense to submit the "naked" request with Postman, to avoid any inadvertent modification in code, subsequent to the request definition), to try to confirm if this result is consistent?

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
3 1 1 4

Hello,

Just tried again but still getting the same output with the last character of Cusip identifier changed to "9".

I also made up a C# function to test this out, just so taking Postman out of the picture.

public static async Task<bool> ExtractInstrumentData()
        {
            string token = await GetToken();

            try
            {
                // Create list of instrument identifiers
                var instrumentIdentifiers = new List<InstrumentIdentifier>
                {
                    new InstrumentIdentifier { Identifier = "99QAUBI8I", IdentifierType = "Cusip" }
                };

                // Extract instrument data
                var start = DateTime.Now;
                using (var request = new HttpRequestMessage(HttpMethod.Post, baseURL + "Extractions/ExtractWithNotes"))
                {
                    // Identifier list
                    var identifierList = new JObject
                    {
                        {"@odata.type", "#ThomsonReuters.Dss.Api.Extractions.ExtractionRequests.InstrumentIdentifierList" },
                        {"InstrumentIdentifiers", JArray.FromObject(instrumentIdentifiers) },
                        {"UseUserPreferencesForValidationOptions", "true"}
                    };

                    // Content fields
                    var fields = new List<string>
                    {
                        "Instrument ID Type",
                        "Instrument ID",
                        "CUSIP",
                        "CIN Code",
                        "SEDOL",
                        "OCC Code",
                        "ISIN",
                        "Ticker",
                        "RIC",
                        "Security Description",
                        "Trading Status"
                    };

                    // Extraction request
                    var extractionRequest = new JObject
                    {
                        {"@odata.type", "#ThomsonReuters.Dss.Api.Extractions.ExtractionRequests.CompositeExtractionRequest" },
                        {"ContentFieldNames", JArray.FromObject(fields) },
                        {"IdentifierList", identifierList }
                    };

                    var requestBody = new JObject
                    {
                        {"ExtractionRequest", extractionRequest}
                    };

                    request.Content = new StringContent(JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");

                    using (var client = new HttpClient(new HttpClientHandler() { UseCookies = false }))
                    {
                        client.Timeout = new TimeSpan(0, 10, 0);
                        client.DefaultRequestHeaders.Add("Authorization", "Token" + token);

                        using (var response = await client.SendAsync(request))
                        {
                            if (response.IsSuccessStatusCode)
                            {
                                Console.WriteLine($"Time spent on extraction: {(DateTime.Now - start).TotalMilliseconds} Milliseconds");
                                File.WriteAllText(@"C:\Temp\output\extraction_result.json", JObject.Parse(response.Content.ReadAsStringAsync().Result).ToString());
                            }
                            else
                            {
                                Console.WriteLine($"Error loading Refinitiv instrument: {response.Content.ReadAsStringAsync().Result}");
                                return false;
                            }
                        }
                    }
                }

                return true;
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error loading Refinitiv instrument: {ex.Message}");
                return false;
            }
        }

However the output is still the same:

{
  "@odata.context": "https://hosted.datascopeapi.reuters.com/RestApi/v1/$metadata#ThomsonReuters.Dss.Api.Extractions.ExtractionRequests.ExtractionResult",
  "Contents": [
    {
      "IdentifierType": "Cusip",
      "Identifier": "99QAUBI89",
      "Error": "Not found"
    }
  ],
  "Notes": [
    "All identifiers were invalid.  No extraction performed."
  ]
}
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
32.2k 40 11 20

Hello @cabissi,

I am able to reproduce the issue using .Net RESTAPIExample application.

The modification does not happen when a raw request is submitted, such as Postman, it's being introduced by .Net SDK tier.

I have opened investigation case #09575187 on your behalf, you should hear back, from Tick History support, via email, shortly.

In the meantime, as a workaround, in my understanding, you have the option to submit the request as RIC identifier via .Net SDK, or submit it as CUSIP, without the use of .Net SDK.

I hope this helps

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
3 1 1 4

Thanks for the update. However the modification does happen to me within Postman. Could you please clarify how I submit the "naked" request with Postman as you suggested above? Thanks!

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
32.2k 40 11 20

Hello @cabissi,

Is the question still relevant?

Thanks to my colleague @jirapongse.phuriphanvichai, we have a good idea what is happening here.

In addition to verifying DSS preferences per id, as described above, please also make sure, in DSS example app request c# code, to modify the request to absorb user preferences, for example (seen in bold):

 var extractionRequest = new CompositeExtractionRequest
            {                     
            IdentifierList = InstrumentIdentifierList.Create(
                    new[] { new InstrumentIdentifier /* { Identifier = "IBM.N", IdentifierType = IdentifierType.Ric } */            
            { Identifier = "99QAUBI8I", IdentifierType = IdentifierType.Cusip } }, null, true ), //false),
                ContentFieldNames = new[] {
                    "Daily Beta - 180 Days", "Volatility - 30 days", "Market Capitalization", "Average Volume - 30 Days",
                    "Volume", "Total Shares - Listed"}
            };

In my test, if the preferences are correct, and are absorbed by ,Net request, then .Net request results in the same expected RIC result as Postman request.



icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
32.2k 40 11 20

Hello @cabissi and all,

In addition to the answer from @Jirapongse, please find the reference from our DSS product expert:

In Refinitiv DataScope Select GUI User Guide, section "Instrument Validation Methodology", the following relevant explanation, pertaining to the behavior in this case is included:

Check-Digit Conversions:
• Automatic conversions are done for CUSIPs, ISINs, and SEDOLs when the last digit of the identifier is missing or incorrect. In this case, DataScope Select will identify the correct identifier and replace it in the instrument list.
• No updates will be made when importing a valid identifier. In this case, the identifier you specify in your input list will always be imported, regardless of whether other identifier exist

Hope this information is of help

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.