IRN Notes API

  • SECTIONS
  • Overview
  • API Definition
  • API Documentation
  • SDK Libraries
  • FactSet Connectors
  • Code Snippet
  • Changelog
  • Sample Use Case
Overview

IRN API Overview

The FactSet Internal Research Notes (IRN) API enables Application Developers to programmatically manage and process proprietary research contents in FactSet IRN.

Our APIs provide a channel to Contribute and Consume IRN Notes, Meetings, Symbols and Contacts data. The IRN Configuration API also allows you to get your custom IRN configuration details which support your custom workflows.

There are three types of workflows supported with the API:

  1. Business Continuity and Compliance: Retrieve scheduled backups of all RMS data, including text markup and attachments, for business continuity and compliance purposes.
  2. Real Time Research Access: Integrate internal research into additional tools, client portals or proprietary interfaces in a real-time manner.
  3. Single Research Hub / Integration: Leverage the IRN API to allow notes created in parallel systems to integrate with the larger research workflow across FactSet.

Technical Details

The IRN API delivers data in a JSON format, refer to the documentation for more information about the API Contract.

Requests made from Developer’s Portal could be directed to Production Environment https://api.factset.com/research/irn/v1 or Sandbox Environment https://api-sandbox.factset.com/research/irn/v1/ based on your preference and selection as you execute the request in the portal.

Production Environment will point to client's exiting IRN database where you will be able to create and extract research contents directly to and from your IRN system.

Sandbox environment is an empty IRN container available for you to use as a development area when exploring IRN APIs. Initially you will need to use POST requests before GET to have sample data with which to experiment your create and extract research workflows.

API Definition
API Documentation
SDK Libraries
Code Snippet
Work with notes
using FactSet.SDK.IRNNotes.Api;
using FactSet.SDK.IRNNotes.Client;
using FactSet.SDK.IRNNotes.Model;
using System.Net;
using System.Text.Json;

namespace ConsoleApp
{
    class NotesSample
    {
        private static Configuration _irnApiConfiguration;
        private const string BASE_PATH = "https://api-sandbox.factset.com/research/irn";
        private const string USER_NAME = "USERNAME-SERIAL";
        private const string PASSWORD = "2Yxvt0kCw5DulabL1UyAMHEBpWq20YXbPXopZDFa";

        public static void Main()
        {
            var apiConfiguration = GetIrnApiConfiguration();
            var notesApiInstance = new NotesApi(apiConfiguration);
            var startDate = "2019-09-01"; // string | StartDate
            var endDate = "2020-09-30"; // string | EndDate
            var identifiers = new List<string> { "TSLA-US" }; // List | Set of identifiers to filter on (optional)
            var limit = 10; // int? | Limit on the number of notes retrieved (optional)
            var includeDeletedNotes = false; // bool? | Include notes that have been (soft) deleted in the results

            var serializerOptions = new JsonSerializerOptions
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
                WriteIndented = true
            };

            try
            {
                Guid newNoteId = Guid.Empty;

                UserSerialDto author = new UserSerialDto("AUTHOR_USERNAME", "AUTHOR_SERIAL");

                //Create a new note
                ApiResponse<NewItemDto> createNoteResponse = notesApiInstance.CreateNoteWithHttpInfo(createNoteDto: new CreateNoteDto(author, "This is a test note created through the API", "TSLA-US", "2020-09-19"));

                if (createNoteResponse.StatusCode == HttpStatusCode.Created)
                {
                    newNoteId = createNoteResponse.Data.Id;

                    Console.WriteLine($"New note {newNoteId} created");

                    //Fetch the new note
                    NoteDto newNote = notesApiInstance.GetNote(newNoteId);
                    Console.WriteLine(JsonSerializer.Serialize(newNote, serializerOptions));
                }

                //Add an attachment to the new note
                var attachmentsApiInstance = new AttachmentsApi(apiConfiguration);
                ApiResponse<NewItemDto> createAttachmentResponse = attachmentsApiInstance.CreateAttachmentWithHttpInfo(newNoteId, File.OpenRead("SampleFile.pdf"));
                Guid newAttachmentId = createAttachmentResponse.Data.Id;
                Console.WriteLine($"New attachment {newAttachmentId} added to note {newNoteId}");

                //Fetch note summaries
                List<NoteSummaryDto> noteSummaries = notesApiInstance.GetNotes(startDate, endDate, identifiers, null, null, null, null, limit, null, null, null, false, includeDeletedNotes);
                Console.WriteLine(JsonSerializer.Serialize(noteSummaries, serializerOptions));

                Console.WriteLine($"Number of notes listed above: {noteSummaries.Count}");

                //Download the attachment created earlier
                ApiResponse<object> response = attachmentsApiInstance.DownloadAttachmentWithHttpInfo(newNoteId, newAttachmentId);
                File.WriteAllText("SampleFile.pdf", response.RawContent);
            }
            catch (ApiException e)
            {
                Console.WriteLine("Exception when calling Notes API: " + e.Message);
                Console.WriteLine("Status Code: " + e.ErrorCode);
                Console.WriteLine(e.StackTrace);
            }
        }

        private static Configuration GetIrnApiConfiguration()
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            if (_irnApiConfiguration != null)
            {
                return _irnApiConfiguration;
            }

            _irnApiConfiguration = new Configuration
            {
                BasePath = BASE_PATH,
                Username = USER_NAME,
                Password = PASSWORD,

            };

            return _irnApiConfiguration;
        }
    }
}
Work with identifiers
using FactSet.InternalResearchNotes.Api.Symbols.Api;
using FactSet.InternalResearchNotes.Api.Symbols.Client;
using FactSet.InternalResearchNotes.Api.Symbols.Model;
using System;
using System.Collections.Generic;
using System.Net;
using System.Text.Json;
using System.Linq;

namespace ConsoleApp
{
    class SymbolsSample
    {
        private static Configuration _irnApiConfiguration;
        private const string BASE_PATH = "https://api-sandbox.factset.com/research/irn";
        private const string USER_NAME = "USERNAME-SERIAL";
        private const string PASSWORD = "dvjrVB8JuAH53vlXkWTNkXJvdr81LITNVJ6TNlJx";

        public static void Main()
        {
            var apiInstance = new IdentifiersApi(GetIrnApiConfiguration());

            var serializerOptions = new JsonSerializerOptions
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
                WriteIndented = true
            };

            try
            {
                ApiResponse<List<IdentifierResolutionDto>> response = apiInstance.GetIdentifiersWithHttpInfo("FDS-US");

                if (response.StatusCode == HttpStatusCode.OK)
                {
                    var resolvedInstrument = response.Data.First(x => x.Query.Equals("FDS-US"));
                    var entityId = resolvedInstrument.InstrumentMetadata.EntityId;
                    var instrumentName = resolvedInstrument.InstrumentMetadata.Name;

                    Console.WriteLine($"{instrumentName} - {entityId}");
                    Console.WriteLine(JsonSerializer.Serialize(resolvedInstrument, serializerOptions));
                };

               
            }
            catch (ApiException e)
            {
                Console.WriteLine("Exception when calling Notes API: " + e.Message);
                Console.WriteLine("Status Code: " + e.ErrorCode);
                Console.WriteLine(e.StackTrace);
            }
        }

        private static Configuration GetIrnApiConfiguration()
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            if (_irnApiConfiguration != null)
            {
                return _irnApiConfiguration;
            }

            _irnApiConfiguration = new Configuration
            {
                BasePath = BASE_PATH,
                Username = USER_NAME,
                Password = PASSWORD,

            };

            return _irnApiConfiguration;
        }
    }
}
Changelog

v1

Summary

V1.0 Released on 12 Sep 2019

Functionality Additions

  • Get Notes

Changes

No Changes

Bug Fixes

No Fixes

v1.1

Summary

V1.1 Released on 30 November 2019

Functionality Additions

  • Create Notes
  • Get Note
  • Delete Note
  • Get Attachments
  • Get Attachment
  • Get Events

Changes

  • Get Notes accepts "modifiedSince"

Bug Fixes

  • No Fixes

v1.2

Summary

V1.2 Released on 8 February 2020

Functionality Additions

  • Edit Note
  • Add Attachment
  • Delete Attachment
  • Get Event

Changes

  • Ability to include deleted records and filter by modifiedSince in GetNotes
  • Support for Related Records & Related Contacts in GetNotes , GetNote

Bug Fixes

  • No Fixes

v1.3

Summary

V1.3 Released on 29th October 2020

Functionality Additions

  • Improved attachment upload functionality

Changes

No Changes

Bug Fixes

No Fixes

v1.4

Summary

V1.4 Released on 7th November 2020

Functionality Additions

  • Get Comments
  • Get Comment
  • Create Comment
  • Edit Comment
  • Delete Comment
  • Get Comment Attachment
  • Create Comment Attachment
  • Download Comment Attachment

Changes

  • No Changes

Bug Fixes

  • No Fixes

v1.5

Summary

Updated on 29 March 2022

Functionality Additions

  • AllEvents endpoint

Changes

  • Enhanced Identifiers endpoint to include symbol type

Bug Fixes

  • No Fixes
Sample Use Case

Use Case – Retrieve IRN Contents for Business Continuity:

BCP flow

Use Case - Save Proprietary Research in IRN for Seamless Collaboration and Integration  Create Note