IRN Meetings API

  • SECTIONS
  • Overview
  • API Definition
  • API Documentation
  • SDK Libraries
  • Code Snippet
  • Changelog
Overview

IRN Meetings 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 meetings
using FactSet.SDK.IRNMeetings.Api;
using FactSet.SDK.IRNMeetings.Client;
using FactSet.SDK.IRNMeetings.Model;
using System.Net;
using System.Text.Json;

namespace ConsoleApp
{
    class MeetingsSample
    {
        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 apiConfiguration = GetIrnApiConfiguration();
            var apiInstance = new MeetingsApi(apiConfiguration);
            var startDate = "2019-09-01T08:00:00Z"; // string | StartDate
            var endDate = "2020-09-30T12:00:00Z"; // 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 includeDeletedMeetings = false; // bool? | Include notes that have been (soft) deleted in the results

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

            try
            {
                Guid newMeetingId = Guid.Empty;

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

                //Create a new meeting
                ApiResponse<NewItemDto> createMeetingResponse = apiInstance.CreateMeetingWithHttpInfo(new CreateMeetingDto(author, "This is a test note created through the API", "TSLA-US", "2020-09-19T08:00:00Z", "2020-09-19T09:00:00Z"));

                if (createMeetingResponse.StatusCode == HttpStatusCode.Created)
                {
                    newMeetingId = createMeetingResponse.Data.Id;

                    Console.WriteLine($"New meeting {newMeetingId} created");

                    //Fetch the new meeting
                    MeetingDto newNote = apiInstance.GetMeeting(newMeetingId);
                    Console.WriteLine(JsonSerializer.Serialize(newNote, serializerOptions));
                };

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

                //Fetch meeting summaries
                List<MeetingSummaryDto> meetingSummaries = apiInstance.GetMeetings(startDate, endDate, identifiers, limit, null, includeDeletedMeetings);
                Console.WriteLine(JsonSerializer.Serialize(meetingSummaries, serializerOptions));

                Console.WriteLine($"Number of meetings: {meetingSummaries.Count}");

                //Download the attachment created earlier
                ApiResponse<object> downloadAttachmentResponse = attachmentsApiInstance.DownloadAttachmentWithHttpInfo(newMeetingId, newAttachmentId);
                File.WriteAllText("SampleFile.pdf", downloadAttachmentResponse.RawContent);
            }
            catch (ApiException e)
            {
                Console.WriteLine("Exception when calling Meetings 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 6 Sep 2019

Functionality Additions

  • Create a Meeting
  • Add an attachment to an existing Meeting

Changes

  • No changes

Bug Fixes

  • No fixes

v1.1

Summary

v1.1 Released on 12 September 2019

Functionality Additions

  • Delete Meeting

Changes

  • Create Meeting accepts multiple locations

Bug Fixes

  • No Fixes

v1.2

Summary

v1.2 Released on 30 November 2019

Functionality Additions

  • Edit Meeting
  • Get attachment tagged to a Meeting
  • Delete attachment tagged to a Meeting

Changes

  • No Changes

Bug Fixes

  • No Fixes

v1.3

Summary

v1.3 Released on 8 February 2020

Functionality Additions

  • Get Meetings
  • Get Meeting
  • Get Attachments
  • Delete Attachment
  • Get Events
  • Get Event

Changes

  • Edit Meetings supports Related records and Related Contacts

Bug Fixes

  • No fixes

v1.4

Summary

V1.4 Released on 29th October 2020

Functionality Additions

  • Improved attachment upload functionality
  • Download Attachment
  • 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