developers.refinitiv.com Open in urlscan Pro
2600:9000:2140:2200:19:f220:7800:93a1  Public Scan

Submitted URL: https://app.communications.lseg.com/e/er?utm_source=eloqua&utm_medium=email&utm_campaign=740308_enterprisecustomernewsletter&utm_con...
Effective URL: https://developers.refinitiv.com/en/article-catalog/article/contributing-your-data-refinitiv-elektron-websocket-api-refinitiv?utm...
Submission: On March 14 via api from SG — Scanned from CA

Form analysis 3 forms found in the DOM

<form id="ftlContainer" data-form-reason="developer portal submit ftl details" novalidate="novalidate">
  <div class="tr-Grid tr-Grid--even2">
    <div class="tr-Grid-items">
      <div class="tr-Grid-item">
        <style>
          .hidden {
            display: none;
          }
        </style>
        <div class="tr-VerticalSpacing tr-VerticalSpacing--m" id="screenNameWrapper">
          <div class="tr-VerticalSpacing tr-VerticalSpacing--m">
            <div class="tr-FormTextControl">
              <label class="tr-FormTextControl-label" for="screenName">
                <span class="tr-FormTextControl-labelText">Screen name</span>
                <input class="tr-FormTextControl-input" title="" id="screenName" name="screenName" type="text" placeholder="E.g - Jack" autocomplete="off">
              </label>
              <span id="screenNameerrortext" class="hidden" style="color:red;"></span>
            </div>
          </div>
        </div>
        <script>
        </script>
        <style>
          .hidden {
            display: none;
          }
        </style>
        <div class="tr-VerticalSpacing tr-VerticalSpacing--m" id="companyNameWrapper">
          <div class="tr-VerticalSpacing tr-VerticalSpacing--m">
            <div class="tr-FormTextControl">
              <label class="tr-FormTextControl-label" for="companyName">
                <span class="tr-FormTextControl-labelText">Company name</span>
                <input class="tr-FormTextControl-input" title="" id="companyName" name="companyName" type="text" placeholder="E.g - Refinitiv" autocomplete="off">
              </label>
              <span id="companyNameerrortext" class="hidden" style="color:red;"></span>
            </div>
          </div>
        </div>
        <script>
        </script>
        <style>
          .hidden {
            display: none;
          }
        </style>
        <div class="tr-VerticalSpacing tr-VerticalSpacing--m" id="spokenLangWrapper">
          <div class="tr-VerticalSpacing tr-VerticalSpacing--m">
            <div class="tr-FormTextControl">
              <label class="tr-FormTextControl-label" for="spokenLang">
                <span class="tr-FormTextControl-labelText">Spoken language(s) (Optional)</span>
                <input class="tr-FormTextControl-input" title="" id="spokenLang" name="spokenLang" type="text" placeholder="Separate multiple values with commas" autocomplete="off">
              </label>
              <span id="spokenLangerrortext" class="hidden" style="color:red;"></span>
            </div>
          </div>
        </div>
        <script>
        </script>
        <style>
          .hidden {
            display: none;
          }
        </style>
        <div class="tr-VerticalSpacing tr-VerticalSpacing--m" id="progLangWrapper">
          <div class="tr-VerticalSpacing tr-VerticalSpacing--m">
            <div class="tr-FormTextControl">
              <label class="tr-FormTextControl-label" for="progLang">
                <span class="tr-FormTextControl-labelText">Programming language(s) (Optional)</span>
                <input class="tr-FormTextControl-input" title="" id="progLang" name="progLang" type="text" placeholder="Separate multiple values with commas" autocomplete="off">
              </label>
              <span id="progLangerrortext" class="hidden" style="color:red;"></span>
            </div>
          </div>
        </div>
        <script>
        </script>
        <div class="tr-VerticalSpacing tr-VerticalSpacing--m" id="checkbox1Label">
          <div class="tr-VerticalSpacing tr-VerticalSpacing--m">
            <div class="tr-FormTextControl tr-new-checkbox">
              <label class="tr-FormTextControl-label" for="check1">
                <input type="checkbox" id="check1" name="check1">
                <span class="ui-checkbox__bg"></span>
                <span>Share my full name, country and languages with other developers <a target="_blank"></a>
                </span>
              </label>
              <label id="check1-error" class="error" for="check1"></label>
            </div>
          </div>
        </div>
        <div class="tr-VerticalSpacing tr-VerticalSpacing--m" id="checkbox2Label">
          <div class="tr-VerticalSpacing tr-VerticalSpacing--m">
            <div class="tr-FormTextControl tr-new-checkbox">
              <label class="tr-FormTextControl-label" for="check2">
                <input type="checkbox" id="check2" name="check2">
                <span class="ui-checkbox__bg"></span>
                <span>Share the company I work for and my email address with other developers <a target="_blank"></a>
                </span>
              </label>
              <label id="check2-error" class="error" for="check2"></label>
            </div>
          </div>
        </div>
        <div class="tr-VerticalSpacing tr-VerticalSpacing--m" id="checkbox3Label">
          <div class="tr-VerticalSpacing tr-VerticalSpacing--m">
            <div class="tr-FormTextControl tr-new-checkbox">
              <label class="tr-FormTextControl-label" for="check3">
                <input type="checkbox" id="check3" name="check3">
                <span class="ui-checkbox__bg"></span>
                <span>I agree to <a href="/en/terms-of-use" target="_blank"> terms &amp; conditions</a>
                  <h>
                    <h> and </h><a href="https://www.refinitiv.com/en/policies/privacy-statement" target="_blank">privacy policy</a>
                  </h>
                </span>
              </label>
              <label id="check3-error" class="error" for="check3"></label>
            </div>
          </div>
        </div>
        <div class="tr-VerticalSpacing tr-VerticalSpacing--m" id="checkbox4Label">
          <div class="tr-VerticalSpacing tr-VerticalSpacing--m">
            <div class="tr-FormTextControl tr-new-checkbox">
              <label class="tr-FormTextControl-label" for="check4">
                <input type="checkbox" id="check4" name="check4">
                <span class="ui-checkbox__bg"></span>
                <span>Send me communications about Financial &amp; Risk resources, including products or services. <a href="/en/testpagetermandcondition" target="_blank"></a>
                </span>
              </label>
              <label id="check4-error" class="error" for="check4"></label>
            </div>
          </div>
        </div>
        <div class="tr-VerticalSpacing tr-VerticalSpacing--m">
          <div class="tr-Grid tr-Grid--even2">
            <div class="tr-Grid-items">
              <div class="tr-Grid-item sr-backButtonArea">
                <a class="tr-Anchor tr-Link tr-Link--iconLeft tr-Link--withIcon tr-Link--inline tr-Hidden">
                    <span class="tr-Link-icon">
                      <span class="tr-Svg">
                        <span class="tr-Svg-inner">
                          <svg aria-hidden="true" viewBox="0 0 24 24">
                            <g class="nc-icon-wrapper" fill="none" stroke="currentColor" stroke-width="2">
                              <path d="M22 12H2"></path>
                              <path d="M9 19l-7-7 7-7" stroke-linecap="square"></path>
                            </g>
                          </svg>
                        </span>
                      </span>
                    </span>
                    <span class="tr-Link-inner">Back</span>
                </a>
              </div>
              <div class="tr-Grid-item ">
                <button id="submitBtn" class="tr-Anchor tr-Button tr-Button--primary" type="submit">
                  <span class="tr-Button-body">Complete profile</span>
                </button>
              </div>
            </div>
          </div>
        </div>
        <input type="hidden" value="00018RA_DeveloperPortal_Inbound" name="elqFormName">
        <input type="hidden" value="530566577" name="elqSiteId">
        <input type="hidden" value="1111" name="elqCampaignId">
        <input type="hidden">
        <input type="hidden" value="0" name="hiddenField">
        <input type="hidden" value="LeadSourceMostRecent" name="LeadSource-MostRecent">
        <input type="hidden" value="secondaryleadsource" name="secondary_lead_source">
        <input type="hidden" value="DetailleadSourcedetailmostrecent" name="Detail-LeadSourceDetail-MostRecent">
        <input type="hidden" value="utm_campaign" name="utm_campaign">
        <input type="hidden" value="utm_source" name="utm_source">
        <input type="hidden" value="utm_medium" name="utm_medium">
        <input type="hidden" value="utm_content" name="utm_content">
        <input type="hidden">
        <input type="hidden" value="utm_term" name="utm_term">
        <input type="hidden" value="source_URL" name="source_URL">
        <input type="hidden" value="hiddenCampaignId" name="hiddenCampaignId">
      </div>
      <div class="tr-Grid-item">
      </div>
    </div>
  </div>
  <div>
    <style>
      .hidden {
        display: none;
      }
    </style>
    <p class="hidden" id="constraintsAsString">{"messages":{"companyName":{"trengtext":"Please enter the company name in correct format","required":"Please enter the company name"},"screenName":{"answerHubScreenName":"Please enter the name in correct
      format","required":"Please enter your screen name "}},"rules":{"companyName":{"trengtext":true,"required":true},"screenName":{"answerHubScreenName":true,"required":true}}}</p>
    <script>
      var country;
      $.validator.addMethod('trtext', function(value, element) {
        return this.optional(element) || value.match(new RegExp('^[A-Za-z]+$'));
      }, 'only Strings are allowed');
      $.validator.addMethod('tremail', function(value, element) {
        return this.optional(element) || value.match(new RegExp('[a-zA-Z0-9_.-\.]+@[a-zA-Z0-9\-\_\.]+\.[a-zA-Z0-9]{2,4}$'));
      }, 'Please specify the correct domain for your documents');
      $.validator.addMethod('accountno', function(value, element) {
        return this.optional(element) || value.match(new RegExp('[A](-)([0-9]{8})$'));
      }, 'Please enter 8 digit customer number (A-xxxxxxxx)');
      $.validator.addMethod('requestId', function(value, element) {
        return this.optional(element) || value.match(new RegExp('^$|^[0][0-9]{7}$'));
      }, 'Please enter correct requestId');
      $.validator.addMethod('trinternaluser', function(value, element) {
        return this.optional(element) || value.match(new RegExp('[a-zA-Z0-9_.-\.]+@(?!thomson.com|reuters.com|thomsonreuters.com|refinitiv.com|tr.com)[a-zA-Z0-9\-\_\.]+\.[a-zA-Z0-9]{2,4}$'));
      }, 'Please enter a valid customer email address');
      $.validator.addMethod('trphone', function(value, element) {
        return this.optional(element) || value.match(new RegExp('(^\\+)((\\s*[0-9]\\s*){8,})(\\s*(x|X?)\\s*)((\\s*[0-9]\\s*)*\\d$)$'));
      }, 'Please enter correct phone number');
      $.validator.addMethod('phone', function(value, element) {
        return this.optional(element) || value.match(new RegExp('(^\\+)((\\s*[()-]?[0-9]\\s*[()-]?){9,20})$'));
      }, 'Please enter correct phone number');
      $.validator.addMethod('trengtext', function(value, element) {
        return this.optional(element) || value.match(new RegExp('^[a-zA-Z0-9-@#$%^&amp; *!_s]*$'));
      }, 'Chinize characters are not allowed');
      $.validator.addMethod('trregtext', function(value, element) {
        return this.optional(element) || value.match(new RegExp('^[a-zA-Z0-9-., \']*$'));
      }, 'Only alphabets numbers or characters');
      $.validator.addMethod('reftextarea', function(value, element) {
        return this.optional(element) || value.match(new RegExp('[a-zA-Z0-9][\\sa-zA-Z0-9]'));
      }, 'Spaces not allowed');
      $.validator.addMethod('marketingemail', function(value, element) {
        return this.optional(element) || value.match(new RegExp('^[+a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$'));
      }, 'Please specify the correct domain for your documents');
      $.validator.addMethod('answerHubScreenName', function(value, element) {
        return this.optional(element) || value.match(new RegExp('^[\\w\\.\\-\\@\\+\\s]+$'));
      }, 'Please enter the name in correct format');
      $(document).ready(function() {});
    </script>
  </div>
</form>

<form id="Feedback-Modal" novalidate="novalidate">
  <h1>Feedback</h1>
  <style>
    .hidden {
      display: none;
    }
  </style>
  <div class="tr-VerticalSpacing tr-VerticalSpacing--m" id="feedbackfirstnameWrapper">
    <div class="tr-VerticalSpacing tr-VerticalSpacing--m">
      <div class="tr-FormTextControl">
        <label class="tr-FormTextControl-label" for="feedbackfirstname">
          <span class="tr-FormTextControl-labelText">First name</span>
          <input class="tr-FormTextControl-input" title="" id="feedbackfirstname" name="feedbackfirstname" type="text" autocomplete="off">
        </label>
        <span id="feedbackfirstnameerrortext" class="hidden" style="color:red;"></span>
      </div>
    </div>
  </div>
  <script>
  </script>
  <style>
    .hidden {
      display: none;
    }
  </style>
  <div class="tr-VerticalSpacing tr-VerticalSpacing--m" id="feedbacklastnameWrapper">
    <div class="tr-VerticalSpacing tr-VerticalSpacing--m">
      <div class="tr-FormTextControl">
        <label class="tr-FormTextControl-label" for="feedbacklastname">
          <span class="tr-FormTextControl-labelText">Last name</span>
          <input class="tr-FormTextControl-input" title="" id="feedbacklastname" name="feedbacklastname" type="text" autocomplete="off">
        </label>
        <span id="feedbacklastnameerrortext" class="hidden" style="color:red;"></span>
      </div>
    </div>
  </div>
  <script>
  </script>
  <style>
    .hidden {
      display: none;
    }
  </style>
  <div class="tr-VerticalSpacing tr-VerticalSpacing--m" id="feedbackemailWrapper">
    <div class="tr-VerticalSpacing tr-VerticalSpacing--m">
      <div class="tr-FormTextControl">
        <label class="tr-FormTextControl-label" for="feedbackemail">
          <span class="tr-FormTextControl-labelText">Email address</span>
          <input class="tr-FormTextControl-input" title="" id="feedbackemail" name="feedbackemail" type="email" autocomplete="off">
        </label>
        <span id="feedbackemailerrortext" class="hidden" style="color:red;"></span>
      </div>
    </div>
  </div>
  <script>
  </script>
  <div class="tr-VerticalSpacing tr-VerticalSpacing--m " id="feedbacktypeWrapper">
    <div class="tr-FormSelectControl">
      <label class="tr-FormSelectControl-label sr-FormSelectControl--labelWithIcon" for="feedbacktype">
        <span class="tr-FormSelectControl-labelText">
          <span>Feedback type</span>
        </span>
        <span class="tr-FormSelectControl-input">
          <select id="feedbacktype" class="tr-FormSelectControl-select" name="feedbacktype">
            <option value="generalFeedback" class="tr-FormSelectControl-option">General Feedback About This Site</option>
            <option value="reportProblem" class="tr-FormSelectControl-option">Report a Problem With This Site</option>
          </select>
          <span class="tr-FormSelectControl-arrow">
            <span class="tr-Svg" style="width: 1.5rem">
              <span class="tr-Svg-inner">
                <svg aria-hidden="true" viewBox="0 0 24 24">
                  <path d="M16 10l-4 4-4-4" fill="none" stroke="currentColor" stroke-linecap="square" stroke-width="2"></path>
                </svg>
              </span>
            </span>
          </span>
        </span>
      </label>
      <label id="feedbacktype-error" class="error" for="feedbacktype"></label>
    </div>
  </div>
  <script>
    var reqField = "";
    var fieldId = "feedbacktype";
    if (reqField) {
      $('#' + fieldId).prop('required', true);
    }
  </script>
  <div class="tr-VerticalSpacing tr-VerticalSpacing--m " id="problemtypeWrapper">
    <div class="tr-FormSelectControl">
      <label class="tr-FormSelectControl-label sr-FormSelectControl--labelWithIcon" for="problemtype">
        <span class="tr-FormSelectControl-labelText">
          <span>Problem Type</span>
        </span>
        <span class="tr-FormSelectControl-input">
          <select id="problemtype" class="tr-FormSelectControl-select" name="problemtype">
            <option value="brokenlink" class="tr-FormSelectControl-option">Broken Link</option>
            <option value="imagesnotdisplaying" class="tr-FormSelectControl-option">Images not displaying</option>
            <option value="pagesnotdisplaying" class="tr-FormSelectControl-option">Pages not displaying</option>
            <option value="other" class="tr-FormSelectControl-option">Other</option>
          </select>
          <span class="tr-FormSelectControl-arrow">
            <span class="tr-Svg" style="width: 1.5rem">
              <span class="tr-Svg-inner">
                <svg aria-hidden="true" viewBox="0 0 24 24">
                  <path d="M16 10l-4 4-4-4" fill="none" stroke="currentColor" stroke-linecap="square" stroke-width="2"></path>
                </svg>
              </span>
            </span>
          </span>
        </span>
      </label>
      <label id="problemtype-error" class="error" for="problemtype"></label>
    </div>
  </div>
  <script>
    var reqField = "";
    var fieldId = "problemtype";
    if (reqField) {
      $('#' + fieldId).prop('required', true);
    }
  </script>
  <style>
    .hidden {
      display: none;
    }
  </style>
  <div class="tr-VerticalSpacing tr-VerticalSpacing--m" id="feedbackSubjectWrapper">
    <div class="tr-VerticalSpacing tr-VerticalSpacing--m">
      <div class="tr-FormTextControl">
        <label class="tr-FormTextControl-label" for="feedbackSubject">
          <span class="tr-FormTextControl-labelText">Subject</span>
          <input class="tr-FormTextControl-input" title="" id="feedbackSubject" name="feedbackSubject" type="text" autocomplete="off">
        </label>
        <span id="feedbackSubjecterrortext" class="hidden" style="color:red;"></span>
      </div>
    </div>
  </div>
  <script>
  </script>
  <style>
    .hidden {
      display: none;
    }
  </style>
  <div class="tr-VerticalSpacing tr-VerticalSpacing--m" id="messageWrapper">
    <div class="tr-VerticalSpacing tr-VerticalSpacing--m">
      <div class="tr-FormTextareaControl">
        <label class="tr-FormTextareaControl-label" for="message">
          <span class="tr-FormTextareaControl-labelText">Message</span>
          <textarea class="tr-FormTextareaControl-input" title="" id="message" name="message" autocomplete="off"></textarea>
        </label>
        <span id="messageerrortext" class="hidden" style="color:red;"></span>
      </div>
    </div>
  </div>
  <script>
  </script>
  <p>Attach files to upload</p>
  <div>
    <div class="confdiv" id="feedbackattachment">
      <div class="attachment-box">
        <input type="file" class="uploadFile" name="feedbackattachment" id="-file-feedbackattachment" onchange="viewAttachment(this)">
        <div>
          <p class="m pull-left mild-bold file-details">Attachments <span class="file-detail"> (10 MB limit) </span>
          </p>
        </div>
        <div>
          <p class="tr-Link--icon tr-Link--primary m pull-right mild-bold file-details file_upload" id="addAttachment">
            <span class="tr-Link-inner ">Attach file</span>
            <span class="tr-Link-icon">
              <span class="tr-Svg">
                <span class="tr-Svg-inner">
                  <svg viewBox="0 0 64 64">
                    <path d="M48 16v28c0 8.8-7.2 16-16 16s-16-7.2-16-16V15c0-6.1 4.9-11 11-11s11 4.9 11 11v27c0 3.3-2.7 6-6 6s-6-2.7-6-6V16" fill="none" stroke="#4d4d4d" stroke-linecap="round" stroke-width="4"></path>
                  </svg>
                </span>
              </span>
            </span>
          </p>
        </div>
        <div id="feedbackattachment-feed__attachments-list" class="col-lg-12 col-md-12 col-sm-12 col-xs-12 feed__attachments-list"></div>
      </div>
      <input type="hidden" id="attachmentId" name="attachmentArr" value="">
      <input type="hidden" id="attachArr" name="attachArr" value="">
      <input type="hidden" id="fileArr" name="fileArr" value="">
      <label class="error" for="-file-feedbackattachment"></label>
    </div>
  </div>
  <div class="tr-VerticalSpacing tr-VerticalSpacing--m">
    <div class="tr-Grid tr-Grid--even2">
      <div class="tr-Grid-items">
        <div class="tr-Grid-item sr-backButtonArea">
          <a class="tr-Anchor tr-Link tr-Link--iconLeft tr-Link--withIcon tr-Link--inline tr-Hidden">
                    <span class="tr-Link-icon">
                      <span class="tr-Svg">
                        <span class="tr-Svg-inner">
                          <svg aria-hidden="true" viewBox="0 0 24 24">
                            <g class="nc-icon-wrapper" fill="none" stroke="currentColor" stroke-width="2">
                              <path d="M22 12H2"></path>
                              <path d="M9 19l-7-7 7-7" stroke-linecap="square"></path>
                            </g>
                          </svg>
                        </span>
                      </span>
                    </span>
                    <span class="tr-Link-inner">Back</span>
                </a>
        </div>
        <div class="tr-Grid-item ">
          <button id="feedbackSubmitButton" class="tr-Anchor tr-Button tr-Button--primary" type="submit">
            <span class="tr-Button-body">Submit</span>
          </button>
        </div>
      </div>
    </div>
  </div>
  <div>
    <style>
      .hidden {
        display: none;
      }
    </style>
    <p class="hidden" id="constraintsAsString">{"messages":{"feedbacklastname":{"required":"Please enter last name"},"feedbackfirstname":{"required":"Please enter first name"},"problemtype":{"required":"Please select problem
      type"},"feedbackemail":{"tremail":"Please enter email correctly","required":"Please enter email"},"message":{"required":"Please enter message"},"feedbackSubject":{"required":"Please enter subject"},"feedbacktype":{"required":"Please select
      feedback
      type"}},"rules":{"feedbacklastname":{"required":true},"feedbackfirstname":{"required":true},"problemtype":{"required":true},"feedbackemail":{"tremail":true,"required":true},"message":{"required":true},"feedbackSubject":{"required":true},"feedbacktype":{"required":true}}}
    </p>
    <script>
      var country;
      $.validator.addMethod('trtext', function(value, element) {
        return this.optional(element) || value.match(new RegExp('^[A-Za-z]+$'));
      }, 'only Strings are allowed');
      $.validator.addMethod('tremail', function(value, element) {
        return this.optional(element) || value.match(new RegExp('[a-zA-Z0-9_.-\.]+@[a-zA-Z0-9\-\_\.]+\.[a-zA-Z0-9]{2,4}$'));
      }, 'Please specify the correct domain for your documents');
      $.validator.addMethod('accountno', function(value, element) {
        return this.optional(element) || value.match(new RegExp('[A](-)([0-9]{8})$'));
      }, 'Please enter 8 digit customer number (A-xxxxxxxx)');
      $.validator.addMethod('requestId', function(value, element) {
        return this.optional(element) || value.match(new RegExp('^$|^[0][0-9]{7}$'));
      }, 'Please enter correct requestId');
      $.validator.addMethod('trinternaluser', function(value, element) {
        return this.optional(element) || value.match(new RegExp('[a-zA-Z0-9_.-\.]+@(?!thomson.com|reuters.com|thomsonreuters.com|refinitiv.com|tr.com)[a-zA-Z0-9\-\_\.]+\.[a-zA-Z0-9]{2,4}$'));
      }, 'Please enter a valid customer email address');
      $.validator.addMethod('trphone', function(value, element) {
        return this.optional(element) || value.match(new RegExp('(^\\+)((\\s*[0-9]\\s*){8,})(\\s*(x|X?)\\s*)((\\s*[0-9]\\s*)*\\d$)$'));
      }, 'Please enter correct phone number');
      $.validator.addMethod('phone', function(value, element) {
        return this.optional(element) || value.match(new RegExp('(^\\+)((\\s*[()-]?[0-9]\\s*[()-]?){9,20})$'));
      }, 'Please enter correct phone number');
      $.validator.addMethod('trengtext', function(value, element) {
        return this.optional(element) || value.match(new RegExp('^[a-zA-Z0-9-@#$%^&amp; *!_s]*$'));
      }, 'Chinize characters are not allowed');
      $.validator.addMethod('trregtext', function(value, element) {
        return this.optional(element) || value.match(new RegExp('^[a-zA-Z0-9-., \']*$'));
      }, 'Only alphabets numbers or characters');
      $.validator.addMethod('reftextarea', function(value, element) {
        return this.optional(element) || value.match(new RegExp('[a-zA-Z0-9][\\sa-zA-Z0-9]'));
      }, 'Spaces not allowed');
      $.validator.addMethod('marketingemail', function(value, element) {
        return this.optional(element) || value.match(new RegExp('^[+a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$'));
      }, 'Please specify the correct domain for your documents');
      $.validator.addMethod('answerHubScreenName', function(value, element) {
        return this.optional(element) || value.match(new RegExp('^[\\w\\.\\-\\@\\+\\s]+$'));
      }, 'Please enter the name in correct format');
      $(document).ready(function() {});
    </script>
  </div>
</form>

GET https://developers.refinitiv.com/en/search-results

<form class="tr-SiteFooter-search" action="https://developers.refinitiv.com/en/search-results" method="get" role="search">
  <div class="tr-SiteFooter-searchInner">
    <div class="tr-SearchInput tr-SearchInput--dark" data-auto-focus="false" data-color-theme="&quot;dark&quot;" data-name="&quot;q&quot;" data-placeholder="&quot;Search&quot;" data-rehydratable="tr-SearchInput" data-typeahead="true"
      data-typeahead-url="&quot;https://lseg-production.ent.eu-west-2.aws.cloud.es.io/api/as/v1/engines/devportal-en-prod/query_suggestion?&quot;" data-elastic-key="Bearer search-j7qr422s9s61csioo1r85rgx" data-value="&quot;&quot;" tabindex="-1">
      <label class="tr-SearchInput-label u-hiddenVisually" for="searchInput-1">Search</label>
      <div class="tr-SearchInput-box"><input class="tr-SearchInput-input" autocomplete="off" placeholder="Search" id="searchInput-1" type="search" name="q" aria-haspopup="true" aria-owns="searchInput-1-typeahead" aria-expanded="false"
          aria-autocomplete="both" aria-label="Search" role="combobox" aria-activedescendant="" value="">
        <div class="tr-SearchInput-buttons"><button aria-label="Clear search" class="tr-SearchInput-clearButton" type="button">
            <div class="tr-SearchInput-icon"><svg class="tr-Icon tr-Icon--xs" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" xmlns:xlink="http://www.w3.org/1999/xlink">
                <path fill=""
                  d="M27.5861028,3.00085283 L28.9982943,4.41304438 L17.414,15.997 L29.0032453,27.5861028 L27.5890317,29.0003163 L16,17.411 L4.41219155,28.9991472 L3,27.5869556 L14.587,15.999 L3.00292893,4.41421356 L4.41714249,3 L16.002,14.585 L27.5861028,3.00085283 Z">
                </path>
              </svg></div>
          </button><button aria-label="Submit search" class="tr-SearchInput-searchButton" type="submit">
            <div class="tr-SearchInput-icon"><svg class="tr-Icon tr-Icon--xs" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" xmlns:xlink="http://www.w3.org/1999/xlink">
                <path fill=""
                  d="M13.9585481,2 C20.5630719,2 25.9170963,7.35402437 25.9170963,13.9585481 C25.9170963,16.8301187 24.7686012,19.6049993 23.0816215,21.6664982 L29.8994949,28.4852814 L28.4852814,29.8994949 L21.6640371,23.0753342 C19.6025381,24.7623139 16.8301187,25.9170963 13.9585481,25.9170963 C7.35402437,25.9170963 2,20.5630719 2,13.9585481 C2,7.35402437 7.35402437,2 13.9585481,2 Z M14,4 C8.4771525,4 4,8.4771525 4,14 C4,19.5228475 8.4771525,24 14,24 C19.5228475,24 24,19.5228475 24,14 C24,8.4771525 19.5228475,4 14,4 Z">
                </path>
              </svg></div>
          </button></div>
      </div>
      <div class="tr-SearchInput-typeahead" tabindex="-1">
        <ul class="tr-SearchInput-typeaheadItems" id="searchInput-1-typeahead" role="listbox"></ul>
      </div>
    </div>
  </div>
</form>

Text Content

Loading
GlobalGlobal Directory



EXPLORE OUR SITES

London Stock Exchange Group
Refinitiv
MyRefinitiv
Refinitiv Perspectives
London Stock Exchange
FTSE Russell
LCH
Contact Us

SignSign in/Register


Sign in
Register
Problems signing In?


Developer Community

 * APIs
   
   
   APIs
   
    * Connected Risk
    * DataScope
    * Datastream
    * Eikon
    * Eikon Messenger
   
   See all APIs
   
    * FX Venues
    * Open PermID
    * Qual-ID
    * REDI
    * Refinitiv Data Libraries
   
    * Refinitiv Data Platform
    * Refinitiv Due Diligence
    * Refinitiv Knowledge Direct
    * Refinitiv Real-Time
   
    * Refinitiv Tick History
    * Workspace
    * World-Check
    * Yield Book

 * Articles
   
   
   Articles
   
   
   ARTICLES
   
    * Eikon Access data to power in-house or thirdparty desktop apps with
      Refinitiv data
    * World-Check Screen entity names, with or without secondary fields such as
      date of birth for individuals
    * Refinitiv RealTime Provides consumer, provider and publisher features
      available to developers of applications to connect to Refinitiv Real-Time
      Distribution Systems
   
    * DataScope The DataScope Select APIs offer programmatic access to Refinitiv
      content in a more flexible way than the browser- and FTP-based data access
      solutions
    * Refinitiv Data Libraries A set of ease-of-use interfaces offering coders
      uniform access to the breadth and depth of financial data and services
      available on the Refinitiv Data Platform
   
   See all Articles
   
    * Newsletters See our Developer Digest Newsletters

 * Developer Tools
   
   
   Developer Tools
   
   
   DEVELOPER TOOLS
   
    * RIC Search
    * Data Model Discovery
    * Data Exploration Tool
    * Data Catalogue
    * API Playground
    * Speed Guide
   
   See all Tools
 * Use Cases
   
   
   Use Cases
   
   
   USE CASES
   
   ARTIFICIAL INTELLIGENCE
   
   The Artificial Intelligence pipeline is a sequence of technical phases that
   will take an AI project from the early data acquisition phase up-to
   production.
   Read more
   arrow-right
   
   RISK & REGULATORY COMPLIANCE
   
   Manage country risk ranking, digital identity verification, document proofing
   and screening via one API.
   Read more
   arrow-right
   
   SUSTAINABLE FINANCE AND INVESTING
   
   Build sustainability into your investment strategy with our environmental,
   social and governance (ESG) data and services
   Read more
   arrow-right
   See all Use Cases
 * Events
   
   
   Events
    * Events
    * Academy Sessions
   
   Events
   
   
   UPCOMING EVENTS
   
    * There are no further events planned in 2023
   
   View all Events
   
   
   PAST EVENTS
   
    * Regime Detection - Systematic Technical Analysis and Trading Strategy
      Webinar In this session we will build on the previous systematic strategy
      session –where we generated and used pre-built technical analysis
      indicators & features and backtested a simple strategy using various
      packages in Python. In particular we will focus on the task of Regime
      Detection to ignore any signals generated that are against the regime we
      are in and ultimately improve our systematic performance.
    * Tech Analysis and Strategy Backtesting Webinar As we become more and more
      systematic, we have to decide what tool to use to design, test and
      implement our system.
    * Refinitiv Real Time: Customer Updates Q2 Join us as we talk through the
      latest updates to our Real Time product services and hear from some of our
      customers as they explain the benefits they are seeing from utilising this
      service
   
   Academy Sessions
   
    * Refinitiv Academy The Refinitiv Academy provides partners with a variety
      of learning options to enhance their understanding of Refinitiv solutions.
      Whether you are just getting started with Refinitiv or are an advanced
      user, we provide the training and resources you need to be successful
      every step of the way.
   
    * Live instructor led classes Choose from a selection of live instructor-led
      classes offered in local languages across a variety of market sectors
    * On-Demand videos Check out our collection of On-Demand training videos to
      help you get the most out of the Refinitiv Product catalogue

 * Videos
   
   
   Videos
   
 * About
   
   
   About
   
   
   ABOUT US
   
    * Who we are
    * Careers
    * Customer Stories
    * Events & Webinars
    * Media Center
    * MyRefinitiv
   
    * Partners
    * Refinitiv
    * Refinitiv Charities
    * Refinitiv Perspectives
    * Social Impact
    * Sustainability and Refinitiv

 * Q&A
   
   
   Q&A
   

ThankyouErrorModal


Cancel
Success-form


THANK YOU


THANK YOU FOR YOUR FEEDBACK


AN ERROR OCCURED

Support ticket number:

Your support ticket has been created and emailed to you. We will review your
message and get back to you shortly via email.

Please try again later

The attached file(s) are not uploaded because of invalid file(s)

Close

 1. Home
 2. Article Catalog
 3. Contributing your data to Refinitiv with WebSocket API and Refinitiv
    Real-Time Distribution System

Article

Contributing your data to Refinitiv with WebSocket API and Refinitiv Real-Time
Distribution System

July 04,2019
 * facebook
 * twitter
 * linkedin
 * whatsapp
 * email

Wasin Waeosri
Developer Advocate Developer Advocate



INTRODUCTION

Update: September 2021

This article is the other part of how to contribute data your data to Refinitiv
article. The first article shows how to setup Refinitiv Real-Time Distribution
System for RCC and how to contribute data with Refinitiv Real-Time SDK Java/C++
(formerly known as Elektron SDK). This second article focuses on how to
contribute your data to RCC using Websocket API for Pricing Streaming and
Real-Time Service (aka WebSocket API) through Refinitiv Real-Time Distribution
System (Refinitiv Real-Time Advanced Distribution and Advanced Data Hub
servers).

Note: RCC username, password, and host list credentials are required for
contributing data to Refinitiv. Please reach out to your Refinitiv sales
associate to acquire RCC access credentials.


RCC OVERVIEW

The Refinitiv Contribution Channel (RCC) is a new service for on-boarding
content to Refinitiv. Depending on the client's needs, access to the service
will be fulfilled by one or more of the following products: Contributions
Channel for Refinitiv Real-Time Advanced Distribution Server/Advanced Data Hub
Server, Contributions Channel for Real-Time API, Contributions Channel for
Spreadsheet. RCC aims for replacing the legacy Market Link IP (MLIP) system.


CONTRIBUTION SETUP

Update (As of March 2021): The direct Websocket access to Contributions Channel
Tutorial is available here.

Developers can contributing data to RCC with Real-Time SDK C++/Java (RSSL
connection) and WebSocket API (WebSocket connection). Currently, there are three
methods to contribute data to the RCC.

1. Use Refinitiv Real-Time SDKs to directly connect to RCC to contribute
data. To use this method, please refer to the following tutorials

 * ETA C/C++ Consumer - Posting data to Contributions Channel
 * EMA C/C++ Consumer - Posting data to Contributions Channel
 * ETA Java Consumer - Posting data to Contributions Channel
 * EMA Java Consumer - Posting data to Contributions Channel

2. Use Refinitiv Real-Time SDKs or WebSocket API for contributing data to RCC
via Refinitiv Real-Time Distribution System. To use this method, please refer to
the following first article and continue on this article:

3. Use WebSocket API to directly connect to RCC to contribute data. To use this
method, please refer to the following the Contributing Data to Refinitiv
Contributions Channel (RCC) via WebSocket tutorial page.

This article is focusing on the second method which is contributing data via
Refinitiv Real-Time Distribution System servers (Real-Time Advanced Distribution
and Advanced Data Hub servers). The servers will take care of the RCC
connection, JSON-OMM conversion, and login process for the application.

 

The Refinitiv Real-Time Advanced Data Hub server connects to RCC through the
delivery direct network via Tunnel Stream Aggregator (TSA) adapter, which is a
private network (TLS encrypted) between a client site and Refinitiv. The TSA
adapter is already packaged with the  Advanced Data Hub version 3.2, and needs
to be configured. You can find more detail regarding the Advanced Data Hub-RCC
configurations in Contributing your data to Refinitiv article page.

You can find  Advanced Data Hub-RCC configuration parameters example in the
project's /infra_config/rdms_trcc.cnf file (please note that it is not a
completed  Advanced Data Hub configuration file).

Once this configuration is complete and the Contribution service RCC is
available to the user, as shown in the Service-Up state in Advanced Data Hub
and Advanced Distribution Server consoles. The WebSocket application can be used
to POST data to this service in Advanced Distribution/Advanced Data Hub server.




If you are interested to contribute data using the RSSL connection (with or
without Refinitiv Real-Time Distribution System)), please visit the following
series of Real-Time SDK and RCC based on your prefer API:

 * Contributing your data to Refinitiv article.
 * EMA Java Tutorial - Posting data to Contribution Channel.
 * EMA C++ Tutorial - Posting data to Contribution Channel.

Note: The reader must have an understanding of Real-Time SDK, WebSocket
programming, and be familiar with OMM Market Price data. You should also have a
basic understanding of Refinitiv Real-Time market data infrastructure components
like Advanced Distribution Server, Advanced Data Hub, etc. The code snippets in
this article are shown in Python programming language.


CONTRIBUTION PROCESS

The application requires the following steps to contribute data to RCC via
Refinitiv Real-Time Advanced Distribution Server/Advanced Data Hub Server:

 1. The application initiates a WebSocket connection with Advanced Distribution
    Server.
 2. The application sends a OMM Login request message to Advanced Distribution
    Server in JSON format.
 3. Once the application receives a Login Refresh message from Advanced
    Distribution Server, the application can contribute data to RCC via an
    Off-Stream Post message.
 4. The RCC Off-Stream Post message must have the following conditions:
    * The Ack attribute must be true
    * The message must contain the PostID attribute and value
    * The Key information includes Name and Service attributes that refer to the
      contribution RIC name and RCC contribution service name
    * The Message payload must be an Update message type
    * The Message payload must contain the same Key information as the Post
      message

The example RCC Off-Stream Post message is shown in Posting result
example section below.

Note: Please note that RCC supports Off-Stream Post only.

If you are not familiar with the WebSocket API Posting concept, please
visit Contributing Data to Refinitiv Real-Time using the Websocket API article
which will give you a full explanation of the WebSocket API Posting mechanisms
and process.


APPLICATION CODE WALKTHROUGH

Following snippet of code is taken/modified from Elektron WebSocket API Python
market_price_posting.py example, available in the Example Applications package.
Complete RCC contribution posting sample is on Refinitiv-API-Samples
GitHub page.

The example project contains both the Python console application and Jupyter
Notebook application. please check the README.md in the source code project for
more detail regarding how to run the example.

A successful login to Advanced Distribution Server, results in the Login-Refresh
message. The process_login_response() function then calls c function to send the
Post message.

    	

def process_message(ws, message_json):  # Process all incoming messages.



    """ Parse at high level and output JSON of message """



    message_type = message_json['Type']



 



    if message_type == "Refresh":



        if 'Domain' in message_json:



            message_domain = message_json['Domain']



            if message_domain == "Login":



                process_login_response(ws, message_json)



 



# Process incoming Login Refresh Response message.



def process_login_response(ws, message_json):



    """ Send Off-Stream Post """



    print("Sending Off-Stream Post to Real-Time Advanced Distribution Server")



    send_market_price_post(ws)
        Copy
    

The send_market_price_post () function creates the Off-Stream post message in
JSON format, then sends it to Advanced Distribution Server as follows:

    	

# Create JSON Off-Stream Post message and sends it to ADS server.



def send_market_price_post(ws):



    global post_id



    global bid_value



    global ask_value



    global primact_1_value



    """ Send a post message contains a market-price content to RCC """



 



    """ Contribution fields """



    contribution_fields = {



        "BID": bid_value,



        "ASK": ask_value,



        "PRIMACT_1": primact_1_value



    }



 



    """ OMM Post msg Key """



    mp_post_key = {



        "Name": post_item_name,



        "Service": service_name



    }



 



    """ OMM Post Payload """



    contribution_payload_json = {



        "ID": 0,



        "Type": "Update",



        "Domain": "MarketPrice",



        "Fields": contribution_fields,



        "Key": {}



    }



 



    """ OMM Off-Stream Post message """



    mp_post_json_offstream = {



        "Domain": "MarketPrice",



        "Ack": True,



        "PostID": post_id,



        "PostUserInfo": {



            "Address": position,



            "UserID": int(app_id)



        },



        "Key": {},



        "Message": {},



        "Type": "Post",



        "ID": login_id



    }



 



    contribution_payload_json["Key"] = mp_post_key



    mp_post_json_offstream["Key"] = mp_post_key



    mp_post_json_offstream["Message"] = contribution_payload_json



 



    ws.send(json.dumps(mp_post_json_offstream))



    print("SENT:")



    print(json.dumps(mp_post_json_offstream,



                     sort_keys=True, indent=2, separators=(',', ':')))
        Copy
    


POSTING RESULT EXAMPLE

This posted data will automatically be forwarded to RCC and thus contributed to
Refinitiv. The output from this example application shows a successful login to
Advanced Distribution Server, followed by initial contribution upon
login-refresh and multiple contributions upon receiving an acknowledgment:


INITIATE AND LOGIN TO ADVANCED DISTRIBUTION SERVER

    	

Connecting to WebSocket ws://localhost:15000/WebSocket ...



WebSocket successfully connected!



SENT:



{



  "Domain":"Login",



  "ID":1,



  "Key":{



    "Elements":{



      "ApplicationId":"256",



      "Position":"10.42.68.162"



    },



    "Name":"root"



  }



}



RECEIVED:



[



  {



    "Domain":"Login",



    "Elements":{



      "MaxMsgSize":61430,



      "PingTimeout":30



    },



    "ID":1,



    "Key":{



      "Elements":{



        "AllowSuspectData":1,



        "ApplicationId":"256",



        "ApplicationName":"ADS",



        "Position":"10.42.68.162",



        "ProvidePermissionExpressions":1,



        "ProvidePermissionProfile":0,



        "SingleOpen":1,



        "SupportBatchRequests":7,



        "SupportEnhancedSymbolList":1,



        "SupportOMMPost":1,



        "SupportOptimizedPauseResume":1,



        "SupportPauseResume":1,



        "SupportStandby":1,



        "SupportViewRequests":1



      },



      "Name":"root"



    },



    "State":{



      "Data":"Ok",



      "Stream":"Open",



      "Text":"Login accepted by host apis30."



    },



    "Type":"Refresh"



  }



]
        Copy
    

Contribution data via an Off-Stream Post message

    	

Sending Off-Stream Post to Real-Time Advanced Distribution Server



SENT:



{



  "Ack":true,



  "Domain":"MarketPrice",



  "ID":1,



  "Key":{



    "Name":"<CONTRIBUTION_RIC>",



    "Service":"<CONTRIBUTION_Service>"



  },



  "Message":{



    "Domain":"MarketPrice",



    "Fields":{



      "ASK":35.48,



      "BID":34.25,



      "PRIMACT_1":116.5



    },



    "ID":0,



    "Key":{



      "Name":"<CONTRIBUTION_RIC>",



      "Service":"<CONTRIBUTION_Service>"



    },



    "Type":"Update"



  },



  "PostID":1,



  "PostUserInfo":{



    "Address":"10.42.68.162",



    "UserID":256



  },



  "Type":"Post"



}



Here



RECEIVED: 



[



  {



    "AckID":1,



    "ID":1,



    "Key":{



      "Name":"<CONTRIBUTION_RIC>",



      "Service":"<CONTRIBUTION_Service>"



    },



    "Type":"Ack"



  }



]
        Copy
    


REFERENCES

 * Refinitiv Real-Time & Distribution on the Refinitiv Developer
   Community website.
 * Websocket API for Pricing Streaming and Real-Time Services page.
 * Developer Webinar Recording: Introduction to WebSocket API.
 * Contributing Data to Refinitiv Real-Time using the Websocket API article.
 * Contributing your data to Refinitiv article.
 * Contributing Data to Refinitiv Contributions Channel (RCC) via WebSocket
   Tutorial.
 * EMA Java Tutorial - Posting data to Contribution Channel.
 * EMA C++ Tutorial - Posting data to Contribution Channel.
 * Contributing Data to Refinitiv Contributions Channel (RCC) via WebSocket
   Tutorial.

For any question related to this example or WebSocket API, please use the
Developer Community Q&A Forum.


DOWNLOADS

Example.EWA.Posting.TRCC

Source Code

 * GitHub - Contributing your data to Refinitiv with WebSocket API
   

 * Explore API Samples on GitHub

Related APIs

 * WebSocket API
   

 * Refinitiv Real-Time SDK - C++ Edition
   

 * Refinitiv Real-Time SDK - Java Edition
   

 * Explore All APIs

Related Articles

 * Contributing your data to Refinitiv
   
   May 22, 2020 • Gurpreet Bal

 * Contributing Data to Refinitiv Real-Time using the Websocket API
   
   June 24, 2019 • Umer Nalla

 * Contributing Data to Refinitiv Contributions Channel (RCC) via WebSocket
   
   March 05, 2021 • Jirapongse Phuriphanvichai

 * Explore all Articles



ftlScreen




WELCOME !


HELP US PERSONALISE YOUR EXPERIENCE BY COMPLETING YOUR PROFILE.

Screen name
Company name
Spoken language(s) (Optional)
Programming language(s) (Optional)
Share my full name, country and languages with other developers
Share the company I work for and my email address with other developers
I agree to terms & conditions and privacy policy
Send me communications about Financial & Risk resources, including products or
services.
Back
Complete profile


{"messages":{"companyName":{"trengtext":"Please enter the company name in
correct format","required":"Please enter the company
name"},"screenName":{"answerHubScreenName":"Please enter the name in correct
format","required":"Please enter your screen name
"}},"rules":{"companyName":{"trengtext":true,"required":true},"screenName":{"answerHubScreenName":true,"required":true}}}




ftlErrorScreen




THERE IS SOME PROBLEM WITH THE REQUEST SENT.

Close


versuccessModal


Close


EMAIL VERIFICATION SUCCESSFULLY DONE!

Thank you for registering. You will typically receive your email confirmation
within 20 mins with further instructions on how to proceed with access to
Developer Community

Close


feedbackModal


Close


FEEDBACK

First name
Last name
Email address
Feedback type General Feedback About This Site Report a Problem With This Site
Problem Type Broken Link Images not displaying Pages not displaying Other
Subject
Message

Attach files to upload

Attachments (10 MB limit)

Attach file


Back
Submit

{"messages":{"feedbacklastname":{"required":"Please enter last
name"},"feedbackfirstname":{"required":"Please enter first
name"},"problemtype":{"required":"Please select problem
type"},"feedbackemail":{"tremail":"Please enter email
correctly","required":"Please enter email"},"message":{"required":"Please enter
message"},"feedbackSubject":{"required":"Please enter
subject"},"feedbacktype":{"required":"Please select feedback
type"}},"rules":{"feedbacklastname":{"required":true},"feedbackfirstname":{"required":true},"problemtype":{"required":true},"feedbackemail":{"tremail":true,"required":true},"message":{"required":true},"feedbackSubject":{"required":true},"feedbacktype":{"required":true}}}




Search


 * About Refinitiv
   * Who we are
   * MyRefinitiv
   * Careers
   * Media Center
   * Partners
   * Press Releases
 * Market Insights
   * Refinitiv.com
   * Refinitiv Perspectives
   * Reuters Editorial Forums
   * Lipper Alpha Insight
   * MiFID II
 * Contact Us
   * Community Forum
   * Product Support
   * Sales
   * Media Relations
   * Supplier Portal
   * Whistleblowing
 * Connect with us
   * Github
   * LinkedIn
   * Twitter
   * Youtube
   * Medium
 * Explore LSEG Sites
   * London Stock Exchange Group
   * London Stock Exchange
   * FTSE Russell
   * LCH

Refinitiv
 * Cookie Policy
 * Privacy Statement
 * Terms of use
 * Copyright
 * Do not sell my info